From 238c4edff1a343ce9b0f0d961702f6538cded95c Mon Sep 17 00:00:00 2001 From: James Ketrenos Date: Wed, 16 Mar 2022 07:58:21 -0700 Subject: [PATCH] Player sorting is correct -- disconnects with removePeer are not Signed-off-by: James Ketrenos --- client/src/MediaControl.js | 2 +- client/src/PlayerList.js | 54 +++++++++++++++++++++++++++++--------- server/routes/games.js | 21 ++++++++------- 3 files changed, 53 insertions(+), 24 deletions(-) diff --git a/client/src/MediaControl.js b/client/src/MediaControl.js index cfbf0d1..4e5d74f 100644 --- a/client/src/MediaControl.js +++ b/client/src/MediaControl.js @@ -221,7 +221,7 @@ const MediaAgent = ({setPeers}) => { console.log(`media-agent - removePeer - Signaling server said to remove peer ${peer_id}`); if (peer_id in peers) { if (peers[peer_id].connection) { - peers[peer_id].connnection.close(); + peers[peer_id].connection.close(); } } diff --git a/client/src/PlayerList.js b/client/src/PlayerList.js index 6ccf69d..6dd7502 100644 --- a/client/src/PlayerList.js +++ b/client/src/PlayerList.js @@ -90,32 +90,60 @@ const PlayerList = () => { for (let key in players) { sortedPlayers.push(players[key]); } - sortedPlayers.sort((A, B) => { - if (A.color === color) { + + const sortPlayers = (A, B) => { + /* active player first */ + if (A.name === name) { return -1; } - if (B.color === color) { + if (B.name === name) { return +1; } + + /* Sort active players first */ + if (A.name && !B.name) { + return -1; + } + if (B.name && !A.name) { + return +1; + } + + /* Ohterwise, sort by color */ return A.color.localeCompare(B.color); + }; + + sortedPlayers.sort(sortPlayers); + + /* Array of just names... */ + unselected.sort((A, B) => { + /* active player first */ + if (A === name) { + return -1; + } + if (B === name) { + return +1; + } + /* Then sort alphabetically */ + return A.localeCompare(B); }); - sortedPlayers.forEach(item => { - const name = item.name; - const selectable = inLobby && (item.status === 'Not active' || color === item.color); + sortedPlayers.forEach(player => { + const name = player.name; + const selectable = inLobby && (player.status === 'Not active' || color === player.color); playerElements.push(
{ inLobby && selectable && toggleSelected(item.color) }} - key={`player-${item.color}`}> + onClick={() => { inLobby && selectable && toggleSelected(player.color) }} + key={`player-${player.color}`}>
- +
{name ? name : 'Available' }
- { name && !item.live &&
} + { name && !player.live &&
}
- { name && item.live && } + { name && player.live && } { !name &&
}
); @@ -124,7 +152,7 @@ const PlayerList = () => { const waiting = unselected.map((player) => { return
{ player }
- +
}); diff --git a/server/routes/games.js b/server/routes/games.js index 41021fb..eb385dd 100755 --- a/server/routes/games.js +++ b/server/routes/games.js @@ -834,12 +834,12 @@ const setPlayerName = (game, session, name) => { if (session.ws && (game.id in audio) && session.name in audio[game.id]) { hasAudio = true; - part(audio[game.id], session, game.id); + part(audio[game.id], session); } } else { message = `${session.name} has changed their name to ${name}.`; if (session.ws && game.id in audio) { - part(audio[game.id], session, game.id); + part(audio[game.id], session); } } } @@ -856,7 +856,7 @@ const setPlayerName = (game, session, name) => { } if (session.ws && hasAudio) { - join(audio[game.id], session, game.id); + join(audio[game.id], session); } console.log(`${info}: ${message}`); addChatMessage(game, null, message); @@ -2945,7 +2945,7 @@ const resetDisconnectCheck = (game, req) => { //req.disconnectCheck = setTimeout(() => { wsInactive(game, req) }, 20000); } -const join = (peers, session, id) => { +const join = (peers, session) => { const ws = session.ws; if (!session.name) { @@ -2977,7 +2977,7 @@ const join = (peers, session, id) => { peers[session.name] = ws; }; -const part = (peers, session, id) => { +const part = (peers, session) => { const ws = session.ws; if (!session.name) { @@ -3000,11 +3000,11 @@ const part = (peers, session, id) => { for (let peer in peers) { peers[peer].send(JSON.stringify({ type: 'removePeer', - data: {'peer_id': peer} + data: {'peer_id': session.name} })); ws.send(JSON.stringify({ type: 'removePeer', - data: {'peer_id': peer} + data: {'peer_id': session.name} })); } }; @@ -3074,6 +3074,7 @@ const departLobby = (game, session, color) => { sendUpdateToPlayers(game, update); } + const all = `[ all ]`; const info = `[ info ]`; const todo = `[ todo ]`; @@ -3421,7 +3422,7 @@ router.ws("/ws/:id", async (ws, req) => { if (session.ws) { /* Cleanup any voice channels */ if (id in audio) { - part(audio[id], session, id); + part(audio[id], session); } session.ws.close(); session.ws = undefined; @@ -3456,11 +3457,11 @@ router.ws("/ws/:id", async (ws, req) => { switch (data.type) { case 'join': - join(audio[id], session, id); + join(audio[id], session); break; case 'part': - part(audio[id], session, id); + part(audio[id], session); break; case 'relayICECandidate': {