mirror of
https://github.com/tribufu/node-gamedig
synced 2026-05-18 09:35:50 +00:00
feat: update Soldat protocol (#642)
* feat: add Soldat support * feat: update protocol in games.js and CHANGELOG * feat: add gamemode in the raw object * remove debug console log * misspell * docs: add server config requirements * fix games list formatting issue * fix: players list
This commit is contained in:
parent
675c5ee4bc
commit
c77ca299b0
5 changed files with 58 additions and 5 deletions
|
|
@ -62,6 +62,7 @@ import xonotic from './xonotic.js'
|
|||
import altvmp from './altvmp.js'
|
||||
import vintagestorymaster from './vintagestorymaster.js'
|
||||
import vintagestory from './vintagestory.js'
|
||||
import soldat from './soldat.js'
|
||||
|
||||
export {
|
||||
armagetron, ase, asa, assettocorsa, battlefield, buildandshoot, cs2d, discord, doom3, eco, epic, factorio, farmingsimulator, ffow,
|
||||
|
|
@ -69,5 +70,5 @@ export {
|
|||
minecraftbedrock, minecraftvanilla, minetest, mumble, mumbleping, nadeo, openttd, palworld, quake1, quake2, quake3, rfactor, ragemp, samp,
|
||||
savage2, starmade, starsiege, teamspeak2, teamspeak3, terraria, tribes1, tribes1master, unreal2, ut3, valve,
|
||||
vcmp, ventrilo, warsow, eldewrito, beammpmaster, beammp, dayz, theisleevrima, xonotic, altvmp, vintagestorymaster,
|
||||
vintagestory
|
||||
vintagestory, soldat
|
||||
}
|
||||
|
|
|
|||
45
protocols/soldat.js
Normal file
45
protocols/soldat.js
Normal file
|
|
@ -0,0 +1,45 @@
|
|||
import Core from './core.js'
|
||||
|
||||
const extractValue = (text, regex, defaultValue, parser = (val) => val) => {
|
||||
const match = text.match(regex)
|
||||
return match ? parser(match[1] || defaultValue) : defaultValue
|
||||
}
|
||||
|
||||
export default class soldat extends Core {
|
||||
async run (state) {
|
||||
const data = await this.withTcp(async socket => {
|
||||
return await this.tcpSend(socket, 'STARTFILES\r\nlogs/gamestat.txt\r\nENDFILES\r\n', (data) => {
|
||||
const asString = data.toString()
|
||||
if (asString.endsWith('\r\n') && !asString.endsWith('ENDFILES\r\n')) {
|
||||
return undefined
|
||||
}
|
||||
return data
|
||||
})
|
||||
})
|
||||
|
||||
const string = data.toString()
|
||||
|
||||
state.numplayers = extractValue(string, /Players:\s*(\d+)/, 0, Number)
|
||||
state.map = extractValue(string, /Map:\s*(.+)/, '')
|
||||
|
||||
const lines = string.trim().split('\n')
|
||||
const playersIndex = lines.findIndex(line => line.startsWith('Players list'))
|
||||
|
||||
if (playersIndex > -1) {
|
||||
for (let i = playersIndex + 1; i < lines.length - 1; i += 5) {
|
||||
state.players.push({
|
||||
name: lines[i].trim(),
|
||||
raw: {
|
||||
kills: parseInt(lines[i + 1].trim()),
|
||||
deaths: parseInt(lines[i + 2].trim()),
|
||||
team: parseInt(lines[i + 3].trim()),
|
||||
ping: parseInt(lines[i + 4].trim())
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
state.raw.response = string
|
||||
state.raw.gamemode = extractValue(string, /Gamemode:\s*(.+)/, '')
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue