From 052736edd7a2368a033d80c09c79bb53fc8a9ae4 Mon Sep 17 00:00:00 2001 From: Michael Morrison Date: Fri, 12 Feb 2021 11:36:51 -0600 Subject: [PATCH] Reduced chance of protocol collisions between gamespy3 and minecraftbedrock (2.0.27) --- CHANGELOG.md | 3 +++ package.json | 2 +- protocols/core.js | 4 +++- protocols/gamespy3.js | 10 +++++++-- protocols/minecraft.js | 3 ++- protocols/minecraftbedrock.js | 40 +++++++++++++++++++++-------------- 6 files changed, 41 insertions(+), 21 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2938d94..ddd83a3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,6 @@ +### 2.0.27 +* Reduced chance of protocol collisions between gamespy3 and minecraftbedrock + ### 2.0.26 * Added support for the native minecraft bedrock protocol, since some bedrock servers apparently do not respond to the gamespy3 protocol. diff --git a/package.json b/package.json index 528b39a..1a18779 100644 --- a/package.json +++ b/package.json @@ -24,7 +24,7 @@ ], "main": "lib/index.js", "author": "GameDig Contributors", - "version": "2.0.26", + "version": "2.0.27", "repository": { "type": "git", "url": "https://github.com/gamedig/node-gamedig.git" diff --git a/protocols/core.js b/protocols/core.js index fb9e1ed..0989495 100644 --- a/protocols/core.js +++ b/protocols/core.js @@ -35,7 +35,9 @@ class Core extends EventEmitter { } this.logger.prefix = 'Q#' + (uid++); - this.logger.debug("Query is running with options:", this.options); + this.logger.debug("Starting"); + this.logger.debug("Protocol: " + this.constructor.name); + this.logger.debug("Options:", this.options); let abortCall = null; this.abortedPromise = new Promise((resolve,reject) => { diff --git a/protocols/gamespy3.js b/protocols/gamespy3.js index 853c900..8372265 100644 --- a/protocols/gamespy3.js +++ b/protocols/gamespy3.js @@ -148,9 +148,15 @@ class Gamespy3 extends Core { return await this.udpSend(b,(buffer) => { const reader = this.reader(buffer); const iType = reader.uint(1); - if(iType !== type) return; + if(iType !== type) { + this.logger.debug('Skipping packet, type mismatch'); + return; + } const iSessionId = reader.uint(4); - if(iSessionId !== this.sessionId) return; + if(iSessionId !== this.sessionId) { + this.logger.debug('Skipping packet, session id mismatch'); + return; + } if(!assemble) { return reader.rest(); diff --git a/protocols/minecraft.js b/protocols/minecraft.js index e5720c9..785f39e 100644 --- a/protocols/minecraft.js +++ b/protocols/minecraft.js @@ -81,7 +81,8 @@ class Minecraft extends Core { if (gamespyState) { if (gamespyState.name) state.name = gamespyState.name; if (gamespyState.maxplayers) state.maxplayers = gamespyState.maxplayers; - if (gamespyState.players) state.players = gamespyState.players; + if (gamespyState.players.length) state.players = gamespyState.players; + else if (gamespyState.raw.numplayers) state.players = parseInt(gamespyState.raw.numplayers); } // remove dupe spaces from name state.name = state.name.replace(/\s+/g, ' '); diff --git a/protocols/minecraftbedrock.js b/protocols/minecraftbedrock.js index c1d2ba8..4c166fc 100644 --- a/protocols/minecraftbedrock.js +++ b/protocols/minecraftbedrock.js @@ -9,7 +9,7 @@ class MinecraftBedrock extends Core { async run(state) { const bufs = [ Buffer.from([0x01]), // Message ID, ID_UNCONNECTED_PING - Buffer.from('0000000000000000', 'hex'), // Nonce / timestamp + Buffer.from('1122334455667788', 'hex'), // Nonce / timestamp Buffer.from('00ffff00fefefefefdfdfdfd12345678', 'hex'), // Magic Buffer.from('0000000000000000', 'hex') // Cliend GUID ]; @@ -19,17 +19,26 @@ class MinecraftBedrock extends Core { const messageId = reader.uint(1); if (messageId !== 0x1c) { - throw new Error('Invalid message id'); + this.logger.debug('Skipping packet, invalid message id'); + return; } const nonce = reader.part(8).toString('hex'); // should match the nonce we sent this.logger.debug('Nonce: ' + nonce); + if (nonce !== '1122334455667788') { + this.logger.debug('Skipping packet, invalid nonce'); + return; + } // These 8 bytes are identical to the serverId string we receive in decimal below reader.skip(8); const magic = reader.part(16).toString('hex'); this.logger.debug('Magic value: ' + magic); + if (magic !== '00ffff00fefefefefdfdfdfd12345678') { + this.logger.debug('Skipping packet, invalid magic'); + return; + } const statusLen = reader.uint(2); if (reader.remaining() !== statusLen) { @@ -40,23 +49,22 @@ class MinecraftBedrock extends Core { this.logger.debug('Raw status str: ' + statusStr); const split = statusStr.split(';'); - if (split.length < 12) { + if (split.length < 6) { throw new Error('Missing enough chunks in status str'); } - let i = 0; - state.raw.edition = split[i++]; - state.name = split[i++]; - state.raw.protocolVersion = split[i++]; - state.raw.mcVersion = split[i++]; - state.players = parseInt(split[i++]); - state.maxplayers = parseInt(split[i++]); - state.raw.serverId = split[i++]; - state.map = split[i++]; - state.raw.gameMode = split[i++]; - state.raw.nintendoOnly = !!parseInt(split[i++]); - state.raw.ipv4Port = split[i++]; - state.raw.ipv6Port = split[i++]; + state.raw.edition = split.shift(); + state.name = split.shift(); + state.raw.protocolVersion = split.shift(); + state.raw.mcVersion = split.shift(); + state.players = parseInt(split.shift()); + state.maxplayers = parseInt(split.shift()); + if (split.length) state.raw.serverId = split.shift(); + if (split.length) state.map = split.shift(); + if (split.length) state.raw.gameMode = split.shift(); + if (split.length) state.raw.nintendoOnly = !!parseInt(split.shift()); + if (split.length) state.raw.ipv4Port = split.shift(); + if (split.length) state.raw.ipv6Port = split.shift(); return true; });