1
0
forked from noxious/server

add interface

This commit is contained in:
Dennis Postma 2024-05-07 01:49:48 +02:00
parent 56ae410fae
commit b422198925
3 changed files with 93 additions and 24 deletions

6
package-lock.json generated
View File

@ -234,9 +234,9 @@
"dev": true "dev": true
}, },
"node_modules/@types/node": { "node_modules/@types/node": {
"version": "20.12.8", "version": "20.12.10",
"resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.8.tgz", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.10.tgz",
"integrity": "sha512-NU0rJLJnshZWdE/097cdCBbyW1h4hEg0xpovcoAQYHl8dnEyp/NAOiE45pvc+Bd1Dt+2r94v2eGFpQJ4R7g+2w==", "integrity": "sha512-Eem5pH9pmWBHoGAT8Dr5fdc5rYA+4NAovdM4EktRPVAAiJhmWWfQrA0cFhAbOsQdSfIHjAud6YdkbL69+zSKjw==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"undici-types": "~5.26.4" "undici-types": "~5.26.4"

17
src/helpers/interfaces.ts Normal file
View File

@ -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;
}[];
}

View File

@ -1,12 +1,12 @@
import express from 'express'; import express from 'express';
import { Server } from 'socket.io'; import {Server} from 'socket.io';
import http from 'http'; import http from 'http';
import cors from 'cors'; import cors from 'cors';
import UserRepository from "./repositories/User"; import UserRepository from "./repositories/User";
import UserService from "./services/User"; import UserService from "./services/User";
import MapRepository from "./repositories/Map"; import MapRepository from "./repositories/Map";
import prisma from "./helpers/prisma"; import {loginUser, registerUser} from './helpers/http';
import { registerUser, loginUser } from './helpers/http'; import {IUser, IMap} from "./helpers/interfaces";
const app = express(); const app = express();
const server = http.createServer(app); const server = http.createServer(app);
@ -18,48 +18,100 @@ app.use(express.json());
app.post('/login', loginUser); app.post('/login', loginUser);
app.post('/register', registerUser); app.post('/register', registerUser);
async function handleSocketConnection(socket: any) { let world_players: any = {};
const {username, password} = socket.handshake.query;
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); 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); const user = await UserRepository.getByUsername(username);
if (!user || !(await UserService.validateUserCredentials(username, password))) {
if (!user || !await UserService.validateUserCredentials(username, password)) { throw new Error('Invalid username or password.');
socket.disconnect(true);
return;
} }
console.log('User connected:', username); console.log('User connected:', username);
socket.user = user; 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(); const map = await MapRepository.getFirst();
socket.join(map.name); 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.emit('message', 'You have joined the room: ' + map.name);
socket.on('get_map', () => { // let the room know a new player has joined
console.log('Sending map to user:', username); io.to(map.name).emit('player_join', world_players[socket.user.id]);
socket.emit('map', map); 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) => { socket.on('move', (coords: any) => {
// const player = map.players.find((p: any) => p.username === socket.user.username); const user = socket.user as IUser;
// if (!player) return; world_players[user.id].coords = coords;
// player.coords = coords; io.in('Test Map').emit('player_move', {
// io.to(map.name).emit('player_moved', map); id: user.id,
coords
}); });
});
}
function listenForDisconnect(socket: any, username: string) {
socket.on('disconnect', () => { socket.on('disconnect', () => {
console.log('User disconnected:', username); 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); io.on('connection', handleSocketConnection);
const PORT = process.env.PORT || 3000; const PORT = process.env.PORT || 3000;