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
},
"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"

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

@ -5,8 +5,8 @@ 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);
let world_players: any = {};
async function handleSocketConnection(socket: any) {
const { username, password } = socket.handshake.query;
if (!username || !password) {
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;
}
}
const user = UserRepository.getByUsername(username);
async function authenticateUser(socket: any, username: string, password: string) {
if (!username || !password) {
throw new Error('Username or password missing.');
}
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;