From b1e2ecfb2ca97b25410968407535f027c9a2ccc7 Mon Sep 17 00:00:00 2001 From: Braeden Sowinski Date: Sun, 10 Sep 2023 17:10:25 -0700 Subject: [PATCH 1/8] refactoring --- structures/DayzRBot.js | 3 +-- util/AdminLogsHandler.js | 7 +++---- util/KillfeedHandler.js | 4 ++-- util/LogsHandler.js | 5 ++--- 4 files changed, 8 insertions(+), 11 deletions(-) diff --git a/structures/DayzRBot.js b/structures/DayzRBot.js index 30bab2a..e622a80 100644 --- a/structures/DayzRBot.js +++ b/structures/DayzRBot.js @@ -1,6 +1,5 @@ const { RegisterGlobalCommands, RegisterGuildCommands } = require("../util/RegisterSlashCommands"); const { Collection, Client, EmbedBuilder, Routes } = require('discord.js'); -const CommandOptions = require('../util/CommandOptionTypes').CommandOptionTypes; const MongoClient = require('mongodb').MongoClient; const { REST } = require('@discordjs/rest'); const Logger = require("../util/Logger"); @@ -80,7 +79,7 @@ class DayzRBot extends Client { return await rest.post(Routes.interactionCallback(interaction.id, interaction.token), { body: { - type: CommandOptions.Integer, + type: 4, data: message, } }); diff --git a/util/AdminLogsHandler.js b/util/AdminLogsHandler.js index 43cc0fb..6f42f58 100644 --- a/util/AdminLogsHandler.js +++ b/util/AdminLogsHandler.js @@ -28,14 +28,13 @@ module.exports = { DetectCombatLog: async (client, guildId, data) => { if (data.lastDamageDate == null) return; - let newDt = await client.getDateEST(data.time); - - let diffSeconds = Math.round((newDt.getTime() - data.lastDamageDate.getTime()) / 1000); + const newDt = await client.getDateEST(data.time); + const diffSeconds = Math.round((newDt.getTime() - data.lastDamageDate.getTime()) / 1000); // If diff is greater than 5 minutes, not a combat log // or if death after last combat + if (diffSeconds > (data.combatLogTimer * 60)) return; if (data.lastDamageDate <= data.lastDeathDate) return; - if (diffSeconds > 5 * 60) return; let guild = await client.GetGuild(guildId); if (!client.exists(guild.connectionLogsChannel)) return; diff --git a/util/KillfeedHandler.js b/util/KillfeedHandler.js index 2f47a09..80d7dc1 100644 --- a/util/KillfeedHandler.js +++ b/util/KillfeedHandler.js @@ -72,8 +72,8 @@ module.exports = { else if (killedBy == Templates.Explosion) info.causeOfDeath = data[5]; else return stats; // Unknown template; - let newDt = await client.getDateEST(info.time); - let unixTime = Math.floor(newDt.getTime()/1000); + const newDt = await client.getDateEST(info.time); + const unixTime = Math.floor(newDt.getTime()/1000); const showCoords = client.exists(guild.showKillfeedCoords) ? guild.showKillfeedCoords : false; // default to false if no record of configuration. diff --git a/util/LogsHandler.js b/util/LogsHandler.js index 2714633..024804e 100644 --- a/util/LogsHandler.js +++ b/util/LogsHandler.js @@ -109,6 +109,7 @@ module.exports = { lastDamageDate: playerStat.lastDamageDate, lastHitBy: playerStat.lastHitBy, lastDeathDate: playerStat.lastDeathDate, + combatLogTimer: combatLogTimer, }); } } @@ -169,9 +170,7 @@ module.exports = { let playerStatIndex = stats.indexOf(playerStat); if (playerStat === undefined) playerStat = client.getDefaultPlayerStats(info.player, info.playerID); - const newDt = await client.getDateEST(info.time); - - playerStat.lastDamageDate = newDt; + playerStat.lastDamageDate = await client.getDateEST(info.time); playerStat.lastHitBy = info.attacker; if (playerStatIndex === -1) stats.push(playerStat); From 2db118cd2e0f37a4efd5dd523a87e67c6f58f89e Mon Sep 17 00:00:00 2001 From: Braeden Sowinski Date: Sun, 10 Sep 2023 19:00:17 -0700 Subject: [PATCH 2/8] update/toggle base damage --- commands/admin.js | 21 ++++++++++- package.json | 2 +- util/NitradoAPI.js | 90 +++++++++++++++++++++++++++++++--------------- 3 files changed, 82 insertions(+), 31 deletions(-) diff --git a/commands/admin.js b/commands/admin.js index fd88dae..dc67b21 100644 --- a/commands/admin.js +++ b/commands/admin.js @@ -1,7 +1,7 @@ const { EmbedBuilder, ActionRowBuilder, ButtonBuilder, ButtonStyle, StringSelectMenuBuilder } = require('discord.js'); const CommandOptions = require('../util/CommandOptionTypes').CommandOptionTypes; const bitfieldCalculator = require('discord-bitfield-calculator'); -const { BanPlayer, UnbanPlayer, RestartServer, CheckServerStatus } = require('../util/NitradoAPI'); +const { BanPlayer, UnbanPlayer, RestartServer, CheckServerStatus, ToggleBaseDamage } = require('../util/NitradoAPI'); const { Armbands } = require('../config/armbandsdb.js'); module.exports = { @@ -148,6 +148,18 @@ module.exports = { description: "Enable/Disable periodic server checks and restart if stopped.", value: "auto-restart", type: CommandOptions.SubCommand, + }, { + name: "disable-base-damage", + description: "Disable/Enable base damage", + value: "disable-base-damage", + type: CommandOptions.SubCommand, + options: [{ + name: "preference", + description: "DisableBaseDamage Preference", + value: true, + type: CommandOptions.Boolean, + required: true, + }] }], SlashCommand: { /** @@ -462,6 +474,13 @@ module.exports = { }); return interaction.send({ embeds: [new EmbedBuilder().setColor(client.config.Colors.Yellow).setDescription(msg)], flags: (1 << 6) }); + } else if (args[0].name == 'disable-base-damage') { + const preference = args[0].options[0].value; + + const toggle = ToggleBaseDamage(client, preference); + if (toggle == 1) return interaction.send({ embeds: [new EmbedBuilder().setColor(client.config.Colors.Red).setDescription('Failed to update ` disableBaseDamage `, try again later.')] }); + + return interaciton.send({ embeds: [new EmbedBuilder().setColor(client.config.Colors.Green).setDescription(`Successfully updated \` disableBaseDamage \` to ${preference}.\nRestart the DayZ server to apply these changes.`)] }); } } }, diff --git a/package.json b/package.json index 03556a0..338be6d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "dayzr-bot", - "version": "9.9.8", + "version": "10.0.0", "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 ab5ac41..5392f37 100644 --- a/util/NitradoAPI.js +++ b/util/NitradoAPI.js @@ -8,6 +8,47 @@ const retryDelay = 5000; // 5 seconds // Private functions (only called locally) +const UploadNitradoFile = async (client, remoteDir, remoteFilename, localFileDir) => { + for (let retries = 0; retries <= maxRetries; retries++) { + try { + const res = await fetch(`https://api.nitrado.net/services/${client.config.Nitrado.ServerID}/gameservers/file_server/upload?` + new URLSearchParams({ + path: remoteDir, + file: remoteFilename + }), { + method: "POST", + headers: { + "Authorization": client.config.Nitrado.Auth + }, + }).then(response => + response.json().then(data => data) + ).then(res => res); + + let contents = fs.readFileSync(localFileDir, 'utf8'); + + const uploadRes = await fetch(res.data.token.url, { + method: "POST", + headers: { + 'Content-Type': 'application/binary', + token: res.data.token.token + }, + body: contents, + }); + if (!uploadRes.ok) { + const errorText = await uploadRes.text(); + client.error(`Failed to upload file to Nitrado (${client.config.Nitrado.ServerID}): status: ${uploadRes.status}, message: ${errorText}: UploadNitradoFile`); + if (retries === 2) return 1; // Return error status on the second failed status code. + } else { + const data = await uploadRes.json(); + return data; + } + } catch (error) { + client.error(`UploadNitradoFile: Error connecting to server (${client.config.Nitrado.ServerID}): ${error.message}`); + if (retries === maxRetries) throw new Error(`UploadNitradoFile: Error connecting to server (${client.config.Nitrado.ServerID}) after ${maxRetries} retries`); + } + await new Promise(resolve => setTimeout(resolve, retryDelay)); // Delay before retrying + } +} + const PostServerSettings = async (client, category, key, value) => { for (let retries = 0; retries <= maxRetries; retries++) { try { @@ -176,35 +217,26 @@ module.exports = { ToggleBaseDamage: async (client, preference) => { const settings = await module.exports.FetchServerSettings(client, 'ToggleBaseDamage'); // Fetch server settings + if (!settings || settings == 1) return 1; + + const posted = await PostServerSettings(client, "config", "disableBaseDamage", preference); + if (!posted || posted == 1) return 1; - 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 - } - } + const remoteDir = '/games/ni8434545_1/ftproot/dayzxb_missions/dayzOffline.chernarusplus'; + const remoteFilename = 'cfggameplay.json'; + + const jsonDir = path.join(__dirname, '.', 'logs', remoteFilename); + await module.exports.DownloadNitradoFile(client, `${remoteDir}/${remoteFilename}`, jsonDir); + + let gameplay = JSON.parse(fs.readFileSync(jsonDir)); + gameplay.GeneralData.disableBaseDamage = preference; + + // write JSON to file + fs.writeFileSync(jsonDir, JSON.stringify(gameplay), null, 2); + + const uploaded = await UploadNitradoFile(client, remoteDir, remoteFileName, jsonDir); + if (!uploaded || uploaded == 1) return 1; + + return 0; } } From 639ba39ffe1042dd6229d9d741506f5730b6f0ef Mon Sep 17 00:00:00 2001 From: Braeden Sowinski Date: Sun, 10 Sep 2023 19:08:18 -0700 Subject: [PATCH 3/8] fix/interaction undefined --- commands/admin.js | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/commands/admin.js b/commands/admin.js index dc67b21..15516c7 100644 --- a/commands/admin.js +++ b/commands/admin.js @@ -477,10 +477,10 @@ module.exports = { } else if (args[0].name == 'disable-base-damage') { const preference = args[0].options[0].value; - const toggle = ToggleBaseDamage(client, preference); + const toggle = await ToggleBaseDamage(client, preference); if (toggle == 1) return interaction.send({ embeds: [new EmbedBuilder().setColor(client.config.Colors.Red).setDescription('Failed to update ` disableBaseDamage `, try again later.')] }); - return interaciton.send({ embeds: [new EmbedBuilder().setColor(client.config.Colors.Green).setDescription(`Successfully updated \` disableBaseDamage \` to ${preference}.\nRestart the DayZ server to apply these changes.`)] }); + return interaction.send({ embeds: [new EmbedBuilder().setColor(client.config.Colors.Green).setDescription(`Successfully updated \` disableBaseDamage \` to ${preference}.\nRestart the DayZ server to apply these changes.`)] }); } } }, diff --git a/package.json b/package.json index 338be6d..23be93b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "dayzr-bot", - "version": "10.0.0", + "version": "10.0.1", "description": "A General Purpose Discord Bot for DayZ Nitrado Servers.", "main": "index.js", "nodemonConfig": { From 8dd0169c06fe0a7e23821c0b90dce45263c6326c Mon Sep 17 00:00:00 2001 From: Braeden Sowinski Date: Sun, 10 Sep 2023 19:21:34 -0700 Subject: [PATCH 4/8] fix/disableBaseDamage settings preference --- package.json | 2 +- util/NitradoAPI.js | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 23be93b..3f8881a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "dayzr-bot", - "version": "10.0.1", + "version": "10.0.2", "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 5392f37..1962c7c 100644 --- a/util/NitradoAPI.js +++ b/util/NitradoAPI.js @@ -219,15 +219,15 @@ module.exports = { const settings = await module.exports.FetchServerSettings(client, 'ToggleBaseDamage'); // Fetch server settings if (!settings || settings == 1) return 1; - const posted = await PostServerSettings(client, "config", "disableBaseDamage", preference); + const posted = await PostServerSettings(client, "config", "disableBaseDamage", preference ? 1 : 0); if (!posted || posted == 1) return 1; - + const remoteDir = '/games/ni8434545_1/ftproot/dayzxb_missions/dayzOffline.chernarusplus'; const remoteFilename = 'cfggameplay.json'; const jsonDir = path.join(__dirname, '.', 'logs', remoteFilename); await module.exports.DownloadNitradoFile(client, `${remoteDir}/${remoteFilename}`, jsonDir); - + let gameplay = JSON.parse(fs.readFileSync(jsonDir)); gameplay.GeneralData.disableBaseDamage = preference; @@ -236,7 +236,7 @@ module.exports = { const uploaded = await UploadNitradoFile(client, remoteDir, remoteFileName, jsonDir); if (!uploaded || uploaded == 1) return 1; - + return 0; } } From 044428f2a97897efe9e4dd04f28b17ff4c0aa4af Mon Sep 17 00:00:00 2001 From: Braeden Sowinski Date: Sun, 10 Sep 2023 19:25:32 -0700 Subject: [PATCH 5/8] fix --- util/NitradoAPI.js | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/util/NitradoAPI.js b/util/NitradoAPI.js index 1962c7c..d4a5f17 100644 --- a/util/NitradoAPI.js +++ b/util/NitradoAPI.js @@ -217,10 +217,11 @@ module.exports = { ToggleBaseDamage: async (client, preference) => { const settings = await module.exports.FetchServerSettings(client, 'ToggleBaseDamage'); // Fetch server settings - if (!settings || settings == 1) return 1; + if (settings == 1) return 1; - const posted = await PostServerSettings(client, "config", "disableBaseDamage", preference ? 1 : 0); - if (!posted || posted == 1) return 1; + const pref = preference ? 1 : 0; + const posted = await PostServerSettings(client, "config", "disableBaseDamage", pref); + if (posted == 1) return 1; const remoteDir = '/games/ni8434545_1/ftproot/dayzxb_missions/dayzOffline.chernarusplus'; const remoteFilename = 'cfggameplay.json'; @@ -235,7 +236,7 @@ module.exports = { fs.writeFileSync(jsonDir, JSON.stringify(gameplay), null, 2); const uploaded = await UploadNitradoFile(client, remoteDir, remoteFileName, jsonDir); - if (!uploaded || uploaded == 1) return 1; + if (uploaded == 1) return 1; return 0; } From 8df16eff091ce59f84283107798e6d43a07edf6a Mon Sep 17 00:00:00 2001 From: Braeden Sowinski Date: Sun, 10 Sep 2023 19:26:52 -0700 Subject: [PATCH 6/8] fix/path not defined --- package.json | 2 +- util/NitradoAPI.js | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 3f8881a..4dc7a9d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "dayzr-bot", - "version": "10.0.2", + "version": "10.0.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 d4a5f17..d2fca4d 100644 --- a/util/NitradoAPI.js +++ b/util/NitradoAPI.js @@ -2,6 +2,7 @@ const { finished } = require('stream/promises'); const concat = require('concat-stream'); const { Readable } = require('stream'); const FormData = require('form-data'); +const path = require("path"); const fs = require('fs'); const maxRetries = 5; const retryDelay = 5000; // 5 seconds From 7e98ed2e4923b581881961a6e8a993c1859c68ed Mon Sep 17 00:00:00 2001 From: Braeden Sowinski Date: Sun, 10 Sep 2023 19:32:27 -0700 Subject: [PATCH 7/8] fix/file not downloaded --- package.json | 2 +- util/NitradoAPI.js | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index 4dc7a9d..c64227b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "dayzr-bot", - "version": "10.0.3", + "version": "10.0.4", "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 d2fca4d..85e3408 100644 --- a/util/NitradoAPI.js +++ b/util/NitradoAPI.js @@ -224,10 +224,10 @@ module.exports = { const posted = await PostServerSettings(client, "config", "disableBaseDamage", pref); if (posted == 1) return 1; - const remoteDir = '/games/ni8434545_1/ftproot/dayzxb_missions/dayzOffline.chernarusplus'; + const remoteDir = `/games/${client.config.Nitrado.ServerID}/ftproot/dayzxb_missions/dayzOffline.chernarusplus`; const remoteFilename = 'cfggameplay.json'; - const jsonDir = path.join(__dirname, '.', 'logs', remoteFilename); + const jsonDir = `../logs/${remoteFilename}`; await module.exports.DownloadNitradoFile(client, `${remoteDir}/${remoteFilename}`, jsonDir); let gameplay = JSON.parse(fs.readFileSync(jsonDir)); From 52ae46857d601e647d065a9fab5313934db1513a Mon Sep 17 00:00:00 2001 From: Braeden Sowinski Date: Sun, 10 Sep 2023 19:36:02 -0700 Subject: [PATCH 8/8] fix/use UserID instead of ServerID --- package.json | 2 +- util/NitradoAPI.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index c64227b..9832c30 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "dayzr-bot", - "version": "10.0.4", + "version": "10.0.5", "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 85e3408..85f02cb 100644 --- a/util/NitradoAPI.js +++ b/util/NitradoAPI.js @@ -224,7 +224,7 @@ module.exports = { const posted = await PostServerSettings(client, "config", "disableBaseDamage", pref); if (posted == 1) return 1; - const remoteDir = `/games/${client.config.Nitrado.ServerID}/ftproot/dayzxb_missions/dayzOffline.chernarusplus`; + const remoteDir = `/games/${client.config.Nitrado.UserID}/ftproot/dayzxb_missions/dayzOffline.chernarusplus`; const remoteFilename = 'cfggameplay.json'; const jsonDir = `../logs/${remoteFilename}`;