<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 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>
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;
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;
break;
}
+ case "leaveGame": {
+ game.playerLeft(playerName);
+ reply(message, response, cmdNumber, {error: 0});
+ break;
+ }
+
case "resetGame": {
game.reset();
reply(message, response, cmdNumber, {error: 0});
// 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;