diff --git a/src/application/logger.ts b/src/application/logger.ts index e7817b5..9c6c15d 100644 --- a/src/application/logger.ts +++ b/src/application/logger.ts @@ -1,4 +1,5 @@ import pino from 'pino' +const logger = pino.pino export enum LoggerType { HTTP = 'http', @@ -13,13 +14,13 @@ export enum LoggerType { } class Logger { - private instances: Map> = new Map() + private instances: Map = new Map() - private getLogger(type: LoggerType): ReturnType { + private getLogger(type: LoggerType): pino.Logger { if (!this.instances.has(type)) { this.instances.set( type, - pino({ + logger({ level: process.env.LOG_LEVEL || 'debug', transport: { target: 'pino/file', diff --git a/src/controllers/avatar.ts b/src/controllers/avatar.ts index 79d5139..42a9838 100644 --- a/src/controllers/avatar.ts +++ b/src/controllers/avatar.ts @@ -27,7 +27,7 @@ export class AvatarController extends BaseController { * @param res */ public async getByName(req: Request, res: Response) { - const character = await this.characterRepository.getByName(req.params.characterName) + const character = await this.characterRepository.getByName(req.params.characterName!) if (!character?.characterType) { return this.sendError(res, 'Character or character type not found', 404) } diff --git a/src/controllers/textures.ts b/src/controllers/textures.ts index 311b3c6..c9c5021 100644 --- a/src/controllers/textures.ts +++ b/src/controllers/textures.ts @@ -12,6 +12,10 @@ export class TexturesController extends BaseController { public async download(req: Request, res: Response) { const { type, spriteId, file } = req.params + if (!type || !file) { + return this.sendError(res, 'Invalid request', 400) + } + const texture = type === 'sprites' && spriteId ? Storage.getPublicPath(type, spriteId, file) : Storage.getPublicPath(type, file) this.sendFile(res, texture) diff --git a/src/events/character/create.ts b/src/events/character/create.ts index 3bd7c79..8e5a909 100644 --- a/src/events/character/create.ts +++ b/src/events/character/create.ts @@ -64,7 +64,7 @@ export default class CharacterCreateEvent extends BaseEvent { } catch (error: any) { this.logger.error(`character:create error: ${error.message}`) if (error instanceof ZodError) { - return this.socket.emit('notification', { title: 'Error', message: error.issues[0].message }) + return this.socket.emit('notification', { title: 'Error', message: error.issues[0]!.message }) } return this.socket.emit('notification', { title: 'Error', message: 'Could not create character. Please try again (later).' }) } diff --git a/src/events/gameMaster/mapEditor/create.ts b/src/events/gameMaster/mapEditor/create.ts index 241d38a..7de40ed 100644 --- a/src/events/gameMaster/mapEditor/create.ts +++ b/src/events/gameMaster/mapEditor/create.ts @@ -1,5 +1,7 @@ +import type { MapCacheT } from '#entities/map' + import { BaseEvent } from '#application/base/baseEvent' -import { Map, MapCacheT } from '#entities/map' +import { Map } from '#entities/map' type Payload = { name: string diff --git a/src/events/gameMaster/mapEditor/update.ts b/src/events/gameMaster/mapEditor/update.ts index 4979122..96b21df 100644 --- a/src/events/gameMaster/mapEditor/update.ts +++ b/src/events/gameMaster/mapEditor/update.ts @@ -63,9 +63,11 @@ export default class MapUpdateEvent extends BaseEvent { if (data.tiles.length > data.height) { data.tiles = data.tiles.slice(0, data.height) } + for (let i = 0; i < data.tiles.length; i++) { - if (data.tiles[i].length > data.width) { - data.tiles[i] = data.tiles[i].slice(0, data.width) + const row = data.tiles[i] + if (row !== undefined && row.length > data.width) { + data.tiles[i] = row.slice(0, data.width) } } diff --git a/src/events/map/characterMove.ts b/src/events/map/characterMove.ts index 9c5bfb2..5f4e269 100644 --- a/src/events/map/characterMove.ts +++ b/src/events/map/characterMove.ts @@ -1,5 +1,6 @@ +import type { MapEventTileWithTeleport } from '#application/types' + import { BaseEvent } from '#application/base/baseEvent' -import { MapEventTileWithTeleport } from '#application/types' import MapManager from '#managers/mapManager' import MapCharacter from '#models/mapCharacter' import MapEventTileRepository from '#repositories/mapEventTileRepository' @@ -75,6 +76,11 @@ export default class CharacterMove extends BaseEvent { const [start, end] = [path[i], path[i + 1]] + if (!start || !end) { + this.logger.error('Invalid path step detected') + break + } + // Validate each step if (Math.abs(end.positionX - start.positionX) > 1 || Math.abs(end.positionY - start.positionY) > 1) { this.logger.error('Invalid path step detected') diff --git a/src/managers/consoleManager.ts b/src/managers/consoleManager.ts index d4405b5..e694384 100644 --- a/src/managers/consoleManager.ts +++ b/src/managers/consoleManager.ts @@ -28,6 +28,11 @@ export class ConsoleManager { private async processCommand(commandLine: string): Promise { const [cmd, ...args] = commandLine.trim().split(' ') + if (!cmd) { + console.log('No command provided') + return + } + if (cmd === 'exit') { this.prompt.close() return diff --git a/src/managers/dateManager.ts b/src/managers/dateManager.ts index 4251aa8..3ae82b7 100644 --- a/src/managers/dateManager.ts +++ b/src/managers/dateManager.ts @@ -61,6 +61,7 @@ class DateManager { if (timeOnlyPattern.test(timeString)) { const [hours, minutes] = timeString.split(':').map(Number) + if (!hours || !minutes) return null const newDate = new Date(this.currentDate) newDate.setHours(hours, minutes) return newDate diff --git a/src/managers/queueManager.ts b/src/managers/queueManager.ts index 74a826b..b630dec 100644 --- a/src/managers/queueManager.ts +++ b/src/managers/queueManager.ts @@ -12,7 +12,7 @@ import Storage from '#application/storage' import SocketManager from '#managers/socketManager' class QueueManager { - private connection!: IORedis + private connection!: IORedis.Redis private queue!: Queue private worker!: Worker private io!: SocketServer @@ -21,7 +21,7 @@ class QueueManager { public async boot() { this.io = SocketManager.getIO() - this.connection = new IORedis(config.REDIS_URL, { + this.connection = new IORedis.Redis(config.REDIS_URL, { maxRetriesPerRequest: null }) diff --git a/src/models/loadedMap.ts b/src/models/loadedMap.ts index d3e964a..6c78de2 100644 --- a/src/models/loadedMap.ts +++ b/src/models/loadedMap.ts @@ -47,7 +47,7 @@ class LoadedMap { // Set the grid values based on the event tiles, these are strings eventTiles.forEach((eventTile) => { if (eventTile.type === 'BLOCK') { - grid[eventTile.positionY][eventTile.positionX] = 1 + grid[eventTile.positionY]![eventTile.positionX] = 1 } }) diff --git a/src/services/characterMoveService.ts b/src/services/characterMoveService.ts index 1288e8a..45baeca 100644 --- a/src/services/characterMoveService.ts +++ b/src/services/characterMoveService.ts @@ -133,9 +133,9 @@ class CharacterMoveService extends BaseService { return ( pos.positionX >= 0 && pos.positionY >= 0 && - pos.positionX < grid[0].length && + pos.positionX < grid[0]!.length && pos.positionY < grid.length && - (grid[pos.positionY][pos.positionX] === 0 || (pos.positionX === end.positionX && pos.positionY === end.positionY)) + (grid[pos.positionY]![pos.positionX] === 0 || (pos.positionX === end.positionX && pos.positionY === end.positionY)) ) }