├── .env.example ├── .gitignore ├── LICENSE ├── Procfile ├── README.md ├── app.js ├── commands ├── avatar.js ├── ban.js ├── botinfo.js ├── botinvite.js ├── github.js ├── guildinfo.js ├── hastebin.js ├── help.js ├── invite.js ├── kick.js ├── lockdown.js ├── mcstatus.js ├── meme.js ├── mojangapi.js ├── mute.js ├── poll.js ├── purge.js ├── report.js ├── role.js ├── say.js ├── shutdown.js ├── tag.js ├── terminate.js ├── tweet.js ├── unban.js ├── unmute.js └── userinfo.js ├── config.json ├── config.json.example ├── events ├── channelCreate.js ├── channelDelete.js ├── guildCreate.js ├── guildDelete.js ├── guildMemberAdd.js ├── guildMemberRemove.js ├── messageDelete.js ├── messageUpdate.js └── ready.js ├── package-lock.json ├── package.json └── util ├── errors.js └── eventLoader.js /.env.example: -------------------------------------------------------------------------------- 1 | discordapitoken=APIKEY 2 | twittercounterapikey=APIKEY 3 | 4 | consumer_key=KEY 5 | consumer_secret=KEY 6 | access_token=KEY 7 | access_token_secret=KEY -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | privatekey.json 3 | token.json 4 | config.json 5 | .env -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018 shadowolf 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /Procfile: -------------------------------------------------------------------------------- 1 | worker: node index.js 2 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |

2 | 3 |

4 | 5 | # This bot is no longer maintained. If you require help or support with Rodney or Discord overall, join my Discord [here](https://discord.gg/AZQJ26z) 6 | 7 | # Rodney 8 | A Discord bot developed in JavaScript using the discord.js Library. 9 | 10 | ## Requirements 11 | - A channel named `#audit-log`, otherwise notifications will not come in and errors will occur. 12 | - A channel named `#reports`, otherwise reports will not be received and errors will occur. 13 | 14 | ## Contributors 15 | - [jasoryeh](https://github.com/jasoryeh) for helping out with general grammar and clean up. 16 | - [GitStonic](https://github.com/GitStonic) & [abhinavk99](https://github.com/abhinavk99) for helping out with the [fortnite](https://github.com/shadowolfyt/RodneyTheDiscordBot/blob/master/commands/fortnite.js) command. 17 | - `CM|T Frosty#9889` for helping out with the [mojangapi](https://github.com/shadowolfyt/RodneyTheDiscordBot/blob/master/commands/mojangapi.js) command. 18 | - [Lodelite](https://github.com/Lodelite) for helping out with the [role](https://github.com/shadowolfyt/Rodney/blob/master/commands/role.js) command and adding a [unban](https://github.com/shadowolfyt/Rodney/blob/master/commands/unban.js) command. 19 | - [Bawbby](https://github.com/Bawbby) for helping out with general code formatting and code clean up. 20 | - [Apolusk](https://github.com/Apolusk) for fixing some errors. 21 | - [ewang20027](https://github.com/ewang20027) for adding some error checking features and general code changes. 22 | 23 | ## Useful Resources 24 | - [An Idiots Guide Discord](https://discord.gg/gkZCQtH) [these guys were helpful in little code issues] 25 | - [The Source Code Discord](https://discordapp.com/invite/w24CQMR) [these guys were helpful in little code issues] 26 | - [My Discord](https://discord.gg/AZQJ26z) [these guys were helpful in little code issues] 27 | - [Emoji Unicode Tables](https://apps.timwhitlock.info/emoji/tables/unicode) [this was helpful when it came to using emojis in the code] 28 | - [discord.js Documentation](https://discord.js.org/#/docs/main/stable/general/welcome) [overall helpful] 29 | -------------------------------------------------------------------------------- /app.js: -------------------------------------------------------------------------------- 1 | const Discord = require('discord.js'); 2 | const config = require('./config.json'); 3 | require('dotenv').config(); 4 | const client = new Discord.Client({ 5 | disableEveryone: true 6 | }); 7 | const fs = require('fs'); 8 | const chalk = require('chalk'); 9 | client.commands = new Discord.Collection(); 10 | require('./util/eventLoader.js')(client); 11 | 12 | // Reads all commands and boots them in 13 | fs.readdir('./commands/', (err, files) => { 14 | if (err) console.log(err); 15 | let jsfile = files.filter(f => f.split(".").pop() === 'js') 16 | if (jsfile.length <= 0) { 17 | console.log(chalk.red('Couldn\'t find commands.')); 18 | return 19 | } 20 | 21 | jsfile.forEach((files, i) => { 22 | let props = require(`./commands/${files}`); 23 | console.log(chalk.green('[Console] ') + chalk.yellow(files) + ` has been loaded.`); 24 | client.commands.set(props.help.name, props); 25 | }) 26 | }); 27 | 28 | // Message Guild Event 29 | client.on('message', (message) => { 30 | if (message.author.bot) return; 31 | if (message.channel.type === "dm") return; 32 | 33 | let prefix = config.prefix; 34 | let messageArray = message.content.split(" "); 35 | let cmd = messageArray[0]; 36 | let args = messageArray.slice(1); 37 | 38 | if (!cmd.startsWith(prefix)) return; 39 | let commandfile = client.commands.get(cmd.slice(prefix.length)); 40 | if (commandfile) commandfile.run(client, message, args); 41 | 42 | // Discord Invite Detector 43 | const invite = ['discord.gg', 'discord.io', 'discord.me']; 44 | if (config.discordinvite == true) { 45 | if (invite.some(word => message.content.toLowerCase().includes(word))) { 46 | message.delete().catch(O_o => {}); 47 | 48 | let embed = new Discord.RichEmbed() 49 | .setTitle('Discord Invite Detected') 50 | .setColor(config.red) 51 | .setDescription(`${message.author}, you are not allowed to advertise other Discords`); 52 | message.channel.send(embed); 53 | 54 | console.log(chalk.green(`[${message.guild}]`) + ` ${message.author.username} advertised a Discord server in their message.`); 55 | return; 56 | } 57 | }; 58 | 59 | // Swear Detector 60 | const swearWords = ['shit', 'fuck', 'bitch', 'nigger', 'nigga', 'cunt', 'whore', 'fag', 'faggot', 'dick', 'cock', 'pussy', 'slut', 'bastard']; 61 | if (config.swearfilter == true) { 62 | if (swearWords.some(word => message.content.toLowerCase().includes(word))) { 63 | message.delete().catch(O_o => {}); 64 | 65 | let embed = new Discord.RichEmbed() 66 | .setTitle('Swear Word Detected') 67 | .setColor(config.red) 68 | .setDescription(`${message.author}, you can't say that.`); 69 | message.channel.send(embed).then(message => message.delete(3000)); 70 | return; 71 | } 72 | }; 73 | }); 74 | 75 | client.login(process.env.discordapitoken); -------------------------------------------------------------------------------- /commands/avatar.js: -------------------------------------------------------------------------------- 1 | const Discord = require('discord.js'); 2 | const config = require('../config.json'); 3 | const errors = require('../util/errors.js'); 4 | 5 | module.exports.run = async (client, message, args) => { 6 | if (args == 'help') { 7 | let embed = new Discord.RichEmbed() 8 | .setTitle(`${module.exports.help.name} Command Information`) 9 | .setDescription(`${module.exports.help.description}`) 10 | .addField('Usage', `${config.prefix}${module.exports.help.usage}`) 11 | .setColor(config.cyan) 12 | message.channel.send(embed); 13 | return 14 | }; 15 | 16 | let user = message.mentions.members.first(); 17 | if (!user) return errors.invalidUser(message); 18 | 19 | let embed = new Discord.RichEmbed() 20 | .setTitle(`${user.displayName}'s avatar.`) 21 | .setImage(user.user.displayAvatarURL); 22 | message.channel.send(embed); 23 | return 24 | }; 25 | 26 | module.exports.help = { 27 | name: 'avatar', 28 | description: 'This will allow you to display a users avatar.', 29 | usage: `avatar [@user]` 30 | }; 31 | -------------------------------------------------------------------------------- /commands/ban.js: -------------------------------------------------------------------------------- 1 | const Discord = require('discord.js'); 2 | const config = require('../config.json'); 3 | const errors = require('../util/errors.js'); 4 | const chalk = require('chalk'); 5 | 6 | module.exports.run = async (client, message, args) => { 7 | if (args == 'help') { 8 | let embed = new Discord.RichEmbed() 9 | .setTitle(`${module.exports.help.name} Command Information`) 10 | .setDescription(`${module.exports.help.description}`) 11 | .addField('Usage', `${config.prefix}${module.exports.help.usage}`, true) 12 | .addField('Permission', `${module.exports.help.permission}`, true) 13 | .setColor(config.cyan) 14 | message.channel.send(embed); 15 | return 16 | }; 17 | 18 | if (!message.member.hasPermission(`${module.exports.help.permission}`)) return errors.noPermissions(message, `${module.exports.help.permission}`); 19 | 20 | let user = message.mentions.members.first(); 21 | if (!user) return errors.invalidUser(message); 22 | 23 | let reason = args.slice(1).join(' '); 24 | if (!reason) return errors.invalidReason(message); 25 | 26 | if (user.hasPermission(`${module.exports.help.permission}`)) return errors.cannotPunish(message); 27 | 28 | let createdAtRaw = message.createdAt.toDateString(); 29 | let createdAt = createdAtRaw.split(' '); 30 | 31 | let embed = new Discord.RichEmbed() 32 | .setTitle('User has been banned') 33 | .setColor(config.red) 34 | .addField('Banned User', `${user}`, true) 35 | .addField('Banned By', `${message.author}`, true) 36 | .addField('Banned in Channel', message.channel) 37 | .addField('Time', `${createdAt[0]} ${createdAt[2]} ${createdAt[1]} ${createdAt[3]}`, true) 38 | .addField('Reason', reason); 39 | 40 | let auditlogchannel = message.guild.channels.find(c => c.name === 'audit-log'); 41 | 42 | auditlogchannel.send(embed).catch(e => { 43 | errors.noLogChannel(message); 44 | }) 45 | await user.send(embed).catch(e => { }); 46 | 47 | message.guild.member(user).ban(reason); 48 | console.log(chalk.yellow(`[${message.guild}]`) + ` ${message.author.username} has banned ${user.user.username} from ${message.guild} for ${reason}.`); 49 | return 50 | }; 51 | 52 | module.exports.help = { 53 | name: 'ban', 54 | description: 'This will permanently bans a user from the guild with the reason provided.', 55 | permission: 'BAN_MEMBERS', 56 | usage: 'ban [@user] [reason]' 57 | }; 58 | -------------------------------------------------------------------------------- /commands/botinfo.js: -------------------------------------------------------------------------------- 1 | const Discord = require('discord.js'); 2 | const { 3 | version 4 | } = require('discord.js'); 5 | const config = require('../config.json'); 6 | 7 | module.exports.run = async (client, message, args) => { 8 | if (args == 'help') { 9 | let embed = new Discord.RichEmbed() 10 | .setTitle(`${module.exports.help.name} Command Information`) 11 | .setDescription(`${module.exports.help.description}`) 12 | .addField('Usage', `${config.prefix}${module.exports.help.usage}`, true) 13 | .setColor(config.cyan) 14 | message.channel.send(embed); 15 | return 16 | }; 17 | 18 | function time(milliseconds) { 19 | let day, hour, minute, seconds; 20 | 21 | seconds = Math.floor(milliseconds / 1000); 22 | minute = Math.floor(seconds / 60); 23 | seconds = seconds % 60; 24 | hour = Math.floor(minute / 60); 25 | minute = minute % 60; 26 | day = Math.floor(hour / 24); 27 | hour = hour % 24; 28 | 29 | let string = `\`${day}\` %day%, \`${hour}\` %hour%, \`${minute}\` %minute% and \`${seconds}\` %seconds%`; 30 | 31 | string = string.replace("%day%", "day" + (day === 1 ? "" : "s")); 32 | string = string.replace("%hour%", "hour" + (hour === 1 ? "" : "s")); 33 | string = string.replace("%minute%", "minute" + (minute === 1 ? "" : "s")); 34 | string = string.replace("%seconds%", "second" + (seconds === 1 ? "" : "s")); 35 | 36 | return string; 37 | }; 38 | 39 | let icon = client.user.displayAvatarURL; 40 | let embed = new Discord.RichEmbed() 41 | 42 | .setTitle(`Information about ${client.user.username}`) 43 | .setColor(config.white) 44 | .setThumbnail(icon) 45 | .addField('Bot Name', client.user.username, true) 46 | .addField('Guild Count', client.guilds.size, true) 47 | .addField('Discord.js Version', `v${version}`, true) 48 | .addField('Node Version', `${process.version}`, true) 49 | .addField('Memory Usage', `${(((process.memoryUsage().heapUsed)/1024)/1024).toFixed(0)}MBs of RAM`, true) 50 | .addField('User Count', client.users.size, true) 51 | .addField('Uptime', `${time(client.uptime)}`); 52 | 53 | return message.channel.send(embed); 54 | }; 55 | 56 | module.exports.help = { 57 | name: 'botinfo', 58 | description: 'Displays information about the bot.', 59 | usage: 'botinfo' 60 | }; -------------------------------------------------------------------------------- /commands/botinvite.js: -------------------------------------------------------------------------------- 1 | const Discord = require('discord.js'); 2 | const config = require('../config.json'); 3 | const errors = require('../util/errors.js'); 4 | 5 | module.exports.run = async (client, message, args) => { 6 | if (args == 'help') { 7 | let embed = new Discord.RichEmbed() 8 | .setTitle(`${module.exports.help.name} Command Information`) 9 | .setDescription(`${module.exports.help.description}`) 10 | .addField('Usage', `${config.prefix}${module.exports.help.usage}`, true) 11 | .setColor(config.cyan) 12 | message.channel.send(embed); 13 | return 14 | }; 15 | 16 | if (!args[0] < 17) return errors.invalidClientID(message); 17 | let inputid = args.join(' '); 18 | 19 | let embed = new Discord.RichEmbed() 20 | .setColor(config.green) 21 | .setDescription(`Here is a link to invite your bot:\nhttps://discordapp.com/oauth2/authorize?client_id=${inputid}&scope=bot`) 22 | 23 | message.channel.send(embed); 24 | return 25 | }; 26 | 27 | module.exports.help = { 28 | name: 'botinvite', 29 | description: 'Users can use this as an easy utility to invite bots to their servers, or yours if you allow it.', 30 | usage: 'botinvite [client id]' 31 | }; -------------------------------------------------------------------------------- /commands/github.js: -------------------------------------------------------------------------------- 1 | const Discord = require('discord.js'); 2 | const config = require('../config.json'); 3 | const package = require('../package.json'); 4 | 5 | module.exports.run = async (client, message, args) => { 6 | if (args == 'help') { 7 | let embed = new Discord.RichEmbed() 8 | .setTitle(`${module.exports.help.name} Command Information`) 9 | .setDescription(`${module.exports.help.description}`) 10 | .addField('Usage', `${config.prefix}${module.exports.help.usage}`, true) 11 | .setColor(config.cyan) 12 | message.channel.send(embed); 13 | return 14 | }; 15 | 16 | let embed = new Discord.RichEmbed() 17 | .setTitle('GitHub') 18 | .setThumbnail('https://upload.wikimedia.org/wikipedia/commons/thumb/9/91/Octicons-mark-github.svg/2000px-Octicons-mark-github.svg.png') 19 | .setURL(package.homepage) 20 | .setDescription(`If you didn't know, this Discord bot is Open Source, feel free to add or to fork your own version of the bot.\nIf you would like to report an issue or make a suggestion in the bot development, please do so on the tracker: ${package.homepage}`) 21 | 22 | message.channel.send(embed); 23 | return 24 | } 25 | 26 | module.exports.help = { 27 | name: 'github', 28 | description: 'This displays information and a URL to the Open Source project.', 29 | usage: 'github' 30 | } -------------------------------------------------------------------------------- /commands/guildinfo.js: -------------------------------------------------------------------------------- 1 | const Discord = require('discord.js'); 2 | const config = require('../config.json'); 3 | 4 | module.exports.run = async (client, message, args) => { 5 | if (args == 'help') { 6 | let embed = new Discord.RichEmbed() 7 | .setTitle(`${module.exports.help.name} Command Information`) 8 | .setDescription(`${module.exports.help.description}`) 9 | .addField('Usage', `${config.prefix}${module.exports.help.usage}`, true) 10 | .setColor(config.cyan) 11 | message.channel.send(embed); 12 | return 13 | }; 14 | 15 | let guild = message.guild; 16 | let large = message.guild.large ? "✅" : "❎"; 17 | let icon = message.guild.iconURL; 18 | 19 | let createdAtRaw = guild.createdAt.toDateString(); 20 | let createdAt = createdAtRaw.split(" "); 21 | 22 | let textChannels = message.guild.channels.filter(c => c.type === 'text').size; 23 | let voiceChannels = message.guild.channels.filter(c => c.type === 'voice').size 24 | /* 25 | guild.channels.forEach(channel => { 26 | channel.type === "text" ? textChannels++ : voiceChannels++; 27 | });*/ 28 | 29 | const emojis = message.guild.emojis.map(e => e.toString()).join(" "); 30 | const roles = message.guild.roles.map(e => e.toString()).join(" "); 31 | 32 | let embed = new Discord.RichEmbed() 33 | .setTitle(`Information about ${message.guild.name}`) 34 | .setColor(config.white) 35 | .setThumbnail(icon) 36 | .addField('Guild Name', guild.name, true) 37 | .addField('Guild ID', guild.id, true) 38 | .addField('Guild Owner', guild.owner, true) 39 | .addField('Created At', `${createdAt[0]} ${createdAt[2]} ${createdAt[1]} ${createdAt[3]}`, true) 40 | .addField('Server Region', guild.region.toUpperCase(), true) 41 | .addField('Members', message.guild.members.filter(member => !member.user.bot).size, true) 42 | .addField('Bots', message.guild.members.filter(member => member.user.bot).size, true) 43 | .addField('Large', large, true) 44 | .addField('Verification Level', veriToText(guild.verificationLevel), true) 45 | .addField('Text Channels', textChannels, true) 46 | .addField('Text Channels', voiceChannels, true) 47 | .addField('Roles', roles, true) 48 | .addField('Emojis', emojis, true) 49 | 50 | return message.channel.send(embed); 51 | } 52 | 53 | module.exports.help = { 54 | name: 'guildinfo', 55 | description: 'Displays information about the guild.', 56 | usage: 'guildinfo' 57 | } 58 | 59 | function veriToText(lvl) { 60 | switch (lvl) { 61 | case 0: 62 | return "None"; 63 | case 1: 64 | return "Verified Email"; 65 | case 2: 66 | return "Verified Email & Registered on Discord for 5 Minutes or More."; 67 | case 3: 68 | return "Verified Email & Registered on Discord for 10 Minutes or More."; 69 | case 4: 70 | return "Verified Phone."; 71 | default: 72 | return "Ultra???" 73 | } 74 | } 75 | -------------------------------------------------------------------------------- /commands/hastebin.js: -------------------------------------------------------------------------------- 1 | const Discord = require('discord.js'); 2 | const config = require('../config.json'); 3 | const errors = require('../util/errors.js'); 4 | const snekfetch = require('snekfetch'); 5 | const chalk = require('chalk'); 6 | 7 | module.exports.run = async (client, message, args) => { 8 | if (args == 'help') { 9 | let embed = new Discord.RichEmbed() 10 | .setTitle(`${module.exports.help.name} Command Information`) 11 | .setDescription(`${module.exports.help.description}`) 12 | .addField('Usage', `${config.prefix}${module.exports.help.usage}`, true) 13 | .setColor(config.cyan) 14 | message.channel.send(embed); 15 | return 16 | }; 17 | 18 | if (!args.slice(0) 19 | .join(' ')) return errors.emptyCode(message) 20 | snekfetch.post('https://hastebin.com/documents') 21 | .send(args.slice(0) 22 | .join(' ')) 23 | .then(body => { 24 | let embed = new Discord.RichEmbed() 25 | .setTitle('Your hastebin has been posted.') 26 | .setURL(`https://hastebin.com/${body.body.key}`) 27 | .setDescription(`Posted text to Hastebin\nURL: https://hastebin.com/${body.body.key}`) 28 | .setColor(config.green); 29 | 30 | message.channel.send(embed); 31 | console.log(chalk.yellow(`[${message.guild}]`) + ` ${message.author.username} generated a hastebin at https://hastebin.com/${body.body.key}`); 32 | }); 33 | }; 34 | 35 | module.exports.help = { 36 | name: 'hastebin', 37 | description: 'This will allow users to take a selected amount of text and export it to the site hastebin.', 38 | usage: 'hastebin [content]' 39 | }; -------------------------------------------------------------------------------- /commands/help.js: -------------------------------------------------------------------------------- 1 | const Discord = require('discord.js'); 2 | const config = require('../config.json'); 3 | 4 | module.exports.run = async (client, message, args) => { 5 | const commandNames = Array.from(client.commands.keys()); 6 | const longest = commandNames.reduce((long, str) => Math.max(long, str.length), 0); 7 | 8 | message.channel.sendCode('asciidoc', `= Command List =\n\n\ NOTE: You can use '/COMMAND help' to get help with the command. \n\n${client.commands.map(c => `${config.prefix}${c.help.name}${' '.repeat(longest - c.help.name.length)} :: ${c.help.description}`).join('\n')}`); 9 | }; 10 | 11 | module.exports.help = { 12 | name: 'help', 13 | description: 'Displays all commands and descriptions.', 14 | usage: 'help' 15 | }; -------------------------------------------------------------------------------- /commands/invite.js: -------------------------------------------------------------------------------- 1 | const Discord = require('discord.js'); 2 | const config = require('../config.json'); 3 | const errors = require('../util/errors.js'); 4 | const chalk = require('chalk'); 5 | 6 | module.exports.run = async (client, message, args) => { 7 | if (args == 'help') { 8 | let embed = new Discord.RichEmbed() 9 | .setTitle(`${module.exports.help.name} Command Information`) 10 | .setDescription(`${module.exports.help.description}`) 11 | .addField('Usage', `${config.prefix}${module.exports.help.usage}`, true) 12 | .setColor(config.cyan) 13 | message.channel.send(embed); 14 | return 15 | }; 16 | 17 | message.channel.createInvite() 18 | .then((invite) => { 19 | let embed = new Discord.RichEmbed() 20 | .setTitle('Instant Invite Created!') 21 | .setColor(config.yellow) 22 | .setURL(`https://discord.gg/${invite.code}`) 23 | .setDescription(`Successfully created an invite!\nhttps://discord.gg/${invite.code}`) 24 | message.channel.send(embed); 25 | 26 | console.log(chalk.yellow(`[${message.guild}]`) + ` ${message.author.username} has generated an invite to the guild ${message.guild}: https://discord.gg/${invite.code}`); 27 | }); 28 | }; 29 | 30 | module.exports.help = { 31 | name: 'invite', 32 | description: 'Generates an instant invite to your guild.', 33 | usage: 'invite' 34 | }; -------------------------------------------------------------------------------- /commands/kick.js: -------------------------------------------------------------------------------- 1 | const Discord = require('discord.js'); 2 | const config = require('../config.json'); 3 | const errors = require('../util/errors.js'); 4 | const chalk = require('chalk'); 5 | 6 | module.exports.run = async (client, message, args) => { 7 | if (args == 'help') { 8 | let embed = new Discord.RichEmbed() 9 | .setTitle(`${module.exports.help.name} Command Information`) 10 | .setDescription(`${module.exports.help.description}`) 11 | .addField('Usage', `${config.prefix}${module.exports.help.usage}`, true) 12 | .addField('Permission', `${module.exports.help.permission}`, true) 13 | .setColor(config.cyan) 14 | message.channel.send(embed); 15 | return 16 | }; 17 | 18 | if (!message.member.hasPermission(`${module.exports.help.permission}`)) return errors.noPermissions(message, `${module.exports.help.permission}`); 19 | 20 | let user = message.mentions.members.first(); 21 | if (!user) return errors.invalidUser(message); 22 | 23 | let reason = args.slice(1).join(" "); 24 | if (!reason) return errors.invalidReason(message); 25 | 26 | if (user.hasPermission(`${module.exports.help.permission}`)) return errors.cannotPunish(message); 27 | 28 | let createdAtRaw = message.createdAt.toDateString(); 29 | let createdAt = createdAtRaw.split(' '); 30 | 31 | let embed = new Discord.RichEmbed() 32 | .setTitle('User has been Kicked') 33 | .setColor(config.blue) 34 | .addField('Kicked User:', `${user}`) 35 | .addField('Kicked By:', `${message.author}`) 36 | .addField('Kicked in Channel:', message.channel) 37 | .addField('Time', `${createdAt[0]} ${createdAt[2]} ${createdAt[1]} ${createdAt[3]}`) 38 | .addField('Reason:', reason); 39 | 40 | let auditlogchannel = message.guild.channels.find(c => c.name === 'audit-log'); 41 | 42 | auditlogchannel.send(embed).catch(e => { 43 | errors.noLogChannel(message); 44 | }) 45 | 46 | await user.send(embed).catch(e => { }) 47 | 48 | message.guild.member(user).kick(reason); 49 | console.log(chalk.yellow(`[${message.guild}]`) + ` ${message.author.username} has kicked ${user.user.username} from ${message.guild} for ${reason}.`); 50 | return 51 | }; 52 | 53 | module.exports.help = { 54 | name: 'kick', 55 | description: 'Kicks the mentioned user from the guild with the reason provided.', 56 | permission: 'MANAGE_MESSAGES', 57 | usage: 'kick [@user] [reason]' 58 | }; 59 | -------------------------------------------------------------------------------- /commands/lockdown.js: -------------------------------------------------------------------------------- 1 | const Discord = require('discord.js'); 2 | const config = require('../config.json'); 3 | const errors = require('../util/errors.js'); 4 | const ms = require('ms'); 5 | const chalk = require('chalk'); 6 | 7 | module.exports.run = async (client, message, args) => { 8 | if (args == 'help') { 9 | let embed = new Discord.RichEmbed() 10 | .setTitle(`${module.exports.help.name} Command Information`) 11 | .setDescription(`${module.exports.help.description}`) 12 | .addField('Usage', `${config.prefix}${module.exports.help.usage}`, true) 13 | .addField('Permission', `${module.exports.help.permission}`, true) 14 | .setColor(config.cyan) 15 | message.channel.send(embed); 16 | return 17 | }; 18 | 19 | if (!message.member.hasPermission(`${module.exports.help.permission}`)) return errors.noPermissions(message, `${module.exports.help.permission}`); 20 | 21 | if (!client.lockit) client.lockit = []; 22 | let time = args.join(' '); 23 | let validUnlocks = ['release', 'unlock']; 24 | if (!time) return errors.invalidTime(message); 25 | 26 | if (validUnlocks.includes(time)) { 27 | message.channel.overwritePermissions(message.guild.id, { 28 | SEND_MESSAGES: null 29 | }).then(() => { 30 | let embed = new Discord.RichEmbed() 31 | .setColor(config.green) 32 | .setDescription('Lockdown has been lifted.') 33 | message.channel.send(embed); 34 | console.log(`[${message.guild}] The lockdown on #${message.channel.name} has been lifted.`); 35 | 36 | clearTimeout(client.lockit[message.channel.id]); 37 | delete client.lockit[message.channel.id]; 38 | }).catch(error => { 39 | console.log(error); 40 | }); 41 | } else { 42 | message.channel.overwritePermissions(message.guild.id, { 43 | SEND_MESSAGES: false 44 | }).then(() => { 45 | let embed = new Discord.RichEmbed() 46 | .setTitle('This channel has been locked down!') 47 | .setColor(config.red) 48 | .setDescription(`${message.channel} has been locked down for ${ms(ms(time), { long:true })} by ${message.author.username}`) 49 | message.channel.send(embed); 50 | console.log(chalk.yellow(`[${message.guild}]`) + ` ${message.author.username} has locked down #${message.channel.name}.`); 51 | 52 | client.lockit[message.channel.id] = setTimeout(() => { 53 | message.channel.overwritePermissions(message.guild.id, { 54 | SEND_MESSAGES: null 55 | }) 56 | 57 | let embed = new Discord.RichEmbed() 58 | .setColor(config.green) 59 | .setDescription('Lockdown has been lifted.') 60 | message.channel.send(embed); 61 | console.log(chalk.yellow(`[${message.guild}]`) + ` The lockdown on #${message.channel.name} has been lifted.`); 62 | 63 | delete client.lockit[message.channel.id]; 64 | }, ms(time)); 65 | }) 66 | } 67 | }; 68 | 69 | module.exports.help = { 70 | name: 'lockdown', 71 | description: 'Temporarily lock any channel from interaction from other users.', 72 | permission: 'MANAGE_MESSAGES', 73 | usage: 'lockdown [h/m/s] unlock, release' 74 | }; -------------------------------------------------------------------------------- /commands/mcstatus.js: -------------------------------------------------------------------------------- 1 | const Discord = require('discord.js'); 2 | const config = require('../config.json'); 3 | const superagent = require('superagent'); 4 | const errors = require('../util/errors.js'); 5 | 6 | module.exports.run = async (client, message, args) => { 7 | if (args == 'help') { 8 | let embed = new Discord.RichEmbed() 9 | .setTitle(`${module.exports.help.name} Command Information`) 10 | .setDescription(`${module.exports.help.description}`) 11 | .addField('Usage', `${config.prefix}${module.exports.help.usage}`, true) 12 | .setColor(config.cyan) 13 | message.channel.send(embed); 14 | return 15 | }; 16 | 17 | let mcIP = args[0]; 18 | if (!mcIP) return errors.invalidIP(message); 19 | 20 | let { 21 | body 22 | } = await superagent 23 | .get('http://mcapi.us/server/status?ip=' + mcIP); 24 | let status = body.online ? "✅" : "❎"; 25 | 26 | let embed = new Discord.RichEmbed() 27 | .setTitle(`Information about ${mcIP}`) 28 | .setThumbnail('https://vignette.wikia.nocookie.net/minecraftpocketedition/images/f/f1/Minecraft_1.2_Logo.png/revision/latest?cb=20171204231225') 29 | .setColor(body.online ? config.green : config.red) 30 | .addField('Server Online', status) 31 | .addField('Players On', body.players.now, true) 32 | .addField('Max Players', body.players.max, true); 33 | message.channel.send(embed); 34 | 35 | console.log(chalk.yellow(`[${message.guild}]`) + ` ${message.author.username} requested the Minecraft Server status for ${mcIP}`); 36 | return 37 | }; 38 | 39 | module.exports.help = { 40 | name: 'mcstatus', 41 | description: 'Display information about a Minecraft Server.', 42 | usage: 'mcstatus [ip]' 43 | }; -------------------------------------------------------------------------------- /commands/meme.js: -------------------------------------------------------------------------------- 1 | const Discord = require('discord.js'); 2 | const config = require('../config.json'); 3 | const meme = require('memejsfork'); 4 | 5 | module.exports.run = async (client, message, args) => { 6 | if (args == 'help') { 7 | let embed = new Discord.RichEmbed() 8 | .setTitle(`${module.exports.help.name} Command Information`) 9 | .setDescription(`${module.exports.help.description}`) 10 | .addField('Usage', `${config.prefix}${module.exports.help.usage}`, true) 11 | .setColor(config.cyan) 12 | message.channel.send(embed); 13 | return 14 | }; 15 | 16 | meme(function (data) { 17 | const embed = new Discord.RichEmbed() 18 | .setTitle(data.title[0]) 19 | .setURL(data.url[0]) 20 | .setDescription(`From r/${data.subreddit[0]} by ${data.author[0]}`) 21 | .setImage(data.url[0]) 22 | message.channel.send({ 23 | embed 24 | }); 25 | }); 26 | }; 27 | 28 | module.exports.help = { 29 | name: 'meme', 30 | description: 'Generate a meme.', 31 | usage: 'meme' 32 | }; -------------------------------------------------------------------------------- /commands/mojangapi.js: -------------------------------------------------------------------------------- 1 | const Discord = require('discord.js'); 2 | const config = require('../config.json'); 3 | const superagent = require('superagent'); 4 | const request = require('request'); 5 | 6 | module.exports.run = async (client, message, args) => { 7 | if (args == 'help') { 8 | let embed = new Discord.RichEmbed() 9 | .setTitle(`${module.exports.help.name} Command Information`) 10 | .setDescription(`${module.exports.help.description}`) 11 | .addField('Usage', `${config.prefix}${module.exports.help.usage}`, true) 12 | .setColor(config.cyan) 13 | message.channel.send(embed); 14 | return 15 | }; 16 | 17 | const url = 'https://status.mojang.com/check'; 18 | const testOffline = '[{"minecraft.net":"red"},{"session.minecraft.net":"green"},{"account.mojang.com":"green"},{"authserver.mojang.com":"red"},{"sessionserver.mojang.com":"green"},{"api.mojang.com":"green"},{"textures.minecraft.net":"red"},{"mojang.com":"red"}]'; 19 | request(url, function (err, response, body) { 20 | if (err) { 21 | console.log(err); 22 | return message.reply('Sorry, cannot get Mojang status at this time.'); 23 | }; 24 | 25 | body = JSON.parse(body); 26 | //testOff = JSON.parse(testOffline); 27 | const embed = new Discord.RichEmbed().addField(`${Object.keys(body[0])[0]}`, `${body[0]['minecraft.net'] ==="green" ? '**Up And Online!** :white_check_mark: ' : '**Looks like the servers are having issues right now :x:**'}`) //Minecraft.net 28 | .addField(`${Object.keys(body[1])[0]}`, `${body[1]['session.minecraft.net'] === "green" ? '**Up And Online!** :white_check_mark: ' : '**Looks like the servers are having issues right now :x:**'}`) //session.minecraft.net 29 | .addField(`${Object.keys(body[2])[0]}`, `${body[2]['account.mojang.com'] ==="green"? '**Up And Online!** :white_check_mark: ' : '**Looks like the servers are having issues right now :x:**'}`) //account.mojang.com 30 | .addField(`${Object.keys(body[3])[0]}`, `${body[3]['authserver.mojang.com'] ==="green"? '**Up And Online!** :white_check_mark: ' : '**Looks like the servers are having issues right now :x:**'}`) //authserver.mojang.com 31 | .addField(`${Object.keys(body[4])[0]}`, `${body[4]['sessionserver.mojang.com'] ==="green"? '**Up And Online!** :white_check_mark: ' : '**Looks like the servers are having issues right now :x:**'}`) //sessionserver.mojang.com 32 | .addField(`${Object.keys(body[5])[0]}`, `${body[5]['api.mojang.com'] ==="green"? '**Up And Online!** :white_check_mark: ' : '**Looks like the servers are having issues right now :x:**'}`) //api.mojang.com 33 | .addField(`${Object.keys(body[6])[0]}`, `${body[6]['textures.minecraft.net'] ==="green"? '**Up And Online!** :white_check_mark: ' : '**Looks like the servers are having issues right now :x:**'}`) //textures.minecraft.net 34 | .addField(`${Object.keys(body[7])[0]}`, `${body[7]['mojang.com'] ==="green"? '**Up And Online!** :white_check_mark: ' : '**Looks like the servers are having issues right now :x:**'}`) //mojang.com 35 | .setThumbnail('https://vignette.wikia.nocookie.net/logopedia/images/d/d6/Mojang_ab_logo_vector.png/revision/latest?cb=20120306163913') 36 | .setColor(config.green) 37 | message.channel.send(embed); 38 | }); 39 | }; 40 | 41 | module.exports.help = { 42 | name: 'mojangapi', 43 | description: 'This command allows users to check the status of the Mojang APIs.', 44 | usage: 'mojangapi' 45 | }; -------------------------------------------------------------------------------- /commands/mute.js: -------------------------------------------------------------------------------- 1 | const Discord = require('discord.js'); 2 | const config = require('../config.json'); 3 | const ms = require('ms'); 4 | const errors = require('../util/errors.js'); 5 | const chalk = require('chalk'); 6 | 7 | module.exports.run = async (client, message, args) => { 8 | if (args[0] == 'help') { 9 | let embed = new Discord.RichEmbed() 10 | .setTitle(`${module.exports.help.name} Command Information`) 11 | .setDescription(`${module.exports.help.description}`) 12 | .addField('Usage', `${config.prefix}${module.exports.help.usage}`, true) 13 | .addField('Permission', `${module.exports.help.permission}`, true) 14 | .setColor(config.cyan) 15 | message.channel.send(embed); 16 | return 17 | }; 18 | 19 | if (!message.member.hasPermission(`${module.exports.help.permission}`)) return errors.noPermissions(message, `${module.exports.help.permission}`); 20 | 21 | let user = message.mentions.members.first(); 22 | if (!user) return errors.invalidUser(message); 23 | if (user.hasPermission(`${module.exports.help.permission}`)) return errors.cannotPunish(message); 24 | 25 | let reason = args.slice(2).join(" "); 26 | if (!reason) return errors.invalidReason(message); 27 | 28 | let muterole = message.guild.roles.find(c => c.name === 'Muted'); 29 | if (!muterole) { 30 | try { 31 | muterole = await message.guild.createRole({ 32 | name: 'Muted', 33 | color: "#000000", 34 | permissions: [] 35 | }) 36 | message.guild.channels.forEach(async (channel, id) => { 37 | await channel.overwritePermissions(muterole, { 38 | SEND_MESSAGES: false, 39 | ADD_REACTIONS: false, 40 | SPEAK: false 41 | }); 42 | }); 43 | } catch (e) { 44 | console.log(e.stack); 45 | } 46 | }; 47 | if (user.roles.has(muterole.id)) return errors.userAlreadyMuted(message); 48 | 49 | let time = args[1]; 50 | if (!time) return errors.invalidTime(message); 51 | 52 | let embed = new Discord.RichEmbed() 53 | .setTitle('User has been Temporarily Muted') 54 | .setColor(config.red) 55 | .addField('Muted User', `${user}`, true) 56 | .addField('Muted By', `${message.author}`, true) 57 | .addField('Muted For', time) 58 | .addField('Time', message.createdAt) 59 | .addField('Reason', reason); 60 | 61 | let auditlogchannel = message.guild.channels.find(c => c.name === 'audit-log'); 62 | 63 | message.delete().catch(O_o => {}); 64 | auditlogchannel.send(embed).catch(e => { 65 | errors.noLogChannel(message); 66 | }); 67 | user.send(embed); 68 | console.log(chalk.yellow(`[${message.guild}]`) + ` ${message.author.username} has muted ${user.user.username} in ${message.guild} for ${time} for ${reason}.`); 69 | 70 | await (user.addRole(muterole.id)); 71 | 72 | setTimeout(() => { 73 | if (user.roles.has(muterole.id)) { 74 | user.removeRole(muterole.id); 75 | let embed = new Discord.RichEmbed() 76 | .setTitle('User has been Unmuted') 77 | .setColor(config.yellow) 78 | .addField('Muted User', `${user}`) 79 | auditlogchannel.send(embed); 80 | } 81 | }, ms(time)); 82 | }; 83 | 84 | module.exports.help = { 85 | name: 'mute', 86 | description: 'Temporarily mutes a user.', 87 | permission: 'MANAGE_MESSAGES', 88 | usage: 'mute [@user] [h/m/s] [reason]' 89 | }; 90 | -------------------------------------------------------------------------------- /commands/poll.js: -------------------------------------------------------------------------------- 1 | const Discord = require('discord.js'); 2 | const config = require('../config.json'); 3 | const errors = require('../util/errors.js'); 4 | const chalk = require('chalk'); 5 | 6 | module.exports.run = async (client, message, args) => { 7 | if (args == 'help') { 8 | let embed = new Discord.RichEmbed() 9 | .setTitle(`${module.exports.help.name} Command Information`) 10 | .setDescription(`${module.exports.help.description}`) 11 | .addField('Usage', `${config.prefix}${module.exports.help.usage}`, true) 12 | .setColor(config.cyan) 13 | message.channel.send(embed); 14 | return 15 | }; 16 | 17 | if (args == 0) return errors.invalidPoll(message); 18 | 19 | let embed = new Discord.RichEmbed() 20 | .setTitle(`Poll by ${message.author.username}`) 21 | .setColor(config.yellow) 22 | .setDescription(`${args}`.split(',').join(' ')); 23 | 24 | console.log(chalk.yellow(`[${message.guild}]`) + ` ${message.author.username} has created a poll with the question: ${args}.`); 25 | return message.channel.send(embed).then(message.delete()) 26 | 27 | .then(function (message, str) { 28 | message.react("👍") 29 | message.react("👎") 30 | }).catch(function () {}); 31 | }; 32 | 33 | module.exports.help = { 34 | name: 'poll', 35 | description: 'Make a poll with a question with thumbs up and down reactions.', 36 | usage: 'poll [question]' 37 | }; -------------------------------------------------------------------------------- /commands/purge.js: -------------------------------------------------------------------------------- 1 | const Discord = require('discord.js'); 2 | const config = require('../config.json'); 3 | const errors = require('../util/errors.js'); 4 | const chalk = require('chalk'); 5 | 6 | module.exports.run = async (client, message, args) => { 7 | if (args == 'help') { 8 | let embed = new Discord.RichEmbed() 9 | .setTitle(`${module.exports.help.name} Command Information`) 10 | .setDescription(`${module.exports.help.description}`) 11 | .addField('Usage', `${config.prefix}${module.exports.help.usage}`, true) 12 | .addField('Permission', `${module.exports.help.permission}`, true) 13 | .setColor(config.cyan) 14 | message.channel.send(embed); 15 | return 16 | }; 17 | 18 | if (!message.member.hasPermission(`${module.exports.help.permission}`)) return errors.noPermissions(message, `${module.exports.help.permission}`); 19 | 20 | if (isNaN(args[0])) return errors.provideNumber(message); 21 | if (args[0] > 100) return errors.anotherNumber(message); 22 | 23 | message.channel.bulkDelete(args[0]).then(() => { 24 | let embed = new Discord.RichEmbed() 25 | .setTitle('Messages Cleared!') 26 | .setColor(config.green) 27 | .setDescription(`Deleted ${args[0]} messages.`) 28 | message.channel.send(embed).then(message.delete(5000)); 29 | return 30 | }) 31 | 32 | let createdAtRaw = message.createdAt.toDateString(); 33 | let createdAt = createdAtRaw.split(' '); 34 | 35 | let embed = new Discord.RichEmbed() 36 | .setTitle('Messages Purged!') 37 | .setColor(config.green) 38 | .addField('Purged By', `${message.author}`, true) 39 | .addField('Number of Messages', args, true) 40 | .addField('Channel', message.channel, true) 41 | .addField('Time', `${createdAt[0]} ${createdAt[2]} ${createdAt[1]} ${createdAt[3]}`) 42 | 43 | let auditlogchannel = message.guild.channels.find(c => c.name === 'audit-log'); 44 | if (!auditlogchannel) return errors.noLogChannel(message); 45 | 46 | auditlogchannel.send(embed); 47 | console.log(chalk.yellow(`[${message.guild}]`) + ` ${args} messages have been purged from ${message.channel.name} by ${message.author.username}`); 48 | return 49 | }; 50 | 51 | module.exports.help = { 52 | name: 'purge', 53 | description: 'This allows messages to be deleted from a channel.', 54 | permission: 'MANAGE_MESSAGES', 55 | usage: 'purge [number of messages [max 100]]' 56 | }; -------------------------------------------------------------------------------- /commands/report.js: -------------------------------------------------------------------------------- 1 | const Discord = require('discord.js'); 2 | const config = require('../config.json'); 3 | const errors = require('../util/errors.js'); 4 | const chalk = require('chalk'); 5 | 6 | module.exports.run = async (client, message, args) => { 7 | if (args == 'help') { 8 | let embed = new Discord.RichEmbed() 9 | .setTitle(`${module.exports.help.name} Command Information`) 10 | .setDescription(`${module.exports.help.description}`) 11 | .addField('Usage', `${config.prefix}${module.exports.help.usage}`, true) 12 | .setColor(config.cyan) 13 | message.channel.send(embed); 14 | return 15 | }; 16 | 17 | let user = message.guild.member(message.mentions.members.first()); 18 | if (!user) return errors.invalidUser(message); 19 | 20 | let reason = args.slice(1).join(" "); 21 | if (!reason) return errors.invalidReason(message); 22 | 23 | let createdAtRaw = message.createdAt.toDateString(); 24 | let createdAt = createdAtRaw.split(" "); 25 | 26 | let embed = new Discord.RichEmbed() 27 | .setTitle('Incoming Report!') 28 | .setColor(config.yellow) 29 | .addField('Reported User', `${user}`, true) 30 | .addField('Reported By', `${message.author}`, true) 31 | .addField('Reported in Channel', message.channel, true) 32 | .addField('Time', `${createdAt[0]} ${createdAt[2]} ${createdAt[1]} ${createdAt[3]}`) 33 | .addField('Reason', reason) 34 | 35 | let reportschannel = message.guild.channels.find('name', 'reports'); 36 | if (!reportschannel) return errors.noReportChannel(message); 37 | 38 | message.delete().catch(O_o => {}); 39 | reportschannel.send(embed); 40 | console.log(chalk.yellow(`[${message.guild}]`) + ` ${message.author.username} has reported ${user.user.username} for: ${reason}.`); 41 | return; 42 | } 43 | 44 | module.exports.help = { 45 | name: 'report', 46 | description: 'Report a player to the staff of this Discord server.', 47 | usage: 'report [@user] [reason]' 48 | } -------------------------------------------------------------------------------- /commands/role.js: -------------------------------------------------------------------------------- 1 | const Discord = require('discord.js'); 2 | const config = require('../config.json'); 3 | const errors = require('../util/errors.js'); 4 | const chalk = require('chalk'); 5 | 6 | module.exports.run = async (client, message, args) => { 7 | if (args[0] == 'help') { 8 | let embed = new Discord.RichEmbed() 9 | .setTitle(`${module.exports.help.name} Command Information`) 10 | .setDescription(`${module.exports.help.description}`) 11 | .addField('Usage', `${config.prefix}${module.exports.help.usage}`, true) 12 | .addField('Permission', `${module.exports.help.permission}`, true) 13 | .setColor(config.cyan) 14 | message.channel.send(embed); 15 | return 16 | }; 17 | 18 | if (!message.member.hasPermission(`${module.exports.help.permission}`)) return errors.noPermissions(message, `${module.exports.help.permission}`); 19 | 20 | let user = message.guild.member(message.mentions.members.first()); 21 | if (!user) return errors.invalidUser(message); 22 | let role = args.slice(2).join(" "); 23 | if (!role) return errors.specifyARole(message); 24 | let guildRole = message.guild.roles.find(x => x.name === role); 25 | if (!guildRole) return errors.noRoleExists(message); 26 | 27 | if (args[0] === 'add') { 28 | if (user.roles.has(guildRole.id)) return errors.userHasRole(message); 29 | await (user.addRole(guildRole)); 30 | 31 | let embed = new Discord.RichEmbed() 32 | .setTitle('User has been assigned to a role.') 33 | .setColor(config.green) 34 | .addField('Assigned User', `${user}`) 35 | .addField('Assigned By', `${message.author}`) 36 | .addField('Assigned Role', `${role}`); 37 | message.channel.send(embed); 38 | 39 | console.log(chalk.yellow(`[${message.guild}]`) + ` ${message.author.username} has assigned the role ${guildRole.name} to ${user.user.username}.`); 40 | }; 41 | 42 | if (args[0] === 'remove') { 43 | if (!user.roles.has(guildRole.id)) return errors.userDoesNotHaveRole(message); 44 | await (user.removeRole(guildRole.id)); 45 | 46 | let embed = new Discord.RichEmbed() 47 | .setTitle('User\'s role has been removed.') 48 | .setColor(config.green) 49 | .addField('Assigned User', `${user}`) 50 | .addField('Assigned By', `${message.author}`) 51 | .addField('Assigned Role', `${role}`); 52 | message.channel.send(embed); 53 | 54 | console.log(chalk.yellow(`[${message.guild}]`) + ` ${message.author.username} has removed the role ${guildRole.name} to ${user.user.username}.`); 55 | }; 56 | }; 57 | 58 | module.exports.help = { 59 | name: 'role', 60 | description: 'This will add or remove a role from the mentioned user.', 61 | permission: 'MANAGE_ROLES', 62 | usage: 'role [add/remove] [@user] [role]' 63 | }; -------------------------------------------------------------------------------- /commands/say.js: -------------------------------------------------------------------------------- 1 | const Discord = require('discord.js'); 2 | const config = require('../config.json'); 3 | const errors = require('../util/errors.js'); 4 | 5 | module.exports.run = async (client, message, args) => { 6 | if (args == 'help') { 7 | let embed = new Discord.RichEmbed() 8 | .setTitle(`${module.exports.help.name} Command Information`) 9 | .setDescription(`${module.exports.help.description}`) 10 | .addField('Usage', `${config.prefix}${module.exports.help.usage}`, true) 11 | .addField('Permission', `${module.exports.help.permission}`, true) 12 | .setColor(config.cyan) 13 | message.channel.send(embed); 14 | return 15 | }; 16 | 17 | if (!message.member.hasPermission(`${module.exports.help.permission}`)) return errors.noPermissions(message, `${module.exports.help.permission}`); 18 | 19 | if (!args[0]) return errors.emptyMessage(message); 20 | let inputmessage = args.join(' '); 21 | 22 | let embed = new Discord.RichEmbed() 23 | .setColor(config.green) 24 | .setDescription(inputmessage) 25 | 26 | message.delete().catch(O_o => {}); 27 | message.channel.send(embed); 28 | return 29 | }; 30 | 31 | module.exports.help = { 32 | name: 'say', 33 | description: 'This will send a message as the bot on your behalf.', 34 | permission: 'ADMINISTRATOR', 35 | usage: 'say [content]' 36 | }; -------------------------------------------------------------------------------- /commands/shutdown.js: -------------------------------------------------------------------------------- 1 | const Discord = require('discord.js'); 2 | const config = require('../config.json'); 3 | const errors = require('../util/errors.js'); 4 | 5 | module.exports.run = async (client, message, args) => { 6 | if (args == 'help') { 7 | let embed = new Discord.RichEmbed() 8 | .setTitle(`${module.exports.help.name} Command Information`) 9 | .setDescription(`${module.exports.help.description}`) 10 | .addField('Usage', `${config.prefix}${module.exports.help.usage}`, true) 11 | .addField('Permission', `${module.exports.help.permission}`, true) 12 | .setColor(config.cyan) 13 | message.channel.send(embed); 14 | return 15 | }; 16 | 17 | if (message.author.id !== `${config.ownerid}`) return errors.ownersOnly(message); 18 | 19 | if (message.author.id == `${config.ownerid}`) { 20 | let embed = new Discord.RichEmbed() 21 | .setTitle('Shutting Down...') 22 | .setColor(config.red); 23 | 24 | message.channel.send(embed) 25 | .then(message => client.destroy()) 26 | } 27 | } 28 | 29 | module.exports.help = { 30 | name: 'shutdown', 31 | description: 'This will shutdown the bot instance on all Discord servers.', 32 | permission: 'BOTOWNER', 33 | usage: 'shutdown' 34 | }; -------------------------------------------------------------------------------- /commands/tag.js: -------------------------------------------------------------------------------- 1 | const Discord = require('discord.js'); 2 | const config = require('../config.json'); 3 | const errors = require('../util/errors.js'); 4 | 5 | module.exports.run = async (client, message, args) => { 6 | if (args == 'help') { 7 | let embed = new Discord.RichEmbed() 8 | .setTitle(`${module.exports.help.name} Command Information`) 9 | .setDescription(`${module.exports.help.description}`) 10 | .addField('Usage', `${config.prefix}${module.exports.help.usage}`, true) 11 | .setColor(config.cyan) 12 | message.channel.send(embed); 13 | return 14 | }; 15 | 16 | if (args == 'ateveryone') { 17 | let embed = new Discord.RichEmbed() 18 | .setImage('https://media1.tenor.com/images/4503a9e149b20fbf6b6af491220b5000/tenor.gif?itemid=9670656'); 19 | return message.channel.send(embed); 20 | } else if (args == 'congrats') { 21 | let embed = new Discord.RichEmbed() 22 | .setImage('https://media.giphy.com/media/slOhiKAVFgwr6/giphy.gif'); 23 | return message.channel.send(embed); 24 | } else if (args == 'dab') { 25 | let embed = new Discord.RichEmbed() 26 | .setImage('https://media.giphy.com/media/A4R8sdUG7G9TG/giphy.gif'); 27 | return message.channel.send(embed); 28 | } else if (args == 'discord') { 29 | let embed = new Discord.RichEmbed() 30 | .setImage('https://media1.tenor.com/images/83cdd1dd40cdb87020949e0f075b9648/tenor.gif?itemid=11230336'); 31 | return message.channel.send(embed); 32 | } else if (args == 'gay') { 33 | let embed = new Discord.RichEmbed() 34 | .setImage('https://media.giphy.com/media/ZcYe7jWTLRzkQ/giphy.gif'); 35 | return message.channel.send(embed); 36 | } else if (args == 'hi') { 37 | let embed = new Discord.RichEmbed() 38 | .setImage('https://media.giphy.com/media/IThjAlJnD9WNO/giphy.gif'); 39 | return message.channel.send(embed); 40 | } else if (args == 'lol') { 41 | let embed = new Discord.RichEmbed() 42 | .setImage('https://media.giphy.com/media/9MFsKQ8A6HCN2/giphy.gif'); 43 | return message.channel.send(embed); 44 | } else if (args == 'no') { 45 | let embed = new Discord.RichEmbed() 46 | .setImage('https://media1.tenor.com/images/0a37ef8f52e2232d85a2070d56801987/tenor.gif?itemid=5026106'); 47 | return message.channel.send(embed); 48 | } else if (args == 'nope') { 49 | let embed = new Discord.RichEmbed() 50 | .setImage('https://media.giphy.com/media/3o7btT1T9qpQZWhNlK/giphy.gif'); 51 | return message.channel.send(embed); 52 | } else if (args == 'oof') { 53 | let embed = new Discord.RichEmbed() 54 | .setImage('https://media.giphy.com/media/3oz8xz12ps500JuWnC/giphy.gif'); 55 | return message.channel.send(embed); 56 | } else if (args == 'spaghet') { 57 | let embed = new Discord.RichEmbed() 58 | .setImage('http://i0.kym-cdn.com/photos/images/newsfeed/001/332/955/58e.gif'); 59 | return message.channel.send(embed); 60 | } else if (args == 'thinking') { 61 | let embed = new Discord.RichEmbed() 62 | .setImage('https://media.giphy.com/media/3o7buirYcmV5nSwIRW/giphy.gif'); 63 | return message.channel.send(embed); 64 | } else if (args == 'triggered') { 65 | let embed = new Discord.RichEmbed() 66 | .setImage('https://media.giphy.com/media/vk7VesvyZEwuI/giphy.gif'); 67 | return message.channel.send(embed); 68 | } else if (args == 'welp') { 69 | let embed = new Discord.RichEmbed() 70 | .setImage('https://media1.tenor.com/images/f66275ec82c046b43d5503dbf46af622/tenor.gif?itemid=8398567'); 71 | return message.channel.send(embed); 72 | } else if (args == 'xd') { 73 | let embed = new Discord.RichEmbed() 74 | .setImage('https://media.giphy.com/media/yyoFZ1EjLRkSQ/giphy.gif'); 75 | return message.channel.send(embed); 76 | } 77 | }; 78 | 79 | module.exports.help = { 80 | name: 'tag', 81 | description: 'This allows you top create nice tags to add to your messaging experience.', 82 | usage: 'tag [args]' 83 | }; -------------------------------------------------------------------------------- /commands/terminate.js: -------------------------------------------------------------------------------- 1 | const Discord = require('discord.js'); 2 | const config = require('../config.json'); 3 | 4 | module.exports.run = async (client, message, args) => { 5 | if (args == 'help') { 6 | let embed = new Discord.RichEmbed() 7 | .setTitle(`${module.exports.help.name} Command Information`) 8 | .setDescription(`${module.exports.help.description}`) 9 | .addField('Usage', `${config.prefix}${module.exports.help.usage}`, true) 10 | .addField('Permission', `${module.exports.help.permission}`, true) 11 | .setColor(config.cyan) 12 | message.channel.send(embed); 13 | return 14 | }; 15 | 16 | if (message.author.id !== `${config.ownerid}`) return errors.ownersOnly(message); 17 | 18 | if (message.author.id == `${config.ownerid}`) { 19 | let embed = new Discord.RichEmbed() 20 | .setTitle(`It's time for ${client.user.username} to go!!!`) 21 | .setColor(config.red) 22 | .setDescription('Leaving Guild...') 23 | message.channel.send(embed); 24 | 25 | message.guild.leave(); 26 | return 27 | } 28 | }; 29 | 30 | module.exports.help = { 31 | name: 'terminate', 32 | description: 'Will make the bot leave the Discord guild and terminate it\'s instance.', 33 | permission: 'BOTOWNER', 34 | usage: 'terminate' 35 | }; -------------------------------------------------------------------------------- /commands/tweet.js: -------------------------------------------------------------------------------- 1 | const twit = require('twit'); 2 | const errors = require('../util/errors.js'); 3 | const config = require('../config.json'); 4 | const Discord = require('discord.js'); 5 | const chalk = require('chalk'); 6 | 7 | module.exports.run = async (client, message, args) => { 8 | if (args == 'help') { 9 | let embed = new Discord.RichEmbed() 10 | .setTitle(`${module.exports.help.name} Command Information`) 11 | .setDescription(`${module.exports.help.description}\n**NOTE** If you\'re running a public instance of this bot this command will not work.\nIf you would like to use this command, please clone the GitHub project and run the bot yourself.`) 12 | .addField('Usage', `${config.prefix}${module.exports.help.usage}`, true) 13 | .setColor(config.cyan) 14 | message.channel.send(embed); 15 | return 16 | }; 17 | 18 | if (!config.tweetcommand) return errors.commandNotEnabled(message); 19 | if (process.env.consumer_key === 'KEY' || process.env.consumer_secret === 'KEY' || process.env.access_token === 'KEY' || process.env.access_token_secret === 'KEY') return errors.noAPIKey(message); 20 | 21 | // Twitter API Credentials & Information 22 | const twitter = new twit({ 23 | consumer_key: `${process.env.consumer_key}`, 24 | consumer_secret: `${process.env.consumer_secret}`, 25 | access_token: `${process.env.access_token}`, 26 | access_token_secret: `${process.env.access_token_secret}`, 27 | timeout_ms: 60 * 1000 28 | }); 29 | 30 | let tweetchannel = message.guild.channels.find('name', 'tweet'); 31 | if (!tweetchannel) return errors.noTweetChannel(message); 32 | 33 | if (message.channel === tweetchannel) { 34 | let inputmessage = args.join(' '); 35 | if (!inputmessage) return errors.emptyMessage(message); 36 | if (message.channel === tweetchannel) 37 | 38 | twitter.post('statuses/update', { 39 | status: `${inputmessage}` 40 | }, function (err, data, response) { 41 | console.log(chalk.yellow(`[${message.guild}]`) + ` ${message.author.username} has tweeted "${inputmessage}"`); 42 | 43 | let embed = new Discord.RichEmbed() 44 | .setTitle('Tweet Successfully Tweeted!') 45 | .setColor(config.green) 46 | .addField('Message Content', `${inputmessage}`) 47 | .addField('Tweeted By', `${message.author.username}`) 48 | message.channel.send(embed); 49 | }) 50 | } else { 51 | let inputmessage = args.join(' '); 52 | return errors.incorrectChannel(message); 53 | }; 54 | }; 55 | 56 | module.exports.help = { 57 | name: 'tweet', 58 | description: 'Tweet from your Discord client to a Twitter account (if enabled & configured).', 59 | usage: 'tweet [content]' 60 | }; 61 | -------------------------------------------------------------------------------- /commands/unban.js: -------------------------------------------------------------------------------- 1 | const Discord = require('discord.js'); 2 | const config = require('../config.json'); 3 | const errors = require('../util/errors.js'); 4 | const chalk = require('chalk'); 5 | 6 | module.exports.run = async (client, message, args) => { 7 | if (args == 'help') { 8 | let embed = new Discord.RichEmbed() 9 | .setTitle(`${module.exports.help.name} Command Information`) 10 | .setDescription(`${module.exports.help.description}`) 11 | .addField('Usage', `${config.prefix}${module.exports.help.usage}`, true) 12 | .addField('Permission', `${module.exports.help.permission}`, true) 13 | .setColor(config.cyan) 14 | message.channel.send(embed); 15 | return 16 | }; 17 | 18 | if (!message.member.hasPermission(`${module.exports.help.permission}`)) return errors.noPermissions(message, `${module.exports.help.permission}`); 19 | 20 | let user = args[0]; 21 | if (!user) return errors.invalidUser(message); 22 | if (message.guild.members.get(user)) return errors.userNotBanned(message) 23 | 24 | let reason = args.slice(1).join(' '); 25 | if (!reason) return errors.invalidReason(message); 26 | 27 | let createdAtRaw = message.createdAt.toDateString(); 28 | let createdAt = createdAtRaw.split(' '); 29 | 30 | let embed = new Discord.RichEmbed() 31 | .setTitle('User has been unbanned') 32 | .setColor(config.yellow) 33 | .addField('Banned User', `${user}`, true) 34 | .addField('Unbanned By', `${message.author}`, true) 35 | .addField('Time', `${createdAt[0]} ${createdAt[2]} ${createdAt[1]} ${createdAt[3]}`, true) 36 | .addField('Reason', reason); 37 | 38 | let auditlogchannel = message.guild.channels.find(c => c.name === 'audit-log'); 39 | if (!auditlogchannel) return errors.noLogChannel(message); 40 | 41 | auditlogchannel.send(embed); 42 | message.guild.unban(user); 43 | 44 | console.log(chalk.yellow(`[${message.guild}]`) + ` ${message.author.username} has unbanned ${user.user.username} from ${message.guild} for ${reason}.`); 45 | return 46 | }; 47 | 48 | module.exports.help = { 49 | name: 'unban', 50 | description: 'This will unban a user from the guild with the reason provided.', 51 | permission: 'BAN_MEMBERS', 52 | usage: 'unban [user ID] [reason]' 53 | }; 54 | -------------------------------------------------------------------------------- /commands/unmute.js: -------------------------------------------------------------------------------- 1 | const Discord = require('discord.js'); 2 | const config = require('../config.json'); 3 | const ms = require('ms'); 4 | const errors = require('../util/errors.js'); 5 | const chalk = require('chalk'); 6 | 7 | module.exports.run = async (client, message, args) => { 8 | if (args == 'help') { 9 | let embed = new Discord.RichEmbed() 10 | .setTitle(`${module.exports.help.name} Command Information`) 11 | .setDescription(`${module.exports.help.description}`) 12 | .addField('Usage', `${config.prefix}${module.exports.help.usage}`, true) 13 | .addField('Permission', `${module.exports.help.permission}`, true) 14 | .setColor(config.cyan) 15 | message.channel.send(embed); 16 | return 17 | }; 18 | 19 | if (!message.member.hasPermission(`${module.exports.help.permission}`)) return errors.noPermissions(message, `${module.exports.help.permission}`); 20 | 21 | let user = message.guild.member(message.mentions.members.first()); 22 | if (!user) return errors.invalidUser(message); 23 | 24 | let muterole = message.guild.roles.find(c => c.name === 'Muted'); 25 | if (!user.roles.has(muterole.id)) return errors.userNotMuted(message); 26 | 27 | message.delete().catch(O_o => {}); 28 | let auditlogchannel = message.guild.channels.find(c => c.name === 'audit-log'); 29 | if (!auditlogchannel) return errors.noLogChannel(message); 30 | 31 | await (user.removeRole(muterole.id)) 32 | let embed = new Discord.RichEmbed() 33 | .setTitle('User has been Unmuted') 34 | .setColor(config.yellow) 35 | .addField('Muted User', `${user}`) 36 | auditlogchannel.send(embed); 37 | console.log(chalk.yellow(`[${message.guild}]`) + ` ${user.user.username} has been unmuted in ${message.guild}.`); 38 | }; 39 | 40 | module.exports.help = { 41 | name: 'unmute', 42 | description: 'Unmutes a user.', 43 | permission: 'MANAGE_MESSAGES', 44 | usage: 'unmute [@user]' 45 | }; -------------------------------------------------------------------------------- /commands/userinfo.js: -------------------------------------------------------------------------------- 1 | const Discord = require('discord.js'); 2 | const config = require('../config.json'); 3 | const errors = require('../util/errors.js'); 4 | 5 | module.exports.run = async (client, message, args) => { 6 | if (args == 'help') { 7 | let embed = new Discord.RichEmbed() 8 | .setTitle(`${module.exports.help.name} Command Information`) 9 | .setDescription(`${module.exports.help.description}`) 10 | .addField('Usage', `${config.prefix}${module.exports.help.usage}`, true) 11 | .setColor(config.cyan) 12 | message.channel.send(embed); 13 | return 14 | }; 15 | 16 | let user = message.guild.member(message.mentions.members.first()); 17 | if (!user) return errors.invalidUser(message); 18 | 19 | let kickable = user.kickable ? "✅" : "❎"; 20 | let bannable = user.bannable ? "✅" : "❎"; 21 | let icon = user.user.displayAvatarURL; 22 | 23 | let nickname = user.nickname; 24 | if (nickname) { 25 | nickname = user.nickname; 26 | } else { 27 | nickname = 'None' 28 | }; 29 | 30 | let createdAtRaw = user.user.createdAt.toDateString(); 31 | let createdAt = createdAtRaw.split(" "); 32 | let joinedAtRaw = user.joinedAt.toDateString(); 33 | let joinedAt = joinedAtRaw.split(" "); 34 | 35 | let playingStatus = user.presence.game; 36 | if (playingStatus) { 37 | playingStatus = user.presence.game.name; 38 | } else { 39 | playingStatus = 'None' 40 | } 41 | 42 | let embed = new Discord.RichEmbed() 43 | .setTitle(`Information about ${user.user.tag}`) 44 | .setColor(config.red) 45 | .setThumbnail(icon) 46 | .addField('Username', user.user.tag, true) 47 | .addField('Nickname', nickname, true) 48 | .addField('User ID', user.id, true) 49 | .addField('Status', user.presence.status, true) 50 | .addField('Playing Status', playingStatus, true) 51 | .addField('Account Created On', `${createdAt[0]} ${createdAt[2]} ${createdAt[1]} ${createdAt[3]}`, true) 52 | .addField('Joined This Guild On', `${joinedAt[0]} ${joinedAt[2]} ${joinedAt[1]} ${joinedAt[3]}`, true) 53 | .addField('Bannable', bannable, true) 54 | .addField('Kickable', kickable, true); 55 | message.channel.send(embed); 56 | return 57 | }; 58 | 59 | module.exports.help = { 60 | name: 'userinfo', 61 | description: 'Displays information about the mentioned user.', 62 | usage: 'userinfo [@user]' 63 | } -------------------------------------------------------------------------------- /config.json: -------------------------------------------------------------------------------- 1 | { 2 | "prefix": "/", 3 | "ownerid": "169978063478587392", 4 | "guildid": "450938867034619914", 5 | 6 | "swearfilter": true, 7 | "discordinvite": true, 8 | "tweetcommand": false, 9 | 10 | "twitterid": "2437699796", 11 | "userchannel": "463547002098024458", 12 | "twitterchannel": "504480323325919277", 13 | 14 | "white": "#ffffff", 15 | "red": "#ff0000", 16 | "orange": "#ffa500", 17 | "yellow": "#ffff00", 18 | "green": "#00ff00", 19 | "blue": "#0000ff", 20 | "purple": "#551a8b", 21 | "cyan": "#46CED5" 22 | } 23 | -------------------------------------------------------------------------------- /config.json.example: -------------------------------------------------------------------------------- 1 | { 2 | "prefix": "/", 3 | "ownerid": "ID", 4 | "guildid": "ID", 5 | 6 | "swearfilter": true, 7 | "discordinvite": true, 8 | "tweetcommand": false, 9 | 10 | "twitterid": "ID", 11 | "userchannel": "CHANNELID", 12 | "twitterchannel": "CHANNELID", 13 | 14 | "white": "#ffffff", 15 | "red": "#ff0000", 16 | "orange": "#ffa500", 17 | "yellow": "#ffff00", 18 | "green": "#00ff00", 19 | "blue": "#0000ff", 20 | "purple": "#551a8b", 21 | "cyan": "#46CED5" 22 | } 23 | -------------------------------------------------------------------------------- /events/channelCreate.js: -------------------------------------------------------------------------------- 1 | const Discord = require('discord.js'); 2 | const config = require('../config.json'); 3 | const chalk = require('chalk'); 4 | 5 | module.exports = async (channel, message) => { 6 | if (channel.type === "dm") return; 7 | 8 | let auditlogchannel = channel.guild.channels.find(c => c.name === 'audit-log'); 9 | if (!auditlogchannel) return; 10 | 11 | let embed = new Discord.RichEmbed() 12 | .setTitle(`A ${channel.type} channel called ${channel.name} has been created.`) 13 | .setColor(config.green) 14 | auditlogchannel.send(embed); 15 | 16 | console.log(chalk.yellow(`[${channel.guild}]`) + ` A ${channel.type} channel called ${channel.name} has been created.`); 17 | return 18 | } -------------------------------------------------------------------------------- /events/channelDelete.js: -------------------------------------------------------------------------------- 1 | const Discord = require('discord.js'); 2 | const config = require('../config.json'); 3 | const chalk = require('chalk'); 4 | 5 | module.exports = async (channel, message) => { 6 | let auditlogchannel = channel.guild.channels.find(c => c.name === 'audit-log'); 7 | if (!auditlogchannel) return; 8 | 9 | let embed = new Discord.RichEmbed() 10 | .setTitle(`A ${channel.type} channel called ${channel.name} has been deleted.`) 11 | .setColor(config.red) 12 | auditlogchannel.send(embed); 13 | 14 | console.log(chalk.yellow(`[${channel.guild}]`) + ` A ${channel.type} channel called ${channel.name} has been deleted.`); 15 | return 16 | } -------------------------------------------------------------------------------- /events/guildCreate.js: -------------------------------------------------------------------------------- 1 | const Discord = require('discord.js'); 2 | const config = require('../config.json'); 3 | const chalk = require('chalk'); 4 | 5 | module.exports = async guild => { 6 | console.log(`\n\n` + chalk.green('[Console]') + ` Joined the Guild ${guild.name}.\nGuild Owner: ${guild.owner.user.tag}\nNumber of Members: ${guild.memberCount}\nGuild Location: ${guild.region}\n\n`); 7 | 8 | guild.createChannel(`audit-log`, `text`).catch(console.error); 9 | guild.createChannel(`reports`, `text`).catch(console.error); 10 | }; -------------------------------------------------------------------------------- /events/guildDelete.js: -------------------------------------------------------------------------------- 1 | const Discord = require('discord.js'); 2 | const config = require('../config.json'); 3 | const chalk = require('chalk'); 4 | 5 | module.exports = async guild => { 6 | console.log(`\n\n` + chalk.green('[Console]') + ` Left the Guild ${guild.name}.\nGuild Owner: ${guild.owner.user.tag}\nNumber of Members: ${guild.memberCount}\nGuild Location: ${guild.region}\n\n`); 7 | }; -------------------------------------------------------------------------------- /events/guildMemberAdd.js: -------------------------------------------------------------------------------- 1 | const Discord = require('discord.js'); 2 | const config = require('../config.json'); 3 | const chalk = require('chalk'); 4 | 5 | module.exports = async member => { 6 | let auditlogchannel = member.guild.channels.find(c => c.name === 'audit-log'); 7 | if (!auditlogchannel) return 8 | 9 | let embed = new Discord.RichEmbed() 10 | .setTitle(`${member.user.username} has joined the guild.`) 11 | .setColor(config.green) 12 | .addField('Tag', member, true) 13 | auditlogchannel.send(embed); 14 | 15 | console.log(chalk.yellow(`[${member.guild}]`) + ` ${member.user.username} has joined the ${member.guild} Guild.`); 16 | 17 | // This option is only useful if you run the bot locally, yourself. 18 | if (config.guildid == '450938867034619914') { 19 | if (!config.userchannel) return; 20 | member.guild.channels.get(config.userchannel).setName(`Total Users: ${member.guild.memberCount}`); 21 | } 22 | return; 23 | }; -------------------------------------------------------------------------------- /events/guildMemberRemove.js: -------------------------------------------------------------------------------- 1 | const Discord = require('discord.js'); 2 | const config = require('../config.json'); 3 | const chalk = require('chalk'); 4 | 5 | module.exports = async member => { 6 | let auditlogchannel = member.guild.channels.find(c => c.name === 'audit-log'); 7 | if (!auditlogchannel) return 8 | 9 | let embed = new Discord.RichEmbed() 10 | .setTitle(`${member.user.username} has left the guild.`) 11 | .setColor(config.red) 12 | .addField('Tag', member, true) 13 | auditlogchannel.send(embed); 14 | 15 | console.log(chalk.yellow(`[${member.guild}]`) + ` ${member.user.username} has left the ${member.guild} Guild.`); 16 | 17 | // This option is only useful if you run the bot locally, yourself. 18 | if (config.guildid == '450938867034619914') { 19 | if (!config.userchannel) return; 20 | member.guild.channels.get(config.userchannel).setName(`Total Users: ${member.guild.memberCount}`); 21 | return; 22 | } else { 23 | return; 24 | } 25 | }; 26 | -------------------------------------------------------------------------------- /events/messageDelete.js: -------------------------------------------------------------------------------- 1 | const Discord = require('discord.js'); 2 | const config = require('../config.json'); 3 | const chalk = require('chalk'); 4 | 5 | module.exports = (message) => { 6 | let auditlogchannel = message.guild.channels.find(c => c.name === 'audit-log'); 7 | if (!auditlogchannel) return; 8 | 9 | let embed = new Discord.RichEmbed() 10 | .addField(`Message Deleted in #${message.channel.name}.`, `${message.author.username}: ${message.content}`) 11 | .setColor(config.orange) 12 | auditlogchannel.send(embed); 13 | 14 | console.log(chalk.yellow(`[${message.guild}]`) + ` A message has been deleted in #${message.channel.name} by ${message.author.username}: ${message.content}`); 15 | return 16 | } -------------------------------------------------------------------------------- /events/messageUpdate.js: -------------------------------------------------------------------------------- 1 | const Discord = require('discord.js'); 2 | const config = require('../config.json'); 3 | const chalk = require('chalk'); 4 | 5 | module.exports = (oldMessage, newMessage) => { 6 | if (oldMessage.content == newMessage.content) return; 7 | 8 | let auditlogchannel = newMessage.guild.channels.find(c => c.name === 'audit-log'); 9 | if (!auditlogchannel) return; 10 | 11 | if (newMessage.author.bot) return; 12 | 13 | let embed = new Discord.RichEmbed() 14 | .setColor(config.orange) 15 | .addField(`Message Edited in #${newMessage.channel.name} by ${newMessage.author.username}`, `${oldMessage.content} **->** ${newMessage.content}`) 16 | auditlogchannel.send(embed); 17 | 18 | console.log(chalk.yellow(`[${newMessage.guild}]`) + ` A message in #${newMessage.channel.name} has been edited by ${newMessage.author.username}: [${oldMessage.content} -> ${newMessage.content}]`); 19 | return 20 | } -------------------------------------------------------------------------------- /events/ready.js: -------------------------------------------------------------------------------- 1 | const config = require('../config.json'); 2 | const superagent = require('superagent'); 3 | const chalk = require('chalk'); 4 | 5 | module.exports = async client => { 6 | client.user.setActivity("Booting..."); 7 | 8 | let pluralnonpluralservers = (client.guilds.size > 1) ? 'Servers' : 'Server'; 9 | let pluralnonpluralusers = (client.users.size > 1) ? 'Users' : 'User'; 10 | 11 | console.log(`\n\n${client.user.username} is online.\nOperating on ${client.guilds.size} ${pluralnonpluralservers}.\nOperating for ${client.users.size} ${pluralnonpluralusers}.\n`); 12 | setActivity(); setInterval(setActivity, 60000); 13 | 14 | // Grabs a users Twitter followers and displays them 15 | // Use https://codeofaninja.com/tools/find-twitter-id to find your Twitter id 16 | 17 | if (config.guildid == '450938867034619914') { 18 | let {body} = await superagent 19 | .get('https://api.twittercounter.com/?twitter_id=' + config.twitterid + '&apikey=' + process.env.twittercounterapikey); 20 | client.channels.get(config.twitterchannel).setName(`${body.username} Followers: ${body.followers_current}`); 21 | console.log(chalk.green('[Console] ') + `Twitter Channel detected! Setting ammount of followers that @${body.username} has.`); 22 | } 23 | return; 24 | 25 | function setActivity() { 26 | // Sets Activity in a rotation 27 | const Gameinfo = [`Using ${(((process.memoryUsage().heapUsed)/1024)/1024).toFixed(0)}MBs of RAM`, 'Source: http://bit.ly/rodneybotsource', 'Developer: shadowolf#9212', 'Discord: http://bit.ly/mancavediscord', 'Invite: http://bit.ly/inviterodney', `Running on ${client.guilds.size} ${pluralnonpluralservers}`, `Running for ${client.users.size} ${pluralnonpluralusers}`, `Use ${config.prefix}help`]; 28 | var info = Gameinfo[Math.floor(Math.random() * Gameinfo.length)]; 29 | 30 | client.user.setActivity(info); 31 | console.log(chalk.green('[Console]') + ` Activity set to (${info})`); 32 | } 33 | }; 34 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Rodney", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "ajv": { 8 | "version": "5.5.2", 9 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", 10 | "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", 11 | "requires": { 12 | "co": "^4.6.0", 13 | "fast-deep-equal": "^1.0.0", 14 | "fast-json-stable-stringify": "^2.0.0", 15 | "json-schema-traverse": "^0.3.0" 16 | } 17 | }, 18 | "ansi-styles": { 19 | "version": "3.2.1", 20 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 21 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 22 | "requires": { 23 | "color-convert": "^1.9.0" 24 | } 25 | }, 26 | "asn1": { 27 | "version": "0.2.3", 28 | "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", 29 | "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=" 30 | }, 31 | "assert-plus": { 32 | "version": "1.0.0", 33 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", 34 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" 35 | }, 36 | "async-limiter": { 37 | "version": "1.0.0", 38 | "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz", 39 | "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==" 40 | }, 41 | "asynckit": { 42 | "version": "0.4.0", 43 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 44 | "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" 45 | }, 46 | "aws-sign2": { 47 | "version": "0.7.0", 48 | "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", 49 | "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" 50 | }, 51 | "aws4": { 52 | "version": "1.8.0", 53 | "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", 54 | "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==" 55 | }, 56 | "bcrypt-pbkdf": { 57 | "version": "1.0.1", 58 | "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", 59 | "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", 60 | "optional": true, 61 | "requires": { 62 | "tweetnacl": "^0.14.3" 63 | }, 64 | "dependencies": { 65 | "tweetnacl": { 66 | "version": "0.14.5", 67 | "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", 68 | "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", 69 | "optional": true 70 | } 71 | } 72 | }, 73 | "bluebird": { 74 | "version": "3.5.1", 75 | "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", 76 | "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==" 77 | }, 78 | "caseless": { 79 | "version": "0.12.0", 80 | "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", 81 | "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" 82 | }, 83 | "chalk": { 84 | "version": "2.4.1", 85 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", 86 | "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", 87 | "requires": { 88 | "ansi-styles": "^3.2.1", 89 | "escape-string-regexp": "^1.0.5", 90 | "supports-color": "^5.3.0" 91 | } 92 | }, 93 | "co": { 94 | "version": "4.6.0", 95 | "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", 96 | "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" 97 | }, 98 | "color-convert": { 99 | "version": "1.9.3", 100 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 101 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 102 | "requires": { 103 | "color-name": "1.1.3" 104 | } 105 | }, 106 | "color-name": { 107 | "version": "1.1.3", 108 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 109 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" 110 | }, 111 | "combined-stream": { 112 | "version": "1.0.6", 113 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", 114 | "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", 115 | "requires": { 116 | "delayed-stream": "~1.0.0" 117 | } 118 | }, 119 | "component-emitter": { 120 | "version": "1.2.1", 121 | "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", 122 | "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=" 123 | }, 124 | "cookiejar": { 125 | "version": "2.1.2", 126 | "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.2.tgz", 127 | "integrity": "sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA==" 128 | }, 129 | "core-util-is": { 130 | "version": "1.0.2", 131 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 132 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" 133 | }, 134 | "dashdash": { 135 | "version": "1.14.1", 136 | "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", 137 | "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", 138 | "requires": { 139 | "assert-plus": "^1.0.0" 140 | } 141 | }, 142 | "debug": { 143 | "version": "3.1.0", 144 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", 145 | "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", 146 | "requires": { 147 | "ms": "2.0.0" 148 | }, 149 | "dependencies": { 150 | "ms": { 151 | "version": "2.0.0", 152 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 153 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 154 | } 155 | } 156 | }, 157 | "delayed-stream": { 158 | "version": "1.0.0", 159 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 160 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" 161 | }, 162 | "discord.js": { 163 | "version": "11.4.2", 164 | "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-11.4.2.tgz", 165 | "integrity": "sha512-MDwpu0lMFTjqomijDl1Ed9miMQe6kB4ifKdP28QZllmLv/HVOJXhatRgjS8urp/wBlOfx+qAYSXcdI5cKGYsfg==", 166 | "requires": { 167 | "long": "^4.0.0", 168 | "prism-media": "^0.0.3", 169 | "snekfetch": "^3.6.4", 170 | "tweetnacl": "^1.0.0", 171 | "ws": "^4.0.0" 172 | }, 173 | "dependencies": { 174 | "snekfetch": { 175 | "version": "3.6.4", 176 | "resolved": "https://registry.npmjs.org/snekfetch/-/snekfetch-3.6.4.tgz", 177 | "integrity": "sha512-NjxjITIj04Ffqid5lqr7XdgwM7X61c/Dns073Ly170bPQHLm6jkmelye/eglS++1nfTWktpP6Y2bFXjdPlQqdw==" 178 | } 179 | } 180 | }, 181 | "dotenv": { 182 | "version": "8.2.0", 183 | "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz", 184 | "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==" 185 | }, 186 | "ecc-jsbn": { 187 | "version": "0.1.1", 188 | "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", 189 | "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", 190 | "optional": true, 191 | "requires": { 192 | "jsbn": "~0.1.0" 193 | } 194 | }, 195 | "escape-string-regexp": { 196 | "version": "1.0.5", 197 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 198 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" 199 | }, 200 | "extend": { 201 | "version": "3.0.2", 202 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", 203 | "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" 204 | }, 205 | "extsprintf": { 206 | "version": "1.3.0", 207 | "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", 208 | "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" 209 | }, 210 | "fast-deep-equal": { 211 | "version": "1.1.0", 212 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", 213 | "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=" 214 | }, 215 | "fast-json-stable-stringify": { 216 | "version": "2.0.0", 217 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", 218 | "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" 219 | }, 220 | "forever-agent": { 221 | "version": "0.6.1", 222 | "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", 223 | "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" 224 | }, 225 | "form-data": { 226 | "version": "2.3.2", 227 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", 228 | "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", 229 | "requires": { 230 | "asynckit": "^0.4.0", 231 | "combined-stream": "1.0.6", 232 | "mime-types": "^2.1.12" 233 | } 234 | }, 235 | "formidable": { 236 | "version": "1.2.1", 237 | "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.1.tgz", 238 | "integrity": "sha512-Fs9VRguL0gqGHkXS5GQiMCr1VhZBxz0JnJs4JmMp/2jL18Fmbzvv7vOFRU+U8TBkHEE/CX1qDXzJplVULgsLeg==" 239 | }, 240 | "getpass": { 241 | "version": "0.1.7", 242 | "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", 243 | "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", 244 | "requires": { 245 | "assert-plus": "^1.0.0" 246 | } 247 | }, 248 | "har-schema": { 249 | "version": "2.0.0", 250 | "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", 251 | "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" 252 | }, 253 | "har-validator": { 254 | "version": "5.1.0", 255 | "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.0.tgz", 256 | "integrity": "sha512-+qnmNjI4OfH2ipQ9VQOw23bBd/ibtfbVdK2fYbY4acTDqKTW/YDp9McimZdDbG8iV9fZizUqQMD5xvriB146TA==", 257 | "requires": { 258 | "ajv": "^5.3.0", 259 | "har-schema": "^2.0.0" 260 | } 261 | }, 262 | "has-flag": { 263 | "version": "3.0.0", 264 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 265 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" 266 | }, 267 | "http-signature": { 268 | "version": "1.2.0", 269 | "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", 270 | "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", 271 | "requires": { 272 | "assert-plus": "^1.0.0", 273 | "jsprim": "^1.2.2", 274 | "sshpk": "^1.7.0" 275 | } 276 | }, 277 | "inherits": { 278 | "version": "2.0.3", 279 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 280 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 281 | }, 282 | "is-typedarray": { 283 | "version": "1.0.0", 284 | "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", 285 | "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" 286 | }, 287 | "isarray": { 288 | "version": "1.0.0", 289 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 290 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" 291 | }, 292 | "isgd": { 293 | "version": "1.1.3", 294 | "resolved": "https://registry.npmjs.org/isgd/-/isgd-1.1.3.tgz", 295 | "integrity": "sha1-mICNrBUqckdJfF0GgwgBLsz6Q1E=" 296 | }, 297 | "isstream": { 298 | "version": "0.1.2", 299 | "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", 300 | "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" 301 | }, 302 | "jsbn": { 303 | "version": "0.1.1", 304 | "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", 305 | "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", 306 | "optional": true 307 | }, 308 | "json-schema": { 309 | "version": "0.2.3", 310 | "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", 311 | "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" 312 | }, 313 | "json-schema-traverse": { 314 | "version": "0.3.1", 315 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", 316 | "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=" 317 | }, 318 | "json-stringify-safe": { 319 | "version": "5.0.1", 320 | "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", 321 | "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" 322 | }, 323 | "jsprim": { 324 | "version": "1.4.1", 325 | "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", 326 | "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", 327 | "requires": { 328 | "assert-plus": "1.0.0", 329 | "extsprintf": "1.3.0", 330 | "json-schema": "0.2.3", 331 | "verror": "1.10.0" 332 | } 333 | }, 334 | "long": { 335 | "version": "4.0.0", 336 | "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", 337 | "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" 338 | }, 339 | "memejsfork": { 340 | "version": "1.0.4", 341 | "resolved": "https://registry.npmjs.org/memejsfork/-/memejsfork-1.0.4.tgz", 342 | "integrity": "sha512-u70B/EGPqaKCzQh2DEBU/VNUgOtKFnWUyfvNc8iLXvKyzQTKObSYXJ5JZVgCZvLLAl1yWFRZvhfXWwIbDnawlQ==", 343 | "requires": { 344 | "request": "^2.88.0" 345 | }, 346 | "dependencies": { 347 | "aws4": { 348 | "version": "1.8.0", 349 | "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", 350 | "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==" 351 | }, 352 | "extend": { 353 | "version": "3.0.2", 354 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", 355 | "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" 356 | }, 357 | "har-validator": { 358 | "version": "5.1.0", 359 | "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.0.tgz", 360 | "integrity": "sha512-+qnmNjI4OfH2ipQ9VQOw23bBd/ibtfbVdK2fYbY4acTDqKTW/YDp9McimZdDbG8iV9fZizUqQMD5xvriB146TA==", 361 | "requires": { 362 | "ajv": "^5.3.0", 363 | "har-schema": "^2.0.0" 364 | } 365 | }, 366 | "mime-db": { 367 | "version": "1.36.0", 368 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.36.0.tgz", 369 | "integrity": "sha512-L+xvyD9MkoYMXb1jAmzI/lWYAxAMCPvIBSWur0PZ5nOf5euahRLVqH//FKW9mWp2lkqUgYiXPgkzfMUFi4zVDw==" 370 | }, 371 | "mime-types": { 372 | "version": "2.1.20", 373 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.20.tgz", 374 | "integrity": "sha512-HrkrPaP9vGuWbLK1B1FfgAkbqNjIuy4eHlIYnFi7kamZyLLrGlo2mpcx0bBmNpKqBtYtAfGbodDddIgddSJC2A==", 375 | "requires": { 376 | "mime-db": "~1.36.0" 377 | } 378 | }, 379 | "oauth-sign": { 380 | "version": "0.9.0", 381 | "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", 382 | "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" 383 | }, 384 | "qs": { 385 | "version": "6.5.2", 386 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", 387 | "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" 388 | }, 389 | "request": { 390 | "version": "2.88.0", 391 | "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", 392 | "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", 393 | "requires": { 394 | "aws-sign2": "~0.7.0", 395 | "aws4": "^1.8.0", 396 | "caseless": "~0.12.0", 397 | "combined-stream": "~1.0.6", 398 | "extend": "~3.0.2", 399 | "forever-agent": "~0.6.1", 400 | "form-data": "~2.3.2", 401 | "har-validator": "~5.1.0", 402 | "http-signature": "~1.2.0", 403 | "is-typedarray": "~1.0.0", 404 | "isstream": "~0.1.2", 405 | "json-stringify-safe": "~5.0.1", 406 | "mime-types": "~2.1.19", 407 | "oauth-sign": "~0.9.0", 408 | "performance-now": "^2.1.0", 409 | "qs": "~6.5.2", 410 | "safe-buffer": "^5.1.2", 411 | "tough-cookie": "~2.4.3", 412 | "tunnel-agent": "^0.6.0", 413 | "uuid": "^3.3.2" 414 | } 415 | }, 416 | "safe-buffer": { 417 | "version": "5.1.2", 418 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 419 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 420 | }, 421 | "tough-cookie": { 422 | "version": "2.4.3", 423 | "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", 424 | "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", 425 | "requires": { 426 | "psl": "^1.1.24", 427 | "punycode": "^1.4.1" 428 | } 429 | }, 430 | "uuid": { 431 | "version": "3.3.2", 432 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", 433 | "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" 434 | } 435 | } 436 | }, 437 | "methods": { 438 | "version": "1.1.2", 439 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 440 | "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" 441 | }, 442 | "mime": { 443 | "version": "1.6.0", 444 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", 445 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" 446 | }, 447 | "mime-db": { 448 | "version": "1.33.0", 449 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", 450 | "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==" 451 | }, 452 | "mime-types": { 453 | "version": "2.1.18", 454 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", 455 | "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", 456 | "requires": { 457 | "mime-db": "~1.33.0" 458 | } 459 | }, 460 | "ms": { 461 | "version": "2.1.1", 462 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", 463 | "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" 464 | }, 465 | "oauth-sign": { 466 | "version": "0.9.0", 467 | "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", 468 | "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" 469 | }, 470 | "performance-now": { 471 | "version": "2.1.0", 472 | "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", 473 | "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" 474 | }, 475 | "prism-media": { 476 | "version": "0.0.3", 477 | "resolved": "https://registry.npmjs.org/prism-media/-/prism-media-0.0.3.tgz", 478 | "integrity": "sha512-c9KkNifSMU/iXT8FFTaBwBMr+rdVcN+H/uNv1o+CuFeTThNZNTOrQ+RgXA1yL/DeLk098duAeRPP3QNPNbhxYQ==" 479 | }, 480 | "process-nextick-args": { 481 | "version": "2.0.0", 482 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", 483 | "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" 484 | }, 485 | "psl": { 486 | "version": "1.1.29", 487 | "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.29.tgz", 488 | "integrity": "sha512-AeUmQ0oLN02flVHXWh9sSJF7mcdFq0ppid/JkErufc3hGIV/AMa8Fo9VgDo/cT2jFdOWoFvHp90qqBH54W+gjQ==" 489 | }, 490 | "punycode": { 491 | "version": "1.4.1", 492 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", 493 | "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" 494 | }, 495 | "qs": { 496 | "version": "6.5.2", 497 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", 498 | "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" 499 | }, 500 | "readable-stream": { 501 | "version": "2.3.6", 502 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", 503 | "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", 504 | "requires": { 505 | "core-util-is": "~1.0.0", 506 | "inherits": "~2.0.3", 507 | "isarray": "~1.0.0", 508 | "process-nextick-args": "~2.0.0", 509 | "safe-buffer": "~5.1.1", 510 | "string_decoder": "~1.1.1", 511 | "util-deprecate": "~1.0.1" 512 | } 513 | }, 514 | "request": { 515 | "version": "2.88.0", 516 | "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", 517 | "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", 518 | "requires": { 519 | "aws-sign2": "~0.7.0", 520 | "aws4": "^1.8.0", 521 | "caseless": "~0.12.0", 522 | "combined-stream": "~1.0.6", 523 | "extend": "~3.0.2", 524 | "forever-agent": "~0.6.1", 525 | "form-data": "~2.3.2", 526 | "har-validator": "~5.1.0", 527 | "http-signature": "~1.2.0", 528 | "is-typedarray": "~1.0.0", 529 | "isstream": "~0.1.2", 530 | "json-stringify-safe": "~5.0.1", 531 | "mime-types": "~2.1.19", 532 | "oauth-sign": "~0.9.0", 533 | "performance-now": "^2.1.0", 534 | "qs": "~6.5.2", 535 | "safe-buffer": "^5.1.2", 536 | "tough-cookie": "~2.4.3", 537 | "tunnel-agent": "^0.6.0", 538 | "uuid": "^3.3.2" 539 | }, 540 | "dependencies": { 541 | "mime-db": { 542 | "version": "1.36.0", 543 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.36.0.tgz", 544 | "integrity": "sha512-L+xvyD9MkoYMXb1jAmzI/lWYAxAMCPvIBSWur0PZ5nOf5euahRLVqH//FKW9mWp2lkqUgYiXPgkzfMUFi4zVDw==" 545 | }, 546 | "mime-types": { 547 | "version": "2.1.20", 548 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.20.tgz", 549 | "integrity": "sha512-HrkrPaP9vGuWbLK1B1FfgAkbqNjIuy4eHlIYnFi7kamZyLLrGlo2mpcx0bBmNpKqBtYtAfGbodDddIgddSJC2A==", 550 | "requires": { 551 | "mime-db": "~1.36.0" 552 | } 553 | }, 554 | "safe-buffer": { 555 | "version": "5.1.2", 556 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 557 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 558 | } 559 | } 560 | }, 561 | "safe-buffer": { 562 | "version": "5.1.1", 563 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", 564 | "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" 565 | }, 566 | "snekfetch": { 567 | "version": "4.0.4", 568 | "resolved": "https://registry.npmjs.org/snekfetch/-/snekfetch-4.0.4.tgz", 569 | "integrity": "sha512-dyycG9fvwtSJqKPfMVOpXt+60qvMGe7vWLwOJDiSJaiAx+hs2EnFChG2bXCWn7ulz+zGzrHdN9/yeEb0YqEPww==" 570 | }, 571 | "sshpk": { 572 | "version": "1.14.1", 573 | "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.1.tgz", 574 | "integrity": "sha1-Ew9Zde3a2WPx1W+SuaxsUfqfg+s=", 575 | "requires": { 576 | "asn1": "~0.2.3", 577 | "assert-plus": "^1.0.0", 578 | "bcrypt-pbkdf": "^1.0.0", 579 | "dashdash": "^1.12.0", 580 | "ecc-jsbn": "~0.1.1", 581 | "getpass": "^0.1.1", 582 | "jsbn": "~0.1.0", 583 | "tweetnacl": "~0.14.0" 584 | }, 585 | "dependencies": { 586 | "tweetnacl": { 587 | "version": "0.14.5", 588 | "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", 589 | "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", 590 | "optional": true 591 | } 592 | } 593 | }, 594 | "string_decoder": { 595 | "version": "1.1.1", 596 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 597 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 598 | "requires": { 599 | "safe-buffer": "~5.1.0" 600 | } 601 | }, 602 | "superagent": { 603 | "version": "3.8.3", 604 | "resolved": "https://registry.npmjs.org/superagent/-/superagent-3.8.3.tgz", 605 | "integrity": "sha512-GLQtLMCoEIK4eDv6OGtkOoSMt3D+oq0y3dsxMuYuDvaNUvuT8eFBuLmfR0iYYzHC1e8hpzC6ZsxbuP6DIalMFA==", 606 | "requires": { 607 | "component-emitter": "^1.2.0", 608 | "cookiejar": "^2.1.0", 609 | "debug": "^3.1.0", 610 | "extend": "^3.0.0", 611 | "form-data": "^2.3.1", 612 | "formidable": "^1.2.0", 613 | "methods": "^1.1.1", 614 | "mime": "^1.4.1", 615 | "qs": "^6.5.1", 616 | "readable-stream": "^2.3.5" 617 | } 618 | }, 619 | "supports-color": { 620 | "version": "5.5.0", 621 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 622 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 623 | "requires": { 624 | "has-flag": "^3.0.0" 625 | } 626 | }, 627 | "tough-cookie": { 628 | "version": "2.4.3", 629 | "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", 630 | "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", 631 | "requires": { 632 | "psl": "^1.1.24", 633 | "punycode": "^1.4.1" 634 | } 635 | }, 636 | "tunnel-agent": { 637 | "version": "0.6.0", 638 | "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", 639 | "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", 640 | "requires": { 641 | "safe-buffer": "^5.0.1" 642 | } 643 | }, 644 | "tweetnacl": { 645 | "version": "1.0.0", 646 | "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.0.tgz", 647 | "integrity": "sha1-cT2LgY2kIGh0C/aDhtBHnmb8ins=" 648 | }, 649 | "twit": { 650 | "version": "2.2.11", 651 | "resolved": "https://registry.npmjs.org/twit/-/twit-2.2.11.tgz", 652 | "integrity": "sha512-BkdwvZGRVoUTcEBp0zuocuqfih4LB+kEFUWkWJOVBg6pAE9Ebv9vmsYTTrfXleZGf45Bj5H3A1/O9YhF2uSYNg==", 653 | "requires": { 654 | "bluebird": "^3.1.5", 655 | "mime": "^1.3.4", 656 | "request": "^2.68.0" 657 | } 658 | }, 659 | "util-deprecate": { 660 | "version": "1.0.2", 661 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 662 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" 663 | }, 664 | "uuid": { 665 | "version": "3.3.2", 666 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", 667 | "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" 668 | }, 669 | "verror": { 670 | "version": "1.10.0", 671 | "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", 672 | "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", 673 | "requires": { 674 | "assert-plus": "^1.0.0", 675 | "core-util-is": "1.0.2", 676 | "extsprintf": "^1.2.0" 677 | } 678 | }, 679 | "ws": { 680 | "version": "4.1.0", 681 | "resolved": "https://registry.npmjs.org/ws/-/ws-4.1.0.tgz", 682 | "integrity": "sha512-ZGh/8kF9rrRNffkLFV4AzhvooEclrOH0xaugmqGsIfFgOE/pIz4fMc4Ef+5HSQqTEug2S9JZIWDR47duDSLfaA==", 683 | "requires": { 684 | "async-limiter": "~1.0.0", 685 | "safe-buffer": "~5.1.0" 686 | } 687 | } 688 | } 689 | } 690 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Rodney", 3 | "version": "1.0.0", 4 | "description": "A Discord bot developed in JavaScript using the discord.js Library.", 5 | "main": "app.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "repository": { 10 | "type": "git", 11 | "url": "git+https://github.com/benrobson/Rodney.git" 12 | }, 13 | "author": "Ben Robson", 14 | "license": "ISC", 15 | "bugs": { 16 | "url": "https://github.com/benrobson/Rodney/issues" 17 | }, 18 | "homepage": "https://github.com/benrobson/Rodney#readme", 19 | "dependencies": { 20 | "chalk": "^2.4.1", 21 | "discord.js": "^11.4.2", 22 | "dotenv": "^8.2.0", 23 | "isgd": "^1.1.3", 24 | "memejsfork": "^1.0.4", 25 | "ms": "^2.1.1", 26 | "request": "^2.88.0", 27 | "snekfetch": "^4.0.4", 28 | "superagent": "^3.8.3", 29 | "twit": "^2.2.11" 30 | }, 31 | "devDependencies": {} 32 | } 33 | -------------------------------------------------------------------------------- /util/errors.js: -------------------------------------------------------------------------------- 1 | const Discord = require('discord.js'); 2 | const config = require('../config.json'); 3 | 4 | // Used if there is no #audit-log channel in the guild 5 | module.exports.noLogChannel = (message, perm) => { 6 | let embed = new Discord.RichEmbed() 7 | .setTitle('An error has occurred!') 8 | .setColor(config.red) 9 | .setDescription('Sorry, I could not find the `#audit-log` channel. This notification was unable to be sent!'); 10 | 11 | message.channel.send(embed); 12 | }; 13 | 14 | // Used if there is no #reports channel in the guild 15 | module.exports.noReportChannel = (message, perm) => { 16 | let embed = new Discord.RichEmbed() 17 | .setTitle('An error has occurred!') 18 | .setColor(config.red) 19 | .setDescription('Sorry, I could not find the `#reports` channel. This report was unable to be sent!'); 20 | 21 | message.channel.send(embed); 22 | }; 23 | 24 | // Used if user has no permissions to execute the command 25 | module.exports.noPermissions = (message, perm) => { 26 | let embed = new Discord.RichEmbed() 27 | .setTitle('An error has occurred!') 28 | .setDescription(`You have insufficent permissions to run this command.\nYou require the permission flag of **${perm}**!`) 29 | .setColor(config.red) 30 | 31 | message.channel.send(embed); 32 | }; 33 | 34 | // Used if no user has been provided or if user is invalid 35 | module.exports.invalidUser = (message) => { 36 | let embed = new Discord.RichEmbed() 37 | .setTitle('An error has occurred!') 38 | .setDescription('This user could not be found or does not exist!') 39 | .setColor(config.red); 40 | 41 | message.channel.send(embed); 42 | }; 43 | 44 | // Used if no reason has been provided 45 | module.exports.invalidReason = (message) => { 46 | let embed = new Discord.RichEmbed() 47 | .setTitle('An error has occurred!') 48 | .setDescription('No reason has been provided.') 49 | .setColor(config.red); 50 | 51 | message.channel.send(embed); 52 | }; 53 | 54 | // Used for users that cannot be punished 55 | module.exports.cannotPunish = (message) => { 56 | let embed = new Discord.RichEmbed() 57 | .setTitle('An error has occurred!') 58 | .setDescription('This user cannot be punished.') 59 | .setColor(config.red); 60 | 61 | message.channel.send(embed); 62 | }; 63 | 64 | // Used if a user attempts to send an empty poll 65 | module.exports.invalidPoll = (message) => { 66 | let embed = new Discord.RichEmbed() 67 | .setTitle('An error has occurred!') 68 | .setDescription('Please provide a question for your poll.') 69 | .setColor(config.red); 70 | 71 | message.channel.send(embed); 72 | }; 73 | 74 | // Used if a user does not specify a number of messages to purge 75 | module.exports.provideNumber = (message) => { 76 | let embed = new Discord.RichEmbed() 77 | .setTitle('An error has occurred!') 78 | .setDescription('Please provide a number of messages you would like to delete.') 79 | .setColor(config.red); 80 | 81 | message.channel.send(embed); 82 | }; 83 | 84 | // Used if a user does not specify a number of messages to purge 85 | module.exports.emptyMessage = (message) => { 86 | let embed = new Discord.RichEmbed() 87 | .setTitle('An error has occurred!') 88 | .setDescription('Please specify the message you would like to send, you cannot send an empty message.') 89 | .setColor(config.red); 90 | 91 | message.channel.send(embed); 92 | }; 93 | 94 | // Used if no valid URL is provided [used in the shortenurl command] 95 | module.exports.invalidURL = (message) => { 96 | let embed = new Discord.RichEmbed() 97 | .setTitle('An error has occurred!') 98 | .setDescription('Please enter a valid URL.') 99 | .setColor(config.red); 100 | 101 | message.channel.send(embed); 102 | }; 103 | 104 | // Used if no time is specified 105 | module.exports.invalidTime = (message) => { 106 | let embed = new Discord.RichEmbed() 107 | .setTitle('An error has occurred!') 108 | .setDescription('You have not specified a time, using d/h/m/s') 109 | .setColor(config.red); 110 | 111 | message.channel.send(embed); 112 | }; 113 | 114 | // Used if no time is specified 115 | module.exports.ownerOnly = (message) => { 116 | let embed = new Discord.RichEmbed() 117 | .setTitle('An error has occurred!') 118 | .setDescription(`Only <@${config.ownerid}> can use this command.`) 119 | .setColor(config.red); 120 | 121 | message.channel.send(embed); 122 | }; 123 | 124 | // Used if Minecraft Server IP is invalid 125 | module.exports.invalidIP = (message) => { 126 | let embed = new Discord.RichEmbed() 127 | .setTitle('An error has occurred!') 128 | .setDescription('Enter a valid Minecraft IP.') 129 | .setColor(config.red); 130 | 131 | message.channel.send(embed); 132 | }; 133 | 134 | // Used if the client ID is blank. 135 | module.exports.invalidClientID = (message) => { 136 | let embed = new Discord.RichEmbed() 137 | .setTitle('An error has occurred!') 138 | .setDescription('Please specify a client ID, the field cannot be left blank.') 139 | .setColor(config.red); 140 | 141 | message.channel.send(embed); 142 | }; 143 | 144 | // Used if there is no #tweet channel in the Guild 145 | module.exports.noTweetChannel = (message, perm) => { 146 | let embed = new Discord.RichEmbed() 147 | .setTitle('An error has occurred!') 148 | .setColor(config.red) 149 | .setDescription('Sorry, I could not find the `#tweet` channel.'); 150 | 151 | message.channel.send(embed); 152 | }; 153 | 154 | // Used if a user does not a message to Tweet 155 | module.exports.emptyMessage = (message) => { 156 | let embed = new Discord.RichEmbed() 157 | .setTitle('An error has occurred!') 158 | .setDescription('Please specify the message you would like to tweet, you cannot send an empty tweet.') 159 | .setColor(config.red); 160 | 161 | message.channel.send(embed); 162 | }; 163 | 164 | // Used if a user attempts to send a tweet command that is not in the #tweet channel 165 | module.exports.incorrectChannel = (message) => { 166 | let embed = new Discord.RichEmbed() 167 | .setTitle('An error has occurred!') 168 | .setDescription('You have sent this command in the wrong channel, try `#tweet`.') 169 | .setColor(config.red); 170 | 171 | message.channel.send(embed); 172 | }; 173 | 174 | // Used if a user attempts to send a tweet command that is not in the #tweet channel 175 | module.exports.noCommandName = (message) => { 176 | let embed = new Discord.RichEmbed() 177 | .setTitle('An error has occurred!') 178 | .setDescription('Must provide a command name to reload.') 179 | .setColor(config.red); 180 | 181 | message.channel.send(embed); 182 | }; 183 | 184 | // Used if a user attempts to send a tweet command that is not in the #tweet channel 185 | module.exports.anotherNumber = (message) => { 186 | let embed = new Discord.RichEmbed() 187 | .setTitle('An error has occurred!') 188 | .setDescription('Please provide a number less than 100') 189 | .setColor(config.red); 190 | 191 | message.channel.send(embed); 192 | }; 193 | 194 | // Used if a user attempts to ban a user who is not banned. 195 | module.exports.userNotBanned = (message) => { 196 | let embed = new Discord.RichEmbed() 197 | .setTitle('An error has occurred!') 198 | .setColor(config.red) 199 | .setDescription('This user is not banned.'); 200 | 201 | message.channel.send(embed); 202 | }; 203 | 204 | // Used if a user attempts to mute a user who is not muted. 205 | module.exports.userNotMuted = (message) => { 206 | let embed = new Discord.RichEmbed() 207 | .setTitle('An error has occurred!') 208 | .setDescription('This user is not muted.') 209 | .setColor(config.red); 210 | 211 | message.channel.send(embed); 212 | }; 213 | 214 | // Used if a user attempts to mute a user who is already muted 215 | module.exports.userAlreadyMuted = (message) => { 216 | let embed = new Discord.RichEmbed() 217 | .setTitle('An error has occurred!') 218 | .setDescription('This user has already been muted.') 219 | .setColor(config.red); 220 | 221 | message.channel.send(embed); 222 | }; 223 | 224 | // Used if a user attempts to send a tweet command that is not in the #tweet channel 225 | module.exports.noAPIKey = (message) => { 226 | let embed = new Discord.RichEmbed() 227 | .setTitle('An error has occurred!') 228 | .setDescription('An API key is not available or could not be found, please check your `token.json` file.') 229 | .setColor(config.red); 230 | 231 | message.channel.send(embed); 232 | }; 233 | 234 | // Used if a user attempts to send a tweet command that is not in the #tweet channel 235 | module.exports.invalidPlatform = (message) => { 236 | let embed = new Discord.RichEmbed() 237 | .setTitle('An error has occurred!') 238 | .setDescription('Please include a platform and username in your arguments.') 239 | .setColor(config.red); 240 | 241 | message.channel.send(embed); 242 | }; 243 | 244 | // Used if a user attempts to send a tweet command that is not in the #tweet channel 245 | module.exports.commandNotEnabled = (message) => { 246 | let embed = new Discord.RichEmbed() 247 | .setTitle('An error has occurred!') 248 | .setDescription('This command is not enabled, you can turn this on via the `config.json` file.') 249 | .setColor(config.yellow); 250 | 251 | message.channel.send(embed); 252 | }; 253 | 254 | // Used if a user does not specify a number of messages to purge 255 | module.exports.emptyCode = (message) => { 256 | let embed = new Discord.RichEmbed() 257 | .setTitle('An error has occurred!') 258 | .setDescription('Please specify the code you would like to send.') 259 | .setColor(config.red); 260 | 261 | message.channel.send(embed); 262 | }; 263 | 264 | // Used if a user attempts to assign a role that does not exist 265 | module.exports.noRoleExists = (message) => { 266 | let embed = new Discord.RichEmbed() 267 | .setTitle('An error has occurred!') 268 | .setDescription('The specified role does not exist.') 269 | .setColor(config.red); 270 | 271 | message.channel.send(embed); 272 | }; 273 | 274 | // Used if a user is trying to be assigned a role that they already have 275 | module.exports.userHasRole = (message) => { 276 | let embed = new Discord.RichEmbed() 277 | .setTitle('An error has occurred!') 278 | .setDescription('The specified user already has this role.') 279 | .setColor(config.red); 280 | 281 | message.channel.send(embed); 282 | }; 283 | 284 | // Used if a user is trying to be assigned a role that they don't have 285 | module.exports.userDoesNotHaveRole = (message) => { 286 | let embed = new Discord.RichEmbed() 287 | .setTitle('An error has occurred!') 288 | .setDescription('The specified user does not have this role.') 289 | .setColor(config.red); 290 | 291 | message.channel.send(embed); 292 | }; 293 | 294 | // Used if a user is trying to be assigned a role that they don't have 295 | module.exports.specifyARole = (message) => { 296 | let embed = new Discord.RichEmbed() 297 | .setTitle('An error has occurred!') 298 | .setDescription('Please specify a role to assign to the user.') 299 | .setColor(config.red); 300 | 301 | message.channel.send(embed); 302 | }; -------------------------------------------------------------------------------- /util/eventLoader.js: -------------------------------------------------------------------------------- 1 | const reqEvent = (event) => require(`../events/${event}`) 2 | 3 | module.exports = (client) => { 4 | client.on('ready', () => reqEvent('ready')(client)); 5 | client.on('guildMemberAdd', reqEvent('guildMemberAdd')); 6 | client.on('guildMemberRemove', reqEvent('guildMemberRemove')); 7 | client.on('channelCreate', reqEvent('channelCreate')); 8 | client.on('channelDelete', reqEvent('channelDelete')); 9 | client.on('messageDelete', reqEvent('messageDelete')); 10 | client.on('guildCreate', reqEvent('guildCreate')); 11 | client.on('guildDelete', reqEvent('guildDelete')); 12 | client.on('messageUpdate', reqEvent('messageUpdate')); 13 | }; --------------------------------------------------------------------------------