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
|
// 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]
|
||||||
});
|
});
|
||||||
|
@ -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;
|
||||||
|
@ -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);
|
||||||
|
@ -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) => {
|
||||||
const user_id = socket.user?.id as number;
|
try {
|
||||||
const characters: Character[] = await CharacterRepository.getByUserId(user_id) as Character[];
|
console.log('character:list requested');
|
||||||
socket.emit('character:list', characters);
|
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 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),
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
@ -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({
|
||||||
|
Loading…
x
Reference in New Issue
Block a user