mirror of
https://github.com/tribufu/node-gamedig
synced 2026-06-01 09:42:41 +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
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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.
|
||||||
|
|
|
||||||
|
|
@ -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: {
|
||||||
|
|
|
||||||
|
|
@ -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
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