Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
37b6f3b1e1
|
||
|
|
71cd1808d9
|
||
|
|
8abd3dadd1
|
||
|
|
67116c85be
|
||
|
|
bf95bba612
|
||
|
|
11432cb262
|
||
|
|
3b32c65340
|
||
|
|
e8303fc14a
|
||
|
|
df6b9140ec
|
||
|
|
8249feaf62
|
||
|
|
66955361b0
|
||
|
|
316f4d44b6
|
||
|
|
15d250eb76 | ||
|
|
265f0d3f38 | ||
|
|
cd2ae35a1f | ||
|
|
0abde2d041 | ||
|
|
fff476c725 | ||
|
|
72922dc3a3 | ||
|
|
d1550ff7b5 | ||
|
|
dd983cf9f2 | ||
|
|
dfa36f2e4b | ||
|
|
8d822a352a | ||
|
|
eea202e131 | ||
|
|
64c3ecf6bc | ||
|
|
5fb88a0a09 | ||
|
|
a3a0e978f9 | ||
|
|
8274f8e0da | ||
|
|
9e1f3ca371 | ||
|
|
360fd450eb | ||
|
|
a536bc1045 | ||
|
|
5859c07571 | ||
|
|
5e0a45554f | ||
|
|
d4cf9ec613 | ||
|
|
35a1dac081 | ||
|
|
862686bb07 |
No files matched your search
+2
-2
@@ -6,8 +6,8 @@ mongoURI='Your mongodb URI'
|
||||
dbo='Your mongodb database'
|
||||
|
||||
# Encryption
|
||||
key='Secret Encryption Key',
|
||||
iv='Secret Initialization Vector',
|
||||
key='Secret Encryption Key'
|
||||
iv='Secret Initialization Vector'
|
||||
|
||||
# Other Bot Configuration
|
||||
Dev=PROD. # or DEV.
|
||||
|
||||
+1
-15
@@ -1,15 +1 @@
|
||||
# These are supported funding model platforms
|
||||
|
||||
github: SowinskiBraeden # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
|
||||
patreon: # Replace with a single Patreon username
|
||||
open_collective: # Replace with a single Open Collective username
|
||||
ko_fi: # Replace with a single Ko-fi username
|
||||
tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
|
||||
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
|
||||
liberapay: # Replace with a single Liberapay username
|
||||
issuehunt: # Replace with a single IssueHunt username
|
||||
lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry
|
||||
polar: # Replace with a single Polar username
|
||||
buy_me_a_coffee: # Replace with a single Buy Me a Coffee username
|
||||
thanks_dev: # Replace with a single thanks.dev username
|
||||
custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
|
||||
github: SowinskiBraeden
|
||||
+1
-3
@@ -4,12 +4,10 @@ node_modules/*
|
||||
# Testing/dev related
|
||||
*_test.js
|
||||
dev-*.js
|
||||
commands/debug.js
|
||||
|
||||
# Logs
|
||||
logs/*
|
||||
|
||||
# env
|
||||
.env
|
||||
|
||||
# Admin Script backups
|
||||
admin/backup/*
|
||||
@@ -1,21 +1,121 @@
|
||||
MIT License
|
||||
Creative Commons Legal Code
|
||||
|
||||
Copyright (c) 2023 Braeden Sowinski
|
||||
CC0 1.0 Universal
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE
|
||||
LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN
|
||||
ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS
|
||||
INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES
|
||||
REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS
|
||||
PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM
|
||||
THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED
|
||||
HEREUNDER.
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
Statement of Purpose
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
The laws of most jurisdictions throughout the world automatically confer
|
||||
exclusive Copyright and Related Rights (defined below) upon the creator
|
||||
and subsequent owner(s) (each and all, an "owner") of an original work of
|
||||
authorship and/or a database (each, a "Work").
|
||||
|
||||
Certain owners wish to permanently relinquish those rights to a Work for
|
||||
the purpose of contributing to a commons of creative, cultural and
|
||||
scientific works ("Commons") that the public can reliably and without fear
|
||||
of later claims of infringement build upon, modify, incorporate in other
|
||||
works, reuse and redistribute as freely as possible in any form whatsoever
|
||||
and for any purposes, including without limitation commercial purposes.
|
||||
These owners may contribute to the Commons to promote the ideal of a free
|
||||
culture and the further production of creative, cultural and scientific
|
||||
works, or to gain reputation or greater distribution for their Work in
|
||||
part through the use and efforts of others.
|
||||
|
||||
For these and/or other purposes and motivations, and without any
|
||||
expectation of additional consideration or compensation, the person
|
||||
associating CC0 with a Work (the "Affirmer"), to the extent that he or she
|
||||
is an owner of Copyright and Related Rights in the Work, voluntarily
|
||||
elects to apply CC0 to the Work and publicly distribute the Work under its
|
||||
terms, with knowledge of his or her Copyright and Related Rights in the
|
||||
Work and the meaning and intended legal effect of CC0 on those rights.
|
||||
|
||||
1. Copyright and Related Rights. A Work made available under CC0 may be
|
||||
protected by copyright and related or neighboring rights ("Copyright and
|
||||
Related Rights"). Copyright and Related Rights include, but are not
|
||||
limited to, the following:
|
||||
|
||||
i. the right to reproduce, adapt, distribute, perform, display,
|
||||
communicate, and translate a Work;
|
||||
ii. moral rights retained by the original author(s) and/or performer(s);
|
||||
iii. publicity and privacy rights pertaining to a person's image or
|
||||
likeness depicted in a Work;
|
||||
iv. rights protecting against unfair competition in regards to a Work,
|
||||
subject to the limitations in paragraph 4(a), below;
|
||||
v. rights protecting the extraction, dissemination, use and reuse of data
|
||||
in a Work;
|
||||
vi. database rights (such as those arising under Directive 96/9/EC of the
|
||||
European Parliament and of the Council of 11 March 1996 on the legal
|
||||
protection of databases, and under any national implementation
|
||||
thereof, including any amended or successor version of such
|
||||
directive); and
|
||||
vii. other similar, equivalent or corresponding rights throughout the
|
||||
world based on applicable law or treaty, and any national
|
||||
implementations thereof.
|
||||
|
||||
2. Waiver. To the greatest extent permitted by, but not in contravention
|
||||
of, applicable law, Affirmer hereby overtly, fully, permanently,
|
||||
irrevocably and unconditionally waives, abandons, and surrenders all of
|
||||
Affirmer's Copyright and Related Rights and associated claims and causes
|
||||
of action, whether now known or unknown (including existing as well as
|
||||
future claims and causes of action), in the Work (i) in all territories
|
||||
worldwide, (ii) for the maximum duration provided by applicable law or
|
||||
treaty (including future time extensions), (iii) in any current or future
|
||||
medium and for any number of copies, and (iv) for any purpose whatsoever,
|
||||
including without limitation commercial, advertising or promotional
|
||||
purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each
|
||||
member of the public at large and to the detriment of Affirmer's heirs and
|
||||
successors, fully intending that such Waiver shall not be subject to
|
||||
revocation, rescission, cancellation, termination, or any other legal or
|
||||
equitable action to disrupt the quiet enjoyment of the Work by the public
|
||||
as contemplated by Affirmer's express Statement of Purpose.
|
||||
|
||||
3. Public License Fallback. Should any part of the Waiver for any reason
|
||||
be judged legally invalid or ineffective under applicable law, then the
|
||||
Waiver shall be preserved to the maximum extent permitted taking into
|
||||
account Affirmer's express Statement of Purpose. In addition, to the
|
||||
extent the Waiver is so judged Affirmer hereby grants to each affected
|
||||
person a royalty-free, non transferable, non sublicensable, non exclusive,
|
||||
irrevocable and unconditional license to exercise Affirmer's Copyright and
|
||||
Related Rights in the Work (i) in all territories worldwide, (ii) for the
|
||||
maximum duration provided by applicable law or treaty (including future
|
||||
time extensions), (iii) in any current or future medium and for any number
|
||||
of copies, and (iv) for any purpose whatsoever, including without
|
||||
limitation commercial, advertising or promotional purposes (the
|
||||
"License"). The License shall be deemed effective as of the date CC0 was
|
||||
applied by Affirmer to the Work. Should any part of the License for any
|
||||
reason be judged legally invalid or ineffective under applicable law, such
|
||||
partial invalidity or ineffectiveness shall not invalidate the remainder
|
||||
of the License, and in such case Affirmer hereby affirms that he or she
|
||||
will not (i) exercise any of his or her remaining Copyright and Related
|
||||
Rights in the Work or (ii) assert any associated claims and causes of
|
||||
action with respect to the Work, in either case contrary to Affirmer's
|
||||
express Statement of Purpose.
|
||||
|
||||
4. Limitations and Disclaimers.
|
||||
|
||||
a. No trademark or patent rights held by Affirmer are waived, abandoned,
|
||||
surrendered, licensed or otherwise affected by this document.
|
||||
b. Affirmer offers the Work as-is and makes no representations or
|
||||
warranties of any kind concerning the Work, express, implied,
|
||||
statutory or otherwise, including without limitation warranties of
|
||||
title, merchantability, fitness for a particular purpose, non
|
||||
infringement, or the absence of latent or other defects, accuracy, or
|
||||
the present or absence of errors, whether or not discoverable, all to
|
||||
the greatest extent permissible under applicable law.
|
||||
c. Affirmer disclaims responsibility for clearing rights of other persons
|
||||
that may apply to the Work or any use thereof, including without
|
||||
limitation any person's Copyright and Related Rights in the Work.
|
||||
Further, Affirmer disclaims responsibility for obtaining any necessary
|
||||
consents, permissions or other rights required for any use of the
|
||||
Work.
|
||||
d. Affirmer understands and acknowledges that Creative Commons is not a
|
||||
party to this document and has no duty or obligation with respect to
|
||||
this CC0 or use of the Work.
|
||||
@@ -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
@@ -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
@@ -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: [] });
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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
@@ -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
@@ -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
@@ -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()
|
||||
|
||||
@@ -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 = {
|
||||
}
|
||||
},
|
||||
},
|
||||
}
|
||||
}
|
||||
@@ -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] });
|
||||
},
|
||||
},
|
||||
}
|
||||
}
|
||||
+278
-122
@@ -1,6 +1,6 @@
|
||||
const { EmbedBuilder, ActionRowBuilder, ButtonBuilder, ButtonStyle } = require('discord.js');
|
||||
const { PermissionsBitField, EmbedBuilder, ActionRowBuilder, ButtonBuilder, ButtonStyle } = require('discord.js');
|
||||
const CommandOptions = require('../util/CommandOptionTypes').CommandOptionTypes;
|
||||
const bitfieldCalculator = require('discord-bitfield-calculator');
|
||||
// const bitfieldCalculator = require('discord-bitfield-calculator');
|
||||
const { getDefaultSettings } = require('../database/guild');
|
||||
|
||||
module.exports = {
|
||||
@@ -12,7 +12,7 @@ module.exports = {
|
||||
permissions: {
|
||||
channel: ["VIEW_CHANNEL", "SEND_MESSAGES", "EMBED_LINKS"],
|
||||
member: ["MANAGE_GUILD"],
|
||||
},
|
||||
},
|
||||
options: [
|
||||
{
|
||||
name: "killfeed",
|
||||
@@ -99,7 +99,13 @@ module.exports = {
|
||||
name: "clear",
|
||||
description: "Clears all configured channels",
|
||||
value: "clear",
|
||||
type: CommandOptions.SubCommand,
|
||||
type: CommandOptions.SubCommand,
|
||||
},
|
||||
{
|
||||
name: "view",
|
||||
description: "View configured allowed channels",
|
||||
value: "view",
|
||||
type: CommandOptions.SubCommand,
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -160,31 +166,46 @@ module.exports = {
|
||||
name: "bot_admin_role",
|
||||
description: "Set/remove bot admin role",
|
||||
value: "bot_admin_role",
|
||||
type: CommandOptions.SubCommand,
|
||||
type: CommandOptions.SubCommandGroup,
|
||||
options: [
|
||||
{
|
||||
name: "action",
|
||||
description: "Set or remove a role to be a bot administrator",
|
||||
value: "action",
|
||||
type: CommandOptions.String,
|
||||
choices: [
|
||||
{ name: 'add', value: 'add' }, { name: 'remove', value: 'remove' },
|
||||
],
|
||||
required: true,
|
||||
name: "add",
|
||||
description: "Configure role to be bot admin",
|
||||
value: "add",
|
||||
type: CommandOptions.SubCommand,
|
||||
options: [{
|
||||
name: "role",
|
||||
description: "Role to confiure",
|
||||
value: "role",
|
||||
type: CommandOptions.Role,
|
||||
required: true,
|
||||
}]
|
||||
},
|
||||
{
|
||||
name: "role",
|
||||
description: "Role to configure",
|
||||
value: "role",
|
||||
type: CommandOptions.Role,
|
||||
required: true,
|
||||
name: "remove",
|
||||
description: "Remove configured role as bot admin",
|
||||
value: "remove",
|
||||
type: CommandOptions.SubCommand,
|
||||
options: [{
|
||||
name: "role",
|
||||
description: "Role to remove",
|
||||
value: "role",
|
||||
type: CommandOptions.Role,
|
||||
required: true,
|
||||
}]
|
||||
},
|
||||
{
|
||||
name: "view",
|
||||
description: "View the configured bot admin roles",
|
||||
value: "view",
|
||||
type: CommandOptions.SubCommand,
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
name: "admin_role",
|
||||
name: "admin_ping_role",
|
||||
description: "Admin role to ping in admin logs channel",
|
||||
value: "admin_role",
|
||||
value: "admin_ping_role",
|
||||
type: CommandOptions.SubCommand,
|
||||
options: [{
|
||||
name: "role",
|
||||
@@ -196,26 +217,41 @@ module.exports = {
|
||||
},
|
||||
{
|
||||
name: "exclude",
|
||||
description: "Exclude roles that users can use to claim an armband",
|
||||
description: "Exclude roles that can be used to claim armbands",
|
||||
value: "exclude",
|
||||
type: CommandOptions.SubCommand,
|
||||
type: CommandOptions.SubCommandGroup,
|
||||
options: [
|
||||
{
|
||||
name: "action",
|
||||
description: "Add or remove a role from the exclude list.",
|
||||
value: "action",
|
||||
type: CommandOptions.String,
|
||||
choices: [
|
||||
{ name: 'add', value: 'add' }, { name: 'remove', value: 'remove' },
|
||||
],
|
||||
required: true,
|
||||
{
|
||||
name: "add",
|
||||
description: "Configure role to be excluded",
|
||||
value: "add",
|
||||
type: CommandOptions.SubCommand,
|
||||
options: [{
|
||||
name: "role",
|
||||
description: "Role to confiure",
|
||||
value: "role",
|
||||
type: CommandOptions.Role,
|
||||
required: true,
|
||||
}]
|
||||
},
|
||||
{
|
||||
name: "role",
|
||||
description: "The role to manage",
|
||||
value: "role",
|
||||
type: CommandOptions.Role,
|
||||
required: true,
|
||||
name: "remove",
|
||||
description: "Remove configured role thats excluded",
|
||||
value: "remove",
|
||||
type: CommandOptions.SubCommand,
|
||||
options: [{
|
||||
name: "role",
|
||||
description: "Role to remove",
|
||||
value: "role",
|
||||
type: CommandOptions.Role,
|
||||
required: true,
|
||||
}]
|
||||
},
|
||||
{
|
||||
name: "view",
|
||||
description: "View the configured excluded roles",
|
||||
value: "view",
|
||||
type: CommandOptions.SubCommand,
|
||||
},
|
||||
]
|
||||
},
|
||||
@@ -383,7 +419,7 @@ module.exports = {
|
||||
required: true,
|
||||
}]
|
||||
}
|
||||
],
|
||||
],
|
||||
SlashCommand: {
|
||||
/**
|
||||
*
|
||||
@@ -392,11 +428,12 @@ 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();
|
||||
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.' });
|
||||
|
||||
@@ -415,7 +452,7 @@ module.exports = {
|
||||
if (!channelAdd) {error=true;newChannelErrorEmbed.setDescription(`**Error Notice:** Cannot find that channel.`);}
|
||||
if (channelAdd.type=="voice") {error=true;newChannelErrorEmbed.setDescription(`**Error Notice:** Cannot add voice channel to allowed channels.`);}
|
||||
if (error) return interaction.send({ embeds: [newChannelErrorEmbed] });
|
||||
|
||||
|
||||
client.dbo.collection("guilds").updateOne({"server.serverID":GuildDB.serverID}, {$push:{"server.allowedChannels": channelid}}, (err, res) => {
|
||||
if (err) return client.sendInternalError(interaction, err);
|
||||
});
|
||||
@@ -450,7 +487,7 @@ module.exports = {
|
||||
)
|
||||
|
||||
return interaction.send({ embeds: [promptRemoveChannel], components: [optRemoveChannel], flags: (1 << 6) });
|
||||
|
||||
|
||||
} else if (channels_config == 'clear') {
|
||||
|
||||
const errorNoAllowedChannels = new EmbedBuilder()
|
||||
@@ -476,25 +513,50 @@ module.exports = {
|
||||
)
|
||||
|
||||
return interaction.send({ embeds: [promptClearChannels], components: [optClearChannels], flags: (1 << 6) });
|
||||
|
||||
|
||||
|
||||
} else if (channels_config == 'view') {
|
||||
|
||||
if (!GuildDB.customChannelStatus) {
|
||||
const noConfiguredChannels = new EmbedBuilder()
|
||||
.setColor(client.config.Colors.Default)
|
||||
.setTitle('Channels')
|
||||
.setDescription('> There are no configured channels');
|
||||
|
||||
return interaction.send({ embeds: [noConfiguredChannels] });
|
||||
}
|
||||
|
||||
const configuredChannels = new EmbedBuilder()
|
||||
.setColor(client.config.Colors.Default)
|
||||
.setTitle('Channels')
|
||||
|
||||
let des = '';
|
||||
for (let i = 0; i < GuildDB.allowedChannels.length; i++) {
|
||||
if (i == 0) des += `> <#${GuildDB.allowedChannels[i]}>`;
|
||||
else des += `\n> <#${GuildDB.allowedChannels[i]}>`;
|
||||
}
|
||||
configuredChannels.setDescription(des);
|
||||
|
||||
return interaction.send({ embeds: [configuredChannels] });
|
||||
|
||||
}
|
||||
|
||||
case 'bot_admin_role':
|
||||
if (args[0].options[0].value == 'add') {
|
||||
const botAdminRoleId = args[0].options[1].value;
|
||||
const bot_admin_config = args[0].options[0].name;
|
||||
const botAdminRoleId = ['add', 'remove'].includes(bot_admin_config) ? args[0].options[0].options[0].value : null;
|
||||
if (bot_admin_config == 'add') {
|
||||
|
||||
client.dbo.collection("guilds").updateOne({"server.serverID":GuildDB.serverID},{$push: {"server.botAdminRoles": botAdminRoleId}}, (err, res) => {
|
||||
if (err) return client.sendInternalError(interaction, err);
|
||||
});
|
||||
|
||||
|
||||
const successSetBotAdminRoleEmbed = new EmbedBuilder()
|
||||
.setDescription(`Successfully added <@&${botAdminRoleId}> as a bot admin role.\nUsers with this role can use restricted commands.`)
|
||||
.setColor(client.config.Colors.Green);
|
||||
|
||||
return interaction.send({ embeds: [successSetBotAdminRoleEmbed] });
|
||||
|
||||
} else if (args[0].options[0].value== 'remove') {
|
||||
return interaction.send({ embeds: [successSetBotAdminRoleEmbed] });
|
||||
|
||||
} else if (bot_admin_config == 'remove') {
|
||||
|
||||
if (!GuildDB.botAdminRoles.includes(botAdminRoleId)) {
|
||||
const nonAdminRoleEmbed = new EmbedBuilder()
|
||||
@@ -521,41 +583,92 @@ module.exports = {
|
||||
)
|
||||
|
||||
return interaction.send({ embeds: [promptRemoveAdminRole], components: [optRemoveAdminRole], flags: (1 << 6) });
|
||||
|
||||
} else if (bot_admin_config == 'view') {
|
||||
|
||||
if (GuildDB.botAdminRoles.length == 0) {
|
||||
const noBotAdminRoles = new EmbedBuilder()
|
||||
.setColor(client.config.Colors.Default)
|
||||
.setTitle('Admin Roles')
|
||||
.setDescription('> There have been no configured admin roles');
|
||||
|
||||
return interaction.send({ embeds: [noBotAdminRoles] });
|
||||
}
|
||||
|
||||
const botAdminRolesEmbed = new EmbedBuilder()
|
||||
.setColor(client.config.Colors.Default)
|
||||
.setTitle('Admin Roles')
|
||||
|
||||
let des = '';
|
||||
for (let i = 0; i < GuildDB.botAdminRoles.length; i++) {
|
||||
des += `\n> <@&${GuildDB.botAdminRoles[i]}>`;
|
||||
}
|
||||
botAdminRolesEmbed.setDescription(des);
|
||||
|
||||
return interaction.send({ embeds: [botAdminRolesEmbed] });
|
||||
|
||||
}
|
||||
|
||||
case 'admin_role':
|
||||
case 'admin_ping_role':
|
||||
client.dbo.collection("guilds").updateOne({"server.serverID":GuildDB.serverID},{$set: {"server.adminRole": args[0].options[0].value}}, (err, res) => {
|
||||
if (err) return client.sendInternalError(interaction, err);
|
||||
});
|
||||
|
||||
|
||||
const successSetAdminRoleEmbed = new EmbedBuilder()
|
||||
.setDescription(`Successfully set <@&${args[0].options[0].value}> as the server admin role..`)
|
||||
.setColor(client.config.Colors.Green);
|
||||
|
||||
|
||||
return interaction.send({ embeds: [successSetAdminRoleEmbed] });
|
||||
|
||||
case 'exclude':
|
||||
if (args[0].options[0].value == 'add') {
|
||||
client.dbo.collection('guilds').updateOne({'server.serverID': GuildDB.serverID}, {$push: {'server.excludedRoles': args[0].options[1].value}}, (err, res) => {
|
||||
const exclude_config = args[0].options[0].name;
|
||||
const exclude_roleid = ['add', 'remove'].includes(exclude_config) ? args[0].options[0].options[0].value : null;
|
||||
|
||||
if (exclude_config == 'add') {
|
||||
client.dbo.collection('guilds').updateOne({'server.serverID': GuildDB.serverID}, {$push: {'server.excludedRoles': exclude_roleid}}, (err, res) => {
|
||||
if (err) return client.sendInternalError(interaction, err);
|
||||
})
|
||||
|
||||
const successExcludeEmbed = new EmbedBuilder()
|
||||
.setColor(client.config.Colors.Green)
|
||||
.setDescription(`**Done!**\n> Successfully added <@&${args[0].options[1].value}> to list of excluded roles.`)
|
||||
.setDescription(`**Done!**\n> Successfully added <@&${exclude_roleid}> to list of excluded roles.`)
|
||||
|
||||
return interaction.send({ embeds: [successExcludeEmbed] });
|
||||
|
||||
} else if (args[0].options[0].value == 'remove') {
|
||||
client.dbo.collection('guilds').updateOne({'server.serverID': GuildDB.serverID}, {$pull: {'server.excludedRoles': args[0].options[1].value}}, (err, res) => {
|
||||
} else if (exclude_config == 'remove') {
|
||||
client.dbo.collection('guilds').updateOne({'server.serverID': GuildDB.serverID}, {$pull: {'server.excludedRoles': exclude_roleid}}, (err, res) => {
|
||||
if (err) return client.sendInternalError(interaction, err);
|
||||
})
|
||||
|
||||
const successRemoveExcludeEmbed = new EmbedBuilder()
|
||||
.setColor(client.config.Colors.Green)
|
||||
.setDescription(`**Done!**\n> Successfully removed <@&${args[0].options[1].value}> to list of excluded roles.`)
|
||||
.setDescription(`**Done!**\n> Successfully removed <@&${exclude_roleid}> to list of excluded roles.`)
|
||||
|
||||
return interaction.send({ embeds: [successRemoveExcludeEmbed] });
|
||||
|
||||
} else if (exclude_config == "view") {
|
||||
|
||||
if (GuildDB.excludedRoles.length == 0) {
|
||||
const noExcludedRoles = new EmbedBuilder()
|
||||
.setColor(client.config.Colors.Default)
|
||||
.setTitle('Excluded Roles')
|
||||
.setDescription('> There have been no excluded roles');
|
||||
|
||||
return interaction.send({ embeds: [noExcludedRoles] });
|
||||
}
|
||||
|
||||
const excludedRolesEmbed = new EmbedBuilder()
|
||||
.setColor(client.config.Colors.Default)
|
||||
.setTitle('Excluded Roles')
|
||||
|
||||
let des = '';
|
||||
for (let i = 0; i < GuildDB.excludedRoles.length; i++) {
|
||||
des += `\n> <@&${GuildDB.excludedRoles[i]}>`;
|
||||
}
|
||||
excludedRolesEmbed.setDescription(des);
|
||||
|
||||
return interaction.send({ embeds: [excludedRolesEmbed] });
|
||||
|
||||
}
|
||||
|
||||
case 'reset':
|
||||
@@ -577,26 +690,69 @@ module.exports = {
|
||||
)
|
||||
|
||||
return interaction.send({ embeds: [promptReset], components: [optReset], flags: (1 << 6) });
|
||||
|
||||
case 'view':
|
||||
const channelsInfo = GuildDB.customChannelStatus ? '\n╚➤ \`/channels\` to view' : '';
|
||||
const channelColor = GuildDB.customChannelStatus ? '+ ' : '- ';
|
||||
let botAdminRoles = '';
|
||||
for (let i = 0; i < GuildDB.botAdminRoles.length; i++) {
|
||||
botAdminRoles += `\n╚➤ <@&${GuildDB.botAdminRoles[i]}>`;
|
||||
}
|
||||
const botAdminRoleColor = GuildDB.hasBotAdmin ? `+ ` : '- ';
|
||||
const excludedRolesColor = GuildDB.excludedRoles.length > 0 ? `+ ` : '- ';
|
||||
const excludedRolesInfo = GuildDB.excludedRoles.length > 0 ? '\n╚➤ \`/excluded\` to view' : '';
|
||||
|
||||
case 'view':
|
||||
|
||||
// wrappers
|
||||
const w = "\`\`\`";
|
||||
const a = "ansi\n";
|
||||
const f = "fix\n";
|
||||
const m = "arm\n"
|
||||
const g = "[2;32m";
|
||||
const r = "[2;31m";
|
||||
|
||||
// boolean display
|
||||
const autoRestart = GuildDB.autoRestart ? `${g}true` : `${r}false`;
|
||||
const showKillfeedCoords = GuildDB.showKillfeedCoords ? `${g}true` : `${r}false`;
|
||||
const showKillfeedWeapon = GuildDB.showKillfeedWeapon ? `${g}true` : `${r}false`;
|
||||
const purchaseUAV = GuildDB.purchaseUAV ? `${g}true` : `${r}false`;
|
||||
const purchaseEMP = GuildDB.purchaseEMP ? `${g}true` : `${r}false`;
|
||||
const adminRoles = GuildDB.hasBotAdmin ? `${g}true` : `${r}false`
|
||||
const excludedRoles = GuildDB.hasExcludedRoles ? `${g}true` : `${r}false`;
|
||||
|
||||
// Role / channel display
|
||||
const NONE = `${w}${m}none${w}`;
|
||||
const channelsInfo = GuildDB.customChannelStatus ? '\`</channels:1225869620813107246>\` to view' : NONE;
|
||||
const killfeedChannel = client.exists(GuildDB.killfeedChannel) ? `<#${GuildDB.killfeedChannel}>` : NONE;
|
||||
const connectionLogs = client.exists(GuildDB.connectionLogsChannel) ? `<#${GuildDB.connectionLogsChannel}>` : NONE;
|
||||
const activePlayers = client.exists(GuildDB.activePlayersChannel) ? `<#${GuildDB.activePlayersChannel}>` : NONE;
|
||||
const welcomeChannel = client.exists(GuildDB.welcomeChannel) ? `<#${GuildDB.welcomeChannel}>` : NONE;
|
||||
const linkedGTRole = client.exists(GuildDB.linkedGamertagRole) ? `<@&${GuildDB.linkedGamertagRole}>` : NONE;
|
||||
const memberRole = client.exists(GuildDB.memberRole) ? `<@&${GuildDB.memberRole}>` : NONE;
|
||||
|
||||
// value display
|
||||
const incomeLimiter = `${GuildDB.incomeLimiter} hours`;
|
||||
const startingBalance = `$${GuildDB.startingBalance.toLocaleString(undefined, {minimumFractionDigits: 2, maximumFractionDigits: 2})}`;
|
||||
const uavPrice = `$${GuildDB.uavPrice.toLocaleString(undefined, {minimumFractionDigits: 2, maximumFractionDigits: 2})}`;
|
||||
const empPrice = `$${GuildDB.empPrice.toLocaleString(undefined, {minimumFractionDigits: 2, maximumFractionDigits: 2})}`;
|
||||
const combatLogTimer = `${GuildDB.combatLogTimer} minutes`;
|
||||
|
||||
// Ugly below but kinda nice above
|
||||
const settingsEmbed = new EmbedBuilder()
|
||||
.setColor(client.config.Colors.Default)
|
||||
.setTitle('Current Guild Configurations')
|
||||
.addFields(
|
||||
{ name: 'Guild ID', value: `\`\`\`arm\n${GuildDB.serverID}\`\`\``, inline: true },
|
||||
{ name: 'Has Allowed Channels?', value: `\`\`\`diff\n${channelColor}${GuildDB.customChannelStatus}\`\`\`${channelsInfo}`, inline: true },
|
||||
{ name: 'Has bot admin role?', value: `\`\`\`diff\n${botAdminRoleColor}${client.exists(GuildDB.botAdmin)}\`\`\`${botAdminRoles}`, inline: true },
|
||||
{ name: 'Excluded roles?', value: `\`\`\`diff\n${excludedRolesColor}${GuildDB.excludedRoles.length > 0}\`\`\`${excludedRolesInfo}` },
|
||||
{ name: 'Guild ID', value: `${w}${f}${GuildDB.serverID}${w}`, inline: true },
|
||||
{ name: 'Server Name', value: `${w}${f}${GuildDB.serverName}${w}`, inline: true },
|
||||
{ name: 'Auto Restart', value: `${w}${a}${autoRestart}${w}`, inline: true },
|
||||
{ name: 'UAVs Enabled', value: `${w}${a}${purchaseUAV}${w}`, inline: true },
|
||||
{ name: 'EMPs Enabled', value: `${w}${a}${purchaseEMP}${w}`, inline: true },
|
||||
{ name: 'Show Killfeed Coords', value: `${w}${a}${showKillfeedCoords}${w}`, inline: true },
|
||||
{ name: 'Show Killfeed Weapons', value: `${w}${a}${showKillfeedWeapon}${w}`, inline: true },
|
||||
{ name: 'Has Admin Rols', value: `${w}${a}${adminRoles}${w}`, inline: true },
|
||||
{ name: 'Has Excluded Roles', value: `${w}${a}${excludedRoles}${w}`, inline: true },
|
||||
{ name: 'Allowed Channels', value: `${channelsInfo}`, inline: true },
|
||||
{ name: 'Killfeed Channel', value: `${killfeedChannel}`, inline: true },
|
||||
{ name: 'Connection Logs Channel', value: `${connectionLogs}`, inline: true },
|
||||
{ name: 'Player List Channel', value: `${activePlayers}`, inline: true },
|
||||
{ name: 'Welcome Channel', value: `${welcomeChannel}`, inline: true },
|
||||
{ name: 'Linked Gamertag Role', value: `${linkedGTRole}`, inline: true },
|
||||
{ name: 'Member Role', value: `${memberRole}`, inline: true },
|
||||
{ name: 'Income Limiter', value: `${w}${f}${incomeLimiter}${w}`, inline: true },
|
||||
{ name: 'Starting Balance', value: `${w}${f}${startingBalance}${w}`, inline: true },
|
||||
{ name: 'UAV Price', value: `${w}${f}${uavPrice}${w}`, inline: true },
|
||||
{ name: 'EMP Price', value: `${w}${f}${empPrice}${w}`, inline: true },
|
||||
{ name: 'Combat Log Timer', value: `${w}${f}${combatLogTimer}${w}`, inline: true },
|
||||
);
|
||||
|
||||
return interaction.send({ embeds: [settingsEmbed] });
|
||||
@@ -608,50 +764,50 @@ module.exports = {
|
||||
client.dbo.collection("guilds").updateOne({"server.serverID":GuildDB.serverID},{$set: {[`server.${channelType}`]: channel}}, (err, res) => {
|
||||
if (err) return client.sendInternalError(interaction, err);
|
||||
});
|
||||
|
||||
|
||||
const successSetChannelEmbed = new EmbedBuilder()
|
||||
.setDescription(`Successfully set <#${channel}> as the ${channelType} channel.`)
|
||||
.setColor(client.config.Colors.Green);
|
||||
|
||||
|
||||
return interaction.send({ embeds: [successSetChannelEmbed] });
|
||||
|
||||
|
||||
case 'linked_gt_role':
|
||||
const linked_gt_role = args[0].options[0].value;
|
||||
|
||||
|
||||
client.dbo.collection("guilds").updateOne({"server.serverID":GuildDB.serverID},{$set: {"server.linkedGamertagRole": linked_gt_role}}, (err, res) => {
|
||||
if (err) return client.sendInternalError(interaction, err);
|
||||
});
|
||||
|
||||
|
||||
const successLinkedGTRoleEmbed = new EmbedBuilder()
|
||||
.setDescription(`Successfully set <@&${linked_gt_role}> to give to users who link their gamertag.`)
|
||||
.setColor(client.config.Colors.Green);
|
||||
|
||||
|
||||
return interaction.send({ embeds: [successLinkedGTRoleEmbed] });
|
||||
|
||||
case 'member_role':
|
||||
const member_role = args[0].options[0].value;
|
||||
|
||||
|
||||
client.dbo.collection("guilds").updateOne({"server.serverID":GuildDB.serverID},{$set: {"server.memberRole": member_role}}, (err, res) => {
|
||||
if (err) return client.sendInternalError(interaction, err);
|
||||
});
|
||||
|
||||
|
||||
const successMemberRoleEmbed = new EmbedBuilder()
|
||||
.setDescription(`Successfully set <@&${member_role}> to give to users who link they join.`)
|
||||
.setColor(client.config.Colors.Green);
|
||||
|
||||
|
||||
return interaction.send({ embeds: [successMemberRoleEmbed] });
|
||||
|
||||
|
||||
case 'starting_balance':
|
||||
client.dbo.collection("guilds").updateOne({"server.serverID": GuildDB.serverID}, {$set: {"server.startingBalance":args[0].options[0].value}}, (err, res) => {
|
||||
if (err) return client.sendInternalError(interaction, err);
|
||||
});
|
||||
|
||||
|
||||
let successSetStartingBalanceEmbed = new EmbedBuilder()
|
||||
.setColor(client.config.Colors.Green)
|
||||
.setDescription(`Successfully set $${args[0].options[0].value.toFixed(2)} as starting balance`);
|
||||
|
||||
return interaction.send({ embeds: [successSetStartingBalanceEmbed] });
|
||||
|
||||
|
||||
return interaction.send({ embeds: [successSetStartingBalanceEmbed] });
|
||||
|
||||
case 'income_role':
|
||||
if (args[0].options[0].name== 'set') {
|
||||
const incomeRoleId = args[0].options[0].options[0].value
|
||||
@@ -660,17 +816,17 @@ module.exports = {
|
||||
let errorIncomeAmount = new EmbedBuilder()
|
||||
.setDescription('**Error Notice:** Amount cannot be $0 or less than $0.')
|
||||
.setColor(client.config.Colors.Red);
|
||||
|
||||
|
||||
return interaction.send({ embeds: [errorIncomeAmount] });
|
||||
}
|
||||
|
||||
|
||||
const searchIndex = GuildDB.incomeRoles.findIndex((role) => role.role==incomeRoleId);
|
||||
if (searchIndex == -1) {
|
||||
const newIncome = {
|
||||
role: incomeRoleId,
|
||||
income: args[0].options[0].options[1].value,
|
||||
}
|
||||
|
||||
|
||||
client.dbo.collection("guilds").updateOne({"server.serverID":GuildDB.serverID}, {$push: {"server.incomeRoles":newIncome}}, (err, res) => {
|
||||
if (err) return client.sendInternalError(interaction, err);
|
||||
});
|
||||
@@ -688,12 +844,12 @@ module.exports = {
|
||||
});
|
||||
}
|
||||
const perform = searchIndex == -1 ? 'set' : 'updated';
|
||||
|
||||
|
||||
const successIncomeRoleEmbed = new EmbedBuilder()
|
||||
.setDescription(`Successfully ${perform} <@&${incomeRoleId}>'s income to $${args[0].options[0].options[1].value}`)
|
||||
.setColor(client.config.Colors.Green);
|
||||
|
||||
return interaction.send({ embeds: [successIncomeRoleEmbed] });
|
||||
|
||||
return interaction.send({ embeds: [successIncomeRoleEmbed] });
|
||||
|
||||
} else if (args[0].options[0].name== 'remove') {
|
||||
const searchIndex = GuildDB.incomeRoles.findIndex((role) => role.role==incomeRoleId);
|
||||
@@ -702,7 +858,7 @@ module.exports = {
|
||||
.setDescription('**Error Notice:** Role not found')
|
||||
.setColor(client.config.Colors.Red);
|
||||
|
||||
return interaction.send({ embeds: [errorIncomeNotFoundEmbed] });
|
||||
return interaction.send({ embeds: [errorIncomeNotFoundEmbed] });
|
||||
} else {
|
||||
const promptRemoveIncomeRole = new EmbedBuilder()
|
||||
.setTitle(`Are you sure you want to remove this role as an income?`)
|
||||
@@ -723,45 +879,45 @@ module.exports = {
|
||||
return interaction.send({ embeds: [promptRemoveIncomeRole], components: [optRemoveIncomeRole], flags: (1 << 6) });
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
case 'income_limiter':
|
||||
client.dbo.collection("guilds").updateOne({"server.serverID": GuildDB.serverID}, {$set: {"server.incomeLimiter":args[0].options[0].value}}, (err, res) => {
|
||||
if (err) return client.sendInternalError(interaction, err);
|
||||
});
|
||||
|
||||
|
||||
let successIncomeLimiterEmbed = new EmbedBuilder()
|
||||
.setColor(client.config.Colors.Green)
|
||||
.setDescription(`Successfully set **${args[0].options[0].value} hours** as the wait time to collect income.`);
|
||||
|
||||
return interaction.send({ embeds: [successIncomeLimiterEmbed] });
|
||||
|
||||
|
||||
return interaction.send({ embeds: [successIncomeLimiterEmbed] });
|
||||
|
||||
case 'uav-price':
|
||||
client.dbo.collection("guilds").updateOne({"server.serverID": GuildDB.serverID}, {$set: {"server.uavPrice":args[0].options[0].value}}, (err, res) => {
|
||||
if (err) return client.sendInternalError(interaction, err);
|
||||
});
|
||||
|
||||
|
||||
let successUAVPriceEmbed = new EmbedBuilder()
|
||||
.setColor(client.config.Colors.Green)
|
||||
.setDescription(`Successfully set $${args[0].options[0].value.toFixed(2)} as UAV price`);
|
||||
|
||||
|
||||
return interaction.send({ embeds: [successUAVPriceEmbed] });
|
||||
|
||||
case 'emp-price':
|
||||
client.dbo.collection("guilds").updateOne({"server.serverID": GuildDB.serverID}, {$set: {"server.empPrice":args[0].options[0].value}}, (err, res) => {
|
||||
if (err) return client.sendInternalError(interaction, err);
|
||||
});
|
||||
|
||||
|
||||
let successEMPPriceEmbed = new EmbedBuilder()
|
||||
.setColor(client.config.Colors.Green)
|
||||
.setDescription(`Successfully set $${args[0].options[0].value.toFixed(2)} as EMP price`);
|
||||
|
||||
return interaction.send({ embeds: [successEMPPriceEmbed] });
|
||||
|
||||
return interaction.send({ embeds: [successEMPPriceEmbed] });
|
||||
|
||||
case 'combat-log-timer':
|
||||
client.dbo.collection("guilds").updateOne({"server.serverID": GuildDB.serverID}, {$set: {"server.combatLogTimer":args[0].options[0].value}}, (err, res) => {
|
||||
if (err) return client.sendInternalError(interaction, err);
|
||||
});
|
||||
|
||||
|
||||
let successCobatLogTimerEmbed = new EmbedBuilder()
|
||||
.setColor(client.config.Colors.Green)
|
||||
.setDescription(`Successfully set combat log timer to **${args[0].options[0].value.toFixed(0)} minutes.**`);
|
||||
@@ -769,12 +925,12 @@ module.exports = {
|
||||
return interaction.send({ embeds: [successCobatLogTimerEmbed] });
|
||||
|
||||
case 'toggle-uav-purchase':
|
||||
const togggleUAVpurchase = args[0].options[0].value ? 1 : 0;
|
||||
const togggleUAVpurchase = args[0].options[0].value ? 1 : 0;
|
||||
|
||||
client.dbo.collection("guilds").updateOne({"server.serverID": GuildDB.serverID}, {$set: {"server.purchaseUAV": togggleUAVpurchase}}, (err, res) => {
|
||||
if (err) return client.sendInternalError(interaction, err);
|
||||
});
|
||||
|
||||
|
||||
let successToggleUAVpurchaseEmbed = new EmbedBuilder()
|
||||
.setColor(client.config.Colors.Green)
|
||||
.setDescription(`Users can ${togggleUAVpurchase ? 'now' : 'no longer'} purchase UAVs.`);
|
||||
@@ -782,12 +938,12 @@ module.exports = {
|
||||
return interaction.send({ embeds: [successToggleUAVpurchaseEmbed] });
|
||||
|
||||
case 'toggle-emp-purchase':
|
||||
const togggleEMPpurchase = args[0].options[0].value ? 1 : 0;
|
||||
const togggleEMPpurchase = args[0].options[0].value ? 1 : 0;
|
||||
|
||||
client.dbo.collection("guilds").updateOne({"server.serverID": GuildDB.serverID}, {$set: {"server.purchaseEMP": togggleEMPpurchase}}, (err, res) => {
|
||||
if (err) return client.sendInternalError(interaction, err);
|
||||
});
|
||||
|
||||
|
||||
let successToggleEMPpurchaseEmbed = new EmbedBuilder()
|
||||
.setColor(client.config.Colors.Green)
|
||||
.setDescription(`Users can ${togggleUAVpurchase ? 'now' : 'no longer'} purchase EMPs.`);
|
||||
@@ -860,7 +1016,7 @@ module.exports = {
|
||||
},
|
||||
|
||||
Interactions: {
|
||||
|
||||
|
||||
RemoveAllowedChannels: {
|
||||
run: async (client, interaction, GuildDB) => {
|
||||
if (!interaction.customId.endsWith(interaction.member.user.id)) {
|
||||
@@ -876,11 +1032,11 @@ module.exports = {
|
||||
if (err) return client.sendInternalError(interaction, err);
|
||||
});
|
||||
} else if (interaction.customId.split('-')[1]=='no') action = 'kept';
|
||||
|
||||
|
||||
const successEmbed = new EmbedBuilder()
|
||||
.setColor(client.config.Colors.Green)
|
||||
.setTitle(`**Success**\n> Successfullly ${action} the channel.`)
|
||||
|
||||
|
||||
return interaction.update({ embeds: [successEmbed], components: [] });
|
||||
}
|
||||
},
|
||||
@@ -890,12 +1046,12 @@ module.exports = {
|
||||
if (!interaction.customId.endsWith(interaction.member.user.id)) {
|
||||
return interaction.reply({
|
||||
content: "This buttpm is not for you",
|
||||
flags: (1 << 6)
|
||||
flags: (1 << 6)
|
||||
});
|
||||
}
|
||||
let action;
|
||||
if (interaction.customId.split('-')[1] == 'yes') {
|
||||
action = 'cleared';
|
||||
action = 'cleared';
|
||||
client.dbo.collection("guilds").updateOne({"server.serverID": GuildDB.serverID}, {$set:{"server.allowedChannels":[]}}, (err, res) => {
|
||||
if (err) return client.sendInternalError(interaction, err);
|
||||
})
|
||||
@@ -925,11 +1081,11 @@ module.exports = {
|
||||
if (err) return client.sendInternalError(interaction, err);
|
||||
});
|
||||
} else if (interaction.customId.split('-')[1]=='no') action = 'kept';
|
||||
|
||||
|
||||
const successEmbed = new EmbedBuilder()
|
||||
.setColor(client.config.Colors.Green)
|
||||
.setDescription(`**Successfully ${action} <@&${roleId}> as the bot admin role.**`)
|
||||
|
||||
|
||||
return interaction.update({ embeds: [successEmbed], components: [] });
|
||||
}
|
||||
},
|
||||
@@ -951,11 +1107,11 @@ module.exports = {
|
||||
if (err) return client.sendInternalError(interaction, err);
|
||||
});
|
||||
} else if (interaction.customId.split('-')[1]=='no') action = 'kept';
|
||||
|
||||
|
||||
const successEmbed = new EmbedBuilder()
|
||||
.setColor(client.config.Colors.Green)
|
||||
.setDescription(`**Successfully ${action} <@&${roleId}> as an income role.**`)
|
||||
|
||||
|
||||
return interaction.update({ embeds: [successEmbed], components: [] });
|
||||
}
|
||||
},
|
||||
@@ -976,13 +1132,13 @@ module.exports = {
|
||||
if (err) return client.sendInternalError(interaction, err);
|
||||
});
|
||||
} else if (interaction.customId.split('-')[1]=='no') action = 'kept';
|
||||
|
||||
|
||||
const successEmbed = new EmbedBuilder()
|
||||
.setColor(client.config.Colors.Green)
|
||||
.setTitle(`Successfully ${action} guild configurations.`)
|
||||
|
||||
|
||||
return interaction.update({ embeds: [successEmbed], components: [] });
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,30 +0,0 @@
|
||||
const { EmbedBuilder, ActionRowBuilder, ButtonBuilder, ButtonStyle } = require('discord.js');
|
||||
const CommandOptions = require('../util/CommandOptionTypes').CommandOptionTypes;
|
||||
|
||||
module.exports = {
|
||||
name: "debug",
|
||||
debug: true,
|
||||
global: false,
|
||||
description: "debugging...",
|
||||
usage: "",
|
||||
permissions: {
|
||||
channel: ["VIEW_CHANNEL", "SEND_MESSAGES", "EMBED_LINKS"],
|
||||
member: [],
|
||||
},
|
||||
options: [],
|
||||
SlashCommand: {
|
||||
/**
|
||||
*
|
||||
* @param {require("../structures/QuarksBot")} client
|
||||
* @param {import("discord.js").Message} message
|
||||
* @param {string[]} args
|
||||
* @param {*} param3
|
||||
*/
|
||||
run: async (client, interaction, args, { GuildDB }) => {
|
||||
if (!client.config.Admins.includes(interaction.member.user.id)) return interaction.send({ content: 'Only developers can access this command.', flags: (1 << 6) })
|
||||
|
||||
return interaction.send({ content: `Hello ${interaction.member.user.id}, you are my creator!!` })
|
||||
},
|
||||
},
|
||||
Interactions: {}
|
||||
}
|
||||
+8
-8
@@ -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: [] });
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -24,7 +24,7 @@ module.exports = {
|
||||
let noExcludes = new EmbedBuilder()
|
||||
.setColor(client.config.Colors.Default)
|
||||
.setTitle('Excluded Roles')
|
||||
.setDescription('> There have been no configured channels');
|
||||
.setDescription('> There have been no excluded roles');
|
||||
|
||||
return interaction.send({ embeds: [noExcludes] });
|
||||
}
|
||||
|
||||
@@ -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] });
|
||||
}
|
||||
|
||||
|
||||
@@ -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 = {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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 = {
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
+18
-19
@@ -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,37 +126,36 @@ 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')
|
||||
.addFields(
|
||||
{ name: 'Guilds', value: `${totalGuilds}`, inline: false },
|
||||
{ name: 'Users', value: `${totalUsers}`, inline: false },
|
||||
{ name: 'Latency', value: `${end - start}ms`, inline: false },
|
||||
{ name: 'Uptime', value: `${client.secondsToDhms(process.uptime().toFixed(2))}`, inline: false },
|
||||
{ name: 'Bot Version', value: `${client.config.Dev} v${client.config.Version}`, inline: false },
|
||||
{ name: 'Discord Version', value: `Discord.js ${package.dependencies["discord.js"]}`, inline: false },
|
||||
{ name: 'MongoDB Version', value: `MongoDB ${package.dependencies.mongodb}`, inline: false },
|
||||
{ name: 'Guilds', value: `\`\`\`${totalGuilds}\`\`\``, inline: true },
|
||||
{ name: 'Users', value: `\`\`\`${totalUsers}\`\`\``, inline: true },
|
||||
{ name: 'Latency', value: `\`\`\`${end - start}ms\`\`\``, inline: true },
|
||||
{ name: 'Uptime', value: `\`\`\`${client.secondsToDhms(process.uptime().toFixed(2))}\`\`\``, inline: true },
|
||||
{ name: 'Bot Version', value: `\`\`\`${client.config.Dev} v${client.config.Version}\`\`\``, inline: true },
|
||||
{ name: 'Discord Version', value: `\`\`\`Discord.js ${package.dependencies["discord.js"]}\`\`\``, inline: true },
|
||||
);
|
||||
|
||||
return interaction.send({ embeds: [stats] })
|
||||
}
|
||||
},
|
||||
},
|
||||
};
|
||||
};
|
||||
+22
-22
@@ -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] });
|
||||
},
|
||||
},
|
||||
|
||||
@@ -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) });
|
||||
},
|
||||
},
|
||||
}
|
||||
}
|
||||
+90
-90
@@ -1,90 +1,90 @@
|
||||
const { EmbedBuilder } = require('discord.js');
|
||||
const CommandOptions = require('../util/CommandOptionTypes').CommandOptionTypes;
|
||||
|
||||
module.exports = {
|
||||
name: "lookup",
|
||||
debug: false,
|
||||
global: false,
|
||||
description: "Search for a user's Discord or Gamertag",
|
||||
usage: "[option] [parameter]",
|
||||
permissions: {
|
||||
channel: ["VIEW_CHANNEL", "SEND_MESSAGES", "EMBED_LINKS"],
|
||||
member: [],
|
||||
},
|
||||
options: [{
|
||||
name: "discord",
|
||||
description: "Find a Discord user from a Gamertag",
|
||||
value: "discord",
|
||||
type: CommandOptions.SubCommand,
|
||||
options: [{
|
||||
name: "gamertag",
|
||||
description: "Gamertag of player",
|
||||
value: "gamertag",
|
||||
type: CommandOptions.String,
|
||||
required: true,
|
||||
}]
|
||||
}, {
|
||||
name: "gamertag",
|
||||
description: "Find a Gamertag from a Discord user",
|
||||
value: "gamertag",
|
||||
type: CommandOptions.SubCommand,
|
||||
options: [{
|
||||
name: "user",
|
||||
description: "Discord User",
|
||||
value: "user",
|
||||
type: CommandOptions.User,
|
||||
required: true,
|
||||
}]
|
||||
}],
|
||||
SlashCommand: {
|
||||
/**
|
||||
*
|
||||
* @param {require("../structures/DayzRBot")} client
|
||||
* @param {import("discord.js").Message} message
|
||||
* @param {string[]} args
|
||||
* @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)
|
||||
.setDescription("**WARNING:** The DayZ Nitrado Server has not been configured for this guild yet. This command or feature is currently unavailable.");
|
||||
|
||||
return interaction.send({ embeds: [warnNitradoNotInitialized], flags: (1 << 6) });
|
||||
}
|
||||
|
||||
if (args[0].name == 'discord') {
|
||||
|
||||
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') {
|
||||
|
||||
let playerStat = await client.dbo.collection("players").findOne({"discordID": args[0].options[0].value});
|
||||
if (playerStat == undefined) return interaction.send({ embeds: [new EmbedBuilder().setColor(client.config.Colors.Yellow).setDescription(`**Not Found** The user <@${args[0].options[0].value}> has not linked a gamertag.`)] });
|
||||
|
||||
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] });
|
||||
|
||||
}
|
||||
},
|
||||
},
|
||||
}
|
||||
const { EmbedBuilder } = require('discord.js');
|
||||
const CommandOptions = require('../util/CommandOptionTypes').CommandOptionTypes;
|
||||
|
||||
module.exports = {
|
||||
name: "lookup",
|
||||
debug: false,
|
||||
global: false,
|
||||
description: "Search for a user's Discord or Gamertag",
|
||||
usage: "[option] [parameter]",
|
||||
permissions: {
|
||||
channel: ["VIEW_CHANNEL", "SEND_MESSAGES", "EMBED_LINKS"],
|
||||
member: [],
|
||||
},
|
||||
options: [{
|
||||
name: "discord",
|
||||
description: "Find a Discord user from a Gamertag",
|
||||
value: "discord",
|
||||
type: CommandOptions.SubCommand,
|
||||
options: [{
|
||||
name: "gamertag",
|
||||
description: "Gamertag of player",
|
||||
value: "gamertag",
|
||||
type: CommandOptions.String,
|
||||
required: true,
|
||||
}]
|
||||
}, {
|
||||
name: "gamertag",
|
||||
description: "Find a Gamertag from a Discord user",
|
||||
value: "gamertag",
|
||||
type: CommandOptions.SubCommand,
|
||||
options: [{
|
||||
name: "user",
|
||||
description: "Discord User",
|
||||
value: "user",
|
||||
type: CommandOptions.User,
|
||||
required: true,
|
||||
}]
|
||||
}],
|
||||
SlashCommand: {
|
||||
/**
|
||||
*
|
||||
* @param {require("../structures/DayzRBot")} client
|
||||
* @param {import("discord.js").Message} message
|
||||
* @param {string[]} args
|
||||
* @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)
|
||||
.setDescription("**WARNING:** The DayZ Nitrado Server has not been configured for this guild yet. This command or feature is currently unavailable.");
|
||||
|
||||
return interaction.send({ embeds: [warnNitradoNotInitialized], flags: (1 << 6) });
|
||||
}
|
||||
|
||||
if (args[0].name == 'discord') {
|
||||
|
||||
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') {
|
||||
|
||||
let playerStat = await client.dbo.collection("players").findOne({"discordID": args[0].options[0].value});
|
||||
if (playerStat == undefined) return interaction.send({ embeds: [new EmbedBuilder().setColor(client.config.Colors.Yellow).setDescription(`**Not Found** The user <@${args[0].options[0].value}> has not linked a gamertag.`)] });
|
||||
|
||||
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] });
|
||||
|
||||
}
|
||||
},
|
||||
},
|
||||
}
|
||||
+11
-10
@@ -12,7 +12,7 @@ module.exports = {
|
||||
channel: ["VIEW_CHANNEL", "SEND_MESSAGES", "EMBED_LINKS"],
|
||||
member: [],
|
||||
},
|
||||
options: [],
|
||||
options: [],
|
||||
SlashCommand: {
|
||||
/**
|
||||
*
|
||||
@@ -31,15 +31,16 @@ module.exports = {
|
||||
return interaction.send({ embeds: [warnNitradoNotInitialized], flags: (1 << 6) });
|
||||
}
|
||||
|
||||
const data = await FetchServerSettings(GuildDB.Nitrado, client, 'commands/player-list.js'); // Fetch server status
|
||||
await interaction.deferReply();
|
||||
|
||||
const data = await FetchServerSettings(GuildDB.Nitrado, client, 'commands/player-list.js'); // Fetch server status
|
||||
const e = data && data !== 1; // Check if data exists
|
||||
|
||||
|
||||
const hostname = e ? data.data.gameserver.settings.config.hostname : 'N/A';
|
||||
const map = Missions[data.data.gameserver.settings.config.mission];
|
||||
const map = e ? Missions[data.data.gameserver.settings.config.mission] : 'N/A';
|
||||
const status = e ? data.data.gameserver.status : 'N/A';
|
||||
const slots = e ? data.data.gameserver.slots : 'N/A';
|
||||
const playersOnline = data.data.gameserver.query.player_current;
|
||||
const playersOnline = e ? data.data.gameserver.query.player_current : 'N/A';
|
||||
|
||||
const Statuses = {
|
||||
"started": {emoji: "🟢", text: "Active"},
|
||||
@@ -47,8 +48,8 @@ module.exports = {
|
||||
"restarting": {emoji: "↻", text: "Restarting"},
|
||||
};
|
||||
|
||||
const emojiStatus = Statuses[status].emoji || "❓";
|
||||
const textStatus = Statuses[status].text || "Unknown Status";
|
||||
const emojiStatus = e ? Statuses[status].emoji : "❓";
|
||||
const textStatus = e ? Statuses[status].text : "Unknown Status";
|
||||
|
||||
let activePlayers = await client.dbo.collection("players").find({"connected": true}).toArray();
|
||||
|
||||
@@ -56,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)
|
||||
@@ -74,7 +75,7 @@ module.exports = {
|
||||
.setTitle(`Players Online:`)
|
||||
.setDescription(des || (nodes ? "No Players Online :(" : ""));
|
||||
|
||||
return interaction.send({ embeds: [serverEmbed, activePlayersEmbed] });
|
||||
return interaction.editReply({ embeds: [serverEmbed, activePlayersEmbed] });
|
||||
},
|
||||
},
|
||||
}
|
||||
}
|
||||
+24
-24
@@ -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] });
|
||||
},
|
||||
},
|
||||
}
|
||||
}
|
||||
@@ -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.`)
|
||||
|
||||
@@ -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
@@ -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
@@ -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 {
|
||||
|
||||
@@ -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] });
|
||||
}
|
||||
}
|
||||
|
||||
+3
-2
File diff suppressed because one or more lines are too long.
+94
-94
@@ -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],
|
||||
},
|
||||
],
|
||||
}
|
||||
}
|
||||
+14
-13
@@ -28,32 +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,
|
||||
};
|
||||
},
|
||||
@@ -74,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
@@ -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
@@ -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,3 +1,3 @@
|
||||
module.exports = (client, guild) => {
|
||||
require("../util/RegisterSlashCommands").RegisterGuildCommands(client, guild.id);
|
||||
};
|
||||
};
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -5,4 +5,4 @@ const manager = new ShardingManager('./bot.js', { token: config.Token });
|
||||
|
||||
manager.on('shardCreate', shard => console.log(`Launched shard ${shard.id}`));
|
||||
|
||||
manager.spawn();
|
||||
manager.spawn();
|
||||
Generated
+68
-31
@@ -1,12 +1,12 @@
|
||||
{
|
||||
"name": "dayzr-bot",
|
||||
"version": "12.7.1",
|
||||
"version": "13.3.25",
|
||||
"lockfileVersion": 2,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "dayzr-bot",
|
||||
"version": "12.7.1",
|
||||
"version": "13.3.25",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@discordjs/rest": "^1.1.0",
|
||||
@@ -1604,10 +1604,18 @@
|
||||
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
|
||||
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
|
||||
},
|
||||
"node_modules/ip": {
|
||||
"version": "2.0.1",
|
||||
"resolved": "https://registry.npmjs.org/ip/-/ip-2.0.1.tgz",
|
||||
"integrity": "sha512-lJUL9imLTNi1ZfXT+DU6rBBdbiKGBuay9B6xGSPVjUeQwaH1RIGqef8RZkUtHioLmSNpPR5M4HVKJGm1j8FWVQ=="
|
||||
"node_modules/ip-address": {
|
||||
"version": "9.0.5",
|
||||
"resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz",
|
||||
"integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"jsbn": "1.1.0",
|
||||
"sprintf-js": "^1.1.3"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 12"
|
||||
}
|
||||
},
|
||||
"node_modules/is-arrayish": {
|
||||
"version": "0.3.2",
|
||||
@@ -1625,6 +1633,12 @@
|
||||
"url": "https://github.com/sponsors/sindresorhus"
|
||||
}
|
||||
},
|
||||
"node_modules/jsbn": {
|
||||
"version": "1.1.0",
|
||||
"resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz",
|
||||
"integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/kuler": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz",
|
||||
@@ -1809,15 +1823,16 @@
|
||||
}
|
||||
},
|
||||
"node_modules/socks": {
|
||||
"version": "2.7.1",
|
||||
"resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz",
|
||||
"integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==",
|
||||
"version": "2.8.3",
|
||||
"resolved": "https://registry.npmjs.org/socks/-/socks-2.8.3.tgz",
|
||||
"integrity": "sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"ip": "^2.0.0",
|
||||
"ip-address": "^9.0.5",
|
||||
"smart-buffer": "^4.2.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 10.13.0",
|
||||
"node": ">= 10.0.0",
|
||||
"npm": ">= 3.0.0"
|
||||
}
|
||||
},
|
||||
@@ -1830,6 +1845,12 @@
|
||||
"memory-pager": "^1.0.2"
|
||||
}
|
||||
},
|
||||
"node_modules/sprintf-js": {
|
||||
"version": "1.1.3",
|
||||
"resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz",
|
||||
"integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==",
|
||||
"license": "BSD-3-Clause"
|
||||
},
|
||||
"node_modules/stack-trace": {
|
||||
"version": "0.0.10",
|
||||
"resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz",
|
||||
@@ -1921,9 +1942,10 @@
|
||||
"integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA=="
|
||||
},
|
||||
"node_modules/undici": {
|
||||
"version": "5.28.3",
|
||||
"resolved": "https://registry.npmjs.org/undici/-/undici-5.28.3.tgz",
|
||||
"integrity": "sha512-3ItfzbrhDlINjaP0duwnNsKpDQk3acHI3gVJ1z4fmwMK31k5G9OVIAMLSIaP6w4FaGkaAkN6zaQO9LUvZ1t7VA==",
|
||||
"version": "5.28.5",
|
||||
"resolved": "https://registry.npmjs.org/undici/-/undici-5.28.5.tgz",
|
||||
"integrity": "sha512-zICwjrDrcrUE0pyyJc1I2QzBkLM8FINsgOrt6WjA+BgajVq9Nxu2PbFFXUrAggLfDXlZGZBVZYw7WNV5KiBiBA==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@fastify/busboy": "^2.0.0"
|
||||
},
|
||||
@@ -1999,9 +2021,10 @@
|
||||
}
|
||||
},
|
||||
"node_modules/ws": {
|
||||
"version": "8.13.0",
|
||||
"resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz",
|
||||
"integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==",
|
||||
"version": "8.18.0",
|
||||
"resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz",
|
||||
"integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==",
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">=10.0.0"
|
||||
},
|
||||
@@ -3323,10 +3346,14 @@
|
||||
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
|
||||
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
|
||||
},
|
||||
"ip": {
|
||||
"version": "2.0.1",
|
||||
"resolved": "https://registry.npmjs.org/ip/-/ip-2.0.1.tgz",
|
||||
"integrity": "sha512-lJUL9imLTNi1ZfXT+DU6rBBdbiKGBuay9B6xGSPVjUeQwaH1RIGqef8RZkUtHioLmSNpPR5M4HVKJGm1j8FWVQ=="
|
||||
"ip-address": {
|
||||
"version": "9.0.5",
|
||||
"resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz",
|
||||
"integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==",
|
||||
"requires": {
|
||||
"jsbn": "1.1.0",
|
||||
"sprintf-js": "^1.1.3"
|
||||
}
|
||||
},
|
||||
"is-arrayish": {
|
||||
"version": "0.3.2",
|
||||
@@ -3338,6 +3365,11 @@
|
||||
"resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
|
||||
"integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg=="
|
||||
},
|
||||
"jsbn": {
|
||||
"version": "1.1.0",
|
||||
"resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz",
|
||||
"integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A=="
|
||||
},
|
||||
"kuler": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz",
|
||||
@@ -3470,11 +3502,11 @@
|
||||
"integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg=="
|
||||
},
|
||||
"socks": {
|
||||
"version": "2.7.1",
|
||||
"resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz",
|
||||
"integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==",
|
||||
"version": "2.8.3",
|
||||
"resolved": "https://registry.npmjs.org/socks/-/socks-2.8.3.tgz",
|
||||
"integrity": "sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==",
|
||||
"requires": {
|
||||
"ip": "^2.0.0",
|
||||
"ip-address": "^9.0.5",
|
||||
"smart-buffer": "^4.2.0"
|
||||
}
|
||||
},
|
||||
@@ -3487,6 +3519,11 @@
|
||||
"memory-pager": "^1.0.2"
|
||||
}
|
||||
},
|
||||
"sprintf-js": {
|
||||
"version": "1.1.3",
|
||||
"resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz",
|
||||
"integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA=="
|
||||
},
|
||||
"stack-trace": {
|
||||
"version": "0.0.10",
|
||||
"resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz",
|
||||
@@ -3558,9 +3595,9 @@
|
||||
"integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA=="
|
||||
},
|
||||
"undici": {
|
||||
"version": "5.28.3",
|
||||
"resolved": "https://registry.npmjs.org/undici/-/undici-5.28.3.tgz",
|
||||
"integrity": "sha512-3ItfzbrhDlINjaP0duwnNsKpDQk3acHI3gVJ1z4fmwMK31k5G9OVIAMLSIaP6w4FaGkaAkN6zaQO9LUvZ1t7VA==",
|
||||
"version": "5.28.5",
|
||||
"resolved": "https://registry.npmjs.org/undici/-/undici-5.28.5.tgz",
|
||||
"integrity": "sha512-zICwjrDrcrUE0pyyJc1I2QzBkLM8FINsgOrt6WjA+BgajVq9Nxu2PbFFXUrAggLfDXlZGZBVZYw7WNV5KiBiBA==",
|
||||
"requires": {
|
||||
"@fastify/busboy": "^2.0.0"
|
||||
}
|
||||
@@ -3618,9 +3655,9 @@
|
||||
}
|
||||
},
|
||||
"ws": {
|
||||
"version": "8.13.0",
|
||||
"resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz",
|
||||
"integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==",
|
||||
"version": "8.18.0",
|
||||
"resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz",
|
||||
"integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==",
|
||||
"requires": {}
|
||||
}
|
||||
}
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "dayzr-bot",
|
||||
"version": "13.3.5",
|
||||
"version": "13.4.3",
|
||||
"description": "A General Purpose Discord Bot for DayZ Nitrado Servers.",
|
||||
"main": "index.js",
|
||||
"nodemonConfig": {
|
||||
|
||||
+53
-34
@@ -6,11 +6,12 @@ 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');
|
||||
const { decrypt } = require('../util/Cryptic');
|
||||
const { GetWebhook, WebhookSend } = require("../util/WebhookHandler");
|
||||
|
||||
// Data structures imports
|
||||
const { getDefaultPlayer, UpdatePlayer } = require('../database/player');
|
||||
@@ -66,12 +67,15 @@ class DayzRBot extends Client {
|
||||
|
||||
this.db;
|
||||
this.dbo;
|
||||
|
||||
this.databaseConnected = false;
|
||||
this.arInterval = arInterval;
|
||||
this.arIntervalIds = new Map();
|
||||
this.playerSessions = new Map();
|
||||
this.logHistory = new Map();
|
||||
this.alarmPingQueue = new Map();
|
||||
this.arInterval = arInterval;
|
||||
this.arIntervalIds = new Map();
|
||||
this.playerSessions = new Map();
|
||||
this.logHistory = new Map();
|
||||
this.alarmPingQueue = new Map();
|
||||
this.playerListMsgIds = new Map();
|
||||
|
||||
this.initialize();
|
||||
this.LoadCommandsAndInteractionHandlers();
|
||||
this.LoadEvents();
|
||||
@@ -99,18 +103,16 @@ class DayzRBot extends Client {
|
||||
// Free unused armbands for related commands
|
||||
if (['armbands', 'claim', 'factions'].includes(command)) {
|
||||
for (const [factionID, data] of Object.entries(GuildDB.factionArmbands)) {
|
||||
const guild = client.guilds.cache.get(GuildDB.serverID);
|
||||
const guild = this.guilds.cache.get(GuildDB.serverID);
|
||||
const role = guild.roles.cache.find(role => role.id == factionID);
|
||||
if (!role) {
|
||||
let query = {
|
||||
$pull: { 'server.usedArmbands': data.armband },
|
||||
$unset: { [`server.factionArmbands.${factionID}`]: "" },
|
||||
};
|
||||
await client.dbo.collection("guilds").updateOne({ 'server.serverID': GuildDB.serverID }, query, (err, res) => {
|
||||
if (err) return client.sendInternalError(interaction, err);
|
||||
this.dbo.collection("guilds").updateOne({ 'server.serverID': GuildDB.serverID }, query, (err, res) => {
|
||||
if (err) return this.sendInternalError(interaction, err);
|
||||
});
|
||||
} else {
|
||||
newFactionArmbands[`${factionID}`] = data;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -118,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) => {
|
||||
@@ -134,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,
|
||||
@@ -185,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])
|
||||
}
|
||||
@@ -201,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
|
||||
@@ -215,17 +217,25 @@ class DayzRBot extends Client {
|
||||
const maxEmbed = 10;
|
||||
|
||||
this.alarmPingQueue.forEach(queue => {
|
||||
queue.forEach((data, channel_id) => {
|
||||
queue.forEach(async (data, channel_id) => {
|
||||
const channel = this.GetChannel(channel_id);
|
||||
if (!channel) return;
|
||||
data.forEach((embeds, role) => {
|
||||
|
||||
const NAME = "DayZ.R Zone Alert";
|
||||
const webhook = await GetWebhook(this, NAME, channel_id);
|
||||
|
||||
data.forEach(async (embeds, role) => {
|
||||
let embedArrays = [];
|
||||
while (embeds.length > 0);
|
||||
while (embeds.length > 0)
|
||||
embedArrays.push(embeds.splice(0, maxEmbed));
|
||||
|
||||
for (let i = 0; i < embedArrays.length; i++) {
|
||||
if (role == '-no-role-ping-') channel.send({ embeds: embedArrays[i] });
|
||||
else channel.send({ content: `<@&${role}>`, embeds: embedArrays[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] });
|
||||
}
|
||||
});
|
||||
});
|
||||
@@ -256,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);
|
||||
|
||||
@@ -301,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.
|
||||
@@ -311,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,
|
||||
@@ -339,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);
|
||||
@@ -387,7 +399,9 @@ class DayzRBot extends Client {
|
||||
this.databaseConnected = true;
|
||||
} catch (err) {
|
||||
databaselogs.attempts++;
|
||||
let db = (mongoURI.includes("@") ? mongoURI.split("@")[1] : mongoURI.split("//")[1]).endsWith("/") ? mongoURI.slice(0, -1) : mongoURI;
|
||||
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}`);
|
||||
failed = true;
|
||||
}
|
||||
@@ -401,9 +415,10 @@ class DayzRBot extends Client {
|
||||
async initialize() {
|
||||
// Wait for MongoDB to connect
|
||||
await this.connectMongo(this.config.mongoURI, this.config.dbo);
|
||||
|
||||
|
||||
if (!this.databaseConnected) return;
|
||||
let guilds = await this.dbo.collection("guilds").find({}).toArray();
|
||||
|
||||
|
||||
/*
|
||||
Initialize auto restart for enabled servers
|
||||
Initialize last logs
|
||||
@@ -413,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,
|
||||
@@ -426,7 +441,9 @@ class DayzRBot extends Client {
|
||||
}
|
||||
this.logHistory.set(guilds[i].Nitrado.ServerID, guilds[i].server.lastLog); // Using Nitrado Server ID over guild ID in case of future support for multiple nitrado servers in a single guild
|
||||
this.playerSessions.set(guilds[i].Nitrado.ServerID, new Map()); // Same reason here as named above.
|
||||
this.log(`[${guilds[i].server.serverID}] Initialized existing Nitrado`);
|
||||
this.alarmPingQueue.set(guilds[i].server.serverID, new Map()); // Initialize alarm queue to be empty
|
||||
this.playerListMsgIds.set(guilds[i].server.serverID, ""); // Initialize player list message ids
|
||||
this.log(`[${guilds[i].server.serverID}] Initialized existing Nitrado Server: (${guilds[i].Nitrado.ServerID})`);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -436,11 +453,13 @@ class DayzRBot extends Client {
|
||||
if (guild.autoRestart) this.arIntervalIds.set(guildId, setInterval(CheckServerStatus, this.arInterval, Nitrado, this))
|
||||
this.logHistory.set(Nitrado.ServerID, guild.lastLog);
|
||||
this.playerSessions.set(Nitrado.ServerID, new Map());
|
||||
this.log(`[${guild.serverID}] Initialized new Nitrado`);
|
||||
this.alarmPingQueue.set(guildId, new Map());
|
||||
this.playerListMsgIds.set(guildId, "");
|
||||
this.log(`[${guildId}] Initialized new Nitrado`);
|
||||
}
|
||||
|
||||
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));
|
||||
|
||||
@@ -1,11 +1,13 @@
|
||||
const { EmbedBuilder } = require('discord.js');
|
||||
const { nearest } = require('../database/destinations');
|
||||
const { GetWebhook, WebhookSend } = require("../util/WebhookHandler");
|
||||
|
||||
module.exports = {
|
||||
|
||||
SendConnectionLogs: async (client, guild, data) => {
|
||||
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);
|
||||
@@ -14,6 +16,9 @@ module.exports = {
|
||||
.setColor(data.connected ? client.config.Colors.Green : client.config.Colors.Red)
|
||||
.setDescription(`**${data.connected ? 'Connect' : 'Disconnect'} Event - <t:${unixTime}>\n${data.player} ${data.connected ? 'Connected' : 'Disconnected'}**`);
|
||||
|
||||
const NAME = "DayZ.R Admin Logs";
|
||||
const webhook = await GetWebhook(client, NAME, guild.connectionLogsChannel);
|
||||
|
||||
if (!data.connected) {
|
||||
if (data.lastConnectionDate != null) {
|
||||
let oldUnixTime = Math.floor(data.lastConnectionDate.getTime() / 1000);
|
||||
@@ -22,17 +27,20 @@ module.exports = {
|
||||
} else connectionLog.addFields({ name: '**Session Time**', value: `**Unknown**`, inline: false });
|
||||
}
|
||||
|
||||
if (client.exists(channel)) await channel.send({ embeds: [connectionLog] });
|
||||
// if (client.exists(channel)) await channel.send({ embeds: [connectionLog] });
|
||||
await WebhookSend(client, webhook, {embeds: [connectionLog]});
|
||||
},
|
||||
|
||||
DetectCombatLog: async (client, guild, data) => {
|
||||
if (!client.exists(data.lastDamageDate)) return;
|
||||
if (!client.exists(guild.connectionLogsChannel)) return;
|
||||
const channel = client.GetChannel(guild.connectionLogsChannel);
|
||||
if (!channel) return; // Ensure channel exists
|
||||
|
||||
const newDt = await client.getDateEST(data.time);
|
||||
const diffSeconds = Math.round((newDt.getTime() - data.lastDamageDate.getTime()) / 1000);
|
||||
|
||||
// If diff is greater than 5 minutes, not a combat log
|
||||
// If diff is greater than configured time in minutes, not a combat log
|
||||
// or if death after last combat
|
||||
if (diffSeconds > (data.combatLogTimer * 60)) return;
|
||||
if (data.lastDamageDate <= data.lastDeathDate) return;
|
||||
@@ -40,10 +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;
|
||||
|
||||
const channel = client.GetChannel(guild.connectionLogsChannel);
|
||||
if (!channel) return;
|
||||
if (attacker.lastDeathDate > data.lastDamageDate) return;
|
||||
|
||||
let unixTime = Math.floor(newDt.getTime() / 1000);
|
||||
const destination = nearest(data.pos, guild.Nitrado.Mission);
|
||||
@@ -52,8 +57,12 @@ module.exports = {
|
||||
.setColor(client.config.Colors.Red)
|
||||
.setDescription(`**NOTICE:**\n**${data.player}** has combat logged at <t:${unixTime}> when fighting **${data.lastHitBy}\nLocation [${data.pos[0]}, ${data.pos[1]}](https://www.izurvive.com/chernarusplussatmap/#location=${data.pos[0]};${data.pos[1]})**\n${destination}`);
|
||||
|
||||
if (client.exists(guild.adminRole)) channel.send({ content: `<@&${guild.adminRole}>` });
|
||||
const NAME = "DayZ.R Admin Logs";
|
||||
const webhook = await GetWebhook(client, NAME, guild.connectionLogsChannel);
|
||||
|
||||
return channel.send({ embeds: [combatLog] });
|
||||
let content = { embeds: [combatLog] };
|
||||
if (client.exists(guild.adminRole)) content.content = `<@&${guild.adminRole}>`;
|
||||
WebhookSend(client, webhook, content);
|
||||
// return channel.send({ embeds: [combatLog] });
|
||||
}
|
||||
};
|
||||
+39
-15
@@ -2,6 +2,7 @@ const { BanPlayer, UnbanPlayer } = require('./NitradoAPI');
|
||||
const { EmbedBuilder } = require('discord.js');
|
||||
const { nearest } = require('../database/destinations');
|
||||
const { GetGuild } = require('../database/guild');
|
||||
const { GetWebhook, WebhookSend } = require("../util/WebhookHandler");
|
||||
|
||||
// Private functions (only called locally)
|
||||
|
||||
@@ -20,6 +21,10 @@ const ExpireEvent = async(client, guild, e) => {
|
||||
}
|
||||
|
||||
const HandlePlayerTrackEvent = async (client, guild, e) => {
|
||||
if (!client.exists(e.channel)) return ExpireEvent(client, guild, e); // Expire event since it has invalid channel.
|
||||
const channel = client.GetChannel(e.channel);
|
||||
if (!channel) return;
|
||||
|
||||
let player = await client.dbo.collection("players").findOne({"gamertag": e.gamertag});
|
||||
|
||||
let newDt = await client.getDateEST(player.time);
|
||||
@@ -31,10 +36,15 @@ const HandlePlayerTrackEvent = async (client, guild, e) => {
|
||||
.setColor(client.config.Colors.Default)
|
||||
.setDescription(`**${e.name} Event**\n${e.gamertag} was located at **[${player.pos[0]}, ${player.pos[1]}](https://www.izurvive.com/chernarusplussatmap/#location=${player.pos[0]};${player.pos[1]})** at <t:${unixTime}>\n${destination}`);
|
||||
|
||||
if (!client.exists(e.channel)) return ExpireEvent(client, guild, e); // Expire event since it has invalid channel.
|
||||
const channel = client.GetChannel(e.channel);
|
||||
if (e.role) channel.send({ content: `<@&${e.role}>`, embeds: [trackEvent] });
|
||||
else channel.send({ embeds: [trackEvent] });
|
||||
const NAME = "DayZ.R Player Tracker";
|
||||
const webhook = await GetWebhook(client, NAME, e.channel);
|
||||
|
||||
let content = { embeds: [trackEvent] };
|
||||
if (client.exists(guild.adminRole)) content.content = `<@&${e.role}>`;
|
||||
WebhookSend(client, webhook, content);
|
||||
|
||||
// if (e.role) channel.send({ content: `<@&${e.role}>`, embeds: [trackEvent] });
|
||||
// else channel.send({ embeds: [trackEvent] });
|
||||
|
||||
let now = new Date();
|
||||
let diff = ((now - e.creationDate) / 1000) / 60;
|
||||
@@ -86,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;
|
||||
}
|
||||
}
|
||||
@@ -106,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] });
|
||||
});
|
||||
@@ -123,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;
|
||||
|
||||
@@ -144,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;
|
||||
@@ -157,6 +167,7 @@ module.exports = {
|
||||
|
||||
if (distance < alarm.radius) {
|
||||
const channel = client.GetChannel(alarm.channel);
|
||||
if (!channel) continue;
|
||||
|
||||
let newDt = await client.getDateEST(data.time);
|
||||
let unixTime = Math.floor(newDt.getTime()/1000);
|
||||
@@ -165,11 +176,17 @@ 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 })
|
||||
|
||||
channel.send({ content: `<@&${alarm.role}>`, embeds: [alarmEmbed] });
|
||||
|
||||
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);
|
||||
|
||||
// channel.send({ content: `<@&${alarm.role}>`, embeds: [alarmEmbed] });
|
||||
|
||||
BanPlayer(client, data.killer);
|
||||
break;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return;
|
||||
@@ -198,6 +215,7 @@ module.exports = {
|
||||
|
||||
if (distance < alarm.radius) {
|
||||
const channel = client.GetChannel(alarm.channel);
|
||||
if (!channel) return;
|
||||
|
||||
let newDt = await client.getDateEST(info.time);
|
||||
let unixTime = Math.floor(newDt.getTime()/1000);
|
||||
@@ -206,8 +224,14 @@ 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 })
|
||||
|
||||
channel.send({ content: `<@&${alarm.role}>`, embeds: [alarmEmbed] });
|
||||
|
||||
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);
|
||||
|
||||
// channel.send({ content: `<@&${alarm.role}>`, embeds: [alarmEmbed] });
|
||||
|
||||
BanPlayer(client, info.player);
|
||||
break;
|
||||
|
||||
@@ -12,4 +12,4 @@ module.exports = {
|
||||
Float: 10, // AKA Number in Discord's Documentation
|
||||
Attachment: 11,
|
||||
}
|
||||
};
|
||||
};
|
||||
+1
-1
@@ -16,4 +16,4 @@ module.exports = {
|
||||
decipher.final('utf8')
|
||||
) // Decrypts data and converts to utf8
|
||||
}
|
||||
}
|
||||
}
|
||||
+51
-27
@@ -5,6 +5,7 @@ const { nearest } = require('../database/destinations');
|
||||
const { getDefaultPlayer, UpdatePlayer } = require('../database/player');
|
||||
const { calculateNewCombatRating } = require('./CombatRatingHandler');
|
||||
const { weapons, weaponClassOf } = require('../database/weapons');
|
||||
const { GetWebhook, WebhookSend } = require("../util/WebhookHandler");
|
||||
|
||||
const Templates = {
|
||||
Killed: 1,
|
||||
@@ -30,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',
|
||||
@@ -51,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;
|
||||
|
||||
@@ -79,20 +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],
|
||||
@@ -133,9 +135,14 @@ module.exports = {
|
||||
if (killedBy == Templates.LandMine || killedBy == Templates.Explosion || killedBy == Templates.Vehicle) {
|
||||
let victimStat = await client.dbo.collection("players").findOne({"playerID": info.victimID});
|
||||
if (!client.exists(victimStat)) victimStat = getDefaultPlayer(info.victim, info.victimID, NitradoServerID);
|
||||
victimStat.deaths++;
|
||||
victimStat.deathStreak++;
|
||||
victimStat.worstDeathStreak = victimStat.deathStreak > victimStat.worstDeathStreak ? victimStat.deathStreak : victimStat.worstDeathStreak;
|
||||
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';
|
||||
@@ -144,9 +151,14 @@ module.exports = {
|
||||
.setColor(client.config.Colors.Default)
|
||||
.setDescription(`**Death Event** - <t:${unixTime}>\n**${info.victim}** ${killMessage} a **${cod}.**${coord}`);
|
||||
|
||||
if (client.exists(channel)) await channel.send({ embeds: [killEvent] });
|
||||
await UpdatePlayer(client, victimStat);
|
||||
return
|
||||
|
||||
if (!channel) return;
|
||||
const webhook = await GetWebhook(client, NAME, guild.killfeedChannel);
|
||||
WebhookSend(client, webhook, { embeds: [killEvent]});
|
||||
|
||||
// if (client.exists(channel)) await channel.send({ embeds: [killEvent] });
|
||||
return;
|
||||
}
|
||||
|
||||
KillInAlarm(client, guild.serverID, info); // check if kill happened in a no kill zone
|
||||
@@ -171,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++;
|
||||
@@ -181,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;
|
||||
@@ -189,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;
|
||||
@@ -203,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;
|
||||
|
||||
@@ -215,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);
|
||||
@@ -228,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)
|
||||
@@ -247,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)
|
||||
@@ -263,9 +280,16 @@ module.exports = {
|
||||
killEvent.setThumbnail(weapons[weaponClass][weapon])
|
||||
}
|
||||
|
||||
if (client.exists(channel)) await channel.send({ embeds: [killEvent] });
|
||||
if (client.exists(receivedBounty) && client.exists(channel)) await channel.send({ content: `<@${killerStat.discordID}>`, embeds: [receivedBounty] });
|
||||
|
||||
if (!channel) return;
|
||||
|
||||
const webhook = await GetWebhook(client, NAME, guild.killfeedChannel);
|
||||
|
||||
WebhookSend(client, webhook, { embeds: [killEvent] });
|
||||
if (client.exists(receivedBounty) && client.exists(channel)) WebhookSend(client, webhook, { content: `<@${killerStat.discordID}>`, embeds: [receivedBounty] });
|
||||
|
||||
// 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
@@ -35,4 +35,4 @@ class Logger {
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = Logger;
|
||||
module.exports = Logger;
|
||||
+23
-11
@@ -5,8 +5,7 @@ const { getDefaultPlayer } = require('../database/player');
|
||||
const { FetchServerSettings } = require('../util/NitradoAPI');
|
||||
const { UpdatePlayer, insertPVPstats, createWeaponStats } = require('../database/player')
|
||||
const { Missions } = require('../database/destinations');
|
||||
|
||||
let lastSendMessage;
|
||||
const { GetWebhook, WebhookSend, WebhookMessageEdit } = require("../util/WebhookHandler");
|
||||
|
||||
module.exports = {
|
||||
|
||||
@@ -34,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.
|
||||
@@ -77,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);
|
||||
@@ -88,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;
|
||||
@@ -133,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;
|
||||
@@ -173,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);
|
||||
|
||||
@@ -208,10 +213,11 @@ module.exports = {
|
||||
|
||||
if (!client.exists(guild.activePlayersChannel)) return;
|
||||
const channel = client.GetChannel(guild.activePlayersChannel);
|
||||
if (!channel) return;
|
||||
|
||||
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)
|
||||
@@ -251,10 +258,15 @@ module.exports = {
|
||||
.setTitle(`Players Online:`)
|
||||
.setDescription(des || (nodes ? "No Players Online :(" : ""));
|
||||
|
||||
if (lastSendMessage) lastSendMessage.delete().catch(error => client.sendError(channel, `HandleActivePlayersList Error: \n${error}`)); // Remove previous message before reprinting
|
||||
const NAME = "DayZ.R Admin Logs";
|
||||
const webhook = await GetWebhook(client, NAME, guild.activePlayersChannel);
|
||||
|
||||
return channel.send({ embeds: [serverEmbed, activePlayersEmbed] }).then(sentMessage =>
|
||||
lastSendMessage = sentMessage
|
||||
);
|
||||
let id = client.playerListMsgIds.get(guild.serverID);
|
||||
if (id == "") {
|
||||
id = await WebhookSend(client, webhook, { embeds: [serverEmbed, activePlayersEmbed] }).id;
|
||||
client.playerListMsgIds.set(guild.serverID, id);
|
||||
} else {
|
||||
WebhookMessageEdit(client, webhook, id, { embeds: [serverEmbed, activePlayersEmbed] });
|
||||
}
|
||||
}
|
||||
};
|
||||
+36
-34
@@ -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.
|
||||
*/
|
||||
|
||||
@@ -176,6 +177,7 @@ module.exports = {
|
||||
|
||||
if (!res.ok) {
|
||||
client.error(`Failed to get Nitrado server stats (${nitrado_cred.ServerID}): status: ${res.status}, message: ${res.statusText}: ${fetcher} via FetchServerSettings`);
|
||||
if (res.status == 401) return 1; // return immediately if unauthorized
|
||||
if (retries === 2) return 1; // Return error status on the second failed status code.
|
||||
} else {
|
||||
const data = await res.json();
|
||||
@@ -260,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));
|
||||
@@ -271,7 +273,7 @@ module.exports = {
|
||||
|
||||
const uploaded = await UploadNitradoFile(nitrado_cred, client, missionPath, 'cfggameplay.json', jsonDir);
|
||||
if (uploaded == 1) return 1;
|
||||
|
||||
|
||||
return 0;
|
||||
},
|
||||
|
||||
@@ -288,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));
|
||||
@@ -299,7 +301,7 @@ module.exports = {
|
||||
|
||||
const uploaded = await UploadNitradoFile(nitrado_cred, client, missionPath, 'cfggameplay.json', jsonDir);
|
||||
if (uploaded == 1) return 1;
|
||||
|
||||
|
||||
return 0;
|
||||
},
|
||||
|
||||
|
||||
@@ -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
@@ -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}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,56 @@
|
||||
const { makeURLSearchParams } = require('@discordjs/rest');
|
||||
const { REST } = require('@discordjs/rest');
|
||||
const { Routes } = require('discord.js');
|
||||
|
||||
const createWebhook = async (client, channel_id, name, avatar) => {
|
||||
const rest = new REST({ version: '10' }).setToken(client.config.Token);
|
||||
return await rest.post(Routes.channelWebhooks(channel_id), {
|
||||
body: {
|
||||
name: name,
|
||||
avatar: avatar
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
module.exports = {
|
||||
GetWebhook: async (client, webhookName, channel_id) => {
|
||||
// Get all webhooks from configured channel
|
||||
const rest = new REST({ version: '10' }).setToken(client.config.Token);
|
||||
const webhooks = await rest.get(Routes.channelWebhooks(channel_id));
|
||||
|
||||
let webhook = null;
|
||||
if (webhooks.length == 0) {
|
||||
// If no webhook exists, create new webhook with given name for this channel
|
||||
webhook = createWebhook(client, channel_id, webhookName, client.config.AvatarData);
|
||||
} else {
|
||||
// Check existing webhooks for one with given name
|
||||
let exists = false;
|
||||
for (let i = 0; i < webhooks.length; i++) {
|
||||
if (webhooks[i].name == webhookName) {
|
||||
webhook = webhooks[i];
|
||||
exists = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!exists) webhook = createWebhook(client, channel_id, webhookName, client.config.AvatarData);
|
||||
}
|
||||
|
||||
return webhook;
|
||||
},
|
||||
|
||||
WebhookSend: async (client, webhook, content) => {
|
||||
const rest = new REST({ version: '10' }).setToken(client.config.Token);
|
||||
return await rest.post(Routes.webhook(webhook.id, webhook.token), {
|
||||
body: content,
|
||||
query: makeURLSearchParams({ wait: true })
|
||||
});
|
||||
},
|
||||
|
||||
WebhookMessageEdit: async (client, webhook, message_id, content) => {
|
||||
const rest = new REST({ version: '10' }).setToken(client.config.Token);
|
||||
return rest.patch(Routes.webhookMessage(webhook.id, webhook.token, message_id), {
|
||||
body: content
|
||||
});
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user