From d3b211a30a02b77bd7a80dc0e91a840bff60b85e Mon Sep 17 00:00:00 2001 From: Braeden Sowinski Date: Sun, 3 Sep 2023 17:09:48 -0700 Subject: [PATCH] change/make certain functions private --- package.json | 2 +- util/AlarmsHandler.js | 80 +++++++++++++++--------------- util/NitradoAPI.js | 113 ++++++++++++++---------------------------- 3 files changed, 79 insertions(+), 116 deletions(-) diff --git a/package.json b/package.json index bd2605f..24c6eeb 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "dayzr-bot", - "version": "9.4.3", + "version": "9.4.4", "description": "A General Purpose Discord Bot for DayZ Nitrado Servers.", "main": "index.js", "nodemonConfig": { diff --git a/util/AlarmsHandler.js b/util/AlarmsHandler.js index 2d00769..9671f62 100644 --- a/util/AlarmsHandler.js +++ b/util/AlarmsHandler.js @@ -1,10 +1,49 @@ const { BanPlayer, UnbanPlayer } = require('./NitradoAPI'); const { EmbedBuilder } = require('discord.js'); +// Private functions (only called locally) + +const ExpireEvent = async(client, guild, e) => { + let hasMR = (guild.memberRole != ""); + const channel = client.GetChannel(e.channel); + if (client.exists(e.channel)) channel.send({ embeds: [new EmbedBuilder().setColor(client.config.colors.Default).setDescription(`${hasMR ? `<@&${guild.memberRole}>\n`:''}**The ${e.name} Event has ended!**`)] }); + + client.dbo.collection("guilds").updateOne({ "server.serverID": guild.serverID }, { + $pull: { + "server.events": e + } + }, function(err, res) { + if (err) return client.sendError(client.GetChannel(guild.adminLogsChannel), err); + }); +} + +const HandlePlayerTrackEvent = async (client, guild, e) => { + let player = guild.playerstats.find(stat => stat.gamertag == e.gamertag ); + let hasMR = (guild.memberRole != "") + + let newDt = await client.getDateEST(player.time); + let unixTime = Math.floor(newDt.getTime()/1000); + + const trackEvent = new EmbedBuilder() + .setColor(client.config.Colors.Default) + .setDescription(`**${e.name} Event**\n${e.gamertag} was located at **[${player.pos[0]}, ${player.pos[1]}](https://www.izurvive.com/chernarusplussatmap/#location=${player.pos[0]};${player.pos[1]})** at `); + + if (!client.exists(e.channel)) return ExpireEvent(client, guild, e); // Expire event since it has invalid channel. + const channel = client.GetChannel(e.channel); + channel.send({ embeds: [trackEvent], content: `${hasMR ? `\n<@&${guild.memberRole}>`:'@here'}` }); + + let now = new Date(); + let diff = ((now - e.creationDate) / 1000) / 60; + let minutesBetweenDates = Math.abs(Math.round(diff)); + + if (minutesBetweenDates >= e.time) ExpireEvent(client, guild, e); +} + +// Public functions (called externally) + module.exports = { HandleAlarmsAndUAVs: async (client, guildId, data) => { - let guild = await client.GetGuild(guildId); for (let i = 0; i < guild.alarms.length; i++) { @@ -125,50 +164,13 @@ module.exports = { } }, - ExpireEvent: async(client, guild, e) => { - let hasMR = (guild.memberRole != ""); - const channel = client.GetChannel(e.channel); - if (client.exists(e.channel)) channel.send({ embeds: [new EmbedBuilder().setColor(client.config.colors.Default).setDescription(`${hasMR ? `<@&${guild.memberRole}>\n`:''}**The ${e.name} Event has ended!**`)] }); - - client.dbo.collection("guilds").updateOne({ "server.serverID": guild.serverID }, { - $pull: { - "server.events": e - } - }, function(err, res) { - if (err) return client.sendError(client.GetChannel(guild.adminLogsChannel), err); - }); - }, - - HandlePlayerTrackEvent: async (client, guild, e) => { - - let player = guild.playerstats.find(stat => stat.gamertag == e.gamertag ); - let hasMR = (guild.memberRole != "") - - let newDt = await client.getDateEST(player.time); - let unixTime = Math.floor(newDt.getTime()/1000); - - const trackEvent = new EmbedBuilder() - .setColor(client.config.Colors.Default) - .setDescription(`**${e.name} Event**\n${e.gamertag} was located at **[${player.pos[0]}, ${player.pos[1]}](https://www.izurvive.com/chernarusplussatmap/#location=${player.pos[0]};${player.pos[1]})** at `); - - if (!client.exists(e.channel)) return module.exports.ExpireEvent(client, guild, e); // Expire event since it has invalid channel. - const channel = client.GetChannel(e.channel); - channel.send({ embeds: [trackEvent], content: `${hasMR ? `\n<@&${guild.memberRole}>`:'@here'}` }); - - let now = new Date(); - let diff = ((now - e.creationDate) / 1000) / 60; - let minutesBetweenDates = Math.abs(Math.round(diff)); - - if (minutesBetweenDates >= e.time) module.exports.ExpireEvent(client, guild, e); - }, - HandleEvents: async (client, guildId) => { let guild = await client.GetGuild(guildId); for (let i = 0; i < guild.events.length; i++) { let event = guild.events[i]; - if (event.type == 'player-track') module.exports.HandlePlayerTrackEvent(client, guild, event); + if (event.type == 'player-track') HandlePlayerTrackEvent(client, guild, event); } }, } diff --git a/util/NitradoAPI.js b/util/NitradoAPI.js index d38e59c..007e994 100644 --- a/util/NitradoAPI.js +++ b/util/NitradoAPI.js @@ -4,87 +4,48 @@ const { Readable } = require('stream'); const FormData = require('form-data'); const fs = require('fs'); const maxRetries = 5; -const retryDelay = 5000; // 5 second +const retryDelay = 5000; // 5 seconds + +// Private functions (only called locally) + +const 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 + } +} + +// 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 - } - }, - - HandlePlayerBan: async (client, gamertag, ban) => { - for (let retries = 0; retries <= maxRetries; retries++) { - try { - // 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); - - 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(`HandlePlayerBans: Failed to fetch data after ${maxRetries} retries`); - } - await new Promise(resolve => setTimeout(resolve, retryDelay)); // Delay before retrying - } - }, - /* - Allows more explicit function names outside this file; - i.e BanPlayer() & UnbanPlayer() that both call to the - parent function HandlePlayerBan() rather than write - two whole different functions for each. + Export explicit function names; i.e BanPlayer() & UnbanPlayer() + that call to the private parent function HandlePlayerBan() + rather than write two whole different functions for each. */ - BanPlayer: async (client, gamertag) => module.exports.HandlePlayerBan(client, gamertag, true), - UnbanPlayer: async (client, gamertag) => module.exports.HandlePlayerBan(client, gamertag, false), + BanPlayer: async (client, gamertag) => HandlePlayerBan(client, gamertag, true), + UnbanPlayer: async (client, gamertag) => HandlePlayerBan(client, gamertag, false), RestartServer: async (client) => { for (let retries = 0; retries < maxRetries; retries++) {