From f7e94e15470208af6a7a7c7d1a26a5d3ad7ae89d Mon Sep 17 00:00:00 2001 From: Braeden Sowinski Date: Wed, 6 Sep 2023 21:23:41 -0700 Subject: [PATCH] refactor/NitradoAPI.js to support future updates --- commands/admin.js | 20 +++++++- package.json | 2 +- structures/DayzRBot.js | 2 +- util/NitradoAPI.js | 108 +++++++++++++++++++++++++++++------------ 4 files changed, 98 insertions(+), 34 deletions(-) diff --git a/commands/admin.js b/commands/admin.js index 16bce18..b4044a2 100644 --- a/commands/admin.js +++ b/commands/admin.js @@ -350,7 +350,15 @@ module.exports = { } else if (args[0].name == 'ban-player') { - BanPlayer(client, args[0].options[0].value); + let failed = await BanPlayer(client, args[0].options[0].value); + + if (failed) { + let failed = new EmbedBuilder() + .setColor(client.config.Colors.Red) + .setDescription(`Failed to ban **${args[0].options[0].value}**. Check internal logs for an error.`); + + return interaciton.send({ embeds: [failed] }); + } let banned = new EmbedBuilder() .setColor(client.config.Colors.Default) @@ -360,7 +368,15 @@ module.exports = { } else if (args[0].name == 'unban-player') { - UnbanPlayer(client, args[0].options[0].value); + let failed = UnbanPlayer(client, args[0].options[0].value); + + if (failed) { + let failed = new EmbedBuilder() + .setColor(client.config.Colors.Red) + .setDescription(`Failed to ban **${args[0].options[0].value}**. Check internal logs for an error.`); + + return interaciton.send({ embeds: [failed] }); + } let banned = new EmbedBuilder() .setColor(client.config.Colors.Default) diff --git a/package.json b/package.json index 74ed96a..bcabecf 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "dayzr-bot", - "version": "9.8.4", + "version": "9.8.5", "description": "A General Purpose Discord Bot for DayZ Nitrado Servers.", "main": "index.js", "nodemonConfig": { diff --git a/structures/DayzRBot.js b/structures/DayzRBot.js index a19b82e..f628dff 100644 --- a/structures/DayzRBot.js +++ b/structures/DayzRBot.js @@ -235,7 +235,7 @@ class DayzRBot extends Client { c.activePlayersTick++; await DownloadNitradoFile(c, `/games/${c.config.Nitrado.UserID}/noftp/dayzxb/config/DayZServer_X1_x64.ADM`, './logs/server-logs.ADM').then(async (status) => { - if (status == -1) return c.error('...Failed to Download logs...'); + if (status == 1) return c.error('...Failed to Download logs...'); // c.log('...Downloaded logs...'); await c.readLogs(c.config.GuildID).then(async () => { // c.log('...Analyzed logs...'); diff --git a/util/NitradoAPI.js b/util/NitradoAPI.js index f428479..b209011 100644 --- a/util/NitradoAPI.js +++ b/util/NitradoAPI.js @@ -8,6 +8,44 @@ const retryDelay = 5000; // 5 seconds // Private functions (only called locally) +const PostServerSettings = async (client, category, key, value) => { + for (let retries = 0; retries <= maxRetries; retries++) { + try { + const formData = new FormData(); + formData.append("category", category); + formData.append("key", key); + formData.append("value", value); + formData.pipe(concat(data => { + async function postData() { + const res = 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, + }); + if (!res.ok) { + const errorText = await res.text(); + client.error(`Failed to get post Nitrado server settings (${client.config.Nitrado.ServerID}): status: ${res.status}, message: ${errorText}: PostServerSettings`); + if (retries === 2) return 1; // Return error status on the second failed status code. + } else { + const data = await res.json(); + return data; + } + } + postData(); + })); + return 0; + } catch (error) { + client.error(`PostServerSettings: Error connecting to server (${client.config.Nitrado.ServerID}): ${error.message}`); + if (retries === maxRetries) throw new Error(`PostServerSettings: Error connecting to server (${client.config.Nitrado.ServerID}) after ${maxRetries} retries`); + } + await new Promise(resolve => setTimeout(resolve, retryDelay)); // Delay before retrying + } +} + const HandlePlayerBan = async (client, gamertag, ban) => { const data = await module.exports.FetchServerSettings(client, 'HandlePlayerBan'); // Fetch server status @@ -17,33 +55,9 @@ const HandlePlayerBan = async (client, gamertag, ban) => { else if (!ban) bans = bans.replace(gamertag, ''); else client.error("Incorrect Ban Option: HandlePlayerBan"); - for (let retries = 0; retries <= maxRetries; retries++) { - try { - 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(); - })); - return 0; - } catch (error) { - client.error(`HandlePlayerBan: Error connecting to server (${client.config.Nitrado.ServerID}): ${error.message}`); - if (retries === maxRetries) throw new Error(`HandlePlayerBan: Error connecting to server (${client.config.Nitrado.ServerID}) after ${maxRetries} retries`); - } - await new Promise(resolve => setTimeout(resolve, retryDelay)); // Delay before retrying - } + let category = 'general'; + let key = 'bans'; + return await PostServerSettings(client, category, key, bans); // returns 1 (failed) or 0 (not failed) } } @@ -66,7 +80,7 @@ module.exports = { if (!res.data || !res.data.token) { client.error(`Error downloading File "${filename}":`); client.error(res); - return -1; + return 1; } const { body } = await fetch(res.data.token.url); await finished(Readable.fromWeb(body).pipe(stream)); @@ -85,8 +99,8 @@ module.exports = { rather than write two whole different functions for each. */ - BanPlayer: async (client, gamertag) => HandlePlayerBan(client, gamertag, true), - UnbanPlayer: async (client, gamertag) => HandlePlayerBan(client, gamertag, false), + BanPlayer: async (client, gamertag) => await HandlePlayerBan(client, gamertag, true), + UnbanPlayer: async (client, gamertag) => await HandlePlayerBan(client, gamertag, false), RestartServer: async (client, restart_message, message) => { const params = { @@ -159,4 +173,38 @@ module.exports = { } } }, + + ToggleBaseDamage: async (client, preference) => { + const settings = await module.exports.FetchServerSettings(client, 'ToggleBaseDamage'); // Fetch server settings + + if (settings && settings != 1) { + for (let retries = 0; retries <= maxRetries; retries++) { + try { + const formData = new FormData(); + formData.append("category", "config"); + formData.append("key", "disableBaseDamage"); + formData.append("value", preference); + 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(); + })); + return 0; + } catch (error) { + client.error(`HandlePlayerBan: Error connecting to server (${client.config.Nitrado.ServerID}): ${error.message}`); + if (retries === maxRetries) throw new Error(`HandlePlayerBan: Error connecting to server (${client.config.Nitrado.ServerID}) after ${maxRetries} retries`); + } + await new Promise(resolve => setTimeout(resolve, retryDelay)); // Delay before retrying + } + } + } }