8 Commits
45 changed files with 1582 additions and 1566 deletions

No files matched your search

+1 -1
View File
@@ -13,7 +13,7 @@ process.on('uncaughtException', async (error) => {
// 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"),
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);
+4 -4
View File
@@ -1,4 +1,4 @@
const { EmbedBuilder, ActionRowBuilder, ButtonBuilder, ButtonStyle, StringSelectMenuBuilder } = require('discord.js');
const { EmbedBuilder, ActionRowBuilder, ButtonBuilder, ButtonStyle, StringSelectMenuBuilder, PermissionsBitField } = require('discord.js');
const CommandOptions = require('../util/CommandOptionTypes').CommandOptionTypes;
const bitfieldCalculator = require('discord-bitfield-calculator');
const { Armbands } = require('../database/armbands.js');
@@ -125,10 +125,10 @@ module.exports = {
*/
run: async (client, interaction, args, { GuildDB }) => {
const permissions = bitfieldCalculator.permissions(interaction.member.permissions);
const permissions = new PermissionsBitField(interaction.member.permissions).toArray();
let canUseCommand = false;
if (permissions.includes("MANAGE_GUILD")) canUseCommand = true;
if (permissions.includes("ManageGuild")) 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.' });
@@ -409,4 +409,4 @@ module.exports = {
}
}
}
}
+18 -18
View File
@@ -1,4 +1,4 @@
const { EmbedBuilder, ActionRowBuilder, ButtonBuilder, ButtonStyle, StringSelectMenuBuilder } = require('discord.js');
const { EmbedBuilder, ActionRowBuilder, ButtonBuilder, ButtonStyle, StringSelectMenuBuilder, PermissionsBitField } = require('discord.js');
const CommandOptions = require('../util/CommandOptionTypes').CommandOptionTypes;
const bitfieldCalculator = require('discord-bitfield-calculator');
@@ -15,11 +15,11 @@ const generateAlarmMenus = (alarms, customId, placeholder, description) => {
currentAlarmComponents.addOptions({
label: alarm.name,
description: description,
value: alarm.name,
value: alarm.name,
});
});
alarmComponents.push(new ActionRowBuilder().addComponents(currentAlarmComponents));
id++;
id++;
}
return alarmComponents;
@@ -34,7 +34,7 @@ module.exports = {
permissions: {
channel: ["VIEW_CHANNEL", "SEND_MESSAGES", "EMBED_LINKS"],
member: ["MANAGE_GUILD"],
},
},
options: [
{
name: "create",
@@ -229,11 +229,11 @@ module.exports = {
* @param {string[]} args
* @param {*} param3
*/
run: async (client, interaction, args, { GuildDB }) => {
const permissions = bitfieldCalculator.permissions(interaction.member.permissions);
run: async (client, interaction, args, { GuildDB }) => {
const permissions = new PermissionsBitField(interaction.member.permissions).toArray();
let canUseCommand = false;
if (permissions.includes("MANAGE_GUILD")) canUseCommand = true;
if (permissions.includes("ManageGuild")) 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.' });
@@ -293,9 +293,9 @@ module.exports = {
return interaction.send({ components: alarmComponents, flags: (1 << 6) });
} else if (args[0].name == 'add-player' || args[0].name == 'remove-player') {
const add = args[0].name == 'add-player';
if (GuildDB.alarms.length == 0) return interaction.send({ embeds: [new EmbedBuilder().setColor(client.config.Colors.Default).setDescription(`**Notice:** No Existing Alarms to ${add?'Add':'Remove'} Player ${add?'to':'from'}.`)] });
const alarmComponents = generateAlarmMenus(
@@ -422,7 +422,7 @@ module.exports = {
if (interaction.customId.split('-')[1] == 'yes') {
let alarm = GuildDB.alarms.find(alarm => alarm.name == interaction.customId.split('-')[2]);
client.dbo.collection('guilds').updateOne({ 'server.serverID': GuildDB.serverID }, {
$pull: {
'server.alarms': alarm,
@@ -430,17 +430,17 @@ module.exports = {
}, (err, res) => {
if (err) return client.sendInternalError(interaction, err);
});
let successEmbed = new EmbedBuilder()
.setColor(client.config.Colors.Green)
.setDescription(`**Success:** Successfully Deleted **${interaction.customId.split('-')[2]}**`);
return interaction.update({ embeds: [successEmbed], components: [] });
} else {
let successEmbed = new EmbedBuilder()
.setColor(client.config.Colors.Green)
.setDescription(`The Zone Alarm **${interaction.customId.split('-')[2]}** will not be deleted.`);
return interaction.update({ embeds: [successEmbed], components: []});
}
}
@@ -449,14 +449,14 @@ module.exports = {
run: async(client, interaction, GuildDB) => {
let alarm = GuildDB.alarms.find(alarm => alarm.name == interaction.values[0]);
let alarmIndex = GuildDB.alarms.indexOf(alarm);
let playerStat = await client.dbo.collection("players").findOne({"gamertag": interaction.customId.split('-')[2]});
if (!client.exists(playerStat)) return interaction.update({ embeds: [new EmbedBuilder().setColor(client.config.Colors.Yellow).setDescription('**Not Found** This player cannot be found, the gamertag may be incorrect or this player has not logged onto the server before.')], components: [] });
let add = interaction.customId.split('-')[1] == 'add';
if (add) alarm.ignoredPlayers.push(playerStat.playerID);
else alarm.ignoredPlayers = alarm.ignoredPlayers.filter((v) => {
else alarm.ignoredPlayers = alarm.ignoredPlayers.filter((v) => {
return v != playerStat.playerID;
});
@@ -514,7 +514,7 @@ module.exports = {
value: alarm.rules[i]
});
}
const opt = new ActionRowBuilder().addComponents(alarmRules);
return interaction.update({ components: [opt], flags: (1 << 6) });
@@ -642,5 +642,5 @@ module.exports = {
return interaction.update({ embeds: [successEmbed], components: [] });
}
}
}
}
}
+4 -4
View File
@@ -22,12 +22,12 @@ module.exports = {
*/
run: async (client, interaction, args, { GuildDB }) => {
if (GuildDB.customChannelStatus==true&&!GuildDB.allowedChannels.includes(interaction.channel_id))
return interaction.send({ content: `You are not allowed to use the bot in this channel.`, flags: (1 << 6) });
return interaction.send({ content: `You are not allowed to use the bot in this channel.`, flags: (1 << 6) });
let available = new StringSelectMenuBuilder()
.setCustomId(`View-1-${interaction.member.user.id}`)
.setPlaceholder('View an armband from list 1')
let availableNext = new StringSelectMenuBuilder()
.setCustomId(`View-2-${interaction.member.user.id}`)
.setPlaceholder('View an armband from list 2')
@@ -55,7 +55,7 @@ module.exports = {
if (tracker > 25) {
opt2 = new ActionRowBuilder().addComponents(availableNext);
compList.push(opt2);
}
}
return interaction.send({ components: compList, flags: (1 << 6) });
},
+4 -4
View File
@@ -64,7 +64,7 @@ module.exports = {
}
let banking = await client.dbo.collection("users").findOne({"user.userID": interaction.member.user.id}).then(banking => banking);
if (!banking) {
banking = await createUser(interaction.member.user.id, GuildDB.serverID, GuildDB.startingBalance, client)
if (!client.exists(banking)) return client.sendInternalError(interaction, err);
@@ -91,7 +91,7 @@ module.exports = {
if (!client.exists(banking)) return client.sendInternalError(interaction, err);
}
targetUserBanking = targetUserBanking.user;
if (!client.exists(targetUserBanking.guilds[GuildDB.serverID])) {
const success = addUser(banking.guilds, GuildDB.serverID, targetUserID, client, GuildDB.startingBalance);
if (!success) return client.sendInternalError(interaction, 'Failed to add bank');
@@ -141,7 +141,7 @@ module.exports = {
if (!client.exists(banking)) return client.sendInternalError(interaction, err);
}
targetUserBanking = targetUserBanking.user;
if (!client.exists(targetUserBanking.guilds[GuildDB.serverID])) {
const success = addUser(banking.guilds, GuildDB.serverID, targetUserID, client, GuildDB.startingBalance);
if (!success) return client.sendInternalError(interaction, 'Failed to add bank');
@@ -162,4 +162,4 @@ module.exports = {
}
},
},
}
}
+11 -11
View File
@@ -70,7 +70,7 @@ module.exports = {
let banking;
if (args[0].name == 'set' || args[0].name == 'pay') {
banking = await client.dbo.collection("users").findOne({"user.userID": interaction.member.user.id}).then(banking => banking);
if (!banking) {
banking = await createUser(interaction.member.user.id, GuildDB.serverID, GuildDB.startingBalance, client)
if (!client.exists(banking)) return client.sendInternalError(interaction, err);
@@ -87,7 +87,7 @@ module.exports = {
let playerStat = await client.dbo.collection("players").findOne({"gamertag": args[0].options[0].value});
if (!client.exists(playerStat)) return interaction.send({ embeds: [new EmbedBuilder().setColor(client.config.Colors.Yellow).setDescription('**Not Found** This player cannot be found, the gamertag may be incorrect or this player has not logged onto the server before for at least ` 5 minutes `.')] });
if (args[0].options[1].value > banking.guilds[GuildDB.serverID].balance) {
let nsf = new EmbedBuilder()
.setDescription('**Bank Notice:** NSF. Non sufficient funds')
@@ -97,7 +97,7 @@ module.exports = {
}
const newBalance = banking.guilds[GuildDB.serverID].balance - args[0].options[1].value;
client.dbo.collection("users").updateOne({ "user.userID": interaction.member.user.id }, {
$set: {
[`user.guilds.${GuildDB.serverID}.balance`]: newBalance,
@@ -115,24 +115,24 @@ module.exports = {
playerStat.bountiesLength = playerStat.bounties.length; // Will ensure bounties length = # of bounties, even if bountiesLength does not exists in player stat.
await UpdatePlayer(client, playerStat, interaction);
const successEmbed = new EmbedBuilder()
.setTitle('Success')
.setDescription(`Successfully set a **$${args[0].options[1].value.toFixed(2).toLocaleString(undefined, {minimumFractionDigits: 2, maximumFractionDigits: 2})}** bounty on \` ${playerStat.gamertag} \`\nThis can be viewed using </bounty view:1086786904671924267>`)
.setColor(client.config.Colors.Green);
return interaction.send({ embeds: [successEmbed], flags: (1 << 6) });
} else if (args[0].name == 'pay') {
let playerStat = await client.dbo.collection("players").findOne({"discordID": interaction.member.user.id});
if (!client.exists(playerStat)) return interaction.send({ embeds: [new EmbedBuilder().setColor(client.config.Colors.Yellow).setDescription('**Not Found** Your user ID could not be found, contact an Admin.')] });
if (playerStat.bounties.length == 0) {
const noBounty = new EmbedBuilder()
.setColor(client.config.Colors.Yellow)
.setDescription(`You have no bounties to pay off.`)
return interaction.send({ embeds: [noBounty] });
}
@@ -150,14 +150,14 @@ module.exports = {
}
const newBalance = banking.guilds[GuildDB.serverID].balance - (totalBounty * 2);
await client.dbo.collection("users").updateOne({"user.userID":interaction.member.user.id},{$set:{[`user.guilds.${GuildDB.serverID}.balance`]:newBalance}}, (err, res) => {
if (err) return client.sendInternalError(interaction, err);
});
playerStat.bounties = [];
playerStat.bountiesLength = 0;
await UpdatePlayer(client, playerStat, interaction);
const payedOff = new EmbedBuilder()
@@ -171,7 +171,7 @@ module.exports = {
const activeBounties = await client.dbo.collection("players").find({
"bountiesLength": { $gt: 0 }
}).toArray();
let bountiesEmbed = new EmbedBuilder()
.setColor(client.config.Colors.Default)
.setDescription('**Active Boutnies**');
@@ -187,4 +187,4 @@ module.exports = {
}
},
},
}
}
+9 -9
View File
@@ -52,7 +52,7 @@ module.exports = {
const warnArmbadChange = new EmbedBuilder()
.setColor(client.config.Colors.Yellow)
.setDescription(`**Notice:**\n> The faction <@&${args[0].value}> already has an armband selected. Are you sure you would like to change this?`)
const opt = new ActionRowBuilder()
.addComponents(
new ButtonBuilder()
@@ -71,7 +71,7 @@ module.exports = {
let available = new StringSelectMenuBuilder()
.setCustomId(`Claim-${args[0].value}-1-${interaction.member.user.id}`)
.setPlaceholder('Select an armband from list 1 to claim')
let availableNext = new StringSelectMenuBuilder()
.setCustomId(`Claim-${args[0].value}-2-${interaction.member.user.id}`)
.setPlaceholder('Select an armband from list 2 to claim')
@@ -98,7 +98,7 @@ module.exports = {
if (tracker > 25) {
opt2 = new ActionRowBuilder().addComponents(availableNext);
compList.push(opt2);
}
}
return interaction.send({ components: compList });
},
@@ -106,7 +106,7 @@ module.exports = {
Interactions: {
Claim: {
run: async (client, interaction, GuildDB) => {
if (!interaction.customId.endsWith(interaction.member.user.id))
if (!interaction.customId.endsWith(interaction.member.user.id))
return interaction.reply({ content: 'This interaction is not for you', flags: (1 << 6) });
let factionID = interaction.customId.split('-')[1];
@@ -134,7 +134,7 @@ module.exports = {
if (err) return client.sendInternalError(interaction, err);
})
}
client.dbo.collection("guilds").updateOne({'server.serverID': GuildDB.serverID}, query, (err, res) => {
if (err) return client.sendInternalError(interaction, err);
})
@@ -159,14 +159,14 @@ module.exports = {
ChangeArmband: {
run: async (client, interaction, GuildDB) => {
if (!interaction.customId.endsWith(interaction.member.user.id))
if (!interaction.customId.endsWith(interaction.member.user.id))
return interaction.reply({ content: 'This interaction is not for you', flags: (1 << 6) });
if (interaction.customId.split('-')[1]=='yes') {
let available = new StringSelectMenuBuilder()
.setCustomId(`Claim-${interaction.customId.split('-')[2]}-update-1-${interaction.member.user.id}`)
.setPlaceholder('Select an armband from list 1 to claim')
let availableNext = new StringSelectMenuBuilder()
.setCustomId(`Claim-${interaction.customId.split('-')[2]}-update-2-${interaction.member.user.id}`)
.setPlaceholder('Select an armband from list 2 to claim')
@@ -193,9 +193,9 @@ module.exports = {
if (tracker > 25) {
opt2 = new ActionRowBuilder().addComponents(availableNext);
compList.push(opt2);
}
}
return interaction.update({ embeds: [], components: compList });
return interaction.update({ embeds: [], components: compList });
} else {
const cancel = new EmbedBuilder()
+5 -5
View File
@@ -22,7 +22,7 @@ module.exports = {
*/
run: async (client, interaction, args, { GuildDB }) => {
if (GuildDB.customChannelStatus==true&&!GuildDB.allowedChannels.includes(interaction.channel_id)) {
return interaction.send({ content: `You are not allowed to use the bot in this channel.`, flags: (1 << 6) });
return interaction.send({ content: `You are not allowed to use the bot in this channel.`, flags: (1 << 6) });
}
const hasIncomeRole = GuildDB.incomeRoles.some(data => {
@@ -41,7 +41,7 @@ module.exports = {
let banking = await client.dbo.collection("users").findOne({"user.userID": interaction.member.user.id}).then(banking => banking);
if (!banking) {
banking = await createUser(interaction.member.user.id, GuildDB.serverID, GuildDB.startingBalance, client)
if (!client.exists(banking)) return client.sendInternalError(interaction, err);
@@ -54,7 +54,7 @@ module.exports = {
}
if (!client.exists(banking.guilds[GuildDB.serverID].lastIncome)) banking.guilds[GuildDB.serverID].lastIncome = new Date('2000-01-01T00:00:00');
let now = new Date();
let diff = (now - banking.guilds[GuildDB.serverID].lastIncome) / 1000;
diff /= (60 * 60);
@@ -96,7 +96,7 @@ module.exports = {
date.setHours(date.getHours() + GuildDB.incomeLimiter);
diff = (date - now) / 1000;
let timeTillIncome = client.secondsToDhms(diff);
const error = new EmbedBuilder()
.setColor(client.config.Colors.Red)
.setDescription(`You've already collected your income this week. Wait **${timeTillIncome}** to collect again.`);
@@ -105,4 +105,4 @@ module.exports = {
}
},
},
}
}
+4 -4
View File
@@ -53,7 +53,7 @@ module.exports = {
let comp;
if (discord) comp = leaderboard.find(s => s.discordID == discord);
if (gamertag) comp = leaderboard.find(s => s.gamertag == gamertag);
if (gamertag) comp = leaderboard.find(s => s.gamertag == gamertag);
let self = leaderboard.find(s => s.discordID == interaction.member.user.id);
if (!client.exists(comp)) return interaction.send({ embeds: [new EmbedBuilder().setColor(client.config.Colors.Yellow).setDescription(`**Not Found** Unable to find any records with the gamertag or user provided.`)] });
@@ -90,7 +90,7 @@ module.exports = {
const diff = Math.abs(selfData.length - compData.length);
if (selfData.length < compData.length) selfData.unshift(...(new Array(diff).fill(null, 0, diff)));
if (compData.length < selfData.length) compData.unshift(...(new Array(diff).fill(null, 0, diff)));
const chart = {
type: 'line',
data: {
@@ -131,7 +131,7 @@ module.exports = {
},
},
};
const encodedChart = encodeURIComponent(JSON.stringify(chart));
const chartURL = `https://quickchart.io/chart?c=${encodedChart}&bkg=${encodeURIComponent("#ded8d7")}`;
@@ -140,4 +140,4 @@ module.exports = {
return interaction.send({ embeds: [statsEmbed] });
},
},
}
}
+1144 -1143
View File
File diff suppressed because it is too large. Load diff
+8 -8
View File
@@ -1,4 +1,4 @@
const { EmbedBuilder, ActionRowBuilder, StringSelectMenuBuilder } = require('discord.js');
const { EmbedBuilder, ActionRowBuilder, StringSelectMenuBuilder, PermissionsBitField } = require('discord.js');
const CommandOptions = require('../util/CommandOptionTypes').CommandOptionTypes;
const bitfieldCalculator = require('discord-bitfield-calculator');
@@ -31,7 +31,7 @@ module.exports = {
type: CommandOptions.Integer,
required: true,
choices: [
{ name: '10-minutes', value: 10 }, { name: '15-minutes', value: 15 }, { name: '20-minutes', value: 20 }, { name: '25-minutes', value: 25 },
{ name: '10-minutes', value: 10 }, { name: '15-minutes', value: 15 }, { name: '20-minutes', value: 20 }, { name: '25-minutes', value: 25 },
{ name: '30-minutes', value: 30 }, { name: '60-minutes', value: 60 }, { name: '90-minutes', value: 90 }, { name: '120-minutes', value: 120 },
]
},
@@ -80,10 +80,10 @@ module.exports = {
return interaction.send({ embeds: [warnNitradoNotInitialized], flags: (1 << 6) });
}
const permissions = bitfieldCalculator.permissions(interaction.member.permissions);
const permissions = new PermissionsBitField(interaction.member.permissions).toArray();
let canUseCommand = false;
if (permissions.includes("MANAGE_GUILD")) canUseCommand = true;
if (permissions.includes("ManageGuild")) 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.' });
@@ -134,7 +134,7 @@ module.exports = {
value: GuildDB.events[i].name
});
}
const eventsOptions = new ActionRowBuilder().addComponents(events);
return interaction.send({ components: [eventsOptions], flags: (1 << 6) });
@@ -146,7 +146,7 @@ module.exports = {
DeleteEvent: {
run: async(client, interaction, GuildDB) => {
if (!interaction.customId.endsWith(interaction.member.user.id))
if (!interaction.customId.endsWith(interaction.member.user.id))
return interaction.reply({ content: 'This interaction is not for you', flags: (1 << 6) });
let event = GuildDB.events.find(e => e.name == interaction.values[0]);
@@ -162,9 +162,9 @@ module.exports = {
let successEmbed = new EmbedBuilder()
.setColor(client.config.Colors.Green)
.setDescription(`**Success:** Successfully Deleted **${event.name} Event**`);
return interaction.update({ embeds: [successEmbed], components: [] });
}
}
}
}
}
+5 -5
View File
@@ -29,15 +29,15 @@ module.exports = {
*/
run: async (client, interaction, args, { GuildDB }) => {
if (GuildDB.customChannelStatus==true&&!GuildDB.allowedChannels.includes(interaction.channel_id))
return interaction.send({ content: `You are not allowed to use the bot in this channel.`, flags: (1 << 6) });
return interaction.send({ content: `You are not allowed to use the bot in this channel.`, flags: (1 << 6) });
// Return list of factions and their armband.
if (!args) {
let factions = new EmbedBuilder()
.setColor(client.config.Colors.Default)
.setTitle('Factions & Armbands')
let description = '';
if (GuildDB.usedArmbands.length == 0) {
@@ -48,9 +48,9 @@ module.exports = {
else description += `\n> <@&${factionID}> - *${data.armband}*`;
}
}
factions.setDescription(description);
return interaction.send({ embeds: [factions] });
}
+6 -6
View File
@@ -44,7 +44,7 @@ module.exports = {
const warnGTOverwrite = new EmbedBuilder()
.setColor(client.config.Colors.Yellow)
.setDescription(`**Notice:**\n> The gamertag has previously been linked to <@${playerStat.discordID}>. Are you sure you would like to change this?`)
const opt = new ActionRowBuilder()
.addComponents(
new ButtonBuilder()
@@ -61,7 +61,7 @@ module.exports = {
}
playerStat.discordID = interaction.member.user.id;
await UpdatePlayer(client, playerStat, interaction);
let member = interaction.guild.members.cache.get(interaction.member.user.id);
@@ -87,14 +87,14 @@ module.exports = {
OverwriteGamertag: {
run: async(client, interaction, GuildDB) => {
if (!interaction.customId.endsWith(interaction.member.user.id))
if (!interaction.customId.endsWith(interaction.member.user.id))
return interaction.reply({ content: 'This interaction is not for you', flags: (1 << 6) });
if (interaction.customId.split('-')[1]=='yes') {
let playerStat = await client.dbo.collection("players").findOne({"gamertag": interaction.customId.split('-')[2]});
playerStat.discordID = interaction.member.user.id;
await UpdatePlayer(client, playerStat, interaction);
let member = interaction.guild.members.cache.get(interaction.member.user.id);
@@ -123,6 +123,6 @@ module.exports = {
}
}
}
}
}
}
+4 -4
View File
@@ -35,7 +35,7 @@ module.exports = {
const warnGTOverwrite = new EmbedBuilder()
.setColor(client.config.Colors.Yellow)
.setDescription(`**Notice:**\n> Are you sure you want to unlink your gamertag? This will limit some automatic features.`);
const opt = new ActionRowBuilder()
.addComponents(
new ButtonBuilder()
@@ -56,14 +56,14 @@ module.exports = {
UnlinkGamertag: {
run: async(client, interaction, GuildDB) => {
if (!interaction.customId.endsWith(interaction.member.user.id))
if (!interaction.customId.endsWith(interaction.member.user.id))
return interaction.reply({ content: 'This interaction is not for you', flags: (1 << 6) });
if (interaction.customId.split('-')[1]=='yes') {
let playerStat = await client.dbo.collection("players").findOne({"discordID": interaction.member.user.id});
playerStat.discordID = "";
await UpdatePlayer(client, playerStat, interaction);
let connectedEmbed = new EmbedBuilder()
@@ -82,4 +82,4 @@ module.exports = {
}
}
}
}
}
+12 -12
View File
@@ -32,7 +32,7 @@ module.exports = {
value: "support",
type: CommandOptions.SubCommand,
},
{
{
name: "credits",
description: "DayZ.R Bot Credits",
value: "credits",
@@ -58,15 +58,15 @@ module.exports = {
if (args[0].name == 'commands') {
let Commands = client.commands.filter((cmd) => {
return !cmd.debug
}).map((cmd) =>
}).map((cmd) =>
`\`/${cmd.name}${cmd.usage ? " " + cmd.usage : ""}\` - ${cmd.description}`
);
let Embed = new EmbedBuilder()
.setTitle('Commands')
.setColor(client.config.Colors.Default)
.setDescription(`${Commands.join("\n")}
DayZR Bot Version: v${client.config.Version}`);
if (!args[0].options[0]) return interaction.send({ embeds: [Embed] });
else {
@@ -77,7 +77,7 @@ module.exports = {
);
if (!cmd)
return interaction.send({ content: `❌ | Unable to find that command.` });
let embed = new EmbedBuilder()
.setDescription(cmd.description)
.setColor(client.config.Colors.Green)
@@ -85,7 +85,7 @@ module.exports = {
if (cmd.SlashCommand.options && cmd.SlashCommand.options[0].type == 1) {
let description = `${cmd.description}\n\n**Usage**\n`;
for (let i = 0; i < cmd.SlashCommand.options.length; i++) {
if (cmd.SlashCommand.options[i].type == 1) {
let param = '';
@@ -107,7 +107,7 @@ module.exports = {
const supportEmbed = new EmbedBuilder()
.setColor(client.config.Colors.Default)
.setDescription(`**__DayZ.R Bot Support__**
Are you experiencing troubles with the DayZ.R Bot?
Do you have questions or concerns?
Do you require help to use the bot?
@@ -126,22 +126,22 @@ module.exports = {
.setDescription(`
**Bot Author:** mcdazzzled
**Github:** https://github.com/SowinskiBraeden/dayz-reforger
${client.config.SupportServer}
`);
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')
@@ -158,4 +158,4 @@ module.exports = {
}
},
},
};
};
+22 -22
View File
@@ -21,7 +21,7 @@ module.exports = {
{ name: "Money", value: "money" },
{ name: "Total Time Played", value: "totalSessionTime" },
{ name: "Longest Game Session", value: "longestSessionTime" },
{ name: "Kills", value: "kills" },
{ name: "Kills", value: "kills" },
{ name: "Kill Streak", value: "killStreak" },
{ name: "Best Kill Streak", value: "bestKillStreak" },
{ name: "Deaths", value: "deaths" },
@@ -60,7 +60,7 @@ module.exports = {
return interaction.send({ embeds: [warnNitradoNotInitialized], flags: (1 << 6) });
}
const category = args[0].value;
const limit = args[1].value;
@@ -72,28 +72,28 @@ module.exports = {
]).toArray();
} else {
leaderboard = await client.dbo.collection("players").aggregate([
{ $sort: { [`${category}`]: -1 } }
]).toArray();
}
let leaderboardEmbed = new EmbedBuilder()
.setColor(client.config.Colors.Default);
let title = category == 'kills' ? "Total Kills Leaderboard" :
category == 'killStreak' ? "Current Killstreak Leaderboard" :
category == 'bestKillStreak' ? "Best Killstreak Leaderboard" :
category == 'deaths' ? "Total Deaths Leaderboard" :
category == 'deathStreak' ? "Current Deathstreak Leaderboard" :
category == 'worstDeathStreak' ? "Worst Deathstreak Leaderboard" :
category == 'longestKill' ? "Longest Kill Leaderboard" :
category == 'money' ? "Money Leaderboard" :
category == 'totalSessionTime' ? "Total Time Played" :
category == 'longestSessionTime' ? "Longest Game Session" :
category == 'KDR' ? "Kill Death Ratio" :
category == 'connections' ? "Times Connected" :
category == 'worstDeathStreak' ? "Worst Deathstreak Leaderboard" :
category == 'longestKill' ? "Longest Kill Leaderboard" :
category == 'money' ? "Money Leaderboard" :
category == 'totalSessionTime' ? "Total Time Played" :
category == 'longestSessionTime' ? "Longest Game Session" :
category == 'KDR' ? "Kill Death Ratio" :
category == 'connections' ? "Times Connected" :
category == 'shotsLanded' ? "Shots Landed" :
category == 'timesShot' ? "Times Shot" :
category == 'combatRating' ? "Combat Rating" : 'N/A Error';
@@ -103,21 +103,21 @@ module.exports = {
let des = ``;
for (let i = 0; i < limit; i++) {
if (leaderboard.length < limit && i == leaderboard.length) break;
let stats = category == 'kills' ? `${leaderboard[i].kills} Kill${(leaderboard[i].kills>1||leaderboard[i].kills==0)?'s':''}` :
category == 'killStreak' ? `${leaderboard[i].killStreak} Player Killstreak` :
category == 'bestKillStreak' ? `${leaderboard[i].bestKillStreak} Player Killstreak` :
category == 'deaths' ? `${leaderboard[i].deaths} Death${leaderboard[i].deaths>1||leaderboard[i].deaths==0?'s':''}` :
category == 'deathStreak' ? `${leaderboard[i].deathStreak} Deathstreak` :
category == 'worstDeathstreak' ? `${leaderboard[i].worstDeathStreak} Deathstreak` :
category == 'longestKill' ? `${leaderboard[i].longestKill}m` :
category == 'money' ? `$${(leaderboard[i].user.guilds[GuildDB.serverID].balance).toLocaleString(undefined, {minimumFractionDigits: 2, maximumFractionDigits: 2})}` :
category == 'totalSessionTime' ? `**Total:** ${client.secondsToDhms(leaderboard[i].totalSessionTime)}\n> **Last Session:** ${client.secondsToDhms(leaderboard[i].lastSessionTime)}` :
category == 'longestSessionTime' ? `**Longest Game Session:** ${client.secondsToDhms(leaderboard[i].longestSessionTime)}` :
category == 'KDR' ? `**KDR: ${leaderboard[i].KDR.toFixed(2)}**` :
category == 'connection' ? `**Connections: ${leaderboard[i].connections}**` :
category == 'combatRating' ? `**Combat Rating:** ${leaderboard[i].combatRating}` :
category == 'shotsLanded' ? `**Shots Landed:** ${leaderboard[i].shotsLanded}` :
category == 'longestKill' ? `${leaderboard[i].longestKill}m` :
category == 'money' ? `$${(leaderboard[i].user.guilds[GuildDB.serverID].balance).toLocaleString(undefined, {minimumFractionDigits: 2, maximumFractionDigits: 2})}` :
category == 'totalSessionTime' ? `**Total:** ${client.secondsToDhms(leaderboard[i].totalSessionTime)}\n> **Last Session:** ${client.secondsToDhms(leaderboard[i].lastSessionTime)}` :
category == 'longestSessionTime' ? `**Longest Game Session:** ${client.secondsToDhms(leaderboard[i].longestSessionTime)}` :
category == 'KDR' ? `**KDR: ${leaderboard[i].KDR.toFixed(2)}**` :
category == 'connection' ? `**Connections: ${leaderboard[i].connections}**` :
category == 'combatRating' ? `**Combat Rating:** ${leaderboard[i].combatRating}` :
category == 'shotsLanded' ? `**Shots Landed:** ${leaderboard[i].shotsLanded}` :
category == 'timesShot' ? `**Times Shot:** ${leaderboard[i].timesShot}` : 'N/A Error';
if (category == 'money') des += `**${i+1}.** <@${leaderboard[i].user.userID}> - **${stats}**\n`
@@ -128,7 +128,7 @@ module.exports = {
}
if (['money', 'totalSessionTime', 'longestSessionTime', 'combatRating'].includes(category)) leaderboardEmbed.setDescription(des);
return interaction.send({ embeds: [leaderboardEmbed] });
},
},
+4 -4
View File
@@ -37,14 +37,14 @@ module.exports = {
let newDt = await client.getDateEST(playerStat.time);
let unixTime = Math.floor(newDt.getTime()/1000);
const destination = nearest(playerStat.pos, GuildDB.Nitrado.Mission);
let lastLocation = new EmbedBuilder()
.setColor(client.config.Colors.Default)
.setDescription(`**Location - <t:${unixTime}>**\nYour last location was detected at **[${playerStat.pos[0]}, ${playerStat.pos[1]}](https://www.izurvive.com/chernarusplussatmap/#location=${playerStat.pos[0]};${playerStat.pos[1]})**\n${destination}`)
return interaction.send({ embeds: [lastLocation], flags: (1 << 6) });
},
},
}
}
+6 -6
View File
@@ -58,19 +58,19 @@ module.exports = {
let playerStat = await client.dbo.collection("players").findOne({"gamertag": args[0].options[0].value});
if (playerStat == undefined) return interaction.send({ embeds: [new EmbedBuilder().setColor(client.config.Colors.Yellow).setDescription(`**Not Found** This gamertag \` ${args[0].options[0].value} \` cannot be found, the gamertag may be incorrect or this player has not logged onto the server before for at least \` 5 minutes \`.`)] });
if (client.exists(playerStat.discordID)) {
const found = new EmbedBuilder()
.setColor(client.config.Colors.Yellow)
.setDescription(`**Record Found**\n> The gamertag \` ${playerStat.gamertag} \` is currently linked to <@${playerStat.discordID}>.`)
return interaction.send({ embeds: [found] });
}
let notFound = new EmbedBuilder()
.setColor(client.config.Colors.Default)
.setDescription(`**Record Not Found**\n The gamertag \` ${playerStat.gamertag} \` currently has no linked Discord account.`);
return interaction.send({ embeds: [notFound] })
} else if (args[0].name == 'gamertag') {
@@ -81,10 +81,10 @@ module.exports = {
const found = new EmbedBuilder()
.setColor(client.config.Colors.Yellow)
.setDescription(`**Record Found**\n> The user <@${playerStat.discordID}> has linked the gamertag \` ${playerStat.gamertag} \`.`)
return interaction.send({ embeds: [found] });
}
},
},
}
}
+4 -4
View File
@@ -12,7 +12,7 @@ module.exports = {
channel: ["VIEW_CHANNEL", "SEND_MESSAGES", "EMBED_LINKS"],
member: [],
},
options: [],
options: [],
SlashCommand: {
/**
*
@@ -35,7 +35,7 @@ module.exports = {
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 = e ? Missions[data.data.gameserver.settings.config.mission] : 'N/A';
const status = e ? data.data.gameserver.status : 'N/A';
@@ -57,7 +57,7 @@ module.exports = {
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)
@@ -78,4 +78,4 @@ module.exports = {
return interaction.editReply({ embeds: [serverEmbed, activePlayersEmbed] });
},
},
}
}
+24 -24
View File
@@ -22,7 +22,7 @@ module.exports = {
{ name: "Money", value: "money" },
{ name: "Total Time Played", value: "totalSessionTime" },
{ name: "Longest Game Session", value: "longestSessionTime" },
{ name: "Kills", value: "kills" },
{ name: "Kills", value: "kills" },
{ name: "Kill Streak", value: "killStreak" },
{ name: "Best Kill Streak", value: "bestKillStreak" },
{ name: "Deaths", value: "deaths" },
@@ -56,7 +56,7 @@ module.exports = {
* @param {*} param3
*/
run: async (client, interaction, args, { GuildDB }, start) => {
if (!client.exists(GuildDB.Nitrado) || !client.exists(GuildDB.Nitrado.ServerID) || !client.exists(GuildDB.Nitrado.UserID) || !client.exists(GuildDB.Nitrado.Auth)) {
const warnNitradoNotInitialized = new EmbedBuilder()
.setColor(client.config.Colors.Yellow)
@@ -69,7 +69,7 @@ module.exports = {
let discord = args[1] && args[1].name == 'discord' ? args[1].value : undefined;
let gamertag = args[1] && args[1].name == 'gamertag' ? args[1].value : undefined;
let self = !discord && !gamertag; // searching for self if both discord and gamertag are undefined;
let query;
let leaderboard;
let leaderboardPos;
@@ -88,7 +88,7 @@ module.exports = {
leaderboardPos = leaderboard.indexOf(query);
} else {
leaderboard = await client.dbo.collection("players").aggregate([
{ $sort: { [`${category}`]: -1 } }
]).toArray();
@@ -108,13 +108,13 @@ module.exports = {
category == 'bestkillStreak' ? "Best Killstreak" :
category == 'deaths' ? "Total Deaths" :
category == 'deathStreak' ? "Current Deathstreak" :
category == 'worstDeathStreak' ? "Worst Deathstreak" :
category == 'longestKill' ? "Longest Kill" :
category == 'money' ? "Total Money" :
category == 'worstDeathStreak' ? "Worst Deathstreak" :
category == 'longestKill' ? "Longest Kill" :
category == 'money' ? "Total Money" :
category == 'totalSessionTime' ? "Total Time Played" :
category == 'longestSessionTime' ? "Longest Game Session" :
category == 'KDR' ? "Kill Death Ratio" :
category == 'connections' ? "Times Connected" :
category == 'connections' ? "Times Connected" :
category == 'shotsLanded' ? "Shots Landed" :
category == 'timesShot' ? "Times Shot" :
category == 'combatRating' ? "Combat Rating" : 'N/A Error';
@@ -134,14 +134,14 @@ module.exports = {
category == 'deaths' ? `${query.deaths} Death${query.deaths>1||query.deaths==0?'s':''}` :
category == 'deathStreak' ? `${query.deathStreak} Deathstreak` :
category == 'worstDeathStreak' ? `${query.worstDeathStreak} Deathstreak` :
category == 'longestKill' ? `${query.longestKill}m` :
category == 'money' ? `$${(query.user.guilds[GuildDB.serverID].balance).toLocaleString(undefined, {minimumFractionDigits: 2, maximumFractionDigits: 2})}` :
category == 'KDR' ? `${query.KDR.toFixed(2)} KDR` :
category == 'connections' ? `${query.connections} connections` :
category == 'longestKill' ? `${query.longestKill}m` :
category == 'money' ? `$${(query.user.guilds[GuildDB.serverID].balance).toLocaleString(undefined, {minimumFractionDigits: 2, maximumFractionDigits: 2})}` :
category == 'KDR' ? `${query.KDR.toFixed(2)} KDR` :
category == 'connections' ? `${query.connections} connections` :
category == 'combatRating' ? `${query.combatRating}` : 'N/A Error';
statsEmbed.addFields({ name: 'Leaderboard Position', value: `# ${leaderboardPos}`, inline: true });
if ((category == 'shotsLanded' || category == 'timesShot') && !client.exists(query.shotsLanded)) query = insertPVPstats(query);
if (category == 'totalSessionTime') {
@@ -154,11 +154,11 @@ module.exports = {
{ name: 'Longest Game Session', value: client.secondsToDhms(query.longestSessionTime), inline: true },
{ name: 'Last Session Time', value: client.secondsToDhms(query.lastSessionTime), inline: true }
);
} else if (category == 'shotsLanded') {
} else if (category == 'shotsLanded') {
statsEmbed.addFields(
{ name: 'Total Shots Landed', value: `${query.shotsLanded}`, inline: true },
{ name: 'View Weapon stats', value: `</weapon-stats:1169369568104415262>`, inline: true }
);
);
const chart = {
type: 'bar',
@@ -189,18 +189,18 @@ module.exports = {
},
},
};
const encodedChart = encodeURIComponent(JSON.stringify(chart));
const chartURL = `https://quickchart.io/chart?bkg=${encodeURIComponent("#ded8d7")}&c=${encodedChart}`;
statsEmbed.setImage(chartURL);
} else if (category == 'timesShot') {
} else if (category == 'timesShot') {
statsEmbed.addFields(
{ name: 'Total Times Shot', value: `${query.timesShot}`, inline: true },
{ name: 'View Weapon stats', value: `</weapon-stats:1169369568104415262>`, inline: true },
);
const chart = {
type: 'bar',
data: {
@@ -230,12 +230,12 @@ module.exports = {
},
},
};
const encodedChart = encodeURIComponent(JSON.stringify(chart));
const chartURL = `https://quickchart.io/chart?bkg=${encodeURIComponent("#ded8d7")}&c=${encodedChart}`;
statsEmbed.setImage(chartURL);
} else if (category == 'combatRating') {
let data = query.combatRatingHistory;
@@ -318,8 +318,8 @@ module.exports = {
statsEmbed.setImage(chartURL);
} else statsEmbed.addFields({ name: title, value: stats, inline: true });
return interaction.send({ embeds: [statsEmbed] });
},
},
}
}
+5 -5
View File
@@ -11,7 +11,7 @@ module.exports = {
permissions: {
channel: ["VIEW_CHANNEL", "SEND_MESSAGES", "EMBED_LINKS"],
member: ["MANAGE_GUILD"],
},
},
options: [{
name: "duration",
description: "Select the duration of the emp (30 or 60 minutes)",
@@ -32,7 +32,7 @@ module.exports = {
* @param {*} param3
*/
run: async (client, interaction, args, { GuildDB }) => {
if (!client.exists(GuildDB.Nitrado) || !client.exists(GuildDB.Nitrado.ServerID) || !client.exists(GuildDB.Nitrado.UserID) || !client.exists(GuildDB.Nitrado.Auth)) {
const warnNitradoNotInitialized = new EmbedBuilder()
.setColor(client.config.Colors.Yellow)
@@ -45,7 +45,7 @@ module.exports = {
const duration = args[0].value;
let banking = await client.dbo.collection("users").findOne({"user.userID": interaction.member.user.id}).then(banking => banking);
if (!banking) {
banking = await createUser(interaction.member.user.id, GuildDB.serverID, GuildDB.startingBalance, client)
if (!client.exists(banking)) return client.sendInternalError(interaction, err);
@@ -67,13 +67,13 @@ module.exports = {
const price = duration == 30 ? GuildDB.empPrice : GuildDB.empPrice * 2;
const newBalance = banking.guilds[GuildDB.serverID].balance - price;
if (GuildDB.alarms.length == 0) return interaction.send({ embeds: [new EmbedBuilder().setColor(client.config.Colors.Default).setDescription('**Notice:** No Existing Alarms to EMP.')], flags: (1 << 6) });
client.dbo.collection("users").updateOne({"user.userID":interaction.member.user.id},{$set:{[`user.guilds.${GuildDB.serverID}.balance`]:newBalance}}, (err, res) => {
if (err) return client.sendInternalError(interaction, err);
});
let alarms = new StringSelectMenuBuilder()
.setCustomId(`EMPAlarmSelect-${interaction.member.user.id}`)
.setPlaceholder(`Select an Alarm to EMP.`)
+2 -2
View File
@@ -39,7 +39,7 @@ module.exports = {
* @param {*} param3
*/
run: async (client, interaction, args, { GuildDB }) => {
if (!client.exists(GuildDB.Nitrado) || !client.exists(GuildDB.Nitrado.ServerID) || !client.exists(GuildDB.Nitrado.UserID) || !client.exists(GuildDB.Nitrado.Auth)) {
const warnNitradoNotInitialized = new EmbedBuilder()
.setColor(client.config.Colors.Yellow)
@@ -72,7 +72,7 @@ module.exports = {
}
const newBalance = banking.guilds[GuildDB.serverID].balance - GuildDB.uavPrice;
client.dbo.collection("users").updateOne({"user.userID":interaction.member.user.id},{$set:{[`user.guilds.${GuildDB.serverID}.balance`]:newBalance}}, (err, res) => {
if (err) return client.sendInternalError(interaction, err);
});
+7 -7
View File
@@ -1,4 +1,4 @@
const { EmbedBuilder, ActionRowBuilder, ButtonBuilder, ButtonStyle } = require('discord.js');
const { EmbedBuilder, ActionRowBuilder, ButtonBuilder, ButtonStyle, PermissionsBitField } = require('discord.js');
const CommandOptions = require('../util/CommandOptionTypes').CommandOptionTypes;
const { addUser } = require('../database/user');
const bitfieldCalculator = require('discord-bitfield-calculator');
@@ -29,10 +29,10 @@ module.exports = {
* @param {*} param3
*/
run: async (client, interaction, args, { GuildDB }) => {
const permissions = bitfieldCalculator.permissions(interaction.member.permissions);
const permissions = new PermissionsBitField(interaction.member.permissions).toArray();
let canUseCommand = false;
if (permissions.includes("MANAGE_GUILD")) canUseCommand = true;
if (permissions.includes("ManageGuild")) canUseCommand = true;
if (client.exists(GuildDB.botAdmin) && interaction.member.roles.includes(GuildDB.botAdmin)) canUseCommand = true;
if (!canUseCommand) return interaction.send({ content: 'You don\'t have the permissions to use this command.' });
@@ -56,7 +56,7 @@ module.exports = {
)
return interaction.send({ embeds: [prompt], components: [opt], flags: (1 << 6) });
},
},
@@ -66,7 +66,7 @@ module.exports = {
run: async (client, interaction, GuildDB) => {
const choice = interaction.customId.split('-')[1];
const targetUserID = interaction.customId.split('-')[2];
if (!interaction.customId.endsWith(interaction.member.user.id)) {
return interaction.reply({
content: "This button is not for you",
@@ -79,7 +79,7 @@ module.exports = {
.setTitle('Successfully reset user\'s data')
let banking = await client.dbo.collection("users").findOne({"user.userID": interaction.member.user.id}).then(banking => banking);
let bankingReset = false;
if (!banking) bankingReset = true
else banking = banking.user
@@ -108,4 +108,4 @@ module.exports = {
}
}
}
}
}
+15 -15
View File
@@ -1,4 +1,4 @@
const { EmbedBuilder, ActionRowBuilder, ButtonBuilder, ButtonStyle, ModalBuilder, TextInputBuilder, TextInputStyle } = require('discord.js');
const { PermissionsBitField, EmbedBuilder, ActionRowBuilder, ButtonBuilder, ButtonStyle, ModalBuilder, TextInputBuilder, TextInputStyle } = require('discord.js');
const CommandOptions = require('../util/CommandOptionTypes').CommandOptionTypes;
const bitfieldCalculator = require('discord-bitfield-calculator');
const { BanPlayer, UnbanPlayer, RestartServer, CheckServerStatus, DisableBaseDamage, DisableContainerDamage, NitradoCredentialStatus } = require('../util/NitradoAPI');
@@ -108,10 +108,10 @@ module.exports = {
*/
run: async (client, interaction, args, { GuildDB }) => {
const permissions = bitfieldCalculator.permissions(interaction.member.permissions);
const permissions = new PermissionsBitField(interaction.member.permissions).toArray();
let canUseCommand = false;
if (permissions.includes("MANAGE_GUILD")) canUseCommand = true;
if (permissions.includes("ManageGuild")) 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.' });
@@ -189,7 +189,7 @@ module.exports = {
return interaction.send({ embeds: [prompt], components: [opt], flags: (1 << 6) });
}
if (!client.exists(GuildDB.Nitrado) || !client.exists(GuildDB.Nitrado.ServerID)) return interaction.send({ embeds: [new EmbedBuilder().setColor(client.config.Colors.Red).setDescription(`**Notice:**\nThis Discord guild has not been configured with a Nitrado DayZ server. To configure your guild, use </server initialize:1166877457559851011>`)] });
if (args[0].name == 'credentials-status') {
@@ -263,7 +263,7 @@ module.exports = {
} else if (args[0].name == "auto-restart") {
let msg = 'Auto server restart periodic check enabled.';
let pref = 0;
// Enable/Disable a 10min periodic server status check.
if (!client.arIntervalIds.has(GuildDB.serverID)) {
client.arIntervalIds.set(GuildDB.serverID, setInterval(CheckServerStatus, client.arInterval, GuildDB.Nitrado, client));
@@ -283,7 +283,7 @@ module.exports = {
});
return interaction.send({ embeds: [new EmbedBuilder().setColor(client.config.Colors.Yellow).setDescription(msg)], flags: (1 << 6) });
} else if (args[0].name == 'disable-base-damage') {
const preference = args[0].options[0].value;
await interaction.deferReply({ flags: (1 << 6) });
@@ -292,7 +292,7 @@ module.exports = {
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) });
} else if (args[0].name == 'disable-container-damage') {
const preference = args[0].options[0].value;
await interaction.deferReply({ flags: (1 << 6) });
@@ -301,16 +301,16 @@ module.exports = {
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) });
}
}
},
Interactions: {
NitradoCredentials: {
run: async(client, interaction, GuildDB) => {
if (!interaction.customId.endsWith(interaction.member.user.id))
if (!interaction.customId.endsWith(interaction.member.user.id))
return interaction.reply({ content: 'This interaction is not for you', flags: (1 << 6) });
const Nitrado = {
@@ -344,21 +344,21 @@ module.exports = {
const NitradoCredentials = new ModalBuilder()
.setTitle('Connect your Nitrado Server')
.setCustomId(`NitradoCredentials-${interaction.member.user.id}`);
const ServerID = new ActionRowBuilder().addComponents(new TextInputBuilder()
.setCustomId('ServerIDInput')
.setLabel('Your Nitrado Server ID')
.setStyle(TextInputStyle.Short)
.setRequired(true)
);
const UserID = new ActionRowBuilder().addComponents(new TextInputBuilder()
.setCustomId('UserIDInput')
.setLabel('Your Nitrado User ID')
.setStyle(TextInputStyle.Short)
.setRequired(true)
);
const Auth = new ActionRowBuilder().addComponents(new TextInputBuilder()
.setCustomId('AuthInput')
.setLabel('Your Nitrado Authentication Token')
@@ -366,9 +366,9 @@ module.exports = {
.setStyle(TextInputStyle.Short)
.setRequired(true)
);
NitradoCredentials.addComponents(ServerID, UserID, Auth);
// TODO: Figure out how to remove the prompt buttons and the embed.
return interaction.showModal(NitradoCredentials);
} else {
+8 -8
View File
@@ -61,7 +61,7 @@ module.exports = {
return interaction.send({ embeds: [warnNitradoNotInitialized], flags: (1 << 6) });
}
let discord = args[1] && args[1].name == 'discord' ? args[1].value : undefined;
let gamertag = args[1] && args[1].name == 'gamertag' ? args[1].value : undefined;
let self = !discord && !gamertag; // searching for self if both discord and gamertag are undefined
@@ -71,13 +71,13 @@ module.exports = {
// Searching by Discord
if (discord) query = await client.dbo.collection("players").findOne({"discordID": discord});
// Searching by Gamertag
if (gamertag) query = await client.dbo.collection("players").findOne({"gamertag": gamertag});
// Searching for self
if (self) query = await client.dbo.collection("players").findOne({"discordID": interaction.member.user.id});
if (!client.exists(query)) return interaction.send({ embeds: [new EmbedBuilder().setColor(client.config.Colors.Yellow).setDescription(`**Not Found** Unable to find any records with the gamertag or user provided.`)] });
let weaponSelect = new StringSelectMenuBuilder()
@@ -103,7 +103,7 @@ module.exports = {
run: async(client, interaction, GuildDB) => {
if (!interaction.customId.endsWith(interaction.member.user.id))
return interaction.reply({ content: 'This interaction is not for you', flags: (1 << 6) });
const weapon = interaction.values[0].split("_")[1];
const weaponClass = interaction.values[0].split("_")[0];
const playerID = interaction.customId.split('-')[1];
@@ -163,12 +163,12 @@ module.exports = {
},
},
};
const encodedChart = encodeURIComponent(JSON.stringify(chart));
const chartURL = `https://quickchart.io/chart?bkg=${encodeURIComponent("#ded8d7")}&c=${encodedChart}`;
stats.setImage(chartURL);
return interaction.update({ components: [], embeds: [stats] });
}
}
+1 -1
View File
@@ -18,7 +18,7 @@ const PresenceStatus = {
};
module.exports = {
Dev: process.env.Dev || "DEV.",
Dev: process.env.Dev || "DEV.",
Version: package.version, // (major).(minor).(patch)
Admins: ["362791661274660874", "329371697570381824"], // Admins of the bot
SupportServer: "https://discord.gg/KVFJCvvFtK", // Support Server Link
+94 -94
View File
@@ -32,286 +32,286 @@ const destinations = {
coord: [1481.47, 11933.38],
}, {
name: 'Novaya Petrovka',
coord: [3437.31, 13010.46],
coord: [3437.31, 13010.46],
}, {
name: 'Zaprundoe',
coord: [5171.52, 12753.83],
coord: [5171.52, 12753.83],
}, {
name: 'Ratnoe',
coord: [6174.72, 12722.72],
coord: [6174.72, 12722.72],
}, {
name: 'Severograd',
coord: [7986.69, 12699.39],
coord: [7986.69, 12699.39],
}, {
name: 'Svergino',
coord: [9464.27, 13718.14],
coord: [9464.27, 13718.14],
}, {
name: 'West Novodmitrovsk',
coord: [10988.51, 14344.17],
coord: [10988.51, 14344.17],
}, {
name: 'East Novodmitrovsk',
coord: [12143.35, 14336.39],
coord: [12143.35, 14336.39],
}, {
name: 'North Novodmitrovsk',
coord: [11544.55, 14764.11],
coord: [11544.55, 14764.11],
}, {
name: 'Cernaya Polyana',
coord: [12112.25, 13760.91],
coord: [12112.25, 13760.91],
}, {
name: 'Turovo',
coord: [13585.94, 14060.32],
coord: [13585.94, 14060.32],
}, {
name: 'Karmanovka',
coord: [12679.95, 14678.56],
coord: [12679.95, 14678.56],
}, {
name: 'Dobroe',
coord: [12956.02, 15051.85],
coord: [12956.02, 15051.85],
}, {
name: 'Belaya Polyana',
coord: [14161.41, 14942.97],
coord: [14161.41, 14942.97],
}, {
name: 'Svetlojarsk',
coord: [14001.99, 13251.54],
coord: [14001.99, 13251.54],
}, {
name: 'Olsha',
coord: [13348.75, 12897.70],
coord: [13348.75, 12897.70],
}, {
name: 'Black Lake',
coord: [13438.18, 12127.80],
coord: [13438.18, 12127.80],
}, {
name: 'Krasno Airfield',
coord: [12018.93, 12586.63],
coord: [12018.93, 12586.63],
}, {
name: 'Krasnostav',
coord: [11163.49, 12248.34],
coord: [11163.49, 12248.34],
}, {
name: 'Rify',
coord: [13811.46, 11210.15],
coord: [13811.46, 11210.15],
}, {
name: 'Khelmn',
coord: [12287.22, 10840.75],
coord: [12287.22, 10840.75],
}, {
name: 'North Berezino',
coord: [12905.47, 10059.19],
coord: [12905.47, 10059.19],
}, {
name: 'Central Berezino',
coord: [12423.31, 9600.36],
coord: [12423.31, 9600.36],
}, {
name: 'South Berezino',
coord: [11968.38, 9079.32],
coord: [11968.38, 9079.32],
}, {
name: 'Dubrovka',
coord: [10362.48, 9837.55],
coord: [10362.48, 9837.55],
}, {
name: 'Vyshnaya Dubrovka',
coord: [9891.99, 10432.47],
coord: [9891.99, 10432.47],
}, {
name: 'North Solnichniy',
coord: [13123.22, 7100.15]
}, {
name: 'Solnichniy',
coord: [13418.74, 6248.60],
coord: [13418.74, 6248.60],
}, {
name: 'Orlovets',
coord: [12201.68, 7275.12],
coord: [12201.68, 7275.12],
}, {
name: 'Polana',
coord: [10743.54, 8134.45],
coord: [10743.54, 8134.45],
}, {
name: 'Gorka',
coord: [9487.60, 8811.03],
coord: [9487.60, 8811.03],
}, {
name: 'Radio Zenit',
coord: [8128.62, 9230.97],
coord: [8128.62, 9230.97],
}, {
name: 'Dolina',
coord: [11276.25, 6594.66],
coord: [11276.25, 6594.66],
}, {
name: 'Devil\'s Castle',
coord: [6890.18, 11439.56],
coord: [6890.18, 11439.56],
}, {
name: 'Zolotar Castle (Black Mountain)',
coord: [10189.45, 12038.37],
coord: [10189.45, 12038.37],
}, {
name: 'Kamensk',
coord: [6684.09, 14410.27],
coord: [6684.09, 14410.27],
}, {
name: 'MB Kamensk',
coord: [7862.27, 14698.01],
coord: [7862.27, 14698.01],
}, {
name: 'Quarry',
coord: [8614.66, 13333.19],
coord: [8614.66, 13333.19],
}, {
name: 'Nagornoe',
coord: [9262.08, 14620.24],
coord: [9262.08, 14620.24],
}, {
name: 'Stary Yar',
coord: [4965.44, 15028.52],
coord: [4965.44, 15028.52],
}, {
name: 'Tisy',
coord: [3425.65, 14783.55],
coord: [3425.65, 14783.55],
}, {
name: 'MB Tisy',
coord: [1543.68, 14052.54],
coord: [1543.68, 14052.54],
}, {
name: 'Topolniki',
coord: [2834.62, 12388.32],
coord: [2834.62, 12388.32],
}, {
name: 'North NWAF',
coord: [4024.45, 11738.96],
coord: [4024.45, 11738.96],
}, {
name: 'Central NWAF',
coord: [4249.98, 10766.87],
coord: [4249.98, 10766.87],
}, {
name: 'South NWAF',
coord: [4864.34, 9588.70],
coord: [4864.34, 9588.70],
}, {
name: 'Grishino',
coord: [5976.41, 10300.27],
coord: [5976.41, 10300.27],
}, {
name: 'Kabanino',
coord: [5284.28, 8604.94],
coord: [5284.28, 8604.94],
}, {
name: 'Stary Sobor',
coord: [6058.07, 7792.28],
coord: [6058.07, 7792.28],
}, {
name: 'Novy Sobor',
coord: [7088.48, 7648.41],
coord: [7088.48, 7648.41],
}, {
name: 'MB VMC',
coord: [4483.28, 8286.10],
coord: [4483.28, 8286.10],
}, {
name: 'Vybor',
coord: [3814.48, 8904.35],
coord: [3814.48, 8904.35],
}, {
name: 'Pustoshka',
coord: [3060.14, 7905.04],
coord: [3060.14, 7905.04],
}, {
name: 'Lopatino',
coord: [2725.74, 10016.42],
coord: [2725.74, 10016.42],
}, {
name: 'Vavilovo',
coord: [2228.03, 11039.06],
coord: [2228.03, 11039.06],
}, {
name: 'Kalinka',
coord: [3301.22, 11249.03],
coord: [3301.22, 11249.03],
}, {
name: 'Biathlon Arena',
coord: [493.82, 11093.50],
coord: [493.82, 11093.50],
}, {
name: 'Krona Castle',
coord: [1395.92, 9246.52],
coord: [1395.92, 9246.52],
}, {
name: 'Myshkino',
coord: [2010.28, 7317.90],
coord: [2010.28, 7317.90],
}, {
name: 'Polesovo',
coord: [5929.75, 13523.72],
coord: [5929.75, 13523.72],
}, {
name: 'Kalinovka',
coord: [7516.20, 13457.62],
coord: [7516.20, 13457.62],
}, {
name: 'Skalisty Island',
coord: [13620.93, 3040.70],
coord: [13620.93, 3040.70],
}, {
name: 'Kamyshovo',
coord: [12061.70, 3526.74],
coord: [12061.70, 3526.74],
}, {
name: 'Elektrozavodsk',
coord: [10273.05, 2010.28],
coord: [10273.05, 2010.28],
}, {
name: 'Cherno. Prigorodki',
coord: [7733.95, 3182.62],
coord: [7733.95, 3182.62],
}, {
name: 'Chernogorsk',
coord: [6573.28, 2544.93],
coord: [6573.28, 2544.93],
}, {
name: 'Cherno. Dubovo',
coord: [6672.43, 3616.18],
coord: [6672.43, 3616.18],
}, {
name: 'Cherno. Vysotovo',
coord: [5686.73, 2552.71],
coord: [5686.73, 2552.71],
}, {
name: 'Cherno. Novoselki',
coord: [6139.72, 3239.01],
coord: [6139.72, 3239.01],
}, {
name: 'Balota Airfield',
coord: [5054.87, 2344.68],
coord: [5054.87, 2344.68],
}, {
name: 'Balota',
coord: [4463.84, 2441.89],
coord: [4463.84, 2441.89],
}, {
name: 'Komarovo',
coord: [3670.61, 2457.44],
coord: [3670.61, 2457.44],
}, {
name: 'Prison Island',
coord: [2702.41, 1296.77],
coord: [2702.41, 1296.77],
}, {
name: 'Kamenka',
coord: [1905.30, 2231.92],
coord: [1905.30, 2231.92],
}, {
name: 'MB Pavlovo',
coord: [2130.82, 3363.43],
coord: [2130.82, 3363.43],
}, {
name: 'Pavlovo',
coord: [1675.88, 3845.59],
coord: [1675.88, 3845.59],
}, {
name: 'Bor',
coord: [3324.55, 3985.57],
coord: [3324.55, 3985.57],
}, {
name: 'Nadezhdino',
coord: [5867.54, 4790.46],
coord: [5867.54, 4790.46],
}, {
name: 'Mogilevka',
coord: [7570.64, 5140.41],
coord: [7570.64, 5140.41],
}, {
name: 'Pusta',
coord: [9192.09, 3861.14],
coord: [9192.09, 3861.14],
}, {
name: 'Staroye',
coord: [10136.96, 5443.71],
coord: [10136.96, 5443.71],
}, {
name: 'MSTA',
coord: [11334.57, 5486.48],
coord: [11334.57, 5486.48],
}, {
name: 'Tulga',
coord: [12753.83, 4405.51],
coord: [12753.83, 4405.51],
}, {
name: 'Guglovo',
coord: [8437.74, 6680.21],
coord: [8437.74, 6680.21],
}, {
name: 'Vyshnoye',
coord: [6586.88, 6054.18],
coord: [6586.88, 6054.18],
}, {
name: 'Rogovo',
coord: [4763.24, 6765.75],
coord: [4763.24, 6765.75],
}, {
name: 'Pulkovo',
coord: [4969.33, 5614.79],
coord: [4969.33, 5614.79],
}, {
name: 'Green Mountain',
coord: [3707.55, 6003.63],
coord: [3707.55, 6003.63],
}, {
name: 'Zelenogorsk',
coord: [2581.87, 5190.96],
coord: [2581.87, 5190.96],
}, {
name: 'Sosnovka',
coord: [2527.43, 6369.14],
coord: [2527.43, 6369.14],
}, {
name: 'Plotina Tishina Damn',
coord: [1193.73, 6363.30],
coord: [1193.73, 6363.30],
}, {
name: 'Zvir',
coord: [571.59, 5294.00],
coord: [571.59, 5294.00],
}, {
name: 'Shakhovka',
coord: [9658.69, 6555.78],
coord: [9658.69, 6555.78],
}, {
name: 'Black Forrest',
coord: [9021.00, 7792.28],
coord: [9021.00, 7792.28],
}, {
name: 'Nizhneye',
coord: [12971.57, 8142.23],
coord: [12971.57, 8142.23],
}, {
name: 'Rog Castle',
coord: [11249.03, 4281.09],
@@ -681,4 +681,4 @@ const destinations = {
coord: [11165.63, 7910.63],
},
],
}
}
+13 -13
View File
@@ -28,33 +28,33 @@ module.exports = {
allowedChannels: guild.server.allowedChannels,
customChannelStatus: guild.server.allowedChannels.length > 0 ? true : false,
hasBotAdmin: guild.server.botAdminRoles.length > 0 ? true : false,
killfeedChannel: guild.server.killfeedChannel,
connectionLogsChannel: guild.server.connectionLogsChannel,
activePlayersChannel: guild.server.activePlayersChannel,
welcomeChannel: guild.server.welcomeChannel,
factionArmbands: guild.server.factionArmbands,
usedArmbands: guild.server.usedArmbands,
excludedRoles: guild.server.excludedRoles,
hasExcludedRoles: guild.server.excludedRoles.length > 0 ? true : false,
botAdminRoles: guild.server.botAdminRoles,
alarms: guild.server.alarms,
events: guild.server.events,
uavs: guild.server.uavs,
incomeRoles: guild.server.incomeRoles,
incomeLimiter: guild.server.incomeLimiter,
startingBalance: guild.server.startingBalance,
uavPrice: guild.server.uavPrice,
empPrice: guild.server.empPrice,
linkedGamertagRole: guild.server.linkedGamertagRole,
memberRole: guild.server.memberRole,
adminRole: guild.server.adminRole,
combatLogTimer: guild.server.combatLogTimer,
};
},
@@ -75,27 +75,27 @@ module.exports = {
connectionLogsChannel: "",
activePlayersChannel: "",
welcomeChannel: "",
factionArmbands: {},
usedArmbands: [],
excludedRoles: [],
botAdminRoles: [],
alarms: [],
events: [],
uavs: [],
incomeRoles: [],
incomeLimiter: 168, // # of hours in 7 days
startingBalance: 500,
uavPrice: 50000,
empPrice: 500000,
linkedGamertagRole: "",
memberRole: "",
adminRole: "",
combatLogTimer: 5, // minutes
}
}
+4 -4
View File
@@ -57,7 +57,7 @@ module.exports = {
longestKill: 0,
deathStreak: 0,
worstDeathStreak: 0,
// In depth PVP Stats
shotsLanded: 0,
timesShot: 0,
@@ -75,7 +75,7 @@ module.exports = {
highestCombatRating: 800,
lowestCombatRating: 800,
combatRatingHistory: [800],
// General Session Data
lastConnectionDate: null,
lastDisconnectionDate: null,
@@ -87,13 +87,13 @@ module.exports = {
lastPos: [],
time: null,
lastTime: null,
// Session Stats
totalSessionTime: 0,
lastSessionTime: 0,
longestSessionTime: 0,
connections: 0,
// Other
bounties: [],
bountiesLength: 0,
+2 -2
View File
@@ -15,7 +15,7 @@ module.exports = {
"Signal Pistol": "https://static.wikia.nocookie.net/dayz_gamepedia/images/a/a7/Flaregun.png/revision/latest/scale-to-width-down/107?cb=20210501150913",
},
shotguns: {
"BK-12": "https://static.wikia.nocookie.net/dayz_gamepedia/images/c/cb/Izh18Shotgun.png/revision/latest/scale-to-width-down/256?cb=20220922184507",
"BK-12": "https://static.wikia.nocookie.net/dayz_gamepedia/images/c/cb/Izh18Shotgun.png/revision/latest/scale-to-width-down/256?cb=20220922184507",
"BK-133": "https://static.wikia.nocookie.net/dayz_gamepedia/images/5/5c/MP-133-Shotgun.png/revision/latest/scale-to-width-down/256?cb=20210210190104",
"BK-43": "https://static.wikia.nocookie.net/dayz_gamepedia/images/c/c7/Izh43Shotgun.png/revision/latest/scale-to-width-down/256?cb=20210210185835",
"Vaiga": "https://static.wikia.nocookie.net/dayz_gamepedia/images/c/c8/Vaiga.png/revision/latest/scale-to-width-down/256?cb=20220220185225",
@@ -65,7 +65,7 @@ module.exports = {
semiAutomaticRifles: {
"DMR": "https://static.wikia.nocookie.net/dayz_gamepedia/images/b/b4/M14.png/revision/latest/scale-to-width-down/350?cb=20231005142636",
"SK 59/66": "https://static.wikia.nocookie.net/dayz_gamepedia/images/f/fe/SKS.png/revision/latest/scale-to-width-down/256?cb=20220517154633",
"Sporter 22": "https://static.wikia.nocookie.net/dayz_gamepedia/images/5/5b/Sporter_22_Wood.png/revision/latest/scale-to-width-down/256?cb=20220518204154",
"Sporter 22": "https://static.wikia.nocookie.net/dayz_gamepedia/images/5/5b/Sporter_22_Wood.png/revision/latest/scale-to-width-down/256?cb=20220518204154",
},
other: {
"Crossbow": "https://static.wikia.nocookie.net/dayz_gamepedia/images/7/79/Crossbow.png/revision/latest/scale-to-width-down/212?cb=20180121164101",
+1 -1
View File
@@ -1,3 +1,3 @@
module.exports = (client, guild) => {
require("../util/RegisterSlashCommands").RegisterGuildCommands(client, guild.id);
};
};
+2 -2
View File
@@ -8,7 +8,7 @@ module.exports = async (client, interaction) => {
This file routes any menu, modal & button interactions
from any command
*/
let GuildDB = await GetGuild(client, interaction.guildId);
const interactionName = interaction.customId.split("-")[0];
let interactionHandler = client.interactionHandlers.get(interactionName);
@@ -18,4 +18,4 @@ module.exports = async (client, interaction) => {
} catch (err) {
client.sendInternalError(interaction, err);
}
}
}
+2 -2
View File
@@ -1,12 +1,12 @@
{
"name": "dayzr-bot",
"version": "13.3.23",
"version": "13.3.25",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"name": "dayzr-bot",
"version": "13.3.23",
"version": "13.3.25",
"license": "MIT",
"dependencies": {
"@discordjs/rest": "^1.1.0",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "dayzr-bot",
"version": "13.3.25",
"version": "13.4.3",
"description": "A General Purpose Discord Bot for DayZ Nitrado Servers.",
"main": "index.js",
"nodemonConfig": {
+22 -20
View File
@@ -6,7 +6,7 @@ const Logger = require("../util/Logger");
const crypto = require('crypto');
// custom util imports
const { DownloadNitradoFile, CheckServerStatus, FetchServerSettings, PostServerSettings, NitradoCredentialStatus } = require('../util/NitradoAPI');
const { DownloadNitradoFile, CheckServerStatus, FetchServerSettings, PostServerSettings, NitradoCredentialStatus, GetRemoteDir } = require('../util/NitradoAPI');
const { HandlePlayerLogs, HandleActivePlayersList } = require('../util/LogsHandler');
const { HandleKillfeed, UpdateLastDeathDate } = require('../util/KillfeedHandler');
const { HandleExpiredUAVs, HandleEvents, PlaceFireplaceInAlarm } = require('../util/AlarmsHandler');
@@ -120,7 +120,7 @@ class DayzRBot extends Client {
this.log(`Interaction [${interaction.guild_id}] - ${command}`);
const rest = new REST({ version: '10' }).setToken(this.config.Token);
// Easy to send response so ;)
interaction.guild = await this.guilds.fetch(interaction.guild_id);
const handleCallback = async (interactionType, message) => {
@@ -136,7 +136,7 @@ class DayzRBot extends Client {
interaction.send = async (message) => handleCallback(InteractionResponseType.ChannelMessageWithSource, message);
interaction.deferReply = async (message) => handleCallback(InteractionResponseType.DeferredChannelMessageWithSource, message);
interaction.showModal = async (message) => handleCallback(InteractionResponseType.Modal, message);
interaction.editReply = async (message) => {
return await rest.patch(Routes.webhookMessage(this.application.id, interaction.token), {
body: message,
@@ -187,7 +187,7 @@ class DayzRBot extends Client {
if (this.playerSessions.get(guild.Nitrado.ServerID).size === 0) {
let players = await this.dbo.collection('players').find({"nitradoServerID": guild.Nitrado.ServerID}) // Get all players of this server
.toArray().then(all => all.filter(p => p.connected).map(p => p.connected = false)); // assume all players who were previously connected are not connected on init only.
for (let i = 0; i < players.length; i++) {
await UpdatePlayer(this, players[i])
}
@@ -203,7 +203,7 @@ class DayzRBot extends Client {
if (lines[i].includes('connected') || lines[i].includes('pos=<')) await HandlePlayerLogs(guild.Nitrado.ServerID, this, guild, lines[i], guild.combatLogTimer);
if (lines[i].includes('killed by Zmb') || lines[i].includes('>) died.')) await UpdateLastDeathDate(guild.Nitrado.ServerID, this, lines[i]); // Updates users last death date for non PVP deaths.
if (lines[i].includes(') placed Fireplace')) await PlaceFireplaceInAlarm(this, guild, lines[i]);
// Handle killfeed logs
if (
(lines[i].includes('killed by with') || lines[i].includes('killed by LandMineTrap')) || // Handle explosive deaths
@@ -222,18 +222,18 @@ class DayzRBot extends Client {
if (!channel) return;
const NAME = "DayZ.R Zone Alert";
const webhook = await GetWebhook(this, NAME, channel_id);
const webhook = await GetWebhook(this, NAME, channel_id);
data.forEach(async (embeds, role) => {
let embedArrays = [];
while (embeds.length > 0)
embedArrays.push(embeds.splice(0, maxEmbed));
for (let i = 0; i < embedArrays.length; i++) {
for (let i = 0; i < embedArrays.length; i++) {
let content = { embeds: embedArrays[i] };
if (role != '-no-role-ping-') content.content = `<@&${role}>`;
WebhookSend(this, webhook, content);
// if (role == '-no-role-ping-') channel.send({ embeds: embedArrays[i] });
// else channel.send({ content: `<@&${role}>`, embeds: embedArrays[i] });
}
@@ -266,7 +266,7 @@ class DayzRBot extends Client {
if (!this.exists(info.player) || !this.exists(info.playerID)) continue; // Skip this player if the player does not exist.
lastDetectedTime = await this.getDateEST(info.time);
let playerStat = await this.dbo.collection("players").findOne({"playerID": info.playerID});
if (!this.exists(playerStat)) playerStat = getDefaultPlayer(info.player, info.playerID, guild.Nitrado.ServerID);
@@ -311,7 +311,7 @@ class DayzRBot extends Client {
c.guilds.cache.forEach(async (guild) => {
let GuildDB = await GetGuild(c, guild.id);
/*
Note to self:
return statements do not prematurely exit out of a forEach loop like it does in a for loop.
@@ -321,7 +321,7 @@ class DayzRBot extends Client {
if (GuildDB.Nitrado.Status == NitradoCredentialStatus.FAILED) return; // Continue if these credentials are marked as failed
const NitradoCred = {
ServerID: GuildDB.Nitrado.ServerID,
ServerID: GuildDB.Nitrado.ServerID,
UserID: GuildDB.Nitrado.UserID,
Auth: decrypt(
GuildDB.Nitrado.Auth,
@@ -349,15 +349,17 @@ class DayzRBot extends Client {
GuildDB.Nitrado.Mission = Missions[settings.settings.config.mission];
if (settings.game_specific.log_files.length == 0) return; // Ignore if no log files on Nitrado server
const filename = settings.game_specific.log_files.sort((a, b) => a.length - b.length)[0];
const path = `${settings.game_specific.path.slice(0, -1)}${filename.split(settings.game)[1]}`;
let filenames = await GetRemoteDir(NitradoCred, c, `${settings.game_specific.path}config`);
filenames = filenames.sort((a, b) => a.modified_at - b.modified_at)
filenames = filenames.filter(path => path.path.includes(".ADM"))
filenames = filenames.map(path => path.path)
const filename = filenames[filenames.length - 1];
// Ensure Player List is logged for next update
const playerListEnabled = parseInt(settings.settings.config.adminLogPlayerList)
if (!playerListEnabled) PostServerSettings(NitradoCred, c, "config", "adminLogPlayerList", '1')
await DownloadNitradoFile(NitradoCred, c, path, `./logs/${NitradoCred.ServerID}-logs.ADM`).then(async (status) => {
await DownloadNitradoFile(NitradoCred, c, filename, `./logs/${NitradoCred.ServerID}-logs.ADM`).then(async (status) => {
if (status == 1) return c.error(`Failed to Download Nitrado Log Files - [${NitradoCred.ServerID}]`);
await c.readLogs(GuildDB).then(async () => {
HandleExpiredUAVs(c, GuildDB);
@@ -396,8 +398,8 @@ class DayzRBot extends Client {
databaselogs.attempts = 0; // reset attempts
this.databaseConnected = true;
} catch (err) {
databaselogs.attempts++;
databaselogs.connected = false;
databaselogs.attempts++;
databaselogs.connected = false;
let db = mongoURI.includes("@") ? mongoURI.split("@")[1] : mongoURI.split("//")[1];
db = db.includes("/") ? db.split("/")[0] : db;
this.error(`Failed to connect to mongodb (mongodb://${db}/${dbo}): attempt ${databaselogs.attempts} - ${err}`);
@@ -416,7 +418,7 @@ class DayzRBot extends Client {
if (!this.databaseConnected) return;
let guilds = await this.dbo.collection("guilds").find({}).toArray();
/*
Initialize auto restart for enabled servers
Initialize last logs
@@ -426,7 +428,7 @@ class DayzRBot extends Client {
if (!this.exists(guilds[i].Nitrado)) continue;
if (guilds[i].server.autoRestart) {
const NitradoCred = {
ServerID: guilds[i].Nitrado.ServerID,
ServerID: guilds[i].Nitrado.ServerID,
UserID: guilds[i].Nitrado.UserID,
Auth: decrypt(
guilds[i].Nitrado.Auth,
@@ -457,7 +459,7 @@ class DayzRBot extends Client {
}
exists(n) { return typeof(n) == 'number' ? !isNaN(n) : null != n && undefined != n && "" != n }
secondsToDhms(seconds) {
seconds = Number(seconds);
const d = Math.floor(seconds / (3600 * 24));
+3 -3
View File
@@ -8,7 +8,7 @@ module.exports = {
if (!client.exists(guild.connectionLogsChannel)) return;
const channel = client.GetChannel(guild.connectionLogsChannel);
if (!channel) return;
let newDt = await client.getDateEST(data.time);
let unixTime = Math.floor(newDt.getTime() / 1000);
@@ -48,7 +48,7 @@ module.exports = {
// If lastHitBy (attacker) died after shooting this player
// then it does not count as combat logging, (the combat ended due to death)
let attacker = await client.dbo.collection("players").findOne({"gamertag": data.lastHitBy});
if (attacker.lastDeathDate > data.lastDamageDate) return;
if (attacker.lastDeathDate > data.lastDamageDate) return;
let unixTime = Math.floor(newDt.getTime() / 1000);
const destination = nearest(data.pos, guild.Nitrado.Mission);
@@ -59,7 +59,7 @@ module.exports = {
const NAME = "DayZ.R Admin Logs";
const webhook = await GetWebhook(client, NAME, guild.connectionLogsChannel);
let content = { embeds: [combatLog] };
if (client.exists(guild.adminRole)) content.content = `<@&${guild.adminRole}>`;
WebhookSend(client, webhook, content);
+10 -10
View File
@@ -96,7 +96,7 @@ module.exports = {
.setDescription(`**Zone Ping - <t:${unixTime}>**\n**${data.player}** was located within **${distance} meters** of the Zone **${alarm.name}**`)
.addFields({ name: '**Location**', value: `**[${data.pos[0]}, ${data.pos[1]}](https://www.izurvive.com/chernarusplussatmap/#location=${data.pos[0]};${data.pos[1]})**`, inline: false })
);
return;
}
}
@@ -116,7 +116,7 @@ module.exports = {
let uavEmbed = new EmbedBuilder()
.setColor(client.config.Colors.Default)
.setDescription(`**UAV Detection - <t:${unixTime}>**\n**${data.player}** was spotted in the UAV zone at **[${data.pos[0]}, ${data.pos[1]}](https://www.izurvive.com/chernarusplussatmap/#location=${data.pos[0]};${data.pos[1]})\n${destination}**`)
client.users.fetch(uav.owner, false).then((user) => {
user.send({ embeds: [uavEmbed] });
});
@@ -133,9 +133,9 @@ module.exports = {
let now = new Date();
let diff = Math.round((now.getTime() - uav.creationDate.getTime()) / 1000 / 60); // diff minutes
if (diff <= 30) continue;
uavs.splice(i, 1);
update = true;
@@ -154,9 +154,9 @@ module.exports = {
},
KillInAlarm: async (client, guildId, data) => {
let guild = await GetGuild(client, guildId);
for (let i = 0; i < guild.alarms.length; i++) {
let alarm = guild.alarms[i];
if (alarm.disabled || !alarm.rules.includes('ban_on_kill')) continue; // ignore if alarm is disabled or not ban on kill;
@@ -176,10 +176,10 @@ module.exports = {
.setColor(client.config.Colors.Default)
.setDescription(`**Zone Ping - <t:${unixTime}>**\n**${data.killer}** was located within **${distance} meters** of the Zone **${alarm.name}** __and has been banned for killing **${data.victim}**.__`)
.addFields({ name: '**Location**', value: `**[${data.killerPOS[0]}, ${data.killerPOS[1]}](https://www.izurvive.com/chernarusplussatmap/#location=${data.killerPOS[0]};${data.killerPOS[1]})**`, inline: false })
const NAME = "DayZ.R Zone Alert";
const webhook = await GetWebhook(client, NAME, alarm.channel);
let content = { content: `<@&${alarm.role}>`, embeds: [alarmEmbed] };
WebhookSend(client, webhook, content);
@@ -224,10 +224,10 @@ module.exports = {
.setColor(client.config.Colors.Default)
.setDescription(`**Zone Ping - <t:${unixTime}>**\n**${info.player}** was located within **${distance} meters** of the Zone **${alarm.name}** __and has been banned for **placing a fireplace**.__`)
.addFields({ name: '**Location**', value: `**[${info.playerPOS[0]}, ${info.playerPOS[1]}](https://www.izurvive.com/chernarusplussatmap/#location=${info.playerPOS[0]};${info.playerPOS[1]})**`, inline: false })
const NAME = "DayZ.R Zone Alert";
const webhook = await GetWebhook(client, NAME, alarm.channel);
let content = { content: `<@&${alarm.role}>`, embeds: [alarmEmbed] };
WebhookSend(client, webhook, content);
+1 -1
View File
@@ -12,4 +12,4 @@ module.exports = {
Float: 10, // AKA Number in Discord's Documentation
Attachment: 11,
}
};
};
+1 -1
View File
@@ -16,4 +16,4 @@ module.exports = {
decipher.final('utf8')
) // Decrypts data and converts to utf8
}
}
}
+32 -27
View File
@@ -31,19 +31,19 @@ const Vehicles = {
CivilianSedan: 'White Olga',
CivilianSedan_Black: 'Black Olga',
CivilianSedan_Wine: 'Wine Olga',
Hatchback_02: 'Red Gunter',
Hatchback_02_Black: 'Black Gunter',
Hatchback_02_Blue: 'Blue Gunter',
OffroadHatchBack: 'Green ADA 4x4',
OffroadHatchBack_Blue: 'Blue ADA 4x4',
OffroadHatchBack_White: 'White ADA 4x4',
OffroadHatchBack_White: 'White ADA 4x4',
Sedan_02: 'Yellow Sarka',
Sedan_02_Grey: 'Grey Sarka',
Sedan_02_Red: 'Red Sarka',
Truck_01_Covered: 'Green V3S Truck',
Truck_01_Covered_Blue: 'Blue V3S Truck',
Truck_01_Covered_Orange: 'Orange V3S Truck',
@@ -52,12 +52,12 @@ const Vehicles = {
};
module.exports = {
// Update last death date for non PVP deaths
UpdateLastDeathDate: async (NitradoServerID, client, line) => {
let killedByZmb = /(.*) \| Player \"(.*)\" \(DEAD\) \(id=(.*) pos=<(.*)>\) killed by (.*)/g;
let diedTemplate = /(.*) \| Player \"(.*)\" \(DEAD\) \(id=(.*) pos=<(.*)>\) died\. Stats> Water: (.*) Energy: (.*) Bleed sources: (.*)/g;
let data = line.includes('>) died.') ? [...line.matchAll(diedTemplate)][0] : [...line.matchAll(killedByZmb)][0];
if (!data) return;
@@ -80,21 +80,21 @@ module.exports = {
},
HandleKillfeed: async (NitradoServerID, client, guild, line) => {
const NAME = "DayZ.R Killfeed";
const channel = client.GetChannel(guild.killfeedChannel);
const killedBy = line.includes('hit by Player') && line.includes('(DEAD)') && line.includes('meters') ? Templates.HitByAndDead :
line.includes('hit by Player') && !line.includes('meters') ? Templates.Melee : // Missing meters indicates it was a melee attack.
line.includes('hit by Player') ? Templates.HitBy :
line.includes('killed by Player') ? Templates.Killed :
line.includes('TransportHit') ? Templates.Vehicle :
line.includes('killed by Player') ? Templates.Killed :
line.includes('TransportHit') ? Templates.Vehicle :
line.includes('killed by LandMineTrap') ? Templates.LandMine : Templates.Explosion;
let data = [...line.matchAll(TemplateExpressions[killedBy])][0];
if (!data) return;
// Create base data
let info = {
time: data[1],
@@ -141,8 +141,8 @@ module.exports = {
victimStat.KDR = victimStat.kills / (victimStat.deaths == 0 ? 1 : victimStat.deaths); // prevent division by 0
victimStat.killStreak = 0;
victimStat.lastDeathDate = newDt;
const cod = killedBy == Templates.LandMine ? `Land Mine Trap` :
const cod = killedBy == Templates.LandMine ? `Land Mine Trap` :
killedBy == Templates.Vehicle ? Vehicles[info.causeOfDeath] : info.causeOfDeath;
const coord = showCoords ? `\n***Location [${info.victimPOS[0]}, ${info.victimPOS[1]}](https://www.izurvive.com/chernarusplussatmap/#location=${info.victimPOS[0]};${info.victimPOS[1]})***\n${destination}` : '';
const killMessage = killedBy == Templates.Vehicle ? 'run over by' : 'blew up from';
@@ -152,7 +152,7 @@ module.exports = {
.setDescription(`**Death Event** - <t:${unixTime}>\n**${info.victim}** ${killMessage} a **${cod}.**${coord}`);
await UpdatePlayer(client, victimStat);
if (!channel) return;
const webhook = await GetWebhook(client, NAME, guild.killfeedChannel);
WebhookSend(client, webhook, { embeds: [killEvent]});
@@ -183,7 +183,7 @@ module.exports = {
killerStat.deathStreak = 0;
if (!client.exists(killerStat.weaponStats[weapon].kills)) killerStat.weaponStats[weapon].kills = 0;
killerStat.weaponStats[weapon].kills++;
// Update victim stats
victimStat.deaths++;
victimStat.deathStreak++;
@@ -193,7 +193,7 @@ module.exports = {
victimStat.lastDeathDate = newDt;
if (!client.exists(victimStat.weaponStats[weapon].deaths)) victimStat.weaponStats[weapon].death = 0;
victimStat.weaponStats[weapon].deaths++;
// Create defaults for non-existing ratings
if (!client.exists(killerStat.combatRating)) killerStat.combatRating = 800;
if (!client.exists(victimStat.combatRating)) victimStat.combatRating = 800;
@@ -201,13 +201,13 @@ module.exports = {
if (!client.exists(victimStat.combatRatingHistory)) victimStat.combatRatingHistory = [800];
if (!client.exists(killerStat.highestCombatRating)) killerStat.highestCombatRating = Math.max(...killerStat.combatRatingHistory);
if (!client.exists(victimStat.lowestCombatRating)) victimStat.lowestCombatRating = Math.min(...victimStat.combatRatingHistory);
// Calculate new ratings
let killerOldRating = killerStat.combatRating;
let victimOldRating = victimStat.combatRating;
killerStat.combatRating = calculateNewCombatRating(killerStat.combatRating, victimStat.combatRating, client.exists(info.bodyPart) && info.bodyPart.includes('Head') ? 1.25 : 1);
victimStat.combatRating = calculateNewCombatRating(victimStat.combatRating, killerStat.combatRating, 0);
// Update combat rating records
if (killerStat.combatRating > killerStat.highestCombatRating) killerStat.highestCombatRating = killerStat.combatRating;
if (victimStat.combatRating < victimStat.lowestCombatRating) victimStat.lowestCombatRating = victimStat.combatRating;
@@ -215,7 +215,7 @@ module.exports = {
if (victimStat.combatRatingHistory.length >= 12) victimStat.combatRatingHistory = victimStat.combatRatingHistory.slice(1); // Remove first element (limits history to length 12)
killerStat.combatRatingHistory.push(killerStat.combatRating);
victimStat.combatRatingHistory.push(victimStat.combatRating);
let kdiff = killerStat.combatRating - killerOldRating;
let vdiff = victimStat.combatRating - victimOldRating;
@@ -227,7 +227,7 @@ module.exports = {
}
let banking = await client.dbo.collection("users").findOne({"user.userID": killerStat.discordID}).then(banking => banking);
if (!banking) {
banking = await createUser(interaction.member.user.id, guild.serverID, guild.startingBalance, client)
if (!client.exists(banking)) return client.sendInternalError(interaction, err);
@@ -240,14 +240,14 @@ module.exports = {
}
const newBalance = banking.guilds[ guild.serverID].balance + totalBounty;
await client.dbo.collection("users").updateOne({ "user.userID": killerStat.discordID }, {
$set: {
[`user.guilds.${ guild.serverID}.balance`]: newBalance,
}
}, (err, res) => {
if (err) return client.sendError(client.GetChannel(guild.killfeedChannel), `Killfeed Error: Updating killer bank balance\n${err}`);
});
});
receivedBounty = new EmbedBuilder()
.setColor(client.config.Colors.Default)
@@ -259,12 +259,17 @@ module.exports = {
await UpdatePlayer(client, victimStat);
await UpdatePlayer(client, killerStat);
const header = `**Kill Event** - <t:${unixTime}>\n**${info.killer}** killed **${info.victim}**`;
const killData = `\n> **__Kill Data__**\n> Weapon: \` ${info.weapon} \`\n> Distance: \` ${info.distance}m \`\n> Body Part: \` ${info.bodyPart != undefined ? info.bodyPart.split('(')[0] : 'N/A'} \`\n> Damage: \` ${info.damage != undefined ? info.damage : 'N/A'} \``;
const killerStatsView = `\n**Killer Rating** (${kdiff >= 0 ? '+' : ''}${kdiff}) ${killerStat.combatRating}\n${killerStat.KDR.toFixed(2)} K/D - ${killerStat.kills} Kill${(killerStat.kills == 0 || killerStat.kills > 1) ? 's':''} - Killstreak: ${killerStat.killStreak}`;
const victimStatsView = `\n**Victim Rating** (${vdiff >= 0 ? '+' : ''}${vdiff}) ${victimStat.combatRating}\n${victimStat.KDR.toFixed(2)} K/D - ${victimStat.deaths} Death${victimStat.deaths == 0 || victimStat.deaths>1?'s':''} - Deathstreak: ${victimStat.deathStreak}`;
const coord = showCoords ? `\n***Location [${info.victimPOS[0]}, ${info.victimPOS[1]}](https://www.izurvive.com/chernarusplussatmap/#location=${info.victimPOS[0]};${info.victimPOS[1]})***\n${destination}` : '';
const map = guild.Nitrado.Mission == "Chernarus" ? "chernarusplus" :
guild.Nitrado.Mission == "Livonia" ? "livonia" :
"sakhal";
const coord = showCoords ? `\n***Location [${info.victimPOS[0]}, ${info.victimPOS[1]}](https://www.izurvive.com/${map}/#location=${info.victimPOS[0]};${info.victimPOS[1]})***\n${destination}` : '';
let killEvent = new EmbedBuilder()
.setColor(client.config.Colors.Default)
@@ -274,7 +279,7 @@ module.exports = {
let weaponClass = weaponClassOf(weapon);
killEvent.setThumbnail(weapons[weaponClass][weapon])
}
if (!channel) return;
const webhook = await GetWebhook(client, NAME, guild.killfeedChannel);
@@ -284,7 +289,7 @@ module.exports = {
// if (client.exists(channel)) await channel.send({ embeds: [killEvent] });
// if (client.exists(receivedBounty) && client.exists(channel)) await channel.send({ content: `<@${killerStat.discordID}>`, embeds: [receivedBounty] });
return;
}
}
}
+1 -1
View File
@@ -35,4 +35,4 @@ class Logger {
}
}
module.exports = Logger;
module.exports = Logger;
+15 -8
View File
@@ -33,11 +33,12 @@ module.exports = {
if (!client.exists(playerStat)) playerStat = getDefaultPlayer(info.player, info.playerID, NitradoServerID);
const newDt = await client.getDateEST(info.time);
playerStat.gamertag = info.player; // update username if changed
playerStat.lastConnectionDate = newDt;
playerStat.connected = true;
if (!client.exists(playerStat.connections)) playerStat.connections = 0;
playerStat.connections++;
// Track adjusted sessions this instance has handled (e.g. no bot crashes or restarts).
if (client.playerSessions.get(NitradoServerID).has(info.playerID)) {
// Player is already in a session, update the session's end time.
@@ -76,7 +77,7 @@ module.exports = {
let playerStat = await client.dbo.collection("players").findOne({"playerID": info.playerID});
if (!client.exists(playerStat)) playerStat = getDefaultPlayer(info.player, info.playerID, NitradoServerID);
let oldUnixTime;
let sessionTimeSeconds;
const newDt = await client.getDateEST(info.time);
@@ -87,6 +88,7 @@ module.exports = {
} else sessionTimeSeconds = 0;
if (!client.exists(playerStat.longestSessionTime)) playerStat.longestSessionTime = 0;
playerStat.gamertag = info.player; // update username if changed
playerStat.totalSessionTime = playerStat.totalSessionTime + sessionTimeSeconds;
playerStat.lastSessionTime = sessionTimeSeconds;
playerStat.longestSessionTime = sessionTimeSeconds > playerStat.longestSessionTime ? sessionTimeSeconds : playerStat.longestSessionTime;
@@ -132,6 +134,7 @@ module.exports = {
if (!client.exists(playerStat)) playerStat = getDefaultPlayer(info.player, info.playerID, NitradoServerID);
if (!client.exists(playerStat.lastConnectionDate)) playerStat.lastConnectionDate = await client.getDateEST(info.time);
playerStat.gamertag = info.player; // update username if changed
playerStat.lastPos = playerStat.pos;
playerStat.pos = info.pos;
playerStat.lastTime = playerStat.time;
@@ -172,9 +175,12 @@ module.exports = {
if (!client.exists(playerStat)) playerStat = getDefaultPlayer(info.player, info.playerID, NitradoServerID);
if (!client.exists(attackerStat)) attackerStat = getDefaultPlayer(info.attacker, info.attackerID, NitradoServerID);
playerStat.gamertag = info.player; // update username if changed
playerStat.lastDamageDate = await client.getDateEST(info.time);
playerStat.lastHitBy = info.attacker;
attackerStat.gamertag = info.attacker; // update username if changed
if (!client.exists(playerStat.shotsLanded)) playerStat = insertPVPstats(playerStat);
if (!client.exists(attackerStat.shotsLanded)) attackerStat = insertPVPstats(attackerStat);
@@ -211,7 +217,7 @@ module.exports = {
const data = await FetchServerSettings(nitrado_cred, 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';
@@ -227,13 +233,14 @@ module.exports = {
const emojiStatus = Statuses[status].emoji || "❓";
const textStatus = Statuses[status].text || "Unknown Status";
let activePlayers = await client.dbo.collection("players").find({"nitradoServerID": nitrado_cred.ServerID}).toArray().filter(player => player.connected);
let activePlayers = await client.dbo.collection("players").find({ "nitradoServerID": parseInt(nitrado_cred.ServerID) }).toArray();
activePlayers = activePlayers.filter(player => player.connected);
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)
@@ -250,10 +257,10 @@ module.exports = {
.setTimestamp()
.setTitle(`Players Online:`)
.setDescription(des || (nodes ? "No Players Online :(" : ""));
const NAME = "DayZ.R Admin Logs";
const webhook = await GetWebhook(client, NAME, guild.connectionLogsChannel);
const webhook = await GetWebhook(client, NAME, guild.activePlayersChannel);
let id = client.playerListMsgIds.get(guild.serverID);
if (id == "") {
id = await WebhookSend(client, webhook, { embeds: [serverEmbed, activePlayersEmbed] }).id;
+35 -34
View File
@@ -22,7 +22,7 @@ const UploadNitradoFile = async (nitrado_cred, client, remoteDir, remoteFilename
}).then(response => response.json());
let contents = fs.readFileSync(localFileDir, 'utf8');
const uploadRes = await fetch(res.data.token.url, {
method: "POST",
headers: {
@@ -63,36 +63,37 @@ const HandlePlayerBan = async (nitrado_cred, client, gamertag, ban) => {
}
}
const GetRemoteDir = async (nitrado_cred, client, dir="") => {
const dirParam = client.exists(dir) ? `?dir=${dir}` : "";
for (let retries = 0; retries <= maxRetries; retries++) {
try {
const res = await fetch(`https://api.nitrado.net/services/${nitrado_cred.ServerID}/gameservers/file_server/list${dirParam}`, {
headers: {
"Authorization": nitrado_cred.Auth
}
}).then(response =>
response.json().then(data => data)
).then(res => res);
if (res.status === "error") return 1;
return res.data.entries;
} catch (error) {
client.error(`GetRemoteDir: Error connecting to server (${nitrado_cred.ServerID}): ${error}`);
if (retries == maxRetries) {
client.error(`GetRemoteDir: Error connecting to server (${nitrado_cred.ServerID}) after ${maxRetries} retries`);
return 1;
}
}
await new Promise(resolve => setTimeout(resolve, retryDelay)); // Delay before retrying
}
}
// Public functions (called externally)
module.exports = {
GetRemoteDir: async (nitrado_cred, client, dir="") => {
const dirParam = client.exists(dir) ? `?dir=${dir}` : "";
for (let retries = 0; retries <= maxRetries; retries++) {
try {
const res = await fetch(`https://api.nitrado.net/services/${nitrado_cred.ServerID}/gameservers/file_server/list${dirParam}`, {
headers: {
"Authorization": nitrado_cred.Auth
}
}).then(response =>
response.json().then(data => data)
).then(res => res);
if (res.status === "error") return 1;
return res.data.entries;
} catch (error) {
client.error(`GetRemoteDir: Error connecting to server (${nitrado_cred.ServerID}): ${error}`);
if (retries == maxRetries) {
client.error(`GetRemoteDir: Error connecting to server (${nitrado_cred.ServerID}) after ${maxRetries} retries`);
return 1;
}
}
await new Promise(resolve => setTimeout(resolve, retryDelay)); // Delay before retrying
}
},
DownloadNitradoFile: async(nitrado_cred, client, filename, outputDir) => {
for (let retries = 0; retries <= maxRetries; retries++) {
try {
@@ -100,7 +101,7 @@ module.exports = {
headers: {
"Authorization": nitrado_cred.Auth
}
}).then(response =>
}).then(response =>
response.json().then(data => data)
).then(res => res);
@@ -124,8 +125,8 @@ module.exports = {
},
/*
Export explicit function names; i.e BanPlayer() & UnbanPlayer()
that call to the private parent function HandlePlayerBan()
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.
*/
@@ -261,7 +262,7 @@ module.exports = {
const missionPath = remoteDirsFromBase[0].path;
const cfggameplayPath = `${missionPath}/cfggameplay.json`;
const jsonDir = `./logs/cfggameplay.json`;
const jsonDir = `./logs/cfggameplay.json`;
await module.exports.DownloadNitradoFile(nitrado_cred, client, cfggameplayPath, jsonDir);
let gameplay = JSON.parse(fs.readFileSync(jsonDir));
@@ -272,7 +273,7 @@ module.exports = {
const uploaded = await UploadNitradoFile(nitrado_cred, client, missionPath, 'cfggameplay.json', jsonDir);
if (uploaded == 1) return 1;
return 0;
},
@@ -289,7 +290,7 @@ module.exports = {
const missionPath = remoteDirsFromBase[0].path;
const cfggameplayPath = `${missionPath}/cfggameplay.json`;
const jsonDir = `./logs/cfggameplay.json`;
const jsonDir = `./logs/cfggameplay.json`;
await module.exports.DownloadNitradoFile(nitrado_cred, client, cfggameplayPath, jsonDir);
let gameplay = JSON.parse(fs.readFileSync(jsonDir));
@@ -300,7 +301,7 @@ module.exports = {
const uploaded = await UploadNitradoFile(nitrado_cred, client, missionPath, 'cfggameplay.json', jsonDir);
if (uploaded == 1) return 1;
return 0;
},
+3 -3
View File
@@ -8,7 +8,7 @@ const { REST } = require('@discordjs/rest');
* @param {require("../structures/DayzRBot")} client
*/
module.exports = {
// Register guild commands
// Register guild commands
RegisterGuildCommands: async (client, guild) => {
const commands = [];
const commandFiles = fs.readdirSync(path.join(__dirname, "..", "commands")).filter(file => file.endsWith('.js'));
@@ -50,7 +50,7 @@ module.exports = {
if (command.global) commands.push(command);
}
const rest = new REST({ version: '10' }).setToken(client.config.Token);
const rest = new REST({ version: '10' }).setToken(client.config.Token);
try {
client.log('[global] Started refreshing global (/) commands.');
@@ -65,4 +65,4 @@ module.exports = {
client.error(error);
}
}
};
};
+3 -3
View File
@@ -6,7 +6,7 @@ module.exports = {
let theta = (thetat < 0) ? (360 + thetat) : thetat;
let compass = ["S", "SW", "W", "NW", "N", "NE", "E", "SE", "S"];
let dir = compass[Math.round(theta / 45)];
return {distance, theta, dir}
}
}
}
}