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
|
"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
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;
|
||||||
|
}[];
|
||||||
|
}
|
@ -5,8 +5,8 @@ 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);
|
||||||
|
|
||||||
|
let world_players: any = {};
|
||||||
|
|
||||||
async function handleSocketConnection(socket: any) {
|
async function handleSocketConnection(socket: any) {
|
||||||
const { username, password } = socket.handshake.query;
|
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);
|
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)) {
|
const user = await UserRepository.getByUsername(username);
|
||||||
socket.disconnect(true);
|
if (!user || !(await UserService.validateUserCredentials(username, password))) {
|
||||||
return;
|
throw new Error('Invalid username or password.');
|
||||||
}
|
}
|
||||||
|
|
||||||
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;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user