diff --git a/commands/player-list.js b/commands/player-list.js index 1e3f0a6..a33cb79 100644 --- a/commands/player-list.js +++ b/commands/player-list.js @@ -1,3 +1,5 @@ +const { FetchServerSettings } = require('../util/NitradoAPI'); +const { Missions } = require('../database/destinations'); const { EmbedBuilder } = require('discord.js'); module.exports = { @@ -29,19 +31,50 @@ module.exports = { return interaction.send({ embeds: [warnNitradoNotInitialized], flags: (1 << 6) }); } - let activePlayers = await client.dbo.collection("players").find({"connected": true}); + const data = await FetchServerSettings(GuildDB.Nitrado, client, 'commands/player-list.js'); // Fetch server status + + const e = data && data !== 1; // Check if data exists + + const hostname = e ? data.data.gameserver.settings.config.hostname : 'N/A'; + const map = Missions[data.data.gameserver.settings.config.mission]; + const status = e ? data.data.gameserver.status : 'N/A'; + const slots = e ? data.data.gameserver.slots : 'N/A'; + const playersOnline = data.data.gameserver.query.player_current; + + const Statuses = { + "started": {emoji: "🟢", text: "Active"}, + "stopped": {emoji: "🔴", text: "Stopped"}, + "restarting": {emoji: "↻", text: "Restarting"}, + }; + + const emojiStatus = Statuses[status].emoji || "❓"; + const textStatus = Statuses[status].text || "Unknown Status"; + + let activePlayers = await client.dbo.collection("players").find({"connected": true}).toArray(); let des = activePlayers.length > 0 ? `` : `**No Players Online**`; for (let i = 0; i < activePlayers.length; i++) { des += `**- ${activePlayers[i].gamertag}**\n`; } + + const nodes = activePlayers.length === 0; + const serverEmbed = new EmbedBuilder() + .setColor(client.config.Colors.Default) + .setTitle(`Online List - \` ${playersOnline === undefined ? activePlayers.length : playersOnline} \` Player${playersOnline !== 1 ? 's' : ''} Online`) + .addFields( + { name: 'Server:', value: `\` ${hostname} \``, inline: false }, + { name: 'Map:', value: `\` ${map} \``, inline: true }, + { name: 'Status:', value: `\` ${emojiStatus} ${textStatus} \``, inline: true }, + { name: 'Slots:', value: `\` ${slots} \``, inline: true } + ); const activePlayersEmbed = new EmbedBuilder() .setColor(client.config.Colors.Default) - .setTitle(`Online List - ${activePlayers.length} Player${(activePlayers.length>1||activePlayers.length==0)?'s':''} Online`) - .setDescription(des); + .setTimestamp() + .setTitle(`Players Online:`) + .setDescription(des || (nodes ? "No Players Online :(" : "")); - return interaction.send({ embeds: [activePlayersEmbed] }); + return interaction.send({ embeds: [serverEmbed, activePlayersEmbed] }); }, }, } \ No newline at end of file diff --git a/commands/server.js b/commands/server.js index 81e7892..ea3f3cb 100644 --- a/commands/server.js +++ b/commands/server.js @@ -97,21 +97,6 @@ module.exports = { if (GuildDB.hasBotAdmin && interaction.member.roles.filter(e => GuildDB.botAdminRoles.indexOf(e) !== -1).length > 0) canUseCommand = true; if (!canUseCommand) return interaction.send({ content: 'You don\'t have the permissions to use this command.' }); - const NitradoCred = client.exists(GuildDB.Nitrado) ? { - ServerID: GuildDB.Nitrado.ServerID, - UserID: GuildDB.Nitrado.UserID, - Auth: decrypt( - GuildDB.Nitrado.Auth, - client.config.EncryptionMethod, - client.key, - client.encryptionIV - ) - } : { - ServerID: null, - UserID: null, - Auth: null - } - if (args[0].name == 'initialize') { if (client.exists(GuildDB.Nitrado)) { @@ -171,7 +156,7 @@ module.exports = { if (args[0].name == 'ban-player') { - let data = await BanPlayer(NitradoCred, client, args[0].options[0].value); + let data = await BanPlayer(GuildDB.Nitrado, client, args[0].options[0].value); if (data == 1) { let failed = new EmbedBuilder() @@ -189,7 +174,7 @@ module.exports = { } else if (args[0].name == 'unban-player') { - let data = UnbanPlayer(NitradoCred, client, args[0].options[0].value); + let data = UnbanPlayer(GuildDB.Nitrado, client, args[0].options[0].value); if (data == 1) { let failed = new EmbedBuilder() @@ -210,7 +195,7 @@ module.exports = { restart_message = 'Server being restarted by an admin.'; message = 'The server was restarted by an admin!'; - RestartServer(NitradoCred, client, restart_message, message); + RestartServer(GuildDB.Nitrado, client, restart_message, message); return interaction.send({ embeds: [new EmbedBuilder().setColor(client.config.Colors.Yellow).setDescription('The server will restart shortly.')], flags: (1 << 6) }); } else if (args[0].name == "auto-restart") { @@ -219,7 +204,7 @@ module.exports = { // Enable/Disable a 10min periodic server status check. if (!client.arIntervalIds.has(GuildDB.serverID)) { - client.arIntervalIds.set(GuildDB.serverID, setInterval(CheckServerStatus, client.arInterval, NitradoCred, client)); + client.arIntervalIds.set(GuildDB.serverID, setInterval(CheckServerStatus, client.arInterval, GuildDB.Nitrado, client)); pref = 1; } else { msg = 'Auto server restart periodic check disabled.' @@ -241,7 +226,7 @@ module.exports = { const preference = args[0].options[0].value; await interaction.deferReply({ flags: (1 << 6) }); - const disableBaseDamageFailed = await DisableBaseDamage(NitradoCred, client, preference); + const disableBaseDamageFailed = await DisableBaseDamage(GuildDB.Nitrado, client, preference); if (disableBaseDamageFailed) return interaction.editReply({ embeds: [new EmbedBuilder().setColor(client.config.Colors.Red).setDescription('Failed to set **disableBaseDamage**. This can result from a variety of reasons:\nNitrado servers may be experiencing issues\nThe DayZ.R Bot may be experiencing issues\nYour Nitrado credentials were entered incorrectly')], flags: (1 << 6) }); return interaction.editReply({ embeds: [new EmbedBuilder().setColor(client.config.Colors.Green).setDescription(`Successfully set **disableBaseDamage** to ${preference}.\nRestart the DayZ server to apply these changes.`)], flags: (1 << 6) }); @@ -250,7 +235,7 @@ module.exports = { const preference = args[0].options[0].value; await interaction.deferReply({ flags: (1 << 6) }); - const disableContainerDamageFailed = await DisableContainerDamage(NitradoCred, client, preference); + const disableContainerDamageFailed = await DisableContainerDamage(GuildDB.Nitrado, client, preference); if (disableContainerDamageFailed) return interaction.editReply({ embeds: [new EmbedBuilder().setColor(client.config.Colors.Red).setDescription('Failed to set **disableContainerDamage**. This can result from a variety of reasons:\nNitrado servers may be experiencing issues\nThe DayZ.R Bot may be experiencing issues\nYour Nitrado credentials were entered incorrectly')], flags: (1 << 6) }); return interaction.editReply({ embeds: [new EmbedBuilder().setColor(client.config.Colors.Green).setDescription(`Successfully set **disableContainerDamage** to ${preference}.\nRestart the DayZ server to apply these changes.`)], flags: (1 << 6) }); diff --git a/database/destinations.js b/database/destinations.js index cd5fea9..c200550 100644 --- a/database/destinations.js +++ b/database/destinations.js @@ -1,6 +1,11 @@ const { calculateVector } = require('../util/Vector'); module.exports = { + Missions: { + "dayzOffline.chernarusplus": "Chernarus", + "dayzOffline.enoch": "Livonia", + }, + // Calculates the nearest location to a given coordinate nearest: (pos, mission) => { let tempDest; diff --git a/package.json b/package.json index b060a0e..bc89014 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "dayzr-bot", - "version": "13.0.1", + "version": "13.0.2", "description": "A General Purpose Discord Bot for DayZ Nitrado Servers.", "main": "index.js", "nodemonConfig": { diff --git a/src/DayzRBot.js b/src/DayzRBot.js index b41c69e..95959b7 100644 --- a/src/DayzRBot.js +++ b/src/DayzRBot.js @@ -14,6 +14,7 @@ const { decrypt } = require('../util/Cryptic'); // Data structures imports const { getDefaultPlayer, UpdatePlayer } = require('../database/player'); +const { Missions } = require('../database/destinations'); const { GetGuild } = require('../database/guild'); const path = require("path"); @@ -23,11 +24,6 @@ const readline = require('readline'); const minute = 60000; // 1 minute in milliseconds const arInterval = 600000; // Set auto-restart interval 10 minutes (600,000ms) -const Missions = { - "dayzOffline.chernarusplus": "Chernarus", - "dayzOffline.enoch": "Livonia", -}; - class DayzRBot extends Client { constructor(options, config) { @@ -88,6 +84,15 @@ class DayzRBot extends Client { if (interaction.type == InteractionType.ApplicationCommand) { let GuildDB = await GetGuild(this, interaction.guild_id); + if (this.exists(GuildDB.Nitrado) && this.exists(GuildDB.Nitrado.Auth)) { + GuildDB.Nitrado.Auth = decrypt( + GuildDB.Nitrado.Auth, + this.config.EncryptionMethod, + this.key, + this.encryptionIV + ); + } + for (const [factionID, data] of Object.entries(GuildDB.factionArmbands)) { const guild = this.guilds.cache.get(GuildDB.serverID); const role = guild.roles.cache.find(role => role.id == factionID); diff --git a/util/LogsHandler.js b/util/LogsHandler.js index a28dceb..1009d86 100644 --- a/util/LogsHandler.js +++ b/util/LogsHandler.js @@ -4,6 +4,7 @@ const { SendConnectionLogs, DetectCombatLog } = require('./AdminLogsHandler'); const { getDefaultPlayer } = require('../database/player'); const { FetchServerSettings } = require('../util/NitradoAPI'); const { UpdatePlayer, insertPVPstats, createWeaponStats } = require('../database/player') +const { Missions } = require('../database/destinations'); let lastSendMessage; @@ -205,62 +206,55 @@ module.exports = { HandleActivePlayersList: async (nitrado_cred, client, guild) => { client.activePlayersTick = 0; // reset hour tick - const data = await FetchServerSettings(nitrado_cred, client, 'HandleActivePlayersList'); // Fetch server status + if (!client.exists(guild.activePlayersChannel)) return; + const channel = client.GetChannel(guild.activePlayersChannel); - if (data && data !== 1) { - let hostname = data.data.gameserver.settings.config.hostname; - let map = data.data.gameserver.settings.config.mission.slice(12); - let status = data.data.gameserver.status; - let slots = data.data.gameserver.slots; - let playersOnline = data.data.gameserver.query.player_current; + const data = await FetchServerSettings(GuildDB.Nitrado, client, 'HandleActivePlayersList'); // Fetch server status + const e = data && data !== 1; // Check if data exists + + const hostname = e ? data.data.gameserver.settings.config.hostname : 'N/A'; + const map = Missions[data.data.gameserver.settings.config.mission]; + const status = e ? data.data.gameserver.status : 'N/A'; + const slots = e ? data.data.gameserver.slots : 'N/A'; + const playersOnline = e ? data.data.gameserver.query.player_current : undefined; - let statusEmoji; - let statusText; - if (status === "started") { - statusEmoji = "🟢"; - statusText = "Active"; - } else if (status === "stopped") { - statusEmoji = "🔴"; - statusText = "Stopped"; - } else if (status === "restarting") { - statusEmoji = "↻"; - statusText = "Restarting"; - } else { - statusEmoji = "❓"; // Unknown status - statusText = "Unknown Status"; - } + const Statuses = { + "started": {emoji: "🟢", text: "Active"}, + "stopped": {emoji: "🔴", text: "Stopped"}, + "restarting": {emoji: "↻", text: "Restarting"}, + }; - if (!client.exists(guild.activePlayersChannel)) return; + const emojiStatus = Statuses[status].emoji || "❓"; + const textStatus = Statuses[status].text || "Unknown Status"; - const channel = client.GetChannel(guild.activePlayersChannel); - let activePlayers = await client.dbo.collection("players").find({"connected": true}).toArray(); + let activePlayers = await client.dbo.collection("players").find({"connected": true}).toArray(); - let des = ``; - for (let i = 0; i < activePlayers.length; i++) { - des += `**- ${activePlayers[i].gamertag}**\n`; - } - const nodes = activePlayers.length === 0; - const PlayersEmbed = new EmbedBuilder() - .setColor(client.config.Colors.Default) - .setTitle(`Online List \` ${playersOnline === undefined ? activePlayers.length : playersOnline} \` Player${playersOnline !== 1 ? 's' : ''} Online`) - .addFields( - { name: 'Server:', value: `\` ${hostname} \``, inline: false }, - { name: 'Map:', value: `\` ${map} \``, inline: true }, - { name: 'Status:', value: `\` ${statusEmoji} ${statusText} \``, inline: true }, - { name: 'Slots:', value: `\` ${slots} \``, inline: true } - ); - - const activePlayersEmbed = new EmbedBuilder() - .setColor(client.config.Colors.Default) - .setTimestamp() - .setTitle(`Players Online:`) - .setDescription(des || (nodes ? "No Players Online :(" : "")); - - if (lastSendMessage) lastSendMessage.delete().catch(error => client.sendError(channel, `HandleActivePlayersList Error: \n${error}`)); // Remove previous message before reprinting - - return channel.send({ embeds: [PlayersEmbed, activePlayersEmbed] }).then(sentMessage => - lastSendMessage = sentMessage - ); + let des = activePlayers.length > 0 ? `` : `**No Players Online**`; + for (let i = 0; i < activePlayers.length; i++) { + des += `**- ${activePlayers[i].gamertag}**\n`; } + + const nodes = activePlayers.length === 0; + const serverEmbed = new EmbedBuilder() + .setColor(client.config.Colors.Default) + .setTitle(`Online List - \` ${playersOnline === undefined ? activePlayers.length : playersOnline} \` Player${playersOnline !== 1 ? 's' : ''} Online`) + .addFields( + { name: 'Server:', value: `\` ${hostname} \``, inline: false }, + { name: 'Map:', value: `\` ${map} \``, inline: true }, + { name: 'Status:', value: `\` ${emojiStatus} ${textStatus} \``, inline: true }, + { name: 'Slots:', value: `\` ${slots} \``, inline: true } + ); + + const activePlayersEmbed = new EmbedBuilder() + .setColor(client.config.Colors.Default) + .setTimestamp() + .setTitle(`Players Online:`) + .setDescription(des || (nodes ? "No Players Online :(" : "")); + + if (lastSendMessage) lastSendMessage.delete().catch(error => client.sendError(channel, `HandleActivePlayersList Error: \n${error}`)); // Remove previous message before reprinting + + return channel.send({ embeds: [serverEmbed, activePlayersEmbed] }).then(sentMessage => + lastSendMessage = sentMessage + ); } };