diff --git a/index.js b/index.js index e8220d4..8afe7d8 100644 --- a/index.js +++ b/index.js @@ -11,9 +11,35 @@ console.log('Listening!'); }); +const interval = setInterval(() => + { + ws.clients.forEach(i => + { + if (i.failedPong > 8) + { + i.terminate(); + } + else + { + if (i.failedPong > 0) + { + console.log("Client failed pong " + i.failedPong + " " + (playersBySocket[i] !== undefined ? playersBySocket[i].id : "noplayer")); + } + i.failedPong++; + i.ping(); + } + } + ); + }, 15000 +); + ws.on('connection', function(conn) { console.log('Connection!'); + + conn.failedPong = 0; + conn.on('pong', () => { conn.failedPong = 0; }); + conn.on('message', function(message) { @@ -30,10 +56,11 @@ ); conn.on('close', function(code, reason) { - console.log('Socket closed: ' . reason); + console.log('Socket closed: ' + reason); if (playersBySocket[conn] !== undefined) { const p = playersBySocket[conn]; + console.log("Deleting player " + p.id); delete playersBySocket[conn]; p.room.removePlayer(p); diff --git a/index.js b/index.js index e8220d4..8afe7d8 100644 --- a/index.js +++ b/index.js @@ -11,9 +11,35 @@ console.log('Listening!'); }); +const interval = setInterval(() => + { + ws.clients.forEach(i => + { + if (i.failedPong > 8) + { + i.terminate(); + } + else + { + if (i.failedPong > 0) + { + console.log("Client failed pong " + i.failedPong + " " + (playersBySocket[i] !== undefined ? playersBySocket[i].id : "noplayer")); + } + i.failedPong++; + i.ping(); + } + } + ); + }, 15000 +); + ws.on('connection', function(conn) { console.log('Connection!'); + + conn.failedPong = 0; + conn.on('pong', () => { conn.failedPong = 0; }); + conn.on('message', function(message) { @@ -30,10 +56,11 @@ ); conn.on('close', function(code, reason) { - console.log('Socket closed: ' . reason); + console.log('Socket closed: ' + reason); if (playersBySocket[conn] !== undefined) { const p = playersBySocket[conn]; + console.log("Deleting player " + p.id); delete playersBySocket[conn]; p.room.removePlayer(p); diff --git a/room.js b/room.js index 1f9643e..7246d4f 100644 --- a/room.js +++ b/room.js @@ -25,12 +25,26 @@ } removePlayer(p) { - if (this.players[p] === undefined) return false; + if (this.players[p.id] === undefined) return false; - delete this.players[p]; + delete this.players[p.id]; this.broadcastMessage("remove_player", {player_id:p.id}); + var toDelete = []; + for (var item of Object.values(this.items)) + { + if (item.playerId == p.id && item.details.dod) //deleteOnDisconnect + { + item.details.__delete__ = true; + toDelete.push(item); + console.log("Deleting " + item.key); + delete this.items[item.key]; + } + } + this.updateItems(toDelete); + console.log(this.items); + return true; } getItem(playerId, itemId) @@ -63,18 +77,26 @@ const { item_id, player_id, key, ...cleanDetails } = itemData; item.details = cleanDetails; - toSend.push(item.getJSON()); + toSend.push(item); } } console.log("ITEMS: "); console.log(this.items); - console.log("TOSEND: "); - console.log(toSend); - this.broadcastMessage('update_items', {items:toSend}, player); + this.updateItems(toSend, player); } break; } } + updateItems(items, skipPlayer = null) + { + if (items.length > 0) + { + var toSend = items.map(i => i.getJSON()); + console.log("TOSEND: "); + console.log(toSend); + this.broadcastMessage('update_items', {items:toSend}, skipPlayer); + } + } broadcastString(msg, skipPlayer = null) { for (var p of Object.values(this.playeres))