├── .gitignore
├── .glitch-assets
├── README.md
├── _config.yml
├── commands
├── Admin
│ └── eval.js
├── Moderation
│ └── setup.js
└── Utils
│ ├── help.js
│ ├── logs.js
│ ├── ping.js
│ └── stats.js
├── events
├── channelCreate.js
├── channelDelete.js
├── emojiCreate.js
├── emojiDelete.js
├── guildAfkChannelAdd.js
├── guildBanAdd.js
├── guildBanRemove.js
├── guildBannerAdd.js
├── guildBoostLevelDown.js
├── guildBoostLevelUp.js
├── guildCreate.js
├── guildMemberAdd.js
├── guildMemberBoost.js
├── guildMemberNicknameUpdate.js
├── guildMemberRemove.js
├── guildMemberRoleAdd.js
├── guildMemberRoleRemove.js
├── guildMemberUnboost.js
├── guildRegionUpdate.js
├── guildVanityURLAdd.js
├── inviteCreate.js
├── inviteDelete.js
├── message.js
├── messageContentEdited.js
├── messageDelete.js
├── messagePinned.js
├── ready.js
├── roleCreate.js
├── roleDelete.js
├── voiceChannelDeaf.js
├── voiceChannelJoin.js
├── voiceChannelLeave.js
├── voiceChannelMute.js
├── voiceChannelSwitch.js
├── voiceChannelUndeaf.js
├── voiceChannelUnmute.js
├── voiceStreamingStart.js
└── voiceStreamingStop.js
├── helpers
├── BetterEmbeds.js
├── logger.js
└── permissions.js
├── index.js
├── languages
├── english.js
└── french.js
├── main.js
├── package.json
├── shrinkwrap.yaml
└── structures
├── Client.js
└── Command.js
/.gitignore:
--------------------------------------------------------------------------------
1 | config.js
2 | data/
3 | commands/Utils/only.js
4 | functions.js
--------------------------------------------------------------------------------
/.glitch-assets:
--------------------------------------------------------------------------------
1 | {"name":"a32db822-6095-4a09-b8dc-07355981633f.image.png","date":"2020-02-26T10:48:48.615Z","url":"https://cdn.glitch.com/121f8421-34e7-4d8e-b252-728eb2cc5c1d%2Fa32db822-6095-4a09-b8dc-07355981633f.image.png","type":"image/png","size":9479,"imageWidth":331,"imageHeight":114,"thumbnail":"https://cdn.glitch.com/121f8421-34e7-4d8e-b252-728eb2cc5c1d%2Fthumbnails%2Fa32db822-6095-4a09-b8dc-07355981633f.image.png","thumbnailWidth":330,"thumbnailHeight":114,"uuid":"0eh0iCQCVhpIUM8M"}
2 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 |
2 |
3 | # LogsBot
4 |
5 | [](https://github.com/discordjs)
6 | 
7 | [](https://discord.gg/GMUQdS4)
8 |
9 | 💻 LogsBot is a new discord bot which has the particularity to make only logs! It has more than 35 different logs and you can choose the channel of each log and activate it or not!
10 | It has only one feature but it's very well done!
11 |
12 | ## Table of contents
13 |
14 | * [Commands](https://github.com/Shadowv7/LogsBot#commands)
15 | * [Contributors](https://github.com/Shadowv7/LogsBot#contributors)
16 | * [Widgets](https://github.com/Shadowv7/LogsBot#widgets)
17 | * [Links](https://github.com/Shadowv7/LogsBot#links)
18 |
19 | ## Commands
20 |
21 | ### Help
22 | ```
23 | * Displays the help menu
24 |
25 | * log!help [command-name]
26 | ```
27 | ### Config
28 | ```
29 | * Displays the server configurations.
30 |
31 | * log!config
32 | ```
33 | ### Ping
34 | ```
35 | * Displays LogsBot's ping.
36 |
37 | * log!ping
38 | ```
39 | ### Setup
40 | ```
41 | * This command is used to set up the logs.
42 |
43 | * log!setup option event
44 | ```
45 | ### Stats
46 | ```
47 | * Displays a graph with server stats.
48 |
49 | * log!stats option
50 | ```
51 |
52 | ## Contributors
53 |
54 | [Thanks to Androz#2091 for helping me develop this bot.](https://github.com/Androz2091)
55 |
56 | ## Widgets
57 |
58 | ### Divine Discord Bot
59 | [](https://divinediscordbots.com/bot/674568147029983242)
60 |
61 | ### Arcane Bot Center
62 | [](https://arcane-botcenter.xyz/bot/674568147029983242)
63 |
64 | ## Links
65 |
66 | * [Discord](https://discord.gg/FDCunvd)
67 | * [Invite me](https://discordapp.com/oauth2/authorize?client_id=674568147029983242&permissions=8&scope=bot)
68 | * [Github](https://github.com/Shadowv7)
69 |
--------------------------------------------------------------------------------
/_config.yml:
--------------------------------------------------------------------------------
1 | theme: jekyll-theme-minimal
--------------------------------------------------------------------------------
/commands/Admin/eval.js:
--------------------------------------------------------------------------------
1 | const Command = require("../../structures/Command.js"),
2 | Discord = require("discord.js");
3 |
4 | class Eval extends Command {
5 | constructor(client) {
6 | super(client, {
7 | name: "eval",
8 | enabled: true,
9 | description: language => language.get("EVAL_DESCRIPTION"),
10 | usage: language => language.get("EVAL_USAGE"),
11 | examples: language => language.get("EVAL_EXAMPLES"),
12 | aliases: [],
13 | clientPermissions: [],
14 | permLevel: 4,
15 | cooldown: 5000,
16 | commandPath: __dirname,
17 | guildOnly: true,
18 | nsfw: false
19 | });
20 | }
21 |
22 | async run(message, args, data) {
23 | const content = message.content
24 | .split(" ")
25 | .slice(1)
26 | .join(" ");
27 | const result = new Promise((resolve, reject) => resolve(eval(content)));
28 |
29 | return result
30 | .then(output => {
31 | if (typeof output !== "string") {
32 | output = require("util").inspect(output, { depth: 0 });
33 | }
34 | if (output.includes(message.client.token)) {
35 | output = output.replace(message.client.token, "T0K3N");
36 | }
37 | message.channel.send(output, {
38 | code: "js"
39 | });
40 | })
41 | .catch(err => console.log(err));
42 | }
43 | }
44 | module.exports = Eval;
45 |
--------------------------------------------------------------------------------
/commands/Moderation/setup.js:
--------------------------------------------------------------------------------
1 | const Command = require("../../structures/Command.js"),
2 | Discord = require("discord.js");
3 |
4 | class Setup extends Command {
5 | constructor(client) {
6 | super(client, {
7 | name: "setup",
8 | enabled: true,
9 | description: language => language.get("SETUP_DESCRIPTION"),
10 | usage: language => language.get("SETUP_USAGE"),
11 | examples: language => language.get("SETUP_EXAMPLES"),
12 | aliases: [],
13 | clientPermissions: ["EMBED_LINKS","VIEW_AUDIT_LOG "],
14 | permLevel: 1,
15 | cooldown: 5000,
16 | commandPath: __dirname,
17 | guildOnly: true,
18 | nsfw: false
19 | });
20 | }
21 |
22 | async run(message, args, data) {
23 | const OPTION = args[0];
24 | const OPTION_ARRAY = ["channel", "language", "enable", "disable"];
25 |
26 | if (!OPTION)
27 | return message.channel.send(
28 | message.language.get(
29 | "OPTIONS_NAMES",
30 | OPTION_ARRAY.sort()
31 | .map(n => `\`${n}\``)
32 | .join(" , ")
33 | )
34 | );
35 | if (OPTION && !OPTION_ARRAY.includes(OPTION))
36 | return message.channel.send(
37 | message.language.get("NO_VALID_OPTION", OPTION)
38 | );
39 | if (OPTION === "language") {
40 | const language = args[1];
41 | if (!language)
42 | return message.channel.send(message.language.get("NO_LANGUAGE"));
43 | const LANGUAGES_ARRAY = ["french", "english"];
44 | if (!LANGUAGES_ARRAY.includes(language))
45 | return message.channel.send(
46 | message.language.get(
47 | "LANGUAGES_LIST",
48 | LANGUAGES_ARRAY.map(lang => `\`${lang}\``).join(" , ")
49 | )
50 | );
51 | if (language === this.client.settings.get(message.guild.id, "language"))
52 | return message.channel.send(
53 | message.language.get("OLD_LANGUAGE", language)
54 | );
55 | this.client.settings.set(message.guild.id, language, "language");
56 | return message.channel.send(
57 | message.language.get("NEW_LANGUAGE", language)
58 | );
59 | }
60 | if (OPTION === "channel") {
61 | const EVENT_LIST = Object.keys(this.client.logs.get(message.guild.id));
62 |
63 | const EVENT = args[1];
64 | let CHANNEL = message.mentions.channels.first();
65 | if(CHANNEL.type!== "text") return message.channel.send(message.language.get("ERROR_TYPE"))
66 | if (!EVENT)
67 | return message.channel.send(
68 | message.language.get(
69 | "EVENTS_LIST",
70 | [...EVENT_LIST, ...["all"]].map(list => `\`${list}\``).join(" , ")
71 | )
72 | );
73 | if (![...EVENT_LIST, ...["all"]].includes(EVENT))
74 | return message.channel.send(
75 | message.language.get(
76 | "EVENTS_LIST",
77 | [...EVENT_LIST, ...["all"]].map(list => `\`${list}\``).join(" , ")
78 | )
79 | );
80 | if (!CHANNEL) CHANNEL = message.channel;
81 | if (
82 | CHANNEL.permissionsFor(this.client.user).serialize().SEND_MESSAGES !==
83 | true
84 | )
85 | return message.channel.send(
86 | message.language.get("ERR_CMD_CLIENT_PERMISSIONS", "SEND_MESSAGES")
87 | );
88 | if (EVENT === "all") {
89 | let boolean = false;
90 | EVENT_LIST.map(OPTION_NAME => {
91 | this.client.logs.set(
92 | message.guild.id,
93 | CHANNEL.id,
94 | `${OPTION_NAME}.channel_id`
95 | );
96 | });
97 |
98 | return message.channel.send(
99 | message.language.get("ALL_CHANNEL", CHANNEL)
100 | );
101 | }
102 | if (EVENT) {
103 | if (
104 | this.client.logs.get(message.guild.id, `${EVENT}.channel_id`) ===
105 | CHANNEL.id
106 | )
107 | return message.channel.send(
108 | message.language.get("ALREADY_SET_CHANNEL")
109 | );
110 |
111 | this.client.logs.set(
112 | message.guild.id,
113 | CHANNEL.id,
114 | `${EVENT}.channel_id`
115 | );
116 | return message.channel.send(
117 | message.language.get("CHANNEL_SET_SUCCESS", EVENT, CHANNEL)
118 | );
119 | }
120 | }
121 | if (OPTION === "enable") {
122 | const EVENT_LIST = Object.keys(this.client.logs.get(message.guild.id));
123 | const EVENT = args[1];
124 | if (!EVENT)
125 | return message.channel.send(
126 | message.language.get(
127 | "EVENTS_LIST",
128 | [...EVENT_LIST, ...["all", "log_bots"]]
129 | .map(list => `\`${list}\``)
130 | .join(" , ")
131 | )
132 | );
133 | if (![...EVENT_LIST, ...["all", "log_bots"]].includes(EVENT))
134 | return message.channel.send(
135 | message.language.get(
136 | "EVENTS_LIST",
137 | [...EVENT_LIST, ...["all", "log_bots"]]
138 | .map(list => `\`${list}\``)
139 | .join(" , ")
140 | )
141 | );
142 |
143 | if (EVENT === "log_bots") {
144 | if (this.client.settings.get(message.guild.id, "log_bots") === true)
145 | return message.channel.send(
146 | message.language.get("ALREADY_ENABLE_BOT")
147 | );
148 | if (
149 | this.client.stats.isPremium(this.client, message.guild.id) !== false
150 | ) {
151 | this.client.settings.set(message.guild.id, true, EVENT);
152 | return message.channel.send(message.language.get("LOG_BOTS_ENABLE"));
153 | } else {
154 | return message.channel.send(message.language.get("NO_PREMIUM"));
155 | }
156 | }
157 |
158 | if (EVENT === "all") {
159 | let boolean = false;
160 | EVENT_LIST.map(OPTION_NAME => {
161 | if (
162 | (OPTION_NAME === "guildMemberOnline" &&
163 | !this.client.stats.isPremium(this.client, message.guild.id)) ||
164 | (OPTION_NAME === "guildMemberOffline" &&
165 | !this.client.stats.isPremium(this.client, message.guild.id))
166 | ) {
167 | message.channel.send(message.language.get("NO_PREMIUM"));
168 | } else {
169 | this.client.logs.set(
170 | message.guild.id,
171 | true,
172 | `${OPTION_NAME}.enabled`
173 | );
174 | }
175 | });
176 |
177 | return message.channel.send(message.language.get("ALL_ENABLE"));
178 | }
179 | if (EVENT) {
180 | if (this.client.stats.isPremium(this.client, message.guild.id))
181 | return message.channel.send("NO_PREMIUM");
182 | if (this.client.logs.get(message.guild.id, `${EVENT}.enabled`) === true)
183 | return message.channel.send(
184 | message.language.get("ALREADY_ENABLE", EVENT)
185 | );
186 | this.client.logs.set(message.guild.id, true, `${EVENT}.enabled`);
187 | return message.channel.send(
188 | message.language.get("SUCCESS_ENABLE", EVENT)
189 | );
190 | }
191 | }
192 | if (OPTION === "disable") {
193 | const EVENT_LIST = Object.keys(this.client.logs.get(message.guild.id));
194 | const EVENT = args[1];
195 | if (!EVENT)
196 | return message.channel.send(
197 | message.language.get(
198 | "EVENTS_LIST",
199 | [...EVENT_LIST, ...["all", "log_bots"]]
200 | .map(list => `\`${list}\``)
201 | .join(" , ")
202 | )
203 | );
204 | if (![...EVENT_LIST, ...["all", "log_bots"]].includes(EVENT))
205 | return message.channel.send(
206 | message.language.get(
207 | "EVENTS_LIST",
208 | [...EVENT_LIST, ...["all", "log_bots"]]
209 | .map(list => `\`${list}\``)
210 | .join(" , ")
211 | )
212 | );
213 | if (EVENT === "log_bots") {
214 | if (this.client.settings.get(message.guild.id, "log_bots") === false)
215 | return message.channel.send(
216 | message.language.get("ALREADY_DISABLE_BOT")
217 | );
218 | if (this.client.stats.isPremium !== false) {
219 | this.client.settings.set(message.guild.id, false, EVENT);
220 | return message.channel.send(message.language.get("LOG_BOTS_DISABLE"));
221 | } else {
222 | return message.channel.send(message.language.get("NO_PREMIUM"));
223 | }
224 | }
225 | if (EVENT === "all") {
226 | let boolean = false;
227 | EVENT_LIST.map(OPTION_NAME => {
228 | this.client.logs.set(
229 | message.guild.id,
230 | false,
231 | `${OPTION_NAME}.enabled`
232 | );
233 | });
234 |
235 | return message.channel.send(message.language.get("ALL_DISABLE"));
236 | }
237 | if (EVENT) {
238 | if (this.client.stats.isPremium(this.client, message.guild.id))
239 | return message.channel.send("NO_PREMIUM");
240 | if (
241 | this.client.logs.get(message.guild.id, `${EVENT}.enabled`) === false
242 | )
243 | return message.channel.send(
244 | message.language.get("ALREADY_DISABLE", EVENT)
245 | );
246 |
247 | this.client.logs.set(message.guild.id, false, `${EVENT}.enabled`);
248 | return message.channel.send(
249 | message.language.get("SUCCESS_DISABLE", EVENT)
250 | );
251 | }
252 | }
253 | }
254 | }
255 | module.exports = Setup;
256 |
--------------------------------------------------------------------------------
/commands/Utils/help.js:
--------------------------------------------------------------------------------
1 | const Command = require("../../structures/Command.js"),
2 | MessageEmbed = require("../../helpers/BetterEmbeds.js");
3 |
4 | class Help extends Command {
5 | constructor(client) {
6 | super(client, {
7 | // The name of the command
8 | name: "help",
9 | // Whether the command is enabled, or not
10 | enabled: true,
11 | // Some command informations to display in the help command
12 | description: language => language.get("HELP_DESCRIPTION"),
13 | usage: language => language.get("HELP_USAGE"),
14 | examples: language => language.get("HELP_EXAMPLES"),
15 | // The other names that can trigger the command
16 | aliases: ["h"],
17 | // The permissions needed by the bot to run the command
18 | clientPermissions: ["EMBED_LINKS"],
19 | // The level of permissions required by the user to run the command.
20 | permLevel: 0,
21 | // // The time it will take a user before he can execute the command again
22 | cooldown: 1000,
23 | // The file path of the command. It will be used to determine what's the command category
24 | commandPath: __dirname,
25 | // Whether the command can only be run in a guild, or not
26 | guildOnly: false,
27 | // Whether the command needs to be run in a NSFW channel
28 | nsfw: false
29 | });
30 | }
31 |
32 | async run(message, args, data) {
33 | if (args[0]) {
34 | // If the command doesn't exist, displays an error message
35 | let cmd =
36 | this.client.commands.get(args[0]) ||
37 | this.client.commands.get(message.client.aliases.get(args[0]));
38 | if (!cmd)
39 | return message.channel.send(
40 | message.language.get("HELP_CMD_NOT_FOUND", args[0])
41 | );
42 |
43 | // Replace $ caract with the server prefix
44 | let examples = cmd.help
45 | .examples(message.language)
46 | .replace(/[$_]/g, "log!");
47 |
48 | // Creates the help embed
49 | let groupEmbed = new MessageEmbed()
50 | .setAuthor(
51 | message.language.get("HELP_HEADINGS")[0] + " " + cmd.help.name
52 | )
53 | .addField(
54 | message.language.get("HELP_HEADINGS")[1],
55 | "log!" + cmd.help.usage(message.language),
56 | true
57 | )
58 | .addField(message.language.get("HELP_HEADINGS")[2], examples, true)
59 | .addField(
60 | message.language.get("HELP_HEADINGS")[3],
61 | cmd.help.category,
62 | true
63 | )
64 | .addField(
65 | message.language.get("HELP_HEADINGS")[4],
66 | cmd.help.description(message.language),
67 | true
68 | )
69 | .addField(
70 | message.language.get("HELP_HEADINGS")[5],
71 | cmd.conf.aliases.length > 0
72 | ? cmd.conf.aliases.map(a => "`" + a + "`").join("\n")
73 | : message.language.get("HELP_NO_ALIASES"),
74 | true
75 | )
76 | .addField(
77 | message.language.get("HELP_HEADINGS")[6],
78 | message.language.get("PERM_LEVELS")[cmd.conf.permLevel],
79 | true
80 | )
81 | .setColor(data.config.embed.color)
82 | .setFooter(data.config.embed.footer);
83 |
84 | // and send the embed in the current channel
85 | return message.channel.send({ embed: groupEmbed.build() });
86 | }
87 |
88 | /* Get the list of categories */
89 | const categories = [];
90 | this.client.commands.forEach(cmd => {
91 | if (!categories.includes(cmd.help.category)) {
92 | categories.push(cmd.help.category);
93 | }
94 | });
95 |
96 | let embed = new MessageEmbed()
97 | .setAuthor(
98 | this.client.user.username + " | " + message.language.get("HELP_TITLE")
99 | )
100 | .setDescription(message.language.get("HELP_SUBTITLE", "log!"))
101 |
102 | /* FIELDS GEN */
103 | categories.sort().forEach(cat => {
104 | let commandsCategory = this.client.commands.filter(
105 | cmd => cmd.help.category === cat
106 | );
107 | embed.addField(
108 | data.config.emojis.categories[cat.toLowerCase()] +
109 | " " +
110 | cat +
111 | " - (" +
112 | commandsCategory.size +
113 | ")",
114 | commandsCategory.filter(c => c.help.name !== "only").map(cmd => "`" + cmd.help.name + "`").join(", ")
115 | );
116 | });
117 | embed.addField(
118 | "<:links:686092592856825887> Links",
119 | "[Support |](https://discord.gg/gkDZSz9)[ Add me](https://discordapp.com/api/oauth2/authorize?client_id=674568147029983242&permissions=8&scope=bot)"
120 | );
121 | message.channel.send({ embed: embed.build() });
122 | }
123 | }
124 |
125 | module.exports = Help;
126 |
--------------------------------------------------------------------------------
/commands/Utils/logs.js:
--------------------------------------------------------------------------------
1 | const Command = require("../../structures/Command.js"),
2 | MessageEmbed = require("../../helpers/BetterEmbeds.js");
3 | class Logs extends Command {
4 | constructor(client) {
5 | super(client, {
6 | name: "config",
7 | enabled: true,
8 | description: language => language.get("LOGS_DESCRIPTION"),
9 | usage: language => language.get("LOGS_USAGE"),
10 | examples: language => language.get("LOGS_USAGE"),
11 | aliases: ["configuration"],
12 | clientPermissions: [],
13 | permLevel: 0,
14 | cooldown: 1000,
15 | commandPath: __dirname,
16 | guildOnly: false,
17 | premiumOnly: false,
18 | nsfw: false
19 | });
20 | }
21 |
22 | async run(message, args, data) {
23 | const embed = new MessageEmbed();
24 | const DB = this.client.logs.get(message.guild.id);
25 | const guild = [];
26 | const Message = [];
27 | const guildMember = [];
28 | const voiceChannel = [];
29 | const other = [];
30 | Object.keys(DB).forEach((key, index) => {
31 | const ID = DB[key].channel_id;
32 | let channel;
33 | if (ID && ID === undefined) {
34 | channel = "None";
35 | } else {
36 | channel = message.guild.channels.cache.get(ID);
37 | }
38 | if (key.startsWith("message")) {
39 | Message.push(
40 | `${
41 | DB[key].enabled
42 | ? data.config.emojis.success
43 | : data.config.emojis.error
44 | } ${key} | ${channel || "None"}`
45 | );
46 | }
47 | if (key.startsWith("guildMember")) {
48 | guildMember.push(
49 | `${
50 | DB[key].enabled
51 | ? data.config.emojis.success
52 | : data.config.emojis.error
53 | } ${key} | ${channel || "None"}`
54 | );
55 | }
56 | if (key.startsWith("voice")) {
57 | voiceChannel.push(
58 | `${
59 | DB[key].enabled
60 | ? data.config.emojis.success
61 | : data.config.emojis.error
62 | } ${key} | ${channel || "None"}`
63 | );
64 | }
65 | if (!key.startsWith("guildMember") && key.startsWith("guild")) {
66 | guild.push(
67 | `${
68 | DB[key].enabled
69 | ? data.config.emojis.success
70 | : data.config.emojis.error
71 | } ${key} | ${channel || "None"}`
72 | );
73 | }
74 | if (
75 | !key.startsWith("guild") &&
76 | !key.startsWith("guildMember") &&
77 | !key.startsWith("voice") &&
78 | !key.startsWith("message")
79 | ) {
80 | other.push(
81 | `${
82 | DB[key].enabled
83 | ? data.config.emojis.success
84 | : data.config.emojis.error
85 | } ${key} | ${channel || "None"}`
86 | );
87 | }
88 | });
89 |
90 | embed.setTitle("__Events List__");
91 | embed.addField("__Guild__", guild.join("\n"));
92 | embed.addField("__GuildMember__", guildMember.join("\n"));
93 | embed.addField("__Message__", Message.join("\n"));
94 | embed.addField("__Voice__", voiceChannel.join("\n"));
95 | embed.addField("__Others__", other.join("\n"));
96 | let guildPremium = this.client.stats.isPremium(this.client,message.guild.id)
97 | if(guildPremium) {
98 | guildPremium = data.config.emojis.star
99 | }
100 | if(!guildPremium) {
101 | guildPremium = data.config.emojis.error
102 | }
103 | embed.setDescription(`Premium : ${guildPremium}`)
104 | embed.setColor(data.config.embed.color);
105 | embed.setFooter(data.config.embed.footer);
106 | message.channel.send({embed:embed.build()});
107 | }
108 | }
109 |
110 | module.exports = Logs;
111 |
--------------------------------------------------------------------------------
/commands/Utils/ping.js:
--------------------------------------------------------------------------------
1 | const Command = require("../../structures/Command.js"),
2 | MessageEmbed = require("../../helpers/BetterEmbeds.js");
3 |
4 | class Ping extends Command {
5 |
6 | constructor (client) {
7 | super(client, {
8 | // The name of the command
9 | name: "ping",
10 | // Whether the command is enabled, or not
11 | enabled: true,
12 | // Some command informations to display in the help command
13 | description: (language) => language.get("PING_DESCRIPTION"),
14 | usage: (language) => language.get("PING_USAGE"),
15 | examples: (language) => language.get("PING_EXAMPLES"),
16 | // The other names that can trigger the command
17 | aliases: [ "pong", "latency" ],
18 | // The permissions needed by the bot to run the command
19 | clientPermissions: [],
20 | // The level of permissions required by the user to run the command.
21 | permLevel: 0,
22 | // // The time it will take a user before he can execute the command again
23 | cooldown: 1000,
24 | // The file path of the command. It will be used to determine what's the command category
25 | commandPath: __dirname,
26 | // Whether the command can only be run in a guild, or not
27 | guildOnly: false,
28 | // Whether the command needs to be run in a NSFW channel
29 | nsfw: false
30 | });
31 | }
32 |
33 | async run (message, args, data) {
34 | let m = await message.channel.send(message.language.get("PING_WAIT"));
35 | m.edit(message.language.get("PING_RESULT", m.createdTimestamp - message.createdTimestamp));
36 | }
37 |
38 | }
39 |
40 | module.exports = Ping;
--------------------------------------------------------------------------------
/commands/Utils/stats.js:
--------------------------------------------------------------------------------
1 | const Command = require("../../structures/Command.js"),
2 | MessageEmbed = require("../../helpers/BetterEmbeds.js"),
3 | Discord = require("discord.js");
4 |
5 | class Stats extends Command {
6 | constructor(client) {
7 | super(client, {
8 | name: "stats",
9 | enabled: true,
10 | description: language => language.get("STATS_DESCRIPTION"),
11 | usage: language => language.get("STATS_USAGE"),
12 | examples: language => language.get("STATS_EXAMPLES"),
13 | aliases: [],
14 | clientPermissions: ["EMBED_LINKS"],
15 | permLevel: 0,
16 | cooldown: 5000,
17 | commandPath: __dirname,
18 | guildOnly: true,
19 | premiumOnly: false,
20 | nsfw: false
21 | });
22 | }
23 |
24 | async run(message, args, data) {
25 | if (!args[0])
26 | return message.channel.send(message.language.get("NO_ARGS_STATS"));
27 | if (
28 |
29 | !["other", "message", "guild", "guildMember", "voice", "all","only"].includes(
30 | args[0]
31 | )
32 | )
33 | return message.channel.send(
34 | message.language.get("NO_VALID_OPTION", args[0])
35 | );
36 | if(args[0] !== "all" && !this.client.stats.isPremium(this.client,message.guild.id)) return message.channel.send(message.language.get("NO_PREMIUM"));
37 | const { CanvasRenderService } = require("chartjs-node-canvas");
38 | const width = 800;
39 | const height = 300;
40 | const ticksOptions = [{ ticks: { fontColor: "white", fontStyle: "bold" } }];
41 | const options = {
42 | legend: { display: false },
43 | scales: { yAxes: ticksOptions, xAxes: ticksOptions }
44 | };
45 | const embed = new MessageEmbed();
46 | const canvasRenderService = new CanvasRenderService(
47 | width,
48 | height,
49 | ChartJS => {}
50 | );
51 | const event = [];
52 |
53 | const emit_length = [];
54 |
55 | const events = Object.keys(this.client.logs.get(message.guild.id));
56 | let total = 0;
57 | events.forEach(c => {
58 | let logs = this.client.logs.get(message.guild.id, `${c}.emit_length`);
59 | const all_emit = total + logs;
60 | total = all_emit;
61 | });
62 |
63 | if (args[0] === "all") {
64 | events.forEach(c => {
65 | if (
66 | this.client.logs.get(message.guild.id, `${c}.enabled`) !== false
67 | ) {
68 | event.push(c);
69 | emit_length.push(
70 | this.client.logs.get(message.guild.id, `${c}.emit_length`)
71 | );
72 | }
73 | });
74 |
75 | if (!event) return;
76 | const image = await canvasRenderService.renderToBuffer({
77 | type: "line",
78 | data: {
79 | labels: event,
80 | datasets: [
81 | {
82 | data: emit_length,
83 | // The color of the line (the same as the fill color with full opacity)
84 | borderColor: "rgb(61,148,192)",
85 | fill: true,
86 | // Blue color and low opacity
87 | backgroundColor: "rgba(61,148,192,0.1)"
88 | }
89 | ]
90 | },
91 | options
92 | });
93 |
94 | const attachment = new Discord.MessageAttachment(image, "image.png");
95 | embed.attachFiles(attachment);
96 | embed.setImage("attachment://image.png");
97 | //embed.setDescription(array_description.join("\n\n"));
98 | embed.setTitle("__Logs Stats__");
99 | embed.setColor(data.config.embed.color);
100 | embed.setFooter(data.config.embed.footer);
101 | return message.channel.send({ embed: embed.build() });
102 | }
103 |
104 | if(args[0] === "only"){
105 | return this.client.commands.get("only").run(message,args,data)
106 | }
107 | }
108 | }
109 | module.exports = Stats;
110 |
--------------------------------------------------------------------------------
/events/channelCreate.js:
--------------------------------------------------------------------------------
1 | const Discord = require("discord.js");
2 |
3 | module.exports = class {
4 | constructor(client) {
5 | this.client = client;
6 | }
7 |
8 | async run(channel) {
9 |
10 | const path = require("path");
11 | const events = path.basename(__filename, path.extname(__filename))
12 | if(!this.client.logs.get(channel.guild.id)) return;
13 | const language = new(require(`../languages/${this.client.settings.get(channel.guild.id,"language")}.js`))
14 | if (this.client.logs.get(channel.guild.id, `${events}.enabled`) !== true) return;
15 | if (this.client.logs.get(channel.guild.id, `${events}.channel_id`)) {
16 | const channels = channel.guild.channels.cache.get(
17 | this.client.logs.get(channel.guild.id, `${events}.channel_id`)
18 | );
19 | const userTag = await channel.guild.fetchAuditLogs({type: 'CHANNEL_CREATE'}).then(audit => audit.entries.first().executor.tag)
20 | let emit_length = this.client.logs.get(channel.guild.id,`${events}.emit_length`)
21 | emit_length+=1
22 | this.client.logs.set(channel.guild.id,emit_length,`${events}.emit_length`)
23 | return channels.send(language.get(events, channel,userTag));
24 | }
25 |
26 | }
27 | };
28 |
--------------------------------------------------------------------------------
/events/channelDelete.js:
--------------------------------------------------------------------------------
1 | const Discord = require("discord.js");
2 |
3 | module.exports = class {
4 | constructor(client) {
5 | this.client = client;
6 | }
7 |
8 | async run(channel) {
9 | const path = require("path");
10 | const events = path.basename(__filename, path.extname(__filename));
11 | if (!this.client.logs.get(channel.guild.id)) return;
12 | const language = new (require(`../languages/${this.client.settings.get(
13 | channel.guild.id,
14 | "language"
15 | )}.js`))();
16 | if (this.client.logs.get(channel.guild.id, `${events}.enabled`) !== true)
17 | return;
18 | if (this.client.logs.get(channel.guild.id, `${events}.channel_id`)) {
19 | const channels = channel.guild.channels.cache.get(
20 | this.client.logs.get(channel.guild.id, `${events}.channel_id`)
21 | );
22 | const userTag = await channel.guild
23 | .fetchAuditLogs({ type: "CHANNEL_CREATE" })
24 | .then(audit => audit.entries.first().executor.tag);
25 | let emit_length = this.client.logs.get(
26 | channel.guild.id,
27 | `${events}.emit_length`
28 | );
29 | emit_length += 1;
30 | this.client.logs.set(
31 | channel.guild.id,
32 | emit_length,
33 | `${events}.emit_length`
34 | );
35 |
36 | return channels.send(language.get(events, channel, userTag));
37 | }
38 | }
39 | };
40 |
--------------------------------------------------------------------------------
/events/emojiCreate.js:
--------------------------------------------------------------------------------
1 | const Discord = require("discord.js");
2 |
3 | module.exports = class {
4 | constructor(client) {
5 | this.client = client;
6 | }
7 |
8 | async run(emoji) {
9 | const path = require("path");
10 | const events = path.basename(__filename, path.extname(__filename))
11 | if(!this.client.logs.get(emoji.guild.id)) return;
12 | const language = new(require(`../languages/${this.client.settings.get(emoji.guild.id,"language")}.js`))
13 | if (this.client.logs.get(emoji.guild.id, `${events}.enabled`) !== true) return;
14 | if (this.client.logs.get(emoji.guild.id, `${events}.channel_id`)) {
15 | const channel = emoji.guild.channels.cache.get(
16 | this.client.logs.get(emoji.guild.id, `${events}.channel_id`)
17 | );
18 |
19 | const userTag = await emoji.guild.fetchAuditLogs({type: 'EMOJI_CREATE'}).then(audit => audit.entries.first().executor.tag)
20 | let emit_length = this.client.logs.get(emoji.guild.id,`${events}.emit_length`)
21 | emit_length+=1
22 | this.client.logs.set(emoji.guild.id,emit_length,`${events}.emit_length`)
23 |
24 | return channel.send(language.get(events, emoji,userTag));
25 | }
26 | }
27 | };
28 |
--------------------------------------------------------------------------------
/events/emojiDelete.js:
--------------------------------------------------------------------------------
1 | const Discord = require("discord.js");
2 |
3 | module.exports = class {
4 | constructor(client) {
5 | this.client = client;
6 | }
7 |
8 | async run(emoji) {
9 | const path = require("path");
10 | const events = path.basename(__filename, path.extname(__filename))
11 | if(!this.client.logs.get(emoji.guild.id)) return;
12 | const language = new(require(`../languages/${this.client.settings.get(emoji.guild.id,"language")}.js`))
13 | if (this.client.logs.get(emoji.guild.id, `${events}.enabled`) !== true) return;
14 | if (this.client.logs.get(emoji.guild.id, `${events}.channel_id`)) {
15 | const channel = emoji.guild.channels.cache.get(
16 | this.client.logs.get(emoji.guild.id, `${events}.channel_id`)
17 | );
18 |
19 | const userTag = await emoji.guild.fetchAuditLogs({type: 'EMOJI_DELETE'}).then(audit => audit.entries.first().executor.tag)
20 | let emit_length = this.client.logs.get(emoji.guild.id,`${events}.emit_length`)
21 | emit_length+=1
22 | this.client.logs.set(emoji.guild.id,emit_length,`${events}.emit_length`)
23 |
24 | return channel.send(language.get(events, emoji,userTag));
25 | }
26 | }
27 | };
28 |
--------------------------------------------------------------------------------
/events/guildAfkChannelAdd.js:
--------------------------------------------------------------------------------
1 | const Discord = require("discord.js");
2 |
3 | module.exports = class {
4 | constructor(client) {
5 | this.client = client;
6 | }
7 |
8 | async run(guild, afkChannel) {
9 | const path = require("path");
10 | const events = path.basename(__filename, path.extname(__filename))
11 | if(!this.client.logs.get(guild.id)) return;
12 | const language = new(require(`../languages/${this.client.settings.get(guild.id,"language")}.js`))
13 | if (this.client.logs.get(guild.id, `${events}.enabled`) !== true) return;
14 | if (this.client.logs.get(guild.id, `${events}.channel_id`)) {
15 | const channel = guild.channels.cache.get(
16 | this.client.logs.get(guild.id, `${events}.channel_id`)
17 | );
18 | let emit_length = this.client.logs.get(guild.id,`${events}.emit_length`)
19 | emit_length+=1
20 | this.client.logs.set(guild.id,emit_length,`${events}.emit_length`)
21 | return channel.send(language.get(events, guild, afkChannel));
22 | }
23 | }
24 | };
25 |
--------------------------------------------------------------------------------
/events/guildBanAdd.js:
--------------------------------------------------------------------------------
1 | const Discord = require("discord.js");
2 |
3 | module.exports = class {
4 | constructor(client) {
5 | this.client = client;
6 | }
7 |
8 | async run(guild, user) {
9 | const path = require('path');
10 | const events = path.basename(__filename, path.extname(__filename))
11 | if(!this.client.logs.get(guild.id)) return;
12 | if (this.client.logs.get(guild.id, `${events}.enabled`) !== true) return;
13 | if (this.client.logs.get(guild.id, `${events}.channel_id`)) {
14 | const channel = guild.channels.cache.get(
15 | this.client.logs.get(guild.id, `${events}.channel_id`)
16 | );
17 |
18 | let emit_length = this.client.logs.get(guild.id,`${events}.emit_length`)
19 | emit_length+=1
20 | this.client.logs.set(guild.id,emit_length,`${events}.emit_length`)
21 | const language = new(require(`../languages/${this.client.settings.get(guild.id,"language")}.js`))
22 | const userTag = await guild
23 | .fetchAuditLogs({ type: "MEMBER_BAN_ADD" })
24 | .then(audit => audit.entries.first().executor.tag);
25 |
26 | return channel.send(language.get(events, guild, user,userTag));
27 | }
28 | }
29 | };
30 |
--------------------------------------------------------------------------------
/events/guildBanRemove.js:
--------------------------------------------------------------------------------
1 | const Discord = require("discord.js");
2 |
3 | module.exports = class {
4 | constructor(client) {
5 | this.client = client;
6 | }
7 |
8 | async run(guild, user) {
9 | const path = require('path');
10 | const events = path.basename(__filename, path.extname(__filename))
11 | if(!this.client.logs.get(guild.id)) return;
12 | if (this.client.logs.get(guild.id, `${events}.enabled`) !== true) return;
13 | if (this.client.logs.get(guild.id, `${events}.channel_id`)) {
14 | const channel = guild.channels.cache.get(
15 | this.client.logs.get(guild.id, `${events}.channel_id`)
16 | );
17 | let emit_length = this.client.logs.get(guild.id,`${events}.emit_length`)
18 | emit_length+=1
19 | this.client.logs.set(guild.id,emit_length,`${events}.emit_length`)
20 | const userTag = await guild
21 | .fetchAuditLogs({ type: "MEMBER_BAN_DELETE" })
22 | .then(audit => audit.entries.first().executor.tag);
23 |
24 | const language = new(require(`../languages/${this.client.settings.get(guild.id,"language")}.js`))
25 | return channel.send(language.get(events, guild, user,userTag));
26 | }
27 | }
28 | };
29 |
--------------------------------------------------------------------------------
/events/guildBannerAdd.js:
--------------------------------------------------------------------------------
1 | const Discord = require("discord.js");
2 |
3 | module.exports = class {
4 | constructor(client) {
5 | this.client = client;
6 | }
7 |
8 | async run(guild, bannerURL) {
9 | const path = require('path');
10 | const events = path.basename(__filename, path.extname(__filename))
11 | if(!this.client.logs.get(guild.id)) return;
12 | if (this.client.logs.get(guild.id, `${events}.enabled`) !== true) return;
13 | if (this.client.logs.get(guild.id, `${events}.channel_id`)) {
14 | const channel = guild.channels.cache.get(
15 | this.client.logs.get(guild.id, `${events}.channel_id`)
16 | );
17 | let emit_length = this.client.logs.get(guild.id,`${events}.emit_length`)
18 | emit_length+=1
19 | this.client.logs.set(guild.id,emit_length,`${events}.emit_length`)
20 |
21 | const language = new(require(`../languages/${this.client.settings.get(guild.id,"language")}.js`))
22 | return channel.send(language.get(events, guild, bannerURL));
23 | }
24 | }
25 | };
26 |
--------------------------------------------------------------------------------
/events/guildBoostLevelDown.js:
--------------------------------------------------------------------------------
1 | const Discord = require("discord.js")
2 |
3 | module.exports = class {
4 |
5 | constructor (client) {
6 | this.client = client;
7 | }
8 |
9 | async run (guild,oldLevel,newLevel) {
10 | const path = require('path');
11 | const events = path.basename(__filename, path.extname(__filename))
12 | if(!this.client.logs.get(guild.id)) return;
13 | if (this.client.logs.get(guild.id, `${events}.enabled`) !== true) return;
14 | if (this.client.logs.get(guild.id, `${events}.channel_id`)) {
15 | const channel = guild.channels.cache.get(
16 | this.client.logs.get(guild.id, `${events}.channel_id`)
17 | );
18 |
19 | let emit_length = this.client.logs.get(guild.id,`${events}.emit_length`)
20 | emit_length+=1
21 | this.client.logs.set(guild.id,emit_length,`${events}.emit_length`)
22 | const language = new(require(`../languages/${this.client.settings.get(guild.id,"language")}.js`))
23 | return channel.send(language.get(events, newLevel || 0));
24 | }
25 | }
26 | }
--------------------------------------------------------------------------------
/events/guildBoostLevelUp.js:
--------------------------------------------------------------------------------
1 | const Discord = require("discord.js")
2 |
3 | module.exports = class {
4 |
5 | constructor (client) {
6 | this.client = client;
7 | }
8 |
9 | async run (guild,oldLevel,newLevel) {
10 | const path = require('path');
11 | const events = path.basename(__filename, path.extname(__filename))
12 | if(!this.client.logs.get(guild.id)) return;
13 | if (this.client.logs.get(guild.id, `${events}.enabled`) !== true) return;
14 | if (this.client.logs.get(guild.id, `${events}.channel_id`)) {
15 | const channel = guild.channels.cache.get(
16 | this.client.logs.get(guild.id, `${events}.channel_id`)
17 | );
18 | let emit_length = this.client.logs.get(guild.id,`${events}.emit_length`)
19 | emit_length+=1
20 | this.client.logs.set(guild.id,emit_length,`${events}.emit_length`)
21 | const language = new(require(`../languages/${this.client.settings.get(guild.id,"language")}.js`))
22 | return channel.send(language.get(events, newLevel));
23 | }
24 | }
25 | }
--------------------------------------------------------------------------------
/events/guildCreate.js:
--------------------------------------------------------------------------------
1 | const Discord = require("discord.js");
2 |
3 | module.exports = class {
4 | constructor(client) {
5 | this.client = client;
6 | }
7 |
8 | async run(guild) {
9 | this.client.settings.ensure(guild.id, {
10 | language: "english"
11 | });
12 | this.client.graph.ensure(guild.id, {
13 | total: {}
14 | });
15 | this.client.logs.ensure(guild.id, {
16 | guildMemberBoost: {
17 | enabled: false,
18 | channel_id: undefined,
19 | emit_length: 0
20 | },
21 | guildMemberUnboost: {
22 | enabled: false,
23 | channel_id: undefined,
24 | emit_length: 0
25 | },
26 | guildMemberRoleAdd: {
27 | enabled: false,
28 | channel_id: undefined,
29 | emit_length: 0
30 | },
31 | guildMemberRoleRemove: {
32 | enabled: false,
33 | channel_id: undefined,
34 | emit_length: 0
35 | },
36 | guildMemberNicknameUpdate: {
37 | enabled: false,
38 | channel_id: undefined,
39 | emit_length: 0
40 | },
41 | guildMemberAdd: { enabled: false, channel_id: undefined, emit_length: 0 },
42 | guildMemberRemove: {
43 | enabled: false,
44 | channel_id: undefined,
45 | emit_length: 0
46 | },
47 | guildBoostLevelUp: {
48 | enabled: false,
49 | channel_id: undefined,
50 | emit_length: 0
51 | },
52 | guildBoostLevelDown: {
53 | enabled: false,
54 | channel_id: undefined,
55 | emit_length: 0
56 | },
57 | guildRegionUpdate: {
58 | enabled: false,
59 | channel_id: undefined,
60 | emit_length: 0
61 | },
62 | guildBannerAdd: { enabled: false, channel_id: undefined, emit_length: 0 },
63 | guildAfkChannelAdd: {
64 | enabled: false,
65 | channel_id: undefined,
66 | emit_length: 0
67 | },
68 | messagePinned: { enabled: false, channel_id: undefined, emit_length: 0 },
69 | messageContentEdited: {
70 | enabled: false,
71 | channel_id: undefined,
72 | emit_length: 0
73 | },
74 | guildMemberOnline: {
75 | enabled: false,
76 | channel_id: undefined,
77 | emit_length: 0
78 | },
79 | guildMemberOffline: {
80 | enabled: false,
81 | channel_id: undefined,
82 | emit_length: 0
83 | },
84 | voiceChannelJoin: {
85 | enabled: false,
86 | channel_id: undefined,
87 | emit_length: 0
88 | },
89 | voiceChannelLeave: {
90 | enabled: false,
91 | channel_id: undefined,
92 | emit_length: 0
93 | },
94 | voiceChannelMute: {
95 | enabled: false,
96 | channel_id: undefined,
97 | emit_length: 0
98 | },
99 | voiceChannelUnmute: {
100 | enabled: false,
101 | channel_id: undefined,
102 | emit_length: 0
103 | },
104 | voiceChannelDeaf: {
105 | enabled: false,
106 | channel_id: undefined,
107 | emit_length: 0
108 | },
109 | voiceChannelUndeaf: {
110 | enabled: false,
111 | channel_id: undefined,
112 | emit_length: 0
113 | },
114 | voiceStreamingStart: {
115 | enabled: false,
116 | channel_id: undefined,
117 | emit_length: 0
118 | },
119 | voiceStreamingStop: {
120 | enabled: false,
121 | channel_id: undefined,
122 | emit_length: 0
123 | },
124 | voiceChannelSwitch: {
125 | enabled: false,
126 | channel_id: undefined,
127 | emit_length: 0
128 | },
129 | inviteCreate: { enabled: false, channel_id: undefined, emit_length: 0 },
130 | inviteDelete: { enabled: false, channel_id: undefined, emit_length: 0 },
131 | guildBanAdd: { enabled: false, channel_id: undefined, emit_length: 0 },
132 | guildBanRemove: { enabled: false, channel_id: undefined, emit_length: 0 },
133 | channelCreate: { enabled: false, channel_id: undefined, emit_length: 0 },
134 | channelDelete: { enabled: false, channel_id: undefined, emit_length: 0 }
135 | });
136 | }
137 | };
138 |
--------------------------------------------------------------------------------
/events/guildMemberAdd.js:
--------------------------------------------------------------------------------
1 | const Discord = require("discord.js"),
2 | Canvas = require("discord-canvas")
3 |
4 | module.exports = class {
5 | constructor(client) {
6 | this.client = client;
7 | }
8 |
9 | async run(member) {
10 | const path = require("path");
11 | const events = path.basename(__filename, path.extname(__filename));
12 | if(!this.client.logs.get(member.guild.id)) return;
13 | if(this.client.settings.get(member.guild.id,"log_bots") !== true && member.user.bot) return;
14 | if (this.client.logs.get(member.guild.id, `${events}.enabled`) !== true)
15 | return;
16 | if (this.client.logs.get(member.guild.id, `${events}.channel_id`)) {
17 | const channel = member.guild.channels.cache.get(
18 | this.client.logs.get(member.guild.id, `${events}.channel_id`)
19 | );
20 |
21 | const language = new(require(`../languages/${this.client.settings.get(member.guild.id,"language")}.js`))
22 | const image = new Canvas.Welcome()
23 | .setUsername(member.user.username)
24 | .setDiscriminator(member.user.discriminator)
25 | .setAvatar(member.user.displayAvatarURL({ format: "png" }))
26 | .setGuildName(member.guild.name)
27 | .setMemberCount(member.guild.members.cache.size)
28 | .setText("title", language.get("guildMemberAdd_TITLE"))
29 | .setText("message", language.get("guildMemberAdd_MESSAGE"))
30 | .setText("memberCount", language.get("guildMemberAdd_NUMBER"))
31 | .setColor("username-box", "#17171a")
32 | .setColor("discriminator-box", "#17171a")
33 | .setColor("message-box", "#17171a")
34 | .setColor("background", "#2c2e33")
35 |
36 | let attachment = new Discord.MessageAttachment(
37 | (await image.toAttachment()).toBuffer(),
38 | "welcome-image.png"
39 | );
40 | let emit_length = this.client.logs.get(member.guild.id,`${events}.emit_length`)
41 | emit_length+=1
42 | this.client.logs.set(member.guild.id,emit_length,`${events}.emit_length`)
43 | return channel.send(attachment)
44 | }
45 | }
46 | };
47 |
--------------------------------------------------------------------------------
/events/guildMemberBoost.js:
--------------------------------------------------------------------------------
1 | const Discord = require("discord.js")
2 |
3 | module.exports = class {
4 |
5 | constructor (client) {
6 | this.client = client;
7 | }
8 |
9 | async run (member) {
10 | const path = require("path");
11 | const events = path.basename(__filename, path.extname(__filename));
12 | if(!this.client.logs.get(member.guild.id)) return;
13 | if(this.client.settings.get(member.guild.id,"log_bots") !== true && member.user.bot) return;
14 | if (this.client.logs.get(member.guild.id, `${events}.enabled`) !== true)
15 | return;
16 | if (this.client.logs.get(member.guild.id, `${events}.channel_id`)) {
17 | const channel = member.guild.channels.cache.get(
18 | this.client.logs.get(member.guild.id, `${events}.channel_id`)
19 | );
20 | let emit_length = this.client.logs.get(member.guild.id,`${events}.emit_length`)
21 | emit_length+=1
22 | this.client.logs.set(member.guild.id,emit_length,`${events}.emit_length`)
23 | const language = new(require(`../languages/${this.client.settings.get(member.guild.id,"language")}.js`))
24 | return channel.send(language.get(events, member));
25 | }
26 | }
27 | }
--------------------------------------------------------------------------------
/events/guildMemberNicknameUpdate.js:
--------------------------------------------------------------------------------
1 | const Discord = require("discord.js")
2 |
3 | module.exports = class {
4 |
5 | constructor (client) {
6 | this.client = client;
7 | }
8 |
9 | async run (member,oldNickname,newNickname) {
10 | const path = require("path");
11 | const events = path.basename(__filename, path.extname(__filename));
12 | if(!this.client.logs.get(member.guild.id)) return;
13 | if(this.client.settings.get(member.guild.id,"log_bots") !== true && member.user.bot) return;
14 | if (this.client.logs.get(member.guild.id, `${events}.enabled`) !== true)
15 | return;
16 | if (this.client.logs.get(member.guild.id, `${events}.channel_id`)) {
17 | const channel = member.guild.channels.cache.get(
18 | this.client.logs.get(member.guild.id, `${events}.channel_id`)
19 | );
20 |
21 | let emit_length = this.client.logs.get(member.guild.id,`${events}.emit_length`)
22 | emit_length+=1
23 | this.client.logs.set(member.guild.id,emit_length,`${events}.emit_length`)
24 | const language = new(require(`../languages/${this.client.settings.get(member.guild.id,"language")}.js`))
25 | return channel.send(language.get(events, member,oldNickname,newNickname));
26 | }
27 | }
28 | }
--------------------------------------------------------------------------------
/events/guildMemberRemove.js:
--------------------------------------------------------------------------------
1 | const Discord = require("discord.js"),
2 | Canvas = require("discord-canvas")
3 |
4 | module.exports = class {
5 | constructor(client) {
6 | this.client = client;
7 | }
8 |
9 | async run(member) {
10 | const path = require("path");
11 | const events = path.basename(__filename, path.extname(__filename));
12 | if(!this.client.logs.get(member.guild.id)) return;
13 | if(this.client.settings.get(member.guild.id,"log_bots") !== true && member.user.bot) return;
14 | if (this.client.logs.get(member.guild.id, `${events}.enabled`) !== true)
15 | return;
16 | if (this.client.logs.get(member.guild.id, `${events}.channel_id`)) {
17 | const channel = member.guild.channels.cache.get(
18 | this.client.logs.get(member.guild.id, `${events}.channel_id`)
19 | );
20 |
21 | const language = new(require(`../languages/${this.client.settings.get(member.guild.id,"language")}.js`))
22 | const image = new Canvas.Goodbye()
23 | .setUsername(member.user.username)
24 | .setDiscriminator(member.user.discriminator)
25 | .setAvatar(member.user.displayAvatarURL({ format: "png" }))
26 | .setGuildName(member.guild.name)
27 | .setMemberCount(member.guild.members.cache.size)
28 | .setText("title", language.get("guildMemberRemove_TITLE"))
29 | .setText("message", language.get("guildMemberRemove_MESSAGE"))
30 | .setText("memberCount", language.get("guildMemberRemove_NUMBER"))
31 | .setColor("username-box", "#17171a")
32 | .setColor("discriminator-box", "#17171a")
33 | .setColor("message-box", "#17171a")
34 | .setColor("background", "#2c2e33")
35 |
36 | let attachment = new Discord.MessageAttachment(
37 | (await image.toAttachment()).toBuffer(),
38 | "goodbye-image.png"
39 | );
40 | let emit_length = this.client.logs.get(member.guild.id,`${events}.emit_length`)
41 | emit_length+=1
42 | this.client.logs.set(member.guild.id,emit_length,`${events}.emit_length`)
43 | return channel.send(attachment)
44 | }
45 | }
46 | };
47 |
--------------------------------------------------------------------------------
/events/guildMemberRoleAdd.js:
--------------------------------------------------------------------------------
1 | const Discord = require("discord.js")
2 |
3 | module.exports = class {
4 |
5 | constructor (client) {
6 | this.client = client;
7 | }
8 |
9 | async run (member,role) {
10 | const path = require('path');
11 | const events = path.basename(__filename, path.extname(__filename))
12 | if(!this.client.logs.get(member.guild.id)) return;
13 | if(this.client.settings.get(member.guild.id,"log_bots") !== true && member.user.bot) return;
14 | if (this.client.logs.get(member.guild.id, `${events}.enabled`) !== true) return;
15 | if (this.client.logs.get(member.guild.id, `${events}.channel_id`)) {
16 | const channel = member.guild.channels.cache.get(
17 | this.client.logs.get(member.guild.id, `${events}.channel_id`)
18 | );
19 |
20 | let emit_length = this.client.logs.get(member.guild.id,`${events}.emit_length`)
21 | emit_length+=1
22 | this.client.logs.set(member.guild.id,emit_length,`${events}.emit_length`)
23 | const language = new(require(`../languages/${this.client.settings.get(member.guild.id,"language")}.js`))
24 | return channel.send(language.get(events, member,role));
25 | }
26 | }
27 | }
--------------------------------------------------------------------------------
/events/guildMemberRoleRemove.js:
--------------------------------------------------------------------------------
1 | const Discord = require("discord.js")
2 | module.exports = class {
3 |
4 | constructor (client) {
5 | this.client = client;
6 | }
7 |
8 | async run (member,role) {
9 | const path = require('path');
10 | const events = path.basename(__filename, path.extname(__filename))
11 | if(!this.client.logs.get(member.guild.id)) return;
12 | if(this.client.settings.get(member.guild.id,"log_bots") !== true && member.user.bot) return;
13 | if (this.client.logs.get(member.guild.id, `${events}.enabled`) !== true) return;
14 | if (this.client.logs.get(member.guild.id, `${events}.channel_id`)) {
15 | const channel = member.guild.channels.cache.get(
16 | this.client.logs.get(member.guild.id, `${events}.channel_id`)
17 | );
18 | let emit_length = this.client.logs.get(member.guild.id,`${events}.emit_length`)
19 | emit_length+=1
20 | this.client.logs.set(member.guild.id,emit_length,`${events}.emit_length`)
21 | const language = new(require(`../languages/${this.client.settings.get(member.guild.id,"language")}.js`))
22 | return channel.send(language.get(events, member,role));
23 | }
24 | }
25 | }
--------------------------------------------------------------------------------
/events/guildMemberUnboost.js:
--------------------------------------------------------------------------------
1 | const Discord = require("discord.js");
2 |
3 | module.exports = class {
4 | constructor(client) {
5 | this.client = client;
6 | }
7 |
8 | async run(member) {
9 | const path = require("path");
10 | const events = path.basename(__filename, path.extname(__filename));
11 | if(!this.client.logs.get(member.guild.id)) return;
12 | if(this.client.settings.get(member.guild.id,"log_bots") !== true && member.user.bot) return;
13 | if (this.client.logs.get(member.guild.id, `${events}.enabled`) !== true)
14 | return;
15 | if (this.client.logs.get(member.guild.id, `${events}.channel_id`)) {
16 | const channel = member.guild.channels.cache.get(
17 | this.client.logs.get(member.guild.id, `${events}.channel_id`)
18 | );
19 | let emit_length = this.client.logs.get(member.guild.id,`${events}.emit_length`)
20 | emit_length+=1
21 | this.client.logs.set(member.guild.id,emit_length,`${events}.emit_length`)
22 | const language = new(require(`../languages/${this.client.settings.get(member.guild.id,"language")}.js`))
23 | return channel.send(language.get(events, member));
24 | }
25 | }
26 | };
27 |
--------------------------------------------------------------------------------
/events/guildRegionUpdate.js:
--------------------------------------------------------------------------------
1 | const Discord = require("discord.js");
2 |
3 | module.exports = class {
4 | constructor(client) {
5 | this.client = client;
6 | }
7 |
8 | async run(guild, oldRegion, newRegion) {
9 | const path = require("path");
10 | const events = path.basename(__filename, path.extname(__filename));
11 | if(!this.client.logs.get(guild.id)) return;
12 |
13 | if (this.client.logs.get(guild.id, `${events}.enabled`) !== true) return;
14 | if (this.client.logs.get(guild.id, `${events}.channel_id`)) {
15 | const channel = guild.channels.cache.get(
16 | this.client.logs.get(guild.id, `${events}.channel_id`)
17 | );
18 | let emit_length = this.client.logs.get(guild.id,`${events}.emit_length`)
19 | emit_length+=1
20 | this.client.logs.set(guild.id,emit_length,`${events}.emit_length`)
21 | const language = new (require(`../languages/${this.client.settings.get(
22 | guild.id,
23 | "language"
24 | )}.js`))();
25 | return channel.send(language.get(events, guild,oldRegion,newRegion));
26 | }
27 | }
28 | };
29 |
--------------------------------------------------------------------------------
/events/guildVanityURLAdd.js:
--------------------------------------------------------------------------------
1 | const Discord = require("discord.js");
2 |
3 | module.exports = class {
4 | constructor(client) {
5 | this.client = client;
6 | }
7 |
8 | async run(guild, vanityURL) {
9 | const path = require('path');
10 | const events = path.basename(__filename, path.extname(__filename))
11 | if(!this.client.logs.get(guild.id)) return;
12 | if (this.client.logs.get(guild.id, `${events}.enabled`) !== true) return;
13 | if (this.client.logs.get(guild.id, `${events}.channel_id`)) {
14 | const channel = guild.channels.cache.get(
15 | this.client.logs.get(guild.id, `${events}.channel_id`)
16 | );
17 |
18 | let emit_length = this.client.logs.get(guild.id,`${events}.emit_length`)
19 | emit_length+=1
20 | this.client.logs.set(guild.id,emit_length,`${events}.emit_length`)
21 | const language = new(require(`../languages/${this.client.settings.get(guild.id,"language")}.js`))
22 | return channel.send(language.get(events, guild, vanityURL));
23 | }
24 | }
25 | };
26 |
--------------------------------------------------------------------------------
/events/inviteCreate.js:
--------------------------------------------------------------------------------
1 | const Discord = require("discord.js");
2 |
3 | module.exports = class {
4 | constructor(client) {
5 | this.client = client;
6 | }
7 |
8 | async run(invite) {
9 | console.log("test")
10 | const path = require('path');
11 | const events = path.basename(__filename, path.extname(__filename))
12 | if(!this.client.logs.get(invite.guild.id)) return;
13 | if (this.client.logs.get(invite.guild.id, `${events}.enabled`) !== true) return;
14 | if (this.client.logs.get(invite.guild.id, `${events}.channel_id`)) {
15 | const channel = invite.guild.channels.cache.get(
16 | this.client.logs.get(invite.guild.id, `${events}.channel_id`)
17 | );
18 |
19 | let emit_length = this.client.logs.get(invite.guild.id,`${events}.emit_length`)
20 | emit_length+=1
21 | this.client.logs.set(invite.guild.id,emit_length,`${events}.emit_length`)
22 | const language = new(require(`../languages/${this.client.settings.get(invite.guild.id,"language")}.js`))
23 |
24 | return channel.send(language.get(events,invite));
25 | }
26 | }
27 | };
28 |
--------------------------------------------------------------------------------
/events/inviteDelete.js:
--------------------------------------------------------------------------------
1 | const Discord = require("discord.js");
2 |
3 | module.exports = class {
4 | constructor(client) {
5 | this.client = client;
6 | }
7 |
8 | async run(invite) {
9 | console.log("test")
10 | const path = require('path');
11 | const events = path.basename(__filename, path.extname(__filename))
12 | if(!this.client.logs.get(invite.guild.id)) return;
13 | if (this.client.logs.get(invite.guild.id, `${events}.enabled`) !== true) return;
14 | if (this.client.logs.get(invite.guild.id, `${events}.channel_id`)) {
15 | const channel = invite.guild.channels.cache.get(
16 | this.client.logs.get(invite.guild.id, `${events}.channel_id`)
17 | );
18 |
19 | let emit_length = this.client.logs.get(invite.guild.id,`${events}.emit_length`)
20 | emit_length+=1
21 | this.client.logs.set(invite.guild.id,emit_length,`${events}.emit_length`)
22 | const language = new(require(`../languages/${this.client.settings.get(invite.guild.id,"language")}.js`))
23 | const userTag = await invite.guild.fetchAuditLogs({type: 'INVITE_DELETE'}).then(audit => audit.entries.first().executor.tag)
24 | return channel.send(language.get(events,invite));
25 | }
26 | }
27 | };
28 |
--------------------------------------------------------------------------------
/events/message.js:
--------------------------------------------------------------------------------
1 | const Discord = require("discord.js"),
2 | cmdCooldown = {};
3 |
4 | module.exports = class {
5 |
6 | constructor (client) {
7 | this.client = client;
8 | }
9 |
10 | async run (message) {
11 |
12 | const data = {};
13 |
14 | // If the message author is a bot
15 | if(message.author.bot) return
16 |
17 | // If the member on a guild is invisible or not cached, fetch him
18 | if(message.guild && !message.member) await message.guild.members.fetch(message.author.id);
19 | const guildConf = this.client.settings.get(message.guild.id,"language")
20 | data.guildConf = guildConf;
21 | data.config = this.client.config;
22 |
23 | // Gets language
24 | let Language = require(`../languages/${guildConf}.js`);
25 | message.language = new Language();
26 |
27 | // Check if the bot was mentionned
28 | const prefixMention = new RegExp(`^<@!?${this.client.user.id}>( |)$`);
29 | if(message.content.match(prefixMention)) return message.reply(message.language.get("PREFIX_INFO", "log!"));
30 |
31 | // Gets the prefix
32 | let prefixes = [ "log!", this.client.user.username, "<@"+this.client.user.id+">" ];
33 | let prefix = (message.channel.type !== "dm" ? prefixes.find((p) => message.content.startsWith(p)) : "");
34 | if(!prefix && prefix !== "") return;
35 |
36 | let args = message.content.slice(prefix.length).trim().split(/ +/g);
37 | let command = args.shift().toLowerCase();
38 | let cmd = this.client.commands.get(command) || this.client.commands.get(this.client.aliases.get(command));
39 |
40 | if(!cmd) return;
41 | data.cmd = cmd;
42 |
43 | if(cmd.conf.guildOnly && !message.guild){
44 | return message.channel.send(message.language.get("ERR_CMD_GUILDONLY"));
45 | }
46 | this.client.infos = this.client.stats.clientInfos(this.client,message)
47 | if(message.guild){
48 |
49 | /* Client permissions */
50 | const neededPermissions = [];
51 | cmd.conf.clientPermissions.forEach((permission) => {
52 | if(!message.channel.permissionsFor(message.guild.me).has(permission)) {
53 | neededPermissions.push(permission);
54 | }
55 | });
56 | if(neededPermissions.length > 0) return message.channel.send(message.language.get("ERR_CMD_CLIENT_PERMISSIONS", neededPermissions));
57 |
58 | /* User permissions */
59 | const permLevel = await this.client.getLevel(message);
60 | if(permLevel < cmd.conf.permLevel ){
61 | let levelName = message.language.get("PERM_LEVELS")[cmd.conf.permLevel];
62 | let userLevel = message.language.get("PERM_LEVELS")[permLevel];
63 | return message.channel.send(message.language.get("ERR_CMD_USER_PERMISSIONS", levelName, userLevel));
64 | }
65 |
66 | /* NSFW */
67 | if(!message.channel.nsfw && cmd.conf.nsfw){
68 | return message.channel.send(message.language.get("ERR_CMD_NSFW"));
69 | }
70 | }
71 |
72 | if(!cmd.conf.enabled){
73 | return message.channel.send(message.language.get("ERR_CMD_DISABLED"));
74 | }
75 | /* PREMIUM */
76 | if(cmd.conf.premiumOnly && data.config.guildPrem.indexOf(message.guild.id) === -1){
77 | return message.channel.send(message.language.get("NO_PREMIUM"))
78 | }
79 | /* Cooldown */
80 | let uCooldown = cmdCooldown[message.author.id];
81 | if(!uCooldown){
82 | cmdCooldown[message.author.id] = {};
83 | uCooldown = cmdCooldown[message.author.id];
84 | }
85 | let time = uCooldown[cmd.help.name] || 0;
86 | if(time && (time > Date.now())){
87 | return message.channel.send(message.language.get("ERR_CMD_COOLDOWN", Math.ceil((time-Date.now())/1000)));
88 | }
89 | cmdCooldown[message.author.id][cmd.help.name] = Date.now() + cmd.conf.cooldown;
90 |
91 | this.client.logger.log(`${message.author.username} (${message.author.id}) ran command ${cmd.help.name}`, "cmd");
92 | try {
93 | cmd.run(message, args, data);
94 | } catch(e){
95 | console.error(e);
96 | return message.channel.send(message.language.get("ERR_OCCURRED"));
97 | }
98 | }
99 | };
--------------------------------------------------------------------------------
/events/messageContentEdited.js:
--------------------------------------------------------------------------------
1 | const Discord = require("discord.js");
2 |
3 | module.exports = class {
4 | constructor(client) {
5 | this.client = client;
6 | }
7 |
8 | async run(message,oldContent,newContent) {
9 | const path = require("path");
10 | const events = path.basename(__filename, path.extname(__filename));
11 | if(!this.client.logs.get(message.guild.id)) return;
12 | if(this.client.settings.get(message.guild.id,"log_bots") !== true && message.author.bot) return;
13 | const language = new (require(`../languages/${this.client.settings.get(
14 | message.guild.id,
15 | "language"
16 | )}.js`))();
17 | if (this.client.logs.get(message.guild.id, `${events}.enabled`) !== true)
18 | return;
19 |
20 | if (this.client.logs.get(message.guild.id, `${events}.channel_id`)) {
21 | const channel = message.guild.channels.cache.get(
22 | this.client.logs.get(message.guild.id, `${events}.channel_id`)
23 | );
24 | let emit_length = this.client.logs.get(message.guild.id,`${events}.emit_length`)
25 | emit_length+=1
26 | this.client.logs.set(message.guild.id,emit_length,`${events}.emit_length`)
27 | return channel.send({embed:{color: 0x00abf5,description:language.get(events,message,oldContent.replace(/[`]/gi, ""),newContent.replace(/[`]/gi, ""))}});
28 | }
29 | }
30 | };
--------------------------------------------------------------------------------
/events/messageDelete.js:
--------------------------------------------------------------------------------
1 | const Discord = require("discord.js");
2 |
3 | module.exports = class {
4 | constructor(client) {
5 | this.client = client;
6 | }
7 |
8 | async run(message) {
9 | const path = require("path");
10 | const events = path.basename(__filename, path.extname(__filename));
11 | if(!this.client.logs.get(message.guild.id)) return;
12 | if(this.client.settings.get(message.guild.id,"log_bots") !== true && message.author.bot) return;
13 | const language = new (require(`../languages/${this.client.settings.get(
14 | message.guild.id,
15 | "language"
16 | )}.js`))();
17 | if (this.client.logs.get(message.guild.id, `${events}.enabled`) !== true)
18 | return;
19 |
20 | if (this.client.logs.get(message.guild.id, `${events}.channel_id`)) {
21 | const channel = message.guild.channels.cache.get(
22 | this.client.logs.get(message.guild.id, `${events}.channel_id`)
23 | )
24 | let userTag;
25 | if(await message.guild.fetchAuditLogs({type: 'MESSAGE_DELETE'}).then(audit => audit.entries.first().id) === message.id) {
26 | userTag = await message.guild.fetchAuditLogs({type: 'MESSAGE_DELETE'}).then(audit => audit.entries.first().executor.tag)
27 | } else {userTag = message.author.tag}
28 | let emit_length = this.client.logs.get(message.guild.id,`${events}.emit_length`)
29 | emit_length+=1
30 | this.client.logs.set(message.guild.id,emit_length,`${events}.emit_length`)
31 | return channel.send({embed:{color: 0x00abf5,description:language.get(events,message,userTag)}});
32 | }
33 | }
34 | };
--------------------------------------------------------------------------------
/events/messagePinned.js:
--------------------------------------------------------------------------------
1 | const Discord = require("discord.js");
2 |
3 | module.exports = class {
4 | constructor(client) {
5 | this.client = client;
6 | }
7 |
8 | async run(message) {
9 | const path = require("path");
10 | const events = path.basename(__filename, path.extname(__filename));
11 | if(!this.client.logs.get(message.guild.id)) return;
12 | if(this.client.settings.get(message.guild.id,"log_bots") !== true && message.author.bot) return;
13 | const language = new (require(`../languages/${this.client.settings.get(
14 | message.guild.id,
15 | "language"
16 | )}.js`));
17 |
18 | if (this.client.logs.get(message.guild.id, `${events}.enabled`) !== true)
19 | return;
20 | if (this.client.logs.get(message.guild.id, `${events}.channel_id`)) {
21 | const channel = message.guild.channels.cache.get(
22 | this.client.logs.get(message.guild.id, `${events}.channel_id`)
23 | );
24 | let emit_length = this.client.logs.get(message.guild.id,`${events}.emit_length`)
25 | emit_length+=1
26 | this.client.logs.set(message.guild.id,emit_length,`${events}.emit_length`)
27 | return channel.send({ embed: { color: 0x00abf5,description :language.get(events, message) }});
28 | }
29 | }
30 | };
31 |
--------------------------------------------------------------------------------
/events/ready.js:
--------------------------------------------------------------------------------
1 | const Discord = require("discord.js");
2 | const abcAPI = require("abcapi");
3 | const { ddblAPI } = require("ddblapi.js");
4 | const ddbl = new ddblAPI(
5 | "674568147029983242",
6 | "9d9cee5fb13cc0350a0329a023ba83635b5b7615914b1b81500d58314d2fb74c1526a76cb4a5604ebd7bb9dbbe8dcf04adc2f5d2f8f96fa5ac6ec99f3905b0f0"
7 | );
8 | module.exports = class {
9 | constructor(client) {
10 | this.client = client;
11 | }
12 |
13 | async run() {
14 | // Logs some informations using the logger file
15 | this.client.logger.log(
16 | `Loading a total of ${this.client.commands.size} command(s).`,
17 | "log"
18 | );
19 | this.client.logger.log(
20 | `${this.client.user.tag}, ready to serve ${this.client.users.cache.size} users in ${this.client.guilds.cache.size} servers.`,
21 | "ready"
22 | );
23 |
24 | // Update bot's status
25 |
26 | const statusList = require("../config.js").status.list || [],
27 | version = require("../package.json").version;
28 | let i = 0;
29 | setInterval(() => {
30 | let status = statusList[parseInt(i, 10)];
31 |
32 | let statusContent = status.content
33 | .replace(/{usersCount}/g, this.client.users.cache.size)
34 | .replace(/{guildsCount}/g, this.client.guilds.cache.size);
35 |
36 | this.client.user.setActivity(statusContent, { type: status.type });
37 |
38 | if (statusList[parseInt(i + 1, 10)]) i++;
39 | else i = 0;
40 | }, require("../config.js").status.updateEvery);
41 |
42 | /* ABC API */
43 | abcAPI.login(
44 | "f80acbd52e449a73d898cf7258325de7e97f88a3c0e080fa6552085667ac306af4ad0dbffe8d81c93a4662b8f9c5728be68ce162b18aa573856d4c6cd4d4d312",
45 | this.client.user.id
46 | );
47 | abcAPI.update(this.client);
48 | abcAPI.post(this.client);
49 |
50 | /* DDBL API */
51 | ddbl.postStats(this.client.guilds.cache.size).then(console.log);
52 | }
53 | };
54 |
--------------------------------------------------------------------------------
/events/roleCreate.js:
--------------------------------------------------------------------------------
1 | const Discord = require("discord.js");
2 |
3 | module.exports = class {
4 | constructor(client) {
5 | this.client = client;
6 | }
7 |
8 | async run(role) {
9 | const path = require("path");
10 | const events = path.basename(__filename, path.extname(__filename));
11 | if (!this.client.logs.get(role.guild.id)) return;
12 |
13 | const language = new (require(`../languages/${this.client.settings.get(
14 | role.guild.id,
15 | "language"
16 | )}.js`))();
17 | if (this.client.logs.get(role.guild.id, `${events}.enabled`) !== true)
18 | return;
19 |
20 | if (this.client.logs.get(role.guild.id, `${events}.channel_id`)) {
21 | const channel = role.guild.channels.cache.get(
22 | this.client.logs.get(role.guild.id, `${events}.channel_id`)
23 | );
24 | let emit_length = this.client.logs.get(role.guild.id,`${events}.emit_length`)
25 | emit_length+=1
26 | this.client.logs.set(role.guild.id,emit_length,`${events}.emit_length`)
27 | const userTag = await role.guild.fetchAuditLogs({type: 'ROLE_CREATE'}).then(audit => audit.entries.first().executor.tag)
28 | return channel.send(language.get(events, role,userTag));
29 | }
30 | }
31 | };
32 |
--------------------------------------------------------------------------------
/events/roleDelete.js:
--------------------------------------------------------------------------------
1 | const Discord = require("discord.js");
2 |
3 | module.exports = class {
4 | constructor(client) {
5 | this.client = client;
6 | }
7 |
8 | async run(role) {
9 | const path = require("path");
10 | const events = path.basename(__filename, path.extname(__filename));
11 | if (!this.client.logs.get(role.guild.id)) return;
12 |
13 | const language = new (require(`../languages/${this.client.settings.get(
14 | role.guild.id,
15 | "language"
16 | )}.js`))();
17 | if (this.client.logs.get(role.guild.id, `${events}.enabled`) !== true)
18 | return;
19 |
20 | if (this.client.logs.get(role.guild.id, `${events}.channel_id`)) {
21 | const channel = role.guild.channels.cache.get(
22 | this.client.logs.get(role.guild.id, `${events}.channel_id`)
23 | );
24 | let emit_length = this.client.logs.get(
25 | role.guild.id,
26 | `${events}.emit_length`
27 | );
28 | emit_length += 1;
29 | this.client.logs.set(role.guild.id, emit_length, `${events}.emit_length`);
30 | const userTag = await role.guild
31 | .fetchAuditLogs({ type: "ROLE_CREATE" })
32 | .then(audit => audit.entries.first().executor.tag);
33 |
34 | return channel.send(language.get(events, role, userTag));
35 | }
36 | }
37 | };
38 |
--------------------------------------------------------------------------------
/events/voiceChannelDeaf.js:
--------------------------------------------------------------------------------
1 | const Discord = require("discord.js")
2 |
3 | module.exports = class {
4 |
5 | constructor (client) {
6 | this.client = client;
7 | }
8 |
9 | async run (member,deafType) {
10 | const path = require("path");
11 | const events = path.basename(__filename, path.extname(__filename));
12 | if(!this.client.logs.get(member.guild.id)) return;
13 | if(this.client.settings.get(member.guild.id,"log_bots") !== true && member.user.bot) return;
14 | if (this.client.logs.get(member.guild.id, `${events}.enabled`) !== true)
15 | return;
16 | if (this.client.logs.get(member.guild.id, `${events}.channel_id`)) {
17 | const channel = member.guild.channels.cache.get(
18 | this.client.logs.get(member.guild.id, `${events}.channel_id`)
19 | );
20 | let emit_length = this.client.logs.get(member.guild.id,`${events}.emit_length`)
21 | emit_length+=1
22 | this.client.logs.set(member.guild.id,emit_length,`${events}.emit_length`)
23 | const language = new(require(`../languages/${this.client.settings.get(member.guild.id,"language")}.js`))
24 | return channel.send(language.get(events, member));
25 | }
26 | }
27 | }
--------------------------------------------------------------------------------
/events/voiceChannelJoin.js:
--------------------------------------------------------------------------------
1 | const Discord = require("discord.js")
2 |
3 | module.exports = class {
4 |
5 | constructor (client) {
6 | this.client = client;
7 | }
8 |
9 | async run (member,voiceChannel) {
10 | const path = require("path");
11 | const events = path.basename(__filename, path.extname(__filename));
12 | if(!this.client.logs.get(member.guild.id)) return;
13 | if(this.client.settings.get(member.guild.id,"log_bots") !== true && member.user.bot) return;
14 | if (this.client.logs.get(member.guild.id, `${events}.enabled`) !== true)
15 | return;
16 | if (this.client.logs.get(member.guild.id, `${events}.channel_id`)) {
17 | const channel = member.guild.channels.cache.get(
18 | this.client.logs.get(member.guild.id, `${events}.channel_id`)
19 | );
20 | let emit_length = this.client.logs.get(member.guild.id,`${events}.emit_length`)
21 | emit_length+=1
22 | this.client.logs.set(member.guild.id,emit_length,`${events}.emit_length`)
23 | const language = new(require(`../languages/${this.client.settings.get(member.guild.id,"language")}.js`))
24 | return channel.send(language.get(events, member,voiceChannel));
25 | }
26 | }
27 | }
--------------------------------------------------------------------------------
/events/voiceChannelLeave.js:
--------------------------------------------------------------------------------
1 | const Discord = require("discord.js")
2 |
3 | module.exports = class {
4 |
5 | constructor (client) {
6 | this.client = client;
7 | }
8 |
9 | async run (member,oldVoiceChannel) {
10 | const path = require("path");
11 | const events = path.basename(__filename, path.extname(__filename));
12 | if(!this.client.logs.get(member.guild.id)) return;
13 | if(this.client.settings.get(member.guild.id,"log_bots") !== true && member.user.bot) return;
14 | if (this.client.logs.get(member.guild.id, `${events}.enabled`) !== true)
15 | return;
16 | if (this.client.logs.get(member.guild.id, `${events}.channel_id`)) {
17 | const channel = member.guild.channels.cache.get(
18 | this.client.logs.get(member.guild.id, `${events}.channel_id`)
19 | );
20 | let emit_length = this.client.logs.get(member.guild.id,`${events}.emit_length`)
21 | emit_length+=1
22 | this.client.logs.set(member.guild.id,emit_length,`${events}.emit_length`)
23 | const language = new(require(`../languages/${this.client.settings.get(member.guild.id,"language")}.js`))
24 | return channel.send(language.get(events, member,oldVoiceChannel));
25 | }
26 | }
27 | }
--------------------------------------------------------------------------------
/events/voiceChannelMute.js:
--------------------------------------------------------------------------------
1 | const Discord = require("discord.js")
2 |
3 | module.exports = class {
4 |
5 | constructor (client) {
6 | this.client = client;
7 | }
8 |
9 | async run (member,muteType) {
10 | const path = require("path");
11 | const events = path.basename(__filename, path.extname(__filename));
12 | if(!this.client.logs.get(member.guild.id)) return;
13 | if(this.client.settings.get(member.guild.id,"log_bots") !== true && member.user.bot) return;
14 |
15 | if (this.client.logs.get(member.guild.id, `${events}.enabled`) !== true)
16 | return;
17 | if (this.client.logs.get(member.guild.id, `${events}.channel_id`)) {
18 | const channel = member.guild.channels.cache.get(
19 | this.client.logs.get(member.guild.id, `${events}.channel_id`)
20 | );
21 | let emit_length = this.client.logs.get(member.guild.id,`${events}.emit_length`)
22 | emit_length+=1
23 | this.client.logs.set(member.guild.id,emit_length,`${events}.emit_length`)
24 | const language = new(require(`../languages/${this.client.settings.get(member.guild.id,"language")}.js`))
25 | return channel.send(language.get(events, member));
26 | }
27 | }
28 | }
--------------------------------------------------------------------------------
/events/voiceChannelSwitch.js:
--------------------------------------------------------------------------------
1 | const Discord = require("discord.js")
2 |
3 | module.exports = class {
4 |
5 | constructor (client) {
6 | this.client = client;
7 | }
8 |
9 | async run (member,oldVoiceChannel,newVoiceChannel) {
10 | const path = require("path");
11 | const events = path.basename(__filename, path.extname(__filename));
12 | if(!this.client.logs.get(member.guild.id)) return;
13 | if(this.client.settings.get(member.guild.id,"log_bots") !== true && member.user.bot) return;
14 | if (this.client.logs.get(member.guild.id, `${events}.enabled`) !== true)
15 | return;
16 | if (this.client.logs.get(member.guild.id, `${events}.channel_id`)) {
17 | const channel = member.guild.channels.cache.get(
18 | this.client.logs.get(member.guild.id, `${events}.channel_id`)
19 | );
20 | let emit_length = this.client.logs.get(member.guild.id,`${events}.emit_length`)
21 | emit_length+=1
22 | this.client.logs.set(member.guild.id,emit_length,`${events}.emit_length`)
23 | const language = new(require(`../languages/${this.client.settings.get(member.guild.id,"language")}.js`))
24 | return channel.send(language.get(events, member,oldVoiceChannel,newVoiceChannel));
25 | }
26 | }
27 | }
--------------------------------------------------------------------------------
/events/voiceChannelUndeaf.js:
--------------------------------------------------------------------------------
1 | const Discord = require("discord.js")
2 |
3 | module.exports = class {
4 |
5 | constructor (client) {
6 | this.client = client;
7 | }
8 |
9 | async run (member,oldDeafType) {
10 | const path = require("path");
11 | const events = path.basename(__filename, path.extname(__filename));
12 | if(!this.client.logs.get(member.guild.id)) return;
13 | if(this.client.settings.get(member.guild.id,"log_bots") !== true && member.user.bot) return;
14 | if (this.client.logs.get(member.guild.id, `${events}.enabled`) !== true)
15 | return;
16 | if (this.client.logs.get(member.guild.id, `${events}.channel_id`)) {
17 | const channel = member.guild.channels.cache.get(
18 | this.client.logs.get(member.guild.id, `${events}.channel_id`)
19 | );
20 | let emit_length = this.client.logs.get(member.guild.id,`${events}.emit_length`)
21 | emit_length+=1
22 | this.client.logs.set(member.guild.id,emit_length,`${events}.emit_length`)
23 | const language = new(require(`../languages/${this.client.settings.get(member.guild.id,"language")}.js`))
24 | return channel.send(language.get(events, member));
25 | }
26 | }
27 | }
--------------------------------------------------------------------------------
/events/voiceChannelUnmute.js:
--------------------------------------------------------------------------------
1 | const Discord = require("discord.js")
2 |
3 | module.exports = class {
4 |
5 | constructor (client) {
6 | this.client = client;
7 | }
8 |
9 | async run (member,oldMuteType) {
10 | const path = require("path");
11 | const events = path.basename(__filename, path.extname(__filename));
12 | if(!this.client.logs.get(member.guild.id)) return;
13 | if(this.client.settings.get(member.guild.id,"log_bots") !== true && member.user.bot) return;
14 | if (this.client.logs.get(member.guild.id, `${events}.enabled`) !== true)
15 | return;
16 | if (this.client.logs.get(member.guild.id, `${events}.channel_id`)) {
17 | const channel = member.guild.channels.cache.get(
18 | this.client.logs.get(member.guild.id, `${events}.channel_id`)
19 | );
20 |
21 | let emit_length = this.client.logs.get(member.guild.id,`${events}.emit_length`)
22 | emit_length+=1
23 | this.client.logs.set(member.guild.id,emit_length,`${events}.emit_length`)
24 | const language = new(require(`../languages/${this.client.settings.get(member.guild.id,"language")}.js`))
25 | return channel.send(language.get(events, member));
26 | }
27 | }
28 | }
--------------------------------------------------------------------------------
/events/voiceStreamingStart.js:
--------------------------------------------------------------------------------
1 | const Discord = require("discord.js");
2 |
3 | module.exports = class {
4 | constructor(client) {
5 | this.client = client;
6 | }
7 |
8 | async run(member, voiceChannel) {
9 | const path = require("path");
10 | const events = path.basename(__filename, path.extname(__filename));
11 | if (!this.client.logs.get(member.guild.id)) return;
12 | if (
13 | this.client.settings.get(member.guild.id, "log_bots") !== true &&
14 | member.user.bot
15 | )
16 | return;
17 | if (this.client.logs.get(member.guild.id, `${events}.enabled`) !== true)
18 | return;
19 | if (this.client.logs.get(member.guild.id, `${events}.channel_id`)) {
20 | const channel = member.guild.channels.cache.get(
21 | this.client.logs.get(member.guild.id, `${events}.channel_id`)
22 | );
23 | let emit_length = this.client.logs.get(member.guild.id,`${events}.emit_length`)
24 | emit_length+=1
25 | this.client.logs.set(member.guild.id,emit_length,`${events}.emit_length`)
26 | const language = new (require(`../languages/${this.client.settings.get(
27 | member.guild.id,
28 | "language"
29 | )}.js`))();
30 | return channel.send(language.get(events, member, voiceChannel));
31 | }
32 | }
33 | };
34 |
--------------------------------------------------------------------------------
/events/voiceStreamingStop.js:
--------------------------------------------------------------------------------
1 | const Discord = require("discord.js");
2 |
3 | module.exports = class {
4 | constructor(client) {
5 | this.client = client;
6 | }
7 |
8 | async run(member, voiceChannel) {
9 | const path = require("path");
10 | const events = path.basename(__filename, path.extname(__filename));
11 | if (!this.client.logs.get(member.guild.id)) return;
12 | if (
13 | this.client.settings.get(member.guild.id, "log_bots") !== true &&
14 | member.user.bot
15 | )
16 | return;
17 | if (this.client.logs.get(member.guild.id, `${events}.enabled`) !== true)
18 | return;
19 | if (this.client.logs.get(member.guild.id, `${events}.channel_id`)) {
20 | const channel = member.guild.channels.cache.get(
21 | this.client.logs.get(member.guild.id, `${events}.channel_id`)
22 | );
23 | let emit_length = this.client.logs.get(member.guild.id,`${events}.emit_length`)
24 | emit_length+=1
25 | this.client.logs.set(member.guild.id,emit_length,`${events}.emit_length`)
26 | const language = new (require(`../languages/${this.client.settings.get(
27 | member.guild.id,
28 | "language"
29 | )}.js`))();
30 | return channel.send(language.get(events, member, voiceChannel));
31 | }
32 | }
33 | };
34 |
--------------------------------------------------------------------------------
/helpers/BetterEmbeds.js:
--------------------------------------------------------------------------------
1 | module.exports = class BetterEmbed {
2 | constructor(props) {
3 | this.title = props ? props.title : "";
4 | this.url = props ? props.url : "";
5 | this.description = props ? props.description : "";
6 | this.author = props ? props.author : "";
7 | this.author_icon = props ? props.author_icon : "";
8 | this.author_url = props ? props.author_url : "";
9 | this.image = props ? props.image : "";
10 | this.thumbnail = props ? props.thumbnail : "";
11 | this.footer = props ? props.footer : "LogsBot | By ShadowV#9339";
12 | this.footer_icon = props ? props.footer_icon : "https://cdn.discordapp.com/avatars/674568147029983242/4674f96376e052825c4ffa0994720a6c.png";
13 | this.timestamp = props ? props.timestamp : Date.now();
14 | this.color = props ? props.color : "#00abf5";
15 | this.fields = props ? props.fields : [];
16 | this.files = props ? props.files : [];
17 | }
18 | attachFiles(value) {
19 | this.files = this.files.concat(value);
20 | return this;
21 | }
22 | setTitle(value) {
23 | this.title = value;
24 | return this;
25 | }
26 |
27 | setDescription(value) {
28 | this.description = value;
29 | return this;
30 | }
31 | setAuthor(value, icon, url) {
32 | this.author = value;
33 | this.author_icon = icon;
34 | this.author_url = url;
35 | return this;
36 | }
37 |
38 | setImage(value) {
39 | this.image = value;
40 | return this;
41 | }
42 | setThumbnail(value) {
43 | this.thumbnail = value;
44 | return this;
45 | }
46 | setFooter(value, icon) {
47 | this.footer = value;
48 | this.footer_icon = icon;
49 | return this;
50 | }
51 | setTimestamp(value) {
52 | this.timestamp = value;
53 | return this;
54 | }
55 | setColor(value) {
56 | this.color = value;
57 | return this;
58 | }
59 | setUrl(value) {
60 | this.url = value;
61 | return this;
62 | }
63 | addField(name, value, inline = false) {
64 | this.fields.push({
65 | name: name,
66 | value: value,
67 | inline: inline
68 | });
69 | return this;
70 | }
71 | addBlankField(inline = false) {
72 | this.fields.push({
73 | name: "\u200B",
74 | value: "\u200B",
75 | inline: inline
76 | });
77 | return this;
78 | }
79 | build() {
80 | return {
81 | title: this.title ? this.title : undefined,
82 | files: this.files ? this.files : undefined,
83 | url: this.url ? this.url : undefined,
84 | description: this.description ? this.description : undefined,
85 | author: {
86 | name: this.author,
87 | icon_url: this.author_icon ? this.author_icon : undefined,
88 | url: this.author_url ? this.author_url : undefined
89 | },
90 | image: {
91 | url: this.image
92 | },
93 | thumbnail: {
94 | url: this.thumbnail
95 | },
96 | footer: {
97 | text: this.footer,
98 | icon_url: this.footer_icon ? this.footer_icon : undefined
99 | },
100 | timestamp: this.timestamp ? this.timestamp : undefined,
101 | color: this.color ? this.color : undefined,
102 | fields: this.fields ? this.fields : undefined
103 | };
104 | }
105 | };
106 |
--------------------------------------------------------------------------------
/helpers/logger.js:
--------------------------------------------------------------------------------
1 | const { bgBlue, black, green } = require("chalk");
2 |
3 | const dateTimePad = (value, digits) => {
4 | let number = value
5 | while (number.toString().length < digits) {
6 | number = "0" + number
7 | }
8 | return number;
9 | }
10 |
11 | const formatDate = (date = new Date()) => {
12 | return (date.getFullYear() + "-" +
13 | dateTimePad((date.getMonth() + 1), 2) + "-" +
14 | dateTimePad(date.getDate(), 2) + " " +
15 | dateTimePad(date.getHours(), 2) + ":" +
16 | dateTimePad(date.getMinutes(), 2) + ":" +
17 | dateTimePad(date.getSeconds(), 2) + "." +
18 | dateTimePad(date.getMilliseconds(), 3))
19 | }
20 |
21 | module.exports = class Logger {
22 | static log (content, type = "log") {
23 | const date = `[${formatDate()}]:`;
24 | switch (type) {
25 | // Check the message type and then print him in the console
26 | case "log": {
27 | return console.log(`${date} ${bgBlue(type.toUpperCase())} ${content} `);
28 | }
29 | case "warn": {
30 | return console.log(`${date} ${black.bgYellow(type.toUpperCase())} ${content} `);
31 | }
32 | case "error": {
33 | return console.log(`${date} ${black.bgRed(type.toUpperCase())} ${content} `);
34 | }
35 | case "debug": {
36 | return console.log(`${date} ${green(type.toUpperCase())} ${content} `);
37 | }
38 | case "cmd": {
39 | return console.log(`${date} ${black.bgWhite(type.toUpperCase())} ${content}`);
40 | }
41 | case "ready": {
42 | return console.log(`${date} ${black.bgGreen(type.toUpperCase())} ${content}`);
43 | }
44 | default: throw new TypeError("Logger type must be either warn, debug, log, ready, cmd or error.");
45 | }
46 | }
47 | };
--------------------------------------------------------------------------------
/helpers/permissions.js:
--------------------------------------------------------------------------------
1 | const config = require("../config");
2 |
3 | module.exports = [
4 | {
5 | level: 0,
6 | check: () => true,
7 | },
8 | {
9 | level: 1,
10 | check: (message) => (message.guild ? message.member.hasPermission("MANAGE_MESSAGES") : false),
11 | },
12 | {
13 | level: 2,
14 | check: (message) => (message.guild ? message.member.hasPermission("ADMINISTRATOR") : false),
15 | },
16 | {
17 | level: 3,
18 | check: (message) => (message.guild ? message.author.id === message.guild.ownerID : false),
19 | },
20 | {
21 | level: 4,
22 | check: (message) => config.owners.some((o) => o === message.author.id),
23 | },
24 | ];
--------------------------------------------------------------------------------
/index.js:
--------------------------------------------------------------------------------
1 | const {ShardingManager} = require('discord.js');
2 | const config = require('./config.js');;
3 | const manager = new ShardingManager('main.js', {
4 | totalShards: 1,
5 | respawn : true,
6 | token : config.token
7 | });
8 | manager.spawn()
--------------------------------------------------------------------------------
/languages/english.js:
--------------------------------------------------------------------------------
1 | const currentLanguage = "english",
2 | c = require("../config.js"),
3 | e = c.emojis;
4 |
5 | // This class is used to store languages strings
6 |
7 | module.exports = class {
8 | constructor() {
9 | this.language = {
10 | PERM_LEVELS: [
11 | "User",
12 | "Moderator",
13 | "Administrator",
14 | "Founder",
15 | "Ultimate"
16 | ],
17 |
18 | ERR_CMD_CLIENT_PERMISSIONS: perms =>
19 | `${
20 | e.error
21 | } __**Missing permissions**__\n\nI need the following permissions for this command to work properly: ${perms
22 | .map(p => "`" + p + "`")
23 | .join(", ")}`,
24 | ERR_CMD_USER_PERMISSIONS: (levelName, userLevel) =>
25 | `${e.error} | This command requires the level of permissions \`${levelName}\` (you are \`${userLevel}\`) !`,
26 | ERR_CMD_COOLDOWN: time =>
27 | `${e.error} | Hey, keep calm! Wait **${time}** second(s) before performing this command again!`,
28 | ERR_CMD_NSFW: `${e.error} | This command must be executed in a NSFW channel!`,
29 | ERR_CMD_DISABLED: `${e.error} | This command is currently disabled!`,
30 | ERR_OCCURRED: `${e.error} | An error has occurred. Please try again in a few minutes!`,
31 | ERR_CMD_GUILDONLY: `${e.error} | This command is not available in private messages!`,
32 |
33 | PREFIX_INFO: prefix =>
34 | `${e.success} | The prefix of this server is \`${prefix}\`!`,
35 |
36 | /* PING COMMAND */
37 | PING_DESCRIPTION: "Displays the bot latency!",
38 | PING_USAGE: "ping",
39 | PING_EXAMPLES: "$ping",
40 | PING_WAIT: `Pinging...`,
41 | PING_RESULT: ms => `${e.success} | Pong! Latency: \`${ms}\` ms!`,
42 |
43 | /* BUILD EMOJIS COMMAND */
44 | BUILD_EMOJIS_DESCRIPTION:
45 | "Automatically adds the emojis necessary for the bot to work properly and generates a configuration!",
46 | BUILD_EMOJIS_USAGE: "build-emojis",
47 | BUILD_EMOJIS_EXAMPLES: "$build-emojis",
48 | BUILD_EMOJIS_IN_PROGRESS: `${e.success} | Adding emojis is in progress...-`,
49 | BUILD_EMOJIS_INFOS: `${e.success} | Copy and paste this into your configuration!`,
50 |
51 | /* HELP COMMAND */
52 | HELP_TITLE: "List of commands",
53 | HELP_SUBTITLE: prefix =>
54 | `● To get help on a command type \`${prefix}help \` !`,
55 | HELP_HEADINGS: [
56 | `Help :`,
57 | `${e.help} Usage :`,
58 | `${e.search} Examples :`,
59 | `${e.folder} Group :`,
60 | `${e.description} Description :`,
61 | `${e.add} Aliases :`,
62 | `${e.crown} Permissions :`
63 | ],
64 | HELP_NO_ALIASES: "No alias.",
65 | HELP_ERR_NOT_FOUND: cmd => `${e.error} | Command \`${cmd}\` not found!`,
66 | HELP_USAGE: "help [command]",
67 | HELP_EXAMPLES: "$help\n$help logs",
68 | HELP_DESCRIPTION: "Displays the help menu.",
69 | /* SETUP */
70 | SETUP_USAGE: "setup",
71 | SETUP_EXAMPLES: "[Tap here](https://github.com/Shadowv7/LogsBot)",
72 | SETUP_DESCRIPTION: "Setup the logs.",
73 | /* LOGS */
74 | LOGS_USAGE: "logs",
75 | LOGS_EXAMPLES: "$logs",
76 | LOGS_DESCRIPTION: "Diplays the logs list.",
77 |
78 | /* guildMemberAdd */
79 | guildMemberAdd_TITLE: "Welcome",
80 | guildMemberAdd_NUMBER: "- {number}th member",
81 | guildMemberAdd_MESSAGE: "Welcome in {server}",
82 | /* guildMemberRemove */
83 | guildMemberRemove_TITLE: "Goodbye",
84 | guildMemberRemove_NUMBER: "- {number} members",
85 | guildMemberRemove_MESSAGE: "leaving from {server}",
86 | /* SETUP */
87 | NO_VALID_OPTION: option =>
88 | `${e.error} | \`${option}\` is not a valid option!`,
89 | OPTIONS_NAMES: names =>
90 | `${e.error} | Here is the list of options : ${names} !`,
91 | NO_LANGUAGE: `${e.error} | Please enter the language !`,
92 | LANGUAGES_LIST: lang =>
93 | `${e.error} | Here is the list of languages : ${lang} !`,
94 | EVENTS_LIST: lang =>
95 | `${e.error} | Here is the list of events : ${lang} !`,
96 | NEW_LANGUAGE: newlang => `${e.success} | I now speak ${newlang} !`,
97 | OLD_LANGUAGE: oldlang => `${e.error} | I already speak ${oldlang} !`,
98 | ALL_CHANNEL: channel =>
99 | `${e.success} | All logs will be sent to ${channel} !`,
100 | CHANNEL_SET_SUCCESS: (event, channel) =>
101 | `${e.success} | Logs \`${event}\` will be sent to ${channel} !`,
102 | ALREADY_SET_CHANNEL: `${e.error} | This channel is already for these logs !`,
103 | ALL_ENABLE: `${e.success} | All logs are enabled !`,
104 | ALL_DISABLE: `${e.success} | All logs are disabled!`,
105 | ALREADY_ENABLE: event =>
106 | `${e.error} | Logs \`${event}\` are already enabled !`,
107 | ALREADY_DISABLE: event =>
108 | `${e.error} | Logs \`${event}\` are already disabled!`,
109 | SUCCESS_DISABLE: events =>
110 | `${e.success} | Logs \`${events}\` are now disabled !`,
111 | SUCCESS_ENABLE: events =>
112 | `${e.success} | Logs \`${events}\` are now enabled !`,
113 | NO_CHANNEL: `${e.error} | Please mention the channel !`,
114 | ALL_CHANNEL_ALREADY_SET: `${e.error} | All the logs are already on this channel !`,
115 | ALL_ENABLE_ALREADY: `${e.error} | All logs are already enabled !`,
116 | ALL_DISABLE_ALREADY: `${e.error} | All logs are already disabled !`,
117 | guildMemberBoost: user =>
118 | `${e.success} | \`${user.user.tag}\` boosted the server !`,
119 | guildMemberUnboost: user =>
120 | `${e.success} | \`${user.user.tag}\` unboosted the server !`,
121 | guildMemberRoleAdd: (user, role) =>
122 | `${e.success} | \`${user.user.tag}\` now has the role \`${role.name}\` !`,
123 | guildMemberRoleRemove: (user, role) =>
124 | `${e.success} | \`${user.user.tag}\` now no longer has the role \`${role.name}\` !`,
125 | guildBoostLevelUp: newLevel =>
126 | `${e.success} | :tada: The server has increased in level by boost! It is now level \`${newLevel}\` !`,
127 | guildBoostLevelDown: newLevel =>
128 | `${e.success} | The server has decreased in level by boost :( ! It is now level \`${newLevel}\` !`,
129 | guildMemberNicknameUpdate: (member, oldnick, newnick) =>
130 | `${e.success} | ${member.user.username} changed his nickname! His new nickname is \`${newnick}\` !`,
131 | guildRegionUpdate: (guild, oldRegion, newRegion) =>
132 | `${e.success} | The server has changed region! The region was \`${oldRegion}\` and is now \`${newRegion}\` !`,
133 | guildBannerAdd: (guild, bannerURL) =>
134 | `${e.success} | The server added a banner! Here is the link of the banner : \`${bannerURL}\``,
135 | guildVanityURLAdd: (guild, vanityURL) =>
136 | `${e.success} | The server added a vanityURL! Here is the link : \`https://discord.gg/${vanityURL}\``,
137 | guildAfkChannelAdd: (guild, afkChannel) =>
138 | `${e.success} | The server has added an AFK lounge! The name of the channel is ${afkChannel.name} !`,
139 | messagePinned: message =>
140 | `${e.success} | This [message](https://discordapp.com/channels/${message.guild.id}/${message.channel.id}/${message.id}) has been pinned !`,
141 | guildMemberOnline: (member, newStatus) =>
142 | `${e.success} | \`${member.user.username}\` is now \`${newStatus}\` !`,
143 | guildMemberOffline: (member, oldStatus) =>
144 | `${e.success} | \`${member.user.username}\` is now \`offline\` !`,
145 | rolePositionUpdate: (role, oldPosition, newPosition) =>
146 | `${e.success} | Le rôle \`${role.name}\` a changé de position ! Il est maintenant à la position \`${newPosition}\` !`,
147 | voiceChannelDeaf: member =>
148 | `${e.success} | \`${member.user.username}\` is now deaf !`,
149 | voiceChannelUndeaf: member =>
150 | `${e.success} | \`${member.user.username}\` is now undeaf !`,
151 | voiceChannelJoin: (member, channel) =>
152 | `${e.success} | \`${member.user.username}\` has joined the channel \`${channel.name}\` !`,
153 | voiceChannelLeave: (member, channel) =>
154 | `${e.success} | \`${member.user.username}\` has left the channel \`${channel.name}\` !`,
155 | voiceChannelMute: member =>
156 | `${e.success} | \`${member.user.username}\` is now mute!`,
157 | voiceChannelUnmute: member =>
158 | `${e.success} | \`${member.user.username}\` is now unmute !`,
159 | messageContentEdited: (message, oldContent, newContent) =>
160 | `${e.success} | Message who contented : \`${oldContent}\` has been edited to : \`${newContent}\` by \`${message.author.tag}\` in ${message.channel} !`,
161 | voiceStreamingStart: (member, voiceChannel) =>
162 | `${e.success} | \`${member.user.tag}\` started streaming in ${voiceChannel} !`,
163 | voiceStreamingStop: member =>
164 | `${e.success} | \`${member.user.tag}\` stopped streaming !`,
165 | voiceChannelSwitch: (member, oldChannel, newChannel) =>
166 | `${e.success} | \`${member.user.tag}\` left \`${oldChannel.name}\` and joined \`${newChannel.name}\` !`,
167 | messageDelete: (message, tag) =>
168 | `${e.success} | The message \`${message.content.replace(
169 | /[`]/gi,
170 | ""
171 | )}\` of \`${message.author.tag}\` has been deleted by \`${tag}\` in ${
172 | message.channel
173 | } !`,
174 | NO_PREMIUM: `${e.error} | This guild isn't premium!`,
175 | LOG_BOTS_ENABLE: `${e.success} | log_bots is now enable !`,
176 | LOG_BOTS_DISABLE: `${e.success} | log_bots is now disable !`,
177 | ALREADY_ENABLE_BOT: `${e.error} | log_bots is already enabled !`,
178 | ALREADY_DISABLE_BOT: `${e.error} | lof_bots is already disabled !`,
179 | inviteCreate: invite =>
180 | `${e.success} | ${invite.inviter.username} created an invitation : \`${invite.url}\`.`,
181 | inviteDelete: invite =>
182 | `${e.success} | The invite \`${invite.url}\` has been deleted.`,
183 | guildBanAdd: (guild, user, author) =>
184 | `${e.success} | \`${user.username}\` has been banned from the server by \`${author}\` !`,
185 | guildBanRemove: (guild, user, author) =>
186 | `${e.success} | \`${user.username}\` is no longer banned from the server by \`${author}\` !`,
187 | roleCreate: (role, author) =>
188 | `${e.success} | The role \`${role.name}\` has been created by \`${author}\` !`,
189 | roleDelete: (role, author) =>
190 | `${e.success} | The role \`${role.name}\` has been deleted by \`${author}\`!`,
191 | channelCreate: (channel, user) =>
192 | `${e.success} | The \`${channel.type}\` channel ${channel} has been created by \`${user}\`!`,
193 | channelDelete: (channel, user) =>
194 | `${e.success} | Le \`${channel.type}\` channel \`${channel.name}\` has been deleted by \`${user} \`!`,
195 | emojiCreate: (emoji, author) =>
196 | `${e.success} | The emoji ${emoji} has been created by \`${author}\`: \`${emoji}\`!`,
197 | emojiDelete: (emoji, author) =>
198 | `${e.success} | The \`${emoji.name}\` has been deleted by \`${author}\`!`,
199 | NO_ARGS_STATS: `${e.error} | Please choose an option between \`all\` , \`guild\` , \`guildMember\` , \`message\` , \`only\` , \`other\` or \`voice\` !`,
200 | EMIT_DESCRIPTION: (event, number, total) =>
201 | `\`${event}\` logs has been emited \`${number}\` time (\`${Math.round(
202 | (number / total) * 100 * 100
203 | ) / 100}%\`) !`,
204 | ERROR_TYPE: `${e.error} | This channel isn't a \`text\` channel !`,
205 | STATS_EXAMPLES: "$stats guild\n$stats all",
206 | STATS_USAGE: "stats ",
207 | STATS_DESCRIPTION: "Displays a graph of the emitted logs.",
208 | monthIndex: [
209 | "Jan",
210 | "Feb",
211 | "March",
212 | "Apr",
213 | "May",
214 | "June",
215 | "July",
216 | "August",
217 | "Sept",
218 | "Oct",
219 | "Nov",
220 | "Dec"
221 | ],
222 | INVALID_NUMBER: n => `${e.error} | ${n} isn't a valid number !`,
223 | content_role: (total, percent, days) =>
224 | `**${total}** roles (i.e. **${percent}%** roles of the server) has been created from ${
225 | days[0]
226 | } to ${days[1]}:`,
227 | content_emoji: (total, percent, days) =>
228 | `**${total}** emojis (i.e. **${percent}%** emojis of the server) has been created from ${
229 | days[0]
230 | } to ${days[1]}:`,
231 | content_member: (total, percent, days) =>
232 | `**${total}** members (i.e. **${percent}%** of the server) have joined the server from ${
233 | days[0]
234 | } to ${days[1]}:`,
235 | content_channel: (total, percent, days) =>
236 | `**${total}** channels (i.e. **${percent}%** channels of the server) has been created from ${
237 | days[0]
238 | } to ${days[1]}:`,
239 |
240 | NO_ARGS_ONLY: `${e.error} | Please choose an option between \`channel\` , \`member\` , \`role\` or \`emoji\` !`
241 | };
242 | }
243 |
244 | /**
245 | * The method to get language strings
246 | * @param {string} term The string or function to look up
247 | * @param {...*} args Any arguments to pass to the lookup
248 | * @returns {string|Function}
249 | */
250 | get(term, ...args) {
251 | const value = this.language[term];
252 | switch (typeof value) {
253 | case "function":
254 | return value(...args);
255 | default:
256 | return value;
257 | }
258 | }
259 |
260 | getLang() {
261 | return lang;
262 | }
263 |
264 | printDate(pdate, isLongDate) {
265 | const monthNames = [
266 | "January",
267 | "February",
268 | "March",
269 | "April",
270 | "May",
271 | "June",
272 | "July",
273 | "August",
274 | "September",
275 | "October",
276 | "November",
277 | "December"
278 | ];
279 | let day = pdate.getDate(),
280 | monthIndex = pdate.getMonth(),
281 | year = pdate.getFullYear(),
282 | hour = pdate.getHours() < 10 ? "0" + pdate.getHours() : pdate.getHours(),
283 | minute =
284 | pdate.getMinutes() < 10 ? "0" + pdate.getMinutes() : pdate.getMinutes();
285 |
286 | let thedate = isLongDate
287 | ? day +
288 | " " +
289 | monthNames[monthIndex] +
290 | " " +
291 | year +
292 | " at " +
293 | hour +
294 | "h" +
295 | minute
296 | : day + " " + monthNames[monthIndex] + " " + year;
297 | return thedate;
298 | }
299 |
300 | /**
301 | * Parse ms and returns a string
302 | * @param {number} milliseconds The amount of milliseconds
303 | * @returns The parsed milliseconds
304 | */
305 | convertMs(milliseconds) {
306 | let roundTowardsZero = milliseconds > 0 ? Math.floor : Math.ceil;
307 | let days = roundTowardsZero(milliseconds / 86400000),
308 | hours = roundTowardsZero(milliseconds / 3600000) % 24,
309 | minutes = roundTowardsZero(milliseconds / 60000) % 60,
310 | seconds = roundTowardsZero(milliseconds / 1000) % 60;
311 | if (seconds === 0) seconds++;
312 | let isDays = days > 0,
313 | isHours = hours > 0,
314 | isMinutes = minutes > 0;
315 | let pattern =
316 | (!isDays
317 | ? ""
318 | : isMinutes || isHours
319 | ? "{days} days, "
320 | : "{days} days and ") +
321 | (!isHours ? "" : isMinutes ? "{hours} hours, " : "{hours} hours and ") +
322 | (!isMinutes ? "" : "{minutes} minutes and ") +
323 | "{seconds} seconds";
324 | let sentence = pattern
325 | .replace("{duration}", pattern)
326 | .replace("{days}", days)
327 | .replace("{hours}", hours)
328 | .replace("{minutes}", minutes)
329 | .replace("{seconds}", seconds);
330 | return sentence;
331 | }
332 | };
333 |
--------------------------------------------------------------------------------
/languages/french.js:
--------------------------------------------------------------------------------
1 | const currentLanguage = "french",
2 | c = require("../config.js"),
3 | e = c.emojis;
4 |
5 | // This class is used to store languages strings
6 |
7 | module.exports = class {
8 | constructor() {
9 | this.language = {
10 | PERM_LEVELS: [
11 | "Utilisateur",
12 | "Modérateur",
13 | "Administrateur",
14 | "Fondateur",
15 | "Suprême"
16 | ],
17 |
18 | ERR_CMD_CLIENT_PERMISSIONS: perms =>
19 | `${
20 | e.error
21 | } __**Permissions manquantes**__\n\nJ'ai besoin des permissions suivantes pour le bon fonctionnement de cette commande : ${perms
22 | .map(p => "`" + p + "`")
23 | .join(", ")}`,
24 | ERR_CMD_USER_PERMISSIONS: (levelName, userLevel) =>
25 | `${e.error} | Cette commande nécessite le niveau de permissions \`${levelName}\` (vous êtes \`${userLevel}\`) !`,
26 | ERR_CMD_COOLDOWN: time =>
27 | `${e.error} | Hey, restez calme ! Attendez **${time}** seconde(s) avant d'effectuer de nouveau cette commande !`,
28 | ERR_CMD_NSFW: `${e.error} | Cette commande doit être exécutée dans un salon NSFW !`,
29 | ERR_CMD_DISABLED: `${e.error} | Cette commande est actuellement désactivée !`,
30 | ERR_OCCURRED: `${e.error} | Une erreur est survenue. Veuillez réessayez dans quelques minutes !`,
31 | ERR_CMD_GUILDONLY: `${e.error} | Cette commande n'est pas disponible en messages privés !`,
32 |
33 | PREFIX_INFO: prefix =>
34 | `${e.success} | Le préfixe de ce serveur est \`${prefix}\` !`,
35 |
36 | /* PING COMMAND */
37 | PING_DESCRIPTION: "Affiche la latence du bot !",
38 | PING_USAGE: "ping",
39 | PING_EXAMPLES: "$ping",
40 | PING_WAIT: `Ping en cours...`,
41 | PING_RESULT: ms => `${e.success} | Pong ! Latence: \`${ms}\` ms !`,
42 |
43 | /* BUILD EMOJIS COMMAND */
44 | BUILD_EMOJIS_DESCRIPTION:
45 | "Ajoute automatiquement les émojis nécessaires au bon fonctionnement du bot et génère une configuration !",
46 | BUILD_EMOJIS_USAGE: "build-emojis",
47 | BUILD_EMOJIS_EXAMPLES: "$build-emojis",
48 | BUILD_EMOJIS_IN_PROGRESS: `${e.success} | Ajout des émojis en cours...`,
49 | BUILD_EMOJIS_INFOS: `${e.success} | Copiez-collez ceci dans votre configuration !`,
50 |
51 | /* HELP COMMAND */
52 | HELP_TITLE: "Liste des commandes",
53 | HELP_SUBTITLE: prefix =>
54 | `● Pour avoir de l'aide sur une commande tapez \`${prefix}help \` !`,
55 | HELP_HEADINGS: [
56 | `Aide :`,
57 | `${e.help} Utilisation :`,
58 | `${e.search} Exemples :`,
59 | `${e.folder} Groupe :`,
60 | `${e.description} Description :`,
61 | `${e.add} Alias :`,
62 | `${e.crown} Permissions :`
63 | ],
64 | HELP_NO_ALIASES: "Aucun alias.",
65 | HELP_ERR_NOT_FOUND: cmd =>
66 | `${e.error} | Commande \`${cmd}\` introuvable !`,
67 | HELP_USAGE: "help [commande]",
68 | HELP_EXAMPLES: "$help\n$help logs",
69 | HELP_DESCRIPTION: "Affiche le menu d'aide.",
70 | /* SETUP */
71 | SETUP_USAGE: "setup",
72 | SETUP_EXAMPLES: "[Cliquez ici](https://github.com/Shadowv7/LogsBot)",
73 | SETUP_DESCRIPTION: "Met en place les logs.",
74 | /* LOGS */
75 | LOGS_USAGE: "logs",
76 | LOGS_EXAMPLES: "$logs",
77 | LOGS_DESCRIPTION: "Affiche la liste de logs.",
78 |
79 | /* guildMemberAdd */
80 | guildMemberAdd_TITLE: "Bienvenue",
81 | guildMemberAdd_NUMBER: "- {number}ème membres",
82 | guildMemberAdd_MESSAGE: "Bienvenue sur {server}",
83 | /* guildMemberRemove */
84 | guildMemberRemove_TITLE: "Aurevoir",
85 | guildMemberRemove_NUMBER: "- {number}ème membres",
86 | guildMemberRemove_MESSAGE: "A quitté {server}",
87 | /* SETUP */
88 | NO_VALID_OPTION: option =>
89 | `${e.error} | \`${option}\` n'est pas une option valide !`,
90 | OPTIONS_NAMES: names =>
91 | `${e.error} | Voici la liste des options : ${names} !`,
92 | NO_LANGUAGE: `${e.error} | Veuillez saisir le langage !`,
93 | LANGUAGES_LIST: lang =>
94 | `${e.error} | Voici la liste des langues : ${lang} !`,
95 | EVENTS_LIST: lang => `${e.error} | Voici la liste des events : ${lang} !`,
96 | NEW_LANGUAGE: newlang =>
97 | `${e.success} | Je parle maintenant ${newlang} !`,
98 | OLD_LANGUAGE: oldlang => `${e.error} | Je parle déjà ${oldlang} !`,
99 | ALL_CHANNEL: channel =>
100 | `${e.success} | Tous les logs seront envoyés dans ${channel} !`,
101 | CHANNEL_SET_SUCCESS: (event, channel) =>
102 | `${e.success} | Les logs \`${event}\` seront envoyés dans ${channel} !`,
103 | ALREADY_SET_CHANNEL: `${e.error} | Ce salon est déjà pour ces logs !`,
104 | ALL_ENABLE: `${e.success} | Tous les logs sont activé !`,
105 | ALL_DISABLE: `${e.success} | Tous les logs sont désactivé !`,
106 | ALREADY_ENABLE: event =>
107 | `${e.error} | Les logs \`${event}\` sont déjà activé !`,
108 | ALREADY_DISABLE: event =>
109 | `${e.error} | Les logs \`${event}\` sont déjà désactivé !`,
110 | SUCCESS_DISABLE: events =>
111 | `${e.success} | Les logs \`${events}\` sont maintenant désactivé !`,
112 | SUCCESS_ENABLE: events =>
113 | `${e.success} | Les logs \`${events}\` sont maintenant activé !`,
114 | ALL_CHANNEL_ALREADY_SET: `${e.error} | Tous les logs sont déjà sur ce salon !`,
115 | ALL_ENABLE_ALREADY: `${e.error} | Tous les logs sont déjà activé !`,
116 | ALL_DISABLE_ALREADY: `${e.error} | Tous les logs sont déjà désactivé !`,
117 | NO_CHANNEL: `${e.error} | Veuillez mentionner le salon !`,
118 | guildMemberBoost: user =>
119 | `${e.success} | \`${user.user.tag}\` a boosté le serveur !`,
120 | guildMemberUnboost: user =>
121 | `${e.success} | \`${user.user.tag}\` a arrêté de booster le serveur !`,
122 | guildMemberRoleAdd: (user, role) =>
123 | `${e.success} | \`${user.user.tag}\` possède désormais le rôle \`${role.name}\` !`,
124 | guildMemberRoleRemove: (user, role) =>
125 | `${e.success} | \`${user.user.tag}\` possède désormais plus le rôle \`${role.name}\` !`,
126 | guildBoostLevelUp: newLevel =>
127 | `${e.success} | :tada: Le serveur a augmenté de niveau en boost ! Il est maintenant niveau \`${newLevel}\` !`,
128 | guildBoostLevelDown: newLevel =>
129 | `${e.success} | Le serveur a baissé de niveau en boost :( ! Il est maintenant niveau \`${newLevel}\` !`,
130 | guildMemberNicknameUpdate: (member, oldnick, newnick) =>
131 | `${e.success} | ${member.user.username} a changé de surnom ! Son nouveau surnom est \`${newnick}\` !`,
132 | guildRegionUpdate: (guild, oldRegion, newRegion) =>
133 | `${e.success} | Le serveur a changé de région ! La région était \`${oldRegion}\` et est maintenant \`${newRegion}\` !`,
134 | guildBannerAdd: (guild, bannerURL) =>
135 | `${e.success} | Le serveur a ajouté un bannière ! Voici le lien de la bannière : \`${bannerURL}\``,
136 | guildVanityURLAdd: (guild, vanityURL) =>
137 | `${e.success} | Le serveur a ajouté une vanityURL ! Voici l'url : \`https://discord.gg/${vanityURL}\``,
138 | guildAfkChannelAdd: (guild, afkChannel) =>
139 | `${e.success} | Le serveur a ajouté un salon AFK ! Le nom du salon est ${afkChannel.name} !`,
140 | messagePinned: message =>
141 | `${e.success} | Ce [message](https://discordapp.com/channels/${message.guild.id}/${message.channel.id}/${message.id}) a été épinglé !`,
142 | guildMemberOnline: (member, newStatus) =>
143 | `${e.success} | \`${member.user.username}\` est maintenant \`${newStatus}\` !`,
144 | guildMemberOffline: (member, oldStatus) =>
145 | `${e.success} | \`${member.user.username}\` est maintenant \`Hors-ligne\` !`,
146 | rolePositionUpdate: (role, oldPosition, newPosition) =>
147 | `${e.success} | Le rôle \`${role.name}\` a changé de position ! Il est maintenant à la position \`${newPosition}\` !`,
148 | voiceChannelDeaf: member =>
149 | `${e.success} | \`${member.user.username}\` est en sourd !`,
150 | voiceChannelUndeaf: member =>
151 | `${e.success} | \`${member.user.username}\` n'est plus en sourd !`,
152 | voiceChannelJoin: (member, channel) =>
153 | `${e.success} | \`${member.user.username}\` a rejoint le salon \`${channel.name}\` !`,
154 | voiceChannelLeave: (member, channel) =>
155 | `${e.success} | \`${member.user.username}\` a quitté le salon \`${channel.name}\` !`,
156 | voiceChannelMute: member =>
157 | `${e.success} | \`${member.user.username}\` est mute !`,
158 | voiceChannelUnmute: member =>
159 | `${e.success} | \`${member.user.username}\` n'est plus en mute !`,
160 | messageContentEdited: (message, oldContent, newContent) =>
161 | `${e.success} | Le message qui contenait : \`${oldContent}\` a été modifier en \`${newContent}\` par \`${message.author.tag}\` dans ${message.channel} !`,
162 | voiceStreamingStart: (member, voiceChannel) =>
163 | `${e.success} | \`${member.user.tag}\` a commencé un stream dans ${voiceChannel} !`,
164 | voiceStreamingStop: member =>
165 | `${e.success} | \`${member.user.tag}\` a arrêté son stream !`,
166 | voiceChannelSwitch: (member, oldChannel, newChannel) =>
167 | `${e.success} | ${member.user.tag} a quitté \`${oldChannel.name}\` et a rejoint \`${newChannel.name}\` !`,
168 | messageDelete: (message, tag) =>
169 | `${e.success} | Le message \`${message.content.replace(
170 | /[`]/gi,
171 | ""
172 | )}\` de \`${message.author.tag}\` a été supprimé par \`${tag}\` dans ${
173 | message.channel
174 | } !`,
175 | NO_PREMIUM: `${e.error} | Ce serveur n'est pas premium !`,
176 | LOG_BOTS_ENABLE: `${e.success} | log_bots est maintenant activé !`,
177 | LOG_BOTS_DISABLE: `${e.success} | log_bots est maintenant désactivé !`,
178 | ALREADY_ENABLE_BOT: `${e.error} | log_bots est déjà activé !`,
179 | ALREADY_DISABLE_BOT: `${e.error} | log_bots est déjà désactivé !`,
180 | inviteCreate: (invite, author) =>
181 | `${e.success} | \`${invite.inviter.username}\` a crée une invitation : \`${invite.url}\`.`,
182 | inviteDelete: (invite, author) =>
183 | `${e.success} | L'invitation \`${invite.url}\` a été supprimé par par \`${author}\`.`,
184 | guildBanAdd: (guild, user, author) =>
185 | `${e.success} | \`${user.username}\` a été banni du serveur par \`${author}\` !`,
186 | guildBanRemove: (guild, user, author) =>
187 | `${e.success} | \`${user.username}\` n'est plus banni du serveur grâce à \`${author}\` !`,
188 | roleCreate: (role, author) =>
189 | `${e.success} | Le rôle \`${role.name}\` a été crée par par \`${author}\` !`,
190 | roleDelete: (role, author) =>
191 | `${e.success} | Le rôle \`${role.name}\` a été supprimé par \`${author}\` !`,
192 | channelCreate: (channel, user) =>
193 | `${e.success} | Le salon ${channel} de type \`${channel.type}\` a été crée par \`${user}\` !`,
194 | channelDelete: (channel, user) =>
195 | `${e.success} | Le salon \`${channel.name}\` de type \`${channel.type}\` a été supprimé par \`${user} \` !`,
196 | emojiCreate: (emoji, author) =>
197 | `${e.success} | L'émoji ${emoji} a été crée par par \`${author}\` : \`${emoji}\`!`,
198 | emojiDelete: (emoji, author) =>
199 | `${e.success} | L'émoji \`${emoji.name}\` a été supprimé par \`${author}\`!`,
200 | NO_ARGS_STATS: `${e.error} | Veuillez choisir une option entre \`all\` , \`guild\` , \`guildMember\` , \`message\` , \`only\` , \`other\` ou \`voice\` !`,
201 | ERROR_TYPE: `${e.error} | Le salon doit être un salon \`textuel\` !`,
202 | EMIT_DESCRIPTION: (event, number, total) =>
203 | `Les logs ${event} ont été emis ${number} fois ${Math.round(
204 | (number / total) * 100
205 | ) / 100}%!`,
206 | STATS_EXAMPLES: "$stats guild\n$stats all",
207 | STATS_USAGE: "stats ",
208 | STATS_DESCRIPTION: "Affiche un graphique des logs émis.",
209 | monthIndex: [
210 | "Janv",
211 | "Févr",
212 | "Mars",
213 | "Avr",
214 | "Mai",
215 | "Juin",
216 | "Juill",
217 | "Août",
218 | "Sept",
219 | "Oct",
220 | "Nov",
221 | "Déc"
222 | ],
223 | NO_ARGS_ONLY: `${e.error} | Veuillez choisir entre \`channel\` , \`member\` , \`role\` ou \`emoji\`!`,
224 | content_role: (total, percent, days) =>
225 | `**${total}** roles (soit **${percent}%** des roles du serveur) ont été crée du ${
226 | days[0]
227 | } au ${days[1]} :`,
228 | content_emoji: (total, percent, days) =>
229 | `**${total}** emojis (soit **${percent}%** des emojis du serveur) ont été crée du ${
230 | days[0]
231 | } au ${days[1]} :`,
232 | content_member: (total, percent, days) =>
233 | `**${total}** membres (soit **${percent}%** du serveur) ont rejoint du ${
234 | days[0]
235 | } au ${days[1]} :`,
236 | content_channel: (total, percent, days) =>
237 | `**${total}** salons (soit **${percent}%** des salons du serveur) ont été crée du ${
238 | days[0]
239 | } au ${days[1]} :`,
240 | INVALID_NUMBER: n => `${e.error} | ${n} n'est pas un nombre valide !`
241 | };
242 | }
243 |
244 | /**
245 | * The method to get language strings
246 | * @param {string} term The string or function to look up
247 | * @param {...*} args Any arguments to pass to the lookup
248 | * @returns {string|Function}
249 | */
250 | get(term, ...args) {
251 | const value = this.language[term];
252 | switch (typeof value) {
253 | case "function":
254 | return value(...args);
255 | default:
256 | return value;
257 | }
258 | }
259 |
260 | getLang() {
261 | return lang;
262 | }
263 |
264 | printDate(pdate, isLongDate) {
265 | const monthNames = [
266 | "janvier",
267 | "février",
268 | "mars",
269 | "avril",
270 | "mai",
271 | "juin",
272 | "juillet",
273 | "août",
274 | "septembre",
275 | "octobre",
276 | "novembre",
277 | "décembre"
278 | ];
279 | let day = pdate.getDate(),
280 | monthIndex = pdate.getMonth(),
281 | year = pdate.getFullYear(),
282 | hour = pdate.getHours() < 10 ? "0" + pdate.getHours() : pdate.getHours(),
283 | minute =
284 | pdate.getMinutes() < 10 ? "0" + pdate.getMinutes() : pdate.getMinutes();
285 |
286 | let thedate = isLongDate
287 | ? day +
288 | " " +
289 | monthNames[monthIndex] +
290 | " " +
291 | year +
292 | " at " +
293 | hour +
294 | "h" +
295 | minute
296 | : day + " " + monthNames[monthIndex] + " " + year;
297 | return thedate;
298 | }
299 |
300 | /**
301 | * Parse ms and returns a string
302 | * @param {number} milliseconds The amount of milliseconds
303 | * @returns The parsed milliseconds
304 | */
305 | convertMs(milliseconds) {
306 | let roundTowardsZero = milliseconds > 0 ? Math.floor : Math.ceil;
307 | let days = roundTowardsZero(milliseconds / 86400000),
308 | hours = roundTowardsZero(milliseconds / 3600000) % 24,
309 | minutes = roundTowardsZero(milliseconds / 60000) % 60,
310 | seconds = roundTowardsZero(milliseconds / 1000) % 60;
311 | if (seconds === 0) seconds++;
312 | let isDays = days > 0,
313 | isHours = hours > 0,
314 | isMinutes = minutes > 0;
315 | let pattern =
316 | (!isDays
317 | ? ""
318 | : isMinutes || isHours
319 | ? "{days} jours, "
320 | : "{days} jours et ") +
321 | (!isHours ? "" : isMinutes ? "{hours} heures, " : "{hours} heures et ") +
322 | (!isMinutes ? "" : "{minutes} minutes et ") +
323 | "{seconds} secondes";
324 | let sentence = pattern
325 | .replace("{duration}", pattern)
326 | .replace("{days}", days)
327 | .replace("{hours}", hours)
328 | .replace("{minutes}", minutes)
329 | .replace("{seconds}", seconds);
330 | return sentence;
331 | }
332 | };
333 |
--------------------------------------------------------------------------------
/main.js:
--------------------------------------------------------------------------------
1 | const util = require("util"),
2 | fs = require("fs"),
3 | readdir = util.promisify(fs.readdir),
4 | permissions = require("./helpers/permissions");
5 | //const website = require("./website-logsbot/app")
6 | const Client = require("./structures/Client"),
7 | client = new Client();
8 |
9 | const http = require("https");
10 | setInterval(() => {
11 | http.get("https://logsbot-website.glitch.me/");
12 | //http.get("https://webhook-logs.glitch.me/");
13 | }, 6 * 1000);
14 | //job.start();
15 | const init = async () => {
16 | // Searches and loads all commands in all categories
17 | let categories = await readdir("./commands/");
18 | client.logger.log(
19 | `Loading a total of ${categories.length} categories.`,
20 | "log"
21 | );
22 | categories.forEach(async cat => {
23 | let commands = await readdir(`./commands/${cat}/`);
24 | commands
25 | .filter(cmd => cmd.split(".").pop() === "js")
26 | .forEach(cmd => {
27 | const response = client.loadCommand(`./commands/${cat}`, cmd);
28 | if (response) client.logger.log(response, "error");
29 | });
30 | });
31 |
32 | // Searches and loads all events, like the ready event
33 | const evtFiles = await readdir("./events/");
34 | client.logger.log(`Loading a total of ${evtFiles.length} events.`, "log");
35 | evtFiles.forEach(file => {
36 | const eventName = file.split(".")[0];
37 | client.logger.log(`Loading Event: ${eventName}`);
38 | const event = new (require(`./events/${file}`))(client);
39 | client.on(eventName, (...args) => event.run(...args));
40 | delete require.cache[require.resolve(`./events/${file}`)];
41 | });
42 |
43 | client.login(client.config.token); // Log in to the discord api
44 | };
45 |
46 | init();
47 | client.on("disconnect", () => client.logger.log("Bot is disconnecting...", "warn"))
48 | .on("reconnecting", () => client.logger.log("Bot reconnecting...", "log"))
49 | .on("error", (e) => client.logger.log(e, "error"))
50 | .on("warn", (info) => client.logger.log(info, "warn"));
51 |
52 | // if there is an unhandledRejection, log them
53 | process.on("unhandledRejection", (err) => {
54 | client.logger.log("Uncaught Promise Error: "+err, "error");
55 | });
56 | module.exports = client;
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "logs-bot",
3 | "version": "1.0.2",
4 | "description": "A simple Node app built on Express, instantly up and running.",
5 | "main": "main.js",
6 | "scripts": {
7 | "start": "node index.js"
8 | },
9 | "dependencies": {
10 | "discord.js": "^12.0.2",
11 | "discord-logs": "^1.7.4",
12 | "chalk": "^3.0.0",
13 | "enmap": "^5.2.4",
14 | "better-sqlite-pool": "^0.2.3",
15 | "path": "^0.12.7",
16 | "discord-canvas": "^1.1.0",
17 | "morgan": "^1.9.1",
18 | "https": "^1.0.0",
19 | "abcapi": "github:Arcane-Bot-Center/abcAPI",
20 | "ddblapi.js": "^1.0.0",
21 | "axios": "^0.19.2",
22 | "chartjs-node-canvas": "^3.0.6",
23 | "chart.js": "^2.9.3",
24 | "luxon": "^1.22.0"
25 | },
26 | "engines": {
27 | "node": "12.0.0"
28 | },
29 | "license": "MIT",
30 | "keywords": [
31 | "node",
32 | "glitch",
33 | "express"
34 | ]
35 | }
--------------------------------------------------------------------------------
/shrinkwrap.yaml:
--------------------------------------------------------------------------------
1 | dependencies:
2 | abcapi: github.com/Arcane-Bot-Center/abcAPI/6a2b19a3ffffa33a555a524eca1956612c3dcdfa
3 | axios: 0.19.2
4 | better-sqlite-pool: 0.2.3
5 | chalk: 3.0.0
6 | chart.js: 2.9.3
7 | chartjs-node-canvas: 3.0.6
8 | ddblapi.js: 1.0.0
9 | discord-canvas: 1.1.0
10 | discord-logs: 1.7.4
11 | discord.js: 12.0.2
12 | enmap: 5.2.4
13 | https: 1.0.0
14 | luxon: 1.22.0
15 | morgan: 1.9.1
16 | path: 0.12.7
17 | packages:
18 | /@discordjs/collection/0.1.5:
19 | dev: false
20 | resolution:
21 | integrity: sha512-CU1q0UXQUpFNzNB7gufgoisDHP7n+T3tkqTsp3MNUkVJ5+hS3BCvME8uCXAUFlz+6T2FbTCu75A+yQ7HMKqRKw==
22 | /@types/color-name/1.1.1:
23 | dev: false
24 | resolution:
25 | integrity: sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==
26 | /@types/node/13.7.7:
27 | dev: false
28 | resolution:
29 | integrity: sha512-Uo4chgKbnPNlxQwoFmYIwctkQVkMMmsAoGGU4JKwLuvBefF0pCq4FybNSnfkfRCpC7ZW7kttcC/TrRtAJsvGtg==
30 | /@types/ws/7.2.2:
31 | dependencies:
32 | '@types/node': 13.7.7
33 | dev: false
34 | resolution:
35 | integrity: sha512-oqnI3DbGCVI9zJ/WHdFo3CUE8jQ8CVQDUIKaDtlTcNeT4zs6UCg9Gvk5QrFx2QPkRszpM6yc8o0p4aGjCsTi+w==
36 | /abbrev/1.1.1:
37 | dev: false
38 | resolution:
39 | integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==
40 | /abort-controller/3.0.0:
41 | dependencies:
42 | event-target-shim: 5.0.1
43 | dev: false
44 | engines:
45 | node: '>=6.5'
46 | resolution:
47 | integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==
48 | /accepts/1.3.7:
49 | dependencies:
50 | mime-types: 2.1.26
51 | negotiator: 0.6.2
52 | dev: false
53 | engines:
54 | node: '>= 0.6'
55 | resolution:
56 | integrity: sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==
57 | /ansi-regex/2.1.1:
58 | dev: false
59 | engines:
60 | node: '>=0.10.0'
61 | resolution:
62 | integrity: sha1-w7M6te42DYbg5ijwRorn7yfWVN8=
63 | /ansi-regex/3.0.0:
64 | dev: false
65 | engines:
66 | node: '>=4'
67 | resolution:
68 | integrity: sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=
69 | /ansi-styles/4.2.1:
70 | dependencies:
71 | '@types/color-name': 1.1.1
72 | color-convert: 2.0.1
73 | dev: false
74 | engines:
75 | node: '>=8'
76 | resolution:
77 | integrity: sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==
78 | /aproba/1.2.0:
79 | dev: false
80 | resolution:
81 | integrity: sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==
82 | /are-we-there-yet/1.1.5:
83 | dependencies:
84 | delegates: 1.0.0
85 | readable-stream: 2.3.7
86 | dev: false
87 | resolution:
88 | integrity: sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==
89 | /array-flatten/1.1.1:
90 | dev: false
91 | resolution:
92 | integrity: sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=
93 | /asynckit/0.4.0:
94 | dev: false
95 | resolution:
96 | integrity: sha1-x57Zf380y48robyXkLzDZkdLS3k=
97 | /axios/0.18.1:
98 | dependencies:
99 | follow-redirects: 1.5.10
100 | is-buffer: 2.0.4
101 | dev: false
102 | resolution:
103 | integrity: sha512-0BfJq4NSfQXd+SkFdrvFbG7addhYSBA2mQwISr46pD6E5iqkWg02RAs8vyTT/j0RTnoYmeXauBuSv1qKwR179g==
104 | /axios/0.19.2:
105 | dependencies:
106 | follow-redirects: 1.5.10
107 | dev: false
108 | resolution:
109 | integrity: sha512-fjgm5MvRHLhx+osE2xoekY70AhARk3a6hkN+3Io1jc00jtquGvxYlKlsFUhmUET0V5te6CcZI7lcv2Ym61mjHA==
110 | /balanced-match/1.0.0:
111 | dev: false
112 | resolution:
113 | integrity: sha1-ibTRmasr7kneFk6gK4nORi1xt2c=
114 | /basic-auth/2.0.1:
115 | dependencies:
116 | safe-buffer: 5.1.2
117 | dev: false
118 | engines:
119 | node: '>= 0.8'
120 | resolution:
121 | integrity: sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==
122 | /better-sqlite-pool/0.2.3:
123 | dependencies:
124 | better-sqlite3: 5.4.3
125 | lodash: 4.17.15
126 | dev: false
127 | engines:
128 | node: '>=8.0'
129 | resolution:
130 | integrity: sha512-aV0eLQ4RsMQaYsv+xAptyLZS++nLlGbmN1KCFJCRkEtgulDMQtMKwgJLz8zDAP8leqX8CyidaZOjayLOGPBixA==
131 | /better-sqlite3/5.4.3:
132 | dependencies:
133 | integer: 2.1.0
134 | tar: 4.4.13
135 | dev: false
136 | requiresBuild: true
137 | resolution:
138 | integrity: sha512-fPp+8f363qQIhuhLyjI4bu657J/FfMtgiiHKfaTsj3RWDkHlWC1yT7c6kHZDnBxzQVoAINuzg553qKmZ4F1rEw==
139 | /body-parser/1.19.0:
140 | dependencies:
141 | bytes: 3.1.0
142 | content-type: 1.0.4
143 | debug: 2.6.9
144 | depd: 1.1.2
145 | http-errors: 1.7.2
146 | iconv-lite: 0.4.24
147 | on-finished: 2.3.0
148 | qs: 6.7.0
149 | raw-body: 2.4.0
150 | type-is: 1.6.18
151 | dev: false
152 | engines:
153 | node: '>= 0.8'
154 | resolution:
155 | integrity: sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==
156 | /brace-expansion/1.1.11:
157 | dependencies:
158 | balanced-match: 1.0.0
159 | concat-map: 0.0.1
160 | dev: false
161 | resolution:
162 | integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==
163 | /bytes/3.1.0:
164 | dev: false
165 | engines:
166 | node: '>= 0.8'
167 | resolution:
168 | integrity: sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==
169 | /canvas/2.6.1:
170 | dependencies:
171 | nan: 2.14.0
172 | node-pre-gyp: 0.11.0
173 | simple-get: 3.1.0
174 | dev: false
175 | engines:
176 | node: '>=6'
177 | requiresBuild: true
178 | resolution:
179 | integrity: sha512-S98rKsPcuhfTcYbtF53UIJhcbgIAK533d1kJKMwsMwAIFgfd58MOyxRud3kktlzWiEkFliaJtvyZCBtud/XVEA==
180 | /chalk/3.0.0:
181 | dependencies:
182 | ansi-styles: 4.2.1
183 | supports-color: 7.1.0
184 | dev: false
185 | engines:
186 | node: '>=8'
187 | resolution:
188 | integrity: sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==
189 | /chart.js/2.9.3:
190 | dependencies:
191 | chartjs-color: 2.4.1
192 | moment: 2.24.0
193 | dev: false
194 | resolution:
195 | integrity: sha512-+2jlOobSk52c1VU6fzkh3UwqHMdSlgH1xFv9FKMqHiNCpXsGPQa/+81AFa+i3jZ253Mq9aAycPwDjnn1XbRNNw==
196 | /chartjs-color-string/0.6.0:
197 | dependencies:
198 | color-name: 1.1.4
199 | dev: false
200 | resolution:
201 | integrity: sha512-TIB5OKn1hPJvO7JcteW4WY/63v6KwEdt6udfnDE9iCAZgy+V4SrbSxoIbTw/xkUIapjEI4ExGtD0+6D3KyFd7A==
202 | /chartjs-color/2.4.1:
203 | dependencies:
204 | chartjs-color-string: 0.6.0
205 | color-convert: 1.9.3
206 | dev: false
207 | resolution:
208 | integrity: sha512-haqOg1+Yebys/Ts/9bLo/BqUcONQOdr/hoEr2LLTRl6C5LXctUdHxsCYfvQVg5JIxITrfCNUDr4ntqmQk9+/0w==
209 | /chartjs-node-canvas/3.0.6:
210 | dependencies:
211 | canvas: 2.6.1
212 | tslib: 1.11.1
213 | dev: false
214 | peerDependencies:
215 | chart.js: ^2.7.3
216 | resolution:
217 | integrity: sha512-Pm+CelDDrRZ9z/VPOJqphsopY4A7nm+a2ZzUr928d6/jrjDCE7V0eZqxevF3/vGA2EA/CIPKxPzowOkx4GdHMA==
218 | /chownr/1.1.4:
219 | dev: false
220 | resolution:
221 | integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==
222 | /code-point-at/1.1.0:
223 | dev: false
224 | engines:
225 | node: '>=0.10.0'
226 | resolution:
227 | integrity: sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=
228 | /color-convert/1.9.3:
229 | dependencies:
230 | color-name: 1.1.3
231 | dev: false
232 | resolution:
233 | integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==
234 | /color-convert/2.0.1:
235 | dependencies:
236 | color-name: 1.1.4
237 | dev: false
238 | engines:
239 | node: '>=7.0.0'
240 | resolution:
241 | integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==
242 | /color-name/1.1.3:
243 | dev: false
244 | resolution:
245 | integrity: sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=
246 | /color-name/1.1.4:
247 | dev: false
248 | resolution:
249 | integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
250 | /combined-stream/1.0.8:
251 | dependencies:
252 | delayed-stream: 1.0.0
253 | dev: false
254 | engines:
255 | node: '>= 0.8'
256 | resolution:
257 | integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==
258 | /concat-map/0.0.1:
259 | dev: false
260 | resolution:
261 | integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=
262 | /console-control-strings/1.1.0:
263 | dev: false
264 | resolution:
265 | integrity: sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=
266 | /content-disposition/0.5.3:
267 | dependencies:
268 | safe-buffer: 5.1.2
269 | dev: false
270 | engines:
271 | node: '>= 0.6'
272 | resolution:
273 | integrity: sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==
274 | /content-type/1.0.4:
275 | dev: false
276 | engines:
277 | node: '>= 0.6'
278 | resolution:
279 | integrity: sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==
280 | /cookie-signature/1.0.6:
281 | dev: false
282 | resolution:
283 | integrity: sha1-4wOogrNCzD7oylE6eZmXNNqzriw=
284 | /cookie/0.4.0:
285 | dev: false
286 | engines:
287 | node: '>= 0.6'
288 | resolution:
289 | integrity: sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==
290 | /core-util-is/1.0.2:
291 | dev: false
292 | resolution:
293 | integrity: sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=
294 | /ddblapi.js/1.0.0:
295 | dependencies:
296 | axios: 0.18.1
297 | body-parser: 1.19.0
298 | express: 4.17.1
299 | dev: false
300 | resolution:
301 | integrity: sha512-mZG5+qLOKagkt8Yfw9uVYxFuttw7Y0Gh9sfn2byx9YDZotP5qjbMBwsm30+pnDu4u/DV2qv1N38r/rEKsTx0Tg==
302 | /debug/2.6.9:
303 | dependencies:
304 | ms: 2.0.0
305 | dev: false
306 | resolution:
307 | integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==
308 | /debug/3.1.0:
309 | dependencies:
310 | ms: 2.0.0
311 | dev: false
312 | resolution:
313 | integrity: sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==
314 | /debug/3.2.6:
315 | dependencies:
316 | ms: 2.1.2
317 | dev: false
318 | resolution:
319 | integrity: sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==
320 | /decompress-response/4.2.1:
321 | dependencies:
322 | mimic-response: 2.1.0
323 | dev: false
324 | engines:
325 | node: '>=8'
326 | resolution:
327 | integrity: sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==
328 | /deep-extend/0.6.0:
329 | dev: false
330 | engines:
331 | node: '>=4.0.0'
332 | resolution:
333 | integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==
334 | /delayed-stream/1.0.0:
335 | dev: false
336 | engines:
337 | node: '>=0.4.0'
338 | resolution:
339 | integrity: sha1-3zrhmayt+31ECqrgsp4icrJOxhk=
340 | /delegates/1.0.0:
341 | dev: false
342 | resolution:
343 | integrity: sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=
344 | /depd/1.1.2:
345 | dev: false
346 | engines:
347 | node: '>= 0.6'
348 | resolution:
349 | integrity: sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=
350 | /destroy/1.0.4:
351 | dev: false
352 | resolution:
353 | integrity: sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=
354 | /detect-libc/1.0.3:
355 | dev: false
356 | engines:
357 | node: '>=0.10'
358 | hasBin: true
359 | resolution:
360 | integrity: sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=
361 | /discord-canvas/1.1.0:
362 | dependencies:
363 | canvas: 2.6.1
364 | dev: false
365 | resolution:
366 | integrity: sha512-vr1Yflgbf8d9fsZnEjl7y7YxGXwxH7CJ/vk6igSFqoGiflZUlnwWNJtpvCphh7RFKRUgjF6KCE+xIMPxBNUoPg==
367 | /discord-logs/1.7.4:
368 | dependencies:
369 | '@types/node': 13.7.7
370 | '@types/ws': 7.2.2
371 | discord.js: github.com/discordjs/discord.js/bfcd4befc9a6d56c4c7db5c736bd7f31524f097c
372 | dev: false
373 | resolution:
374 | integrity: sha512-TvjO1ngjTkpu8yxISsgvlF+4xSHM+ThSxP+KkjkS4Lqku784lbKZC44BW1VAiaZBahvbtCuFqalL/rv+BZltrg==
375 | /discord.js/12.0.2:
376 | dependencies:
377 | '@discordjs/collection': 0.1.5
378 | abort-controller: 3.0.0
379 | form-data: 3.0.0
380 | node-fetch: 2.6.0
381 | prism-media: 1.2.1
382 | setimmediate: 1.0.5
383 | tweetnacl: 1.0.3
384 | ws: 7.2.3
385 | dev: false
386 | engines:
387 | node: '>=12.0.0'
388 | peerDependencies:
389 | bufferutil: ^4.0.1
390 | erlpack: discordapp/erlpack
391 | libsodium-wrappers: ^0.7.6
392 | sodium: ^3.0.2
393 | utf-8-validate: ^5.0.2
394 | zlib-sync: ^0.1.6
395 | resolution:
396 | integrity: sha512-iZiEA4Y61gqq/EjFfLXnkRK9pLapnax/vTVDUhs/mAhyqozAy0GOlk/MZI9rSa1iIoKTWRq6P9CRKhLNT2wUnA==
397 | /ee-first/1.1.1:
398 | dev: false
399 | resolution:
400 | integrity: sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=
401 | /encodeurl/1.0.2:
402 | dev: false
403 | engines:
404 | node: '>= 0.8'
405 | resolution:
406 | integrity: sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=
407 | /enmap/5.2.4:
408 | dependencies:
409 | lodash: 4.17.15
410 | dev: false
411 | peerDependencies:
412 | better-sqlite3: ^5.4.1
413 | resolution:
414 | integrity: sha512-YulKPmB3t08i1aBDBDgEew9gAWYWXVuGe8S3DLYRQ+E0FoVxTTzo2iSfcEmUX9DRLuKLDMRLRcbRqX5J0z55Uw==
415 | /escape-html/1.0.3:
416 | dev: false
417 | resolution:
418 | integrity: sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=
419 | /etag/1.8.1:
420 | dev: false
421 | engines:
422 | node: '>= 0.6'
423 | resolution:
424 | integrity: sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=
425 | /event-target-shim/5.0.1:
426 | dev: false
427 | engines:
428 | node: '>=6'
429 | resolution:
430 | integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==
431 | /express/4.17.1:
432 | dependencies:
433 | accepts: 1.3.7
434 | array-flatten: 1.1.1
435 | body-parser: 1.19.0
436 | content-disposition: 0.5.3
437 | content-type: 1.0.4
438 | cookie: 0.4.0
439 | cookie-signature: 1.0.6
440 | debug: 2.6.9
441 | depd: 1.1.2
442 | encodeurl: 1.0.2
443 | escape-html: 1.0.3
444 | etag: 1.8.1
445 | finalhandler: 1.1.2
446 | fresh: 0.5.2
447 | merge-descriptors: 1.0.1
448 | methods: 1.1.2
449 | on-finished: 2.3.0
450 | parseurl: 1.3.3
451 | path-to-regexp: 0.1.7
452 | proxy-addr: 2.0.6
453 | qs: 6.7.0
454 | range-parser: 1.2.1
455 | safe-buffer: 5.1.2
456 | send: 0.17.1
457 | serve-static: 1.14.1
458 | setprototypeof: 1.1.1
459 | statuses: 1.5.0
460 | type-is: 1.6.18
461 | utils-merge: 1.0.1
462 | vary: 1.1.2
463 | dev: false
464 | engines:
465 | node: '>= 0.10.0'
466 | resolution:
467 | integrity: sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==
468 | /finalhandler/1.1.2:
469 | dependencies:
470 | debug: 2.6.9
471 | encodeurl: 1.0.2
472 | escape-html: 1.0.3
473 | on-finished: 2.3.0
474 | parseurl: 1.3.3
475 | statuses: 1.5.0
476 | unpipe: 1.0.0
477 | dev: false
478 | engines:
479 | node: '>= 0.8'
480 | resolution:
481 | integrity: sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==
482 | /follow-redirects/1.5.10:
483 | dependencies:
484 | debug: 3.1.0
485 | dev: false
486 | engines:
487 | node: '>=4.0'
488 | resolution:
489 | integrity: sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==
490 | /form-data/3.0.0:
491 | dependencies:
492 | asynckit: 0.4.0
493 | combined-stream: 1.0.8
494 | mime-types: 2.1.26
495 | dev: false
496 | engines:
497 | node: '>= 6'
498 | resolution:
499 | integrity: sha512-CKMFDglpbMi6PyN+brwB9Q/GOw0eAnsrEZDgcsH5Krhz5Od/haKHAX0NmQfha2zPPz0JpWzA7GJHGSnvCRLWsg==
500 | /forwarded/0.1.2:
501 | dev: false
502 | engines:
503 | node: '>= 0.6'
504 | resolution:
505 | integrity: sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=
506 | /fresh/0.5.2:
507 | dev: false
508 | engines:
509 | node: '>= 0.6'
510 | resolution:
511 | integrity: sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=
512 | /fs-minipass/1.2.7:
513 | dependencies:
514 | minipass: 2.9.0
515 | dev: false
516 | resolution:
517 | integrity: sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==
518 | /fs.realpath/1.0.0:
519 | dev: false
520 | resolution:
521 | integrity: sha1-FQStJSMVjKpA20onh8sBQRmU6k8=
522 | /gauge/2.7.4:
523 | dependencies:
524 | aproba: 1.2.0
525 | console-control-strings: 1.1.0
526 | has-unicode: 2.0.1
527 | object-assign: 4.1.1
528 | signal-exit: 3.0.2
529 | string-width: 1.0.2
530 | strip-ansi: 3.0.1
531 | wide-align: 1.1.3
532 | dev: false
533 | resolution:
534 | integrity: sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=
535 | /glob/7.1.6:
536 | dependencies:
537 | fs.realpath: 1.0.0
538 | inflight: 1.0.6
539 | inherits: 2.0.4
540 | minimatch: 3.0.4
541 | once: 1.4.0
542 | path-is-absolute: 1.0.1
543 | dev: false
544 | resolution:
545 | integrity: sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==
546 | /has-flag/4.0.0:
547 | dev: false
548 | engines:
549 | node: '>=8'
550 | resolution:
551 | integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==
552 | /has-unicode/2.0.1:
553 | dev: false
554 | resolution:
555 | integrity: sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=
556 | /http-errors/1.7.2:
557 | dependencies:
558 | depd: 1.1.2
559 | inherits: 2.0.3
560 | setprototypeof: 1.1.1
561 | statuses: 1.5.0
562 | toidentifier: 1.0.0
563 | dev: false
564 | engines:
565 | node: '>= 0.6'
566 | resolution:
567 | integrity: sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==
568 | /http-errors/1.7.3:
569 | dependencies:
570 | depd: 1.1.2
571 | inherits: 2.0.4
572 | setprototypeof: 1.1.1
573 | statuses: 1.5.0
574 | toidentifier: 1.0.0
575 | dev: false
576 | engines:
577 | node: '>= 0.6'
578 | resolution:
579 | integrity: sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==
580 | /https/1.0.0:
581 | dev: false
582 | resolution:
583 | integrity: sha1-PDfHrhqO65ZpBKKtHpdaGUt+06Q=
584 | /iconv-lite/0.4.24:
585 | dependencies:
586 | safer-buffer: 2.1.2
587 | dev: false
588 | engines:
589 | node: '>=0.10.0'
590 | resolution:
591 | integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==
592 | /ignore-walk/3.0.3:
593 | dependencies:
594 | minimatch: 3.0.4
595 | dev: false
596 | resolution:
597 | integrity: sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==
598 | /inflight/1.0.6:
599 | dependencies:
600 | once: 1.4.0
601 | wrappy: 1.0.2
602 | dev: false
603 | resolution:
604 | integrity: sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=
605 | /inherits/2.0.3:
606 | dev: false
607 | resolution:
608 | integrity: sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=
609 | /inherits/2.0.4:
610 | dev: false
611 | resolution:
612 | integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
613 | /ini/1.3.5:
614 | dev: false
615 | resolution:
616 | integrity: sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==
617 | /integer/2.1.0:
618 | dev: false
619 | requiresBuild: true
620 | resolution:
621 | integrity: sha512-vBtiSgrEiNocWvvZX1RVfeOKa2mCHLZQ2p9nkQkQZ/BvEiY+6CcUz0eyjvIiewjJoeNidzg2I+tpPJvpyspL1w==
622 | /ipaddr.js/1.9.1:
623 | dev: false
624 | engines:
625 | node: '>= 0.10'
626 | resolution:
627 | integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==
628 | /is-buffer/2.0.4:
629 | dev: false
630 | engines:
631 | node: '>=4'
632 | resolution:
633 | integrity: sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==
634 | /is-fullwidth-code-point/1.0.0:
635 | dependencies:
636 | number-is-nan: 1.0.1
637 | dev: false
638 | engines:
639 | node: '>=0.10.0'
640 | resolution:
641 | integrity: sha1-754xOG8DGn8NZDr4L95QxFfvAMs=
642 | /is-fullwidth-code-point/2.0.0:
643 | dev: false
644 | engines:
645 | node: '>=4'
646 | resolution:
647 | integrity: sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=
648 | /isarray/1.0.0:
649 | dev: false
650 | resolution:
651 | integrity: sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=
652 | /lodash/4.17.15:
653 | dev: false
654 | resolution:
655 | integrity: sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==
656 | /luxon/1.22.0:
657 | dev: false
658 | resolution:
659 | integrity: sha512-3sLvlfbFo+AxVEY3IqxymbumtnlgBwjDExxK60W3d+trrUzErNAz/PfvPT+mva+vEUrdIodeCOs7fB6zHtRSrw==
660 | /media-typer/0.3.0:
661 | dev: false
662 | engines:
663 | node: '>= 0.6'
664 | resolution:
665 | integrity: sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=
666 | /merge-descriptors/1.0.1:
667 | dev: false
668 | resolution:
669 | integrity: sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=
670 | /methods/1.1.2:
671 | dev: false
672 | engines:
673 | node: '>= 0.6'
674 | resolution:
675 | integrity: sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=
676 | /mime-db/1.43.0:
677 | dev: false
678 | engines:
679 | node: '>= 0.6'
680 | resolution:
681 | integrity: sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==
682 | /mime-types/2.1.26:
683 | dependencies:
684 | mime-db: 1.43.0
685 | dev: false
686 | engines:
687 | node: '>= 0.6'
688 | resolution:
689 | integrity: sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==
690 | /mime/1.6.0:
691 | dev: false
692 | engines:
693 | node: '>=4'
694 | hasBin: true
695 | resolution:
696 | integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==
697 | /mimic-response/2.1.0:
698 | dev: false
699 | engines:
700 | node: '>=8'
701 | resolution:
702 | integrity: sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==
703 | /minimatch/3.0.4:
704 | dependencies:
705 | brace-expansion: 1.1.11
706 | dev: false
707 | resolution:
708 | integrity: sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==
709 | /minimist/0.0.8:
710 | dev: false
711 | resolution:
712 | integrity: sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=
713 | /minimist/1.2.0:
714 | dev: false
715 | resolution:
716 | integrity: sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=
717 | /minipass/2.9.0:
718 | dependencies:
719 | safe-buffer: 5.2.0
720 | yallist: 3.1.1
721 | dev: false
722 | resolution:
723 | integrity: sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==
724 | /minizlib/1.3.3:
725 | dependencies:
726 | minipass: 2.9.0
727 | dev: false
728 | resolution:
729 | integrity: sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==
730 | /mkdirp/0.5.1:
731 | dependencies:
732 | minimist: 0.0.8
733 | dev: false
734 | hasBin: true
735 | resolution:
736 | integrity: sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=
737 | /moment/2.24.0:
738 | dev: false
739 | resolution:
740 | integrity: sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==
741 | /morgan/1.9.1:
742 | dependencies:
743 | basic-auth: 2.0.1
744 | debug: 2.6.9
745 | depd: 1.1.2
746 | on-finished: 2.3.0
747 | on-headers: 1.0.2
748 | dev: false
749 | engines:
750 | node: '>= 0.8.0'
751 | resolution:
752 | integrity: sha512-HQStPIV4y3afTiCYVxirakhlCfGkI161c76kKFca7Fk1JusM//Qeo1ej2XaMniiNeaZklMVrh3vTtIzpzwbpmA==
753 | /ms/2.0.0:
754 | dev: false
755 | resolution:
756 | integrity: sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=
757 | /ms/2.1.1:
758 | dev: false
759 | resolution:
760 | integrity: sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==
761 | /ms/2.1.2:
762 | dev: false
763 | resolution:
764 | integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
765 | /nan/2.14.0:
766 | dev: false
767 | resolution:
768 | integrity: sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==
769 | /needle/2.3.3:
770 | dependencies:
771 | debug: 3.2.6
772 | iconv-lite: 0.4.24
773 | sax: 1.2.4
774 | dev: false
775 | engines:
776 | node: '>= 4.4.x'
777 | hasBin: true
778 | resolution:
779 | integrity: sha512-EkY0GeSq87rWp1hoq/sH/wnTWgFVhYlnIkbJ0YJFfRgEFlz2RraCjBpFQ+vrEgEdp0ThfyHADmkChEhcb7PKyw==
780 | /negotiator/0.6.2:
781 | dev: false
782 | engines:
783 | node: '>= 0.6'
784 | resolution:
785 | integrity: sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==
786 | /node-fetch/2.6.0:
787 | dev: false
788 | engines:
789 | node: 4.x || >=6.0.0
790 | resolution:
791 | integrity: sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==
792 | /node-pre-gyp/0.11.0:
793 | dependencies:
794 | detect-libc: 1.0.3
795 | mkdirp: 0.5.1
796 | needle: 2.3.3
797 | nopt: 4.0.1
798 | npm-packlist: 1.4.8
799 | npmlog: 4.1.2
800 | rc: 1.2.8
801 | rimraf: 2.7.1
802 | semver: 5.7.1
803 | tar: 4.4.13
804 | dev: false
805 | hasBin: true
806 | resolution:
807 | integrity: sha512-TwWAOZb0j7e9eGaf9esRx3ZcLaE5tQ2lvYy1pb5IAaG1a2e2Kv5Lms1Y4hpj+ciXJRofIxxlt5haeQ/2ANeE0Q==
808 | /nopt/4.0.1:
809 | dependencies:
810 | abbrev: 1.1.1
811 | osenv: 0.1.5
812 | dev: false
813 | hasBin: true
814 | resolution:
815 | integrity: sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=
816 | /npm-bundled/1.1.1:
817 | dependencies:
818 | npm-normalize-package-bin: 1.0.1
819 | dev: false
820 | resolution:
821 | integrity: sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA==
822 | /npm-normalize-package-bin/1.0.1:
823 | dev: false
824 | resolution:
825 | integrity: sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==
826 | /npm-packlist/1.4.8:
827 | dependencies:
828 | ignore-walk: 3.0.3
829 | npm-bundled: 1.1.1
830 | npm-normalize-package-bin: 1.0.1
831 | dev: false
832 | resolution:
833 | integrity: sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A==
834 | /npmlog/4.1.2:
835 | dependencies:
836 | are-we-there-yet: 1.1.5
837 | console-control-strings: 1.1.0
838 | gauge: 2.7.4
839 | set-blocking: 2.0.0
840 | dev: false
841 | resolution:
842 | integrity: sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==
843 | /number-is-nan/1.0.1:
844 | dev: false
845 | engines:
846 | node: '>=0.10.0'
847 | resolution:
848 | integrity: sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=
849 | /object-assign/4.1.1:
850 | dev: false
851 | engines:
852 | node: '>=0.10.0'
853 | resolution:
854 | integrity: sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=
855 | /on-finished/2.3.0:
856 | dependencies:
857 | ee-first: 1.1.1
858 | dev: false
859 | engines:
860 | node: '>= 0.8'
861 | resolution:
862 | integrity: sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=
863 | /on-headers/1.0.2:
864 | dev: false
865 | engines:
866 | node: '>= 0.8'
867 | resolution:
868 | integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==
869 | /once/1.4.0:
870 | dependencies:
871 | wrappy: 1.0.2
872 | dev: false
873 | resolution:
874 | integrity: sha1-WDsap3WWHUsROsF9nFC6753Xa9E=
875 | /os-homedir/1.0.2:
876 | dev: false
877 | engines:
878 | node: '>=0.10.0'
879 | resolution:
880 | integrity: sha1-/7xJiDNuDoM94MFox+8VISGqf7M=
881 | /os-tmpdir/1.0.2:
882 | dev: false
883 | engines:
884 | node: '>=0.10.0'
885 | resolution:
886 | integrity: sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=
887 | /osenv/0.1.5:
888 | dependencies:
889 | os-homedir: 1.0.2
890 | os-tmpdir: 1.0.2
891 | dev: false
892 | resolution:
893 | integrity: sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==
894 | /parseurl/1.3.3:
895 | dev: false
896 | engines:
897 | node: '>= 0.8'
898 | resolution:
899 | integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==
900 | /path-is-absolute/1.0.1:
901 | dev: false
902 | engines:
903 | node: '>=0.10.0'
904 | resolution:
905 | integrity: sha1-F0uSaHNVNP+8es5r9TpanhtcX18=
906 | /path-to-regexp/0.1.7:
907 | dev: false
908 | resolution:
909 | integrity: sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=
910 | /path/0.12.7:
911 | dependencies:
912 | process: 0.11.10
913 | util: 0.10.4
914 | dev: false
915 | resolution:
916 | integrity: sha1-1NwqUGxM4hl+tIHr/NWzbAFAsQ8=
917 | /prism-media/1.2.1:
918 | dev: false
919 | peerDependencies:
920 | '@discordjs/opus': ^0.1.0
921 | ffmpeg-static: ^2.4.0 || ^3.0.0
922 | node-opus: ^0.3.1
923 | opusscript: ^0.0.6
924 | resolution:
925 | integrity: sha512-R3EbKwJiYlTvGwcG1DpUt+06DsxOGS5W4AMEHT7oVOjG93MjpdhGX1whHyjnqknylLMupKAsKMEXcTNRbPe6Vw==
926 | /process-nextick-args/2.0.1:
927 | dev: false
928 | resolution:
929 | integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==
930 | /process/0.11.10:
931 | dev: false
932 | engines:
933 | node: '>= 0.6.0'
934 | resolution:
935 | integrity: sha1-czIwDoQBYb2j5podHZGn1LwW8YI=
936 | /proxy-addr/2.0.6:
937 | dependencies:
938 | forwarded: 0.1.2
939 | ipaddr.js: 1.9.1
940 | dev: false
941 | engines:
942 | node: '>= 0.10'
943 | resolution:
944 | integrity: sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==
945 | /qs/6.7.0:
946 | dev: false
947 | engines:
948 | node: '>=0.6'
949 | resolution:
950 | integrity: sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==
951 | /range-parser/1.2.1:
952 | dev: false
953 | engines:
954 | node: '>= 0.6'
955 | resolution:
956 | integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==
957 | /raw-body/2.4.0:
958 | dependencies:
959 | bytes: 3.1.0
960 | http-errors: 1.7.2
961 | iconv-lite: 0.4.24
962 | unpipe: 1.0.0
963 | dev: false
964 | engines:
965 | node: '>= 0.8'
966 | resolution:
967 | integrity: sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==
968 | /rc/1.2.8:
969 | dependencies:
970 | deep-extend: 0.6.0
971 | ini: 1.3.5
972 | minimist: 1.2.0
973 | strip-json-comments: 2.0.1
974 | dev: false
975 | hasBin: true
976 | resolution:
977 | integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==
978 | /readable-stream/2.3.7:
979 | dependencies:
980 | core-util-is: 1.0.2
981 | inherits: 2.0.4
982 | isarray: 1.0.0
983 | process-nextick-args: 2.0.1
984 | safe-buffer: 5.1.2
985 | string_decoder: 1.1.1
986 | util-deprecate: 1.0.2
987 | dev: false
988 | resolution:
989 | integrity: sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==
990 | /rimraf/2.7.1:
991 | dependencies:
992 | glob: 7.1.6
993 | dev: false
994 | hasBin: true
995 | resolution:
996 | integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==
997 | /safe-buffer/5.1.2:
998 | dev: false
999 | resolution:
1000 | integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
1001 | /safe-buffer/5.2.0:
1002 | dev: false
1003 | resolution:
1004 | integrity: sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==
1005 | /safer-buffer/2.1.2:
1006 | dev: false
1007 | resolution:
1008 | integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
1009 | /sax/1.2.4:
1010 | dev: false
1011 | resolution:
1012 | integrity: sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==
1013 | /semver/5.7.1:
1014 | dev: false
1015 | hasBin: true
1016 | resolution:
1017 | integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==
1018 | /send/0.17.1:
1019 | dependencies:
1020 | debug: 2.6.9
1021 | depd: 1.1.2
1022 | destroy: 1.0.4
1023 | encodeurl: 1.0.2
1024 | escape-html: 1.0.3
1025 | etag: 1.8.1
1026 | fresh: 0.5.2
1027 | http-errors: 1.7.3
1028 | mime: 1.6.0
1029 | ms: 2.1.1
1030 | on-finished: 2.3.0
1031 | range-parser: 1.2.1
1032 | statuses: 1.5.0
1033 | dev: false
1034 | engines:
1035 | node: '>= 0.8.0'
1036 | resolution:
1037 | integrity: sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==
1038 | /serve-static/1.14.1:
1039 | dependencies:
1040 | encodeurl: 1.0.2
1041 | escape-html: 1.0.3
1042 | parseurl: 1.3.3
1043 | send: 0.17.1
1044 | dev: false
1045 | engines:
1046 | node: '>= 0.8.0'
1047 | resolution:
1048 | integrity: sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==
1049 | /set-blocking/2.0.0:
1050 | dev: false
1051 | resolution:
1052 | integrity: sha1-BF+XgtARrppoA93TgrJDkrPYkPc=
1053 | /setimmediate/1.0.5:
1054 | dev: false
1055 | resolution:
1056 | integrity: sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=
1057 | /setprototypeof/1.1.1:
1058 | dev: false
1059 | resolution:
1060 | integrity: sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==
1061 | /signal-exit/3.0.2:
1062 | dev: false
1063 | resolution:
1064 | integrity: sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=
1065 | /simple-concat/1.0.0:
1066 | dev: false
1067 | resolution:
1068 | integrity: sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY=
1069 | /simple-get/3.1.0:
1070 | dependencies:
1071 | decompress-response: 4.2.1
1072 | once: 1.4.0
1073 | simple-concat: 1.0.0
1074 | dev: false
1075 | resolution:
1076 | integrity: sha512-bCR6cP+aTdScaQCnQKbPKtJOKDp/hj9EDLJo3Nw4y1QksqaovlW/bnptB6/c1e+qmNIDHRK+oXFDdEqBT8WzUA==
1077 | /statuses/1.5.0:
1078 | dev: false
1079 | engines:
1080 | node: '>= 0.6'
1081 | resolution:
1082 | integrity: sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=
1083 | /string-width/1.0.2:
1084 | dependencies:
1085 | code-point-at: 1.1.0
1086 | is-fullwidth-code-point: 1.0.0
1087 | strip-ansi: 3.0.1
1088 | dev: false
1089 | engines:
1090 | node: '>=0.10.0'
1091 | resolution:
1092 | integrity: sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=
1093 | /string-width/2.1.1:
1094 | dependencies:
1095 | is-fullwidth-code-point: 2.0.0
1096 | strip-ansi: 4.0.0
1097 | dev: false
1098 | engines:
1099 | node: '>=4'
1100 | resolution:
1101 | integrity: sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==
1102 | /string_decoder/1.1.1:
1103 | dependencies:
1104 | safe-buffer: 5.1.2
1105 | dev: false
1106 | resolution:
1107 | integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==
1108 | /strip-ansi/3.0.1:
1109 | dependencies:
1110 | ansi-regex: 2.1.1
1111 | dev: false
1112 | engines:
1113 | node: '>=0.10.0'
1114 | resolution:
1115 | integrity: sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=
1116 | /strip-ansi/4.0.0:
1117 | dependencies:
1118 | ansi-regex: 3.0.0
1119 | dev: false
1120 | engines:
1121 | node: '>=4'
1122 | resolution:
1123 | integrity: sha1-qEeQIusaw2iocTibY1JixQXuNo8=
1124 | /strip-json-comments/2.0.1:
1125 | dev: false
1126 | engines:
1127 | node: '>=0.10.0'
1128 | resolution:
1129 | integrity: sha1-PFMZQukIwml8DsNEhYwobHygpgo=
1130 | /supports-color/7.1.0:
1131 | dependencies:
1132 | has-flag: 4.0.0
1133 | dev: false
1134 | engines:
1135 | node: '>=8'
1136 | resolution:
1137 | integrity: sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==
1138 | /tar/4.4.13:
1139 | dependencies:
1140 | chownr: 1.1.4
1141 | fs-minipass: 1.2.7
1142 | minipass: 2.9.0
1143 | minizlib: 1.3.3
1144 | mkdirp: 0.5.1
1145 | safe-buffer: 5.2.0
1146 | yallist: 3.1.1
1147 | dev: false
1148 | engines:
1149 | node: '>=4.5'
1150 | resolution:
1151 | integrity: sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==
1152 | /toidentifier/1.0.0:
1153 | dev: false
1154 | engines:
1155 | node: '>=0.6'
1156 | resolution:
1157 | integrity: sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==
1158 | /tslib/1.11.1:
1159 | dev: false
1160 | resolution:
1161 | integrity: sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==
1162 | /tweetnacl/1.0.3:
1163 | dev: false
1164 | resolution:
1165 | integrity: sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==
1166 | /type-is/1.6.18:
1167 | dependencies:
1168 | media-typer: 0.3.0
1169 | mime-types: 2.1.26
1170 | dev: false
1171 | engines:
1172 | node: '>= 0.6'
1173 | resolution:
1174 | integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==
1175 | /unpipe/1.0.0:
1176 | dev: false
1177 | engines:
1178 | node: '>= 0.8'
1179 | resolution:
1180 | integrity: sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=
1181 | /util-deprecate/1.0.2:
1182 | dev: false
1183 | resolution:
1184 | integrity: sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=
1185 | /util/0.10.4:
1186 | dependencies:
1187 | inherits: 2.0.3
1188 | dev: false
1189 | resolution:
1190 | integrity: sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==
1191 | /utils-merge/1.0.1:
1192 | dev: false
1193 | engines:
1194 | node: '>= 0.4.0'
1195 | resolution:
1196 | integrity: sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=
1197 | /vary/1.1.2:
1198 | dev: false
1199 | engines:
1200 | node: '>= 0.8'
1201 | resolution:
1202 | integrity: sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=
1203 | /wide-align/1.1.3:
1204 | dependencies:
1205 | string-width: 2.1.1
1206 | dev: false
1207 | resolution:
1208 | integrity: sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==
1209 | /wrappy/1.0.2:
1210 | dev: false
1211 | resolution:
1212 | integrity: sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=
1213 | /ws/7.2.1:
1214 | dev: false
1215 | engines:
1216 | node: '>=8.3.0'
1217 | peerDependencies:
1218 | bufferutil: ^4.0.1
1219 | utf-8-validate: ^5.0.2
1220 | resolution:
1221 | integrity: sha512-sucePNSafamSKoOqoNfBd8V0StlkzJKL2ZAhGQinCfNQ+oacw+Pk7lcdAElecBF2VkLNZRiIb5Oi1Q5lVUVt2A==
1222 | /ws/7.2.3:
1223 | dev: false
1224 | engines:
1225 | node: '>=8.3.0'
1226 | peerDependencies:
1227 | bufferutil: ^4.0.1
1228 | utf-8-validate: ^5.0.2
1229 | resolution:
1230 | integrity: sha512-HTDl9G9hbkNDk98naoR/cHDws7+EyYMOdL1BmjsZXRUjf7d+MficC4B7HLUPlSiho0vg+CWKrGIt/VJBd1xunQ==
1231 | /yallist/3.1.1:
1232 | dev: false
1233 | resolution:
1234 | integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==
1235 | github.com/Arcane-Bot-Center/abcAPI/6a2b19a3ffffa33a555a524eca1956612c3dcdfa:
1236 | dependencies:
1237 | axios: 0.19.2
1238 | dev: false
1239 | name: abcapi
1240 | resolution:
1241 | registry: 'https://registry.npmjs.org/'
1242 | tarball: 'https://codeload.github.com/Arcane-Bot-Center/abcAPI/tar.gz/6a2b19a3ffffa33a555a524eca1956612c3dcdfa'
1243 | version: 1.0.4
1244 | github.com/discordjs/discord.js/bfcd4befc9a6d56c4c7db5c736bd7f31524f097c:
1245 | dependencies:
1246 | '@discordjs/collection': 0.1.5
1247 | abort-controller: 3.0.0
1248 | form-data: 3.0.0
1249 | node-fetch: 2.6.0
1250 | prism-media: 1.2.1
1251 | setimmediate: 1.0.5
1252 | tweetnacl: 1.0.3
1253 | ws: 7.2.1
1254 | dev: false
1255 | engines:
1256 | node: '>=12.0.0'
1257 | name: discord.js
1258 | peerDependencies:
1259 | bufferutil: ^4.0.1
1260 | erlpack: discordapp/erlpack
1261 | libsodium-wrappers: ^0.7.6
1262 | sodium: ^3.0.2
1263 | utf-8-validate: ^5.0.2
1264 | zlib-sync: ^0.1.6
1265 | resolution:
1266 | registry: 'https://registry.npmjs.org/'
1267 | tarball: 'https://codeload.github.com/discordjs/discord.js/tar.gz/bfcd4befc9a6d56c4c7db5c736bd7f31524f097c'
1268 | version: 12.0.1
1269 | registry: 'https://registry.npmjs.org/'
1270 | shrinkwrapMinorVersion: 9
1271 | shrinkwrapVersion: 3
1272 | specifiers:
1273 | abcapi: 'github:Arcane-Bot-Center/abcAPI'
1274 | axios: ^0.19.2
1275 | better-sqlite-pool: ^0.2.3
1276 | chalk: ^3.0.0
1277 | chart.js: ^2.9.3
1278 | chartjs-node-canvas: ^3.0.6
1279 | ddblapi.js: ^1.0.0
1280 | discord-canvas: ^1.1.0
1281 | discord-logs: ^1.7.4
1282 | discord.js: ^12.0.2
1283 | enmap: ^5.2.4
1284 | https: ^1.0.0
1285 | luxon: ^1.22.0
1286 | morgan: ^1.9.1
1287 | path: ^0.12.7
1288 |
--------------------------------------------------------------------------------
/structures/Client.js:
--------------------------------------------------------------------------------
1 | const { Client, Collection } = require("discord.js"),
2 | util = require("util"),
3 | path = require("path"),
4 | Enmap = require("enmap"),
5 | log = require("discord-logs"),
6 | { readdirSync } = require("fs");
7 |
8 | class LogsBot extends Client {
9 | constructor(options) {
10 | super(options);
11 | this.config = require("../config"); // Load the config file
12 | this.commands = new Collection(); // Creates new commands collection
13 | this.aliases = new Collection(); // Creates new command aliases collection
14 | this.logger = require("../helpers/logger"); // Load the logger file
15 | this.wait = util.promisify(setTimeout); // client.wait(1000) - Wait 1 second
16 | this.permissions = require("../helpers/permissions"); // Permissions levels
17 | this.logs = new Enmap({ name: "logs" });
18 | this.settings = new Enmap({ name: "settings" });
19 | log(this);
20 | this.stats = require("../functions");
21 | this.graph = new Enmap({ name: "graph" });
22 | }
23 |
24 | loadCommand(commandPath, commandName){
25 | try {
26 | const props = new (require(`.${commandPath}${path.sep}${commandName}`))(this);
27 | this.logger.log(`Loading Command: ${props.help.name}. 👌`, "log");
28 | props.conf.location = commandPath;
29 | if(props.init) props.init(this);
30 | this.commands.set(props.help.name, props);
31 | props.conf.aliases.forEach((alias) => {
32 | this.aliases.set(alias, props.help.name);
33 | });
34 | return false;
35 | } catch (e) {
36 | return `Unable to load command ${commandName}: ${e}`;
37 | }
38 | }
39 |
40 | // This function is used to unload a command (you need to load them again)
41 | async unloadCommand(commandPath, commandName) {
42 | let command;
43 | if (this.commands.has(commandName))
44 | command = this.commands.get(commandName);
45 | else if (this.aliases.has(commandName))
46 | command = this.commands.get(this.aliases.get(commandName));
47 | if (!command)
48 | return `The command \`${commandName}\` doesn't seem to exist, nor is it an alias. Try again!`;
49 | if (command.shutdown) await command.shutdown(this);
50 | delete require.cache[
51 | require.resolve(`.${commandPath}${path.sep}${commandName}.js`)
52 | ];
53 | return false;
54 | }
55 |
56 | getLevel(message) {
57 | let permlvl = 0;
58 | const permOrder = this.permissions
59 | .slice(0)
60 | .sort((p, c) => (p.level < c.level ? 1 : -1));
61 | while (permOrder.length) {
62 | const currentLevel = permOrder.shift();
63 | if (message.guild && currentLevel.guildOnly) continue;
64 | if (currentLevel.check(message)) {
65 | permlvl = currentLevel.level;
66 | break;
67 | }
68 | }
69 | return permlvl;
70 | }
71 | }
72 |
73 | module.exports = LogsBot;
74 |
--------------------------------------------------------------------------------
/structures/Command.js:
--------------------------------------------------------------------------------
1 | const path = require("path");
2 |
3 | module.exports = class Command {
4 | constructor(client, {
5 | // The name of the command
6 | name = null,
7 | // Whether the command is enabled, or not
8 | enabled = true,
9 | // Some command informations to display in the help command
10 | description = (language) => language.get("NO_DESCRIPTION_PROVIDED"),
11 | usage = (language) => language.get("NO_USAGE_PROVIDED"),
12 | examples = (language) => language.get("NO_EXAMPLES_PROVIDED"),
13 | // The other names that can trigger the command
14 | aliases = new Array(),
15 | // The permissions needed by the bot to run the command
16 | clientPermissions = new Array(),
17 | // The level of permissions required by the user to run the command. Permissions list can be found in the README
18 | permLevel = 0,
19 | // The time it will take a user before he can execute the command again
20 | cooldown = 5000,
21 | // The file path of the command. It will be used to determine what's the command category
22 | commandPath = null,
23 | // Whether the command can only be run in a guild, or not
24 | guildOnly = false,
25 | premiumOnly = false,
26 | // Whether the command needs to be run in a NSFW channel
27 | nsfw = false
28 | })
29 | {
30 | let category = (commandPath ? commandPath.split(path.sep)[parseInt(commandPath.split(path.sep).length-1, 10)] : "Other");
31 | this.client = client;
32 | this.conf = { enabled, aliases, permLevel, clientPermissions, cooldown, guildOnly, premiumOnly,nsfw };
33 | this.help = { name, description, usage, examples, category };
34 | }
35 | };
--------------------------------------------------------------------------------