frost-api
Version:
A wrapper for Rust Console Edition (RCE) that allows you to use the websocket and API from G-Portal.
799 lines • 39.2 kB
JavaScript
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const constants_1 = require("../constants");
const ServerUtils_1 = __importDefault(require("../util/ServerUtils"));
const CommandHandler_1 = __importDefault(require("./CommandHandler"));
const helper_1 = __importDefault(require("../helper"));
class ServerManager {
_manager;
_auth;
_socket;
_servers = new Map();
constructor(manager, auth, socket) {
this._manager = manager;
this._auth = auth;
this._socket = socket;
}
/**
*
* @param opts {ServerOptions[]} - The server options
* @returns {Promise<void>} - Resolves once all servers have been added
* @description Adds multiple servers to the manager
*
* @example
* ```js
* await manager.servers.addMany([
* {
* identifier: "my-server-id",
* serverId: 1234567,
* region: "EU",
* playerRefreshing: true,
* radioRefreshing: true,
* extendedEventRefreshing: true,
* intents: [RCEIntent.All]
* },
* {
* identifier: "my-server-id-2",
* serverId: 7654321,
* region: "US",
* playerRefreshing: true,
* radioRefreshing: true,
* extendedEventRefreshing: true,
* intents: [RCEIntent.All]
* }
* ]);
* ```
*/
async addMany(opts) {
await Promise.all(opts.map((opt) => this.add(opt)));
}
/**
*
* @param opts {ServerOptions} - The server options
* @returns {Promise<boolean>} - Whether the server was added successfully
* @description Adds a server to the manager
*
* @example
* ```js
* const server = await manager.servers.add({
* identifier: "my-server-id",
* serverId: 1234567,
* region: "EU",
* playerRefreshing: true,
* radioRefreshing: true,
* extendedEventRefreshing: true,
* intents: [RCEIntent.All]
* });
* ```
*/
async add(opts) {
this._manager.logger.debug(`Adding Server: ${opts.identifier}`);
if (!Array.isArray(opts.serverId) || !opts.serverId[1]) {
opts.serverId = [
Array.isArray(opts.serverId) ? opts.serverId[0] : opts.serverId,
];
if (!Number(opts.serverId[0]) ||
opts.serverId[0].toString().length !== 7) {
ServerUtils_1.default.error(this._manager, `[${opts.identifier}] Failed To Add Server: Invalid SID (Incorrect Length)`);
return false;
}
const sid = await this.fetchId(opts.identifier, opts.serverId[0], opts.region);
if (sid) {
opts.serverId.push(sid);
}
}
if (!opts.serverId[1]) {
ServerUtils_1.default.error(this._manager, `[${opts.identifier}] Failed To Add Server: Invalid SID`);
return false;
}
const status = await this.fetchStatus(opts.identifier, opts.serverId[1], opts.region);
if (!status) {
ServerUtils_1.default.error(this._manager, `[${opts.identifier}] Failed To Add Server: No Status Information`);
return false;
}
if (status === "SUSPENDED") {
ServerUtils_1.default.error(this._manager, `[${opts.identifier}] Failed To Add Server: Suspended`);
return false;
}
this._servers.set(opts.identifier, {
identifier: opts.identifier,
serverId: opts.serverId,
region: opts.region,
intervals: {
playerRefreshing: {
enabled: opts.playerRefreshing ?? false,
interval: opts.playerRefreshing
? setInterval(() => {
const s = this.get(opts.identifier);
if (s?.status === "RUNNING") {
this.updatePlayers(opts.identifier);
}
}, 60000)
: undefined,
},
radioRefreshing: {
enabled: opts.radioRefreshing ?? false,
interval: opts.radioRefreshing
? setInterval(() => {
const s = this.get(opts.identifier);
if (s?.status === "RUNNING") {
this.updateBroadcasters(opts.identifier);
}
}, 60000)
: undefined,
},
extendedEventRefreshing: {
enabled: opts.extendedEventRefreshing ?? false,
interval: opts.extendedEventRefreshing
? setInterval(() => {
const s = this.get(opts.identifier);
if (s?.status === "RUNNING") {
this.fetchGibs(opts.identifier);
}
}, 60000)
: undefined,
},
timeRefreshing: {
enabled: opts.timeRefreshing ?? false,
interval: opts.timeRefreshing
? setInterval(() => {
const s = this.get(opts.identifier);
if (s?.status === "RUNNING") {
this.ServerTime(opts.identifier);
}
}, 60000)
: undefined,
},
fpsRefreshing: {
enabled: opts.fpsRefreshing ?? false,
interval: opts.fpsRefreshing
? setInterval(() => {
const s = this.get(opts.identifier);
if (s?.status === "RUNNING") {
this.ServerFPS(opts.identifier);
}
}, 60000)
: undefined,
},
},
flags: [],
state: opts.state ?? [],
status: status,
players: [],
frequencies: [],
intents: opts.intents,
});
const server = this._servers.get(opts.identifier);
this._socket.addServer(server);
this._manager.logger.debug(`[${server.identifier}] Server Status: ${status}`);
if (status === "RUNNING") {
await ServerUtils_1.default.setReady(this._manager, server, true);
if (opts.playerRefreshing) {
await this.updatePlayers(opts.identifier);
}
if (opts.radioRefreshing) {
await this.updateBroadcasters(opts.identifier);
}
if (opts.extendedEventRefreshing) {
await this.fetchGibs(opts.identifier);
}
if (opts.timeRefreshing) {
await this.ServerTime(opts.identifier);
}
if (opts.fpsRefreshing) {
await this.ServerFPS(opts.identifier);
}
}
return true;
}
/**
*
* @param server {RustServer} - The server to update
* @returns {void}
* @description Updates a server
*
* @example
* ```js
* manager.servers.update(server);
* ```
*/
update(server) {
this._manager.logger.debug(`[${server.identifier}] Updating Server`);
this._servers.set(server.identifier, server);
}
/**
* @returns {void}
* @description Removes all servers from the manager
*
* @example
* ```js
* manager.servers.removeAll();
* ```
*/
removeAll() {
this._servers.forEach((server) => this.remove(server));
}
/**
*
* @param identifiers {string[]} - The server identifiers to remove
* @returns {void}
* @description Removes multiple servers from the manager
*
* @example
* ```js
* manager.servers.removeMany(["my-server-id", "my-server-id-2"]);
* ```
*/
removeMany(identifiers) {
identifiers.forEach((identifier) => {
const server = this.get(identifier);
if (server) {
this.remove(server);
}
});
}
/**
*
* @param server {RustServer} - The server to remove
* @returns {void}
* @description Removes a server from the manager
*
* @example
* ```js
* manager.servers.remove(server);
* ```
*/
remove(server) {
this._manager.logger.debug(`[${server.identifier}] Removing Server`);
clearInterval(server.intervals.playerRefreshing.interval);
clearInterval(server.intervals.radioRefreshing.interval);
clearInterval(server.intervals.extendedEventRefreshing.interval);
this._socket.removeServer(server);
this._servers.delete(server.identifier);
}
/**
*
* @param identifier {string} - The server identifier
* @returns {RustServer | undefined} - The server
* @description Gets a server by its identifier
*
* @example
* ```js
* const server = manager.servers.get("my-server-id");
* ```
*/
get(identifier) {
return this._servers.get(identifier);
}
/**
*
* @returns {RustServer[]} - All servers
* @description Gets all servers
*
* @example
* ```js
* const servers = manager.servers.getAll();
* ```
*/
getAll() {
return this._servers;
}
/**
*
* @param identifier - The server identifier
* @param rawHostname - Whether to return the raw hostname
* @returns {Promise<RustServerInformation | null>} - The server information
*
* @example
* ```js
* const info = await manager.servers.info("my-server-id");
* ```
*
* @example
* ```js
* const info = await manager.servers.info("my-server-id", true);
* ```
*/
async info(identifier, rawHostname = false) {
const server = this.get(identifier);
if (!server) {
ServerUtils_1.default.error(this._manager, `[${identifier}] Invalid Server`);
return null;
}
let retries = 0;
const maxRetries = 5;
while (retries < maxRetries) {
const info = await this.command(server.identifier, "serverinfo", true);
if (info?.response) {
const data = helper_1.default.cleanOutput(info.response, true, rawHostname);
return data;
}
retries++;
this._manager.logger.warn(`[${identifier}] Retry ${retries}/${maxRetries}: Failed to Fetch Server Info`);
await new Promise(resolve => setTimeout(resolve, retries * 2000));
}
ServerUtils_1.default.error(this._manager, "Failed To Fetch Server Info After 5 Retries", server);
return null;
}
/**
*
* @param identifier - The server identifier
* @param command - The command to send
* @param response - Whether to wait for a response
* @returns {Promise<CommandResponse>} - The command response
*
* @example
* ```js
* await manager.servers.command("my-server-id", "say Hello World!");
* ```
*
* @example
* ```js
* const response = await manager.servers.command("my-server-id", "getauthlevels", true);
* ```
*/
async command(identifier, command, response = false) {
const token = this._auth?.accessToken;
if (!token) {
ServerUtils_1.default.error(this._manager, `[${identifier}] Failed To Send Command: No Access Token`);
return { ok: false, error: "No Access Token" };
}
const server = this._servers.get(identifier);
if (!server) {
ServerUtils_1.default.error(this._manager, `[${identifier}] Failed To Send Command: Invalid Server`);
return { ok: false, error: "Invalid Server" };
}
if (server.status !== "RUNNING") {
this._manager.logger.warn(`[${identifier}] Failed To Send Command: Server Not Running`);
return { ok: false, error: "Server Not Running" };
}
this._manager.logger.debug(`[${identifier}] Sending Command: ${command}`);
const payload = {
operationName: "sendConsoleMessage",
variables: {
sid: server.serverId[1],
region: server.region,
message: command,
},
query: "mutation sendConsoleMessage($sid: Int!, $region: REGION!, $message: String!) {\n sendConsoleMessage(rsid: {id: $sid, region: $region}, message: $message) {\n ok\n __typename\n }\n}",
};
if (response) {
return new Promise(async (resolve, reject) => {
CommandHandler_1.default.add({
identifier,
command,
resolve,
reject,
});
try {
const response = await fetch(constants_1.GPortalRoutes.Api, {
method: "POST",
headers: {
"Content-Type": "application/json",
Authorization: `Bearer ${token}`,
},
body: JSON.stringify(payload),
});
if (!response.ok) {
ServerUtils_1.default.error(this._manager, `Failed To Send Command: HTTP ${response.status} ${response.statusText}`, server);
CommandHandler_1.default.remove(CommandHandler_1.default.get(identifier, command));
resolve({
ok: false,
error: `HTTP ${response.status} ${response.statusText}`,
});
}
const data = await response.json();
if (!data?.data?.sendConsoleMessage?.ok) {
ServerUtils_1.default.error(this._manager, "Failed To Send Command: AioRpcError", server);
CommandHandler_1.default.remove(CommandHandler_1.default.get(identifier, command));
resolve({
ok: false,
error: "AioRpcError",
});
}
const cmd = CommandHandler_1.default.get(identifier, command);
if (cmd) {
cmd.timeout = setTimeout(() => {
CommandHandler_1.default.remove(CommandHandler_1.default.get(identifier, command));
resolve({
ok: true,
response: undefined,
});
}, 3_000);
}
}
catch (error) {
CommandHandler_1.default.remove(CommandHandler_1.default.get(identifier, command));
resolve({
ok: false,
error: error.message,
});
}
});
}
else {
try {
const response = await fetch(constants_1.GPortalRoutes.Api, {
method: "POST",
headers: {
"Content-Type": "application/json",
Authorization: `Bearer ${token}`,
},
body: JSON.stringify(payload),
});
if (!response.ok) {
ServerUtils_1.default.error(this._manager, `Failed To Send Command: HTTP ${response.status} ${response.statusText}`, server);
return {
ok: false,
error: `HTTP ${response.status} ${response.statusText}`,
};
}
return {
ok: true,
response: undefined,
};
}
catch (error) {
ServerUtils_1.default.error(this._manager, `Failed To Send Command: ${error}`, server);
return {
ok: false,
error: error.message,
};
}
}
}
async updateBroadcasters(identifier) {
const server = this.get(identifier);
if (!server) {
return this._manager.logger.warn(`[${identifier}] Failed To Update Broadcasters: Invalid Server`);
}
this._manager.logger.debug(`[${server.identifier}] Updating Broadcasters`);
const broadcasters = await this.command(server.identifier, "rf.listboardcaster", true);
if (!broadcasters?.response) {
return this._manager.logger.warn(`[${server.identifier}] Failed To Update Broadcasters`);
}
const broadcasts = [];
const regex = /\[(\d+) MHz\] Position: \(([\d.-]+), ([\d.-]+), ([\d.-]+)\), Range: (\d+)/g;
let match;
while ((match = regex.exec(broadcasters.response)) !== null) {
const frequency = parseInt(match[1], 10);
const coordinates = [
parseFloat(match[2]),
parseFloat(match[3]),
parseFloat(match[4]),
];
const range = parseInt(match[5], 10);
broadcasts.push({ frequency, coordinates, range });
}
server.frequencies.forEach((freq) => {
if (!broadcasts.find((b) => parseInt(b.frequency) === freq)) {
this._manager.events.emit(constants_1.RCEEvent.FrequencyLost, {
server,
frequency: freq,
});
server.frequencies = server.frequencies.filter((f) => f !== freq);
}
});
broadcasts.forEach((broadcast) => {
if (server.frequencies.includes(broadcast.frequency))
return;
server.frequencies.push(broadcast.frequency);
if (broadcast.frequency === 4765) {
this._manager.events.emit(constants_1.RCEEvent.EventStart, {
server,
event: "Small Oil Rig",
special: false,
});
}
else if (broadcast.frequency === 4768) {
this._manager.events.emit(constants_1.RCEEvent.EventStart, {
server,
event: "Oil Rig",
special: false,
});
}
this._manager.events.emit(constants_1.RCEEvent.FrequencyGained, {
server,
frequency: broadcast.frequency,
coordinates: broadcast.coordinates,
range: broadcast.range,
});
});
this.update(server);
this._manager.logger.debug(`[${server.identifier}] Broadcasters Updated`);
}
async fetchGibs(identifier) {
const server = this.get(identifier);
if (!server) {
return this._manager.logger.warn(`[${identifier}] Failed To Fetch Gibs: Invalid Server`);
}
this._manager.logger.debug(`[${server.identifier}] Fetching Gibs`);
const bradley = await this.command(server.identifier, "find_entity servergibs_bradley", true);
const heli = await this.command(server.identifier, "find_entity servergibs_patrolhelicopter", true);
if (!bradley?.response || !heli?.response) {
return this._manager.logger.warn(`[${server.identifier}] Failed To Fetch Gibs`);
}
if (bradley.response.includes("servergibs_bradley") &&
!server.flags.includes("BRADLEY")) {
server.flags.push("BRADLEY");
setTimeout(() => {
const s = this.get(server.identifier);
if (s) {
s.flags = s.flags.filter((f) => f !== "BRADLEY");
this.update(s);
}
}, 60_000 * 10);
this._manager.events.emit(constants_1.RCEEvent.EventStart, {
server,
event: "Bradley APC Debris",
special: false,
});
}
if (heli.response.includes("servergibs_patrolhelicopter") &&
!server.flags.includes("HELICOPTER")) {
server.flags.push("HELICOPTER");
setTimeout(() => {
const s = this.get(server.identifier);
if (s) {
s.flags = s.flags.filter((f) => f !== "HELICOPTER");
this.update(s);
}
}, 60_000 * 10);
this._manager.events.emit(constants_1.RCEEvent.EventStart, {
server,
event: "Patrol Helicopter Debris",
special: false,
});
}
this.update(server);
this._manager.logger.debug(`[${server.identifier}] Gibs Fetched`);
}
async updatePlayers(identifier) {
const server = this.get(identifier);
if (!server) {
return this._manager.logger.warn(`[${identifier}] Failed To Update Players: Invalid Server`);
}
this._manager.logger.debug(`[${server.identifier}] Updating Players`);
const players = await this.command(server.identifier, "Users", true);
if (!players?.response) {
return this._manager.logger.warn(`[${server.identifier}] Failed To Update Players`);
}
const playerlist = players.response
.match(/"(.*?)"/g)
.map((ign) => ign.replace(/"/g, ""));
playerlist.shift();
const { joined, left } = helper_1.default.comparePopulation(server.players, playerlist);
joined.forEach((player) => {
this._manager.events.emit(constants_1.RCEEvent.PlayerJoined, {
server,
ign: player,
});
});
left.forEach((player) => {
this._manager.events.emit(constants_1.RCEEvent.PlayerLeft, {
server,
ign: player,
});
});
server.players = playerlist;
this.update(server);
this._manager.events.emit(constants_1.RCEEvent.PlayerListUpdated, {
server,
players: playerlist,
joined,
left,
});
this._manager.logger.debug(`[${server.identifier}] Players Updated`);
}
async ServerTime(identifier) {
const server = this.get(identifier);
if (!server) {
return this._manager.logger.warn(`[${identifier}] Failed To Update Time: Invalid Server`);
}
this._manager.logger.debug(`[${server.identifier}] Updating Time`);
const response = await this.command(server.identifier, "env.time", true);
if (response?.response) {
const extractedTime = response.response
.match(/(\d+)/)?.[0] || null;
if (extractedTime) {
this._manager.events.emit(constants_1.RCEEvent.ServerTime, {
server,
time: extractedTime,
});
this._manager.logger.debug(`[${server.identifier}] Time Updated: ${extractedTime}`);
}
else {
this._manager.logger.warn(`[${server.identifier}] Failed To Retrieve Valid Time`);
}
}
else {
this._manager.logger.warn(`[${server.identifier}] Failed To Retrieve Time`);
}
}
async ServerFPS(identifier) {
const server = this.get(identifier);
if (!server) {
return this._manager.logger.warn(`[${identifier}] Failed To Update FPS: Invalid Server`);
}
this._manager.logger.debug(`[${server.identifier}] Updating FPS`);
const response = await this.command(server.identifier, "server.fps", true);
if (response?.response) {
const FPS = response.response;
if (FPS) {
this._manager.events.emit(constants_1.RCEEvent.ServerFPS, {
server,
fps: FPS,
});
this._manager.logger.debug(`[${server.identifier}] FPS Updated: ${FPS}`);
}
else {
this._manager.logger.warn(`[${server.identifier}] Failed To Retrieve Valid FPS`);
}
}
else {
this._manager.logger.warn(`[${server.identifier}] Failed To Retrieve FPS`);
}
}
/**
*
* @param region - The region to fetch servers from
* @returns {Promise<FetchedServer[]>} - The fetched servers
* @description Fetches servers from the authorized GPortal account
*
* @example
* ```js
* const servers = await manager.servers.fetchServers("EU");
* ```
*
* @example
* ```js
* const servers = await manager.servers.fetchServers("US");
* ```
*
* @example
* ```js
* const servers = await manager.servers.fetchServers();
* ```
*/
async fetchServers(region) {
const token = this._auth?.accessToken;
if (!token) {
this._manager.logger.warn("Failed To Fetch Servers: No Access Token");
return [];
}
this._manager.logger.debug("Fetching Servers");
if (!region) {
const eu = await this.fetchServers("EU");
const us = await this.fetchServers("US");
return [...eu, ...us];
}
try {
const response = await fetch(`${constants_1.GPortalRoutes.Origin}/${region === "EU" ? "eur" : "int"}/menu/clouds`, {
headers: {
Authorization: `Bearer ${token}`,
},
});
if (!response.ok) {
this._manager.logger.warn(`Failed To Fetch Servers: ${response.status} ${response.statusText}`);
return [];
}
const data = await response.json();
const fetchedServers = data?.items
?.filter((s) => s.label.includes("Rust"))
.map((s) => {
return {
rawName: s.items[0].label,
name: s.items[0].label.replace(/<color=[^>]+>|<\/color>/g, ""),
region,
sid: [Number(s.items[0].data.url.split("/")[4])],
};
});
const resolveIdsRequest = await fetch(`${constants_1.GPortalRoutes.Origin}/${region === "EU" ? "eur" : "int"}/serviceIds`, {
headers: {
Authorization: `Bearer ${token}`,
},
});
if (!resolveIdsRequest.ok) {
this._manager.logger.warn(`Failed To Fetch Servers: ${resolveIdsRequest.status} ${resolveIdsRequest.statusText}`);
return fetchedServers ?? [];
}
const resolvedIds = await resolveIdsRequest.json();
fetchedServers?.forEach((s) => {
const resolvedId = resolvedIds.find((r) => r.serverId === s.sid[0]);
if (resolvedId) {
s.sid.push(resolvedId.serviceId);
}
});
return fetchedServers ?? [];
}
catch (error) {
ServerUtils_1.default.error(this._manager, `Failed To Fetch Servers: ${error}`);
return [];
}
}
async fetchStatus(identifier, sid, region) {
const token = this._auth?.accessToken;
if (!token) {
console.error(`[${identifier}] Failed To Fetch Server Status: No Access Token`);
return null;
}
this._manager.logger.debug(`[${identifier}] Fetching Server Status`);
try {
const response = await fetch(constants_1.GPortalRoutes.Api, {
method: "POST",
headers: {
"Content-Type": "application/json",
Authorization: `Bearer ${token}`,
},
body: JSON.stringify({
operationName: "ctx",
variables: {
sid,
region,
},
query: "query ctx($sid: Int!, $region: REGION!) {\n cfgContext(rsid: {id: $sid, region: $region}) {\n ns {\n ...CtxFields\n __typename\n }\n errors {\n mutator\n affectedPaths\n error {\n class_\n args\n __typename\n }\n scope\n __typename\n }\n __typename\n }\n}\n\nfragment GameServerFields on GameServer {\n id\n serverName\n serverPort\n serverIp\n __typename\n}\n\nfragment PermissionFields on Permission {\n userName\n created\n __typename\n}\n\nfragment MysqlDbFields on CustomerMysqlDb {\n httpUrl\n host\n port\n database\n username\n password\n __typename\n}\n\nfragment ServiceStateFields on ServiceState {\n state\n fsmState\n fsmIsTransitioning\n fsmIsExclusiveLocked\n fsmFileAccess\n fsmLastStateChange\n fsmStateLiveProgress {\n ... on InstallProgress {\n action\n percentage\n __typename\n }\n ... on BroadcastProgress {\n nextMessageAt\n stateExitAt\n __typename\n }\n __typename\n }\n __typename\n}\n\nfragment RestartTaskFields on RestartTask {\n id\n runOnWeekday\n runOnDayofmonth\n runAtTimeofday\n runInTimezone\n schedule\n data {\n description\n args\n scheduleExtended\n nextFireTime\n __typename\n }\n __typename\n}\n\nfragment DisplayPortFields on DisplayPorts {\n rconPort\n queryPort\n __typename\n}\n\nfragment SteamWorkshopItemFields on SteamWorkshopItem {\n id\n appId\n itemType\n name\n links {\n websiteUrl\n __typename\n }\n summary\n logo {\n url\n __typename\n }\n maps {\n workshopId\n mapName\n __typename\n }\n dateCreated\n dateModified\n __typename\n}\n\nfragment SevenDaysModFields on SevenDaysMod {\n id\n name\n repoKey\n active\n created\n modified\n __typename\n}\n\nfragment MapParams on FarmingSimulatorMapParamsObject {\n serverIp\n webServerPort\n webStatsCode\n token\n __typename\n}\n\nfragment CtxFields on RootNamespace {\n sys {\n game {\n name\n key\n platform\n forumBoardId\n supportedPlatforms\n __typename\n }\n extraGameTranslationKeys\n gameServer {\n ...GameServerFields\n __typename\n }\n permissionsOwner {\n ...PermissionFields\n __typename\n }\n permissions {\n ...PermissionFields\n __typename\n }\n mysqlDb {\n ...MysqlDbFields\n __typename\n }\n __typename\n }\n service {\n config {\n rsid {\n id\n region\n __typename\n }\n type\n hwId\n state\n ftpUser\n ftpPort\n ftpPassword\n ftpReadOnly\n ipAddress\n rconPort\n queryPort\n autoBackup\n dnsNames\n currentVersion\n targetVersion\n __typename\n }\n latestRev {\n id\n created\n __typename\n }\n maxSlots\n files\n memory {\n base\n effective\n __typename\n }\n currentState {\n ...ServiceStateFields\n __typename\n }\n backups {\n id\n userSize\n created\n isAutoBackup\n __typename\n }\n restartSchedule {\n ...RestartTaskFields\n __typename\n }\n dnsAvailableTlds\n __typename\n }\n admin {\n hardwareGuacamoleConnection {\n url\n __typename\n }\n __typename\n }\n profile {\n __typename\n ... on ProfileNamespace {\n name\n cfgFiles\n logFiles\n publicConfigs\n configDefinition\n displayPorts {\n ...DisplayPortFields\n __typename\n }\n enableCustomerDb\n enableCustomHostnames\n __typename\n }\n ... on MinecraftProfileNamespace {\n name\n cfgFiles\n logFiles\n publicConfigs\n configDefinition\n displayPorts {\n rconPort\n queryPort\n additionalPorts\n __typename\n }\n enableCustomerDb\n enableCustomHostnames\n worlds\n addonRam\n isRamServer\n ramOrderCreationDate\n ramStopTimeUtc\n isConnectedToBungeecord\n bungeecordServerUrl\n executables {\n id\n name\n key\n default\n __typename\n }\n mods {\n id\n repoKey\n name\n image\n mindRam\n projectUrl\n revisions {\n id\n created\n executableId\n extraData\n __typename\n }\n __typename\n }\n __typename\n }\n ... on CsgoProfileNamespace {\n name\n cfgFiles\n logFiles\n publicConfigs\n configDefinition\n displayPorts {\n rconPort\n queryPort\n gotvPort\n __typename\n }\n enableCustomerDb\n enableCustomHostnames\n selectedWorkshopItems {\n ...SteamWorkshopItemFields\n __typename\n }\n installedMaps {\n name\n displayName\n workshopItem {\n ...SteamWorkshopItemFields\n __typename\n }\n __typename\n }\n __typename\n }\n ... on ValheimProfileNamespace {\n name\n cfgFiles\n clientLink\n logFiles\n publicConfigs\n configDefinition\n displayPorts {\n ...DisplayPortFields\n __typename\n }\n enableCustomerDb\n enableCustomHostnames\n __typename\n }\n ... on HellLetLooseProfileNamespace {\n name\n cfgFiles\n logFiles\n publicConfigs\n configDefinition\n displayPorts {\n rconPort\n queryPort\n statsPort\n beaconPort\n __typename\n }\n enableCustomerDb\n enableCustomHostnames\n __typename\n }\n ... on SevenDaysToDieProfileNamespace {\n name\n cfgFiles\n logFiles\n publicConfigs\n configDefinition\n displayPorts {\n rconPort\n queryPort\n telnetPort\n webDashboardPort\n __typename\n }\n enableCustomerDb\n enableCustomHostnames\n availableMods {\n ...SevenDaysModFields\n __typename\n }\n isModUpdateAvailable\n __typename\n }\n ... on SoulmaskProfileNamespace {\n name\n cfgFiles\n gameUid\n logFiles\n publicConfigs\n configDefinition\n displayPorts {\n ...DisplayPortFields\n __typename\n }\n enableCustomerDb\n enableCustomHostnames\n __typename\n }\n ... on VRisingProfileNamespace {\n name\n cfgFiles\n isLaunchServer\n isOfficialServer\n logFiles\n publicConfigs\n configDefinition\n displayPorts {\n ...DisplayPortFields\n __typename\n }\n enableCustomerDb\n enableCustomHostnames\n __typename\n }\n ... on RustConsoleProfileNamespace {\n name\n cfgFiles\n logFiles\n publicConfigs\n configDefinition\n displayPorts {\n ...DisplayPortFields\n __typename\n }\n enableCustomerDb\n modifyActionHints\n __typename\n }\n ... on FarmingSimulatorProfileNamespace {\n name\n cfgFiles\n logFiles\n publicConfigs\n configDefinition\n wiLink\n defaultModSpace\n masterWiLink\n displayPorts {\n rconPort\n queryPort\n webPort\n __typename\n }\n mapParams {\n ...MapParams\n __typename\n }\n __typename\n }\n ... on BungeecordProfileNamespace {\n name\n cfgFiles\n logFiles\n publicConfigs\n configDefinition\n displayPorts {\n ...DisplayPortFields\n __typename\n }\n enableCustomerDb\n enableCustomHostnames\n gpServers\n accessibleMinecraftServers {\n ...GameServerFields\n __typename\n }\n __typename\n }\n }\n __typename\n}",
}),
});
if (!response.ok) {
ServerUtils_1.default.error(this._manager, `[${identifier}] Failed To Fetch Server Status: ${response.status} ${response.statusText}`);
return null;
}
const data = await response.json();
return data?.data?.cfgContext?.ns?.service?.currentState
?.state;
}
catch (error) {
ServerUtils_1.default.error(this._manager, `[${identifier}] Failed To Fetch Server Status: ${error.message}`);
return null;
}
}
async fetchId(identifier, sid, region) {
const token = this._auth?.accessToken;
if (!token) {
ServerUtils_1.default.error(this._manager, `[${identifier}] Failed To Fetch Server ID: No Access Token`);
return null;
}
this._manager.logger.debug(`[${identifier}] Fetching Server ID`);
try {
const response = await fetch(constants_1.GPortalRoutes.Api, {
method: "POST",
headers: {
"Content-Type": "application/json",
Authorization: `Bearer ${token}`,
},
body: JSON.stringify({
operationName: "sid",
variables: {
gameserverId: Number(sid),
region,
},
query: "query sid($gameserverId: Int!, $region: REGION!) {\n sid(gameserverId: $gameserverId, region: $region)\n}",
}),
});
if (!response.ok) {
ServerUtils_1.default.error(this._manager, `[${identifier}] Failed To Fetch Server ID: ${response.status} ${response.statusText}`);
return null;
}
const data = await response.json();
if (data?.errors?.length) {
this._manager.logger.warn(`[${identifier}] Failed To Fetch Server ID: ${data.errors[0].message}`);
return null;
}
const serverId = data?.data?.sid;
if (!serverId) {
ServerUtils_1.default.error(this._manager, `[${identifier}] Failed To Fetch Server ID: Invalid SID`);
return null;
}
return serverId;
}
catch (error) {
ServerUtils_1.default.error(this._manager, `[${identifier}] Failed To Fetch Server ID: ${error.message}`);
return null;
}
}
}
exports.default = ServerManager;
//# sourceMappingURL=Servers.js.map