Complete refractor - we do sexy code only

This commit is contained in:
2024-05-09 04:00:05 +02:00
parent ca88c085e6
commit 8356a83431
28 changed files with 449 additions and 492 deletions

View File

@ -1,122 +0,0 @@
import express from 'express';
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 {loginUser, registerUser} from './helpers/http';
import {IUser, IMap} from "./helpers/interfaces";
const app = express();
const server = http.createServer(app);
const io = new Server(server, { cors: { origin: '*' } });
app.use(cors());
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;
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);
}
}
async function authenticateUser(socket: any, username: string, password: string) {
if (!username || !password) {
throw new Error('Username or password missing.');
}
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;
world_players[user.id] = {
id: 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);
// list world players
socket.emit('message', 'World players: ' + JSON.stringify(world_players));
// 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) => {
console.log('Player moved:', socket.user.id, coords)
const user = socket.user as IUser;
world_players[user.id].coords = coords;
io.in('Test Map').emit('player_moved', {
id: user.id,
coords
});
});
}
//r
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;
server.listen(PORT, () => console.log(`Server running on port ${PORT}`));