├── .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 | LogsBot 2 | 3 | # LogsBot 4 | 5 | [![](https://img.shields.io/badge/discord.js-v12.0.1-blue.svg?logo=npm)](https://github.com/discordjs) 6 | ![](https://img.shields.io/badge/-By%20ShadowV%239339-blue) 7 | [![](https://img.shields.io/discord/683293931793940480.svg?logo=discord&colorB=7289DA)](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/api/widget/674568147029983242.svg)](https://divinediscordbots.com/bot/674568147029983242) 60 | 61 | ### Arcane Bot Center 62 | [![](https://arcane-botcenter.xyz.com/api/widget/674568147029983242.svg)](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 | }; --------------------------------------------------------------------------------