1
0
forked from noxious/server

Added better security for character loading, worked on zone joining and moving logic

This commit is contained in:
Dennis Postma 2024-06-03 20:40:01 +02:00
parent 87826f74ea
commit 93cb7b7887
7 changed files with 82 additions and 14 deletions

View File

@ -13,7 +13,7 @@ class UserManager {
} }
// Function that adds user to logged in users // Function that adds user to logged in users
public addUser(user: User) { public loginUser(user: User) {
this.loggedInUsers.push({ this.loggedInUsers.push({
users: [user] users: [user]
}); });

View File

@ -59,6 +59,31 @@ class ZoneManager {
} }
} }
public removeCharacterFromZone(zoneId: number, characterId: number) {
const loadedZone = this.loadedZones.find((loadedZone) => {
return loadedZone.zone.id === zoneId;
});
if (loadedZone) {
loadedZone.characters = loadedZone.characters.filter((character) => {
return character.id !== characterId;
});
}
}
public updateCharacterInZone(zoneId: number, character: Character) {
const loadedZone = this.loadedZones.find((loadedZone) => {
return loadedZone.zone.id === zoneId;
});
if (loadedZone) {
const characterIndex = loadedZone.characters.findIndex((loadedCharacter) => {
return loadedCharacter.id === character.id;
});
if (characterIndex !== -1) {
loadedZone.characters[characterIndex] = character;
}
}
}
public getCharactersInZone(zoneId: number): Character[] { public getCharactersInZone(zoneId: number): Character[] {
const loadedZone = this.loadedZones.find((loadedZone) => { const loadedZone = this.loadedZones.find((loadedZone) => {
return loadedZone.zone.id === zoneId; return loadedZone.zone.id === zoneId;

View File

@ -1,7 +1,7 @@
import { Socket, Server } from "socket.io"; import { Socket, Server } from "socket.io";
import {TSocket} from "../utilities/Types"; import {TSocket} from "../utilities/Types";
import CharacterRepository from "../repositories/CharacterRepository"; import CharacterRepository from "../repositories/CharacterRepository";
import {Character} from "@prisma/client"; import {Character, User} from "@prisma/client";
type SocketResponseT = { type SocketResponseT = {
character_id: number character_id: number
@ -9,8 +9,9 @@ type SocketResponseT = {
export default function (socket: TSocket, io: Server) { export default function (socket: TSocket, io: Server) {
socket.on('character:connect', async (data: SocketResponseT) => { socket.on('character:connect', async (data: SocketResponseT) => {
console.log('character:connect requested', data);
try { try {
socket.character = await CharacterRepository.getById(data.character_id) as Character; socket.character = await CharacterRepository.getByUserAndId(socket.user?.id as number, data.character_id) as Character;
socket.emit('character:connect', socket.character) socket.emit('character:connect', socket.character)
} catch (error: any) { } catch (error: any) {
console.log('character:connect error', error); console.log('character:connect error', error);

View File

@ -5,8 +5,13 @@ import CharacterRepository from "../repositories/CharacterRepository";
export default function CharacterList(socket: TSocket, io: Server) { export default function CharacterList(socket: TSocket, io: Server) {
socket.on('character:list', async (data: any) => { socket.on('character:list', async (data: any) => {
try {
console.log('character:list requested');
const user_id = socket.user?.id as number; const user_id = socket.user?.id as number;
const characters: Character[] = await CharacterRepository.getByUserId(user_id) as Character[]; const characters: Character[] = await CharacterRepository.getByUserId(user_id) as Character[];
socket.emit('character:list', characters); socket.emit('character:list', characters);
} catch (error: any) {
console.log('character:list error', error);
}
}); });
} }

View File

@ -0,0 +1,19 @@
import { Socket, Server } from "socket.io";
import {TSocket} from "../utilities/Types";
import CharacterRepository from "../repositories/CharacterRepository";
import {Character} from "@prisma/client";
type SocketResponseT = {
character_id: number
}
export default function (socket: TSocket, io: Server) {
socket.on('character:move', async (data: SocketResponseT) => {
try {
socket.character = await CharacterRepository.getById(data.character_id) as Character;
socket.emit('character:connect', socket.character)
} catch (error: any) {
console.log('character:connect error', error);
}
});
}

View File

@ -1,7 +1,8 @@
import { Socket, Server } from "socket.io"; import { Server } from "socket.io";
import {TSocket} from "../utilities/Types";
import ZoneRepository from "../repositories/ZoneRepository"; import ZoneRepository from "../repositories/ZoneRepository";
import ZoneManager from "../ZoneManager"; import ZoneManager from "../ZoneManager";
import {Zone} from "@prisma/client"; import {Character, Zone} from "@prisma/client";
interface IZoneLoad { interface IZoneLoad {
zoneId?: number; zoneId?: number;
@ -14,9 +15,9 @@ interface IZoneLoad {
* @param socket * @param socket
* @param io * @param io
*/ */
export default function (socket: Socket, io: Server) { export default function (socket: TSocket, io: Server) {
socket.on('character:zone:load', async (data: IZoneLoad) => { socket.on('character:zone:load', async (data: IZoneLoad) => {
console.log(`---User ${socket.id} has requested zone.`); console.log(`---User ${socket.character?.id} has requested zone.`);
const zone = await ZoneRepository.getById(1); const zone = await ZoneRepository.getById(1);
@ -27,15 +28,18 @@ export default function (socket: Socket, io: Server) {
socket.join(zone.name); socket.join(zone.name);
const socketConnectionsInRoom = await io.in(zone.name).fetchSockets(); ZoneManager.addCharacterToZone(zone.id, socket.character as Character);
const characters = socketConnectionsInRoom.filter(socket => socket.id !== socket.id);
// update to match with model Character // const socketConnectionsInRoom = await io.in(zone.name).fetchSockets();
// const characters = socketConnectionsInRoom.filter(socket => socket.id !== socket.id);
// let other clients know of new character
socket.to(zone.name).emit('character:zone:character_join', socket.character);
// send over zone and characters // send over zone and characters
io.in(zone.name).to(socket.id).emit('character:zone:load', { io.in(zone.name).to(socket.id).emit('character:zone:load', {
zone: zone, zone: zone,
characters: characters, characters: ZoneManager.getCharactersInZone(zone.id),
}); });
}); });
} }

View File

@ -16,6 +16,20 @@ class CharacterRepository {
} }
} }
async getByUserAndId(userId: number, characterId: number): Promise<Character | null> {
try {
return await prisma.character.findFirst({
where: {
userId,
id: characterId,
},
});
} catch (error: any) {
// Handle error
throw new Error(`Failed to get character by user ID and character ID: ${error.message}`);
}
}
async getById(id: number): Promise<Character | null> { async getById(id: number): Promise<Character | null> {
try { try {
return await prisma.character.findUnique({ return await prisma.character.findUnique({