From: Carl Worth Date: Fri, 5 Jun 2020 13:57:04 +0000 (-0700) Subject: game: Index players directly by session ID X-Git-Url: https://git.cworth.org/git?p=empires-server;a=commitdiff_plain;h=b5a5c28f09756d7a7e65dd2bc75de130bc71e0dd game: Index players directly by session ID Previously we were just storing the players in an unordered array, and doing an O(n) walk through the array to find a player with a session ID that matched the ID of interest. Instead, we now index directly with the session ID which is already guaranteed yo be unique and is convenient in JavaScript where we can use the session ID as a property name, and even use a convenient subscript syntax for that. With this change we don't even need to store the session_id property on the player since it is now not used at all. --- diff --git a/game.js b/game.js index de77148..8a0e083 100644 --- a/game.js +++ b/game.js @@ -1,9 +1,8 @@ /* A single player can have multiple connections, (think, multiple * browser windows with a common session cookie). */ class Player { - constructor(id, session_id, name, connection) { + constructor(id, name, connection) { this.id = id; - this.session_id = session_id; this.name = name; this.connections = [connection]; this.team = ""; @@ -73,38 +72,27 @@ class Game { add_player(session, connection) { /* First see if we already have a player object for this session. */ - const existing_index = this.players.findIndex( - player => player.session_id === session.id); - if (existing_index >= 0) { - const player = this.players[existing_index]; - player.add_connection(connection); - return player; + const existing = this.players[session.id]; + if (existing) { + existing.add_connection(connection); + return existing; } /* No existing player. Add a new one. */ const id = this.next_player_id; - const player = new Player(id, session.id, session.nickname, connection); + const player = new Player(id, session.nickname, connection); /* Broadcast before adding player to list (to avoid announcing the * new player to itself). */ const player_data = JSON.stringify({ id: player.id, name: player.name }); this.broadcast_event("player-enter", player_data); - this.players.push(player); + this.players[session.id] = player; this.next_player_id++; return player; } - find_player(session) { - const existing_index = this.players.findIndex( - player => player.session_id === session.id); - if (existing_index >= 0) - return this.players[existing_index]; - - return null; - } - /* Drop a connection object from a player, and if it's the last one, * then drop that player from the game's list of players. */ remove_player_connection(player, connection) { @@ -118,7 +106,8 @@ class Game { /* Send a string to all players */ broadcast_string(str) { - this.players.forEach(player => player.send(str + '\n')); + for (let [session_id, player] of Object.entries(this.players)) + player.send(str + '\n'); } /* Send an event to all players. @@ -166,7 +155,7 @@ class Game { } handle_player(request, response) { - const player = this.find_player(request.session); + const player = this.players[request.session.id]; const name = request.body.name; const team = request.body.team; var updated = false;