diff --git a/package-lock.json b/package-lock.json index 74a637b..ce8c685 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,7 +18,6 @@ "dotenv": "^16.0.3", "form-data": "^4.0.0", "mongodb": "^4.12.1", - "tsconfig-paths": "^4.2.0", "winston": "^3.8.1" }, "devDependencies": { @@ -3353,18 +3352,6 @@ "dev": true, "license": "MIT" }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "license": "MIT", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/keyv": { "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", @@ -3524,6 +3511,7 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" @@ -4059,6 +4047,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, "license": "MIT", "engines": { "node": ">=4" @@ -4295,20 +4284,6 @@ "strip-json-comments": "^2.0.0" } }, - "node_modules/tsconfig-paths": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", - "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", - "license": "MIT", - "dependencies": { - "json5": "^2.2.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/tsconfig/node_modules/strip-json-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", @@ -7002,11 +6977,6 @@ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "dev": true }, - "json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==" - }, "keyv": { "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", @@ -7126,7 +7096,8 @@ "minimist": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==" + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true }, "mkdirp": { "version": "1.0.4", @@ -7455,7 +7426,8 @@ "strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==" + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true }, "strip-json-comments": { "version": "3.1.1", @@ -7606,16 +7578,6 @@ } } }, - "tsconfig-paths": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", - "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", - "requires": { - "json5": "^2.2.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - } - }, "tslib": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", diff --git a/src/services/NitradoAPI.ts b/src/services/NitradoAPI.ts index 0328474..2de9308 100644 --- a/src/services/NitradoAPI.ts +++ b/src/services/NitradoAPI.ts @@ -4,6 +4,8 @@ import { Readable } from "stream"; import FormData from "form-data"; import * as fs from "fs"; import isDefined from "../util/Validation"; +import {NitradoCredentials, NitradoConfig} from "../database/guild"; +import DayZR from "../DayZRBot"; const MAX_RETRIES = 5; const RETRY_DELAY_MS = 5000; // 5 seconds @@ -19,17 +21,17 @@ export const enum NitradoCredentialStatus { */ const UploadNitradoFile = async ( - nitrado_cred: any, - client: any, - remoteDir: any, - remoteFilename: any, - localFileDir: any) => + nitradoCred: NitradoCredentials, + client: DayZR, + remoteDir: string, + remoteFilename: string, + localFileDir: string) => { for (let retries = 0; retries <= MAX_RETRIES; retries++) { try { - const res = await fetch(`https://api.nitrado.net/services/${nitrado_cred.ServerID}/gameservers/file_server/upload?` + const res = await fetch(`https://api.nitrado.net/services/${nitradoCred.ServerID}/gameservers/file_server/upload?` + new URLSearchParams({ path: remoteDir, file: remoteFilename @@ -37,7 +39,7 @@ const UploadNitradoFile = async ( method: "POST", headers: { - "Authorization": nitrado_cred.Auth + "Authorization": nitradoCred.Auth }, }).then(response => response.json()); @@ -55,7 +57,7 @@ const UploadNitradoFile = async ( }) if (!uploadRes.ok) { - client.error(`Failed to upload file to Nitrado (${nitrado_cred.ServerID}): status: ${uploadRes.status}, message: ${res.statusText}: UploadNitradoFile`); + client.error(`Failed to upload file to Nitrado (${nitradoCred.ServerID}): status: ${uploadRes.status}, message: ${res.statusText}: UploadNitradoFile`); if (retries === 2) return 1; // Return error status on the second failed status code. } else @@ -65,10 +67,10 @@ const UploadNitradoFile = async ( } catch (error: any) { - client.error(`UploadNitradoFile: Error connecting to server (${nitrado_cred.ServerID}): ${error.message}`); + client.error(`UploadNitradoFile: Error connecting to server (${nitradoCred.ServerID}): ${error.message}`); if (retries === MAX_RETRIES) { - client.error(`UploadNitradoFile: Error connecting to server (${nitrado_cred.ServerID}) after ${MAX_RETRIES} retries`); + client.error(`UploadNitradoFile: Error connecting to server (${nitradoCred.ServerID}) after ${MAX_RETRIES} retries`); return 1; } } @@ -77,12 +79,13 @@ const UploadNitradoFile = async ( } const HandlePlayerBan = async ( - nitrado_cred: any, + nitradoCred: any, client: any, gamertag: any, - ban: any) => + ban: any +): Promise => { - const data = await module.exports.FetchServerSettings(nitrado_cred, client, "HandlePlayerBan"); // Fetch server status + const data = await FetchServerSettings(nitradoCred, client, "HandlePlayerBan"); // Fetch server status if (data && data != 1) { @@ -93,23 +96,27 @@ const HandlePlayerBan = async ( let category = "general"; let key = "bans"; - return await module.exports.PostServerSettings(nitrado_cred, client, category, key, bans); // returns 1 (failed) or 0 (not failed) + return await PostServerSettings(nitradoCred, client, category, key, bans); // returns 1 (failed) or 0 (not failed) } + + //Satisfy the promise + return -1; } const GetRemoteDir = async ( - nitrado_cred: any, - client: any, dir = "") => + nitradoCred: any, + client: any, dir = "" +): Promise => { const dirParam = isDefined(dir) ? `?dir=${dir}` : ""; for (let retries = 0; retries <= MAX_RETRIES; retries++) { try { - const res = await fetch(`https://api.nitrado.net/services/${nitrado_cred.ServerID}/gameservers/file_server/list${dirParam}`, { + const res = await fetch(`https://api.nitrado.net/services/${nitradoCred.ServerID}/gameservers/file_server/list${dirParam}`, { headers: { - "Authorization": nitrado_cred.Auth + "Authorization": nitradoCred.Auth } }).then(response => response.json().then(data => data) @@ -121,32 +128,36 @@ const GetRemoteDir = async ( } catch (error) { - client.error(`GetRemoteDir: Error connecting to server (${nitrado_cred.ServerID}): ${error}`); + client.error(`GetRemoteDir: Error connecting to server (${nitradoCred.ServerID}): ${error}`); if (retries == MAX_RETRIES) { - client.error(`GetRemoteDir: Error connecting to server (${nitrado_cred.ServerID}) after ${MAX_RETRIES} retries`); + client.error(`GetRemoteDir: Error connecting to server (${nitradoCred.ServerID}) after ${MAX_RETRIES} retries`); return 1; } } await new Promise(resolve => setTimeout(resolve, RETRY_DELAY_MS)); // Delay before retrying } + + //Satisfy promise + return -1; } /*** exported function ***/ export const DownloadNitradoFile = async ( - nitrado_cred: any, + nitradoCred: any, client: any, filename: any, - outputDir: any) => + outputDir: any +): Promise => { for (let retries = 0; retries <= MAX_RETRIES; retries++) { try { - const res = await fetch(`https://api.nitrado.net/services/${nitrado_cred.ServerID}/gameservers/file_server/download?file=${filename}`, { + const res = await fetch(`https://api.nitrado.net/services/${nitradoCred.ServerID}/gameservers/file_server/download?file=${filename}`, { headers: { - "Authorization": nitrado_cred.Auth + "Authorization": nitradoCred.Auth } }).then(response => response.json().then(data => data) @@ -164,15 +175,19 @@ export const DownloadNitradoFile = async ( } catch (error: any) { - client.error(`DownloadNitradoFile: Error connecting to server (${nitrado_cred.ServerID}): ${error.message}`); + client.error(`DownloadNitradoFile: Error connecting to server (${nitradoCred.ServerID}): ${error.message}`); if (retries === MAX_RETRIES) { - client.error(`DownloadNitradoFile: Error connecting to server (${nitrado_cred.ServerID}) after ${MAX_RETRIES} retries`); + client.error(`DownloadNitradoFile: Error connecting to server (${nitradoCred.ServerID}) after ${MAX_RETRIES} retries`); return 1; } } await new Promise(resolve => setTimeout(resolve, RETRY_DELAY_MS)); // Delay before retrying } + + //This is to satisfy the promise as it needs a number + // if somehow it gets past the try catch + return -1; }; /* @@ -182,17 +197,18 @@ export const DownloadNitradoFile = async ( */ export const BanPlayer = async ( - nitrado_cred: any, + nitradoCred: any, client: any, - gamertag: any) => await HandlePlayerBan(nitrado_cred, client, gamertag, true); + gamertag: any + ): Promise => await HandlePlayerBan(nitradoCred, client, gamertag, true); export const UnbanPlayer = async ( - nitrado_cred: any, + nitradoCred: any, client: any, - gamertag: any) => await HandlePlayerBan(nitrado_cred, client, gamertag, false); + gamertag: any) => await HandlePlayerBan(nitradoCred, client, gamertag, false); export const RestartServer = async ( - nitrado_cred: any, + nitradoCred: any, client: any, restart_message: any, message: any) => @@ -206,19 +222,19 @@ export const RestartServer = async ( { try { - const res = await fetch(`https://api.nitrado.net/services/${nitrado_cred.ServerID}/gameservers/restart`, + const res = await fetch(`https://api.nitrado.net/services/${nitradoCred.ServerID}/gameservers/restart`, { method: "POST", headers: { - "Authorization": nitrado_cred.Auth, + "Authorization": nitradoCred.Auth, }, body: JSON.stringify(params) }); if (!res.ok) { - client.error(`Failed to restart Nitrado server (${nitrado_cred.ServerID}): status: ${res.status}, message: ${res.statusText}: RestartServer`); + client.error(`Failed to restart Nitrado server (${nitradoCred.ServerID}): status: ${res.status}, message: ${res.statusText}: RestartServer`); return 1; // Return error status on failed status code. } else @@ -228,19 +244,23 @@ export const RestartServer = async ( } catch (error: any) { - client.error(`RestartServer: Error connecting to server (${nitrado_cred.ServerID}): ${error.message}`); + client.error(`RestartServer: Error connecting to server (${nitradoCred.ServerID}): ${error.message}`); if (retries === MAX_RETRIES) { - client.error(`RestartServer: Error connecting to server (${nitrado_cred.ServerID}) after ${MAX_RETRIES} retries`); + client.error(`RestartServer: Error connecting to server (${nitradoCred.ServerID}) after ${MAX_RETRIES} retries`); return 1; } } await new Promise(resolve => setTimeout(resolve, RETRY_DELAY_MS)); // Delay before retrying } + + //This is to satisfy the promise as it needs a number + // if somehow it gets past the try catch + return -1; }; export const FetchServerSettings = async ( - nitrado_cred: any, + nitradoCred: any, client: any, fetcher: any) => { @@ -249,17 +269,17 @@ export const FetchServerSettings = async ( try { // get current status - const res = await fetch(`https://api.nitrado.net/services/${nitrado_cred.ServerID}/gameservers`, + const res = await fetch(`https://api.nitrado.net/services/${nitradoCred.ServerID}/gameservers`, { headers: { - "Authorization": nitrado_cred.Auth + "Authorization": nitradoCred.Auth } }); if (!res.ok) { - client.error(`Failed to get Nitrado server stats (${nitrado_cred.ServerID}): status: ${res.status}, message: ${res.statusText}: ${fetcher} via FetchServerSettings`); + client.error(`Failed to get Nitrado server stats (${nitradoCred.ServerID}): status: ${res.status}, message: ${res.statusText}: ${fetcher} via FetchServerSettings`); if (res.status == 401) return 1; // return immediately if unauthorized if (retries === 2) return 1; // Return error status on the second failed status code. } @@ -271,10 +291,10 @@ export const FetchServerSettings = async ( } catch (error: any) { - client.error(`${fetcher} via FetchServerSettings: Error connecting to server (${nitrado_cred.ServerID}): ${error.message}`); + client.error(`${fetcher} via FetchServerSettings: Error connecting to server (${nitradoCred.ServerID}): ${error.message}`); if (retries === MAX_RETRIES) { - client.error(`${fetcher} via FetchServerSettings: Error connecting to server (${nitrado_cred.ServerID}) after ${MAX_RETRIES} retries`); + client.error(`${fetcher} via FetchServerSettings: Error connecting to server (${nitradoCred.ServerID}) after ${MAX_RETRIES} retries`); return 1; } } @@ -283,11 +303,12 @@ export const FetchServerSettings = async ( }; export const PostServerSettings = async ( - nitrado_cred: any, + nitradoCred: any, client: any, category: any, key: any, - value: any) => + value: any +): Promise => { for (let retries = 0; retries <= MAX_RETRIES; retries++) { @@ -301,18 +322,18 @@ export const PostServerSettings = async ( { async function postData() { - const res = await fetch(`https://api.nitrado.net/services/${nitrado_cred.ServerID}/gameservers/settings`, { + const res = await fetch(`https://api.nitrado.net/services/${nitradoCred.ServerID}/gameservers/settings`, { method: "POST", credentials: "include", headers: { ...formData.getHeaders(), - "Authorization": nitrado_cred.Auth + "Authorization": nitradoCred.Auth }, body: data, }); if (!res.ok) { - client.error(`Failed to get post Nitrado server settings (${nitrado_cred.ServerID}): status: ${res.status}, message: ${res.statusText}: PostServerSettings`); + client.error(`Failed to get post Nitrado server settings (${nitradoCred.ServerID}): status: ${res.status}, message: ${res.statusText}: PostServerSettings`); if (retries === 2) return 1; // Return error status on the second failed status code. } else @@ -327,35 +348,38 @@ export const PostServerSettings = async ( } catch (error: any) { - client.error(`PostServerSettings: Error connecting to server (${nitrado_cred.ServerID}): ${error.message}`); + client.error(`PostServerSettings: Error connecting to server (${nitradoCred.ServerID}): ${error.message}`); if (retries === MAX_RETRIES) { - client.error(`PostServerSettings: Error connecting to server (${nitrado_cred.ServerID}) after ${MAX_RETRIES} retries`); + client.error(`PostServerSettings: Error connecting to server (${nitradoCred.ServerID}) after ${MAX_RETRIES} retries`); return 1; } } await new Promise(resolve => setTimeout(resolve, RETRY_DELAY_MS)); // Delay before retrying } + + //Return Number to satisfy promise incase try catch not catch + return -1; }; export const CheckServerStatus = async ( - nitrado_cred: any, + nitradoCred: any, client: any) => { - const data = await module.exports.FetchServerSettings(nitrado_cred, client, "CheckServerStatus"); // Fetch server status + const data = await FetchServerSettings(nitradoCred, client, "CheckServerStatus"); // Fetch server status if (data && data != 1) { if (data && data.data.gameserver.status === "stopped") { - client.log(`Restart of Nitrado server ${nitrado_cred.ServerID} has been invoked by the bot, + client.log(`Restart of Nitrado server ${nitradoCred.ServerID} has been invoked by the bot, the periodic check showed status of "${data.data.gameserver.status}".`); // Write optional "restart_message" to set in the Nitrado server logs and send a notice "message" to your server community. let restart_message = "Server being restarted by periodic bot check."; let message = "The server was restarted by periodic bot check!"; - module.exports.RestartServer( - nitrado_cred, + RestartServer( + nitradoCred, client, restart_message, message); } @@ -363,24 +387,24 @@ export const CheckServerStatus = async ( }; export const DisableBaseDamage = async ( - nitrado_cred: any, + nitradoCred: any, client: any, preference: any) => { const pref = preference ? "1" : "0"; - const posted = await module.exports.PostServerSettings(nitrado_cred, client, "config", "disableBaseDamage", pref); + const posted = await PostServerSettings(nitradoCred, client, "config", "disableBaseDamage", pref); if (posted == 1) return 1; - const remoteDirs = await GetRemoteDir(nitrado_cred, client); + const remoteDirs = await GetRemoteDir(nitradoCred, client); if (remoteDirs == 1) return 1; - const basePath = remoteDirs.filter((dir: any) => dir.type == "dir")[0].path - const remoteDirsFromBase = await GetRemoteDir(nitrado_cred, client, basePath); + const basePath = remoteDirs!.filter((dir: any) => dir.type == "dir")[0].path + const remoteDirsFromBase = await GetRemoteDir(nitradoCred, client, basePath); if (remoteDirsFromBase == 1) return 1; const missionPath = remoteDirsFromBase[0].path; const cfggameplayPath = `${missionPath}/cfggameplay.json`; const jsonDir = `./logs/cfggameplay.json`; - await module.exports.DownloadNitradoFile(nitrado_cred, client, cfggameplayPath, jsonDir); + await DownloadNitradoFile(nitradoCred, client, cfggameplayPath, jsonDir); let gameplay = JSON.parse(fs.readFileSync(jsonDir, "utf-8")); gameplay.GeneralData.disableBaseDamage = preference; @@ -388,32 +412,36 @@ export const DisableBaseDamage = async ( // write JSON to file fs.writeFileSync(jsonDir, JSON.stringify(gameplay, null, 2)); - const uploaded = await UploadNitradoFile(nitrado_cred, client, missionPath, "cfggameplay.json", jsonDir); + const uploaded = await UploadNitradoFile(nitradoCred, client, missionPath, "cfggameplay.json", jsonDir); if (uploaded == 1) return 1; return 0; }; export const DisableContainerDamage = async ( - nitrado_cred: any, + nitradoCred: any, client: any, preference: any) => { const pref = preference ? "1" : "0"; - const posted = await module.exports.PostServerSettings(nitrado_cred, - client, "config", "disableContainerDamage", pref); + const posted = await PostServerSettings( + nitradoCred, + client, "config", + "disableContainerDamage", + pref); + if (posted == 1) return 1; - const remoteDirs = await GetRemoteDir(nitrado_cred, client); + const remoteDirs = await GetRemoteDir(nitradoCred, client); if (remoteDirs == 1) return 1; const basePath = remoteDirs.filter((dir: any) => dir.type == "dir")[0].path - const remoteDirsFromBase = await GetRemoteDir(nitrado_cred, client, basePath); + const remoteDirsFromBase = await GetRemoteDir(nitradoCred, client, basePath); if (remoteDirsFromBase == 1) return 1; const missionPath = remoteDirsFromBase[0].path; const cfggameplayPath = `${missionPath}/cfggameplay.json`; const jsonDir = `./logs/cfggameplay.json`; - await module.exports.DownloadNitradoFile(nitrado_cred, client, cfggameplayPath, jsonDir); + await DownloadNitradoFile(nitradoCred, client, cfggameplayPath, jsonDir); let gameplay = JSON.parse(fs.readFileSync(jsonDir, "utf-8")); gameplay.GeneralData.disableContainerDamage = preference; @@ -421,7 +449,7 @@ export const DisableContainerDamage = async ( // write JSON to file fs.writeFileSync(jsonDir, JSON.stringify(gameplay, null, 2)); - const uploaded = await UploadNitradoFile(nitrado_cred, client, missionPath, "cfggameplay.json", jsonDir); + const uploaded = await UploadNitradoFile(nitradoCred, client, missionPath, "cfggameplay.json", jsonDir); if (uploaded == 1) return 1; return 0;