diff --git a/index.ts b/index.ts index cae0ddd..ae11845 100755 --- a/index.ts +++ b/index.ts @@ -19,17 +19,14 @@ export const BasicHeaders = { }; const rooms: {[ID: string]: Room} = {}; +const players: {[username: string]: Player} = {}; -/** - * @param {Player} player - * @returns {Room} The room with the player - */ -const assign_room_for = player => { +const assign_room_for = (playerUsername: string): Room | false => { if(Object.keys(rooms).length === 0) { // If ther's no room, create a new one; const new_room = new Room(createHash('sha256').update(Date.now().toString()).digest('hex')); - player.setRoomID(new_room.ID); + players[playerUsername].setRoomID(new_room.ID); - new_room.add_player(player) ? undefined : console.error('Invalid player', player); + new_room.add_player(players[playerUsername]); rooms[new_room.ID] = new_room; return rooms[new_room.ID]; @@ -39,30 +36,26 @@ const assign_room_for = player => { for(const room_id in rooms) { if(rooms[room_id].is_full) continue; - if(rooms[room_id].add_player(player)){ - player.setRoomID(room_id); - return rooms[room_id]; - } + rooms[room_id].add_player(players[playerUsername]); + + players[playerUsername].setRoomID(room_id); + return rooms[room_id]; } // In last case, it just creates a new room. const new_room = new Room(createHash('sha256').update(Date.now().toString()).digest('hex')); - player.setRoomID(new_room.ID); - new_room.add_player(player); + players[playerUsername].setRoomID(new_room.ID); + new_room.add_player(players[playerUsername]); rooms[new_room.ID] = new_room; return rooms[new_room.ID]; } -/** - * @param {String} room_id Room ID to check it out. - * @returns {boolean} - */ -const room_exist = (room_id) => { - return !(Object.keys(rooms).indexOf === room_id); +const room_exist = (room_id: string): boolean => { + return Object.keys(rooms).indexOf(room_id) !== -1; } -const get_headers = (origin) => { +const get_headers = (origin: string) => { if(ALLOW_ACCESS_ORIGINS.indexOf(origin) === -1) { return BasicHeaders; }else { @@ -74,8 +67,8 @@ const get_headers = (origin) => { } app.use((req, res, next) => { - if(req.query['room_id'] && !room_exist(req.query['room_id'])) { - res.set(get_headers(req.headers.origin)); + if(req.query['room_id'] && !room_exist(req.query['room_id'].toString())) { + res.set(get_headers(req.headers.origin || '')); res.status(BAD_REQUEST).json((new Response({}, BAD_REQUEST, 'Invalid room ID'))); return; } @@ -85,99 +78,96 @@ app.use((req, res, next) => { app.use(express.text()); app.get('/', (req, res) => { - res.set(get_headers(req.headers.origin)); + res.set(get_headers(req.headers.origin || '')); res.end('This is the BMGP server'); }); app.get('/login', (req, res) => { const player_email = req.query['player_email']+''; + players[player_email] = new Player(player_email); - const new_player = new Player(player_email); - const new_player_room = assign_room_for(new_player); + const new_player_room = assign_room_for(player_email); - console.log('New player: ', new_player, new_player_room); - - const body = new Response(new_player_room); - - res.set(get_headers(req.headers.origin)); + const body = new Response(new_player_room); + res.set(get_headers(req.headers.origin || '')); res.status(OK).json(body); + + console.log('New player: ', players[player_email], new_player_room); return; }); app.get('/room', (req, res) => { + const origin = req.headers.origin || ''; const player_email = req.query['player_email'] + ''; - const room_id = req.query['room_id']+''; const response = new Response(); + if(!players[player_email]) { + console.error('Player not logged in.'); - if(!rooms[room_id]) { - console.error('Invalid room ID'); - - response.error = "Invalid room ID"; + response.error = "Player not logged in."; response.status = BAD_REQUEST; - res.set(get_headers(req.headers.origin)); + res.set(get_headers(origin)); res.status(BAD_REQUEST).json(response); return; } - - const player_is_here = rooms[room_id].player_is_here(player_email); - if(player_is_here) { - response.data = rooms[room_id]; - }else { - response.error = "Not logged in or internal error."; - response.status = UNAUTHORIZED; - } + response.data = rooms[players[player_email].currentRoomID]; - res.set(get_headers(req.headers.origin)); + res.set(get_headers(origin)); res.status(OK).json(response); return; }); app.post('/player_update', (req, res) => { + const origin = req.headers.origin || ''; const player_email = req.query['player_email']+''; - const room_id = req.query['room_id']+''; + + if(!players[player_email]) { + console.error('Player not logged in.'); - let response = new Response(); - const body = JSON.parse(req.body); - if(!body) { - response = new Response(req.body, BAD_REQUEST, 'Invalid player data') - res.set(get_headers(req.headers.origin)); - res.status(BAD_REQUEST).json(response); + res.set(get_headers(origin)); + res.status(BAD_REQUEST).json((new Response({}, BAD_REQUEST, 'Player not logged in.'))); return; - }else { - res.set(get_headers(req.headers.origin)); } - const updateData = body.params; + let response = new Response(); - const areYouThere = rooms[room_id].player_is_here(player_email); - if(areYouThere){ - const newPos = new Vector3(updateData.position._x, updateData.position._y, 0); - const newRot = new Vector3(updateData.rotation._x, updateData.rotation._y, updateData.rotation._z); - rooms[room_id].players[player_email].update(newPos, newRot); - }else{ - response = new Response({}, BAD_REQUEST, 'Invalid player email'); + const body = JSON.parse(req.body); + const updateData = body.params; + if(!updateData) { + response = new Response({}, BAD_REQUEST, 'Invalid player data'); + res.set(get_headers(origin)); + res.status(BAD_REQUEST).json(response); + return; } + const newPos = new Vector3(updateData.position._x, updateData.position._y, 0); + const newRot = new Vector3(updateData.rotation._x, updateData.rotation._y, updateData.rotation._z); + players[player_email].update(newPos, newRot); + + res.set(get_headers(origin)); res.status(OK).json(response); return; }); app.get('/logout', (req, res) => { + const origin = req.headers.origin || ''; const player_email = req.query['player_email']+''; - const room_id = req.query['room_id']+''; - if(!rooms[room_id]) { - res.set(get_headers(req.headers.origin)); - res.status(BAD_REQUEST).json((new Response({}, BAD_REQUEST, 'Invalid room ID'))); + if(!players[player_email]) { + console.error('Player not logged in.'); + + res.set(get_headers(origin)); + res.status(BAD_REQUEST).json((new Response({}, BAD_REQUEST, 'Player not logged in.'))); return; } + const room_id = players[player_email].currentRoomID; rooms[room_id].remove_player(player_email); + delete players[player_email]; - res.set(get_headers(req.headers.origin)); + res.set(get_headers(origin)); res.end(); return; }); diff --git a/src/Room.ts b/src/Room.ts index b81cec6..7f74a92 100644 --- a/src/Room.ts +++ b/src/Room.ts @@ -66,10 +66,7 @@ export default class Room { player.setPosition(newPosition); this.players[player.username] = player; - return true; } - - return false; } remove_player(player_username: string) {