From b94312229a6061ff6e66172558bb3d3e04fe57c0 Mon Sep 17 00:00:00 2001 From: Braeden Sowinski Date: Sun, 3 Sep 2023 20:54:09 -0700 Subject: [PATCH] fix/bring back missing functions in NitradoAPI.js --- package.json | 2 +- util/NitradoAPI.js | 69 +++++++++++++++++++++++++++++++++++++--------- 2 files changed, 57 insertions(+), 14 deletions(-) diff --git a/package.json b/package.json index 65e14a0..f852794 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "dayzr-bot", - "version": "9.5.2", + "version": "9.5.3", "description": "A General Purpose Discord Bot for DayZ Nitrado Servers.", "main": "index.js", "nodemonConfig": { diff --git a/util/NitradoAPI.js b/util/NitradoAPI.js index 007e994..8edd3a2 100644 --- a/util/NitradoAPI.js +++ b/util/NitradoAPI.js @@ -8,28 +8,43 @@ const retryDelay = 5000; // 5 seconds // Private functions (only called locally) -const DownloadNitradoFile = async(client, filename, outputDir) => { +const HandlePlayerBan = async (client, gamertag, ban) => { for (let retries = 0; retries <= maxRetries; retries++) { try { - const res = await fetch(`https://api.nitrado.net/services/${client.config.Nitrado.ServerID}/gameservers/file_server/download?file=${filename}`, { + // get current bans + const res = await fetch(`https://api.nitrado.net/services/${client.config.Nitrado.ServerID}/gameservers`, { headers: { "Authorization": client.config.Nitrado.Auth } }).then(response => response.json().then(data => data) ).then(res => res); - - const stream = fs.createWriteStream(outputDir); - if (!res.data || !res.data.token) { - client.error(`Error downloading File "${filename}":`); - client.error(res); - return -1; - } - const { body } = await fetch(res.data.token.url); - await finished(Readable.fromWeb(body).pipe(stream)); - return 0; + + let bans = res.data.gameserver.settings.general.bans; + if (ban) bans += `\r\n${gamertag}`; + else if (!ban) bans = bans.replace(gamertag, ''); + else client.error("Incorrect Ban Option: HandlePlayerBan"); + + const formData = new FormData(); + formData.append("category", "general"); + formData.append("key", "bans"); + formData.append("value", bans); + formData.pipe(concat(data => { + async function sendList() { + await fetch(`https://api.nitrado.net/services/${client.config.Nitrado.ServerID}/gameservers/settings`, { + method: "POST", + credentials: 'include', + headers: { + ...formData.getHeaders(), + "Authorization": client.config.Nitrado.Auth + }, + body: data, + }); + } + sendList(); + })); } catch (error) { - if (retries === maxRetries) throw new Error(`DownloadNitradoFile: Failed to fetch data after ${maxRetries} retries`); + if (retries === maxRetries) throw new Error(`HandlePlayerBans: Failed to fetch data after ${maxRetries} retries`); } await new Promise(resolve => setTimeout(resolve, retryDelay)); // Delay before retrying } @@ -38,6 +53,34 @@ const DownloadNitradoFile = async(client, filename, outputDir) => { // Public functions (called externally) module.exports = { + + DownloadNitradoFile: async(client, filename, outputDir) => { + for (let retries = 0; retries <= maxRetries; retries++) { + try { + const res = await fetch(`https://api.nitrado.net/services/${client.config.Nitrado.ServerID}/gameservers/file_server/download?file=${filename}`, { + headers: { + "Authorization": client.config.Nitrado.Auth + } + }).then(response => + response.json().then(data => data) + ).then(res => res); + + const stream = fs.createWriteStream(outputDir); + if (!res.data || !res.data.token) { + client.error(`Error downloading File "${filename}":`); + client.error(res); + return -1; + } + const { body } = await fetch(res.data.token.url); + await finished(Readable.fromWeb(body).pipe(stream)); + return 0; + } catch (error) { + if (retries === maxRetries) throw new Error(`DownloadNitradoFile: Failed to fetch data after ${maxRetries} retries`); + } + await new Promise(resolve => setTimeout(resolve, retryDelay)); // Delay before retrying + } + }, + /* Export explicit function names; i.e BanPlayer() & UnbanPlayer() that call to the private parent function HandlePlayerBan()