forked from noxious/server
Path fixes for all environments, npm run format, removed redundant imports
This commit is contained in:
parent
4cbd62cbb0
commit
ce1708a55e
@ -1,15 +1,15 @@
|
|||||||
import path from 'path'
|
|
||||||
import fs from 'fs'
|
import fs from 'fs'
|
||||||
import sharp from 'sharp'
|
import sharp from 'sharp'
|
||||||
import { commandLogger } from '../utilities/logger'
|
import { commandLogger } from '../utilities/logger'
|
||||||
import { Server } from 'socket.io'
|
import { Server } from 'socket.io'
|
||||||
|
import { getPublicPath } from '../utilities/utilities'
|
||||||
|
|
||||||
export default class TilesCommand {
|
export default class TilesCommand {
|
||||||
constructor(private readonly io: Server) {}
|
constructor(private readonly io: Server) {}
|
||||||
|
|
||||||
public async execute(): Promise<void> {
|
public async execute(): Promise<void> {
|
||||||
// Get all tiles
|
// Get all tiles
|
||||||
const tilesDir = path.join(process.cwd(), 'public', 'tiles')
|
const tilesDir = getPublicPath('tiles')
|
||||||
const tiles = fs.readdirSync(tilesDir).filter((file) => file.endsWith('.png'))
|
const tiles = fs.readdirSync(tilesDir).filter((file) => file.endsWith('.png'))
|
||||||
|
|
||||||
// Create output directory if it doesn't exist
|
// Create output directory if it doesn't exist
|
||||||
@ -19,14 +19,14 @@ export default class TilesCommand {
|
|||||||
|
|
||||||
for (const tile of tiles) {
|
for (const tile of tiles) {
|
||||||
// Check if tile is already 66x34
|
// Check if tile is already 66x34
|
||||||
const metadata = await sharp(path.join(tilesDir, tile)).metadata()
|
const metadata = await sharp(getPublicPath('tiles', tile)).metadata()
|
||||||
if (metadata.width === 66 && metadata.height === 34) {
|
if (metadata.width === 66 && metadata.height === 34) {
|
||||||
commandLogger.info(`Tile ${tile} already processed`)
|
commandLogger.info(`Tile ${tile} already processed`)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
const inputPath = path.join(tilesDir, tile)
|
const inputPath = getPublicPath('tiles', tile)
|
||||||
const outputPath = path.join(tilesDir, tile)
|
const outputPath = getPublicPath('tiles', tile)
|
||||||
|
|
||||||
try {
|
try {
|
||||||
await sharp(inputPath)
|
await sharp(inputPath)
|
||||||
|
@ -3,7 +3,7 @@ import * as fs from 'fs'
|
|||||||
import * as path from 'path'
|
import * as path from 'path'
|
||||||
import { Server } from 'socket.io'
|
import { Server } from 'socket.io'
|
||||||
import { commandLogger } from '../utilities/logger'
|
import { commandLogger } from '../utilities/logger'
|
||||||
import config from '../utilities/config'
|
import { getAppPath } from '../utilities/utilities'
|
||||||
|
|
||||||
class CommandManager {
|
class CommandManager {
|
||||||
private commands: Map<string, any> = new Map()
|
private commands: Map<string, any> = new Map()
|
||||||
@ -20,8 +20,6 @@ class CommandManager {
|
|||||||
this.rl.on('close', () => {
|
this.rl.on('close', () => {
|
||||||
this.rlClosed = true
|
this.rlClosed = true
|
||||||
})
|
})
|
||||||
|
|
||||||
console.log(process.cwd())
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public async boot(io: Server) {
|
public async boot(io: Server) {
|
||||||
@ -63,34 +61,34 @@ class CommandManager {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private async loadCommands() {
|
private async loadCommands() {
|
||||||
const commandsDir = path.join(process.cwd(), 'commands');
|
const directory = getAppPath('commands')
|
||||||
commandLogger.info(`Loading commands from: ${commandsDir}`);
|
commandLogger.info(`Loading commands from: ${directory}`)
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const files = await fs.promises.readdir(commandsDir, { withFileTypes: true });
|
const files = await fs.promises.readdir(directory, { withFileTypes: true })
|
||||||
|
|
||||||
for (const file of files) {
|
for (const file of files) {
|
||||||
if (!file.isFile() || (!file.name.endsWith('.ts') && !file.name.endsWith('.js'))) {
|
if (!file.isFile() || (!file.name.endsWith('.ts') && !file.name.endsWith('.js'))) {
|
||||||
continue;
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
const fullPath = path.join(commandsDir, file.name);
|
const fullPath = getAppPath('commands', file.name)
|
||||||
const commandName = path.basename(file.name, path.extname(file.name));
|
const commandName = path.basename(file.name, path.extname(file.name))
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const module = await import(fullPath);
|
const module = await import(fullPath)
|
||||||
if (typeof module.default !== 'function') {
|
if (typeof module.default !== 'function') {
|
||||||
commandLogger.warn(`Unrecognized export in ${file.name}`);
|
commandLogger.warn(`Unrecognized export in ${file.name}`)
|
||||||
continue;
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
this.registerCommand(commandName, module.default);
|
this.registerCommand(commandName, module.default)
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
commandLogger.error(`Error loading command ${file.name}: ${error instanceof Error ? error.message : String(error)}`);
|
commandLogger.error(`Error loading command ${file.name}: ${error instanceof Error ? error.message : String(error)}`)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
commandLogger.error(`Failed to read commands directory: ${error instanceof Error ? error.message : String(error)}`);
|
commandLogger.error(`Failed to read commands directory: ${error instanceof Error ? error.message : String(error)}`)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5,7 +5,7 @@ import { Server as SocketServer } from 'socket.io'
|
|||||||
import { TSocket } from '../utilities/types'
|
import { TSocket } from '../utilities/types'
|
||||||
import { queueLogger } from '../utilities/logger'
|
import { queueLogger } from '../utilities/logger'
|
||||||
import fs from 'fs'
|
import fs from 'fs'
|
||||||
import path from 'path'
|
import { getAppPath } from '../utilities/utilities'
|
||||||
|
|
||||||
class QueueManager {
|
class QueueManager {
|
||||||
private connection!: IORedis
|
private connection!: IORedis
|
||||||
@ -52,9 +52,9 @@ class QueueManager {
|
|||||||
const { jobName, params, socketId } = job.data
|
const { jobName, params, socketId } = job.data
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const jobsDir = path.join(process.cwd(), 'jobs')
|
const jobsDir = getAppPath('jobs')
|
||||||
const extension = config.ENV === 'development' ? '.ts' : '.js'
|
const extension = config.ENV === 'development' ? '.ts' : '.js'
|
||||||
const jobPath = path.join(jobsDir, `${jobName}${extension}`)
|
const jobPath = getAppPath('jobs', `${jobName}${extension}`)
|
||||||
|
|
||||||
if (!fs.existsSync(jobPath)) {
|
if (!fs.existsSync(jobPath)) {
|
||||||
queueLogger.warn(`Job file not found: ${jobPath}`)
|
queueLogger.warn(`Job file not found: ${jobPath}`)
|
||||||
|
@ -1,7 +1,5 @@
|
|||||||
import { Zone } from '@prisma/client'
|
import { Zone } from '@prisma/client'
|
||||||
import zoneRepository from '../repositories/zoneRepository'
|
import zoneRepository from '../repositories/zoneRepository'
|
||||||
import characterManager from '../managers/characterManager'
|
|
||||||
import { ExtendedCharacter } from '../utilities/types'
|
|
||||||
|
|
||||||
class LoadedZone {
|
class LoadedZone {
|
||||||
private readonly zone: Zone
|
private readonly zone: Zone
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
import prisma from '../utilities/prisma' // Import the global Prisma instance
|
import prisma from '../utilities/prisma' // Import the global Prisma instance
|
||||||
import { Sprite, SpriteAction } from '@prisma/client'
|
import { SpriteAction } from '@prisma/client'
|
||||||
|
|
||||||
class SpriteRepository {
|
class SpriteRepository {
|
||||||
async getById(id: string) {
|
async getById(id: string) {
|
||||||
|
@ -1,5 +1,4 @@
|
|||||||
import fs from 'fs'
|
import fs from 'fs'
|
||||||
import path from 'path'
|
|
||||||
import express, { Application } from 'express'
|
import express, { Application } from 'express'
|
||||||
import config from './utilities/config'
|
import config from './utilities/config'
|
||||||
import { createServer as httpServer, Server as HTTPServer } from 'http'
|
import { createServer as httpServer, Server as HTTPServer } from 'http'
|
||||||
@ -9,13 +8,13 @@ import { Server as SocketServer } from 'socket.io'
|
|||||||
import { Authentication } from './middleware/authentication'
|
import { Authentication } from './middleware/authentication'
|
||||||
import { TSocket } from './utilities/types'
|
import { TSocket } from './utilities/types'
|
||||||
import prisma from './utilities/prisma'
|
import prisma from './utilities/prisma'
|
||||||
import { Dirent } from 'node:fs'
|
|
||||||
import { appLogger, watchLogs } from './utilities/logger'
|
import { appLogger, watchLogs } from './utilities/logger'
|
||||||
import ZoneManager from './managers/zoneManager'
|
import ZoneManager from './managers/zoneManager'
|
||||||
import UserManager from './managers/userManager'
|
import UserManager from './managers/userManager'
|
||||||
import CommandManager from './managers/commandManager'
|
import CommandManager from './managers/commandManager'
|
||||||
import CharacterManager from './managers/characterManager'
|
import CharacterManager from './managers/characterManager'
|
||||||
import QueueManager from './managers/queueManager'
|
import QueueManager from './managers/queueManager'
|
||||||
|
import { getAppPath } from './utilities/utilities'
|
||||||
|
|
||||||
export class Server {
|
export class Server {
|
||||||
private readonly app: Application
|
private readonly app: Application
|
||||||
@ -86,46 +85,46 @@ export class Server {
|
|||||||
* @private
|
* @private
|
||||||
*/
|
*/
|
||||||
private async handleConnection(socket: TSocket) {
|
private async handleConnection(socket: TSocket) {
|
||||||
const eventsPath = path.join(__dirname, 'socketEvents')
|
|
||||||
try {
|
try {
|
||||||
await this.loadEventHandlers(eventsPath, socket)
|
await this.loadEventHandlers('socketEvents', '', socket)
|
||||||
} catch (error: any) {
|
} catch (error: any) {
|
||||||
appLogger.error(`Failed to load event handlers: ${error.message}`)
|
appLogger.error(`Failed to load event handlers: ${error.message}`)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private async loadEventHandlers(dir: string, socket: TSocket) {
|
private async loadEventHandlers(baseDir: string, subDir: string, socket: TSocket) {
|
||||||
try {
|
try {
|
||||||
const files = await fs.promises.readdir(dir, { withFileTypes: true });
|
const fullDir = getAppPath(baseDir, subDir)
|
||||||
|
const files = await fs.promises.readdir(fullDir, { withFileTypes: true })
|
||||||
|
|
||||||
for (const file of files) {
|
for (const file of files) {
|
||||||
const fullPath = path.join(dir, file.name);
|
const filePath = getAppPath(baseDir, subDir, file.name)
|
||||||
|
|
||||||
if (file.isDirectory()) {
|
if (file.isDirectory()) {
|
||||||
await this.loadEventHandlers(fullPath, socket);
|
await this.loadEventHandlers(baseDir, `${subDir}/${file.name}`, socket)
|
||||||
continue;
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!file.isFile() || (!file.name.endsWith('.ts') && !file.name.endsWith('.js'))) {
|
if (!file.isFile() || (!file.name.endsWith('.ts') && !file.name.endsWith('.js'))) {
|
||||||
continue;
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const module = await import(fullPath);
|
const module = await import(filePath)
|
||||||
if (typeof module.default !== 'function') {
|
if (typeof module.default !== 'function') {
|
||||||
appLogger.warn(`Unrecognized export in ${file.name}`);
|
appLogger.warn(`Unrecognized export in ${file.name}`)
|
||||||
continue;
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
const EventClass = module.default;
|
const EventClass = module.default
|
||||||
const eventInstance = new EventClass(this.io, socket);
|
const eventInstance = new EventClass(this.io, socket)
|
||||||
eventInstance.listen();
|
eventInstance.listen()
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
appLogger.error(`Error loading event handler ${file.name}: ${error instanceof Error ? error.message : String(error)}`);
|
appLogger.error(`Error loading event handler ${file.name}: ${error instanceof Error ? error.message : String(error)}`)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
appLogger.error(`Error reading directory ${dir}: ${error instanceof Error ? error.message : String(error)}`);
|
appLogger.error(`Error reading directory: ${error instanceof Error ? error.message : String(error)}`)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,3 +0,0 @@
|
|||||||
class AssetService {}
|
|
||||||
|
|
||||||
export default AssetService
|
|
@ -1,5 +0,0 @@
|
|||||||
import { Character } from '@prisma/client'
|
|
||||||
|
|
||||||
class CharacterService {}
|
|
||||||
|
|
||||||
export default CharacterService
|
|
@ -1,7 +1,6 @@
|
|||||||
import { Server } from 'socket.io'
|
import { Server } from 'socket.io'
|
||||||
import { TSocket, ExtendedCharacter } from '../../utilities/types'
|
import { TSocket } from '../../utilities/types'
|
||||||
import CharacterRepository from '../../repositories/characterRepository'
|
import CharacterRepository from '../../repositories/characterRepository'
|
||||||
import CharacterManager from '../../managers/characterManager'
|
|
||||||
|
|
||||||
type SocketResponseT = {
|
type SocketResponseT = {
|
||||||
character_id: number
|
character_id: number
|
||||||
|
@ -2,7 +2,6 @@ import { Server } from 'socket.io'
|
|||||||
import { TSocket } from '../../../../utilities/types'
|
import { TSocket } from '../../../../utilities/types'
|
||||||
import { Object } from '@prisma/client'
|
import { Object } from '@prisma/client'
|
||||||
import ObjectRepository from '../../../../repositories/objectRepository'
|
import ObjectRepository from '../../../../repositories/objectRepository'
|
||||||
import CharacterManager from '../../../../managers/characterManager'
|
|
||||||
import characterRepository from '../../../../repositories/characterRepository'
|
import characterRepository from '../../../../repositories/characterRepository'
|
||||||
|
|
||||||
interface IPayload {}
|
interface IPayload {}
|
||||||
|
@ -1,10 +1,9 @@
|
|||||||
|
import fs from 'fs'
|
||||||
import { Server } from 'socket.io'
|
import { Server } from 'socket.io'
|
||||||
import { TSocket } from '../../../../utilities/types'
|
import { TSocket } from '../../../../utilities/types'
|
||||||
import path from 'path'
|
|
||||||
import fs from 'fs'
|
|
||||||
import prisma from '../../../../utilities/prisma'
|
import prisma from '../../../../utilities/prisma'
|
||||||
import CharacterManager from '../../../../managers/characterManager'
|
|
||||||
import characterRepository from '../../../../repositories/characterRepository'
|
import characterRepository from '../../../../repositories/characterRepository'
|
||||||
|
import { getPublicPath } from '../../../../utilities/utilities'
|
||||||
|
|
||||||
interface IPayload {
|
interface IPayload {
|
||||||
object: string
|
object: string
|
||||||
@ -36,10 +35,10 @@ export default class ObjectRemoveEvent {
|
|||||||
})
|
})
|
||||||
|
|
||||||
// get root path
|
// get root path
|
||||||
const public_folder = path.join(process.cwd(), 'public', 'objects')
|
const public_folder = getPublicPath('objects')
|
||||||
|
|
||||||
// remove the tile from the disk
|
// remove the tile from the disk
|
||||||
const finalFilePath = path.join(public_folder, data.object + '.png')
|
const finalFilePath = getPublicPath('objects', data.object + '.png')
|
||||||
fs.unlink(finalFilePath, (err) => {
|
fs.unlink(finalFilePath, (err) => {
|
||||||
if (err) {
|
if (err) {
|
||||||
console.log(err)
|
console.log(err)
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
import { Server } from 'socket.io'
|
import { Server } from 'socket.io'
|
||||||
import { TSocket } from '../../../../utilities/types'
|
import { TSocket } from '../../../../utilities/types'
|
||||||
import prisma from '../../../../utilities/prisma'
|
import prisma from '../../../../utilities/prisma'
|
||||||
import CharacterManager from '../../../../managers/characterManager'
|
|
||||||
import characterRepository from '../../../../repositories/characterRepository'
|
import characterRepository from '../../../../repositories/characterRepository'
|
||||||
|
|
||||||
type Payload = {
|
type Payload = {
|
||||||
|
@ -1,12 +1,12 @@
|
|||||||
import { Server } from 'socket.io'
|
import { Server } from 'socket.io'
|
||||||
import { TSocket } from '../../../../utilities/types'
|
import { TSocket } from '../../../../utilities/types'
|
||||||
import { writeFile } from 'node:fs/promises'
|
import { writeFile } from 'node:fs/promises'
|
||||||
import path from 'path'
|
|
||||||
import fs from 'fs/promises'
|
import fs from 'fs/promises'
|
||||||
import prisma from '../../../../utilities/prisma'
|
import prisma from '../../../../utilities/prisma'
|
||||||
import sharp from 'sharp'
|
import sharp from 'sharp'
|
||||||
import characterRepository from '../../../../repositories/characterRepository'
|
import characterRepository from '../../../../repositories/characterRepository'
|
||||||
import { gameMasterLogger } from '../../../../utilities/logger'
|
import { gameMasterLogger } from '../../../../utilities/logger'
|
||||||
|
import { getPublicPath } from '../../../../utilities/utilities'
|
||||||
|
|
||||||
interface IObjectData {
|
interface IObjectData {
|
||||||
[key: string]: Buffer
|
[key: string]: Buffer
|
||||||
@ -30,7 +30,7 @@ export default class ObjectUploadEvent {
|
|||||||
if (character.role !== 'gm') {
|
if (character.role !== 'gm') {
|
||||||
return callback(false)
|
return callback(false)
|
||||||
}
|
}
|
||||||
const public_folder = path.join(process.cwd(), 'public', 'objects')
|
const public_folder = getPublicPath('objects')
|
||||||
|
|
||||||
// Ensure the folder exists
|
// Ensure the folder exists
|
||||||
await fs.mkdir(public_folder, { recursive: true })
|
await fs.mkdir(public_folder, { recursive: true })
|
||||||
@ -54,7 +54,7 @@ export default class ObjectUploadEvent {
|
|||||||
|
|
||||||
const uuid = object.id
|
const uuid = object.id
|
||||||
const filename = `${uuid}.png`
|
const filename = `${uuid}.png`
|
||||||
const finalFilePath = path.join(public_folder, filename)
|
const finalFilePath = getPublicPath('objects', filename)
|
||||||
await writeFile(finalFilePath, objectData)
|
await writeFile(finalFilePath, objectData)
|
||||||
|
|
||||||
gameMasterLogger.info('gm:object:upload', `Object ${key} uploaded with id ${uuid}`)
|
gameMasterLogger.info('gm:object:upload', `Object ${key} uploaded with id ${uuid}`)
|
||||||
|
@ -1,10 +1,9 @@
|
|||||||
import { Server } from 'socket.io'
|
import { Server } from 'socket.io'
|
||||||
import { TSocket } from '../../../../utilities/types'
|
import { TSocket } from '../../../../utilities/types'
|
||||||
import path from 'path'
|
|
||||||
import fs from 'fs/promises'
|
import fs from 'fs/promises'
|
||||||
import prisma from '../../../../utilities/prisma'
|
import prisma from '../../../../utilities/prisma'
|
||||||
import CharacterManager from '../../../../managers/characterManager'
|
|
||||||
import characterRepository from '../../../../repositories/characterRepository'
|
import characterRepository from '../../../../repositories/characterRepository'
|
||||||
|
import { getPublicPath } from '../../../../utilities/utilities'
|
||||||
|
|
||||||
export default class SpriteCreateEvent {
|
export default class SpriteCreateEvent {
|
||||||
constructor(
|
constructor(
|
||||||
@ -25,7 +24,7 @@ export default class SpriteCreateEvent {
|
|||||||
return callback(false)
|
return callback(false)
|
||||||
}
|
}
|
||||||
|
|
||||||
const public_folder = path.join(process.cwd(), 'public', 'sprites')
|
const public_folder = getPublicPath('sprites')
|
||||||
|
|
||||||
// Ensure the folder exists
|
// Ensure the folder exists
|
||||||
await fs.mkdir(public_folder, { recursive: true })
|
await fs.mkdir(public_folder, { recursive: true })
|
||||||
@ -38,7 +37,7 @@ export default class SpriteCreateEvent {
|
|||||||
const uuid = sprite.id
|
const uuid = sprite.id
|
||||||
|
|
||||||
// Create folder with uuid
|
// Create folder with uuid
|
||||||
const sprite_folder = path.join(public_folder, uuid)
|
const sprite_folder = getPublicPath('sprites', uuid)
|
||||||
await fs.mkdir(sprite_folder, { recursive: true })
|
await fs.mkdir(sprite_folder, { recursive: true })
|
||||||
|
|
||||||
callback(true)
|
callback(true)
|
||||||
|
@ -1,10 +1,10 @@
|
|||||||
import { Server } from 'socket.io'
|
import { Server } from 'socket.io'
|
||||||
import { TSocket } from '../../../../utilities/types'
|
import { TSocket } from '../../../../utilities/types'
|
||||||
import fs from 'fs'
|
import fs from 'fs'
|
||||||
import path from 'path'
|
|
||||||
import prisma from '../../../../utilities/prisma'
|
import prisma from '../../../../utilities/prisma'
|
||||||
import CharacterManager from '../../../../managers/characterManager'
|
import CharacterManager from '../../../../managers/characterManager'
|
||||||
import { gameMasterLogger } from '../../../../utilities/logger'
|
import { gameMasterLogger } from '../../../../utilities/logger'
|
||||||
|
import { getPublicPath } from '../../../../utilities/utilities'
|
||||||
|
|
||||||
type Payload = {
|
type Payload = {
|
||||||
id: string
|
id: string
|
||||||
@ -17,7 +17,7 @@ export default class GMSpriteDeleteEvent {
|
|||||||
private readonly io: Server,
|
private readonly io: Server,
|
||||||
private readonly socket: TSocket
|
private readonly socket: TSocket
|
||||||
) {
|
) {
|
||||||
this.public_folder = path.join(process.cwd(), 'public', 'sprites')
|
this.public_folder = getPublicPath('sprites')
|
||||||
}
|
}
|
||||||
|
|
||||||
public listen(): void {
|
public listen(): void {
|
||||||
@ -43,7 +43,7 @@ export default class GMSpriteDeleteEvent {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private async deleteSpriteFolder(spriteId: string): Promise<void> {
|
private async deleteSpriteFolder(spriteId: string): Promise<void> {
|
||||||
const finalFilePath = path.join(this.public_folder, spriteId)
|
const finalFilePath = getPublicPath('sprites', spriteId)
|
||||||
|
|
||||||
if (fs.existsSync(finalFilePath)) {
|
if (fs.existsSync(finalFilePath)) {
|
||||||
await fs.promises.rmdir(finalFilePath, { recursive: true })
|
await fs.promises.rmdir(finalFilePath, { recursive: true })
|
||||||
|
@ -2,7 +2,6 @@ import { Server } from 'socket.io'
|
|||||||
import { TSocket } from '../../../../utilities/types'
|
import { TSocket } from '../../../../utilities/types'
|
||||||
import { Sprite } from '@prisma/client'
|
import { Sprite } from '@prisma/client'
|
||||||
import SpriteRepository from '../../../../repositories/spriteRepository'
|
import SpriteRepository from '../../../../repositories/spriteRepository'
|
||||||
import CharacterManager from '../../../../managers/characterManager'
|
|
||||||
import characterRepository from '../../../../repositories/characterRepository'
|
import characterRepository from '../../../../repositories/characterRepository'
|
||||||
|
|
||||||
interface IPayload {}
|
interface IPayload {}
|
||||||
|
@ -2,10 +2,10 @@ import { Server } from 'socket.io'
|
|||||||
import { TSocket } from '../../../../utilities/types'
|
import { TSocket } from '../../../../utilities/types'
|
||||||
import prisma from '../../../../utilities/prisma'
|
import prisma from '../../../../utilities/prisma'
|
||||||
import type { Prisma, SpriteAction } from '@prisma/client'
|
import type { Prisma, SpriteAction } from '@prisma/client'
|
||||||
import path from 'path'
|
|
||||||
import { writeFile, mkdir } from 'node:fs/promises'
|
import { writeFile, mkdir } from 'node:fs/promises'
|
||||||
import sharp from 'sharp'
|
import sharp from 'sharp'
|
||||||
import CharacterManager from '../../../../managers/characterManager'
|
import CharacterManager from '../../../../managers/characterManager'
|
||||||
|
import { getPublicPath } from '../../../../utilities/utilities'
|
||||||
|
|
||||||
type SpriteActionInput = Omit<SpriteAction, 'id' | 'spriteId' | 'frameWidth' | 'frameHeight'> & {
|
type SpriteActionInput = Omit<SpriteAction, 'id' | 'spriteId' | 'frameWidth' | 'frameHeight'> & {
|
||||||
sprites: string[]
|
sprites: string[]
|
||||||
@ -123,7 +123,7 @@ export default class SpriteUpdateEvent {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async function saveSpritesToDisk(id: string, processedActions: ProcessedSpriteAction[]) {
|
async function saveSpritesToDisk(id: string, processedActions: ProcessedSpriteAction[]) {
|
||||||
const publicFolder = path.join(process.cwd(), 'public', 'sprites', id)
|
const publicFolder = getPublicPath('sprites', id)
|
||||||
await mkdir(publicFolder, { recursive: true })
|
await mkdir(publicFolder, { recursive: true })
|
||||||
|
|
||||||
await Promise.all(
|
await Promise.all(
|
||||||
@ -146,7 +146,7 @@ export default class SpriteUpdateEvent {
|
|||||||
.png()
|
.png()
|
||||||
.toBuffer()
|
.toBuffer()
|
||||||
|
|
||||||
const filename = path.join(publicFolder, `${action}.png`)
|
const filename = getPublicPath('sprites', id, `${action}.png`)
|
||||||
await writeFile(filename, combinedImage)
|
await writeFile(filename, combinedImage)
|
||||||
})
|
})
|
||||||
)
|
)
|
||||||
|
@ -1,10 +1,10 @@
|
|||||||
import path from 'path'
|
|
||||||
import fs from 'fs/promises'
|
import fs from 'fs/promises'
|
||||||
import { Server } from 'socket.io'
|
import { Server } from 'socket.io'
|
||||||
import { TSocket } from '../../../../utilities/types'
|
import { TSocket } from '../../../../utilities/types'
|
||||||
import prisma from '../../../../utilities/prisma'
|
import prisma from '../../../../utilities/prisma'
|
||||||
import characterRepository from '../../../../repositories/characterRepository'
|
import characterRepository from '../../../../repositories/characterRepository'
|
||||||
import { gameMasterLogger } from '../../../../utilities/logger'
|
import { gameMasterLogger } from '../../../../utilities/logger'
|
||||||
|
import { getPublicPath } from '../../../../utilities/utilities'
|
||||||
|
|
||||||
type Payload = {
|
type Payload = {
|
||||||
id: string
|
id: string
|
||||||
@ -17,7 +17,7 @@ export default class GMTileDeleteEvent {
|
|||||||
private readonly io: Server,
|
private readonly io: Server,
|
||||||
private readonly socket: TSocket
|
private readonly socket: TSocket
|
||||||
) {
|
) {
|
||||||
this.public_folder = path.join(process.cwd(), 'public', 'tiles')
|
this.public_folder = getPublicPath('tiles')
|
||||||
}
|
}
|
||||||
|
|
||||||
public listen(): void {
|
public listen(): void {
|
||||||
@ -54,7 +54,7 @@ export default class GMTileDeleteEvent {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private async deleteTileFile(tileId: string): Promise<void> {
|
private async deleteTileFile(tileId: string): Promise<void> {
|
||||||
const finalFilePath = path.join(this.public_folder, `${tileId}.png`)
|
const finalFilePath = getPublicPath('tiles', `${tileId}.png`)
|
||||||
try {
|
try {
|
||||||
await fs.unlink(finalFilePath)
|
await fs.unlink(finalFilePath)
|
||||||
} catch (error: any) {
|
} catch (error: any) {
|
||||||
|
@ -2,7 +2,6 @@ import { Server } from 'socket.io'
|
|||||||
import { TSocket } from '../../../../utilities/types'
|
import { TSocket } from '../../../../utilities/types'
|
||||||
import { Tile } from '@prisma/client'
|
import { Tile } from '@prisma/client'
|
||||||
import TileRepository from '../../../../repositories/tileRepository'
|
import TileRepository from '../../../../repositories/tileRepository'
|
||||||
import CharacterManager from '../../../../managers/characterManager'
|
|
||||||
import characterRepository from '../../../../repositories/characterRepository'
|
import characterRepository from '../../../../repositories/characterRepository'
|
||||||
|
|
||||||
interface IPayload {}
|
interface IPayload {}
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
import { Server } from 'socket.io'
|
import { Server } from 'socket.io'
|
||||||
import { TSocket } from '../../../../utilities/types'
|
import { TSocket } from '../../../../utilities/types'
|
||||||
import prisma from '../../../../utilities/prisma'
|
import prisma from '../../../../utilities/prisma'
|
||||||
import CharacterManager from '../../../../managers/characterManager'
|
|
||||||
import characterRepository from '../../../../repositories/characterRepository'
|
import characterRepository from '../../../../repositories/characterRepository'
|
||||||
|
|
||||||
type Payload = {
|
type Payload = {
|
||||||
|
@ -1,11 +1,11 @@
|
|||||||
import { Server } from 'socket.io'
|
import { Server } from 'socket.io'
|
||||||
import { TSocket } from '../../../../utilities/types'
|
import { TSocket } from '../../../../utilities/types'
|
||||||
import { writeFile } from 'node:fs/promises'
|
import { writeFile } from 'node:fs/promises'
|
||||||
import path from 'path'
|
|
||||||
import fs from 'fs/promises'
|
import fs from 'fs/promises'
|
||||||
import prisma from '../../../../utilities/prisma'
|
import prisma from '../../../../utilities/prisma'
|
||||||
import characterRepository from '../../../../repositories/characterRepository'
|
import characterRepository from '../../../../repositories/characterRepository'
|
||||||
import { gameMasterLogger } from '../../../../utilities/logger'
|
import { gameMasterLogger } from '../../../../utilities/logger'
|
||||||
|
import { getPublicPath } from '../../../../utilities/utilities'
|
||||||
|
|
||||||
interface ITileData {
|
interface ITileData {
|
||||||
[key: string]: Buffer
|
[key: string]: Buffer
|
||||||
@ -30,7 +30,7 @@ export default class TileUploadEvent {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
const public_folder = path.join(process.cwd(), 'public', 'tiles')
|
const public_folder = getPublicPath('tiles')
|
||||||
|
|
||||||
// Ensure the folder exists
|
// Ensure the folder exists
|
||||||
await fs.mkdir(public_folder, { recursive: true })
|
await fs.mkdir(public_folder, { recursive: true })
|
||||||
@ -43,7 +43,7 @@ export default class TileUploadEvent {
|
|||||||
})
|
})
|
||||||
const uuid = tile.id
|
const uuid = tile.id
|
||||||
const filename = `${uuid}.png`
|
const filename = `${uuid}.png`
|
||||||
const finalFilePath = path.join(public_folder, filename)
|
const finalFilePath = getPublicPath('tiles', filename)
|
||||||
await writeFile(finalFilePath, tileData)
|
await writeFile(finalFilePath, tileData)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
@ -12,6 +12,7 @@ import fs from 'fs'
|
|||||||
import zoneRepository from '../repositories/zoneRepository'
|
import zoneRepository from '../repositories/zoneRepository'
|
||||||
import zoneManager from '../managers/zoneManager'
|
import zoneManager from '../managers/zoneManager'
|
||||||
import { httpLogger } from './logger'
|
import { httpLogger } from './logger'
|
||||||
|
import { getPublicPath } from './utilities'
|
||||||
|
|
||||||
async function addHttpRoutes(app: Application) {
|
async function addHttpRoutes(app: Application) {
|
||||||
/**
|
/**
|
||||||
@ -117,9 +118,9 @@ async function addHttpRoutes(app: Application) {
|
|||||||
|
|
||||||
let assetPath
|
let assetPath
|
||||||
if (assetType === 'sprites' && spriteId) {
|
if (assetType === 'sprites' && spriteId) {
|
||||||
assetPath = path.join(process.cwd(), 'public', assetType, spriteId, fileName)
|
assetPath = getPublicPath(assetType, spriteId, fileName)
|
||||||
} else {
|
} else {
|
||||||
assetPath = path.join(process.cwd(), 'public', assetType, fileName)
|
assetPath = getPublicPath(assetType, fileName)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!fs.existsSync(assetPath)) {
|
if (!fs.existsSync(assetPath)) {
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
import pino from 'pino'
|
import pino from 'pino'
|
||||||
import fs from 'fs'
|
import fs from 'fs'
|
||||||
import path from 'path'
|
import { getRootPath } from './utilities'
|
||||||
|
|
||||||
// Array of log types
|
// Array of log types
|
||||||
const LOG_TYPES = ['http', 'game', 'gameMaster', 'app', 'queue', 'command'] as const
|
const LOG_TYPES = ['http', 'game', 'gameMaster', 'app', 'queue', 'command'] as const
|
||||||
@ -30,7 +30,7 @@ const loggers = Object.fromEntries(LOG_TYPES.map((type) => [type, createLogger(t
|
|||||||
|
|
||||||
const watchLogs = () => {
|
const watchLogs = () => {
|
||||||
LOG_TYPES.forEach((type) => {
|
LOG_TYPES.forEach((type) => {
|
||||||
const logFile = path.join(__dirname, '../../logs', `${type}.log`)
|
const logFile = getRootPath('logs', `${type}.log`)
|
||||||
|
|
||||||
fs.watchFile(logFile, (curr, prev) => {
|
fs.watchFile(logFile, (curr, prev) => {
|
||||||
if (curr.size > prev.size) {
|
if (curr.size > prev.size) {
|
||||||
|
15
src/utilities/utilities.ts
Normal file
15
src/utilities/utilities.ts
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
import config from './config'
|
||||||
|
import path from 'path'
|
||||||
|
|
||||||
|
export function getRootPath(folder: string, ...additionalSegments: string[]) {
|
||||||
|
return path.join(process.cwd(), folder, ...additionalSegments)
|
||||||
|
}
|
||||||
|
|
||||||
|
export function getAppPath(folder: string, ...additionalSegments: string[]) {
|
||||||
|
const baseDir = config.ENV === 'development' ? 'src' : 'dist'
|
||||||
|
return path.join(process.cwd(), baseDir, folder, ...additionalSegments)
|
||||||
|
}
|
||||||
|
|
||||||
|
export function getPublicPath(folder: string, ...additionalSegments: string[]) {
|
||||||
|
return path.join(process.cwd(), 'public', folder, ...additionalSegments)
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user