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:
CosminPerRam 2024-09-25 18:56:15 +03:00 committed by GitHub
parent 675c5ee4bc
commit c77ca299b0
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 58 additions and 5 deletions

View file

@ -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
View 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*(.+)/, '')
}
}