CatalysmsServerManager/7-Days-to-Die-API-wrapper

View on GitHub
lib/index.ts

Summary

Maintainability
D
2 days
Test Coverage
A
96%
import fetch, { RequestInit } from 'node-fetch';
import { stringify } from 'qs';
import { ParsedUrlQueryInput } from 'querystring';

import { handleSteamId } from './handleSteamId';
import * as responses from './responses';

export interface SdtdServer {
    ip: string,
    port: string,
    forceHttps?: boolean,
    adminUser: string,
    adminToken: string
}

export function getBaseUrl(server: SdtdServer): string {
    let scheme = "http";
    let needsPort = true;
    if (server.forceHttps === true) {
        scheme = "https";
    } else if (server.forceHttps === false) {
        scheme = "http";
    } else if (parseInt(server.port) === 443) {
        needsPort = false;
        scheme = "https";
    } else if (parseInt(server.port) === 80) {
        needsPort = false;
        scheme = "http";
    }
    return needsPort ? `${scheme}://${server.ip}:${server.port}` : `${scheme}://${server.ip}`;
}

// eslint-disable-next-line @typescript-eslint/no-explicit-any
type json = any;

async function fetchJson(server: SdtdServer, url: string, qs: ParsedUrlQueryInput, fetchOpts?: RequestInit): Promise<json> {
    const uri = getBaseUrl(server) + url + '?' + stringify(qs, { skipNulls: true });

    const timeout = fetchOpts?.timeout ?? 3000;
    const headers: Record<string, string> = {};

    if (qs.adminuser) {
        headers["X-SDTD-API-TOKENNAME"] = qs.adminuser.toString();
    }

    if (qs.admintoken) {
        headers["X-SDTD-API-SECRET"] = qs.admintoken.toString();
    }

    return fetch(uri, { ...fetchOpts, timeout, headers })
        .then(function (response) {
            if (!response.ok) {
                throw Error(response.statusText);
            }
            return response;
        }).then(response => {
            const contentType = response.headers.get("content-type");
            if (contentType && contentType.indexOf("application/json") !== -1) {
                return response.json().then(handleSteamId);
            } else {
                return response.text();
            }
        });
}

export async function getStats(server: SdtdServer, fetchOpts?: RequestInit): Promise<responses.StatsResponse> {
    return fetchJson(server, `/api/getstats`, { adminuser: server.adminUser, admintoken: server.adminToken }, fetchOpts);
}

export async function getOnlinePlayers(server: SdtdServer, fetchOpts?: RequestInit): Promise<Array<responses.OnlinePlayerResponse>> {
    return fetchJson(server, `/api/getplayersonline`, { adminuser: server.adminUser, admintoken: server.adminToken }, fetchOpts);
}

export async function getAllowedCommands(server: SdtdServer, fetchOpts?: RequestInit): Promise<responses.AllowedCommands> {
    return fetchJson(server, `/api/getallowedcommands`, { adminuser: server.adminUser, admintoken: server.adminToken }, fetchOpts);
}

export async function executeConsoleCommand(server: SdtdServer, command: string, fetchOpts?: RequestInit): Promise<responses.CommandResponse> {
    return fetchJson(server, `/api/executeconsolecommand`, { adminuser: server.adminUser, admintoken: server.adminToken, command: command }, fetchOpts);
}

export async function getAnimalsLocation(server: SdtdServer, fetchOpts?: RequestInit): Promise<Array<responses.EntityLocation>> {
    return fetchJson(server, `/api/getanimalslocation`, { adminuser: server.adminUser, admintoken: server.adminToken }, fetchOpts);
}

export async function getHostileLocation(server: SdtdServer, fetchOpts?: RequestInit): Promise<Array<responses.EntityLocation>> {
    return fetchJson(server, `/api/gethostilelocation`, { adminuser: server.adminUser, admintoken: server.adminToken }, fetchOpts);
}

export async function getLandClaims(server: SdtdServer, steamId?: string, fetchOpts?: RequestInit): Promise<responses.LandClaimsResponse> {
    return fetchJson(server, `/api/getlandclaims`, { adminuser: server.adminUser, admintoken: server.adminToken, steamid: steamId }, fetchOpts);
}

export async function getPlayerInventory(server: SdtdServer, steamId: string, fetchOpts?: RequestInit): Promise<responses.InventoryResponse> {
    if (/^\d{17}$/.test(steamId)) {
        return fetchJson(server, `/api/getplayerinventory`, { adminuser: server.adminUser, admintoken: server.adminToken, steamid: steamId, userid: `Steam_${steamId}` }, fetchOpts);
    } else {
        return fetchJson(server, `/api/getplayerinventory`, { adminuser: server.adminUser, admintoken: server.adminToken, userid: steamId }, fetchOpts);
    }
}

export async function getPlayerInventories(server: SdtdServer, fetchOpts?: RequestInit): Promise<Array<responses.InventoryResponse>> {
    return fetchJson(server, `/api/getplayerinventories`, { adminuser: server.adminUser, admintoken: server.adminToken }, fetchOpts);
}

export async function getPlayerList(server: SdtdServer, rowsPerPage?: number, page?: number, fetchOpts?: RequestInit): Promise<responses.PlayerListResponse> {
    return fetchJson(server, `/api/getplayerlist`, { adminuser: server.adminUser, admintoken: server.adminToken, rowsperpage: rowsPerPage, page: page }, fetchOpts);
}

export async function getPlayersLocation(server: SdtdServer, offline: boolean, fetchOpts?: RequestInit): Promise<Array<responses.PlayerLocation>> {
    return fetchJson(server, `/api/getplayerslocation`, { adminuser: server.adminUser, admintoken: server.adminToken, offline: offline }, fetchOpts);
}

export async function getServerInfo(server: SdtdServer, fetchOpts?: RequestInit): Promise<responses.GetServerInfo> {
    return fetchJson(server, `/api/getserverinfo`, { adminuser: server.adminUser, admintoken: server.adminToken }, fetchOpts);
}

export async function getWebUIUpdates(server: SdtdServer, latestLine?: number, fetchOpts?: RequestInit): Promise<responses.GetWebUIUpdatesResponse> {
    return fetchJson(server, `/api/getwebuiupdates`, { adminuser: server.adminUser, admintoken: server.adminToken, latestLine: latestLine }, fetchOpts);
}

export async function getLog(server: SdtdServer, firstLine?: number, count: number = 50, fetchOpts?: RequestInit): Promise<responses.GetLog> {
    return fetchJson(server, `/api/getlog`, { adminuser: server.adminUser, admintoken: server.adminToken, firstLine: firstLine, count: count }, fetchOpts);
}