new button to leave a game
authorLaurent Mazet <mazet@softndesign.org>
Sun, 2 Feb 2025 07:42:18 +0000 (08:42 +0100)
committerRaphaël Jakse <raph@jakse.fr>
Fri, 14 Feb 2025 07:13:19 +0000 (08:13 +0100)
public/index.html
public/trivabble.js
server/trivabble-server.js

index 59afde10534a0b3795f6dc699e504390cbcd9b95..51ace2f5d0c90cec20fbe5608d879513e5c33a0a 100644 (file)
@@ -25,6 +25,7 @@
     <body>
         <div id="menu" class="panel">
             <button data-l10n="text-content" id="join-game">Join adversaries</button>
+            <button data-l10n="text-content" id="leave-game">Leave current game</button>
             <p id="p-name"> <span data-l10n="text-content">You are:</span> <span id="name" data-l10n="text-content">(name to give)</span><br /><button class="minibutton" id="change-name" data-l10n="text-content">Change</button></p>
             <button id="clear-game" data-l10n="text-content">Put back all the tiles&#10;in the bag</button>
             <p id="p-name"><span data-l10n="text-content">Number of your game:</span><br /><span id="number" data-l10n="text-content">(pending)</span></p>
index 2d036aa74a64035200064f3153b7e67e5e7ddfa3..804e7f32f77a4c915f93bf9acca63a49600c2b3e 100644 (file)
 
                 tablePlayers[playerName] = row;
             }
+            if (Object.prototype.hasOwnProperty.call(player, "leave")) {
+                tablePlayers[playerName].remove();
+                delete (tablePlayers[playerName]);
+                continue;
+            }
 
             if (Object.prototype.hasOwnProperty.call(player, "score")) {
                 const scoreCell = getScoreCell(playerName);
         );
     }
 
-    function clearRack() {
+    function sendBackTiles() {
+        const cmds = [];
+
+        for (let i = 0; i < playerLetters.length; i++) {
+            if (playerLetters[i].getElementsByClassName("tile")[0]) {
+                cmds.push({
+                    cmd: "moveLetter",
+                    from: "rack",
+                    indexFrom: i,
+                    to: "bag",
+                    indexTo: -1
+                });
+            }
+        }
+
+        if (cmds.length) {
+            sendCmds(cmds);
+        }
+        setRack("");
+    }
+
+    function leaveGame() {
         myConfirm(
-            _("Are you sure you want to put all your tiles back in the bag?"),
+            _("You are about to leave this game. Your letters will be put back in bag. Are you sure?"),
             function () {
-                const cmds = [];
-
-                for (let i = 0; i < playerLetters.length; i++) {
-                    if (playerLetters[i].getElementsByClassName("tile")[0]) {
-                        cmds.push({
-                            cmd: "moveLetter",
-                            from: "rack",
-                            indexFrom: i,
-                            to: "bag",
-                            indexTo: -1
-                        });
-                    }
-                }
-
-                sendCmds(cmds);
-                setRack("");
+                sendBackTiles();
+                sendCmds([{cmd: "leaveGame"}]);
+                setSetting("GameNumber", 0);
+                location.reload();
             }
         );
     }
 
+    function clearRack() {
+        myConfirm(
+            _("Are you sure you want to put all your tiles back in the bag?"),
+            sendBackTiles
+        );
+    }
+
     function showRack() {
         myConfirm(
             _("Are you sure you want to show your rack to everybody?"),
         document.getElementById("board-label").onchange = onChangeBoardLabel;
         document.getElementById("change-name").onclick = changeName;
         document.getElementById("join-game").onclick   = joinGame;
+        document.getElementById("leave-game").onclick   = leaveGame;
         document.getElementById("clear-rack").onclick  = clearRack;
         document.getElementById("show-rack").onclick   = showRack;
         document.getElementById("check-spelling").onclick = checkSpellingClicked;
index 97c9862598e70a14788471c6d9ea35b3e08a6261..1fcc6349dee4b7bd878ba4de09f0fa5242c82377 100644 (file)
@@ -336,6 +336,20 @@ Game.prototype.playerJoined = function (playerName) {
     this.pendingEvents.push({players: players});
 };
 
+Game.prototype.playerLeft = function (playerName) {
+
+    const playerID = "#" + playerName;
+    delete (this.racks[playerID])
+    delete (this.scores[playerID])
+    for (const listeningPlayer of this.listeningPlayers) {
+        writeMessage(listeningPlayer,
+            JSON.stringify({players: [{player: playerName, leave: "yes"}]}));
+    }
+    if (this.listeningPlayers.length == 1) {
+        delete (this);
+    }
+};
+
 Game.prototype.addListeningPlayer = function (playerName, responseAndType) {
     const that = this;
 
@@ -712,6 +726,12 @@ function handleCommand(cmdNumber, message, response) {
             break;
         }
 
+        case "leaveGame": {
+            game.playerLeft(playerName);
+            reply(message, response, cmdNumber, {error: 0});
+            break;
+        }
+
         case "resetGame": {
             game.reset();
             reply(message, response, cmdNumber, {error: 0});
@@ -842,6 +862,9 @@ function webSocketWrite(socket, data) {
     // Copy the data into a buffer
     data = Buffer.from(data);
     const byteLength = data.length;
+    if (byteLength <= 2) {
+        return;
+    }
 
     // Note: we're not supporting > 65535 byte payloads at this stage
     const lengthByteCount = byteLength < 126 ? 0 : 2;