diff --git a/src/events/character/connect.ts b/src/events/character/connect.ts index 8f177db..5aa1b83 100644 --- a/src/events/character/connect.ts +++ b/src/events/character/connect.ts @@ -1,6 +1,7 @@ import { Server } from 'socket.io' import { TSocket, ExtendedCharacter } from '../../utilities/types' import CharacterRepository from '../../repositories/characterRepository' +import CharacterManager from '../../managers/characterManager' type SocketResponseT = { character_id: number @@ -10,8 +11,11 @@ export default function (socket: TSocket, io: Server) { socket.on('character:connect', async (data: SocketResponseT) => { console.log('character:connect requested', data) try { - socket.character = (await CharacterRepository.getByUserAndId(socket.user?.id as number, data.character_id)) as ExtendedCharacter - socket.emit('character:connect', socket.character) + const foundCharacter = await CharacterRepository.getByUserAndId(socket?.user?.id as number, data.character_id); + if(!foundCharacter) return; + socket.characterId = foundCharacter.id; + CharacterManager.initCharacter(foundCharacter as ExtendedCharacter); + socket.emit('character:connect', foundCharacter) } catch (error: any) { console.log('character:connect error', error) } diff --git a/src/events/chat/gameMaster/alertCommand.ts b/src/events/chat/gameMaster/alertCommand.ts index cbba29c..1210e0b 100644 --- a/src/events/chat/gameMaster/alertCommand.ts +++ b/src/events/chat/gameMaster/alertCommand.ts @@ -16,7 +16,7 @@ export default function (socket: TSocket, io: Server) { if (!args) return - const character = await CharacterRepository.getByUserAndId(socket.user?.id as number, socket.character?.id as number) + const character = await CharacterRepository.getByUserAndId(socket.user?.id as number, socket.characterId as number) if (!character) return io.emit('notification', { title: 'Message from GM', message: args.join(' ') }) diff --git a/src/events/chat/gameMaster/teleportCommand.ts b/src/events/chat/gameMaster/teleportCommand.ts index effb5a5..48b2697 100644 --- a/src/events/chat/gameMaster/teleportCommand.ts +++ b/src/events/chat/gameMaster/teleportCommand.ts @@ -23,7 +23,8 @@ export default class TeleportCommandEvent { private async handleTeleportCommand(data: TypePayload, callback: (response: boolean) => void): Promise { try { - if (!this.socket.character) { + const character = CharacterManager.getCharacterFromSocket(this.socket); + if (!character) { this.socket.emit('notification', { title: 'Server message', message: 'Character not found' }) return } @@ -49,26 +50,27 @@ export default class TeleportCommandEvent { return } - if (this.socket.character.zoneId === zone.id) { + if (character.zoneId === zone.id) { this.socket.emit('notification', { title: 'Server message', message: 'You are already in that zone' }) return } // Remove character from current zone - this.io.to(this.socket.character.zoneId.toString()).emit('zone:character:leave', this.socket.character.id) - this.socket.leave(this.socket.character.zoneId.toString()) - await CharacterManager.removeCharacter(this.socket.character) + this.io.to(character.zoneId.toString()).emit('zone:character:leave', character.id) + this.socket.leave(character.zoneId.toString()) + await CharacterManager.removeCharacter(character) + CharacterManager.getCharacter(character.id); // Add character to new zone - this.io.to(zone.id.toString()).emit('zone:character:join', this.socket.character) + this.io.to(zone.id.toString()).emit('zone:character:join', character) this.socket.join(zone.id.toString()) - this.socket.character.zoneId = zone.id - this.socket.character.positionX = 0 - this.socket.character.positionY = 0 + character.zoneId = zone.id + character.positionX = 0 + character.positionY = 0 // Update character in CharacterManager - CharacterManager.initCharacter(this.socket.character) + CharacterManager.initCharacter(character) this.socket.emit('zone:character:teleport', { zone, @@ -76,7 +78,7 @@ export default class TeleportCommandEvent { }) this.socket.emit('notification', { title: 'Server message', message: `You have been teleported to ${zone.name}` }) - logger.info('teleport', `Character ${this.socket.character.id} teleported to zone ${zone.id}`) + logger.info('teleport', `Character ${character.id} teleported to zone ${zone.id}`) callback(true) } catch (error: any) { diff --git a/src/events/chat/sendMessage.ts b/src/events/chat/sendMessage.ts index 4979432..3c1e87c 100644 --- a/src/events/chat/sendMessage.ts +++ b/src/events/chat/sendMessage.ts @@ -4,6 +4,7 @@ import CharacterRepository from '../../repositories/characterRepository' import ZoneRepository from '../../repositories/zoneRepository' import { isCommand } from '../../utilities/chat' import logger from '../../utilities/logger' +import CharacterManager from '../../managers/characterManager' type TypePayload = { message: string @@ -26,7 +27,7 @@ export default class ChatMessageEvent { return } - const character = await CharacterRepository.getByUserAndId(this.socket.user?.id as number, this.socket.character?.id as number) + const character = await CharacterRepository.getByUserAndId(this.socket.user?.id as number, this.socket.characterId as number) if (!character) { logger.error('chat:send_message error', 'Character not found') callback(false) diff --git a/src/events/disconnect.ts b/src/events/disconnect.ts index 35d0891..ea650a7 100644 --- a/src/events/disconnect.ts +++ b/src/events/disconnect.ts @@ -12,16 +12,18 @@ export default function (socket: TSocket, io: Server) { io.emit('user:disconnect', socket.user.id) - if (!socket.character) { + const character = CharacterManager.getCharacterFromSocket(socket); + + if (!character) { console.log('User disconnected but had no character set') return } console.log('User disconnected along with their character') - await CharacterManager.removeCharacter(socket.character) + await CharacterManager.removeCharacter(character) - io.in(socket.character.zoneId.toString()).emit('zone:character:leave', socket.character.id) - io.emit('character:disconnect', socket.character.id) + io.in(character.zoneId.toString()).emit('zone:character:leave', character.id) + io.emit('character:disconnect', character.id) }) } diff --git a/src/events/gameMaster/assetManager/object/list.ts b/src/events/gameMaster/assetManager/object/list.ts index 57c5edf..61890f0 100644 --- a/src/events/gameMaster/assetManager/object/list.ts +++ b/src/events/gameMaster/assetManager/object/list.ts @@ -2,6 +2,7 @@ import { Server } from 'socket.io' import { TSocket } from '../../../../utilities/types' import { Object } from '@prisma/client' import ObjectRepository from '../../../../repositories/objectRepository' +import CharacterManager from '../../../../managers/characterManager' interface IPayload {} @@ -12,8 +13,9 @@ interface IPayload {} */ export default function (socket: TSocket, io: Server) { socket.on('gm:object:list', async (data: any, callback: (response: Object[]) => void) => { - if (socket.character?.role !== 'gm') { - console.log(`---Character #${socket.character?.id} is not a game master.`) + const character = CharacterManager.getCharacterFromSocket(socket); + if (character?.role !== 'gm') { + console.log(`---Character #${character?.id} is not a game master.`) return } diff --git a/src/events/gameMaster/assetManager/object/remove.ts b/src/events/gameMaster/assetManager/object/remove.ts index ba1fb9e..a267b68 100644 --- a/src/events/gameMaster/assetManager/object/remove.ts +++ b/src/events/gameMaster/assetManager/object/remove.ts @@ -3,6 +3,7 @@ import { TSocket } from '../../../../utilities/types' import path from 'path' import fs from 'fs' import prisma from '../../../../utilities/prisma' +import CharacterManager from '../../../../managers/characterManager' interface IPayload { object: string @@ -15,7 +16,8 @@ interface IPayload { */ export default function (socket: TSocket, io: Server) { socket.on('gm:object:remove', async (data: IPayload, callback: (response: boolean) => void) => { - if (socket.character?.role !== 'gm') { + const character = CharacterManager.getCharacterFromSocket(socket); + if (character?.role !== 'gm') { return } diff --git a/src/events/gameMaster/assetManager/object/update.ts b/src/events/gameMaster/assetManager/object/update.ts index 47341ef..e054ea2 100644 --- a/src/events/gameMaster/assetManager/object/update.ts +++ b/src/events/gameMaster/assetManager/object/update.ts @@ -1,6 +1,7 @@ import { Server } from 'socket.io' import { TSocket } from '../../../../utilities/types' import prisma from '../../../../utilities/prisma' +import CharacterManager from '../../../../managers/characterManager' type Payload = { id: string @@ -21,7 +22,8 @@ type Payload = { */ export default function (socket: TSocket, io: Server) { socket.on('gm:object:update', async (data: Payload, callback: (success: boolean) => void) => { - if (socket.character?.role !== 'gm') { + const character = CharacterManager.getCharacterFromSocket(socket); + if (character?.role !== 'gm') { return } diff --git a/src/events/gameMaster/assetManager/object/upload.ts b/src/events/gameMaster/assetManager/object/upload.ts index 5b5e7b8..f1ccb55 100644 --- a/src/events/gameMaster/assetManager/object/upload.ts +++ b/src/events/gameMaster/assetManager/object/upload.ts @@ -6,6 +6,7 @@ import fs from 'fs/promises' import prisma from '../../../../utilities/prisma' import sharp from 'sharp' import logger from '../../../../utilities/logger' +import CharacterManager from '../../../../managers/characterManager' interface IObjectData { [key: string]: Buffer @@ -23,7 +24,8 @@ export default class ObjectUploadEvent { private async handleObjectUpload(data: IObjectData, callback: (response: boolean) => void): Promise { try { - if (this.socket.character?.role !== 'gm') { + const character = CharacterManager.getCharacterFromSocket(this.socket); + if (character?.role !== 'gm') { callback(false) return } diff --git a/src/events/gameMaster/assetManager/sprite/create.ts b/src/events/gameMaster/assetManager/sprite/create.ts index d90424e..699a3a3 100644 --- a/src/events/gameMaster/assetManager/sprite/create.ts +++ b/src/events/gameMaster/assetManager/sprite/create.ts @@ -3,6 +3,7 @@ import { TSocket } from '../../../../utilities/types' import path from 'path' import fs from 'fs/promises' import prisma from '../../../../utilities/prisma' +import CharacterManager from '../../../../managers/characterManager' /** * Handle game master new sprite event @@ -12,7 +13,11 @@ import prisma from '../../../../utilities/prisma' export default function (socket: TSocket, io: Server) { socket.on('gm:sprite:create', async (data: undefined, callback: (response: boolean) => void) => { try { - if (socket.character?.role !== 'gm') { + if (!socket.characterId) return + const character = CharacterManager.getCharacterFromSocket(socket); + if(!character) return + + if (character.role !== 'gm') { callback(false) return } diff --git a/src/events/gameMaster/assetManager/sprite/delete.ts b/src/events/gameMaster/assetManager/sprite/delete.ts index 2377686..7b84289 100644 --- a/src/events/gameMaster/assetManager/sprite/delete.ts +++ b/src/events/gameMaster/assetManager/sprite/delete.ts @@ -4,6 +4,7 @@ import fs from 'fs' import path from 'path' import prisma from '../../../../utilities/prisma' import logger from '../../../../utilities/logger' +import CharacterManager from '../../../../managers/characterManager' type Payload = { id: string @@ -24,7 +25,8 @@ export default class GMSpriteDeleteEvent { } private async handleSpriteDelete(data: Payload, callback: (response: boolean) => void): Promise { - if (this.socket.character?.role !== 'gm') { + const character = CharacterManager.getCharacterFromSocket(this.socket); + if (character?.role !== 'gm') { callback(false) return } diff --git a/src/events/gameMaster/assetManager/sprite/list.ts b/src/events/gameMaster/assetManager/sprite/list.ts index 4133ea4..08222f4 100644 --- a/src/events/gameMaster/assetManager/sprite/list.ts +++ b/src/events/gameMaster/assetManager/sprite/list.ts @@ -2,6 +2,7 @@ import { Server } from 'socket.io' import { TSocket } from '../../../../utilities/types' import { Sprite } from '@prisma/client' import SpriteRepository from '../../../../repositories/spriteRepository' +import CharacterManager from '../../../../managers/characterManager' interface IPayload {} @@ -12,8 +13,9 @@ interface IPayload {} */ export default function (socket: TSocket, io: Server) { socket.on('gm:sprite:list', async (data: any, callback: (response: Sprite[]) => void) => { - if (socket.character?.role !== 'gm') { - console.log(`---Character #${socket.character?.id} is not a game master.`) + const character = CharacterManager.getCharacterFromSocket(socket); + if (character?.role !== 'gm') { + console.log(`---Character #${character?.id} is not a game master.`) return } diff --git a/src/events/gameMaster/assetManager/sprite/update.ts b/src/events/gameMaster/assetManager/sprite/update.ts index 3f1a634..0cca8bc 100644 --- a/src/events/gameMaster/assetManager/sprite/update.ts +++ b/src/events/gameMaster/assetManager/sprite/update.ts @@ -5,6 +5,7 @@ import type { Prisma, SpriteAction } from '@prisma/client' import path from 'path' import { writeFile, mkdir } from 'node:fs/promises' import sharp from 'sharp' +import CharacterManager from '../../../../managers/characterManager' type SpriteActionInput = Omit & { sprites: string[] @@ -28,7 +29,8 @@ interface ProcessedSpriteAction extends SpriteActionInput { export default function (socket: TSocket, io: Server) { socket.on('gm:sprite:update', async (data: Payload, callback: (success: boolean) => void) => { - if (socket.character?.role !== 'gm') { + const character = CharacterManager.getCharacterFromSocket(socket); + if (character?.role !== 'gm') { callback(false) return } diff --git a/src/events/gameMaster/assetManager/tile/delete.ts b/src/events/gameMaster/assetManager/tile/delete.ts index 5f792c2..3c2e450 100644 --- a/src/events/gameMaster/assetManager/tile/delete.ts +++ b/src/events/gameMaster/assetManager/tile/delete.ts @@ -4,6 +4,7 @@ import { Server } from 'socket.io' import { TSocket } from '../../../../utilities/types' import prisma from '../../../../utilities/prisma' import logger from '../../../../utilities/logger' +import CharacterManager from '../../../../managers/characterManager' type Payload = { id: string @@ -24,7 +25,8 @@ export default class GMTileDeleteEvent { } private async handleTileDelete(data: Payload, callback: (response: boolean) => void): Promise { - if (this.socket.character?.role !== 'gm') { + const character = CharacterManager.getCharacterFromSocket(this.socket); + if (character?.role !== 'gm') { callback(false) return } diff --git a/src/events/gameMaster/assetManager/tile/list.ts b/src/events/gameMaster/assetManager/tile/list.ts index aa9c1ed..84c6974 100644 --- a/src/events/gameMaster/assetManager/tile/list.ts +++ b/src/events/gameMaster/assetManager/tile/list.ts @@ -2,6 +2,7 @@ import { Server } from 'socket.io' import { TSocket } from '../../../../utilities/types' import { Tile } from '@prisma/client' import TileRepository from '../../../../repositories/tileRepository' +import CharacterManager from '../../../../managers/characterManager' interface IPayload {} @@ -12,8 +13,9 @@ interface IPayload {} */ export default function (socket: TSocket, io: Server) { socket.on('gm:tile:list', async (data: any, callback: (response: Tile[]) => void) => { - if (socket.character?.role !== 'gm') { - console.log(`---Character #${socket.character?.id} is not a game master.`) + const character = CharacterManager.getCharacterFromSocket(socket); + if (character?.role !== 'gm') { + console.log(`---Character #${character?.id} is not a game master.`) return } diff --git a/src/events/gameMaster/assetManager/tile/update.ts b/src/events/gameMaster/assetManager/tile/update.ts index 8b8a58e..3950fb6 100644 --- a/src/events/gameMaster/assetManager/tile/update.ts +++ b/src/events/gameMaster/assetManager/tile/update.ts @@ -1,6 +1,7 @@ import { Server } from 'socket.io' import { TSocket } from '../../../../utilities/types' import prisma from '../../../../utilities/prisma' +import CharacterManager from '../../../../managers/characterManager' type Payload = { id: string @@ -15,7 +16,8 @@ type Payload = { */ export default function (socket: TSocket, io: Server) { socket.on('gm:tile:update', async (data: Payload, callback: (success: boolean) => void) => { - if (socket.character?.role !== 'gm') { + const character = CharacterManager.getCharacterFromSocket(socket); + if (character?.role !== 'gm') { return } diff --git a/src/events/gameMaster/assetManager/tile/upload.ts b/src/events/gameMaster/assetManager/tile/upload.ts index 1b9d0d3..0ebd4a7 100644 --- a/src/events/gameMaster/assetManager/tile/upload.ts +++ b/src/events/gameMaster/assetManager/tile/upload.ts @@ -4,6 +4,7 @@ import { writeFile } from 'node:fs/promises' import path from 'path' import fs from 'fs/promises' import prisma from '../../../../utilities/prisma' +import CharacterManager from '../../../../managers/characterManager' interface ITileData { [key: string]: Buffer @@ -17,7 +18,8 @@ interface ITileData { export default function (socket: TSocket, io: Server) { socket.on('gm:tile:upload', async (data: ITileData, callback: (response: boolean) => void) => { try { - if (socket.character?.role !== 'gm') { + const character = CharacterManager.getCharacterFromSocket(socket); + if (character?.role !== 'gm') { callback(false) return } diff --git a/src/events/gameMaster/zoneEditor/create.ts b/src/events/gameMaster/zoneEditor/create.ts index ab73911..1a80bae 100644 --- a/src/events/gameMaster/zoneEditor/create.ts +++ b/src/events/gameMaster/zoneEditor/create.ts @@ -3,6 +3,7 @@ import { TSocket } from '../../../utilities/types' import ZoneRepository from '../../../repositories/zoneRepository' import { Zone } from '@prisma/client' import prisma from '../../../utilities/prisma' +import CharacterManager from '../../../managers/characterManager' type Payload = { name: string @@ -17,12 +18,13 @@ type Payload = { */ export default function (socket: TSocket, io: Server) { socket.on('gm:zone_editor:zone:create', async (data: Payload, callback: (response: Zone[]) => void) => { - if (socket.character?.role !== 'gm') { - console.log(`---Character #${socket.character?.id} is not a game master.`) + const character = CharacterManager.getCharacterFromSocket(socket); + if (character?.role !== 'gm') { + console.log(`---Character #${character?.id} is not a game master.`) return } - console.log(`---GM ${socket.character?.id} has created a new zone via zone editor.`) + console.log(`---GM ${character?.id} has created a new zone via zone editor.`) let zoneList: Zone[] = [] try { const zone = await prisma.zone.create({ diff --git a/src/events/gameMaster/zoneEditor/delete.ts b/src/events/gameMaster/zoneEditor/delete.ts index 4e737f2..73e3810 100644 --- a/src/events/gameMaster/zoneEditor/delete.ts +++ b/src/events/gameMaster/zoneEditor/delete.ts @@ -2,6 +2,7 @@ import { Server } from 'socket.io' import { TSocket } from '../../../utilities/types' import ZoneRepository from '../../../repositories/zoneRepository' import prisma from '../../../utilities/prisma' +import CharacterManager from '../../../managers/characterManager' type Payload = { zoneId: number @@ -14,12 +15,14 @@ type Payload = { */ export default function (socket: TSocket, io: Server) { socket.on('gm:zone_editor:zone:delete', async (data: Payload, callback: (response: boolean) => void) => { - if (socket.character?.role !== 'gm') { - console.log(`---Character #${socket.character?.id} is not a game master.`) + const character = CharacterManager.getCharacterFromSocket(socket); + + if (character?.role !== 'gm') { + console.log(`---Character #${character?.id} is not a game master.`) return } - console.log(`---GM ${socket.character?.id} has deleted a zone via zone editor.`) + console.log(`---GM ${character?.id} has deleted a zone via zone editor.`) try { const zone = await ZoneRepository.getById(data.zoneId) diff --git a/src/events/gameMaster/zoneEditor/list.ts b/src/events/gameMaster/zoneEditor/list.ts index f417b06..ac9692c 100644 --- a/src/events/gameMaster/zoneEditor/list.ts +++ b/src/events/gameMaster/zoneEditor/list.ts @@ -2,6 +2,7 @@ import { Server } from 'socket.io' import { TSocket } from '../../../utilities/types' import { Zone } from '@prisma/client' import ZoneRepository from '../../../repositories/zoneRepository' +import CharacterManager from '../../../managers/characterManager' interface IPayload {} @@ -12,12 +13,13 @@ interface IPayload {} */ export default function (socket: TSocket, io: Server) { socket.on('gm:zone_editor:zone:list', async (data: IPayload, callback: (response: Zone[]) => void) => { - if (socket.character?.role !== 'gm') { - console.log(`---Character #${socket.character?.id} is not a game master.`) + const character = CharacterManager.getCharacterFromSocket(socket); + if (character?.role !== 'gm') { + console.log(`---Character #${character?.id} is not a game master.`) return } - console.log(`---GM ${socket.character?.id} has requested zone list via zone editor.`) + console.log(`---GM ${character?.id} has requested zone list via zone editor.`) try { const zones = await ZoneRepository.getAll() diff --git a/src/events/gameMaster/zoneEditor/request.ts b/src/events/gameMaster/zoneEditor/request.ts index a5d35e2..b0f3dc2 100644 --- a/src/events/gameMaster/zoneEditor/request.ts +++ b/src/events/gameMaster/zoneEditor/request.ts @@ -2,6 +2,7 @@ import { Server } from 'socket.io' import { TSocket } from '../../../utilities/types' import ZoneRepository from '../../../repositories/zoneRepository' import { Zone } from '@prisma/client' +import CharacterManager from '../../../managers/characterManager' interface IPayload { zoneId: number @@ -14,11 +15,12 @@ interface IPayload { */ export default function (socket: TSocket, io: Server) { socket.on('gm:zone_editor:zone:request', async (data: IPayload, callback: (response: Zone) => void) => { - if (socket.character?.role !== 'gm') { + const character = CharacterManager.getCharacterFromSocket(socket); + if (character?.role !== 'gm') { return } - console.log(`---GM ${socket.character?.id} has requested zone via zone editor.`) + console.log(`---GM ${character?.id} has requested zone via zone editor.`) if (!data.zoneId) { console.log(`---Zone id not provided.`) diff --git a/src/events/gameMaster/zoneEditor/update.ts b/src/events/gameMaster/zoneEditor/update.ts index 5992a70..8d9d07b 100644 --- a/src/events/gameMaster/zoneEditor/update.ts +++ b/src/events/gameMaster/zoneEditor/update.ts @@ -5,6 +5,7 @@ import { Zone, ZoneEventTile, ZoneEventTileType, ZoneObject } from '@prisma/clie import prisma from '../../../utilities/prisma' import zoneManager from '../../../managers/zoneManager' import logger from '../../../utilities/logger' +import CharacterManager from '../../../managers/characterManager' interface IPayload { zoneId: number @@ -33,15 +34,16 @@ interface IPayload { */ export default function (socket: TSocket, io: Server) { socket.on('gm:zone_editor:zone:update', async (data: IPayload, callback: (response: Zone) => void) => { - if (socket.character?.role !== 'gm') { - logger.info(`User ${socket.character?.id} tried to update zone but is not a game master.`) + const character = CharacterManager.getCharacterFromSocket(socket); + if (character?.role !== 'gm') { + logger.info(`User ${character?.id} tried to update zone but is not a game master.`) return } - logger.info(`User ${socket.character?.id} has updated zone via zone editor.`) + logger.info(`User ${character?.id} has updated zone via zone editor.`) if (!data.zoneId) { - logger.info(`User ${socket.character?.id} tried to update zone but did not provide a zone id.`) + logger.info(`User ${character?.id} tried to update zone but did not provide a zone id.`) return } @@ -49,7 +51,7 @@ export default function (socket: TSocket, io: Server) { let zone = await ZoneRepository.getById(data.zoneId) if (!zone) { - logger.info(`User ${socket.character?.id} tried to update zone ${data.zoneId} but it does not exist.`) + logger.info(`User ${character?.id} tried to update zone ${data.zoneId} but it does not exist.`) return } @@ -103,7 +105,7 @@ export default function (socket: TSocket, io: Server) { zone = await ZoneRepository.getById(data.zoneId) if (!zone) { - logger.info(`User ${socket.character?.id} tried to update zone ${data.zoneId} but it does not exist.`) + logger.info(`User ${character?.id} tried to update zone ${data.zoneId} but it does not exist.`) return } diff --git a/src/events/zone/characterJoin.ts b/src/events/zone/characterJoin.ts index fcda304..914b5d8 100644 --- a/src/events/zone/characterJoin.ts +++ b/src/events/zone/characterJoin.ts @@ -23,7 +23,10 @@ interface IResponse { export default function (socket: TSocket, io: Server) { socket.on('zone:character:join', async (data: IPayload, callback: (response: IResponse) => void) => { try { - if (!socket.character) return + if (!socket.characterId) return + const character = CharacterManager.getCharacterFromSocket(socket); + + if(!character) return if (!data.zoneId) { console.log(`---Zone id not provided.`) @@ -37,19 +40,19 @@ export default function (socket: TSocket, io: Server) { return } - if (socket.character?.zoneId) { - socket.leave(socket.character.zoneId.toString()) - io.to(socket.character.zoneId.toString()).emit('zone:character:leave', socket.character) + if (character?.zoneId) { + socket.leave(character.zoneId.toString()) + io.to(character.zoneId.toString()).emit('zone:character:leave', character) } socket.join(zone.id.toString()) // let other clients know of new character - io.to(zone.id.toString()).emit('zone:character:join', socket.character) + io.to(zone.id.toString()).emit('zone:character:join', character) // add character to zone manager // ZoneManager.addCharacterToZone(zone.id, socket.character as Character) - CharacterManager.initCharacter(socket.character as ExtendedCharacter) + // CharacterManager.initCharacter(character as ExtendedCharacter) // ZoneManager.addCharacterToZone(zone.id, socket.character as Character) // send over zone and characters to socket diff --git a/src/events/zone/characterLeave.ts b/src/events/zone/characterLeave.ts index b6e62a4..187003e 100644 --- a/src/events/zone/characterLeave.ts +++ b/src/events/zone/characterLeave.ts @@ -1,8 +1,6 @@ import { Server } from 'socket.io' import { TSocket } from '../../utilities/types' import ZoneRepository from '../../repositories/zoneRepository' -import ZoneManager from '../../managers/zoneManager' -import { Character, Zone } from '@prisma/client' import CharacterManager from '../../managers/characterManager' import logger from '../../utilities/logger' @@ -18,17 +16,18 @@ export default class ZoneLeaveEvent { private async handleZoneLeave(): Promise { try { - if (!this.socket.character) { + const character = CharacterManager.getCharacterFromSocket(this.socket); + if (!character) { logger.error('zone:character:leave error', 'Character not found') return } - if (!this.socket.character.zoneId) { + if (!character.zoneId) { logger.error('zone:character:leave error', 'Character not in a zone') return } - const zone = await ZoneRepository.getById(this.socket.character.zoneId) + const zone = await ZoneRepository.getById(character.zoneId) if (!zone) { logger.error('zone:character:leave error', 'Zone not found') @@ -38,12 +37,12 @@ export default class ZoneLeaveEvent { this.socket.leave(zone.id.toString()) // let other clients know of character leaving - this.io.to(zone.id.toString()).emit('zone:character:leave', this.socket.character.id) + this.io.to(zone.id.toString()).emit('zone:character:leave', character.id) // remove character from zone manager - await CharacterManager.removeCharacter(this.socket.character) + await CharacterManager.removeCharacter(character) - logger.info('zone:character:leave', `Character ${this.socket.character.id} left zone ${zone.id}`) + logger.info('zone:character:leave', `Character ${character.id} left zone ${zone.id}`) } catch (error: any) { logger.error('zone:character:leave error', error.message) } diff --git a/src/events/zone/characterMove.ts b/src/events/zone/characterMove.ts index 4c2a4d1..af8c9ee 100644 --- a/src/events/zone/characterMove.ts +++ b/src/events/zone/characterMove.ts @@ -118,7 +118,7 @@ export default class CharacterMove { } private async handleZoneEventTile(zoneEventTile: ZoneEventTileWithTeleport): Promise { - const { character } = this.socket + const character = CharacterManager.getCharacterFromSocket(this.socket) if (!character) { logger.error('character:move error', 'Character not found') return diff --git a/src/managers/characterManager.ts b/src/managers/characterManager.ts index 9ed6fcc..521217b 100644 --- a/src/managers/characterManager.ts +++ b/src/managers/characterManager.ts @@ -31,7 +31,7 @@ class CharacterManager { } public getCharacterFromSocket(socket: TSocket) { - return this.characters.find((x) => x.id === socket?.character?.id) + return this.characters.find((x) => x.id === socket?.characterId) } public getCharactersInZone(zone: Zone) { diff --git a/src/utilities/types.ts b/src/utilities/types.ts index 2f206d2..05254c3 100644 --- a/src/utilities/types.ts +++ b/src/utilities/types.ts @@ -3,7 +3,7 @@ import { Character, User } from '@prisma/client' export type TSocket = Socket & { user?: User - character?: ExtendedCharacter + characterId?: number handshake?: { query?: { token?: any