node-gamedig/protocols/altvmp.js
James Causon bdb819d0f8
feat: Add support for AltvMP (#588)
* feat: Add Minetest support using serverlist

* Allow for connect to be assigned,

* Add serverId to the string args

* Add altvmp implementation

* Added altv to games.

* Add changelog entry

* Update CHANGELOG.md with state.connect
2024-07-17 18:10:06 +03:00

64 lines
1.7 KiB
JavaScript

import Core from './core.js'
export default class altvmp extends Core {
constructor() {
super()
this.usedTcp = true
}
async getServerFromMasterList() {
const targetID = `${this.options.host}:${this.options.port}`
const results = await this.request({
url: 'https://api.alt-mp.com/servers',
responseType: 'json'
})
if (results == null) {
throw new Error('Unable to retrieve master server list')
}
const serverInfo = results.find((server) => {
// If the server uses a CDN, there could be occasional paths in the address, so we are checking for them.
// If the server does not use a CDN, there will be no paths in the address and direct comparison will work.
const address = server.useCdn
? server.address
: server.address.replace(/(https?:\/\/)?\/?/g, '')
return address === targetID
})
return serverInfo
}
async getServerById(targetID) {
const serverInfo = await this.request({
url: `https://api.alt-mp.com/servers/${targetID}`,
responseType: 'json'
})
if (serverInfo == null) {
throw new Error('Unable to retrieve server info')
}
return serverInfo
}
async run(state) {
const serverInfo = this.options.serverId
? await this.getServerById(this.options.serverId)
: await this.getServerFromMasterList()
if (!serverInfo) {
throw new Error('No server info was found.')
}
state.name = serverInfo.name
state.numplayers = serverInfo.playersCount
state.maxplayers = serverInfo.maxPlayersCount
state.password = serverInfo.passworded
state.version = serverInfo.version
state.connect = `altv://${serverInfo.address}`
state.raw = serverInfo
}
}