From 5b01e1be17fa4e20cf12fafd90182ed05bbb736f Mon Sep 17 00:00:00 2001 From: CosminPerRam Date: Wed, 13 Sep 2023 17:31:58 +0300 Subject: [PATCH] Replace deprecated substr with substring (#355) * Make the QueryRunner more readable * Remove use of deprecated substr and replace with substring, and some formatting --- bin/genreadme.js | 2 +- lib/GameResolver.js | 35 ++++++++++++++-------- lib/GlobalUdpSocket.js | 6 ++-- lib/QueryRunner.js | 65 +++++++++++++++++------------------------ lib/index.js | 5 +++- protocols/teamspeak2.js | 4 +-- protocols/teamspeak3.js | 4 +-- protocols/tribes1.js | 2 +- protocols/ventrilo.js | 4 +-- 9 files changed, 66 insertions(+), 61 deletions(-) diff --git a/bin/genreadme.js b/bin/genreadme.js index 57cf4a1..56d66bc 100644 --- a/bin/genreadme.js +++ b/bin/genreadme.js @@ -16,5 +16,5 @@ let start = readme.indexOf(marker_top); start += marker_top.length; const end = readme.indexOf(marker_bottom); -const updated = readme.substr(0,start)+"\n\n"+generated+"\n"+readme.substr(end); +const updated = readme.substring(0,start)+"\n\n"+generated+"\n"+readme.substring(end); fs.writeFileSync(readmeFilename, updated); diff --git a/lib/GameResolver.js b/lib/GameResolver.js index 4856b9f..2d19fbd 100644 --- a/lib/GameResolver.js +++ b/lib/GameResolver.js @@ -9,16 +9,20 @@ class GameResolver { } lookup(type) { - if(!type) throw Error('No game specified'); + if(!type) + throw Error('No game specified'); - if(type.substr(0,9) === 'protocol-') { + if(type.substring(0,9) === 'protocol-') { return { - protocol: type.substr(9) + protocol: type.substring(9) }; } const game = this.gamesByKey.get(type); - if(!game) throw Error('Invalid game: '+type); + + if(!game) + throw Error('Invalid game: '+type); + return game.options; } @@ -61,7 +65,7 @@ class GameResolver { for (let line of lines) { // strip comments const comment = line.indexOf('#'); - if(comment !== -1) line = line.substr(0,comment); + if(comment !== -1) line = line.substring(0,comment); line = line.trim(); if(!line) continue; @@ -82,27 +86,34 @@ class GameResolver { for (const key of keys) { gamesByKey.set(key, game); } + games.push(game); } return { gamesByKey, games }; } _parseList(str) { - if(!str) return {}; - const out = {}; + if(!str) + return {}; + + let out = {}; for (const one of str.split(',')) { const equals = one.indexOf('='); - const key = equals === -1 ? one : one.substr(0,equals); + const key = equals === -1 ? one : one.substring(0, equals); /** @type {string|number|boolean} */ - let value = equals === -1 ? '' : one.substr(equals+1); + let value = equals === -1 ? '' : one.substring(equals + 1); - if(value === 'true' || value === '') value = true; - else if(value === 'false') value = false; - else if(!isNaN(parseInt(value))) value = parseInt(value); + if(value === 'true' || value === '') + value = true; + else if(value === 'false') + value = false; + else if(!isNaN(parseInt(value))) + value = parseInt(value); out[key] = value; } + return out; } } diff --git a/lib/GlobalUdpSocket.js b/lib/GlobalUdpSocket.js index 99a6c13..16d403d 100644 --- a/lib/GlobalUdpSocket.js +++ b/lib/GlobalUdpSocket.js @@ -26,8 +26,8 @@ class GlobalUdpSocket { log(fromAddress + ':' + fromPort + " <--UDP(" + this.port + ")"); log(HexUtil.debugDump(buffer)); }); - for (const cb of this.callbacks) { - cb(fromAddress, fromPort, buffer); + for (const callback of this.callbacks) { + callback(fromAddress, fromPort, buffer); } }); udpSocket.on('error', e => { @@ -42,12 +42,14 @@ class GlobalUdpSocket { async send(buffer, address, port, debug) { const socket = await this._getSocket(); + if (debug) { this.logger._print(log => { log(address + ':' + port + " UDP(" + this.port + ")-->"); log(HexUtil.debugDump(buffer)); }); } + await util.promisify(socket.send).bind(socket)(buffer,0,buffer.length,port,address); } diff --git a/lib/QueryRunner.js b/lib/QueryRunner.js index 3abb953..8f64d59 100644 --- a/lib/QueryRunner.js +++ b/lib/QueryRunner.js @@ -17,6 +17,7 @@ class QueryRunner { this.gameResolver = new GameResolver(); this.protocolResolver = new ProtocolResolver(); } + async run(userOptions) { for (const key of Object.keys(userOptions)) { const value = userOptions[key]; @@ -30,51 +31,38 @@ class QueryRunner { port_query_offset: gameQueryPortOffset, ...gameOptions } = this.gameResolver.lookup(userOptions.type); - const attempts = []; + let attempts = []; + + const optionsCollection = { + ...defaultOptions, + ...gameOptions, + ...userOptions + }; + + const addAttemptWithPort = port => { + attempts.push({ + ...optionsCollection, + port + }); + } if (userOptions.port) { - if (gameQueryPortOffset && !userOptions.givenPortOnly) { - attempts.push({ - ...defaultOptions, - ...gameOptions, - ...userOptions, - port: userOptions.port + gameQueryPortOffset - }); + if(!userOptions.givenPortOnly) { + if (gameQueryPortOffset) + addAttemptWithPort(userOptions.port + gameQueryPortOffset); + + if (userOptions.port === gameOptions.port && gameQueryPort) + addAttemptWithPort(gameQueryPort); } - if (userOptions.port === gameOptions.port && gameQueryPort && !userOptions.givenPortOnly) { - attempts.push({ - ...defaultOptions, - ...gameOptions, - ...userOptions, - port: gameQueryPort - }); - } - attempts.push({ - ...defaultOptions, - ...gameOptions, - ...userOptions - }); + + attempts.push(optionsCollection); } else if (gameQueryPort) { - attempts.push({ - ...defaultOptions, - ...gameOptions, - ...userOptions, - port: gameQueryPort - }); + addAttemptWithPort(gameQueryPort); } else if (gameOptions.port) { - attempts.push({ - ...defaultOptions, - ...gameOptions, - ...userOptions, - port: gameOptions.port + (gameQueryPortOffset || 0) - }); + addAttemptWithPort(gameOptions.port + (gameQueryPortOffset || 0)); } else { // Hopefully the request doesn't need a port. If it does, it'll fail when making the request. - attempts.push({ - ...defaultOptions, - ...gameOptions, - ...userOptions - }); + attempts.push(optionsCollection); } const numRetries = userOptions.maxAttempts || gameOptions.maxAttempts || defaultOptions.maxAttempts; @@ -97,6 +85,7 @@ class QueryRunner { for (const e of errors) { err.stack += '\n' + e.stack; } + throw err; } diff --git a/lib/index.js b/lib/index.js index b1a1f3f..0bab991 100644 --- a/lib/index.js +++ b/lib/index.js @@ -12,9 +12,12 @@ class Gamedig { } static getInstance() { - if (!singleton) singleton = new Gamedig(); + if (!singleton) + singleton = new Gamedig(); + return singleton; } + static async query(...args) { return await Gamedig.getInstance().query(...args); } diff --git a/protocols/teamspeak2.js b/protocols/teamspeak2.js index fc449c0..e563b78 100644 --- a/protocols/teamspeak2.js +++ b/protocols/teamspeak2.js @@ -14,8 +14,8 @@ class Teamspeak2 extends Core { const data = await this.sendCommand(socket, 'si'); for (const line of data.split('\r\n')) { const equals = line.indexOf('='); - const key = equals === -1 ? line : line.substr(0,equals); - const value = equals === -1 ? '' : line.substr(equals+1); + const key = equals === -1 ? line : line.substring(0,equals); + const value = equals === -1 ? '' : line.substring(equals+1); state.raw[key] = value; } } diff --git a/protocols/teamspeak3.js b/protocols/teamspeak3.js index 7fdf6bd..0d91335 100644 --- a/protocols/teamspeak3.js +++ b/protocols/teamspeak3.js @@ -53,8 +53,8 @@ class Teamspeak3 extends Core { const unit = {}; for (const field of split) { const equals = field.indexOf('='); - const key = equals === -1 ? field : field.substr(0,equals); - const value = equals === -1 ? '' : field.substr(equals+1) + const key = equals === -1 ? field : field.substring(0, equals); + const value = equals === -1 ? '' : field.substring(equals + 1) .replace(/\\s/g,' ').replace(/\\\//g,'/'); unit[key] = value; } diff --git a/protocols/tribes1.js b/protocols/tribes1.js index a0a3d8a..d50ceee 100644 --- a/protocols/tribes1.js +++ b/protocols/tribes1.js @@ -133,7 +133,7 @@ class Tribes1 extends Core { if (!str) return []; return ('?'+str) .split('\t') - .map((a) => a.substr(1).trim().toLowerCase()) + .map((a) => a.substring(1).trim().toLowerCase()) .map((a) => a === 'team name' ? 'name' : a) .map((a) => a === 'player name' ? 'name' : a); } diff --git a/protocols/ventrilo.js b/protocols/ventrilo.js index 5e7a998..7ee875a 100644 --- a/protocols/ventrilo.js +++ b/protocols/ventrilo.js @@ -64,9 +64,9 @@ function splitFields(str,subMode) { } for (const one of split) { const equal = one.indexOf(splitter); - const key = equal === -1 ? one : one.substr(0,equal); + const key = equal === -1 ? one : one.substring(0,equal); if(!key || key === '\0') continue; - const value = equal === -1 ? '' : one.substr(equal+splitter.length); + const value = equal === -1 ? '' : one.substring(equal+splitter.length); if(!subMode && key === 'CHANNEL') out.CHANNELS.push(splitFields(value,true)); else if(!subMode && key === 'CLIENT') out.CLIENTS.push(splitFields(value,true)); else out[key] = value;