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

@ -3,6 +3,7 @@
## 5.X.Y ## 5.X.Y
* Feat: Replaced `punycode` package usage with `url.domainToASCII` (#630). * Feat: Replaced `punycode` package usage with `url.domainToASCII` (#630).
* Feat: World of Padman (2007) - Added support (#636) * Feat: World of Padman (2007) - Added support (#636)
* Feat: Update Soldat protocol (#642)
## 5.1.3 ## 5.1.3
* Fix: `Deus Ex` using the wrong protocol (#621) * Fix: `Deus Ex` using the wrong protocol (#621)

View file

@ -267,7 +267,7 @@
| sinepisodes | SiN Episodes | [Valve Protocol](#valve) | | sinepisodes | SiN Episodes | [Valve Protocol](#valve) |
| sof | Soldier of Fortune | | | sof | Soldier of Fortune | |
| sof2 | Soldier of Fortune 2 | | | sof2 | Soldier of Fortune 2 | |
| soldat | Soldat | | | soldat | Soldat | [Notes](#soldat) |
| sotf | Sons Of The Forest | [Valve Protocol](#valve) | | sotf | Sons Of The Forest | [Valve Protocol](#valve) |
| soulmask | Soulmask | [Valve Protocol](#valve) | | soulmask | Soulmask | [Valve Protocol](#valve) |
| spaceengineers | Space Engineers | [Valve Protocol](#valve) | | spaceengineers | Space Engineers | [Valve Protocol](#valve) |
@ -490,3 +490,6 @@ EOS does not provide players data.
### <a name="palworld"></a>Palworld ### <a name="palworld"></a>Palworld
Palworld support can be unstable, the devs mention the api is currently experimental. Palworld support can be unstable, the devs mention the api is currently experimental.
To query Palworld servers, the `RESTAPIEnabled` setting must be `True` in the configuration file, and you need to pass the `username` (currently always `admin`) and the `adminpassword` (from the server config) as the `password` parameter. To query Palworld servers, the `RESTAPIEnabled` setting must be `True` in the configuration file, and you need to pass the `username` (currently always `admin`) and the `adminpassword` (from the server config) as the `password` parameter.
### <a name="soldat"></a>Soldat
Requires `Allow_Download` and `Logging` to be `1` in the server config.

View file

@ -2648,9 +2648,12 @@ export const games = {
name: 'Soldat', name: 'Soldat',
release_year: 2002, release_year: 2002,
options: { options: {
port: 13073, port: 23073,
port_query_offset: 123, port_query_offset: 10,
protocol: 'ase' protocol: 'soldat'
},
extra: {
doc_notes: 'soldat'
} }
}, },
sof: { sof: {

View file

@ -62,6 +62,7 @@ import xonotic from './xonotic.js'
import altvmp from './altvmp.js' import altvmp from './altvmp.js'
import vintagestorymaster from './vintagestorymaster.js' import vintagestorymaster from './vintagestorymaster.js'
import vintagestory from './vintagestory.js' import vintagestory from './vintagestory.js'
import soldat from './soldat.js'
export { export {
armagetron, ase, asa, assettocorsa, battlefield, buildandshoot, cs2d, discord, doom3, eco, epic, factorio, farmingsimulator, ffow, 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, 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, savage2, starmade, starsiege, teamspeak2, teamspeak3, terraria, tribes1, tribes1master, unreal2, ut3, valve,
vcmp, ventrilo, warsow, eldewrito, beammpmaster, beammp, dayz, theisleevrima, xonotic, altvmp, vintagestorymaster, 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*(.+)/, '')
}
}