From 6b2433f814ce8ebb6bdb6dec9bb6bdb138799dd6 Mon Sep 17 00:00:00 2001 From: Dennis Postma Date: Sat, 21 Sep 2024 00:42:08 +0200 Subject: [PATCH] GM event fixes --- src/events/disconnect.ts | 1 - .../gameMaster/assetManager/object/list.ts | 10 ++++++---- .../gameMaster/assetManager/object/remove.ts | 9 ++++++--- .../gameMaster/assetManager/object/update.ts | 9 ++++++--- .../gameMaster/assetManager/object/upload.ts | 11 ++++++----- .../gameMaster/assetManager/sprite/create.ts | 9 ++++----- .../gameMaster/assetManager/sprite/delete.ts | 3 +-- .../gameMaster/assetManager/sprite/list.ts | 10 ++++++---- .../gameMaster/assetManager/sprite/update.ts | 3 +-- .../gameMaster/assetManager/tile/delete.ts | 8 +++++--- src/events/gameMaster/assetManager/tile/list.ts | 8 +++++--- .../gameMaster/assetManager/tile/update.ts | 7 +++++-- .../gameMaster/assetManager/tile/upload.ts | 9 ++++++--- src/events/gameMaster/zoneEditor/create.ts | 13 +++++++++---- src/events/gameMaster/zoneEditor/delete.ts | 13 ++++++++----- src/events/gameMaster/zoneEditor/list.ts | 12 ++++++++---- src/events/gameMaster/zoneEditor/request.ts | 17 +++++++++++------ src/events/gameMaster/zoneEditor/update.ts | 17 ++++++++++------- src/events/login.ts | 2 +- src/managers/characterManager.ts | 6 +----- 20 files changed, 105 insertions(+), 72 deletions(-) diff --git a/src/events/disconnect.ts b/src/events/disconnect.ts index ea650a7..3b5a13a 100644 --- a/src/events/disconnect.ts +++ b/src/events/disconnect.ts @@ -1,6 +1,5 @@ import { Server } from 'socket.io' import { TSocket } from '../utilities/types' -import ZoneManager from '../managers/zoneManager' import CharacterManager from '../managers/characterManager' export default function (socket: TSocket, io: Server) { diff --git a/src/events/gameMaster/assetManager/object/list.ts b/src/events/gameMaster/assetManager/object/list.ts index 61890f0..860119d 100644 --- a/src/events/gameMaster/assetManager/object/list.ts +++ b/src/events/gameMaster/assetManager/object/list.ts @@ -3,6 +3,7 @@ import { TSocket } from '../../../../utilities/types' import { Object } from '@prisma/client' import ObjectRepository from '../../../../repositories/objectRepository' import CharacterManager from '../../../../managers/characterManager' +import characterRepository from '../../../../repositories/characterRepository' interface IPayload {} @@ -13,10 +14,11 @@ interface IPayload {} */ export default function (socket: TSocket, io: Server) { socket.on('gm:object:list', async (data: any, callback: (response: Object[]) => void) => { - const character = CharacterManager.getCharacterFromSocket(socket); - if (character?.role !== 'gm') { - console.log(`---Character #${character?.id} is not a game master.`) - return + const character = await characterRepository.getById(socket.characterId as number); + if (!character) return callback([]) + + if (character.role !== 'gm') { + return callback([]) } // get all objects diff --git a/src/events/gameMaster/assetManager/object/remove.ts b/src/events/gameMaster/assetManager/object/remove.ts index a267b68..77299b2 100644 --- a/src/events/gameMaster/assetManager/object/remove.ts +++ b/src/events/gameMaster/assetManager/object/remove.ts @@ -4,6 +4,7 @@ import path from 'path' import fs from 'fs' import prisma from '../../../../utilities/prisma' import CharacterManager from '../../../../managers/characterManager' +import characterRepository from '../../../../repositories/characterRepository' interface IPayload { object: string @@ -16,9 +17,11 @@ interface IPayload { */ export default function (socket: TSocket, io: Server) { socket.on('gm:object:remove', async (data: IPayload, callback: (response: boolean) => void) => { - const character = CharacterManager.getCharacterFromSocket(socket); - if (character?.role !== 'gm') { - return + const character = await characterRepository.getById(socket.characterId as number); + if (!character) return callback(false) + + if (character.role !== 'gm') { + return callback(false) } try { diff --git a/src/events/gameMaster/assetManager/object/update.ts b/src/events/gameMaster/assetManager/object/update.ts index e054ea2..156f68d 100644 --- a/src/events/gameMaster/assetManager/object/update.ts +++ b/src/events/gameMaster/assetManager/object/update.ts @@ -2,6 +2,7 @@ import { Server } from 'socket.io' import { TSocket } from '../../../../utilities/types' import prisma from '../../../../utilities/prisma' import CharacterManager from '../../../../managers/characterManager' +import characterRepository from '../../../../repositories/characterRepository' type Payload = { id: string @@ -22,9 +23,11 @@ type Payload = { */ export default function (socket: TSocket, io: Server) { socket.on('gm:object:update', async (data: Payload, callback: (success: boolean) => void) => { - const character = CharacterManager.getCharacterFromSocket(socket); - if (character?.role !== 'gm') { - return + const character = await characterRepository.getById(socket.characterId as number); + if (!character) return callback(false) + + if (character.role !== 'gm') { + return callback(false) } try { diff --git a/src/events/gameMaster/assetManager/object/upload.ts b/src/events/gameMaster/assetManager/object/upload.ts index f1ccb55..4309d29 100644 --- a/src/events/gameMaster/assetManager/object/upload.ts +++ b/src/events/gameMaster/assetManager/object/upload.ts @@ -7,6 +7,7 @@ import prisma from '../../../../utilities/prisma' import sharp from 'sharp' import logger from '../../../../utilities/logger' import CharacterManager from '../../../../managers/characterManager' +import characterRepository from '../../../../repositories/characterRepository' interface IObjectData { [key: string]: Buffer @@ -24,12 +25,12 @@ export default class ObjectUploadEvent { private async handleObjectUpload(data: IObjectData, callback: (response: boolean) => void): Promise { try { - const character = CharacterManager.getCharacterFromSocket(this.socket); - if (character?.role !== 'gm') { - callback(false) - return - } + const character = await characterRepository.getById(this.socket.characterId as number); + if (!character) return callback(false) + if (character.role !== 'gm') { + return callback(false) + } const public_folder = path.join(process.cwd(), 'public', 'objects') // Ensure the folder exists diff --git a/src/events/gameMaster/assetManager/sprite/create.ts b/src/events/gameMaster/assetManager/sprite/create.ts index 699a3a3..a849707 100644 --- a/src/events/gameMaster/assetManager/sprite/create.ts +++ b/src/events/gameMaster/assetManager/sprite/create.ts @@ -4,6 +4,7 @@ import path from 'path' import fs from 'fs/promises' import prisma from '../../../../utilities/prisma' import CharacterManager from '../../../../managers/characterManager' +import characterRepository from '../../../../repositories/characterRepository' /** * Handle game master new sprite event @@ -13,13 +14,11 @@ import CharacterManager from '../../../../managers/characterManager' export default function (socket: TSocket, io: Server) { socket.on('gm:sprite:create', async (data: undefined, callback: (response: boolean) => void) => { try { - if (!socket.characterId) return - const character = CharacterManager.getCharacterFromSocket(socket); - if(!character) return + const character = await characterRepository.getById(socket.characterId as number); + if (!character) return callback(false) if (character.role !== 'gm') { - callback(false) - return + return callback(false) } const public_folder = path.join(process.cwd(), 'public', 'sprites') diff --git a/src/events/gameMaster/assetManager/sprite/delete.ts b/src/events/gameMaster/assetManager/sprite/delete.ts index 7b84289..9ddf02c 100644 --- a/src/events/gameMaster/assetManager/sprite/delete.ts +++ b/src/events/gameMaster/assetManager/sprite/delete.ts @@ -27,8 +27,7 @@ export default class GMSpriteDeleteEvent { private async handleSpriteDelete(data: Payload, callback: (response: boolean) => void): Promise { const character = CharacterManager.getCharacterFromSocket(this.socket); if (character?.role !== 'gm') { - callback(false) - return + return callback(false) } try { diff --git a/src/events/gameMaster/assetManager/sprite/list.ts b/src/events/gameMaster/assetManager/sprite/list.ts index 08222f4..cf24eb7 100644 --- a/src/events/gameMaster/assetManager/sprite/list.ts +++ b/src/events/gameMaster/assetManager/sprite/list.ts @@ -3,6 +3,7 @@ import { TSocket } from '../../../../utilities/types' import { Sprite } from '@prisma/client' import SpriteRepository from '../../../../repositories/spriteRepository' import CharacterManager from '../../../../managers/characterManager' +import characterRepository from '../../../../repositories/characterRepository' interface IPayload {} @@ -13,10 +14,11 @@ interface IPayload {} */ export default function (socket: TSocket, io: Server) { socket.on('gm:sprite:list', async (data: any, callback: (response: Sprite[]) => void) => { - const character = CharacterManager.getCharacterFromSocket(socket); - if (character?.role !== 'gm') { - console.log(`---Character #${character?.id} is not a game master.`) - return + const character = await characterRepository.getById(socket.characterId as number); + if (!character) return callback([]) + + if (character.role !== 'gm') { + return callback([]) } // get all sprites diff --git a/src/events/gameMaster/assetManager/sprite/update.ts b/src/events/gameMaster/assetManager/sprite/update.ts index 0cca8bc..b3c1615 100644 --- a/src/events/gameMaster/assetManager/sprite/update.ts +++ b/src/events/gameMaster/assetManager/sprite/update.ts @@ -31,8 +31,7 @@ export default function (socket: TSocket, io: Server) { socket.on('gm:sprite:update', async (data: Payload, callback: (success: boolean) => void) => { const character = CharacterManager.getCharacterFromSocket(socket); if (character?.role !== 'gm') { - callback(false) - return + return callback(false) } try { diff --git a/src/events/gameMaster/assetManager/tile/delete.ts b/src/events/gameMaster/assetManager/tile/delete.ts index 3c2e450..08aafad 100644 --- a/src/events/gameMaster/assetManager/tile/delete.ts +++ b/src/events/gameMaster/assetManager/tile/delete.ts @@ -5,6 +5,7 @@ import { TSocket } from '../../../../utilities/types' import prisma from '../../../../utilities/prisma' import logger from '../../../../utilities/logger' import CharacterManager from '../../../../managers/characterManager' +import characterRepository from '../../../../repositories/characterRepository' type Payload = { id: string @@ -25,9 +26,10 @@ export default class GMTileDeleteEvent { } private async handleTileDelete(data: Payload, callback: (response: boolean) => void): Promise { - const character = CharacterManager.getCharacterFromSocket(this.socket); - if (character?.role !== 'gm') { - callback(false) + const character = await characterRepository.getById(this.socket.characterId as number); + if (!character) return callback(false) + + if (character.role !== 'gm') { return } diff --git a/src/events/gameMaster/assetManager/tile/list.ts b/src/events/gameMaster/assetManager/tile/list.ts index 84c6974..5b8cce0 100644 --- a/src/events/gameMaster/assetManager/tile/list.ts +++ b/src/events/gameMaster/assetManager/tile/list.ts @@ -3,6 +3,7 @@ import { TSocket } from '../../../../utilities/types' import { Tile } from '@prisma/client' import TileRepository from '../../../../repositories/tileRepository' import CharacterManager from '../../../../managers/characterManager' +import characterRepository from '../../../../repositories/characterRepository' interface IPayload {} @@ -13,9 +14,10 @@ interface IPayload {} */ export default function (socket: TSocket, io: Server) { socket.on('gm:tile:list', async (data: any, callback: (response: Tile[]) => void) => { - const character = CharacterManager.getCharacterFromSocket(socket); - if (character?.role !== 'gm') { - console.log(`---Character #${character?.id} is not a game master.`) + const character = await characterRepository.getById(socket.characterId as number); + if (!character) return + + if (character.role !== 'gm') { return } diff --git a/src/events/gameMaster/assetManager/tile/update.ts b/src/events/gameMaster/assetManager/tile/update.ts index 3950fb6..d6db7a8 100644 --- a/src/events/gameMaster/assetManager/tile/update.ts +++ b/src/events/gameMaster/assetManager/tile/update.ts @@ -2,6 +2,7 @@ import { Server } from 'socket.io' import { TSocket } from '../../../../utilities/types' import prisma from '../../../../utilities/prisma' import CharacterManager from '../../../../managers/characterManager' +import characterRepository from '../../../../repositories/characterRepository' type Payload = { id: string @@ -16,8 +17,10 @@ type Payload = { */ export default function (socket: TSocket, io: Server) { socket.on('gm:tile:update', async (data: Payload, callback: (success: boolean) => void) => { - const character = CharacterManager.getCharacterFromSocket(socket); - if (character?.role !== 'gm') { + const character = await characterRepository.getById(socket.characterId as number); + if (!character) return callback(false) + + if (character.role !== 'gm') { return } diff --git a/src/events/gameMaster/assetManager/tile/upload.ts b/src/events/gameMaster/assetManager/tile/upload.ts index 0ebd4a7..86c8aae 100644 --- a/src/events/gameMaster/assetManager/tile/upload.ts +++ b/src/events/gameMaster/assetManager/tile/upload.ts @@ -5,6 +5,8 @@ import path from 'path' import fs from 'fs/promises' import prisma from '../../../../utilities/prisma' import CharacterManager from '../../../../managers/characterManager' +import characterRepository from '../../../../repositories/characterRepository' +import logger from '../../../../utilities/logger' interface ITileData { [key: string]: Buffer @@ -18,9 +20,10 @@ interface ITileData { export default function (socket: TSocket, io: Server) { socket.on('gm:tile:upload', async (data: ITileData, callback: (response: boolean) => void) => { try { - const character = CharacterManager.getCharacterFromSocket(socket); - if (character?.role !== 'gm') { - callback(false) + const character = await characterRepository.getById(socket.characterId as number); + if (!character) return callback(false) + + if (character.role !== 'gm') { return } diff --git a/src/events/gameMaster/zoneEditor/create.ts b/src/events/gameMaster/zoneEditor/create.ts index 1a80bae..cfbe54e 100644 --- a/src/events/gameMaster/zoneEditor/create.ts +++ b/src/events/gameMaster/zoneEditor/create.ts @@ -4,6 +4,8 @@ import ZoneRepository from '../../../repositories/zoneRepository' import { Zone } from '@prisma/client' import prisma from '../../../utilities/prisma' import CharacterManager from '../../../managers/characterManager' +import characterRepository from '../../../repositories/characterRepository' +import logger from '../../../utilities/logger' type Payload = { name: string @@ -18,13 +20,16 @@ type Payload = { */ export default function (socket: TSocket, io: Server) { socket.on('gm:zone_editor:zone:create', async (data: Payload, callback: (response: Zone[]) => void) => { - const character = CharacterManager.getCharacterFromSocket(socket); - if (character?.role !== 'gm') { - console.log(`---Character #${character?.id} is not a game master.`) + const character = await characterRepository.getById(socket.characterId as number); + if (!character) return + + if (character.role !== 'gm') { + logger.info(`User ${character.id} tried to create zone but is not a game master.`) return } - console.log(`---GM ${character?.id} has created a new zone via zone editor.`) + logger.info(`User ${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 73e3810..c2cfb58 100644 --- a/src/events/gameMaster/zoneEditor/delete.ts +++ b/src/events/gameMaster/zoneEditor/delete.ts @@ -3,6 +3,8 @@ import { TSocket } from '../../../utilities/types' import ZoneRepository from '../../../repositories/zoneRepository' import prisma from '../../../utilities/prisma' import CharacterManager from '../../../managers/characterManager' +import characterRepository from '../../../repositories/characterRepository' +import logger from '../../../utilities/logger' type Payload = { zoneId: number @@ -15,14 +17,15 @@ type Payload = { */ export default function (socket: TSocket, io: Server) { socket.on('gm:zone_editor:zone:delete', async (data: Payload, callback: (response: boolean) => void) => { - const character = CharacterManager.getCharacterFromSocket(socket); - - if (character?.role !== 'gm') { - console.log(`---Character #${character?.id} is not a game master.`) + const character = await characterRepository.getById(socket.characterId as number); + if (!character) return + + if (character.role !== 'gm') { + logger.info(`User ${character.id} tried to delete zone but is not a game master.`) return } - console.log(`---GM ${character?.id} has deleted a zone via zone editor.`) + logger.info(`User ${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 ac9692c..b333f81 100644 --- a/src/events/gameMaster/zoneEditor/list.ts +++ b/src/events/gameMaster/zoneEditor/list.ts @@ -3,6 +3,8 @@ import { TSocket } from '../../../utilities/types' import { Zone } from '@prisma/client' import ZoneRepository from '../../../repositories/zoneRepository' import CharacterManager from '../../../managers/characterManager' +import characterRepository from '../../../repositories/characterRepository' +import logger from '../../../utilities/logger' interface IPayload {} @@ -13,13 +15,15 @@ interface IPayload {} */ export default function (socket: TSocket, io: Server) { socket.on('gm:zone_editor:zone:list', async (data: IPayload, callback: (response: Zone[]) => void) => { - const character = CharacterManager.getCharacterFromSocket(socket); - if (character?.role !== 'gm') { - console.log(`---Character #${character?.id} is not a game master.`) + const character = await characterRepository.getById(socket.characterId as number); + if (!character) return + + if (character.role !== 'gm') { + logger.info(`User ${character.id} tried to list zones but is not a game master.`) return } - console.log(`---GM ${character?.id} has requested zone list via zone editor.`) + logger.info(`User ${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 b0f3dc2..ad1c88f 100644 --- a/src/events/gameMaster/zoneEditor/request.ts +++ b/src/events/gameMaster/zoneEditor/request.ts @@ -1,8 +1,10 @@ import { Server } from 'socket.io' import { TSocket } from '../../../utilities/types' import ZoneRepository from '../../../repositories/zoneRepository' -import { Zone } from '@prisma/client' +import { Character, Zone } from '@prisma/client' import CharacterManager from '../../../managers/characterManager' +import characterRepository from '../../../repositories/characterRepository' +import logger from '../../../utilities/logger' interface IPayload { zoneId: number @@ -15,15 +17,18 @@ interface IPayload { */ export default function (socket: TSocket, io: Server) { socket.on('gm:zone_editor:zone:request', async (data: IPayload, callback: (response: Zone) => void) => { - const character = CharacterManager.getCharacterFromSocket(socket); - if (character?.role !== 'gm') { + const character = await characterRepository.getById(socket.characterId as number); + if (!character) return + + if (character.role !== 'gm') { + logger.info(`User ${character!.id} tried to request zone but is not a game master.`) return } - console.log(`---GM ${character?.id} has requested zone via zone editor.`) + logger.info(`User ${character.id} has requested zone via zone editor.`) if (!data.zoneId) { - console.log(`---Zone id not provided.`) + logger.info(`User ${character.id} tried to request zone but did not provide a zone id.`) return } @@ -31,7 +36,7 @@ export default function (socket: TSocket, io: Server) { const zone = await ZoneRepository.getById(data.zoneId) if (!zone) { - console.log(`---Zone not found.`) + logger.info(`User ${character.id} tried to request zone ${data.zoneId} but it does not exist.`) return } diff --git a/src/events/gameMaster/zoneEditor/update.ts b/src/events/gameMaster/zoneEditor/update.ts index 8d9d07b..acb242a 100644 --- a/src/events/gameMaster/zoneEditor/update.ts +++ b/src/events/gameMaster/zoneEditor/update.ts @@ -6,6 +6,7 @@ import prisma from '../../../utilities/prisma' import zoneManager from '../../../managers/zoneManager' import logger from '../../../utilities/logger' import CharacterManager from '../../../managers/characterManager' +import characterRepository from '../../../repositories/characterRepository' interface IPayload { zoneId: number @@ -34,16 +35,18 @@ interface IPayload { */ export default function (socket: TSocket, io: Server) { socket.on('gm:zone_editor:zone:update', async (data: IPayload, callback: (response: Zone) => void) => { - const character = CharacterManager.getCharacterFromSocket(socket); - if (character?.role !== 'gm') { - logger.info(`User ${character?.id} tried to update zone but is not a game master.`) + const character = await characterRepository.getById(socket.characterId as number); + if (!character) return + + if (character.role !== 'gm') { + logger.info(`User ${character.id} tried to update zone but is not a game master.`) return } - logger.info(`User ${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 ${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 } @@ -51,7 +54,7 @@ export default function (socket: TSocket, io: Server) { let zone = await ZoneRepository.getById(data.zoneId) if (!zone) { - logger.info(`User ${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 } @@ -105,7 +108,7 @@ export default function (socket: TSocket, io: Server) { zone = await ZoneRepository.getById(data.zoneId) if (!zone) { - logger.info(`User ${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/login.ts b/src/events/login.ts index 009718b..a64fa4c 100644 --- a/src/events/login.ts +++ b/src/events/login.ts @@ -3,7 +3,7 @@ import { TSocket } from '../utilities/types' export default function (socket: TSocket, io: Server) { socket.on('login', () => { - // return user data + if (!socket.user) return socket.emit('logged_in', { user: socket.user }) }) } diff --git a/src/managers/characterManager.ts b/src/managers/characterManager.ts index 2ec1d4b..160e699 100644 --- a/src/managers/characterManager.ts +++ b/src/managers/characterManager.ts @@ -9,7 +9,7 @@ class CharacterManager { this.characters = [] } - public initCharacter(character: ExtendedCharacter) { + public initCharacter(character: ExtendedCharacter) { this.characters = [...this.characters, character] } @@ -26,10 +26,6 @@ class CharacterManager { this.characters = this.characters.filter((x) => x.id !== character.id) } - public getCharacter(characterId: number) { - return this.characters.find((x) => x.id === characterId) - } - public getCharacterFromSocket(socket: TSocket) { return this.characters.find((x) => x.id === socket?.characterId) }