diff --git a/migrations/Migration20250101195157.ts b/migrations/Migration20250101204808.ts similarity index 99% rename from migrations/Migration20250101195157.ts rename to migrations/Migration20250101204808.ts index 185a012..369ad5f 100644 --- a/migrations/Migration20250101195157.ts +++ b/migrations/Migration20250101204808.ts @@ -1,6 +1,6 @@ import { Migration } from '@mikro-orm/migrations'; -export class Migration20250101195157 extends Migration { +export class Migration20250101204808 extends Migration { override async up(): Promise { this.addSql(`create table \`map_object\` (\`id\` varchar(255) not null, \`name\` varchar(255) not null, \`tags\` json null, \`origin_x\` int not null default 0, \`origin_y\` int not null default 0, \`is_animated\` tinyint(1) not null default false, \`frame_rate\` int not null default 0, \`frame_width\` int not null default 0, \`frame_height\` int not null default 0, \`created_at\` datetime not null, \`updated_at\` datetime not null, primary key (\`id\`)) default character set utf8mb4 engine = InnoDB;`); diff --git a/src/application/types.ts b/src/application/types.ts index 3c9e6c7..5dda62a 100644 --- a/src/application/types.ts +++ b/src/application/types.ts @@ -7,8 +7,8 @@ import { ZoneEventTileTeleport } from '#entities/zoneEventTileTeleport' export type UUID = `${string}-${string}-${string}-${string}-${string}` export type TSocket = Socket & { - userId?: number - characterId?: number + userId?: UUID + characterId?: UUID handshake?: { query?: { token?: any diff --git a/src/events/character/connect.ts b/src/events/character/connect.ts index 12203b1..accea3c 100644 --- a/src/events/character/connect.ts +++ b/src/events/character/connect.ts @@ -1,13 +1,13 @@ import { BaseEvent } from '#application/base/baseEvent' -import Database from '#application/database' +import { UUID } from '#application/types' import ZoneManager from '#managers/zoneManager' import CharacterHairRepository from '#repositories/characterHairRepository' import CharacterRepository from '#repositories/characterRepository' import TeleportService from '#services/teleportService' interface CharacterConnectPayload { - characterId: number - characterHairId?: number + characterId: UUID + characterHairId?: UUID } export default class CharacterConnectEvent extends BaseEvent { diff --git a/src/events/character/delete.ts b/src/events/character/delete.ts index a5b1cc6..2a558cd 100644 --- a/src/events/character/delete.ts +++ b/src/events/character/delete.ts @@ -1,10 +1,11 @@ import { BaseEvent } from '#application/base/baseEvent' +import { UUID } from '#application/types' import { Character } from '#entities/character' import { Zone } from '#entities/zone' import CharacterRepository from '#repositories/characterRepository' type TypePayload = { - characterId: number + characterId: UUID } type TypeResponse = { diff --git a/src/events/chat/gameMaster/teleportCommand.ts b/src/events/chat/gameMaster/teleportCommand.ts index ed055a5..e969d54 100644 --- a/src/events/chat/gameMaster/teleportCommand.ts +++ b/src/events/chat/gameMaster/teleportCommand.ts @@ -1,4 +1,5 @@ import { BaseEvent } from '#application/base/baseEvent' +import { UUID } from '#application/types' import ZoneManager from '#managers/zoneManager' import ZoneRepository from '#repositories/zoneRepository' import ChatService from '#services/chatService' @@ -40,14 +41,14 @@ export default class TeleportCommandEvent extends BaseEvent { return } - const zoneId = parseInt(args[0], 10) + const zoneId = args[0] as UUID const targetX = args[1] ? parseInt(args[1], 10) : 0 const targetY = args[2] ? parseInt(args[2], 10) : 0 - if (isNaN(zoneId) || isNaN(targetX) || isNaN(targetY)) { + if (!zoneId || isNaN(targetX) || isNaN(targetY)) { this.socket.emit('notification', { title: 'Server message', - message: 'Invalid parameters. All values must be numbers.' + message: 'Invalid parameters. X and Y coordinates must be numbers.' }) return } diff --git a/src/managers/socketManager.ts b/src/managers/socketManager.ts index 266f8c2..c294a1e 100644 --- a/src/managers/socketManager.ts +++ b/src/managers/socketManager.ts @@ -8,7 +8,7 @@ import { Server as SocketServer } from 'socket.io' import config from '#application/config' import Logger, { LoggerType } from '#application/logger' import Storage from '#application/storage' -import { TSocket } from '#application/types' +import { TSocket, UUID } from '#application/types' import { Authentication } from '#middleware/authentication' class SocketManager { @@ -111,12 +111,12 @@ class SocketManager { .emit(event, ...args) } - public getSocketByUserId(userId: number): TSocket | undefined { + public getSocketByUserId(userId: UUID): TSocket | undefined { const sockets = Array.from(this.getIO().sockets.sockets.values()) return sockets.find((socket: TSocket) => socket.userId === userId) } - public getSocketByCharacterId(characterId: number): TSocket | undefined { + public getSocketByCharacterId(characterId: UUID): TSocket | undefined { const sockets = Array.from(this.getIO().sockets.sockets.values()) return sockets.find((socket: TSocket) => socket.characterId === characterId) } diff --git a/src/managers/zoneManager.ts b/src/managers/zoneManager.ts index dc39232..786fc0d 100644 --- a/src/managers/zoneManager.ts +++ b/src/managers/zoneManager.ts @@ -1,11 +1,12 @@ import Logger, { LoggerType } from '#application/logger' +import { UUID } from '#application/types' import { Zone } from '#entities/zone' import LoadedZone from '#models/loadedZone' import ZoneCharacter from '#models/zoneCharacter' import ZoneRepository from '#repositories/zoneRepository' class ZoneManager { - private readonly zones = new Map() + private readonly zones = new Map() private logger = Logger.type(LoggerType.GAME) public async boot(): Promise { @@ -21,7 +22,7 @@ class ZoneManager { this.logger.info(`Zone ID ${zone.id} loaded`) } - public unloadZone(zoneId: number): void { + public unloadZone(zoneId: UUID): void { this.zones.delete(zoneId) this.logger.info(`Zone ID ${zoneId} unloaded`) } @@ -30,11 +31,11 @@ class ZoneManager { return Array.from(this.zones.values()) } - public getZoneById(zoneId: number): LoadedZone | undefined { + public getZoneById(zoneId: UUID): LoadedZone | undefined { return this.zones.get(zoneId) } - public getCharacterById(characterId: number): ZoneCharacter | undefined { + public getCharacterById(characterId: UUID): ZoneCharacter | undefined { for (const zone of this.zones.values()) { const character = zone.getCharactersInZone().find((char) => char.character.id === characterId) if (character) return character @@ -42,7 +43,7 @@ class ZoneManager { return undefined } - public removeCharacter(characterId: number): void { + public removeCharacter(characterId: UUID): void { this.zones.forEach((zone) => zone.removeCharacter(characterId)) } } diff --git a/src/models/loadedZone.ts b/src/models/loadedZone.ts index 2b216b8..92d54a9 100644 --- a/src/models/loadedZone.ts +++ b/src/models/loadedZone.ts @@ -1,5 +1,6 @@ import ZoneCharacter from './zoneCharacter' +import { UUID } from '#application/types' import { Character } from '#entities/character' import { Zone } from '#entities/zone' import zoneEventTileRepository from '#repositories/zoneEventTileRepository' @@ -21,7 +22,7 @@ class LoadedZone { this.characters.push(zoneCharacter) } - public async removeCharacter(id: number) { + public async removeCharacter(id: UUID) { const zoneCharacter = this.getCharacterById(id) if (zoneCharacter) { await zoneCharacter.savePosition() @@ -29,7 +30,7 @@ class LoadedZone { } } - public getCharacterById(id: number): ZoneCharacter | undefined { + public getCharacterById(id: UUID): ZoneCharacter | undefined { return this.characters.find((c) => c.character.id === id) } diff --git a/src/repositories/characterRepository.ts b/src/repositories/characterRepository.ts index f4c2579..87e31c5 100644 --- a/src/repositories/characterRepository.ts +++ b/src/repositories/characterRepository.ts @@ -1,8 +1,9 @@ import { BaseRepository } from '#application/base/baseRepository' +import { UUID } from '#application/types' import { Character } from '#entities/character' class CharacterRepository extends BaseRepository { - async getByUserId(userId: number): Promise { + async getByUserId(userId: UUID): Promise { try { const repository = this.em.getRepository(Character) return await repository.find({ user: userId }) @@ -12,7 +13,7 @@ class CharacterRepository extends BaseRepository { } } - async getByUserAndId(userId: number, characterId: number): Promise { + async getByUserAndId(userId: UUID, characterId: UUID): Promise { try { const repository = this.em.getRepository(Character) return await repository.findOne({ user: userId, id: characterId }) @@ -22,7 +23,7 @@ class CharacterRepository extends BaseRepository { } } - async getById(id: number, populate?: string[]): Promise { + async getById(id: UUID, populate?: string[]): Promise { try { const repository = this.em.getRepository(Character) return await repository.findOne({ id }) diff --git a/src/repositories/characterTypeRepository.ts b/src/repositories/characterTypeRepository.ts index 319fc72..dd763f3 100644 --- a/src/repositories/characterTypeRepository.ts +++ b/src/repositories/characterTypeRepository.ts @@ -1,4 +1,5 @@ import { BaseRepository } from '#application/base/baseRepository' +import { UUID } from '#application/types' import { CharacterType } from '#entities/characterType' class CharacterTypeRepository extends BaseRepository { diff --git a/src/repositories/chatRepository.ts b/src/repositories/chatRepository.ts index b7d88ea..a4495b3 100644 --- a/src/repositories/chatRepository.ts +++ b/src/repositories/chatRepository.ts @@ -1,8 +1,9 @@ import { BaseRepository } from '#application/base/baseRepository' +import { UUID } from '#application/types' import { Chat } from '#entities/chat' class ChatRepository extends BaseRepository { - async getById(id: number): Promise { + async getById(id: UUID): Promise { try { const repository = this.em.getRepository(Chat) return await repository.find({ @@ -24,7 +25,7 @@ class ChatRepository extends BaseRepository { } } - async getByCharacterId(characterId: number): Promise { + async getByCharacterId(characterId: UUID): Promise { try { const repository = this.em.getRepository(Chat) return await repository.find({ character: characterId }) @@ -34,7 +35,7 @@ class ChatRepository extends BaseRepository { } } - async getByZoneId(zoneId: number): Promise { + async getByZoneId(zoneId: UUID): Promise { try { const repository = this.em.getRepository(Chat) return await repository.find({ zone: zoneId }) diff --git a/src/repositories/itemRepository.ts b/src/repositories/itemRepository.ts index 256e5bc..522b18c 100644 --- a/src/repositories/itemRepository.ts +++ b/src/repositories/itemRepository.ts @@ -1,8 +1,9 @@ import { BaseRepository } from '#application/base/baseRepository' +import { UUID } from '#application/types' import { Item } from '#entities/item' class ItemRepository extends BaseRepository { - async getById(id: string): Promise { + async getById(id: UUID): Promise { try { const repository = this.em.getRepository(Item) return await repository.findOne({ id }) @@ -12,7 +13,7 @@ class ItemRepository extends BaseRepository { } } - async getByIds(ids: string[]): Promise { + async getByIds(ids: UUID[]): Promise { try { const repository = this.em.getRepository(Item) return await repository.find({ diff --git a/src/repositories/objectRepository.ts b/src/repositories/objectRepository.ts index e91e941..a0a799a 100644 --- a/src/repositories/objectRepository.ts +++ b/src/repositories/objectRepository.ts @@ -1,7 +1,8 @@ import { BaseRepository } from '#application/base/baseRepository' +import { UUID } from '#application/types' class ObjectRepository extends BaseRepository { - async getById(id: string): Promise { + async getById(id: UUID): Promise { try { const repository = this.em.getRepository(Object) return await repository.findOne({ id }) diff --git a/src/repositories/passwordResetTokenRepository.ts b/src/repositories/passwordResetTokenRepository.ts index 91f18ba..139cc93 100644 --- a/src/repositories/passwordResetTokenRepository.ts +++ b/src/repositories/passwordResetTokenRepository.ts @@ -1,8 +1,9 @@ import { BaseRepository } from '#application/base/baseRepository' // Import the global Prisma instance +import { UUID } from '#application/types' import { PasswordResetToken } from '#entities/passwordResetToken' class PasswordResetTokenRepository extends BaseRepository { - async getById(id: number): Promise { + async getById(id: UUID): Promise { try { const repository = this.em.getRepository(PasswordResetToken) return await repository.findOne({ id }) @@ -12,7 +13,7 @@ class PasswordResetTokenRepository extends BaseRepository { } } - async getByUserId(userId: number): Promise { + async getByUserId(userId: UUID): Promise { try { const repository = this.em.getRepository(PasswordResetToken) return await repository.findOne({ diff --git a/src/repositories/spriteRepository.ts b/src/repositories/spriteRepository.ts index e748eba..b345ca9 100644 --- a/src/repositories/spriteRepository.ts +++ b/src/repositories/spriteRepository.ts @@ -1,10 +1,9 @@ -import { FilterValue } from '@mikro-orm/core' - import { BaseRepository } from '#application/base/baseRepository' +import { UUID } from '#application/types' import { Sprite } from '#entities/sprite' class SpriteRepository extends BaseRepository { - async getById(id: FilterValue<`${string}-${string}-${string}-${string}-${string}`>) { + async getById(id: UUID) { try { const repository = this.em.getRepository(Sprite) return await repository.findOne({ id }) diff --git a/src/repositories/userRepository.ts b/src/repositories/userRepository.ts index 8191ec7..7ddcaf1 100644 --- a/src/repositories/userRepository.ts +++ b/src/repositories/userRepository.ts @@ -1,8 +1,9 @@ import { BaseRepository } from '#application/base/baseRepository' +import { UUID } from '#application/types' import { User } from '#entities/user' class UserRepository extends BaseRepository { - async getById(id: number) { + async getById(id: UUID) { try { const repository = this.em.getRepository(User) return await repository.findOne({ id }) diff --git a/src/repositories/zoneEventTileRepository.ts b/src/repositories/zoneEventTileRepository.ts index 677d6ef..1560d8c 100644 --- a/src/repositories/zoneEventTileRepository.ts +++ b/src/repositories/zoneEventTileRepository.ts @@ -1,8 +1,9 @@ import { BaseRepository } from '#application/base/baseRepository' +import { UUID } from '#application/types' import { ZoneEventTile } from '#entities/zoneEventTile' class ZoneEventTileRepository extends BaseRepository { - async getAll(id: number): Promise { + async getAll(id: UUID): Promise { try { const repository = this.em.getRepository(ZoneEventTile) return await repository.find({ @@ -14,7 +15,7 @@ class ZoneEventTileRepository extends BaseRepository { } } - async getEventTileByZoneIdAndPosition(zoneId: number, positionX: number, positionY: number) { + async getEventTileByZoneIdAndPosition(zoneId: UUID, positionX: number, positionY: number) { try { const repository = this.em.getRepository(ZoneEventTile) return await repository.findOne({ diff --git a/src/services/chatService.ts b/src/services/chatService.ts index 36b33da..0bab805 100644 --- a/src/services/chatService.ts +++ b/src/services/chatService.ts @@ -1,14 +1,14 @@ import { Server } from 'socket.io' import { BaseService } from '#application/base/baseService' -import { TSocket } from '#application/types' +import { TSocket, UUID } from '#application/types' import { Chat } from '#entities/chat' import CharacterRepository from '#repositories/characterRepository' import ChatRepository from '#repositories/chatRepository' import ZoneRepository from '#repositories/zoneRepository' class ChatService extends BaseService { - async sendZoneMessage(io: Server, socket: TSocket, message: string, characterId: number, zoneId: number): Promise { + async sendZoneMessage(io: Server, socket: TSocket, message: string, characterId: UUID, zoneId: UUID): Promise { try { const character = await CharacterRepository.getById(characterId) if (!character) return false diff --git a/src/services/teleportService.ts b/src/services/teleportService.ts index 63bbfa2..0c86414 100644 --- a/src/services/teleportService.ts +++ b/src/services/teleportService.ts @@ -1,11 +1,12 @@ import Logger, { LoggerType } from '#application/logger' +import { UUID } from '#application/types' import { Character } from '#entities/character' import SocketManager from '#managers/socketManager' import ZoneManager from '#managers/zoneManager' import ZoneCharacter from '#models/zoneCharacter' interface TeleportOptions { - targetZoneId: number + targetZoneId: UUID targetX: number targetY: number rotation?: number @@ -16,7 +17,7 @@ interface TeleportOptions { class TeleportService { private readonly logger = Logger.type(LoggerType.GAME) - public async teleportCharacter(characterId: number, options: TeleportOptions): Promise { + public async teleportCharacter(characterId: UUID, options: TeleportOptions): Promise { const { targetZoneId, targetX, targetY, rotation = 0, isInitialJoin = false, character } = options const socket = SocketManager.getSocketByCharacterId(characterId)