diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS
new file mode 100644
index 0000000..39c9020
--- /dev/null
+++ b/.github/CODEOWNERS
@@ -0,0 +1 @@
+* @butterstroke
\ No newline at end of file
diff --git a/TermsOfService.md b/TermsOfService.md
index c46db20..d414d93 100644
--- a/TermsOfService.md
+++ b/TermsOfService.md
@@ -1,45 +1,52 @@
-
Margarine's Terms of Service
-The agreements for the users of Margarine and the maintainers of the instance of Margarine.
+MargarineBot's Terms of Service
+The agreements for the users and the maintainers of MargarineBot.
-**Last Updated:** 1 May 2020
+**Last Updated:** 22 April 2021
**Usage:**
-By using Margarine, users agree to have their information usable and manipulated for improving and general use of Margarine. Any data collected will be collected anonymously and, in most cases, not stored.
-There are two stages of data agreement in which users can interact with Margarine.
+By using MargarineBot (aka Margarine), users (defined as anyone with access to Margarine) agree to have their information usable and manipulated for improving and general use of Margarine. Any data collected will be collected anonymously and, in most cases, not stored.
-By inviting Margarine into the guild, all users within the guild agree to the first stage. Data stored on this stage is limited to any guild-wide configurations, guild-wide features such as message IDs stored to manage starboards, any temporary data such as a music queue provided by commands, and any temporary cache of the user handled by the Discord.js library. Discord.js is a required package which allows Margarine to communicate with Discord's API. Discord.js is open-sourced and anyone can see what this library does through their Github page linked here: https://github.com/discordjs/discord.js.
+There are two types of Margarine users of which users can change to freely.
-The second stage of data agreement is when a user uses Margarine's daily command. The daily command is used to ensure that the user agrees to such permissions and sets up the user profile within Margarine's systems to contain items like: virtual currency (credits) for games, reputation points, usernames for other profiles, etc... By using the daily command, the user is giving Margarine explicit permission to store user data on the user outside of Discord. However, any data that is not from Discord such as usernames from other profiles, are all given through the use of other appropriate commands by the user. All user information is stored under their unique Discord ID.
+First type of user is any user within the Discord servers that Margarine serves. Data stored on this stage is limited to any server-wide configurations, server-wide features such as identification numbers stored to manage starboards, roles, moderation logs, etc., and any temporary data such as a music queue (self-hosted only) provided by commands. This data is stored outside of Discord and managed via commands. Any stored user identification for server-wide features is limited to the user's unique Discord identification and all user identification at this stage is deleted upon the user's departure from the server.
-All credits, reputation points, inventory items, etc... that are used within Margarine's economy and commands are generated and hold no real monetary value. They are purely for entertainment and users who use credits, reputation points, or inventory items for real monetary sales and profits are to be reported and blacklisted from the bot.
+Additionally, Margarine contains numerous temporary caches of users, servers, etc... as handled by the Discord.js library. Discord.js is a required package which allows Margarine to communicate with Discord's API. Discord.js is open-sourced and anyone can see what this library does through their Github page linked here: https://github.com/discordjs/discord.js.
-Users are asked to make reports about any issues or feedback within Margarine through its report command. This does not require any permission from the user as none of the report data is stored outside of Discord.
+Second type is a manual agreement where users can approve of additional data collection via Margarine's daily command. By using the daily command, the user gives Margarine explicit permission to store user data on the user outside of Discord. A user profile with Margarine (aka MargarineUser) stores data such as virtual currency (referred to as credits), reputation points, third party usernames, etc. All user information is stored under their unique Discord ID. Data collected for this type of user is either provided by addtional commands (such as third party usernames) or generated within Margarine's code (such as credits).
+
+User data can also be sent across Discord. With moderation commands, the moderation messages send both the user's identification and moderator's identification to the user's direct messages and a channel specified (or sent into the same channel if no channel is specified) by a server's moderation team for logging. Additionally, users can make reports about any issues or feedback within Margarine through its report command. Since all data is passed and stored within Discord, there is no user permissions required to access and use these commands.
+
+**Virtually Generated Data**
+
+All credits, reputation points, inventory items, etc. that are used within Margarine's commands are generated and hold no real monetary value. They are purely for entertainment. Anyone who is not the developer of Margarine selling any Margarine generated items for real monetary value are to be reported and blacklisted from the bot.
+
+To report an incident, please send an email to katsurinstudios@protonmail.ch with a title relating to the incident.
**Data Requests and Removal:**
-Any users may contact the developer for their data on Margarine at any time using the contact information defined in the contact section. The user's information will be sent to them after validation and in a way that is convenient for both parties. After the data has been received, the developer will make sure the sent file is deleted 48-72 hours laters. Any data received is up to the user's discretion and the developer is no longer responsible for said data after file deletion.
+Any users may contact the developer for their data on Margarine at any time using the contact information defined in the contact section. The user's information will be sent to them after validation and in a way that is convenient for both parties. After the data has been confirmed as received, the sent file is to be deleted 48-72 hours later. The user becomes solely responsible for the data they receive after the transfer. The developer is no longer responsible for the transmitted data after file deletion.
If a user requests for their user profile to be deleted, they may either use the revoke command within Margarine or message the developer in the contact section below. The data will be deleted after validation with no questions asked. However, users should be warned that there is no recovery of deleted data and any user who deletes their profiles will be locked out of making a new profile for 24 hours.
For self-hosted versions of Margarine, users must send their requests to the person hosting the instance instead of the developer.
-**Self-Hosting**
+**Self-Hosting Instances**
-For any issues relating to a self-hosted instance of Margarine, the user must send their requests to the person responsible for the self-hosting. The developer is not responsible for any misuse conducted by the self-hosted instances of the program. However, if general questions about Margarine do arise, please see the Contact section of the terms for information on how to get in touch.
+For self-hosted instances of Margarine, the developer is not responsible for any misuse conducted by the self-hosted instances of the program. Users of these instances are asked to contact the people responsible for the instance for their requests. If general questions about Margarine do arise, users may contact the developer with the provided contacts in the Contact section.
**Disclaimer:**
If for any reason Margarine needs to store more data, these terms may change with notice to reflect the state of the project. These changes will always be noted in the patch notes of each release and it is up to the user to see for themselves what has changed between releases. If there are any questions about recent changes, the user may contact the developer through the information in the contact section.
-The developer of Margarine does not knowingly know of any stored data of users under the age of 13. If a user under the age of 13 is found with data on Margarine, the data will be deleted and the user will be reported to Discord.
-
-The developer of Margarine does not knowingly store any data of users under the age of 13 nor of any user who's account has been deleted. If data on a user with either of the items mentioned exist within Margarine, the data will be deleted.
+The developer of Margarine does not knowingly store any data of users under the age of 13 nor of any user who's account has been deleted. If data on a user with either of the items mentioned exist within Margarine, the data will be deleted. In the case of underaged users, the account will also be reported to Discord.
**Agreement:**
-Users are aware and agree to the following terms defined above. They are also aware that changes in the Terms of Service will be announced in the patch notes for each release.
+Users are aware and agree to the following terms defined above. They are also aware that changes in the Terms of Service will be announced in the patch notes for each release. If users continue to use the service after changes within the terms, they are assumed to have agreed to the changes.
**Contact:**
-For any questions, complaints, etc... either contact me via my Discord server (https://discord.gg/TJJ6KGd) in #margarine-bot or send me an email at katsurinstudios@protonmail.ch.
+Contact the developer via email at katsurinstudios@protonmail.ch or Discord (https://discord.gg/qKfqsjW) in the #margarine-bot channel.
+
+For code issues, users are also asked to make a GitHub issue on the [MargarineBot repository](https://github.com/Butterstroke/MargarineBot/issues) when able to for issue tracking.
diff --git a/arguments/monitor.js b/arguments/monitor.js
new file mode 100644
index 0000000..5e9a58a
--- /dev/null
+++ b/arguments/monitor.js
@@ -0,0 +1,16 @@
+const { Argument } = require("klasa");
+
+module.exports = class extends Argument {
+ run(arg, possible, msg) {
+ let x = 0;
+ const monitorIterator = this.client.monitors.entries();
+ while (x < this.client.monitors.size) {
+ let currMonitor = monitorIterator.next().value;
+ if (currMonitor[0].toLowerCase() === arg.toLowerCase()) {
+ return currMonitor[1];
+ }
+ }
+
+ throw msg.language.get("RESOLVER_INVALID_PIECE", possible.name, "monitor");
+ }
+};
\ No newline at end of file
diff --git a/assets/settingsExample.json b/assets/settingsExample.json
index f3faf8a..ae3e322 100644
--- a/assets/settingsExample.json
+++ b/assets/settingsExample.json
@@ -2,8 +2,8 @@
"token": "Token Key",
"prefix": "Prefix",
"build": {
- "version": "Release 1.5.0",
- "releaseDate": "January 16th, 2021"
+ "version": "Release 1.6.0",
+ "releaseDate": "April 27th, 2021"
},
"database": "./assets/MargarineData.sqlite",
"dateOptions": {
diff --git a/assets/speech/en-CA/config.js b/assets/speech/en-CA/config.js
index 9d02469..8ad8e9b 100644
--- a/assets/speech/en-CA/config.js
+++ b/assets/speech/en-CA/config.js
@@ -72,5 +72,41 @@ module.exports = {
"remove": [
"Okay! I will stop using the previous default channel."
]
+ },
+ "setwelcome": [
+ "Okay! I have set the welcome message to `-msg`.",
+ "*Ahem...* `-msg`\nWhat a welcoming message!"
+ ],
+ "setleave": [
+ "Okay! I have set the leave message to `-msg`.",
+ "*Ahem...* `-msg`\nQuite sad that the people leaving won't see your fantastic message."
+ ],
+ "monitortoggle": {
+ "nomonitor": [
+ "No monitor by that name exists.",
+ "No monitor found",
+ "What? That monitor does not exist."
+ ],
+ "notoggle": [
+ "This monitor is not toggleable.",
+ "Nope, this monitor is not configurable for guilds."
+ ],
+ "disable": [
+ "Okay! I have disabled the -monitor monitor",
+ "-monitor monitor has been disabled by your request"
+
+ ],
+ "enable": [
+ "Okay! I have enabled the -monitor monitor",
+ "-monitor monitor has been enabled by your request"
+ ]
+ },
+ "setmodlog": {
+ "change": [
+ "Okay! I have changed the modlog channel to -channel!"
+ ],
+ "remove": [
+ "Okay! I will stop using the previous modlog channel."
+ ]
}
};
\ No newline at end of file
diff --git a/assets/speech/en-CA/fun.js b/assets/speech/en-CA/fun.js
index 421a61d..9fd0512 100644
--- a/assets/speech/en-CA/fun.js
+++ b/assets/speech/en-CA/fun.js
@@ -92,5 +92,20 @@ module.exports = {
"Wow. That's awful of you, -user. I'm just here trying to be helpful and make friends but you want to shut me down. Quite rude!",
"Ouch! Am I not doing a good enough job for you? BAKA!",
"-user! So mean! I'm just trying to have fun here!"
- ]
+ ],
+ "tictactoe": {
+ "sameuser": [
+ "Hey! You can't play Tic Tac Toe with yourself! Invite someone into the mix or play with me instead!",
+ "You can't play Tic Tac Toe by yourself! At least invite me to play!"
+ ],
+ "spottaken": [
+ "Looks like someone already beat you to that spot. Pick another one!",
+ "Pick another one. Someone already claimed that one."
+ ],
+ "timeout": [
+ "Looks like the active player took too long to answer. The match has ended.",
+ "Hello? Hellooooo? Looks like the active player left.",
+ "Ending the match since the active player took too long to respond."
+ ]
+ }
};
\ No newline at end of file
diff --git a/assets/speech/en-CA/monitor.js b/assets/speech/en-CA/monitor.js
new file mode 100644
index 0000000..68c3881
--- /dev/null
+++ b/assets/speech/en-CA/monitor.js
@@ -0,0 +1,11 @@
+/*
+ * Speech module for all monitors
+ */
+
+module.exports = {
+ "inviteDetector": [
+ "<@!-author>! You posted a Discord invite link which is not allowed on this server.",
+ "<@!-author>, you cannot post a Discord invite link on this server.",
+ "<@!-author>, you are not allowed to post Discord invite links on this server"
+ ]
+};
\ No newline at end of file
diff --git a/commands/Config/monitorToggle.js b/commands/Config/monitorToggle.js
new file mode 100644
index 0000000..967c75e
--- /dev/null
+++ b/commands/Config/monitorToggle.js
@@ -0,0 +1,35 @@
+const { Command } = require("klasa");
+
+module.exports = class extends Command {
+ constructor(...args) {
+ super(...args, {
+ name: "monitorToggle",
+ enabled: true,
+ guarded: true,
+ runIn: ["text"],
+ aliases: ["mtoggle"],
+ description: "Enable or disable a monitor for your server.",
+ usage: "[monitor:monitor]",
+ permissionLevel: 6
+ });
+
+ this.humanUse = "";
+ }
+
+ async run(msg, [monitor]) {
+ if (!monitor) { return msg.sendLocale("MONITORTOGGLE_NOMONITOR", [msg]); }
+
+ let disabled = msg.guild.settings.monitors[monitor.name];
+
+ if (disabled === undefined) {
+ return msg.sendLocale("MONITORTOGGLE_NOTOGGLE", [msg]);
+ }
+
+ msg.guild.settings.update(`monitors.${monitor.name}`, !disabled, msg.guild).then(() => {
+ if (disabled) {
+ return msg.sendLocale("MONITORTOGGLE_DISABLE", [msg, monitor.name]);
+ }
+ msg.sendLocale("MONITORTOGGLE_ENABLE", [msg, monitor.name]);
+ });
+ }
+};
\ No newline at end of file
diff --git a/commands/Config/setDefaultChannel.js b/commands/Config/setDefaultChannel.js
index 97c1495..0172387 100644
--- a/commands/Config/setDefaultChannel.js
+++ b/commands/Config/setDefaultChannel.js
@@ -16,10 +16,8 @@ module.exports = class extends Command {
async run(msg, [item]) {
if (item === "remove") { item = null; }
-
if (item && !item.includes("<#")) { return msg.sendLocale("RESOLVER_INVALID_CHANNEL", [item]); }
- console.log(item);
msg.guild.settings.update("defaultChannel", item).then(() => {
if (item) { return msg.sendLocale("SETDEFAULTCHANNEL", [msg, item]); }
msg.sendLocale("SETDEFAULTCHANNEL_REMOVE", [msg, item]);
diff --git a/commands/Config/setLeaveMsg.js b/commands/Config/setLeaveMsg.js
new file mode 100644
index 0000000..449c62a
--- /dev/null
+++ b/commands/Config/setLeaveMsg.js
@@ -0,0 +1,38 @@
+const { Command } = require("klasa");
+
+module.exports = class extends Command {
+ constructor(...args) {
+ super(...args, {
+ name: "setleave",
+ enabled: true,
+ runIn: ["text"],
+ description: "Set a leave message for when users leave the server.",
+ usage: "[show|remove|text:str]",
+ permissionLevel: 5,
+ extendedHelp: "Add `-pinguser`, `-username`, `-userid`, and/or `-servername` to the message to have Margarine personalize it. Standard Discord styling still applies.\n\n" +
+ "This feature requires both a message and a default channel set. Removing either one will disable this feature."
+ });
+ }
+
+ async run(msg, [item]) {
+ if (item === "show" || item === undefined) {
+ return msg.channel.send(
+ msg.guild.settings.leaveMsg.replace("-pinguser", `<@!${msg.author.id}>`)
+ .replace("-servername", msg.guild.name)
+ .replace("-userid", msg.author.id)
+ .replace("-username", msg.author.username)
+ );
+ }
+
+ if (item === "remove") {
+ msg.guild.settings.update("leaveMsg", null).then(() => {
+ msg.sendLocale("REMOVELEAVE", [msg]);
+ });
+ return;
+ }
+
+ msg.guild.settings.update("leaveMsg", item).then(() => {
+ msg.sendLocale("SETLEAVE", [msg, item]);
+ });
+ }
+};
diff --git a/commands/Config/setModLog.js b/commands/Config/setModLog.js
new file mode 100644
index 0000000..c808b44
--- /dev/null
+++ b/commands/Config/setModLog.js
@@ -0,0 +1,25 @@
+const { Command } = require("klasa");
+
+module.exports = class extends Command {
+ constructor(...args) {
+ super(...args, {
+ name: "setmodlog",
+ enabled: true,
+ runIn: ["text"],
+ description: "Set the server's modlog channel.",
+ usage: "",
+ permissionLevel: 6,
+ extendedHelp: "The modlog channel is used for moderation messages. Not setting a modlog channel will redirect these messages to a default channel or the current channel."
+ });
+ }
+
+ async run(msg, [item]) {
+ if (item && !item.includes("<#")) { return msg.sendLocale("RESOLVER_INVALID_CHANNEL", [item]); }
+ if (item === "remove") { item = null; }
+
+ msg.guild.settings.update("modlog", item).then(() => {
+ if (item) { return msg.sendLocale("SETMODLOG", [msg, item]); }
+ msg.sendLocale("SETMODLOG_REMOVE", [msg, item]);
+ });
+ }
+};
\ No newline at end of file
diff --git a/commands/Config/setWelcomeMsg.js b/commands/Config/setWelcomeMsg.js
new file mode 100644
index 0000000..ba7f27a
--- /dev/null
+++ b/commands/Config/setWelcomeMsg.js
@@ -0,0 +1,40 @@
+const { Command } = require("klasa");
+
+module.exports = class extends Command {
+ constructor(...args) {
+ super(...args, {
+ name: "setwelcome",
+ enabled: true,
+ runIn: ["text"],
+ description: "Set a welcome message for new users to see when they join!",
+ usage: "[show|remove|text:str]",
+ permissionLevel: 5,
+ extendedHelp: "Add `-pinguser`, `-username`, `-userid`, and/or `-servername` to the message to have Margarine personalize it! Standard Discord styling still applies.\n\n" +
+ "This feature requires both a message and a default channel set. Removing either one will disable this feature."
+ });
+
+ this.humanUse = "[show|remove|(welcome message)]";
+ }
+
+ async run(msg, [item]) {
+ if (item === "show" || item === undefined) {
+ return msg.channel.send(
+ msg.guild.settings.welcomeMsg.replace("-pinguser", `<@!${msg.author.id}>`)
+ .replace("-servername", msg.guild.name)
+ .replace("-userid", msg.author.id)
+ .replace("-username", msg.author.username)
+ );
+ }
+
+ if (item === "remove") {
+ msg.guild.settings.update("welcomeMsg", null).then(() => {
+ msg.sendLocale("REMOVEWELCOME", [msg]);
+ });
+ return;
+ }
+
+ msg.guild.settings.update("welcomeMsg", item).then(() => {
+ msg.sendLocale("SETWELCOME", [msg, item]);
+ });
+ }
+};
diff --git a/commands/Fun/tictactoe.js b/commands/Fun/tictactoe.js
new file mode 100644
index 0000000..ca47214
--- /dev/null
+++ b/commands/Fun/tictactoe.js
@@ -0,0 +1,125 @@
+const { Command } = require("klasa");
+const { MessageEmbed } = require("discord.js");
+
+const board = [
+ [":one:", ":two:", ":three:"],
+ [":four:", ":five:", ":six:"],
+ [":seven:", ":eight:", ":nine:"]
+];
+const p1Marker = "⭕";
+const p2Marker = "❌";
+
+module.exports = class extends Command {
+ constructor(...args) {
+ super(...args, {
+ name: "tictactoe",
+ runIn: ["text"],
+ aliases: ["ttt"],
+ description: "Play TicTacToe",
+ usage: "[user:usersearch]",
+ extendedHelp: "Be sure to have your DMs open to allow Margarine to ask for your response! " +
+ "Note: If no user is selected, the player can play against Margarine in a friendly duel."
+ });
+
+ this.humanUse = "[user]";
+
+ this.filter = (response) => {
+ if (response.author.id !== this.activePlayer.id) { return; }
+ return Number(response.content) > 0 && Number(response.content) < 10;
+ };
+ this.activePlayer = null;
+ this.author = null;
+ }
+
+ async run(msg, [user]) {
+ if (user.id === msg.author.id) {
+ if (msg.args.length > 0) { return msg.sendLocale("TTT_SAMEUSER", [msg]); }
+ user = this.client.user;
+ }
+
+ this.author = msg.author;
+
+ const gameMenu = new MessageEmbed()
+ .setTimestamp()
+ .setFooter(msg.guild.name, msg.guild.iconURL())
+ .setColor(0x04d5fd)
+ .setTitle(msg.language.get("TTT_MATCHHEADER"))
+ .setDescription(`${msg.author.tag} ${msg.language.get("VERSUS")} ${user.tag}`)
+ .addField(msg.language.get("TTT_BOARD"), this.genBoardDisplay(board));
+
+ let gameMsg = await msg.channel.send(gameMenu);
+
+ this.activePlayer = this.author;
+ let noWinner = true;
+
+ while (noWinner) {
+ let response;
+ if (this.activePlayer === this.client.user) {
+ response = this.client.util.getRandom(1, 10);
+ } else {
+ response = await this.collectResponse(gameMsg);
+ if (!response) { return; }
+ }
+
+ let [row, column] = this.getPosition(response);
+
+ if (board[row][column] === p1Marker || board[row][column] === p2Marker) {
+ if (this.activePlayer !== this.client.user) {
+ msg.sendLocale("TTT_SPOTTAKEN");
+ }
+ } else {
+ board[row][column] = this.isAuthorActive() ? p1Marker : p2Marker;
+ gameMenu.fields[0].value = this.genBoardDisplay(board);
+
+ gameMsg.edit(gameMenu);
+
+ this.activePlayer = this.isAuthorActive() ? user : this.author;
+ }
+
+ noWinner = !await this.determineWinner(board);
+ }
+
+ gameMenu.fields[1] = {
+ name: msg.language.get("WINNER"),
+ value: this.isAuthorActive() ? user.tag : this.author.tag
+ }
+
+ gameMsg.edit(gameMenu);
+ }
+
+ isAuthorActive() {
+ return this.activePlayer === this.author;
+ }
+
+ /**
+ * Get row and column position from the number.
+ * @returns An array [Row, Column]
+ */
+ getPosition(number) {
+ return [Math.floor((number - 1) / 3), (number - 1) % 3];
+ }
+
+ genBoardDisplay(board) {
+ return `${board[0].join(" ")}\n${board[1].join(" ")}\n${board[2].join(" ")}`;
+ }
+
+ async determineWinner(board) {
+ for (let x = 0; x < 3; x++) {
+ if (board[x][0] === board[x][1] && board[x][1] === board[x][2]) { return true; }
+ if (board[0][x] === board[1][x] && board[1][x] === board[2][x]) { return true; }
+ }
+ if (board[0][0] === board[1][1] && board[1][1] === board[2][2]) { return true; }
+ if (board[0][2] === board[1][1] && board[1][1] === board[2][0]) { return true; }
+ return false;
+ }
+
+ async collectResponse(menuMsg) {
+ let collected = await menuMsg.channel.awaitMessages(this.filter, { max: 1, time: 30000, errors: ["time"] })
+ .catch(() => {
+ menuMsg.sendLocale("TTT_TIMEOUT", [menuMsg]);
+ });
+
+ if (!collected) { return; } // No message was collected.
+ return collected.entries().next().value[1].content.toLowerCase();
+ }
+};
\ No newline at end of file
diff --git a/commands/Mod/ban.js b/commands/Mod/ban.js
index 6e9d6a9..19d9abf 100644
--- a/commands/Mod/ban.js
+++ b/commands/Mod/ban.js
@@ -8,24 +8,24 @@ module.exports = class extends Command {
runIn: ["text"],
aliases: ["b"],
permissionLevel: 6,
- description: "Ban someone.",
+ description: "Ban someone",
usage: " ", usageDelim: ","
});
- this.humanUse = "_";
+ this.humanUse = ", ";
}
- async run(msg, [user, reason]) {
+ async run(msg, [user, reason=reason.trim()]) {
user = msg.guild.members.cache.get(user.id);
- if (user.bannable === false) { return msg.reply("I cannot ban that member"); }
+ if (user.bannable === false) { return msg.reply(msg.language.get("BAN_UNBANNABLE")); }
- var data = this.client.util.modEmbed(msg, "ban", user, reason);
+ let { embed, DMembed } = this.client.util.modEmbed(msg, "ban", user, reason);
- if (data.embed.thumbnail) {
- await user.send({embed: data.DMembed});
- await user.ban(`Automated Action - Moderator: ${msg.author.username} | Reason: ${reason}`);
+ if (embed.thumbnail) {
+ await user.send({embed: DMembed});
+ await user.ban(msg.language.get("MODRMESSAGE", [msg.author.username, reason]));
}
- this.client.util.defaultChannel(msg.guild, "mod").send({embed: data.embed});
+ this.client.util.defaultChannel(msg.guild, "mod").send({embed: embed});
}
};
\ No newline at end of file
diff --git a/commands/Mod/kick.js b/commands/Mod/kick.js
index 59f5ddd..6c36005 100644
--- a/commands/Mod/kick.js
+++ b/commands/Mod/kick.js
@@ -9,24 +9,24 @@ module.exports = class extends Command {
aliases: ["k"],
permissionLevel: 5,
requiredPermissions: ["KICK_MEMBERS", "EMBED_LINKS"],
- description: "Kicks the mentioned user.",
+ description: "Kicks the mentioned user",
usage: " ", usageDelim: ","
});
- this.humanUse = "_";
+ this.humanUse = ", ";
}
- async run(msg, [user, reason]) {
+ async run(msg, [user, reason=reason.trim()]) {
user = msg.guild.members.cache.get(user.id);
- if (user.kickable === false) { return msg.reply("I cannot kick that member"); }
+ if (user.kickable === false) { return msg.reply(msg.language.get("KICK_UNKICKABLE")); }
- var data = this.client.util.modEmbed(msg, "kick", user, reason);
+ let { embed, DMembed } = this.client.util.modEmbed(msg, "kick", user, reason);
- if (data.embed.thumbnail) {
- await user.send({embed: data.DMembed});
- await user.kick(`Automated Action - Moderator: ${msg.author.username} | Reason: ${reason}`);
+ if (embed.thumbnail) {
+ await user.send({embed: DMembed});
+ await user.kick(msg.language.get("MODRMESSAGE", [msg.author.username, reason]));
}
- this.client.util.defaultChannel(msg.guild, "mod").send({embed: data.embed});
+ this.client.util.defaultChannel(msg.guild, "mod").send({embed: embed});
}
};
\ No newline at end of file
diff --git a/commands/Mod/mute.js b/commands/Mod/mute.js
index 8f6ba7d..287d065 100644
--- a/commands/Mod/mute.js
+++ b/commands/Mod/mute.js
@@ -13,38 +13,38 @@ module.exports = class extends Command {
usage: " [reason:str]", usageDelim: ","
});
- this.humanUse = "_[reason]";
+ this.humanUse = ", [reason]";
}
- async run(msg, [user, reason="No reason given."]) {
- if (msg.guild.settings.muteRole === null) { return msg.channel.send(this.client.speech(msg, ["mute", "noRole"])); }
+ async run(msg, [user, reason=msg.language.get("NOREASON")]) {
+ if (msg.guild.settings.muteRole === null) { return msg.sendLocale("MUTE_NOMUTEROLE", [msg]); }
user = msg.guild.members.cache.get(user.id);
- var role = msg.guild.roles.cache.get(msg.guild.settings.muteRole);
- if (role.position > msg.guild.members.cache.get(this.client.user.id).roles.highest.position) { return msg.channel.send(this.client.speech(msg, ["mute", "rolePos"])); }
+ let role = msg.guild.roles.cache.get(msg.guild.settings.muteRole);
+ if (role.position > msg.guild.members.cache.get(this.client.user.id).roles.highest.position) {
+ return msg.sendLocale("MUTE_HIGHERPOS", [msg]);
+ }
- if (msg.channel.permissionsFor(user).has("ADMINISTRATOR")) { //Admins can talk regardless. Send message to warn that it will not work.
- msg.channel.send(this.client.speech(msg, ["mute", "admin"]));
+ if (msg.channel.permissionsFor(user).has("ADMINISTRATOR")) { //Admins can talk regardless
+ msg.sendLocale("MUTE_ISADMIN", [msg]);
}
if (user.roles.cache.get(role.id)) {
- var data = this.client.util.modEmbed(msg, "unmute", user, reason);
- user.roles.remove(role.id, `Automated Action - Moderator: ${msg.author.username} | ${reason}`);
+ let { embed, DMembed } = this.client.util.modEmbed(msg, "unmute", user, reason);
+ user.roles.remove(role.id, msg.language.get("MODRMESSAGE", [msg.author.username, reason]));
- //Send embeds to logs and target user.
- user.send({embed: data.DMembed});
- this.client.util.defaultChannel(msg.guild, "mod").send({embed: data.embed});
+ user.send({embed: DMembed});
+ this.client.util.defaultChannel(msg.guild, "mod").send({embed: embed});
- return msg.channel.send(this.client.speech(msg, ["mute", "unmuted"], [["-user", user.user.username]]));
+ return msg.sendLocale("MUTE_UNMUTED", [msg, user.user.username]);
}
- var data = this.client.util.modEmbed(msg, "mute", user, reason);
- user.roles.add(role.id, `Automated Action - Moderator: ${msg.author.username} | ${reason}`);
+ let { embed, DMembed } = this.client.util.modEmbed(msg, "mute", user, reason);
+ user.roles.add(role.id, msg.language.get("MODRMESSAGE", [msg.author.username, reason]));
- //Send embeds to logs and target user.
- user.send({embed: data.DMembed});
- this.client.util.defaultChannel(msg.guild, "mod").send({embed: data.embed});
+ user.send({embed: DMembed});
+ this.client.util.defaultChannel(msg.guild, "mod").send({embed: embed});
- msg.channel.send(this.client.speech(msg, ["mute", "muted"], [["-user", user.user.username]]));
+ msg.sendLocale("MUTE_MUTED", [msg, user.user.username]);
}
};
\ No newline at end of file
diff --git a/commands/Mod/purge.js b/commands/Mod/purge.js
index eb82e53..711f877 100644
--- a/commands/Mod/purge.js
+++ b/commands/Mod/purge.js
@@ -28,21 +28,22 @@ module.exports = class extends Command {
const embed = new MessageEmbed()
.setColor("#FF0000")
.setTimestamp()
- .setTitle("❌ ERROR: MISSING PERMISSIONS! ❌")
- .setDescription("You do not have the correct permissions for this command!");
+ .setTitle(msg.language.get("MISSINGPERMISSION"))
+ .setDescription(msg.language.get("USER_INCORRECTPERM"));
return msg.channel.send({embed});
}
msg.channel.messages.fetch({ limit: msgCount }).then((messages) => {
+ let userSpecific = "";
if (user && userCheck[2]) {
const filterBy = user ? user.id : this.client.user.id;
messages = messages.filter(m => m.author.id === filterBy).array().slice(0, amount);
- var extra = `by ${user.tag} `;
+ userSpecific = msg.language.get("PURGE_USERSPECIFIC", [user.tag]);
}
msg.channel.bulkDelete(messages).catch(error => console.log(error.stack));
- msg.channel.send(this.client.speech(msg, ["purge"], [["-amount", amount], ["-user", (extra || "")]]));
+ msg.sendLocale("PURGE_MESSAGES", [msg, amount, userSpecific]);
});
}
};
\ No newline at end of file
diff --git a/commands/Mod/reduceWarn.js b/commands/Mod/reduceWarn.js
new file mode 100644
index 0000000..e8d0d2f
--- /dev/null
+++ b/commands/Mod/reduceWarn.js
@@ -0,0 +1,35 @@
+const { Command } = require("klasa");
+
+module.exports = class extends Command {
+ constructor(...args) {
+ super(...args, {
+ name: "reducewarn",
+ enabled: true,
+ runIn: ["text"],
+ aliases: ["rw", "rmwarn"],
+ permissionLevel: 5,
+ requiredPermissions: ["EMBED_LINKS"],
+ description: "Removes a certain amount of warns from the mentioned user's count",
+ usage: " [amount:integercheck]", usageDelim: ",",
+ extendedHelp: "If no amount is made, all warns will be cleared from the count"
+ });
+
+ this.humanUse = ", [amount]";
+ }
+
+ async run(msg, [user, amount]) {
+ user = msg.guild.members.cache.get(user.id);
+ let warnlog = JSON.parse(msg.guild.settings.warnlog);
+
+ if (!amount) { amount = warnlog[user.id]; }
+
+ warnlog[user.id] -= amount;
+ if (warnlog[user.id] < 1) { delete warnlog[user.id]; }
+
+ let { embed } = this.client.util.modEmbed(msg, "rmwarn", user, msg.language.get("REDUCEWARN_REASON", [amount]));
+
+ await msg.guild.settings.update("warnlog", JSON.stringify(warnlog));
+
+ this.client.util.defaultChannel(msg.guild, "mod").send({embed: embed});
+ }
+};
\ No newline at end of file
diff --git a/commands/Mod/warn.js b/commands/Mod/warn.js
new file mode 100644
index 0000000..cc08ec7
--- /dev/null
+++ b/commands/Mod/warn.js
@@ -0,0 +1,34 @@
+const { Command } = require("klasa");
+
+module.exports = class extends Command {
+ constructor(...args) {
+ super(...args, {
+ name: "warn",
+ enabled: true,
+ runIn: ["text"],
+ aliases: ["w"],
+ permissionLevel: 5,
+ requiredPermissions: ["EMBED_LINKS"],
+ description: "Warns the mentioned user",
+ usage: " ", usageDelim: ","
+ });
+
+ this.humanUse = ", ";
+ }
+
+ async run(msg, [user, reason=reason.trim()]) {
+ user = msg.guild.members.cache.get(user.id);
+ let { embed } = this.client.util.modEmbed(msg, "warn", user, reason);
+ let warnlog = JSON.parse(msg.guild.settings.warnlog);
+
+ if (warnlog[user.id]) {
+ warnlog[user.id]++;
+ } else {
+ warnlog[user.id] = 1;
+ }
+
+ await msg.guild.settings.update("warnlog", JSON.stringify(warnlog));
+
+ this.client.util.defaultChannel(msg.guild, "mod").send({embed: embed});
+ }
+};
\ No newline at end of file
diff --git a/commands/Owner/setAvatar.js b/commands/Owner/setAvatar.js
index 59f120b..7f463fa 100644
--- a/commands/Owner/setAvatar.js
+++ b/commands/Owner/setAvatar.js
@@ -15,6 +15,6 @@ module.exports = class extends Command {
async run(msg, [image]) {
this.client.user.setAvatar(image);
- msg.channel.send("I've updated my avatar image to the one you sent me.");
+ msg.sendLocale("AVATAR_UPDATE");
}
};
\ No newline at end of file
diff --git a/commands/System/permlevel.js b/commands/System/permlevel.js
index 40f4fd7..32d73d3 100644
--- a/commands/System/permlevel.js
+++ b/commands/System/permlevel.js
@@ -1,5 +1,4 @@
const { Command } = require("klasa");
-const config = require("../../assets/settings.json");
module.exports = class extends Command {
constructor(...args) {
@@ -12,12 +11,12 @@ module.exports = class extends Command {
}
async run(msg) {
- var permLevel = 0;
+ let permLevel = 0;
if (msg.author === this.client.owner || this.client.secondary.includes(msg.author.id)) {
- var guild = msg.guild;
- var authorLvl = (msg.author === this.client.owner) ? 10 : 9;
- var author = guild.members.cache.get(msg.author.id);
+ let guild = msg.guild;
+ let authorLvl = msg.author === this.client.owner ? 10 : 9;
+ let author = guild.members.cache.get(msg.author.id);
if (!guild) { permLevel = 0; }
else if (guild.owner.id === msg.author.id) { permLevel = 3; }
@@ -25,14 +24,12 @@ module.exports = class extends Command {
else if (author.roles.cache.has(guild.settings.modRole)) { permLevel = 1; }
else { permLevel = 0; }
-
-
- var info = msg.language.get("ADDPERMS")[permLevel];
+ let info = msg.language.get("ADDPERMS")[permLevel];
return msg.sendLocale("PERMLEVEL_OWNER", [msg.language.get("PERMLEVEL")[authorLvl], info]);
}
- for (var i = 5; i < 8; i++) {
- var check = await msg.hasAtLeastPermissionLevel(i);
+ for (let i = 5; i < 8; i++) {
+ let check = await msg.hasAtLeastPermissionLevel(i);
if (check) { permLevel = i; }
}
diff --git a/events/guildMemberAdd.js b/events/guildMemberAdd.js
new file mode 100644
index 0000000..f7ac07b
--- /dev/null
+++ b/events/guildMemberAdd.js
@@ -0,0 +1,23 @@
+const { Event } = require("klasa");
+
+module.exports = class extends Event {
+ constructor(...args) {
+ super(...args, {
+ enabled: true,
+ name: "guildMemberAdd"
+ });
+ }
+
+ run(member) {
+ const welcomeMsg = member.guild.settings.welcomeMsg;
+ const welcomeChannel = member.guild.channels.cache.get(member.guild.settings.defaultChannel);
+ if (!welcomeMsg || !welcomeChannel) { return; } // No message/channel set, return.
+
+ welcomeChannel.send(
+ welcomeMsg.replace("-pinguser", `<@!${member.id}>`)
+ .replace("-servername", member.guild.name)
+ .replace("-userid", member.id)
+ .replace("-username", member.user.username)
+ );
+ }
+};
\ No newline at end of file
diff --git a/events/guildMemberRemove.js b/events/guildMemberRemove.js
new file mode 100644
index 0000000..58306ea
--- /dev/null
+++ b/events/guildMemberRemove.js
@@ -0,0 +1,30 @@
+const { Event } = require("klasa");
+
+module.exports = class extends Event {
+ constructor(...args) {
+ super(...args, {
+ enabled: true,
+ name: "guildMemberRemove"
+ });
+ }
+
+ async run(member) {
+ const leaveMsg = member.guild.settings.leaveMsg;
+ const leaveChannel = member.guild.channels.cache.get(member.guild.settings.defaultChannel);
+ let warnlog = JSON.parse(member.guild.settings.warnlog);
+
+ if (warnlog[member.id]) {
+ delete warnlog[member.id];
+ await member.guild.settings.update("warnlog", JSON.stringify(warnlog));
+ }
+
+ if (!leaveMsg || !leaveChannel) { return; } // No message/channel set, return.
+
+ leaveChannel.send(
+ leaveMsg.replace("-pinguser", `<@!${member.id}>`)
+ .replace("-servername", member.guild.name)
+ .replace("-userid", member.id)
+ .replace("-username", member.user.username)
+ );
+ }
+};
\ No newline at end of file
diff --git a/inhibitors/properPermission.js b/inhibitors/properPermission.js
index 48f79d6..96103a5 100644
--- a/inhibitors/properPermission.js
+++ b/inhibitors/properPermission.js
@@ -20,13 +20,12 @@ module.exports = class extends Inhibitor {
//Guild leaders have access to all mid-range permission level commands.
if (msg.guild.owner.id === msg.author.id) { return; }
- var user = msg.guild.members.cache.get(msg.author.id);
+ let user = msg.guild.members.cache.get(msg.author.id);
if (cmd.permissionLevel === 6 && user.permissions.has("ADMINISTRATOR")) { return; }
if (cmd.permissionLevel === 5) {
if (user.permissions.has("ADMINISTRATOR") || user.roles.cache.has(msg.guild.settings.modRole)) { return; }
- throw true;
}
throw true;
diff --git a/languages/en-CA.js b/languages/en-CA.js
index baa6598..c7a9f46 100644
--- a/languages/en-CA.js
+++ b/languages/en-CA.js
@@ -1,4 +1,4 @@
-const { Language } = require("klasa");
+const { Language, util } = require("klasa");
/* For use in Klasa System - Margarine Style responses, msg is required but
* will be mimiced so that speechHelper doesn't error out.
@@ -24,7 +24,20 @@ module.exports = class extends Language {
DEFAULT: (key) => `${key} has not been localized for en-CA yet.`,
DEFAULT_LANGUAGE: "Default Language",
NOCHANNEL: "No channel set",
+ USER: "User",
+ MODR: "Moderator",
+ BAN: "BANNED",
+ UNBAN: "UNBANNED",
+ KICK: "KICKED",
+ MUTE: "MUTED",
+ UNMUTE: "UNMUTED",
+ WARN: "WARNED",
+ RMWARN: "REMOVED WARN",
+ WINNER: "WINNER",
+ VERSUS: "vs",
MISSINGPERMISSION: "❌ ERROR: MISSING PERMISSIONS! ❌",
+ USER_INCORRECTPERM: "You do not have the correct permissions for this command!",
+ MARG_INCORRECTPERM: "I do not have the correct permissions for this command!",
MISSINGTERM: (action) => this.client.speech(falseMsg, ["func-system", "missingterm"], ["-action", action]),
PERMLEVEL: [
"Level 0 - Everyone",
@@ -61,10 +74,10 @@ module.exports = class extends Language {
RESOLVER_MINMAX_BOTH: (name, min, max, suffix) => this.client.speech(falseMsg, ["func-system", "resolver", "minMax", "both"], [
["-name", name], ["-min", min], ["-max", max] ["-suffix", suffix]
]),
- RESOLVER_MINMAX_MIN: (name, min, suffix) => this.client.speech(falseMsg, ["func-system", "resolver", "minMax", "min"], [
+ RESOLVER_MINMAX_MIN: (name, min) => this.client.speech(falseMsg, ["func-system", "resolver", "minMax", "min"], [
["-name", name], ["-min", min]
]),
- RESOLVER_MINMAX_MAX: (name, max, suffix) => this.client.speech(falseMsg, ["func-system", "resolver", "minMax", "max"], [
+ RESOLVER_MINMAX_MAX: (name, max) => this.client.speech(falseMsg, ["func-system", "resolver", "minMax", "max"], [
["-name", name], ["-max", max]
]),
RESOLVER_INVALID_CHANNEL: (name) => this.client.speech(falseMsg, ["func-system", "resolver", "channel"], [["-name", name]]),
@@ -177,12 +190,16 @@ module.exports = class extends Language {
MUSICCHECK_NOQUEUE: this.client.speech(falseMsg, ["func-music", "general", "noQueue"]),
MUSICCHECK_MISMATCHVC: this.client.speech(falseMsg, ["func-music", "general", "mismatch"]),
MUSICCHECK_NOHANDLER: this.client.speech(falseMsg, ["func-music", "general", "noHandler"]),
+ MODEMBED_MESSAGEHEADER: "Moderator Message",
+ MODEMBED_USERFIELD: (tag, id) => `${tag} (${id})`,
+ MODEMBED_DMMESSAGE: (action, guild, reason) => `You have been ${action} from ${guild}!\n**Reason:** ${reason}`,
/**
* Monitors
*/
PREFIXHELP_DEFAULT: (prefix) => `Whoops! Looks like you are thinking of my default prefix. That is not the case here. Please use: ${prefix}`,
- PREFIXHELP_MISREAD: "Whoops! Looks like you misread my prefix. It's a tilde \`~\`, not a dash!",
+ PREFIXHELP_MISREAD: "Whoops! Looks like you misread my prefix. It's a tilde `~`, not a dash!",
+ INVITEDETECTOR_BADMESSAGE: (msg, author) => this.client.speech(msg, ["func-monitor", "inviteDetector"], [["-author", author]]),
/*
* Commands - Config
@@ -202,6 +219,16 @@ module.exports = class extends Language {
DCOMMAND_GUARDED: (msg) => this.client.speech(msg, ["disablecommand", "guarded"]),
SETDEFAULTCHANNEL: (msg, channel) => this.client.speech(msg, ["setdefaultchannel", "change"], [["-channel", channel]]),
SETDEFAULTCHANNEL_REMOVE: (msg) => this.client.speech(msg, ["setdefaultchannel", "remove"]),
+ SETWELCOME: (msg, item) => this.client.speech(msg, ["setwelcome"], [["-msg", item]]),
+ REMOVEWELCOME: "Welcome message has been removed!",
+ SETLEAVE: (msg, item) => this.client.speech(msg, ["setleave"], [["-msg", item]]),
+ REMOVELEAVE: "Leave message has been removed!",
+ MONITORTOGGLE_NOMONITOR: (msg) => this.client.speech(msg, ["monitortoggle", "nomonitor"]),
+ MONITORTOGGLE_NOTOGGLE: (msg) => this.client.speech(msg, ["monitortoggle", "notoggle"]),
+ MONITORTOGGLE_DISABLE: (msg, monitor) => this.client.speech(msg, ["monitortoggle", "disable"], [["-monitor", monitor]]),
+ MONITORTOGGLE_ENABLE: (msg, monitor) => this.client.speech(msg, ["monitortoggle", "enable"], [["-monitor", monitor]]),
+ SETMODLOG: (msg, channel) => this.client.speech(msg, ["setmodlog", "change"], [["-channel", channel]]),
+ SETMODLOG_REMOVE: (msg) => this.client.speech(msg, ["setmodlog", "remove"]),
/*
* Commands - General
@@ -227,7 +254,7 @@ module.exports = class extends Language {
MAL_REMOVEPROFILE: (msg) => this.client.speech(msg, ["mal", "removeProfile"]),
MAL_NOTERM: (msg) => this.client.speech(msg, ["mal", "noTerm"]),
MAL_NOUSER: (msg) => this.client.speech(msg, ["mal", "noUsername"]),
- MAL_404ERR: (msg) => this.client.speech(msg, ["MAL", "404Err"]),
+ MAL_404ERR: (msg) => this.client.speech(msg, ["mal", "404Err"]),
ANILIST_SETPROFILE: (msg) => this.client.speech(msg, ["anilist", "setProfile"]),
ANILIST_REMOVEPROFILE: (msg) => this.client.speech(msg, ["anilist", "removeProfile"]),
ANILIST_NOTERM: (msg) => this.client.speech(msg, ["anilist", "noTerm"]),
@@ -261,6 +288,11 @@ module.exports = class extends Language {
["-hand2", hand2],
["-result", result]
]),
+ TTT_MATCHHEADER: "TicTacToe Match",
+ TTT_BOARD: "Board",
+ TTT_SAMEUSER: (msg) => this.client.speech(msg, ["tictactoe", "sameuser"]),
+ TTT_SPOTTAKEN: (msg) => this.client.speech(msg, ["tictactoe", "spottaken"]),
+ TTT_TIMEOUT: (msg) => this.client.speech(msg, ["tictactoe", "timeout"]),
/*
* Commands - Economy
@@ -281,7 +313,7 @@ module.exports = class extends Language {
TWOUP_LOSS: (msg, result, bet) => this.client.speech(msg, ["twoup", "lose"], [["-result", result], ["-earnings", bet]]),
COIN_SUCCESS: (msg, result, bet) => this.client.speech(msg, ["coin", "win"], [["-result", result], ["-earnings", bet]]),
COIN_LOSS: (msg, result, bet) => this.client.speech(msg, ["coin", "lose"], [["-result", result], ["-earnings", bet]]),
- CHOUHAN_SUCCESS: (msg, sum, guess, bet) => this.client.speech(msg, ["chouhan", "win"], [["-sum", sum], ["-guess", guess], ["-earnings", (bet * 2)]]),
+ CHOUHAN_SUCCESS: (msg, sum, guess, bet) => this.client.speech(msg, ["chouhan", "win"], [["-sum", sum], ["-guess", guess], ["-earnings", bet * 2]]),
CHOUHAN_LOSS: (msg, sum, guess, bet) => this.client.speech(msg, ["chouhan", "lose"], [["-sum", sum], ["-guess", guess], ["-earnings", bet]]),
BLACKJACK_WINNERTITLE: "Winner:",
BLACKJACK_FOLDED: "Player folded! - Dealer Wins!",
@@ -350,6 +382,22 @@ module.exports = class extends Language {
VOLUME_MAX: (msg) => this.client.speech(msg, ["volume", "overHun"]),
VOLUME_PAUSED: (msg) => this.client.speech(msg, ["volume", "notPlay"]),
VOLUME_SUCCESS: (msg, change, vol) => this.client.speech(msg, ["volume", "success"], [["-param1", change], ["-param2", vol]]),
+
+ /**
+ * Commands - Moderation
+ */
+ BAN_UNBANNABLE: "I cannot ban that member",
+ KICK_UNKICKABLE: "I cannot kick that member",
+ MODRMESSAGE: (author, reason) => `Automated Action - ${this.language.get("MODERATOR")}: ${author} | Reason: ${reason}`,
+ NOREASON: "No reason given.",
+ MUTE_NOMUTEROLE: (msg) => this.client.speech(msg, ["mute", "noRole"]),
+ MUTE_HIGHERPOS: (msg) => this.client.speech(msg, ["mute", "rolePos"]),
+ MUTE_ISADMIN: (msg) => this.client.speech(msg, ["mute", "admin"]),
+ MUTE_UNMUTED: (msg, user) => this.client.speech(msg, ["mute", "unmuted"], [["-user", user]]),
+ MUTE_MUTED: (msg, user) => this.client.speech(msg, ["mute", "muted"], [["-user", user]]),
+ PURGE_USERSPECIFIC: (tag) => `by ${tag}`,
+ PURGE_MESSAGE: (msg, amount, user) => this.client.speech(msg, ["purge"], [["-amount", amount], ["-user", user]]),
+ REDUCEWARN_REASON: (amount) => `Removed ${amount} warns from target user`
};
}
};
\ No newline at end of file
diff --git a/monitors/inviteDetector.js b/monitors/inviteDetector.js
new file mode 100644
index 0000000..83e6a25
--- /dev/null
+++ b/monitors/inviteDetector.js
@@ -0,0 +1,27 @@
+const { Monitor } = require("klasa");
+const inviteRegex = /discord(.gg|.com\/invite)\/.{1,}/;
+
+module.exports = class extends Monitor {
+ constructor(...args) {
+ super(...args, {
+ name: "inviteDetector",
+ enabled: true,
+ ignoreEdits: false,
+ ignoreOthers: false,
+ ignoreBots: false,
+ ignoreSelf: false,
+ ignoreBlacklistedUsers: false
+ });
+ }
+
+ run(msg) {
+ if (!msg.guild) { return; }
+
+ let guildActive = msg.guild.settings.monitors.inviteDetector;
+
+ if (!guildActive || !inviteRegex.test(msg.content)) { return; }
+
+ msg.delete();
+ msg.sendLocale("INVITEDETECTOR_BADMESSAGE", [msg, msg.author.id]);
+ }
+};
\ No newline at end of file
diff --git a/monitors/prefixHelp.js b/monitors/prefixHelp.js
index 18e837d..e28311b 100644
--- a/monitors/prefixHelp.js
+++ b/monitors/prefixHelp.js
@@ -11,18 +11,15 @@ module.exports = class extends Monitor {
}
run(msg) {
- var defaultPrefix = msg.client.gateways.guilds.schema.get("prefix").default;
- var guildPrefix = msg.guild.settings.prefix;
+ let defaultPrefix = msg.client.gateways.guilds.schema.get("prefix").default;
+ let guildPrefix = msg.guild.settings.prefix;
- if (msg.content === `${defaultPrefix}help`) {
- if (defaultPrefix !== guildPrefix) {
- return msg.sendLocale("PREFIXHELP_DEFAULT", [guildPrefix]);
- }
+ if (msg.content === `${defaultPrefix}help` && defaultPrefix !== guildPrefix) {
+ return msg.sendLocale("PREFIXHELP_DEFAULT", [guildPrefix]);
}
- if (msg.content === `${defaultPrefix.replace("~", "-")}help`) {
- if (defaultPrefix.replace("~", "-") !== guildPrefix) {
- return msg.sendLocale("PREFIXHELP_MISREAD");
- }
+
+ if (msg.content === `${defaultPrefix.replace("~", "-")}help` && defaultPrefix.replace("~", "-") !== guildPrefix) {
+ return msg.sendLocale("PREFIXHELP_MISREAD");
}
}
};
\ No newline at end of file
diff --git a/package-lock.json b/package-lock.json
index 5a73471..593402b 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,43 +1,42 @@
{
"name": "margarine",
- "version": "1.5.0",
+ "version": "1.6.0",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"name": "margarine",
- "version": "1.5.0",
+ "version": "1.6.0",
"license": "Apache-2.0",
"dependencies": {
- "@discordjs/opus": "^0.4.0",
- "anilist-node": "^1.6.1",
- "better-sqlite3": "^7.1.2",
- "cheerio": "^1.0.0-rc.3",
- "discord.js": "^12.5.1",
- "ffmpeg": "^0.0.4",
+ "anilist-node": "^1.7.0",
+ "better-sqlite3": "^7.1.4",
+ "cheerio": "^1.0.0-rc.6",
+ "discord.js": "^12.5.3",
"klasa": "^0.5.0",
"moment": "^2.29.1",
"moment-duration-format": "^2.3.2",
- "ms": "^2.1.2",
+ "ms": "^2.1.3",
"node-fetch": "^2.6.1",
- "querystring": "^0.2.0",
+ "querystring": "^0.2.1",
"request": "^2.88.2",
- "snekfetch": "^4.0.4",
- "ytdl-core": "^4.5.0",
- "ytfps": "^1.0.4"
+ "snekfetch": "^4.0.4"
},
"devDependencies": {
- "eslint": "^7.21.0",
+ "eslint": "^7.24.0",
"eslint-plugin-prettier": "^3.3.1",
"husky": "^4.3.8",
"lint-staged": "^10.5.4",
"prettier": "2.2.1"
},
+ "engines": {
+ "node": ">=12.0.0"
+ },
"optionalDependencies": {
"@discordjs/opus": "^0.4.0",
"ffmpeg": "^0.0.4",
"ytdl-core": "^4.5.0",
- "ytfps": "^1.0.4"
+ "ytfps": "^1.0.5"
}
},
"node_modules/@babel/code-frame": {
@@ -257,6 +256,12 @@
}
}
},
+ "node_modules/@eslint/eslintrc/node_modules/ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+ "dev": true
+ },
"node_modules/@eslint/eslintrc/node_modules/strip-json-comments": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
@@ -269,10 +274,15 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/@types/node": {
- "version": "12.12.14",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-12.12.14.tgz",
- "integrity": "sha512-u/SJDyXwuihpwjXy7hOOghagLEV1KdAST6syfnOk6QZAMzZuWZqXy5aYYZbh8Jdpd4escVFP0MvftHNDb9pruA=="
+ "node_modules/@tootallnate/once": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz",
+ "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==",
+ "optional": true,
+ "peer": true,
+ "engines": {
+ "node": ">= 6"
+ }
},
"node_modules/@types/parse-json": {
"version": "4.0.0",
@@ -318,6 +328,44 @@
"acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
}
},
+ "node_modules/agent-base": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
+ "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "debug": "4"
+ },
+ "engines": {
+ "node": ">= 6.0.0"
+ }
+ },
+ "node_modules/agent-base/node_modules/debug": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
+ "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/agent-base/node_modules/ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+ "optional": true,
+ "peer": true
+ },
"node_modules/aggregate-error": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz",
@@ -343,9 +391,9 @@
}
},
"node_modules/anilist-node": {
- "version": "1.6.1",
- "resolved": "https://registry.npmjs.org/anilist-node/-/anilist-node-1.6.1.tgz",
- "integrity": "sha512-r7HjMhkYEPsymHJYMLTx4DrpH7bbhXB1i3mqbfrVzq7CIG5iO3Wvs52NSbHEA7zyH+fV2PqkcE/jEoNIqSZhfA==",
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/anilist-node/-/anilist-node-1.7.0.tgz",
+ "integrity": "sha512-TXLVkYt4ZKUujzSDShZO1bP17eARdkVAGxHkVm/NVVwXdmPd+lpH63Wm3MAD6g/FIUsU1ZoyWuB72bIsyJ1SgQ==",
"dependencies": {
"node-fetch": "^2.6.1"
}
@@ -520,7 +568,21 @@
"node_modules/base64-js": {
"version": "1.5.1",
"resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
- "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="
+ "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ]
},
"node_modules/bcrypt-pbkdf": {
"version": "1.0.2",
@@ -536,13 +598,14 @@
"integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q="
},
"node_modules/better-sqlite3": {
- "version": "7.1.2",
- "resolved": "https://registry.npmjs.org/better-sqlite3/-/better-sqlite3-7.1.2.tgz",
- "integrity": "sha512-8FWYnJ6Bx94MBX03J5Ka7sTRlvXXMEm4FW2Op7nM8ErQZeyALYLmSlbMBnfr4cMpS0tj0aYZv0a+26G2YJuIjg==",
+ "version": "7.1.4",
+ "resolved": "https://registry.npmjs.org/better-sqlite3/-/better-sqlite3-7.1.4.tgz",
+ "integrity": "sha512-9BvUSm8/xSyxZbnWpcRAwEZsfTK0196qi4592N5WoVMM3dAH9g0E3/colX0dxhGVSLcVfkiBUoCEBkFz8uvySw==",
+ "hasInstallScript": true,
"dependencies": {
"bindings": "^1.5.0",
- "prebuild-install": "^5.3.3",
- "tar": "^6.0.5"
+ "prebuild-install": "^6.0.1",
+ "tar": "^6.1.0"
}
},
"node_modules/bindings": {
@@ -554,9 +617,9 @@
}
},
"node_modules/bl": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/bl/-/bl-4.0.3.tgz",
- "integrity": "sha512-fs4G6/Hu4/EE+F75J8DuN/0IpQqNjAdC7aEQv7Qt8MHGUH7Ckv2MwTEEeN9QehD0pfIDkMI1bkHYkKy7xHyKIg==",
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz",
+ "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==",
"dependencies": {
"buffer": "^5.5.0",
"inherits": "^2.0.4",
@@ -594,6 +657,20 @@
"version": "5.7.1",
"resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
"integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
"dependencies": {
"base64-js": "^1.3.1",
"ieee754": "^1.1.13"
@@ -630,19 +707,34 @@
}
},
"node_modules/cheerio": {
- "version": "1.0.0-rc.3",
- "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.3.tgz",
- "integrity": "sha512-0td5ijfUPuubwLUu0OBoe98gZj8C/AA+RW3v67GPlGOrvxWjZmBXiBCRU+I8VEiNyJzjth40POfHiz2RB3gImA==",
+ "version": "1.0.0-rc.6",
+ "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.6.tgz",
+ "integrity": "sha512-hjx1XE1M/D5pAtMgvWwE21QClmAEeGHOIDfycgmndisdNgI6PE1cGRQkMGBcsbUbmEQyWu5PJLUcAOjtQS8DWw==",
"dependencies": {
- "css-select": "~1.2.0",
- "dom-serializer": "~0.1.1",
- "entities": "~1.1.1",
- "htmlparser2": "^3.9.1",
- "lodash": "^4.15.0",
- "parse5": "^3.0.1"
+ "cheerio-select": "^1.3.0",
+ "dom-serializer": "^1.3.1",
+ "domhandler": "^4.1.0",
+ "htmlparser2": "^6.1.0",
+ "parse5": "^6.0.1",
+ "parse5-htmlparser2-tree-adapter": "^6.0.1"
},
"engines": {
- "node": ">= 0.6"
+ "node": ">= 0.12"
+ }
+ },
+ "node_modules/cheerio-select": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-1.3.0.tgz",
+ "integrity": "sha512-mLgqdHxVOQyhOIkG5QnRkDg7h817Dkf0dAvlCio2TJMmR72cJKH0bF28SHXvLkVrGcGOiub0/Bs/CMnPeQO7qw==",
+ "dependencies": {
+ "css-select": "^4.0.0",
+ "css-what": "^5.0.0",
+ "domelementtype": "^2.2.0",
+ "domhandler": "^4.1.0",
+ "domutils": "^2.5.2"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/fb55"
}
},
"node_modules/chownr": {
@@ -850,22 +942,29 @@
}
},
"node_modules/css-select": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz",
- "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=",
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.0.0.tgz",
+ "integrity": "sha512-I7favumBlDP/nuHBKLfL5RqvlvRdn/W29evvWJ+TaoGPm7QD+xSIN5eY2dyGjtkUmemh02TZrqJb4B8DWo6PoQ==",
"dependencies": {
- "boolbase": "~1.0.0",
- "css-what": "2.1",
- "domutils": "1.5.1",
- "nth-check": "~1.0.1"
+ "boolbase": "^1.0.0",
+ "css-what": "^5.0.0",
+ "domhandler": "^4.1.0",
+ "domutils": "^2.5.1",
+ "nth-check": "^2.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/fb55"
}
},
"node_modules/css-what": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz",
- "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==",
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/css-what/-/css-what-5.0.0.tgz",
+ "integrity": "sha512-qxyKHQvgKwzwDWC/rGbT821eJalfupxYW2qbSJSAtdSTimsr/MlaGONoNLllaUPZWf8QnbcKM/kPVYUQuEKAFA==",
"engines": {
- "node": "*"
+ "node": ">= 6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/fb55"
}
},
"node_modules/dashdash": {
@@ -944,23 +1043,100 @@
}
},
"node_modules/discord.js": {
- "version": "12.5.1",
- "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-12.5.1.tgz",
- "integrity": "sha512-VwZkVaUAIOB9mKdca0I5MefPMTQJTNg0qdgi1huF3iwsFwJ0L5s/Y69AQe+iPmjuV6j9rtKoG0Ta0n9vgEIL6w==",
+ "version": "12.5.3",
+ "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-12.5.3.tgz",
+ "integrity": "sha512-D3nkOa/pCkNyn6jLZnAiJApw2N9XrIsXUAdThf01i7yrEuqUmDGc7/CexVWwEcgbQR97XQ+mcnqJpmJ/92B4Aw==",
"dependencies": {
"@discordjs/collection": "^0.1.6",
"@discordjs/form-data": "^3.0.1",
"abort-controller": "^3.0.0",
"node-fetch": "^2.6.1",
- "prism-media": "^1.2.2",
+ "prism-media": "^1.2.9",
"setimmediate": "^1.0.5",
"tweetnacl": "^1.0.3",
- "ws": "^7.3.1"
+ "ws": "^7.4.4"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ }
+ },
+ "node_modules/discord.js/node_modules/@discordjs/node-pre-gyp": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/@discordjs/node-pre-gyp/-/node-pre-gyp-0.3.2.tgz",
+ "integrity": "sha512-NqRvPz0X+/3h+6ClElrSfvsD5XEG9ljYzXhzyo81DslVkVKzmmxX9FLs3MUr9qI7p53DG1eYru633qosrOqMyA==",
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "detect-libc": "^1.0.3",
+ "http-proxy-agent": "^4.0.1",
+ "make-dir": "^3.1.0",
+ "node-fetch": "^2.6.1",
+ "nopt": "^5.0.0",
+ "npmlog": "^4.1.2",
+ "rimraf": "^3.0.2",
+ "semver": "^7.3.4",
+ "tar": "^6.1.0"
+ },
+ "bin": {
+ "node-pre-gyp": "bin/node-pre-gyp"
+ }
+ },
+ "node_modules/discord.js/node_modules/@discordjs/opus": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/@discordjs/opus/-/opus-0.5.0.tgz",
+ "integrity": "sha512-s3XUJ7dYV+UvYUiqkgs7sq8JKWMhQrHcwDECP2SKdxtL9h9qGa4mr0IR6XnZw+G/Sogx8c+HRS7+wEspkqk3zA==",
+ "hasInstallScript": true,
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "@discordjs/node-pre-gyp": "^0.3.2",
+ "node-addon-api": "^3.1.0"
},
"engines": {
"node": ">=12.0.0"
}
},
+ "node_modules/discord.js/node_modules/prism-media": {
+ "version": "1.2.9",
+ "resolved": "https://registry.npmjs.org/prism-media/-/prism-media-1.2.9.tgz",
+ "integrity": "sha512-UHCYuqHipbTR1ZsXr5eg4JUmHER8Ss4YEb9Azn+9zzJ7/jlTtD1h0lc4g6tNx3eMlB8Mp6bfll0LPMAV4R6r3Q==",
+ "peerDependencies": {
+ "@discordjs/opus": "^0.5.0",
+ "ffmpeg-static": "^4.2.7 || ^3.0.0 || ^2.4.0",
+ "node-opus": "^0.3.3",
+ "opusscript": "^0.0.8"
+ },
+ "peerDependenciesMeta": {
+ "@discordjs/opus": {
+ "optional": true
+ },
+ "ffmpeg-static": {
+ "optional": true
+ },
+ "node-opus": {
+ "optional": true
+ },
+ "opusscript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/discord.js/node_modules/semver": {
+ "version": "7.3.5",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
+ "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "lru-cache": "^6.0.0"
+ },
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
"node_modules/doctrine": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
@@ -974,34 +1150,54 @@
}
},
"node_modules/dom-serializer": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.1.tgz",
- "integrity": "sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==",
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.1.tgz",
+ "integrity": "sha512-Pv2ZluG5ife96udGgEDovOOOA5UELkltfJpnIExPrAk1LTvecolUGn6lIaoLh86d83GiB86CjzciMd9BuRB71Q==",
"dependencies": {
- "domelementtype": "^1.3.0",
- "entities": "^1.1.1"
+ "domelementtype": "^2.0.1",
+ "domhandler": "^4.0.0",
+ "entities": "^2.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1"
}
},
"node_modules/domelementtype": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz",
- "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w=="
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz",
+ "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fb55"
+ }
+ ]
},
"node_modules/domhandler": {
- "version": "2.4.2",
- "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz",
- "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==",
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.1.0.tgz",
+ "integrity": "sha512-/6/kmsGlMY4Tup/nGVutdrK9yQi4YjWVcVeoQmixpzjOUK1U7pQkvAPHBJeUxOgxF0J8f8lwCJSlCfD0V4CMGQ==",
"dependencies": {
- "domelementtype": "1"
+ "domelementtype": "^2.2.0"
+ },
+ "engines": {
+ "node": ">= 4"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/domhandler?sponsor=1"
}
},
"node_modules/domutils": {
- "version": "1.5.1",
- "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz",
- "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=",
+ "version": "2.5.2",
+ "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.5.2.tgz",
+ "integrity": "sha512-MHTthCb1zj8f1GVfRpeZUbohQf/HdBos0oX5gZcQFepOZPLLRyj6Wn7XS7EMnY7CVpwv8863u2vyE83Hfu28HQ==",
"dependencies": {
- "dom-serializer": "0",
- "domelementtype": "1"
+ "dom-serializer": "^1.0.1",
+ "domelementtype": "^2.2.0",
+ "domhandler": "^4.1.0"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/domutils?sponsor=1"
}
},
"node_modules/ecc-jsbn": {
@@ -1040,9 +1236,12 @@
}
},
"node_modules/entities": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz",
- "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w=="
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz",
+ "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==",
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
},
"node_modules/error-ex": {
"version": "1.3.2",
@@ -1063,9 +1262,9 @@
}
},
"node_modules/eslint": {
- "version": "7.21.0",
- "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.21.0.tgz",
- "integrity": "sha512-W2aJbXpMNofUp0ztQaF40fveSsJBjlSCSWpy//gzfTvwC+USs/nceBrKmlJOiM8r1bLwP2EuYkCqArn/6QTIgg==",
+ "version": "7.24.0",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.24.0.tgz",
+ "integrity": "sha512-k9gaHeHiFmGCDQ2rEfvULlSLruz6tgfA8DEn+rY9/oYPFFTlz55mM/Q/Rij1b2Y42jwZiK3lXvNTw6w6TXzcKQ==",
"dev": true,
"dependencies": {
"@babel/code-frame": "7.12.11",
@@ -1085,7 +1284,7 @@
"file-entry-cache": "^6.0.1",
"functional-red-black-tree": "^1.0.1",
"glob-parent": "^5.0.0",
- "globals": "^12.1.0",
+ "globals": "^13.6.0",
"ignore": "^4.0.6",
"import-fresh": "^3.0.0",
"imurmurhash": "^0.1.4",
@@ -1093,7 +1292,7 @@
"js-yaml": "^3.13.1",
"json-stable-stringify-without-jsonify": "^1.0.1",
"levn": "^0.4.1",
- "lodash": "^4.17.20",
+ "lodash": "^4.17.21",
"minimatch": "^3.0.4",
"natural-compare": "^1.4.0",
"optionator": "^0.9.1",
@@ -1209,6 +1408,27 @@
}
}
},
+ "node_modules/eslint/node_modules/globals": {
+ "version": "13.8.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-13.8.0.tgz",
+ "integrity": "sha512-rHtdA6+PDBIjeEvA91rpqzEvk/k3/i7EeNQiryiWuJH0Hw9cpyJMAt2jtbAwUaRdhD+573X4vWw6IcjKPasi9Q==",
+ "dev": true,
+ "dependencies": {
+ "type-fest": "^0.20.2"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/eslint/node_modules/ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+ "dev": true
+ },
"node_modules/eslint/node_modules/semver": {
"version": "7.3.4",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz",
@@ -1248,6 +1468,18 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/eslint/node_modules/type-fest": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
+ "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/espree": {
"version": "7.3.1",
"resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz",
@@ -1702,18 +1934,63 @@
"integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk="
},
"node_modules/htmlparser2": {
- "version": "3.10.1",
- "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz",
- "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==",
- "dependencies": {
- "domelementtype": "^1.3.1",
- "domhandler": "^2.3.0",
- "domutils": "^1.5.1",
- "entities": "^1.1.1",
- "inherits": "^2.0.1",
- "readable-stream": "^3.1.1"
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz",
+ "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==",
+ "funding": [
+ "https://github.com/fb55/htmlparser2?sponsor=1",
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fb55"
+ }
+ ],
+ "dependencies": {
+ "domelementtype": "^2.0.1",
+ "domhandler": "^4.0.0",
+ "domutils": "^2.5.2",
+ "entities": "^2.0.0"
+ }
+ },
+ "node_modules/http-proxy-agent": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz",
+ "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==",
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "@tootallnate/once": "1",
+ "agent-base": "6",
+ "debug": "4"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/http-proxy-agent/node_modules/debug": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
+ "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
}
},
+ "node_modules/http-proxy-agent/node_modules/ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+ "optional": true,
+ "peer": true
+ },
"node_modules/http-signature": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
@@ -1782,7 +2059,21 @@
"node_modules/ieee754": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
- "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="
+ "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ]
},
"node_modules/ignore": {
"version": "4.0.6",
@@ -2083,6 +2374,12 @@
}
}
},
+ "node_modules/lint-staged/node_modules/ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+ "dev": true
+ },
"node_modules/listr2": {
"version": "3.3.4",
"resolved": "https://registry.npmjs.org/listr2/-/listr2-3.3.4.tgz",
@@ -2122,9 +2419,10 @@
}
},
"node_modules/lodash": {
- "version": "4.17.20",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz",
- "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA=="
+ "version": "4.17.21",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
+ "dev": true
},
"node_modules/log-symbols": {
"version": "4.0.0",
@@ -2239,6 +2537,32 @@
"node": ">=10"
}
},
+ "node_modules/make-dir": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
+ "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "semver": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/make-dir/node_modules/semver": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+ "optional": true,
+ "peer": true,
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
"node_modules/merge-stream": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
@@ -2292,6 +2616,9 @@
"integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==",
"engines": {
"node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/miniget": {
@@ -2373,9 +2700,9 @@
"integrity": "sha512-cBMXjSW+fjOb4tyaVHuaVE/A5TqkukDWiOfxxAjY+PEqmmBQlLwn+8OzwPiG3brouXKY5Un4pBjAeB6UToXHaQ=="
},
"node_modules/ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
},
"node_modules/napi-build-utils": {
"version": "1.0.2",
@@ -2406,9 +2733,9 @@
}
},
"node_modules/node-abi": {
- "version": "2.19.3",
- "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.19.3.tgz",
- "integrity": "sha512-9xZrlyfvKhWme2EXFKQhZRp1yNWT/uI1luYPr3sFl+H4keYY4xR+1jO7mvTTijIsHf1M+QDe9uWuKeEpLInIlg==",
+ "version": "2.21.0",
+ "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.21.0.tgz",
+ "integrity": "sha512-smhrivuPqEM3H5LmnY3KU6HfYv0u4QklgAxfFyRNujKUzbUcYZ+Jc2EhukB9SRcD2VpqhxM7n/MIcp1Ua1/JMg==",
"dependencies": {
"semver": "^5.4.1"
}
@@ -2480,11 +2807,14 @@
}
},
"node_modules/nth-check": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz",
- "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==",
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.0.tgz",
+ "integrity": "sha512-i4sc/Kj8htBrAiH1viZ0TgU8Y5XqCaV/FziYK6TBczxmeKm3AEFWqqF3195yKudrarqy7Zu80Ra5dobFjn9X/Q==",
"dependencies": {
- "boolbase": "~1.0.0"
+ "boolbase": "^1.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/nth-check?sponsor=1"
}
},
"node_modules/number-is-nan": {
@@ -2636,11 +2966,16 @@
}
},
"node_modules/parse5": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/parse5/-/parse5-3.0.3.tgz",
- "integrity": "sha512-rgO9Zg5LLLkfJF9E6CCmXlSE4UVceloys8JrFqCcHloC3usd/kJCyPDwH2SOlzix2j3xaP9sUX3e8+kvkuleAA==",
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz",
+ "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw=="
+ },
+ "node_modules/parse5-htmlparser2-tree-adapter": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz",
+ "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==",
"dependencies": {
- "@types/node": "*"
+ "parse5": "^6.0.1"
}
},
"node_modules/path-exists": {
@@ -2718,9 +3053,9 @@
}
},
"node_modules/prebuild-install": {
- "version": "5.3.6",
- "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-5.3.6.tgz",
- "integrity": "sha512-s8Aai8++QQGi4sSbs/M1Qku62PFK49Jm1CbgXklGz4nmHveDq0wzJkg7Na5QbnO1uNH8K7iqx2EQ/mV0MZEmOg==",
+ "version": "6.1.1",
+ "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-6.1.1.tgz",
+ "integrity": "sha512-M+cKwofFlHa5VpTWub7GLg5RLcunYIcLqtY5pKcls/u7xaAb8FrXZ520qY8rkpYy5xw90tYCyMO0MP5ggzR3Sw==",
"dependencies": {
"detect-libc": "^1.0.3",
"expand-template": "^2.0.3",
@@ -2728,15 +3063,14 @@
"minimist": "^1.2.3",
"mkdirp-classic": "^0.5.3",
"napi-build-utils": "^1.0.1",
- "node-abi": "^2.7.0",
+ "node-abi": "^2.21.0",
"noop-logger": "^0.1.1",
"npmlog": "^4.0.1",
"pump": "^3.0.0",
"rc": "^1.2.7",
"simple-get": "^3.0.3",
"tar-fs": "^2.0.0",
- "tunnel-agent": "^0.6.0",
- "which-pm-runs": "^1.0.0"
+ "tunnel-agent": "^0.6.0"
},
"bin": {
"prebuild-install": "bin.js"
@@ -2778,11 +3112,6 @@
"node": ">=6.0.0"
}
},
- "node_modules/prism-media": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/prism-media/-/prism-media-1.2.3.tgz",
- "integrity": "sha512-fSrR66n0l6roW9Rx4rSLMyTPTjRTiXy5RVqDOurACQ6si1rKHHKDU5gwBJoCsIV0R3o9gi+K50akl/qyw1C74A=="
- },
"node_modules/process-nextick-args": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
@@ -2828,9 +3157,9 @@
}
},
"node_modules/querystring": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz",
- "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=",
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.1.tgz",
+ "integrity": "sha512-wkvS7mL/JMugcup3/rMitHmd9ecIGd2lhFhK9N3UUQ450h66d1r3Y9nvXzQAW1Lq+wyx61k/1pfKS5KuKiyEbg==",
"engines": {
"node": ">=0.4.x"
}
@@ -2855,9 +3184,9 @@
"integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw=="
},
"node_modules/readable-stream": {
- "version": "3.4.0",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz",
- "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==",
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
+ "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
"dependencies": {
"inherits": "^2.0.3",
"string_decoder": "^1.1.1",
@@ -3058,7 +3387,21 @@
"node_modules/simple-concat": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz",
- "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q=="
+ "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ]
},
"node_modules/simple-get": {
"version": "3.1.0",
@@ -3503,7 +3846,8 @@
"node_modules/which-pm-runs": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.0.0.tgz",
- "integrity": "sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs="
+ "integrity": "sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs=",
+ "dev": true
},
"node_modules/wide-align": {
"version": "1.1.3",
@@ -3589,11 +3933,23 @@
"integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
},
"node_modules/ws": {
- "version": "7.4.1",
- "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.1.tgz",
- "integrity": "sha512-pTsP8UAfhy3sk1lSk/O/s4tjD0CRwvMnzvwr4OKGX7ZvqZtUyx4KIJB5JWbkykPoc55tixMGgTNoh3k4FkNGFQ==",
+ "version": "7.4.4",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.4.tgz",
+ "integrity": "sha512-Qm8k8ojNQIMx7S+Zp8u/uHOx7Qazv3Yv4q68MiWWWOJhiwG5W3x7iqmRtJo8xxrciZUY4vRxUTJCKuRnF28ZZw==",
"engines": {
"node": ">=8.3.0"
+ },
+ "peerDependencies": {
+ "bufferutil": "^4.0.1",
+ "utf-8-validate": "^5.0.2"
+ },
+ "peerDependenciesMeta": {
+ "bufferutil": {
+ "optional": true
+ },
+ "utf-8-validate": {
+ "optional": true
+ }
}
},
"node_modules/yallist": {
@@ -3637,9 +3993,9 @@
}
},
"node_modules/ytfps": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/ytfps/-/ytfps-1.0.4.tgz",
- "integrity": "sha512-xd73n4kxDzhRAQFOTaY3tKiHbqGx3lJmkL0f+3Fvov9DMlA4HTVo/PUr3lSe8AwwkfXOaltXI7vcBtIuGh8YPg==",
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/ytfps/-/ytfps-1.0.5.tgz",
+ "integrity": "sha512-zYaYvSh/DfacpCVgOkxlSV5Yt872SOkqw8qlwM0DvGz0+C81TDUeRNnPQ1tszV53pAaTowsOXS7ijCSiPI8MMQ==",
"optional": true,
"dependencies": {
"axios": "^0.21.1"
@@ -3825,6 +4181,12 @@
"ms": "2.1.2"
}
},
+ "ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+ "dev": true
+ },
"strip-json-comments": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
@@ -3833,10 +4195,12 @@
}
}
},
- "@types/node": {
- "version": "12.12.14",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-12.12.14.tgz",
- "integrity": "sha512-u/SJDyXwuihpwjXy7hOOghagLEV1KdAST6syfnOk6QZAMzZuWZqXy5aYYZbh8Jdpd4escVFP0MvftHNDb9pruA=="
+ "@tootallnate/once": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz",
+ "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==",
+ "optional": true,
+ "peer": true
},
"@types/parse-json": {
"version": "4.0.0",
@@ -3871,6 +4235,35 @@
"dev": true,
"requires": {}
},
+ "agent-base": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
+ "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
+ "optional": true,
+ "peer": true,
+ "requires": {
+ "debug": "4"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
+ "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
+ "optional": true,
+ "peer": true,
+ "requires": {
+ "ms": "2.1.2"
+ }
+ },
+ "ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+ "optional": true,
+ "peer": true
+ }
+ }
+ },
"aggregate-error": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz",
@@ -3893,9 +4286,9 @@
}
},
"anilist-node": {
- "version": "1.6.1",
- "resolved": "https://registry.npmjs.org/anilist-node/-/anilist-node-1.6.1.tgz",
- "integrity": "sha512-r7HjMhkYEPsymHJYMLTx4DrpH7bbhXB1i3mqbfrVzq7CIG5iO3Wvs52NSbHEA7zyH+fV2PqkcE/jEoNIqSZhfA==",
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/anilist-node/-/anilist-node-1.7.0.tgz",
+ "integrity": "sha512-TXLVkYt4ZKUujzSDShZO1bP17eARdkVAGxHkVm/NVVwXdmPd+lpH63Wm3MAD6g/FIUsU1ZoyWuB72bIsyJ1SgQ==",
"requires": {
"node-fetch": "^2.6.1"
}
@@ -4059,13 +4452,13 @@
}
},
"better-sqlite3": {
- "version": "7.1.2",
- "resolved": "https://registry.npmjs.org/better-sqlite3/-/better-sqlite3-7.1.2.tgz",
- "integrity": "sha512-8FWYnJ6Bx94MBX03J5Ka7sTRlvXXMEm4FW2Op7nM8ErQZeyALYLmSlbMBnfr4cMpS0tj0aYZv0a+26G2YJuIjg==",
+ "version": "7.1.4",
+ "resolved": "https://registry.npmjs.org/better-sqlite3/-/better-sqlite3-7.1.4.tgz",
+ "integrity": "sha512-9BvUSm8/xSyxZbnWpcRAwEZsfTK0196qi4592N5WoVMM3dAH9g0E3/colX0dxhGVSLcVfkiBUoCEBkFz8uvySw==",
"requires": {
"bindings": "^1.5.0",
- "prebuild-install": "^5.3.3",
- "tar": "^6.0.5"
+ "prebuild-install": "^6.0.1",
+ "tar": "^6.1.0"
}
},
"bindings": {
@@ -4077,9 +4470,9 @@
}
},
"bl": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/bl/-/bl-4.0.3.tgz",
- "integrity": "sha512-fs4G6/Hu4/EE+F75J8DuN/0IpQqNjAdC7aEQv7Qt8MHGUH7Ckv2MwTEEeN9QehD0pfIDkMI1bkHYkKy7xHyKIg==",
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz",
+ "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==",
"requires": {
"buffer": "^5.5.0",
"inherits": "^2.0.4",
@@ -4141,16 +4534,28 @@
}
},
"cheerio": {
- "version": "1.0.0-rc.3",
- "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.3.tgz",
- "integrity": "sha512-0td5ijfUPuubwLUu0OBoe98gZj8C/AA+RW3v67GPlGOrvxWjZmBXiBCRU+I8VEiNyJzjth40POfHiz2RB3gImA==",
+ "version": "1.0.0-rc.6",
+ "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.6.tgz",
+ "integrity": "sha512-hjx1XE1M/D5pAtMgvWwE21QClmAEeGHOIDfycgmndisdNgI6PE1cGRQkMGBcsbUbmEQyWu5PJLUcAOjtQS8DWw==",
+ "requires": {
+ "cheerio-select": "^1.3.0",
+ "dom-serializer": "^1.3.1",
+ "domhandler": "^4.1.0",
+ "htmlparser2": "^6.1.0",
+ "parse5": "^6.0.1",
+ "parse5-htmlparser2-tree-adapter": "^6.0.1"
+ }
+ },
+ "cheerio-select": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-1.3.0.tgz",
+ "integrity": "sha512-mLgqdHxVOQyhOIkG5QnRkDg7h817Dkf0dAvlCio2TJMmR72cJKH0bF28SHXvLkVrGcGOiub0/Bs/CMnPeQO7qw==",
"requires": {
- "css-select": "~1.2.0",
- "dom-serializer": "~0.1.1",
- "entities": "~1.1.1",
- "htmlparser2": "^3.9.1",
- "lodash": "^4.15.0",
- "parse5": "^3.0.1"
+ "css-select": "^4.0.0",
+ "css-what": "^5.0.0",
+ "domelementtype": "^2.2.0",
+ "domhandler": "^4.1.0",
+ "domutils": "^2.5.2"
}
},
"chownr": {
@@ -4315,20 +4720,21 @@
}
},
"css-select": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz",
- "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=",
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.0.0.tgz",
+ "integrity": "sha512-I7favumBlDP/nuHBKLfL5RqvlvRdn/W29evvWJ+TaoGPm7QD+xSIN5eY2dyGjtkUmemh02TZrqJb4B8DWo6PoQ==",
"requires": {
- "boolbase": "~1.0.0",
- "css-what": "2.1",
- "domutils": "1.5.1",
- "nth-check": "~1.0.1"
+ "boolbase": "^1.0.0",
+ "css-what": "^5.0.0",
+ "domhandler": "^4.1.0",
+ "domutils": "^2.5.1",
+ "nth-check": "^2.0.0"
}
},
"css-what": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz",
- "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg=="
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/css-what/-/css-what-5.0.0.tgz",
+ "integrity": "sha512-qxyKHQvgKwzwDWC/rGbT821eJalfupxYW2qbSJSAtdSTimsr/MlaGONoNLllaUPZWf8QnbcKM/kPVYUQuEKAFA=="
},
"dashdash": {
"version": "1.14.1",
@@ -4388,18 +4794,65 @@
"integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups="
},
"discord.js": {
- "version": "12.5.1",
- "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-12.5.1.tgz",
- "integrity": "sha512-VwZkVaUAIOB9mKdca0I5MefPMTQJTNg0qdgi1huF3iwsFwJ0L5s/Y69AQe+iPmjuV6j9rtKoG0Ta0n9vgEIL6w==",
+ "version": "12.5.3",
+ "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-12.5.3.tgz",
+ "integrity": "sha512-D3nkOa/pCkNyn6jLZnAiJApw2N9XrIsXUAdThf01i7yrEuqUmDGc7/CexVWwEcgbQR97XQ+mcnqJpmJ/92B4Aw==",
"requires": {
"@discordjs/collection": "^0.1.6",
"@discordjs/form-data": "^3.0.1",
"abort-controller": "^3.0.0",
"node-fetch": "^2.6.1",
- "prism-media": "^1.2.2",
+ "prism-media": "^1.2.9",
"setimmediate": "^1.0.5",
"tweetnacl": "^1.0.3",
- "ws": "^7.3.1"
+ "ws": "^7.4.4"
+ },
+ "dependencies": {
+ "@discordjs/node-pre-gyp": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/@discordjs/node-pre-gyp/-/node-pre-gyp-0.3.2.tgz",
+ "integrity": "sha512-NqRvPz0X+/3h+6ClElrSfvsD5XEG9ljYzXhzyo81DslVkVKzmmxX9FLs3MUr9qI7p53DG1eYru633qosrOqMyA==",
+ "optional": true,
+ "peer": true,
+ "requires": {
+ "detect-libc": "^1.0.3",
+ "http-proxy-agent": "^4.0.1",
+ "make-dir": "^3.1.0",
+ "node-fetch": "^2.6.1",
+ "nopt": "^5.0.0",
+ "npmlog": "^4.1.2",
+ "rimraf": "^3.0.2",
+ "semver": "^7.3.4",
+ "tar": "^6.1.0"
+ }
+ },
+ "@discordjs/opus": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/@discordjs/opus/-/opus-0.5.0.tgz",
+ "integrity": "sha512-s3XUJ7dYV+UvYUiqkgs7sq8JKWMhQrHcwDECP2SKdxtL9h9qGa4mr0IR6XnZw+G/Sogx8c+HRS7+wEspkqk3zA==",
+ "optional": true,
+ "peer": true,
+ "requires": {
+ "@discordjs/node-pre-gyp": "^0.3.2",
+ "node-addon-api": "^3.1.0"
+ }
+ },
+ "prism-media": {
+ "version": "1.2.9",
+ "resolved": "https://registry.npmjs.org/prism-media/-/prism-media-1.2.9.tgz",
+ "integrity": "sha512-UHCYuqHipbTR1ZsXr5eg4JUmHER8Ss4YEb9Azn+9zzJ7/jlTtD1h0lc4g6tNx3eMlB8Mp6bfll0LPMAV4R6r3Q==",
+ "requires": {}
+ },
+ "semver": {
+ "version": "7.3.5",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
+ "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
+ "optional": true,
+ "peer": true,
+ "requires": {
+ "lru-cache": "^6.0.0"
+ }
+ }
}
},
"doctrine": {
@@ -4412,34 +4865,36 @@
}
},
"dom-serializer": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.1.tgz",
- "integrity": "sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==",
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.1.tgz",
+ "integrity": "sha512-Pv2ZluG5ife96udGgEDovOOOA5UELkltfJpnIExPrAk1LTvecolUGn6lIaoLh86d83GiB86CjzciMd9BuRB71Q==",
"requires": {
- "domelementtype": "^1.3.0",
- "entities": "^1.1.1"
+ "domelementtype": "^2.0.1",
+ "domhandler": "^4.0.0",
+ "entities": "^2.0.0"
}
},
"domelementtype": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz",
- "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w=="
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz",
+ "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A=="
},
"domhandler": {
- "version": "2.4.2",
- "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz",
- "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==",
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.1.0.tgz",
+ "integrity": "sha512-/6/kmsGlMY4Tup/nGVutdrK9yQi4YjWVcVeoQmixpzjOUK1U7pQkvAPHBJeUxOgxF0J8f8lwCJSlCfD0V4CMGQ==",
"requires": {
- "domelementtype": "1"
+ "domelementtype": "^2.2.0"
}
},
"domutils": {
- "version": "1.5.1",
- "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz",
- "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=",
+ "version": "2.5.2",
+ "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.5.2.tgz",
+ "integrity": "sha512-MHTthCb1zj8f1GVfRpeZUbohQf/HdBos0oX5gZcQFepOZPLLRyj6Wn7XS7EMnY7CVpwv8863u2vyE83Hfu28HQ==",
"requires": {
- "dom-serializer": "0",
- "domelementtype": "1"
+ "dom-serializer": "^1.0.1",
+ "domelementtype": "^2.2.0",
+ "domhandler": "^4.1.0"
}
},
"ecc-jsbn": {
@@ -4475,9 +4930,9 @@
}
},
"entities": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz",
- "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w=="
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz",
+ "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A=="
},
"error-ex": {
"version": "1.3.2",
@@ -4495,9 +4950,9 @@
"dev": true
},
"eslint": {
- "version": "7.21.0",
- "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.21.0.tgz",
- "integrity": "sha512-W2aJbXpMNofUp0ztQaF40fveSsJBjlSCSWpy//gzfTvwC+USs/nceBrKmlJOiM8r1bLwP2EuYkCqArn/6QTIgg==",
+ "version": "7.24.0",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.24.0.tgz",
+ "integrity": "sha512-k9gaHeHiFmGCDQ2rEfvULlSLruz6tgfA8DEn+rY9/oYPFFTlz55mM/Q/Rij1b2Y42jwZiK3lXvNTw6w6TXzcKQ==",
"dev": true,
"requires": {
"@babel/code-frame": "7.12.11",
@@ -4517,7 +4972,7 @@
"file-entry-cache": "^6.0.1",
"functional-red-black-tree": "^1.0.1",
"glob-parent": "^5.0.0",
- "globals": "^12.1.0",
+ "globals": "^13.6.0",
"ignore": "^4.0.6",
"import-fresh": "^3.0.0",
"imurmurhash": "^0.1.4",
@@ -4525,7 +4980,7 @@
"js-yaml": "^3.13.1",
"json-stable-stringify-without-jsonify": "^1.0.1",
"levn": "^0.4.1",
- "lodash": "^4.17.20",
+ "lodash": "^4.17.21",
"minimatch": "^3.0.4",
"natural-compare": "^1.4.0",
"optionator": "^0.9.1",
@@ -4554,6 +5009,21 @@
"ms": "2.1.2"
}
},
+ "globals": {
+ "version": "13.8.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-13.8.0.tgz",
+ "integrity": "sha512-rHtdA6+PDBIjeEvA91rpqzEvk/k3/i7EeNQiryiWuJH0Hw9cpyJMAt2jtbAwUaRdhD+573X4vWw6IcjKPasi9Q==",
+ "dev": true,
+ "requires": {
+ "type-fest": "^0.20.2"
+ }
+ },
+ "ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+ "dev": true
+ },
"semver": {
"version": "7.3.4",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz",
@@ -4577,6 +5047,12 @@
"resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
"integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
"dev": true
+ },
+ "type-fest": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
+ "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
+ "dev": true
}
}
},
@@ -4970,16 +5446,45 @@
"integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk="
},
"htmlparser2": {
- "version": "3.10.1",
- "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz",
- "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==",
- "requires": {
- "domelementtype": "^1.3.1",
- "domhandler": "^2.3.0",
- "domutils": "^1.5.1",
- "entities": "^1.1.1",
- "inherits": "^2.0.1",
- "readable-stream": "^3.1.1"
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz",
+ "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==",
+ "requires": {
+ "domelementtype": "^2.0.1",
+ "domhandler": "^4.0.0",
+ "domutils": "^2.5.2",
+ "entities": "^2.0.0"
+ }
+ },
+ "http-proxy-agent": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz",
+ "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==",
+ "optional": true,
+ "peer": true,
+ "requires": {
+ "@tootallnate/once": "1",
+ "agent-base": "6",
+ "debug": "4"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
+ "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
+ "optional": true,
+ "peer": true,
+ "requires": {
+ "ms": "2.1.2"
+ }
+ },
+ "ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+ "optional": true,
+ "peer": true
+ }
}
},
"http-signature": {
@@ -5266,6 +5771,12 @@
"requires": {
"ms": "2.1.2"
}
+ },
+ "ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+ "dev": true
}
}
},
@@ -5296,9 +5807,10 @@
}
},
"lodash": {
- "version": "4.17.20",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz",
- "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA=="
+ "version": "4.17.21",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
+ "dev": true
},
"log-symbols": {
"version": "4.0.0",
@@ -5385,6 +5897,25 @@
"sax": "^1.2.4"
}
},
+ "make-dir": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
+ "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
+ "optional": true,
+ "peer": true,
+ "requires": {
+ "semver": "^6.0.0"
+ },
+ "dependencies": {
+ "semver": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+ "optional": true,
+ "peer": true
+ }
+ }
+ },
"merge-stream": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
@@ -5483,9 +6014,9 @@
"integrity": "sha512-cBMXjSW+fjOb4tyaVHuaVE/A5TqkukDWiOfxxAjY+PEqmmBQlLwn+8OzwPiG3brouXKY5Un4pBjAeB6UToXHaQ=="
},
"ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
},
"napi-build-utils": {
"version": "1.0.2",
@@ -5510,9 +6041,9 @@
}
},
"node-abi": {
- "version": "2.19.3",
- "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.19.3.tgz",
- "integrity": "sha512-9xZrlyfvKhWme2EXFKQhZRp1yNWT/uI1luYPr3sFl+H4keYY4xR+1jO7mvTTijIsHf1M+QDe9uWuKeEpLInIlg==",
+ "version": "2.21.0",
+ "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.21.0.tgz",
+ "integrity": "sha512-smhrivuPqEM3H5LmnY3KU6HfYv0u4QklgAxfFyRNujKUzbUcYZ+Jc2EhukB9SRcD2VpqhxM7n/MIcp1Ua1/JMg==",
"requires": {
"semver": "^5.4.1"
}
@@ -5569,11 +6100,11 @@
}
},
"nth-check": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz",
- "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==",
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.0.tgz",
+ "integrity": "sha512-i4sc/Kj8htBrAiH1viZ0TgU8Y5XqCaV/FziYK6TBczxmeKm3AEFWqqF3195yKudrarqy7Zu80Ra5dobFjn9X/Q==",
"requires": {
- "boolbase": "~1.0.0"
+ "boolbase": "^1.0.0"
}
},
"number-is-nan": {
@@ -5677,11 +6208,16 @@
}
},
"parse5": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/parse5/-/parse5-3.0.3.tgz",
- "integrity": "sha512-rgO9Zg5LLLkfJF9E6CCmXlSE4UVceloys8JrFqCcHloC3usd/kJCyPDwH2SOlzix2j3xaP9sUX3e8+kvkuleAA==",
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz",
+ "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw=="
+ },
+ "parse5-htmlparser2-tree-adapter": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz",
+ "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==",
"requires": {
- "@types/node": "*"
+ "parse5": "^6.0.1"
}
},
"path-exists": {
@@ -5738,9 +6274,9 @@
}
},
"prebuild-install": {
- "version": "5.3.6",
- "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-5.3.6.tgz",
- "integrity": "sha512-s8Aai8++QQGi4sSbs/M1Qku62PFK49Jm1CbgXklGz4nmHveDq0wzJkg7Na5QbnO1uNH8K7iqx2EQ/mV0MZEmOg==",
+ "version": "6.1.1",
+ "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-6.1.1.tgz",
+ "integrity": "sha512-M+cKwofFlHa5VpTWub7GLg5RLcunYIcLqtY5pKcls/u7xaAb8FrXZ520qY8rkpYy5xw90tYCyMO0MP5ggzR3Sw==",
"requires": {
"detect-libc": "^1.0.3",
"expand-template": "^2.0.3",
@@ -5748,15 +6284,14 @@
"minimist": "^1.2.3",
"mkdirp-classic": "^0.5.3",
"napi-build-utils": "^1.0.1",
- "node-abi": "^2.7.0",
+ "node-abi": "^2.21.0",
"noop-logger": "^0.1.1",
"npmlog": "^4.0.1",
"pump": "^3.0.0",
"rc": "^1.2.7",
"simple-get": "^3.0.3",
"tar-fs": "^2.0.0",
- "tunnel-agent": "^0.6.0",
- "which-pm-runs": "^1.0.0"
+ "tunnel-agent": "^0.6.0"
}
},
"prelude-ls": {
@@ -5780,11 +6315,6 @@
"fast-diff": "^1.1.2"
}
},
- "prism-media": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/prism-media/-/prism-media-1.2.3.tgz",
- "integrity": "sha512-fSrR66n0l6roW9Rx4rSLMyTPTjRTiXy5RVqDOurACQ6si1rKHHKDU5gwBJoCsIV0R3o9gi+K50akl/qyw1C74A=="
- },
"process-nextick-args": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
@@ -5821,9 +6351,9 @@
"integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA=="
},
"querystring": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz",
- "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA="
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.1.tgz",
+ "integrity": "sha512-wkvS7mL/JMugcup3/rMitHmd9ecIGd2lhFhK9N3UUQ450h66d1r3Y9nvXzQAW1Lq+wyx61k/1pfKS5KuKiyEbg=="
},
"rc": {
"version": "1.2.8",
@@ -5844,9 +6374,9 @@
}
},
"readable-stream": {
- "version": "3.4.0",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz",
- "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==",
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
+ "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
"requires": {
"inherits": "^2.0.3",
"string_decoder": "^1.1.1",
@@ -6361,7 +6891,8 @@
"which-pm-runs": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.0.0.tgz",
- "integrity": "sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs="
+ "integrity": "sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs=",
+ "dev": true
},
"wide-align": {
"version": "1.1.3",
@@ -6428,9 +6959,10 @@
"integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
},
"ws": {
- "version": "7.4.1",
- "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.1.tgz",
- "integrity": "sha512-pTsP8UAfhy3sk1lSk/O/s4tjD0CRwvMnzvwr4OKGX7ZvqZtUyx4KIJB5JWbkykPoc55tixMGgTNoh3k4FkNGFQ=="
+ "version": "7.4.4",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.4.tgz",
+ "integrity": "sha512-Qm8k8ojNQIMx7S+Zp8u/uHOx7Qazv3Yv4q68MiWWWOJhiwG5W3x7iqmRtJo8xxrciZUY4vRxUTJCKuRnF28ZZw==",
+ "requires": {}
},
"yallist": {
"version": "4.0.0",
@@ -6461,9 +6993,9 @@
}
},
"ytfps": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/ytfps/-/ytfps-1.0.4.tgz",
- "integrity": "sha512-xd73n4kxDzhRAQFOTaY3tKiHbqGx3lJmkL0f+3Fvov9DMlA4HTVo/PUr3lSe8AwwkfXOaltXI7vcBtIuGh8YPg==",
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/ytfps/-/ytfps-1.0.5.tgz",
+ "integrity": "sha512-zYaYvSh/DfacpCVgOkxlSV5Yt872SOkqw8qlwM0DvGz0+C81TDUeRNnPQ1tszV53pAaTowsOXS7ijCSiPI8MMQ==",
"optional": true,
"requires": {
"axios": "^0.21.1"
diff --git a/package.json b/package.json
index 07906a4..d038d96 100644
--- a/package.json
+++ b/package.json
@@ -1,35 +1,34 @@
{
"name": "margarine",
- "version": "1.5.0",
+ "version": "1.6.0",
"description": "Javascript bot using the Klasa framework",
"main": "index.js",
"private": true,
+ "engines": {
+ "node": ">=12.0.0"
+ },
"dependencies": {
- "@discordjs/opus": "^0.4.0",
- "anilist-node": "^1.6.1",
- "better-sqlite3": "^7.1.2",
- "cheerio": "^1.0.0-rc.3",
- "discord.js": "^12.5.1",
- "ffmpeg": "^0.0.4",
+ "anilist-node": "^1.7.0",
+ "better-sqlite3": "^7.1.4",
+ "cheerio": "^1.0.0-rc.6",
+ "discord.js": "^12.5.3",
"klasa": "^0.5.0",
"moment": "^2.29.1",
"moment-duration-format": "^2.3.2",
- "ms": "^2.1.2",
+ "ms": "^2.1.3",
"node-fetch": "^2.6.1",
- "querystring": "^0.2.0",
+ "querystring": "^0.2.1",
"request": "^2.88.2",
- "snekfetch": "^4.0.4",
- "ytdl-core": "^4.5.0",
- "ytfps": "^1.0.4"
+ "snekfetch": "^4.0.4"
},
"optionalDependencies": {
"@discordjs/opus": "^0.4.0",
"ffmpeg": "^0.0.4",
"ytdl-core": "^4.5.0",
- "ytfps": "^1.0.4"
+ "ytfps": "^1.0.5"
},
"devDependencies": {
- "eslint": "^7.21.0",
+ "eslint": "^7.24.0",
"eslint-plugin-prettier": "^3.3.1",
"husky": "^4.3.8",
"lint-staged": "^10.5.4",
@@ -44,15 +43,15 @@
"eslint": "eslint .",
"prettier": "prettier --write ."
},
- "husky": {
- "pre-commit": "lint-staged"
- },
- "lint-staged": {
- "*.{js,jsx}": [
- "prettier --write",
- "eslint"
- ]
- },
+ "husky": {
+ "pre-commit": "lint-staged"
+ },
+ "lint-staged": {
+ "*.{js,jsx,json}": [
+ "prettier --write .",
+ "eslint . --fix"
+ ]
+ },
"author": {
"name": "Frederick Katsura",
"email": "katsurinstudios@protonmail.ch"
diff --git a/utilities/modEmbed.js b/utilities/modEmbed.js
index b8613cf..3abb250 100644
--- a/utilities/modEmbed.js
+++ b/utilities/modEmbed.js
@@ -2,46 +2,50 @@ const { MessageEmbed } = require("discord.js");
/**
* Creates an embed for a moderation action.
- * @param { KlasaMessage } msg
+ * @param { KlasaMessage } msg
* @param { String } action - The action done. Either ban or kick.
* @param { KlasaUser } user - The user affected by the action.
* @param { String } reason - The reason behind the action.
* @returns { {embed: MessageEmbed, DMembed: MessageEmbed} } Returns two embeds in the form of a tuple. First one is for the moderation logs and the second one is for the user involved.
*/
-module.exports = function(msg, action=action.toLowerCase(), user, reason) {
- const client = msg.client;
- const Options = {
- ban: ["BAN_MEMBERS", "banned", 0xDD2E44],
- unban: ["BAN_MEMBERS", "unbanned", 0x38b058],
- kick: ["KICK_MEMBERS", "kicked", 0xFFFF66],
- mute: ["MANAGE_ROLES", "muted", 0x808080],
- unmute: ["MANAGE_ROLES", "unmuted", 0x38b058]
- };
+module.exports = function (msg, action = action.toLowerCase(), user, reason) {
+ const Options = {
+ ban: ["BAN_MEMBERS", msg.language.get("BAN"), 0xdd2e44],
+ unban: ["BAN_MEMBERS", msg.language.get("UNBAN"), 0x38b058],
+ kick: ["KICK_MEMBERS", msg.language.get("KICK"), 0xffff66],
+ mute: ["MANAGE_ROLES", msg.language.get("MUTE"), 0x808080],
+ unmute: ["MANAGE_ROLES", msg.language.get("UNMUTE"), 0x38b058],
+ warn: ["SEND_MESSAGES", msg.language.get("WARN"), 0x808080],
+ rmwarn: ["SEND_MESSAGES", msg.language.get("RMWARN"), 0x808080]
+ };
- const embed = new MessageEmbed().setTimestamp();
- var options = Options[action];
-
- if (msg.channel.permissionsFor(msg.author).has(options[0]) === false) {
- embed.setColor(0xDD2E44)
- .setTitle(msg.language.get("MISSINGPERMISSION"))
- .setDescription("You do not have the correct permissions for this command!");
- } else if (msg.channel.permissionsFor(client.user).has(options[0]) === false) {
- embed.setColor(0xDD2E44)
- .setTitle(msg.language.get("MISSINGPERMISSION"))
- .setDescription("I do not have the correct permissions for this command!");
- } else {
- embed.setColor(options[2])
- .setTitle(`**User ${options[1]}!**`)
- .setDescription(reason)
- .addField("**Moderator:**", `${msg.author.tag} (${msg.author.id})`)
- .addField("**User:**", `${user.user.tag} (${user.user.id})`)
- .setThumbnail(msg.author.displayAvatarURL());
- }
+ const embed = new MessageEmbed().setTimestamp();
+ let options = Options[action];
+
+ if (msg.channel.permissionsFor(msg.author).has(options[0]) === false) {
+ embed
+ .setColor(0xdd2e44)
+ .setTitle(msg.language.get("MISSINGPERMISSION"))
+ .setDescription(msg.language.get("USER_INCORRECTPERM"));
+ } else if (msg.channel.permissionsFor(msg.client.user).has(options[0]) === false) {
+ embed
+ .setColor(0xdd2e44)
+ .setTitle(msg.language.get("MISSINGPERMISSION"))
+ .setDescription(msg.language.get("MARG_INCORRECTPERM"));
+ } else {
+ embed
+ .setColor(options[2])
+ .setTitle(`**${msg.language.get("USER")} ${msg.client.util.toTitleCase(options[1])}!**`)
+ .setDescription(reason)
+ .addField(`**${msg.language.get("MODR")}:**`, msg.language.get("MODEMBED_USERFIELD", msg.author.tag, msg.author.id))
+ .addField(`**${msg.language.get("USER")}:**`, msg.language.get("MODEMBED_USERFIELD", user.user.tag, user.user.id))
+ .setThumbnail(msg.author.displayAvatarURL());
+ }
- const DMembed = new MessageEmbed()
- .setColor(options[2])
- .setTitle("Moderator Message")
- .setDescription(`You have been ${options[1]} from ${msg.guild.name}!\n**Reason:** ${reason}`);
+ const DMembed = new MessageEmbed()
+ .setColor(options[2])
+ .setTitle(msg.language.get("MODEMBED_MESSAGEHEADER"))
+ .setDescription(msg.language.get("MODEMBED_DMMESSAGE", options[1].toLowerCase(), msg.guild.name, reason));
- return { embed, DMembed };
-};
\ No newline at end of file
+ return { embed, DMembed };
+};
diff --git a/utilities/schemaManager.js b/utilities/schemaManager.js
index 7746439..f8ae885 100644
--- a/utilities/schemaManager.js
+++ b/utilities/schemaManager.js
@@ -2,38 +2,52 @@
* Initializes all settings needed for the schemas.
* @param { KlasaClient } client - The bot instance of the client.
*/
-module.exports = function(client) {
- client.gateways.clientStorage.schema //Global Configurations
- .add("daily", "Integer", { default: 100, min: 1 })
- .add("awardChannel", "channel")
- .add("reportChannel", "channel")
- .add("awards", folder => folder
- .add("suggest", "Integer", { default: 250, min: 10 }) //Suggestion Added
- .add("bug", "Integer", { default: 500, min: 25 }) //Bug fixed
- .add("minor", "Integer", { default: 600, min: 50 }) //Minor issue resolved
- .add("major", "Integer", { default: 2000, min: 100 }) //Major issue resolved
- );
+module.exports = function (client) {
+ client.gateways.clientStorage.schema //Global Configurations
+ .add("daily", "Integer", { default: 100, min: 1 })
+ .add("awardChannel", "channel")
+ .add("reportChannel", "channel")
+ .add("awards", (folder) =>
+ folder
+ .add("suggest", "Integer", { default: 250, min: 10 }) //Suggestion Added
+ .add("bug", "Integer", { default: 500, min: 25 }) //Bug fixed
+ .add("minor", "Integer", { default: 600, min: 50 }) //Minor issue resolved
+ .add("major", "Integer", { default: 2000, min: 100 }) //Major issue resolved
+ );
- client.gateways.guilds.schema //Guild-specific Configurations
- .add("modRole", "role")
- .add("muteRole", "role")
- .add("defaultChannel", "channel")
- .add("modlog", "channel")
- .add("starboard", folder => folder
- .add("channel", "TextChannel")
- .add("emote", "string", { default: "⭐"})
- .add("requiredAmount", "Integer", { default: 5, min: 1 })
- .add("msgCache", "string", { array: true, configurable: false }) //Linked with sbCache. Indexes are linked as a sudo-relation.
- .add("sbCache", "string", { array: true, configurable: false })
- )
- .add("roles", folder => folder
- .add("name", "string", { array: true, configurable: false }) //Linked with id. Indexes are linked as a sudo-relation
- .add("id", "string", { array: true, configurable: false })
- )
- .add("poll", folder => folder
- .add("info", "string", { configurable: false })
- .add("options", "string", { array: true, configurable: false })
- .add("votes", "string", { configurable: false })
- .add("userVotes", "string", { default: "{}", configurable: false })
- );
-};
\ No newline at end of file
+ client.gateways.guilds.schema //Guild-specific Configurations
+ .add("modRole", "role")
+ .add("muteRole", "role")
+ .add("defaultChannel", "channel")
+ .add("modlog", "channel")
+ .add("starboard", (folder) =>
+ folder
+ .add("channel", "TextChannel")
+ .add("emote", "string", { default: "⭐" })
+ .add("requiredAmount", "Integer", { default: 5, min: 1 })
+ .add("msgCache", "string", { array: true, configurable: false }) //Linked with sbCache. Indexes are linked as a sudo-relation.
+ .add("sbCache", "string", { array: true, configurable: false })
+ )
+ .add("roles", (folder) =>
+ folder
+ .add("name", "string", { array: true, configurable: false }) //Linked with id. Indexes are linked as a sudo-relation
+ .add("id", "string", { array: true, configurable: false })
+ )
+ .add("poll", (folder) =>
+ folder
+ .add("info", "string", { configurable: false })
+ .add("options", "string", { array: true, configurable: false })
+ .add("votes", "string", { configurable: false })
+ .add("userVotes", "string", {
+ default: "{}",
+ configurable: false
+ })
+ )
+ .add("welcomeMsg", "string", { configurable: false })
+ .add("leaveMsg", "string", { configurable: false })
+ .add("warnlog", "string", { default: "{}", configurable: false })
+ .add("monitors", (folder) =>
+ folder
+ .add("inviteDetector", "boolean", { configurable: false, default: false })
+ );
+};
diff --git a/utilities/utilExport.js b/utilities/utilExport.js
index 646fd8e..ab4f458 100644
--- a/utilities/utilExport.js
+++ b/utilities/utilExport.js
@@ -10,22 +10,22 @@ exports.schemaManager = require("./schemaManager.js");
/** Removes any unnessesscary commands in the default Klasa framework.
*/
-exports.commandRemover = function() {
- const cmdNames = ["Admin/load", "Admin/unload", "Admin/transfer", "Admin/reboot"];
- const GeneralPath = `${process.cwd()}/node_modules/klasa/src/commands/General`;
- if (existsSync(GeneralPath)) {
- readdirSync(GeneralPath).forEach((file) => {
- unlinkSync(`${GeneralPath}/${file}`);
- });
+exports.commandRemover = function () {
+ const cmdNames = ["Admin/load", "Admin/unload", "Admin/transfer", "Admin/reboot"];
+ const GeneralPath = `${process.cwd()}/node_modules/klasa/src/commands/General`;
+ if (existsSync(GeneralPath)) {
+ readdirSync(GeneralPath).forEach((file) => {
+ unlinkSync(`${GeneralPath}/${file}`);
+ });
- rmdirSync(GeneralPath);
- }
+ rmdirSync(GeneralPath);
+ }
- for(var x = 0; x < cmdNames.length; x++) {
- if (existsSync(`${process.cwd()}/node_modules/klasa/src/commands/${cmdNames[x]}.js`)) {
- unlinkSync(`${process.cwd()}/node_modules/klasa/src/commands/${cmdNames[x]}.js`);
- }
- }
+ for (let x = 0; x < cmdNames.length; x++) {
+ if (existsSync(`${process.cwd()}/node_modules/klasa/src/commands/${cmdNames[x]}.js`)) {
+ unlinkSync(`${process.cwd()}/node_modules/klasa/src/commands/${cmdNames[x]}.js`);
+ }
+ }
};
/**
@@ -33,101 +33,116 @@ exports.commandRemover = function() {
* If the enviroment check fails, program will terminate
* @returns { null } If enviroment check passes.
*/
-exports.envCheck = function() {
- var missingDep = [];
+exports.envCheck = function () {
+ let missingDep = [];
- var nVersion = process.version.split("v")[1].split(".");
- nVersion = Number(`${nVersion[0]}.${nVersion[1]}`);
+ let djsVer = djsVersion.split(".");
+ djsVer = Number(`${djsVer[0]}.${djsVer[1]}`);
- var djsVer = djsVersion.split(".");
- djsVer = Number(`${djsVer[0]}.${djsVer[1]}`);
+ if (djsVer < 12.3) {
+ missingDep.push("You are not using the right discord.js package! Required version: v12.3.0+");
+ }
+ if (kVersion !== "0.5.0") {
+ missingDep.push("You are not using the right Klasa version! Required version: v0.5.0");
+ }
- if (djsVer < 12.3) { missingDep.push("You are not using the right discord.js package! Required version: v12.3.0+"); }
- if (kVersion !== "0.5.0") { missingDep.push("You are not using the right Klasa version! Required version: v0.5.0"); }
- if (nVersion < 12.0) { missingDep.push("You are not using the right Node.js version! Required version: v12.0.0+"); }
-
- if (missingDep.length > 0) { console.log(missingDep.join("\n")); process.exit(); }
+ if (missingDep.length > 0) {
+ console.log(missingDep.join("\n"));
+ process.exit();
+ }
};
exports.util = {
- timekeeper: require("./timekeeper.js"),
- presenceHelper: require("./presenceHelper.js"),
- modEmbed: require("./modEmbed.js"),
- /**
- * Returns the best matching channel for channel messages.
- * @param { KlasaGuild } guild - Needed to search for the channel and settings.
- * @param { String } [args] - Defaults to "default". Takes either "default" or "mod" depending on the action needed.
- * @returns { KlasaChannel } Returns a channel that best fits the arguements given.
- */
- defaultChannel: (guild, args="default") => {
- if (guild.settings.defaultChannel !== null && args === "default") { return guild.channels.cache.get(guild.settings.defaultChannel); }
- else if (guild.settings.modlog !== null && args === "mod") { return guild.channels.cache.get(guild.settings.modlog); }
-
- var name = ["general", "general-chat", "off-topic"];
- var channelID = Array.from(guild.channels.cache).filter(channel => name.includes(channel[1].name) && channel[1].type === "text");
- if (channelID.length > 0) { return channelID[0][1]; }
-
- var channels = Array.from(guild.channels.cache.sort((e1, e2) => e1.rawPosition - e2.rawPosition));
- for (var x = 0; x < channels.length; x++) {
- var currChannel = channels[x][1];
- if (currChannel.type === "text" && currChannel.permissionsFor(guild.members.cache.get(this.client.user.id)).has("SEND_MESSAGES")) {
- channelID = currChannel;
- x = channels.length;
- }
- }
-
- return guild.channels.cache.get(channelID.id);
- },
- /**
- * Goes over all common checks to ensure the user is able to interact with a music command
- * @param { KlasaMessage } msg
- * @param { String } tag - A tag for specific cases such as the join command.
- * @returns { Boolean | Object } Returns true if passed and false if failed. If tag is not join, will return the music instance.
- */
- musicCheck: (msg, tag) => {
- if (!msg.member.voice.channelID) {
- msg.sendLocale("MUSICCHECK_USERNOVC");
- return false;
- } else if (tag !== "join") {
- var handler = msg.client.music.get(msg.guild.id);
- if (!handler) {
- msg.sendLocale("MUSICCHECK_NOQUEUE");
- return false;
- } else if (msg.member.voice.channelID !== handler.channel.id) {
- msg.sendLocale("MUSICCHECK_MISMATCHVC");
- return false;
- } else if (tag === "handler" && !handler.dispatcher) {
- msg.sendLocale("MUSICCHECK_NOHANDLER");
- }
-
- return handler;
- }
-
- return true;
- },
- /**
- * Returns a capitialized text string
- * @param { String } text
- * @return { String }
- */
- toTitleCase: (text) => {
- return text.charAt(0).toUpperCase() + text.substr(1).toLowerCase();
- },
- /**
- * Generate a Date display for printing
- * @param { Date } date
- * @return { String }
- */
- dateDisplay: (date) => {
- return date.toLocaleString(dateOptions.lang, dateOptions.display);
- },
- /**
- * Generate a random number
- * @param { Number } min - The minimum value. Is included in the possible range.
- * @param { Number } max - The maximum value. Will be excluded in the randomness.
- * @return { Number }
- */
- getRandom: (min, max) => {
- return Math.floor(Math.random() * (max - min) ) + min;
- }
-};
\ No newline at end of file
+ timekeeper: require("./timekeeper.js"),
+ presenceHelper: require("./presenceHelper.js"),
+ modEmbed: require("./modEmbed.js"),
+ /**
+ * Returns the best matching channel for channel messages.
+ * @param { KlasaGuild } guild - Needed to search for the channel and settings.
+ * @param { String } [args] - Defaults to "default". Takes either "default" or "mod" depending on the action needed.
+ * @returns { KlasaChannel } Returns a channel that best fits the arguements given.
+ */
+ defaultChannel: (guild, args = "default") => {
+ if (guild.settings.defaultChannel !== null && args === "default") {
+ return guild.channels.cache.get(guild.settings.defaultChannel);
+ } else if (guild.settings.modlog !== null && args === "mod") {
+ return guild.channels.cache.get(guild.settings.modlog);
+ }
+
+ let name = ["general", "general-chat", "off-topic"];
+ let channelID = Array.from(guild.channels.cache).filter(
+ (channel) => name.includes(channel[1].name) && channel[1].type === "text"
+ );
+ if (channelID.length > 0) {
+ return channelID[0][1];
+ }
+
+ let channels = Array.from(guild.channels.cache.sort((e1, e2) => e1.rawPosition - e2.rawPosition));
+ for (let x = 0; x < channels.length; x++) {
+ let currChannel = channels[x][1];
+ if (
+ currChannel.type === "text" &&
+ currChannel.permissionsFor(guild.members.cache.get(this.client.user.id)).has("SEND_MESSAGES")
+ ) {
+ channelID = currChannel;
+ x = channels.length;
+ }
+ }
+
+ return guild.channels.cache.get(channelID.id);
+ },
+ /**
+ * Goes over all common checks to ensure the user is able to interact with a music command
+ * @param { KlasaMessage } msg
+ * @param { String } tag - A tag for specific cases such as the join command.
+ * @returns { Boolean | Object } Returns true if passed and false if failed. If tag is not join, will return the music instance.
+ */
+ musicCheck: (msg, tag) => {
+ if (!msg.member.voice.channelID) {
+ msg.sendLocale("MUSICCHECK_USERNOVC");
+ return false;
+ }
+
+ if (tag !== "join") {
+ let handler = msg.client.music.get(msg.guild.id);
+ if (!handler) {
+ msg.sendLocale("MUSICCHECK_NOQUEUE");
+ return false;
+ } else if (msg.member.voice.channelID !== handler.channel.id) {
+ msg.sendLocale("MUSICCHECK_MISMATCHVC");
+ return false;
+ } else if (tag === "handler" && !handler.dispatcher) {
+ msg.sendLocale("MUSICCHECK_NOHANDLER");
+ }
+
+ return handler;
+ }
+
+ return true;
+ },
+ /**
+ * Returns a capitialized text string
+ * @param { String } text
+ * @return { String }
+ */
+ toTitleCase: (text) => {
+ return text.split(" ").map(word => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase()).join(" ");
+ },
+ /**
+ * Generate a Date display for printing
+ * @param { Date } date
+ * @return { String }
+ */
+ dateDisplay: (date) => {
+ return date.toLocaleString(dateOptions.lang, dateOptions.display);
+ },
+ /**
+ * Generate a random number
+ * @param { Number } min - The minimum value. Is included in the possible range.
+ * @param { Number } max - The maximum value. Will be excluded in the randomness.
+ * @return { Number }
+ */
+ getRandom: (min, max) => {
+ return Math.floor(Math.random() * (max - min)) + min;
+ }
+};