From b422198925478303eb4c1fc3be5569c5ed4515ad Mon Sep 17 00:00:00 2001 From: Dennis Postma Date: Tue, 7 May 2024 01:49:48 +0200 Subject: [PATCH] add interface --- package-lock.json | 6 +-- src/helpers/interfaces.ts | 17 +++++++ src/server.ts | 94 ++++++++++++++++++++++++++++++--------- 3 files changed, 93 insertions(+), 24 deletions(-) create mode 100644 src/helpers/interfaces.ts diff --git a/package-lock.json b/package-lock.json index 0c0f67e..cf9e8e2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -234,9 +234,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.12.8", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.8.tgz", - "integrity": "sha512-NU0rJLJnshZWdE/097cdCBbyW1h4hEg0xpovcoAQYHl8dnEyp/NAOiE45pvc+Bd1Dt+2r94v2eGFpQJ4R7g+2w==", + "version": "20.12.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.10.tgz", + "integrity": "sha512-Eem5pH9pmWBHoGAT8Dr5fdc5rYA+4NAovdM4EktRPVAAiJhmWWfQrA0cFhAbOsQdSfIHjAud6YdkbL69+zSKjw==", "dev": true, "dependencies": { "undici-types": "~5.26.4" diff --git a/src/helpers/interfaces.ts b/src/helpers/interfaces.ts new file mode 100644 index 0000000..340c40b --- /dev/null +++ b/src/helpers/interfaces.ts @@ -0,0 +1,17 @@ +export interface IUser { + id?: number; + username: string; + password: string; +} + +export interface IMap { + name: string; + tiles: any; + width: number; + height: number; + players: { + id: number; + x: number; + y: number; + }[]; +} \ No newline at end of file diff --git a/src/server.ts b/src/server.ts index 3cda215..14310c4 100644 --- a/src/server.ts +++ b/src/server.ts @@ -1,12 +1,12 @@ import express from 'express'; -import { Server } from 'socket.io'; +import {Server} from 'socket.io'; import http from 'http'; import cors from 'cors'; import UserRepository from "./repositories/User"; import UserService from "./services/User"; import MapRepository from "./repositories/Map"; -import prisma from "./helpers/prisma"; -import { registerUser, loginUser } from './helpers/http'; +import {loginUser, registerUser} from './helpers/http'; +import {IUser, IMap} from "./helpers/interfaces"; const app = express(); const server = http.createServer(app); @@ -18,48 +18,100 @@ app.use(express.json()); app.post('/login', loginUser); app.post('/register', registerUser); -async function handleSocketConnection(socket: any) { - const {username, password} = socket.handshake.query; +let world_players: any = {}; - if (!username || !password) { +async function handleSocketConnection(socket: any) { + const { username, password } = socket.handshake.query; + + try { + await authenticateUser(socket, username, password); + await initializeUser(socket, username); + await setupMap(socket); + await startTickEmitter(socket); + listenForMoveEvents(socket); + listenForDisconnect(socket, username); + } catch (error) { + console.error('Error handling socket connection:', error.message); socket.disconnect(true); - return; + } +} + +async function authenticateUser(socket: any, username: string, password: string) { + if (!username || !password) { + throw new Error('Username or password missing.'); } - const user = UserRepository.getByUsername(username); - - if (!user || !await UserService.validateUserCredentials(username, password)) { - socket.disconnect(true); - return; + const user = await UserRepository.getByUsername(username); + if (!user || !(await UserService.validateUserCredentials(username, password))) { + throw new Error('Invalid username or password.'); } console.log('User connected:', username); socket.user = user; - socket.emit('message', 'Welcome to the server!'); + world_players[user.id] = { + username: user.username, + coords: { + x: 0, + y: 0 + } + }; +} +async function initializeUser(socket: any, username: string) { + socket.emit('message', 'Welcome to the server!'); +} + +async function setupMap(socket: any) { const map = await MapRepository.getFirst(); socket.join(map.name); + socket.emit('map', { + name: map.name, + tiles: map.tiles, + width: map.width, + height: map.height, + players: world_players + }); socket.emit('message', 'You have joined the room: ' + map.name); - socket.on('get_map', () => { - console.log('Sending map to user:', username); - socket.emit('map', map); - }); + // let the room know a new player has joined + io.to(map.name).emit('player_join', world_players[socket.user.id]); + return map; +} +async function startTickEmitter(socket: any) { + setInterval(async () => { + const users = await listConnectedUsers(); + socket.emit('ping', users); + }, 3000); +} + +function listenForMoveEvents(socket: any) { socket.on('move', (coords: any) => { - // const player = map.players.find((p: any) => p.username === socket.user.username); - // if (!player) return; - // player.coords = coords; - // io.to(map.name).emit('player_moved', map); + const user = socket.user as IUser; + world_players[user.id].coords = coords; + io.in('Test Map').emit('player_move', { + id: user.id, + coords + }); }); +} +function listenForDisconnect(socket: any, username: string) { socket.on('disconnect', () => { console.log('User disconnected:', username); }); } +// function list all connected users +// function list all connected users +async function listConnectedUsers() { + const sockets = await io.in('Test Map').fetchSockets(); + // @ts-ignore + return sockets.map(socket => socket.user); +} + io.on('connection', handleSocketConnection); const PORT = process.env.PORT || 3000;