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/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/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 258c096..500a53b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "dayzr-bot", - "version": "13.2.0", + "version": "13.3.1", "description": "A General Purpose Discord Bot for DayZ Nitrado Servers.", "main": "index.js", "nodemonConfig": {