Files
chemmazz/server/server.ts

96 lines
2.8 KiB
TypeScript
Raw Normal View History

2021-01-29 15:52:45 +01:00
import { Server } from 'colyseus';
import * as express from 'express';
import { createServer } from 'http';
import * as session from 'express-session';
import { randomBytes } from 'crypto';
import { GameRoom } from './rooms/game';
interface User {
user_id: string;
display_name: string;
}
const connected_users: { [id: string]: User } = {};
const validateSession = (user_id => {
console.log(`Is ${user_id} in ${Object.keys(connected_users)}?`);
if (Object.keys(connected_users).includes(user_id)) {
const user_info = connected_users[user_id];
console.log('Yes!', user_info);
return user_info;
}
console.log('No!');
return false;
});
// - Augments built-in Node.js IncomingMessage to include "session"
// - Lets TypeScript recognize "request.session" during onAuth()
declare module 'http' {
interface IncomingMessage {
session: session.Session
}
}
const sessionParser = session({
secret: 'any secret string',
// store: new RedisStore({ client: redisClient })
});
const port = Number(process.env.port) || 3001;
const app = express();
app.use(sessionParser);
app.use(express.json());
app.use(express.static('../client/build'))
app.post('/api/login', (req, res) => {
// login to the server (a unique display name is enough)
const username = req.body.display_name;
console.log('Login request with display name', username, connected_users);
const existing_user = Object.values(connected_users).find(user => user.display_name === username);
if (existing_user) {
console.log('oh no, no no, oh no non ononononono');
res.status(401).json({ sto: 'cazzo' });
} else {
const random_id = `player-${randomBytes(16).toString('hex')}`;
connected_users[random_id] = {
user_id: random_id,
display_name: username,
};
req.session!['user_id'] = random_id;
req.session!['display_name'] = username;
console.log('oh yeah!', connected_users);
res.json({ user_id: random_id });
}
});
app.post('/api/logout', (req, res) => {
const user_id = req.session!['user_id'];
console.log('Logging out user:', user_id);
delete connected_users[user_id];
delete req.session!['user_id'];
delete req.session!['display_name'];
res.json({ bye: 'bye' });
});
app.get('/api/session', (req, res) => {
// returns session data
res.json(req.session!);
});
const gameServer = new Server({
server: createServer(app),
verifyClient: (info, next) => {
// Make 'session' available for the websocket connection (during onAuth())
sessionParser(info.req as any, {} as any, () => next(true));
}
});
gameServer.define('game', GameRoom, { validateSession: validateSession });
gameServer.listen(port, '0.0.0.0');