feat: Add Satisfactory support (#645)

* feat: Added Satisfactory Protocol and Support

* fix: Reordering Alphabetically

* Further Updates based on Feedback

* Removed Duplicate Code

* Adding rejectUnauthorized option for Satisfactory

* Move rejectUnauthorized back to Protocol

* Adding Doc Notes for Satisfactory

* Made Docs Clearer
This commit is contained in:
Smidy 2024-10-01 20:23:07 +13:00 committed by GitHub
parent 02ee0c262b
commit b3947164d3
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 103 additions and 4 deletions

View file

@ -39,7 +39,9 @@ import quake2 from './quake2.js'
import quake3 from './quake3.js'
import rfactor from './rfactor.js'
import samp from './samp.js'
import satisfactory from './satisfactory.js'
import savage2 from './savage2.js'
import soldat from './soldat.js'
import starmade from './starmade.js'
import starsiege from './starsiege.js'
import teamspeak2 from './teamspeak2.js'
@ -63,13 +65,11 @@ 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,
fivem, gamespy1, gamespy2, gamespy3, geneshift, goldsrc, gtasao, hexen2, jc2mp, kspdmp, mafia2mp, mafia2online, minecraft,
minecraftbedrock, minecraftvanilla, minetest, mumble, mumbleping, nadeo, openttd, palworld, quake1, quake2, quake3, rfactor, ragemp, samp,
savage2, starmade, starsiege, teamspeak2, teamspeak3, terraria, toxikk, tribes1, tribes1master, unreal2, ut3, valve,
vcmp, ventrilo, warsow, eldewrito, beammpmaster, beammp, dayz, theisleevrima, xonotic, altvmp, vintagestorymaster,
vintagestory, soldat
satisfactory, soldat, savage2, starmade, starsiege, teamspeak2, teamspeak3, terraria, toxikk, tribes1, tribes1master, unreal2, ut3, valve,
vcmp, ventrilo, warsow, eldewrito, beammpmaster, beammp, dayz, theisleevrima, xonotic, altvmp, vintagestorymaster, vintagestory
}

82
protocols/satisfactory.js Normal file
View file

@ -0,0 +1,82 @@
import Core from './core.js'
export default class satisfactory extends Core {
constructor () {
super()
// Don't use the tcp ping probing
this.usedTcp = true
}
async run (state) {
/**
* To get information about the Satisfactory game server, you need to first obtain a client authenticationToken.
* https://satisfactory.wiki.gg/wiki/Dedicated_servers/HTTPS_API
*/
const tokenRequestJson = {
function: 'PasswordlessLogin',
data: {
MinimumPrivilegeLevel: 'Client'
}
}
const queryJson = {
function: 'QueryServerState'
}
let headers = {
'Content-Type': 'application/json'
}
/**
* Satisfactory servers unless specified use self-signed certificates for the HTTPS API.
* Because of this we default the `rejectUnauthorized` flag to `false` unless set.
* For more information see GAMES_LIST.md
*/
if (!this.options.rejectUnauthorized) this.options.rejectUnauthorized = false
let tokenRequestResponse = await this.queryInfo(tokenRequestJson, headers)
headers.Authorization = `Bearer ${tokenRequestResponse.data.authenticationToken}`
let queryResponse = await this.queryInfo(queryJson, headers)
/**
* Satisfactory API cannot pull Server Name at the moment, see QA and vote for fix here
* https://questions.satisfactorygame.com/post/66ebebad772a987f4a8b9ef8
*/
state.numplayers = queryResponse.data.serverGameState.numConnectedPlayers
state.maxplayers = queryResponse.data.serverGameState.playerLimit
state.raw = queryResponse
}
async queryInfo (json, headers) {
const url = `https://${this.options.host}:${this.options.port}/api/v1/`
this.logger.debug(`POST: ${url}`)
const response = await this.request({
url,
json,
headers,
method: 'POST',
responseType: 'json',
https: {
minVersion: 'TLSv1.2',
rejectUnauthorized: this.options.rejectUnauthorized
}
})
if (response.data == null) {
throw new Error('Unable to retrieve data from server')
} else {
return response
}
}
}