fix/player-list command + auto player list + refactors for issue #28

This commit is contained in:
SowinskiBraeden committed 2024-04-06 11:34:40 -07:00
1 parent 7c2373e03e
commit 9ab1a43238
6 files changed
+103 -81

No files matched your search

+37 -4
View File
@@ -1,3 +1,5 @@
const { FetchServerSettings } = require('../util/NitradoAPI');
const { Missions } = require('../database/destinations');
const { EmbedBuilder } = require('discord.js'); const { EmbedBuilder } = require('discord.js');
module.exports = { module.exports = {
@@ -29,19 +31,50 @@ module.exports = {
return interaction.send({ embeds: [warnNitradoNotInitialized], flags: (1 << 6) }); 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**`; let des = activePlayers.length > 0 ? `` : `**No Players Online**`;
for (let i = 0; i < activePlayers.length; i++) { for (let i = 0; i < activePlayers.length; i++) {
des += `**- ${activePlayers[i].gamertag}**\n`; 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() const activePlayersEmbed = new EmbedBuilder()
.setColor(client.config.Colors.Default) .setColor(client.config.Colors.Default)
.setTitle(`Online List - ${activePlayers.length} Player${(activePlayers.length>1||activePlayers.length==0)?'s':''} Online`) .setTimestamp()
.setDescription(des); .setTitle(`Players Online:`)
.setDescription(des || (nodes ? "No Players Online :(" : ""));
return interaction.send({ embeds: [activePlayersEmbed] }); return interaction.send({ embeds: [serverEmbed, activePlayersEmbed] });
}, },
}, },
} }
+6 -21
View File
@@ -97,21 +97,6 @@ module.exports = {
if (GuildDB.hasBotAdmin && interaction.member.roles.filter(e => GuildDB.botAdminRoles.indexOf(e) !== -1).length > 0) canUseCommand = true; 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.' }); 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 (args[0].name == 'initialize') {
if (client.exists(GuildDB.Nitrado)) { if (client.exists(GuildDB.Nitrado)) {
@@ -171,7 +156,7 @@ module.exports = {
if (args[0].name == 'ban-player') { 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) { if (data == 1) {
let failed = new EmbedBuilder() let failed = new EmbedBuilder()
@@ -189,7 +174,7 @@ module.exports = {
} else if (args[0].name == 'unban-player') { } 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) { if (data == 1) {
let failed = new EmbedBuilder() let failed = new EmbedBuilder()
@@ -210,7 +195,7 @@ module.exports = {
restart_message = 'Server being restarted by an admin.'; restart_message = 'Server being restarted by an admin.';
message = 'The server was 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) }); 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") { } else if (args[0].name == "auto-restart") {
@@ -219,7 +204,7 @@ module.exports = {
// Enable/Disable a 10min periodic server status check. // Enable/Disable a 10min periodic server status check.
if (!client.arIntervalIds.has(GuildDB.serverID)) { 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; pref = 1;
} else { } else {
msg = 'Auto server restart periodic check disabled.' msg = 'Auto server restart periodic check disabled.'
@@ -241,7 +226,7 @@ module.exports = {
const preference = args[0].options[0].value; const preference = args[0].options[0].value;
await interaction.deferReply({ flags: (1 << 6) }); 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) }); 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) }); 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; const preference = args[0].options[0].value;
await interaction.deferReply({ flags: (1 << 6) }); 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) }); 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) }); 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) });
+5
View File
@@ -1,6 +1,11 @@
const { calculateVector } = require('../util/Vector'); const { calculateVector } = require('../util/Vector');
module.exports = { module.exports = {
Missions: {
"dayzOffline.chernarusplus": "Chernarus",
"dayzOffline.enoch": "Livonia",
},
// Calculates the nearest location to a given coordinate // Calculates the nearest location to a given coordinate
nearest: (pos, mission) => { nearest: (pos, mission) => {
let tempDest; let tempDest;
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "dayzr-bot", "name": "dayzr-bot",
"version": "13.0.1", "version": "13.0.2",
"description": "A General Purpose Discord Bot for DayZ Nitrado Servers.", "description": "A General Purpose Discord Bot for DayZ Nitrado Servers.",
"main": "index.js", "main": "index.js",
"nodemonConfig": { "nodemonConfig": {
+10 -5
View File
@@ -14,6 +14,7 @@ const { decrypt } = require('../util/Cryptic');
// Data structures imports // Data structures imports
const { getDefaultPlayer, UpdatePlayer } = require('../database/player'); const { getDefaultPlayer, UpdatePlayer } = require('../database/player');
const { Missions } = require('../database/destinations');
const { GetGuild } = require('../database/guild'); const { GetGuild } = require('../database/guild');
const path = require("path"); const path = require("path");
@@ -23,11 +24,6 @@ const readline = require('readline');
const minute = 60000; // 1 minute in milliseconds const minute = 60000; // 1 minute in milliseconds
const arInterval = 600000; // Set auto-restart interval 10 minutes (600,000ms) const arInterval = 600000; // Set auto-restart interval 10 minutes (600,000ms)
const Missions = {
"dayzOffline.chernarusplus": "Chernarus",
"dayzOffline.enoch": "Livonia",
};
class DayzRBot extends Client { class DayzRBot extends Client {
constructor(options, config) { constructor(options, config) {
@@ -88,6 +84,15 @@ class DayzRBot extends Client {
if (interaction.type == InteractionType.ApplicationCommand) { if (interaction.type == InteractionType.ApplicationCommand) {
let GuildDB = await GetGuild(this, interaction.guild_id); 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)) { for (const [factionID, data] of Object.entries(GuildDB.factionArmbands)) {
const guild = this.guilds.cache.get(GuildDB.serverID); const guild = this.guilds.cache.get(GuildDB.serverID);
const role = guild.roles.cache.find(role => role.id == factionID); const role = guild.roles.cache.find(role => role.id == factionID);
+44 -50
View File
@@ -4,6 +4,7 @@ const { SendConnectionLogs, DetectCombatLog } = require('./AdminLogsHandler');
const { getDefaultPlayer } = require('../database/player'); const { getDefaultPlayer } = require('../database/player');
const { FetchServerSettings } = require('../util/NitradoAPI'); const { FetchServerSettings } = require('../util/NitradoAPI');
const { UpdatePlayer, insertPVPstats, createWeaponStats } = require('../database/player') const { UpdatePlayer, insertPVPstats, createWeaponStats } = require('../database/player')
const { Missions } = require('../database/destinations');
let lastSendMessage; let lastSendMessage;
@@ -205,62 +206,55 @@ module.exports = {
HandleActivePlayersList: async (nitrado_cred, client, guild) => { HandleActivePlayersList: async (nitrado_cred, client, guild) => {
client.activePlayersTick = 0; // reset hour tick 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) { const data = await FetchServerSettings(GuildDB.Nitrado, client, 'HandleActivePlayersList'); // Fetch server status
let hostname = data.data.gameserver.settings.config.hostname; const e = data && data !== 1; // Check if data exists
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;
let statusEmoji; const hostname = e ? data.data.gameserver.settings.config.hostname : 'N/A';
let statusText; const map = Missions[data.data.gameserver.settings.config.mission];
if (status === "started") { const status = e ? data.data.gameserver.status : 'N/A';
statusEmoji = "🟢"; const slots = e ? data.data.gameserver.slots : 'N/A';
statusText = "Active"; const playersOnline = e ? data.data.gameserver.query.player_current : undefined;
} else if (status === "stopped") {
statusEmoji = "🔴";
statusText = "Stopped";
} else if (status === "restarting") {
statusEmoji = "↻";
statusText = "Restarting";
} else {
statusEmoji = "❓"; // Unknown status
statusText = "Unknown Status";
}
if (!client.exists(guild.activePlayersChannel)) return; const Statuses = {
"started": {emoji: "🟢", text: "Active"},
"stopped": {emoji: "🔴", text: "Stopped"},
"restarting": {emoji: "↻", text: "Restarting"},
};
const channel = client.GetChannel(guild.activePlayersChannel); const emojiStatus = Statuses[status].emoji || "❓";
let activePlayers = await client.dbo.collection("players").find({"connected": true}).toArray(); const textStatus = Statuses[status].text || "Unknown Status";
let des = ``; let activePlayers = await client.dbo.collection("players").find({"connected": true}).toArray();
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() let des = activePlayers.length > 0 ? `` : `**No Players Online**`;
.setColor(client.config.Colors.Default) for (let i = 0; i < activePlayers.length; i++) {
.setTimestamp() des += `**- ${activePlayers[i].gamertag}**\n`;
.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
);
} }
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
);
} }
}; };