More async

This commit is contained in:
mmorrison 2019-01-12 05:45:09 -06:00
parent 29ce0b82d0
commit e937c725bb
20 changed files with 100 additions and 86 deletions

View file

@ -424,7 +424,7 @@ additional option: token
Games with this note use a query port which is usually not the same as the game's connection port. Games with this note use a query port which is usually not the same as the game's connection port.
Usually, no action will be required from you. The 'port' option you pass GameDig should be the game's Usually, no action will be required from you. The 'port' option you pass GameDig should be the game's
connection port. GameDig will attempt to calculate the query port automatically. If the query still fails, connection port. GameDig will attempt to calculate the query port automatically. If the query still fails,
you may need to pass the 'port_query' option to GameDig as well, indicating the separate query port. you may need to find your server's query port, and pass that to GameDig instead.
Usage from Command Line Usage from Command Line
--- ---

View file

@ -15,7 +15,6 @@
# gr|Ghost Recon|ghostrecon|port=2346,port_query_offset=2 # gr|Ghost Recon|ghostrecon|port=2346,port_query_offset=2
# gtr2|GTR2|gtr2|port=34297,port_query_offset=1 # gtr2|GTR2|gtr2|port=34297,port_query_offset=1
# haze|Haze|haze # haze|Haze|haze
# openttd|OpenTTD|openttd|port=3979
# plainsight|Plain Sight|plainsight # plainsight|Plain Sight|plainsight
# redfaction|Red Faction|redfaction|port_query=7755 # redfaction|Red Faction|redfaction|port_query=7755
# savage|Savage|savage|port_query=11235 # savage|Savage|savage|port_query=11235
@ -28,15 +27,15 @@
7d2d|7 Days to Die|valve|port=26900,port_query_offset=1 7d2d|7 Days to Die|valve|port=26900,port_query_offset=1
ageofchivalry|Age of Chivalry|valve ageofchivalry|Age of Chivalry|valve|port=27015
aoe2|Age of Empires 2|ase|port_query=27224 aoe2|Age of Empires 2|ase|port_query=27224
alienarena|Alien Arena|quake2|port_query=27910 alienarena|Alien Arena|quake2|port_query=27910
alienswarm|Alien Swarm|valve alienswarm|Alien Swarm|valve|port=27015
arkse|ARK: Survival Evolved|valve|port=7777,port_query=27015 arkse|ARK: Survival Evolved|valve|port=7777,port_query=27015
avp2|Aliens vs Predator 2|gamespy1|port=27888 avp2|Aliens vs Predator 2|gamespy1|port=27888
# avp2010 doesn't really... have a default port or query port # avp2010 doesn't really... have a default port or query port
# both port and port_query should be specified when used # both port and port_query should be specified when used
avp2010|Aliens vs Predator 2010|valve avp2010|Aliens vs Predator 2010|valve|port=27015
americasarmy|America's Army|gamespy2|port=1716,port_query_offset=1 americasarmy|America's Army|gamespy2|port=1716,port_query_offset=1
americasarmy2|America's Army 2|gamespy2|port=1716,port_query_offset=1 americasarmy2|America's Army 2|gamespy2|port=1716,port_query_offset=1
@ -83,10 +82,10 @@ cacrenegade|Command and Conquer: Renegade|gamespy1|port=4848,port_query=25300
conanexiles|Conan Exiles|valve|port=7777,port_query=27015 conanexiles|Conan Exiles|valve|port=7777,port_query=27015
contactjack|Contact J.A.C.K.|gamespy1|port_query=27888 contactjack|Contact J.A.C.K.|gamespy1|port_query=27888
cs16|Counter-Strike 1.6|valve cs16|Counter-Strike 1.6|valve|port=27015
cscz|Counter-Strike: Condition Zero|valve cscz|Counter-Strike: Condition Zero|valve|port=27015
css|Counter-Strike: Source|valve css|Counter-Strike: Source|valve|port=27015
csgo|Counter-Strike: Global Offensive|valve||doc_notes=csgo csgo|Counter-Strike: Global Offensive|valve||port=27015|doc_notes=csgo
crossracing|Cross Racing Championship|ase|port=12321,port_query_offset=123 crossracing|Cross Racing Championship|ase|port=12321,port_query_offset=123
@ -95,7 +94,7 @@ crysiswars|Crysis Wars|gamespy3|port=64100
crysis2|Crysis 2|gamespy3|port=64000 crysis2|Crysis 2|gamespy3|port=64000
daikatana|Daikatana|quake2|port=27982,port_query_offset=10 daikatana|Daikatana|quake2|port=27982,port_query_offset=10
dmomam|Dark Messiah of Might and Magic|valve dmomam|Dark Messiah of Might and Magic|valve|port=27015
darkesthour|Darkest Hour|unreal2|port=7757,port_query_offset=1 darkesthour|Darkest Hour|unreal2|port=7757,port_query_offset=1
dayz|DayZ|valve|port=2302,port_query_offset=24714|doc_notes=dayz dayz|DayZ|valve|port=2302,port_query_offset=24714|doc_notes=dayz
dayzmod|DayZ Mod|valve|port=2302,port_query_offset=1 dayzmod|DayZ Mod|valve|port=2302,port_query_offset=1
@ -104,14 +103,14 @@ dh2005|Deer Hunter 2005|gamespy2|port=23459,port_query=34567
descent3|Descent 3|gamespy1|port=2092,port_query=20142 descent3|Descent 3|gamespy1|port=2092,port_query=20142
deusex|Deus Ex|gamespy2|port=7791,port_query_offset=1 deusex|Deus Ex|gamespy2|port=7791,port_query_offset=1
devastation|Devastation|unreal2|port=7777,port_query_offset=1 devastation|Devastation|unreal2|port=7777,port_query_offset=1
dinodday|Dino D-Day|valve dinodday|Dino D-Day|valve|port=27015
dirttrackracing2|Dirt Track Racing 2|gamespy1|port=32240,port_query_offset=-100 dirttrackracing2|Dirt Track Racing 2|gamespy1|port=32240,port_query_offset=-100
dnl|Dark and Light|valve|port=7777,port_query=27015 dnl|Dark and Light|valve|port=7777,port_query=27015
dod|Day of Defeat|valve dod|Day of Defeat|valve|port=27015
dods|Day of Defeat: Source|valve dods|Day of Defeat: Source|valve|port=27015
doi|Day of Infamy|valve doi|Day of Infamy|valve|port=27015
doom3|Doom 3|doom3|port=27666 doom3|Doom 3|doom3|port=27666
dota2|DOTA 2|valve dota2|DOTA 2|valve|port=27015
drakan|Drakan|gamespy1|port=27045,port_query_offset=1 drakan|Drakan|gamespy1|port=27045,port_query_offset=1
etqw|Enemy Territory Quake Wars|doom3|port=3074,port_query=27733 etqw|Enemy Territory Quake Wars|doom3|port=3074,port_query=27733
fear|F.E.A.R.|gamespy2|port_query=27888 fear|F.E.A.R.|gamespy2|port_query=27888
@ -119,33 +118,33 @@ f12002|F1 2002|gamespy1|port_query=3297
f1c9902|F1 Challenge 99-02|gamespy1|port_query=34397 f1c9902|F1 Challenge 99-02|gamespy1|port_query=34397
farcry|Far Cry|ase|port=49001,port_query_offset=123 farcry|Far Cry|ase|port=49001,port_query_offset=123
farcry2|Far Cry|ase|port_query=14001 farcry2|Far Cry|ase|port_query=14001
fortressforever|Fortress Forever|valve fortressforever|Fortress Forever|valve|port=27015
flashpoint|Flashpoint|gamespy1|port=2302,port_query_offset=1 flashpoint|Flashpoint|gamespy1|port=2302,port_query_offset=1
ffow|Frontlines: Fuel of War|ffow|port=5476,port_query_offset=2 ffow|Frontlines: Fuel of War|ffow|port=5476,port_query_offset=2
fivem|FiveM|fivem|port=30120 fivem|FiveM|fivem|port=30120
garrysmod|Garry's Mod|valve garrysmod|Garry's Mod|valve|port=27015
graw|Ghost Recon: Advanced Warfighter|gamespy2|port_query=15250 graw|Ghost Recon: Advanced Warfighter|gamespy2|port_query=15250
graw2|Ghost Recon: Advanced Warfighter 2|gamespy2|port_query=16250 graw2|Ghost Recon: Advanced Warfighter 2|gamespy2|port_query=16250
giantscitizenkabuto|Giants: Citizen Kabuto|gamespy1|port_query=8911 giantscitizenkabuto|Giants: Citizen Kabuto|gamespy1|port_query=8911
globaloperations|Global Operations|gamespy1|port_query=28672 globaloperations|Global Operations|gamespy1|port_query=28672
geneshift|Geneshift|geneshift|port=11235 geneshift|Geneshift|geneshift|port=11235
ges|GoldenEye: Source|valve ges|GoldenEye: Source|valve|port=27015
gore|Gore|gamespy1|port=27777,port_query_offset=1 gore|Gore|gamespy1|port=27777,port_query_offset=1
gunmanchronicles|Gunman Chronicles|valve gunmanchronicles|Gunman Chronicles|valve|port=27015
hldm|Half-Life 1 Deathmatch|valve hldm|Half-Life 1 Deathmatch|valve|port=27015
hl2dm|Half-Life 2 Deathmatch|valve hl2dm|Half-Life 2 Deathmatch|valve|port=27015
halo|Halo|gamespy2|port=2302 halo|Halo|gamespy2|port=2302
halo2|Halo 2|gamespy2|port=2302 halo2|Halo 2|gamespy2|port=2302
heretic2|Heretic 2|gamespy1|port=27900,port_query_offset=1 heretic2|Heretic 2|gamespy1|port=27900,port_query_offset=1
hexen2|Hexen 2|hexen2|port=26900,port_query_offset=50 hexen2|Hexen 2|hexen2|port=26900,port_query_offset=50
hidden|The Hidden: Source|valve hidden|The Hidden: Source|valve|port=27015
had2|Hidden and Dangerous 2|gamespy1|port=11001,port_query_offset=3 had2|Hidden and Dangerous 2|gamespy1|port=11001,port_query_offset=3
homefront|Homefront|valve homefront|Homefront|valve|port=27015
homeworld2|Homeworld 2|gamespy1|port_query=6500 homeworld2|Homeworld 2|gamespy1|port_query=6500
hurtworld|Hurtworld|valve|port=12871,port_query=12881 hurtworld|Hurtworld|valve|port=12871,port_query=12881
igi2|IGI-2: Covert Strike|gamespy1|port_query=26001 igi2|IGI-2: Covert Strike|gamespy1|port_query=26001
il2|IL-2 Sturmovik|gamespy1|port_query=21000 il2|IL-2 Sturmovik|gamespy1|port_query=21000
insurgency|Insurgency|valve insurgency|Insurgency|valve|port=27015
ironstorm|Iron Storm|gamespy1|port_query=3505 ironstorm|Iron Storm|gamespy1|port_query=3505
jamesbondnightfire|James Bond: Nightfire|gamespy1|port_query=6550 jamesbondnightfire|James Bond: Nightfire|gamespy1|port_query=6550
jc2mp|Just Cause 2 Multiplayer|jc2mp|port=7777 jc2mp|Just Cause 2 Multiplayer|jc2mp|port=7777
@ -154,11 +153,11 @@ killingfloor2|Killing Floor 2|valve|port=7777,port_query=27015
kingpin|Kingpin: Life of Crime|gamespy1|port=31510,port_query_offset=-10 kingpin|Kingpin: Life of Crime|gamespy1|port=31510,port_query_offset=-10
kisspc|KISS Psycho Circus|gamespy1|port=7777,port_query_offset=1 kisspc|KISS Psycho Circus|gamespy1|port=7777,port_query_offset=1
kspdmp|DMP - KSP Multiplayer|kspdmp|port=6702,port_query_offset=1 kspdmp|DMP - KSP Multiplayer|kspdmp|port=6702,port_query_offset=1
kzmod|KzMod|valve kzmod|KzMod|valve|port=27015
left4dead|Left 4 Dead|valve left4dead|Left 4 Dead|valve|port=27015
left4dead2|Left 4 Dead 2|valve left4dead2|Left 4 Dead 2|valve|port=27015
m2mp|Mafia 2 Multiplayer|m2mp|port=27016,port_query_offset=1 m2mp|Mafia 2 Multiplayer|m2mp|port=27016,port_query_offset=1
medievalengineers|Medieval Engineers|valve medievalengineers|Medieval Engineers|valve|port=27015
mohaa|Medal of Honor: Allied Assault|gamespy1|port=12203,port_query_offset=97 mohaa|Medal of Honor: Allied Assault|gamespy1|port=12203,port_query_offset=97
mohpa|Medal of Honor: Pacific Assault|gamespy1|port=13203,port_query_offset=97 mohpa|Medal of Honor: Pacific Assault|gamespy1|port=13203,port_query_offset=97
@ -180,9 +179,9 @@ mumble|Mumble|mumble|port=64738,port_query=27800|doc_notes=mumble
mumbleping|Mumble|mumbleping|port=64738|doc_notes=mumble mumbleping|Mumble|mumbleping|port=64738|doc_notes=mumble
mutantfactions|Mutant Factions|geneshift|port=11235 mutantfactions|Mutant Factions|geneshift|port=11235
nascarthunder2004|Nascar Thunder 2004|gamespy2|port_query=13333 nascarthunder2004|Nascar Thunder 2004|gamespy2|port_query=13333
netpanzer|netPanzer|gamespy1|3030 netpanzer|netPanzer|gamespy1|port=3030
nmrih|No More Room in Hell|valve nmrih|No More Room in Hell|valve|port=27015
ns|Natural Selection|valve ns|Natural Selection|valve|port=27015
ns2|Natural Selection 2|valve|port_query_offset=1 ns2|Natural Selection 2|valve|port_query_offset=1
nfshp2|Need for Speed: Hot Pursuit 2|gamespy1|port_query=61220 nfshp2|Need for Speed: Hot Pursuit 2|gamespy1|port_query=61220
nab|Nerf Arena Blast|gamespy1|port=4444,port_query_offset=1 nab|Nerf Arena Blast|gamespy1|port=4444,port_query_offset=1
@ -192,7 +191,7 @@ nexuiz|Nexuiz|quake3|port_query=26000
nitrofamily|Nitro Family|gamespy1|port_query=25601 nitrofamily|Nitro Family|gamespy1|port_query=25601
nolf|No One Lives Forever|gamespy1|port_query=27888 nolf|No One Lives Forever|gamespy1|port_query=27888
nolf2|No One Lives Forever 2|gamespy1|port_query=27890 nolf2|No One Lives Forever 2|gamespy1|port_query=27890
nucleardawn|Nuclear Dawn|valve nucleardawn|Nuclear Dawn|valve|port=27015
openarena|OpenArena|quake3|port_query=27960 openarena|OpenArena|quake3|port_query=27960
openttd|OpenTTD|openttd|port=3979 openttd|OpenTTD|openttd|port=3979
operationflashpoint|Operation Flashpoint|gamespy1|port=2234,port_query_offset=1 operationflashpoint|Operation Flashpoint|gamespy1|port=2234,port_query_offset=1
@ -206,7 +205,7 @@ quake2|Quake 2|quake2|port=27910
quake3|Quake 3: Arena|quake3|port=27960 quake3|Quake 3: Arena|quake3|port=27960
quake4|Quake 4|doom3|port=28004 quake4|Quake 4|doom3|port=28004
ragdollkungfu|Rag Doll Kung Fu|valve ragdollkungfu|Rag Doll Kung Fu|valve|port=27015
r6|Rainbow Six|gamespy1|port_query=2348 r6|Rainbow Six|gamespy1|port_query=2348
r6roguespear|Rainbow Six 2: Rogue Spear|gamespy1|port_query=2346 r6roguespear|Rainbow Six 2: Rogue Spear|gamespy1|port_query=2346
@ -219,20 +218,20 @@ redorchestraost|Red Orchestra: Ostfront 41-45|gamespy1|port=7757,port_query_offs
redorchestra2|Red Orchestra 2|valve|port=7777,port_query=27015 redorchestra2|Red Orchestra 2|valve|port=7777,port_query=27015
redline|Redline|gamespy1|port_query=25252 redline|Redline|gamespy1|port_query=25252
rtcw|Return to Castle Wolfenstein|quake3|port_query=27960 rtcw|Return to Castle Wolfenstein|quake3|port_query=27960
ricochet|Ricochet|valve ricochet|Ricochet|valve|port=27015
riseofnations|Rise of Nations|gamespy1|port_query=6501 riseofnations|Rise of Nations|gamespy1|port_query=6501
rune|Rune|gamespy1|port=7777,port_query_offset=1 rune|Rune|gamespy1|port=7777,port_query_offset=1
rust|Rust|valve|port=28015 rust|Rust|valve|port=28015
samp|San Andreas Multiplayer|samp|port=7777 samp|San Andreas Multiplayer|samp|port=7777
spaceengineers|Space Engineers|valve spaceengineers|Space Engineers|valve|port=27015
ss|Serious Sam|gamespy1|port=25600,port_query_offset=1 ss|Serious Sam|gamespy1|port=25600,port_query_offset=1
ss2|Serious Sam 2|gamespy2|port=25600 ss2|Serious Sam 2|gamespy2|port=25600
shatteredhorizon|Shattered Horizon|valve shatteredhorizon|Shattered Horizon|valve|port=27015
ship|The Ship|valve ship|The Ship|valve|port=27015
shogo|Shogo|gamespy1|port_query=27888 shogo|Shogo|gamespy1|port_query=27888
shootmania|Shootmania|nadeo|port=2350,port_query=5000|doc_notes=nadeo-shootmania--trackmania--etc shootmania|Shootmania|nadeo|port=2350,port_query=5000|doc_notes=nadeo-shootmania--trackmania--etc
sin|SiN|gamespy1|port_query=22450 sin|SiN|gamespy1|port_query=22450
sinep|SiN Episodes|valve sinep|SiN Episodes|valve|port=27015
soldat|Soldat|ase|port=13073,port_query_offset=123 soldat|Soldat|ase|port=13073,port_query_offset=123
sof|Soldier of Fortune|quake1|port_query=28910 sof|Soldier of Fortune|quake1|port_query=28910
sof2|Soldier of Fortune 2|quake3|port_query=20100 sof2|Soldier of Fortune 2|quake3|port_query=20100
@ -250,22 +249,22 @@ swrc|Star Wars: Republic Commando|gamespy2|port=7777,port_query=11138
starbound|Starbound|valve|port=21025 starbound|Starbound|valve|port=21025
starmade|StarMade|starmade|port=4242 starmade|StarMade|starmade|port=4242
suicidesurvival|Suicide Survival|valve suicidesurvival|Suicide Survival|valve|port=27015
swat4|SWAT 4|gamespy2|port=10480,port_query_offset=2 swat4|SWAT 4|gamespy2|port=10480,port_query_offset=2
svencoop|Sven Coop|valve svencoop|Sven Coop|valve|port=27015
synergy|Synergy|valve synergy|Synergy|valve|port=27015
tacticalops|Tactical Ops|gamespy1|port=7777,port_query_offset=1 tacticalops|Tactical Ops|gamespy1|port=7777,port_query_offset=1
teamfactor|Team Factor|gamespy1|port_query=57778 teamfactor|Team Factor|gamespy1|port_query=57778
tfc|Team Fortress Classic|valve tfc|Team Fortress Classic|valve|port=27015
tf2|Team Fortress 2|valve tf2|Team Fortress 2|valve|port=27015
teamspeak2|Teamspeak 2|teamspeak2|port=8767,port_query=51234 teamspeak2|Teamspeak 2|teamspeak2|port=8767
teamspeak3|Teamspeak 3|teamspeak3|port=9987,port_query=10011|doc_notes=teamspeak3 teamspeak3|Teamspeak 3|teamspeak3|port=9987|doc_notes=teamspeak3
terminus|Terminus|gamespy1|port_query=12286 terminus|Terminus|gamespy1|port_query=12286
terraria|Terraria|terraria|port=7777,port_query_offset=101|doc_notes=terraria terraria|Terraria|terraria|port=7777,port_query_offset=101|doc_notes=terraria
thps3|Tony Hawk's Pro Skater 3|gamespy1|port_query=6500 thps3|Tony Hawk's Pro Skater 3|gamespy1|port_query=6500
thps4|Tony Hawk's Pro Skater 4|gamespy1|port_query=6500 thps4|Tony Hawk's Pro Skater 4|gamespy1|port_query=6500
thu2|Tony Hawk's Underground 2|gamespy1|port_query=5153 thu2|Tony Hawk's Underground 2|gamespy1|port_query=5153
towerunite|Tower Unite|valve towerunite|Tower Unite|valve|port=27015
trackmania2|Trackmania 2|nadeo|port=2350,port_query=5000|doc_notes=nadeo-shootmania--trackmania--etc trackmania2|Trackmania 2|nadeo|port=2350,port_query=5000|doc_notes=nadeo-shootmania--trackmania--etc
trackmaniaforever|Trackmania Forever|nadeo|port=2350,port_query=5000|doc_notes=nadeo-shootmania--trackmania--etc trackmaniaforever|Trackmania Forever|nadeo|port=2350,port_query=5000|doc_notes=nadeo-shootmania--trackmania--etc
tremulous|Tremulous|quake3|port_query=30720 tremulous|Tremulous|quake3|port_query=30720
@ -292,5 +291,5 @@ wheeloftime|Wheel of Time|gamespy1|port=7777,port_query_offset=1
wolfenstein2009|Wolfenstein 2009|doom3|port=27666 wolfenstein2009|Wolfenstein 2009|doom3|port=27666
wolfensteinet|Wolfenstein: Enemy Territory|quake3|port_query=27960 wolfensteinet|Wolfenstein: Enemy Territory|quake3|port_query=27960
xpandrally|Xpand Rally|ase|port=28015,port_query_offset=123 xpandrally|Xpand Rally|ase|port=28015,port_query_offset=123
zombiemaster|Zombie Master|valve zombiemaster|Zombie Master|valve|port=27015
zps|Zombie Panic: Source|valve zps|Zombie Panic: Source|valve|port=27015

View file

@ -62,7 +62,8 @@ class QueryRunner {
attempts.push({ attempts.push({
...defaultOptions, ...defaultOptions,
...gameOptions, ...gameOptions,
...userOptions ...userOptions,
port: gameOptions.port + (gameQueryPortOffset || 0)
}); });
} else { } else {
throw new Error("Could not determine port to query. Did you provide a port or gameid?"); throw new Error("Could not determine port to query. Did you provide a port or gameid?");

View file

@ -9,7 +9,7 @@ class BuildAndShoot extends Core {
let m; let m;
m = body.match(/status server for (.*?)\r|\n/); m = body.match(/status server for (.*?)\.?(\r|\n)/);
if(m) state.name = m[1]; if(m) state.name = m[1];
m = body.match(/Current uptime: (\d+)/); m = body.match(/Current uptime: (\d+)/);
@ -24,6 +24,11 @@ class BuildAndShoot extends Core {
state.maxplayers = m[2]; state.maxplayers = m[2];
} }
m = body.match(/aos:\/\/[0-9]+:[0-9]+/);
if (m) {
state.connect = m[0];
}
const $ = cheerio.load(body); const $ = cheerio.load(body);
$('#playerlist tbody tr').each((i,tr) => { $('#playerlist tbody tr').each((i,tr) => {
if (!$(tr).find('td').first().attr('colspan')) { if (!$(tr).find('td').first().attr('colspan')) {

View file

@ -92,7 +92,7 @@ class Core extends EventEmitter {
state.notes = this.options.notes; state.notes = this.options.notes;
// because lots of servers prefix with spaces to try to appear first // because lots of servers prefix with spaces to try to appear first
state.name = state.name.trim(); state.name = (state.name || '').trim();
state.duration = Date.now() - startMillis; state.duration = Date.now() - startMillis;
if (!('connect' in state)) { if (!('connect' in state)) {
@ -185,9 +185,9 @@ class Core extends EventEmitter {
* @param {function(Socket):Promise<T>} fn * @param {function(Socket):Promise<T>} fn
* @returns {Promise<T>} * @returns {Promise<T>}
*/ */
async withTcp(fn) { async withTcp(fn, port) {
const address = this.options.address; const address = this.options.address;
const port = this.options.port; if (!port) port = this.options.port;
this.assertValidPort(port); this.assertValidPort(port);
let socket, connectionTimeout; let socket, connectionTimeout;
@ -342,10 +342,9 @@ class Core extends EventEmitter {
log(() => params.uri + " HTTP-->"); log(() => params.uri + " HTTP-->");
requestPromise requestPromise
.then((response) => log(params.uri + " <--HTTP " + response.statusCode)) .then((response) => log(params.uri + " <--HTTP " + response.statusCode))
.catch(() => { .catch(() => {});
}); });
}); const wrappedPromise = requestPromise.then(response => response.body);
const wrappedPromise = promise.then(response => response.body);
return await Promise.race([wrappedPromise, this.abortedPromise]); return await Promise.race([wrappedPromise, this.abortedPromise]);
} finally { } finally {
requestPromise && requestPromise.cancel(); requestPromise && requestPromise.cancel();

View file

@ -71,7 +71,7 @@ class Doom3 extends Core {
} }
state.raw.osmask = reader.uint(4); state.raw.osmask = reader.uint(4);
if(isEtqw) { if (isEtqw) {
state.raw.ranked = reader.uint(1); state.raw.ranked = reader.uint(1);
state.raw.timeleft = reader.uint(4); state.raw.timeleft = reader.uint(4);
state.raw.gamestate = reader.uint(1); state.raw.gamestate = reader.uint(1);
@ -85,10 +85,12 @@ class Doom3 extends Core {
} }
} }
if(state.raw.si_name) state.name = state.raw.si_name; if (state.raw.si_name) state.name = state.raw.si_name;
if(state.raw.si_map) state.map = state.raw.si_map; if (state.raw.si_map) state.map = state.raw.si_map;
if(state.raw.si_maxplayers) state.maxplayers = parseInt(state.raw.si_maxplayers); if (state.raw.si_maxplayers) state.maxplayers = parseInt(state.raw.si_maxplayers);
if(state.raw.si_usepass === '1') state.password = true; if (state.raw.si_maxPlayers) state.maxplayers = parseInt(state.raw.si_maxplayers);
if (state.raw.si_usepass === '1') state.password = true;
if (state.raw.si_needPass === '1') state.password = true;
if (this.options.port === 27733) state.gamePort = 3074; // etqw has a different query and game port if (this.options.port === 27733) state.gamePort = 3074; // etqw has a different query and game port
} }

View file

@ -23,7 +23,7 @@ class Ffow extends Valve {
state.raw.gamemode = reader.string(); state.raw.gamemode = reader.string();
state.raw.description = reader.string(); state.raw.description = reader.string();
state.raw.version = reader.string(); state.raw.version = reader.string();
state.raw.port = reader.uint(2); state.gamePort = reader.uint(2);
state.raw.numplayers = reader.uint(1); state.raw.numplayers = reader.uint(1);
state.maxplayers = reader.uint(1); state.maxplayers = reader.uint(1);
state.raw.listentype = String.fromCharCode(reader.uint(1)); state.raw.listentype = String.fromCharCode(reader.uint(1));

View file

@ -15,6 +15,7 @@ class Gamespy1 extends Core {
if ('mapname' in state.raw) state.map = state.raw.mapname; if ('mapname' in state.raw) state.map = state.raw.mapname;
if (this.trueTest(state.raw.password)) state.password = true; if (this.trueTest(state.raw.password)) state.password = true;
if ('maxplayers' in state.raw) state.maxplayers = parseInt(state.raw.maxplayers); if ('maxplayers' in state.raw) state.maxplayers = parseInt(state.raw.maxplayers);
if ('hostport' in state.raw) state.gamePort = parseInt(state.raw.hostport);
} }
{ {
const data = await this.sendPacket('rules'); const data = await this.sendPacket('rules');

View file

@ -18,10 +18,11 @@ class Gamespy2 extends Core {
if (!key) break; if (!key) break;
state.raw[key] = value; state.raw[key] = value;
} }
if('hostname' in state.raw) state.name = state.raw.hostname; if ('hostname' in state.raw) state.name = state.raw.hostname;
if('mapname' in state.raw) state.map = state.raw.mapname; if ('mapname' in state.raw) state.map = state.raw.mapname;
if(this.trueTest(state.raw.password)) state.password = true; if (this.trueTest(state.raw.password)) state.password = true;
if('maxplayers' in state.raw) state.maxplayers = parseInt(state.raw.maxplayers); if ('maxplayers' in state.raw) state.maxplayers = parseInt(state.raw.maxplayers);
if ('hostport' in state.raw) state.gamePort = parseInt(state.raw.hostport);
} }
// Parse players // Parse players
@ -57,10 +58,6 @@ class Gamespy2 extends Core {
player.name = stripColor(player.name); player.name = stripColor(player.name);
} }
} }
if (state.raw.hostport) {
state.gamePort = parseInt(state.raw.hostport);
}
} }
async sendPacket(type) { async sendPacket(type) {

View file

@ -109,11 +109,12 @@ class Gamespy3 extends Core {
// Turn all that raw state into something useful // Turn all that raw state into something useful
if('hostname' in state.raw) state.name = state.raw.hostname; if ('hostname' in state.raw) state.name = state.raw.hostname;
else if('servername' in state.raw) state.name = state.raw.servername; else if('servername' in state.raw) state.name = state.raw.servername;
if('mapname' in state.raw) state.map = state.raw.mapname; if ('mapname' in state.raw) state.map = state.raw.mapname;
if(state.raw.password === '1') state.password = true; if (state.raw.password === '1') state.password = true;
if('maxplayers' in state.raw) state.maxplayers = parseInt(state.raw.maxplayers); if ('maxplayers' in state.raw) state.maxplayers = parseInt(state.raw.maxplayers);
if ('hostport' in state.raw) state.gamePort = parseInt(state.raw.hostport);
if('' in state.raw.playerTeamInfo) { if('' in state.raw.playerTeamInfo) {
for (const playerInfo of state.raw.playerTeamInfo['']) { for (const playerInfo of state.raw.playerTeamInfo['']) {

View file

@ -6,6 +6,10 @@ class Hexen2 extends Quake1 {
this.sendHeader = '\xFFstatus\x0a'; this.sendHeader = '\xFFstatus\x0a';
this.responseHeader = '\xffn'; this.responseHeader = '\xffn';
} }
async run(state) {
await super.run(state);
state.gamePort = this.options.port - 50;
}
} }
module.exports = Hexen2; module.exports = Hexen2;

View file

@ -16,6 +16,7 @@ class Kspdmp extends Core {
} }
state.name = json.server_name; state.name = json.server_name;
state.maxplayers = json.max_players; state.maxplayers = json.max_players;
state.gamePort = json.port;
if (json.players) { if (json.players) {
const split = json.players.split(', '); const split = json.players.split(', ');
for (const name of split) { for (const name of split) {

View file

@ -20,6 +20,7 @@ class M2mp extends Core {
state.maxplayers = this.readString(reader); state.maxplayers = this.readString(reader);
state.raw.gamemode = this.readString(reader); state.raw.gamemode = this.readString(reader);
state.password = !!reader.uint(1); state.password = !!reader.uint(1);
state.gamePort = this.options.port - 1;
while(!reader.done()) { while(!reader.done()) {
const name = this.readString(reader); const name = this.readString(reader);

View file

@ -1,11 +1,6 @@
const Core = require('./core'); const Core = require('./core');
class Mumble extends Core { class Mumble extends Core {
constructor() {
super();
this.options.socketTimeout = 5000;
}
async run(state) { async run(state) {
const json = await this.withTcp(async socket => { const json = await this.withTcp(async socket => {
return await this.tcpSend(socket, 'json', (buffer) => { return await this.tcpSend(socket, 'json', (buffer) => {
@ -24,6 +19,7 @@ class Mumble extends Core {
state.raw = json; state.raw = json;
state.name = json.name; state.name = json.name;
state.gamePort = json.x_gtmurmur_connectport || 64738;
let channelStack = [state.raw.root]; let channelStack = [state.raw.root];
while(channelStack.length) { while(channelStack.length) {

View file

@ -41,6 +41,10 @@ class Nadeo extends Core {
state.raw.nextmapUid = results.UId; state.raw.nextmapUid = results.UId;
} }
if (this.options.port === 5000) {
state.gamePort = 2350;
}
state.raw.players = await this.methodCall(client, 'GetPlayerList', 10000, 0); state.raw.players = await this.methodCall(client, 'GetPlayerList', 10000, 0);
for (const player of state.raw.players) { for (const player of state.raw.players) {
state.players.push({ state.players.push({

View file

@ -2,6 +2,8 @@ const Core = require('./core');
class Teamspeak2 extends Core { class Teamspeak2 extends Core {
async run(state) { async run(state) {
const queryPort = this.options.teamspeakQueryPort || 51234;
await this.withTcp(async socket => { await this.withTcp(async socket => {
{ {
const data = await this.sendCommand(socket, 'sel '+this.options.port); const data = await this.sendCommand(socket, 'sel '+this.options.port);
@ -55,7 +57,7 @@ class Teamspeak2 extends Core {
state.raw.channels.push(channel); state.raw.channels.push(channel);
} }
} }
}); }, queryPort);
} }
async sendCommand(socket,cmd) { async sendCommand(socket,cmd) {

View file

@ -2,6 +2,8 @@ const Core = require('./core');
class Teamspeak3 extends Core { class Teamspeak3 extends Core {
async run(state) { async run(state) {
const queryPort = this.options.teamspeakQueryPort || 10011;
await this.withTcp(async socket => { await this.withTcp(async socket => {
{ {
const data = await this.sendCommand(socket, 'use port='+this.options.port, true); const data = await this.sendCommand(socket, 'use port='+this.options.port, true);
@ -31,7 +33,7 @@ class Teamspeak3 extends Core {
const data = await this.sendCommand(socket, 'channellist -topic'); const data = await this.sendCommand(socket, 'channellist -topic');
state.raw.channels = data; state.raw.channels = data;
} }
}); }, queryPort);
} }
async sendCommand(socket,cmd,raw) { async sendCommand(socket,cmd,raw) {

View file

@ -18,7 +18,7 @@ class Terraria extends Core {
} }
state.name = json.name; state.name = json.name;
state.raw.port = json.port; state.gamePort = json.port;
state.raw.numplayers = json.playercount; state.raw.numplayers = json.playercount;
} }
} }

View file

@ -11,7 +11,7 @@ class Unreal2 extends Core {
const reader = this.reader(b); const reader = this.reader(b);
state.raw.serverid = reader.uint(4); state.raw.serverid = reader.uint(4);
state.raw.ip = this.readUnrealString(reader); state.raw.ip = this.readUnrealString(reader);
state.raw.port = reader.uint(4); state.gamePort = reader.uint(4);
state.raw.queryport = reader.uint(4); state.raw.queryport = reader.uint(4);
state.name = this.readUnrealString(reader, true); state.name = this.readUnrealString(reader, true);
state.map = this.readUnrealString(reader, true); state.map = this.readUnrealString(reader, true);

View file

@ -5,8 +5,6 @@ class Valve extends Core {
constructor() { constructor() {
super(); super();
this.options.port = 27015;
// legacy goldsrc info response -- basically not used by ANYTHING now, // legacy goldsrc info response -- basically not used by ANYTHING now,
// as most (all?) goldsrc servers respond with the source info reponse // as most (all?) goldsrc servers respond with the source info reponse
// delete in a few years if nothing ends up using it anymore // delete in a few years if nothing ends up using it anymore
@ -28,6 +26,7 @@ class Valve extends Core {
} }
async run(state) { async run(state) {
if (!this.options.port) this.options.port = 27015;
await this.queryInfo(state); await this.queryInfo(state);
await this.queryChallenge(); await this.queryChallenge();
await this.queryPlayers(state); await this.queryPlayers(state);
@ -93,7 +92,7 @@ class Valve extends Core {
} }
state.raw.version = reader.string(); state.raw.version = reader.string();
const extraFlag = reader.uint(1); const extraFlag = reader.uint(1);
if(extraFlag & 0x80) state.raw.port = reader.uint(2); if(extraFlag & 0x80) state.gamePort = reader.uint(2);
if(extraFlag & 0x10) state.raw.steamid = reader.uint(8); if(extraFlag & 0x10) state.raw.steamid = reader.uint(8);
if(extraFlag & 0x40) { if(extraFlag & 0x40) {
state.raw.sourcetvport = reader.uint(2); state.raw.sourcetvport = reader.uint(2);