From 14a8833f0d607ad03f5e98ee1fa76c087e698a44 Mon Sep 17 00:00:00 2001 From: SowinskiBraeden Date: Fri, 8 Nov 2024 10:28:10 -0800 Subject: [PATCH 1/2] update/simple discord sharding manager --- bot.js | 33 +++++++++++++++++++++++++++++++++ index.js | 33 ++++----------------------------- package.json | 2 +- 3 files changed, 38 insertions(+), 30 deletions(-) create mode 100644 bot.js diff --git a/bot.js b/bot.js new file mode 100644 index 0000000..3856eaa --- /dev/null +++ b/bot.js @@ -0,0 +1,33 @@ +const DayzR = require('./src/DayzRBot'); +const config = require('./config/config'); +const { GatewayIntentBits } = require('discord.js'); + +const path = require("path"); +const fs = require('fs'); +const { HandleActivePlayersList } = require('./util/LogsHandler'); + +// Log all uncaught exceptions before killing process. +process.on('uncaughtException', async (error) => { + console.trace(error); + let d = new Date(); + // Asynchronously write the error message to a log file using Promises + await new Promise((resolve, reject) => { + if (HandleActivePlayersList.lastSendMessage) HandleActivePlayersList.lastSendMessage.delete().catch(error => client.sendError(channel, `HandleActivePlayersList Error: \n${error}`)); // Remove previous embed message before closing + fs.appendFile(path.join(__dirname, "./logs/Logs.log"), + `{"level":"error","message":"${d.getHours()}:${d.getMinutes()} - ${d.getMonth()+1}:${d.getDate()}:${d.getFullYear()} | uncaughtException: ${error.stack}"}`, (logErr) => { + if (logErr) { + console.error('Error writing uncaughtException to log file:', logErr); + reject(logErr); + process.exit() + } else { + resolve(); + } + }); + }); + + // Now gracefully close the program + process.exit() +}); + +let client = new DayzR({ intents: [GatewayIntentBits.Guilds, GatewayIntentBits.GuildMessages, GatewayIntentBits.GuildMembers] }, config); +client.build() diff --git a/index.js b/index.js index 3856eaa..0270ec6 100644 --- a/index.js +++ b/index.js @@ -1,33 +1,8 @@ -const DayzR = require('./src/DayzRBot'); +const { ShardingManager } = require('discord.js'); const config = require('./config/config'); -const { GatewayIntentBits } = require('discord.js'); -const path = require("path"); -const fs = require('fs'); -const { HandleActivePlayersList } = require('./util/LogsHandler'); +const manager = new ShardingManager('./bot.js', { token: config.Token }); -// Log all uncaught exceptions before killing process. -process.on('uncaughtException', async (error) => { - console.trace(error); - let d = new Date(); - // Asynchronously write the error message to a log file using Promises - await new Promise((resolve, reject) => { - if (HandleActivePlayersList.lastSendMessage) HandleActivePlayersList.lastSendMessage.delete().catch(error => client.sendError(channel, `HandleActivePlayersList Error: \n${error}`)); // Remove previous embed message before closing - fs.appendFile(path.join(__dirname, "./logs/Logs.log"), - `{"level":"error","message":"${d.getHours()}:${d.getMinutes()} - ${d.getMonth()+1}:${d.getDate()}:${d.getFullYear()} | uncaughtException: ${error.stack}"}`, (logErr) => { - if (logErr) { - console.error('Error writing uncaughtException to log file:', logErr); - reject(logErr); - process.exit() - } else { - resolve(); - } - }); - }); +manager.on('shardCreate', shard => console.log(`Launched shard ${shard.id}`)); - // Now gracefully close the program - process.exit() -}); - -let client = new DayzR({ intents: [GatewayIntentBits.Guilds, GatewayIntentBits.GuildMessages, GatewayIntentBits.GuildMembers] }, config); -client.build() +manager.spawn(); \ No newline at end of file diff --git a/package.json b/package.json index 9fc4ffb..a0aff17 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "dayzr-bot", - "version": "13.1.13", + "version": "13.3.0", "description": "A General Purpose Discord Bot for DayZ Nitrado Servers.", "main": "index.js", "nodemonConfig": { From 52c946bee56b1db20e807af4d6027c3f7d5467c7 Mon Sep 17 00:00:00 2001 From: SowinskiBraeden Date: Fri, 8 Nov 2024 10:35:27 -0800 Subject: [PATCH 2/2] update/help command to support sharding stats --- commands/help.js | 23 ++++++++++++++++------- package.json | 2 +- 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/commands/help.js b/commands/help.js index 5ad0767..00ad1c5 100644 --- a/commands/help.js +++ b/commands/help.js @@ -133,17 +133,26 @@ module.exports = { return interaction.send({ embeds: [creditsEmbed] }) } else if (args[0].name == 'stats') { const end = new Date().getTime(); + + const totalGuilds = await client.shard.fetchClientValues("guilds.cache.size").then(results => { + return results.reduce((acc, guildCount) => acc + guildCount, 0); + }); + + const totalUsers = await client.shard.broadcastEval(c => { + c.guilds.cache.reduce((acc, guild) => acc + guild.memberCount, 0); + }).then(data => data.reduce((acc, memberCount) => acc + memberCount, 0)); + const stats = new EmbedBuilder() .setColor(client.config.Colors.Default) .setTitle('DayZ Reforger Bot Statistics') .addFields( - { name: 'Guilds', value: `${client.guilds.cache.size}`, inline: true }, - { name: 'Users', value: `${client.users.cache.size}`, inline: true }, - { name: 'Latency', value: `${end - start}ms`, inline: true }, - { name: 'Uptime', value: `${client.secondsToDhms(process.uptime().toFixed(2))}`, inline: true }, - { name: 'Bot Version', value: `${client.config.Dev} v${client.config.Version}`, inline: true }, - { name: 'Discord Version', value: `Discord.js ${package.dependencies["discord.js"]}`, inline: true }, - { name: 'MongoDB Version', value: `MongoDB ${package.dependencies.mongodb}`, inline: true}, + { name: 'Guilds', value: `${totalGuilds}`, inline: false }, + { name: 'Users', value: `${totalUsers}`, inline: false }, + { name: 'Latency', value: `${end - start}ms`, inline: false }, + { name: 'Uptime', value: `${client.secondsToDhms(process.uptime().toFixed(2))}`, inline: false }, + { name: 'Bot Version', value: `${client.config.Dev} v${client.config.Version}`, inline: false }, + { name: 'Discord Version', value: `Discord.js ${package.dependencies["discord.js"]}`, inline: false }, + { name: 'MongoDB Version', value: `MongoDB ${package.dependencies.mongodb}`, inline: false }, ); return interaction.send({ embeds: [stats] }) diff --git a/package.json b/package.json index a0aff17..500a53b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "dayzr-bot", - "version": "13.3.0", + "version": "13.3.1", "description": "A General Purpose Discord Bot for DayZ Nitrado Servers.", "main": "index.js", "nodemonConfig": {