├── .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 | };
--------------------------------------------------------------------------------