forked from noxious/server
add interface
This commit is contained in:
parent
56ae410fae
commit
b422198925
6
package-lock.json
generated
6
package-lock.json
generated
@ -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
17
src/helpers/interfaces.ts
Normal 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;
|
||||
}[];
|
||||
}
|
@ -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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user