forked from noxious/server
Added better security for character loading, worked on zone joining and moving logic
This commit is contained in:
parent
87826f74ea
commit
93cb7b7887
@ -13,7 +13,7 @@ class UserManager {
|
||||
}
|
||||
|
||||
// Function that adds user to logged in users
|
||||
public addUser(user: User) {
|
||||
public loginUser(user: User) {
|
||||
this.loggedInUsers.push({
|
||||
users: [user]
|
||||
});
|
||||
|
@ -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[] {
|
||||
const loadedZone = this.loadedZones.find((loadedZone) => {
|
||||
return loadedZone.zone.id === zoneId;
|
||||
|
@ -1,7 +1,7 @@
|
||||
import { Socket, Server } from "socket.io";
|
||||
import {TSocket} from "../utilities/Types";
|
||||
import CharacterRepository from "../repositories/CharacterRepository";
|
||||
import {Character} from "@prisma/client";
|
||||
import {Character, User} from "@prisma/client";
|
||||
|
||||
type SocketResponseT = {
|
||||
character_id: number
|
||||
@ -9,8 +9,9 @@ type SocketResponseT = {
|
||||
|
||||
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.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)
|
||||
} catch (error: any) {
|
||||
console.log('character:connect error', error);
|
||||
|
@ -5,8 +5,13 @@ import CharacterRepository from "../repositories/CharacterRepository";
|
||||
|
||||
export default function CharacterList(socket: TSocket, io: Server) {
|
||||
socket.on('character:list', async (data: any) => {
|
||||
try {
|
||||
console.log('character:list requested');
|
||||
const user_id = socket.user?.id as number;
|
||||
const characters: Character[] = await CharacterRepository.getByUserId(user_id) as Character[];
|
||||
socket.emit('character:list', characters);
|
||||
} catch (error: any) {
|
||||
console.log('character:list error', error);
|
||||
}
|
||||
});
|
||||
}
|
19
src/app/events/CharacterMove.ts
Normal file
19
src/app/events/CharacterMove.ts
Normal 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);
|
||||
}
|
||||
});
|
||||
}
|
@ -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 ZoneManager from "../ZoneManager";
|
||||
import {Zone} from "@prisma/client";
|
||||
import {Character, Zone} from "@prisma/client";
|
||||
|
||||
interface IZoneLoad {
|
||||
zoneId?: number;
|
||||
@ -14,9 +15,9 @@ interface IZoneLoad {
|
||||
* @param socket
|
||||
* @param io
|
||||
*/
|
||||
export default function (socket: Socket, io: Server) {
|
||||
export default function (socket: TSocket, io: Server) {
|
||||
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);
|
||||
|
||||
@ -27,15 +28,18 @@ export default function (socket: Socket, io: Server) {
|
||||
|
||||
socket.join(zone.name);
|
||||
|
||||
const socketConnectionsInRoom = await io.in(zone.name).fetchSockets();
|
||||
const characters = socketConnectionsInRoom.filter(socket => socket.id !== socket.id);
|
||||
ZoneManager.addCharacterToZone(zone.id, socket.character as Character);
|
||||
|
||||
// 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
|
||||
io.in(zone.name).to(socket.id).emit('character:zone:load', {
|
||||
zone: zone,
|
||||
characters: characters,
|
||||
characters: ZoneManager.getCharactersInZone(zone.id),
|
||||
});
|
||||
});
|
||||
}
|
@ -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> {
|
||||
try {
|
||||
return await prisma.character.findUnique({
|
||||
|
Loading…
x
Reference in New Issue
Block a user