├── .gitignore ├── LICENSE ├── Procfile ├── README.md ├── assets ├── images │ ├── Empty.png │ ├── SHITS.png │ ├── blank.png │ ├── bonzi.png │ ├── disabled.png │ ├── red.png │ ├── retarded.png │ ├── shit.jpg │ ├── thesearch.png │ └── triggered.jpg └── json │ ├── actions.json │ ├── errors.json │ ├── fortune.json │ ├── iku.json │ ├── kaomoji.json │ ├── pasta.json │ ├── permissions.json │ ├── pickuplines.json │ ├── rightthere.json │ ├── skyrim.json │ └── waifus.json ├── commando ├── README.md ├── client.js ├── commands │ ├── argument.js │ ├── base.js │ ├── collector.js │ ├── group.js │ └── message.js ├── dispatcher.js ├── errors │ ├── command-format.js │ └── friendly.js ├── extensions │ └── guild.js ├── index.js ├── providers │ ├── base.js │ ├── helper.js │ └── sqlite.js ├── registry.js ├── types │ ├── base.js │ ├── boolean.js │ ├── channel.js │ ├── float.js │ ├── integer.js │ ├── member.js │ ├── message.js │ ├── role.js │ ├── string.js │ └── user.js └── util.js ├── commands ├── README.md ├── action │ ├── cry.js │ ├── disgust.js │ ├── grope.js │ ├── hand.js │ ├── hug.js │ ├── kiss.js │ ├── lewd.js │ ├── lick.js │ ├── nobully.js │ ├── nom.js │ ├── noswearing.js │ ├── nyan.js │ ├── owo.js │ ├── pat.js │ ├── pout.js │ ├── slap.js │ ├── smug.js │ ├── stare.js │ ├── tickle.js │ ├── wasted.js │ └── wink.js ├── anime │ ├── anime.js │ ├── booru.js │ ├── manga.js │ ├── moe.js │ └── waifu.js ├── core │ ├── botinfo.js │ ├── commands.js │ ├── help.js │ ├── howto.js │ ├── iku.js │ ├── invite.js │ ├── nomore.js │ ├── nsfwcommands.js │ ├── ping.js │ ├── support.js │ └── uptime.js ├── fun │ ├── 8ball.js │ ├── _talk.js │ ├── advice.js │ ├── b.js │ ├── bird.js │ ├── cat.js │ ├── dadjoke.js │ ├── dog.js │ ├── f.js │ ├── fortune.js │ ├── garfield.js │ ├── giphy.js │ ├── horoscope.js │ ├── kaomoji.js │ ├── lizard.js │ ├── meme.js │ ├── mock.js │ ├── pasta.js │ ├── pickup.js │ ├── rate.js │ ├── react.js │ ├── regionals.js │ ├── rightthere.js │ ├── say.js │ ├── sayd.js │ ├── skyrim.js │ ├── today.js │ ├── tsundere.js │ └── zalgo.js ├── info │ ├── avatar.js │ ├── channel.js │ ├── discrim.js │ ├── edits.js │ ├── emoji.js │ ├── inrole.js │ ├── role.js │ ├── server.js │ └── user.js ├── memes │ ├── bonzi.js │ ├── disabled.js │ ├── magik.js │ ├── retarded.js │ ├── shit.js │ ├── shits.js │ ├── thesearch.js │ └── triggered.js ├── moderation │ ├── addrole.js │ ├── ban.js │ ├── bulkban.js │ ├── bulkkick.js │ ├── delete.js │ ├── delrole.js │ ├── hackban.js │ ├── kick.js │ ├── lockdown.js │ ├── massadd.js │ ├── massrem.js │ ├── mute.js │ ├── nickname.js │ ├── nuke.js │ ├── prune.js │ ├── pruneuser.js │ ├── pruneword.js │ ├── softban.js │ ├── unban.js │ └── unmute.js ├── nsfw │ ├── 4knsfw.js │ ├── ahegao.js │ ├── amateur.js │ ├── artsyporn.js │ ├── asian.js │ ├── ass.js │ ├── bara.js │ ├── bdsm.js │ ├── bondage.js │ ├── boobs.js │ ├── cosplay.js │ ├── danbooru.js │ ├── e621.js │ ├── ecchi.js │ ├── futa.js │ ├── gelbooru.js │ ├── grool.js │ ├── gtn.js │ ├── hentai.js │ ├── hentaigif.js │ ├── hentaiirl.js │ ├── hypno.js │ ├── konachan.js │ ├── lingerie.js │ ├── monstergirl.js │ ├── neko.js │ ├── nsfw.js │ ├── nsfwgif.js │ ├── oppai.js │ ├── paheal.js │ ├── paizuri.js │ ├── pantsu.js │ ├── pornhub.js │ ├── pussy.js │ ├── rule34.js │ ├── sukebei.js │ ├── tbib.js │ ├── tentacle.js │ ├── trap.js │ ├── xbooru.js │ ├── yandere.js │ ├── yaoi.js │ ├── yuri.js │ └── zr.js ├── owner │ ├── backdoor.js │ ├── eval.js │ ├── exec.js │ ├── fleave.js │ ├── reload.js │ └── saychannel.js └── utility │ ├── color.js │ ├── github.js │ ├── img.js │ ├── jisho.js │ ├── math.js │ ├── osu.js │ ├── remindme.js │ ├── steam.js │ ├── temperature.js │ ├── time.js │ ├── translate.js │ ├── urban.js │ ├── weather.js │ ├── wiki.js │ └── youtube.js ├── index.js └── package.json /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .gitignore 3 | .eslintrc.js 4 | package-lock.json 5 | .env 6 | .gitattributes -------------------------------------------------------------------------------- /Procfile: -------------------------------------------------------------------------------- 1 | worker: node index.js -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | ### NOTE THAT THIS BOT NO LONGER WORKS AS A STANDALONE - IT IS FAR TOO OUTDATED 4 | ### YOU ARE FREE TO USE ITS CODE AS REFERENCE FOR YOUR OWN BOTS 5 | ## I WILL *NOT* BE PROVIDING ANY SUPPORT FOR THIS BOT AS IT NO LONGER FUNCTIONS 6 | 7 | contact me on Discord: https://discord.gg/vj73Kr8 **Mako#8739** 8 | -------------------------------------------------------------------------------- /assets/images/Empty.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mitorisia/Komugari/8ede18346da0c9978adaac9b99e52957e6b9520a/assets/images/Empty.png -------------------------------------------------------------------------------- /assets/images/SHITS.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mitorisia/Komugari/8ede18346da0c9978adaac9b99e52957e6b9520a/assets/images/SHITS.png -------------------------------------------------------------------------------- /assets/images/blank.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mitorisia/Komugari/8ede18346da0c9978adaac9b99e52957e6b9520a/assets/images/blank.png -------------------------------------------------------------------------------- /assets/images/bonzi.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mitorisia/Komugari/8ede18346da0c9978adaac9b99e52957e6b9520a/assets/images/bonzi.png -------------------------------------------------------------------------------- /assets/images/disabled.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mitorisia/Komugari/8ede18346da0c9978adaac9b99e52957e6b9520a/assets/images/disabled.png -------------------------------------------------------------------------------- /assets/images/red.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mitorisia/Komugari/8ede18346da0c9978adaac9b99e52957e6b9520a/assets/images/red.png -------------------------------------------------------------------------------- /assets/images/retarded.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mitorisia/Komugari/8ede18346da0c9978adaac9b99e52957e6b9520a/assets/images/retarded.png -------------------------------------------------------------------------------- /assets/images/shit.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mitorisia/Komugari/8ede18346da0c9978adaac9b99e52957e6b9520a/assets/images/shit.jpg -------------------------------------------------------------------------------- /assets/images/thesearch.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mitorisia/Komugari/8ede18346da0c9978adaac9b99e52957e6b9520a/assets/images/thesearch.png -------------------------------------------------------------------------------- /assets/images/triggered.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Mitorisia/Komugari/8ede18346da0c9978adaac9b99e52957e6b9520a/assets/images/triggered.jpg -------------------------------------------------------------------------------- /assets/json/errors.json: -------------------------------------------------------------------------------- 1 | [ 2 | "G-Gyaaa! This isn't an NSFW channel!", 3 | "This doesn't seem to be an NSFW channel...", 4 | "I'm sorry! But this stuff belongs in NSFW channels!", 5 | "That belongs in NSFW channels!", 6 | "I can't post this here! Please direct me to an NSFW channel!", 7 | "I'm afraid that kind of stuff isn't allowed in here..", 8 | "This doesn't look like an NSFW channel!", 9 | "Please try again in an NSFW channel!", 10 | "u///u, I don't think I can post that in your average channel.", 11 | "Don't make me post that here...", 12 | "💢That doesn't belong here!", 13 | "W-What? I can't post that here!", 14 | "Would you direct me to an NSFW channel?", 15 | "Please try this command again in an NSFW channel!", 16 | "H-Hey.. Some people might not want to see that in here!", 17 | "LEWD! B-Baka! Not in here!", 18 | "B-Baka! I can't post that here!", 19 | "This isn't an NSFW channel! Learn how to make a channel nsfw with `~howto`!", 20 | "You can try `~toggle` to make your channel NSFW!", 21 | "Nya! That was bad! Do that in an NSFW channel!", 22 | "How scandalous! Try that in an NSFW channel!", 23 | "Senpai...don't make me post that here...", 24 | "Nya that was bad senpai! This is an NSFW command!" 25 | ] -------------------------------------------------------------------------------- /assets/json/permissions.json: -------------------------------------------------------------------------------- 1 | { 2 | "ADMINISTRATOR": "administrator", 3 | "VIEW_AUDIT_LOG": "view audit Log", 4 | "MANAGE_GUILD": "manage server", 5 | "MANAGE_ROLES": "manage roles", 6 | "MANAGE_CHANNELS": "manage channels", 7 | "KICK_MEMBERS": "kick members", 8 | "BAN_MEMBERS": "ban members", 9 | "CREATE_INSTANT_INVITE": "create instant invite", 10 | "CHANGE_NICKNAME": "change nickname", 11 | "MANAGE_NICKNAMES": "manage nicknames", 12 | "MANAGE_EMOJIS": "manage emojis", 13 | "MANAGE_WEBHOOKS": "manage Webhooks", 14 | "READ_MESSAGES": "read messages", 15 | "SEND_MESSAGES": "send messages", 16 | "SEND_TTS_MESSAGES": "send TTS messages", 17 | "MANAGE_MESSAGES": "manage messages", 18 | "EMBED_LINKS": "embed links", 19 | "ATTACH_FILES": "attach files", 20 | "READ_MESSAGE_HISTORY": "read message history", 21 | "MENTION_EVERYONE": "mention everyone", 22 | "USE_EXTERNAL_EMOJIS": "use external emojis", 23 | "ADD_REACTIONS": "add reactions", 24 | "CONNECT": "connect", 25 | "SPEAK": "speak", 26 | "MUTE_MEMBERS": "mute members", 27 | "DEAFEN_MEMBERS": "deafen members", 28 | "MOVE_MEMBERS": "move members", 29 | "USE_VAD": "use voice activity" 30 | } 31 | -------------------------------------------------------------------------------- /commando/errors/command-format.js: -------------------------------------------------------------------------------- 1 | const FriendlyError = require('./friendly'); 2 | 3 | /** 4 | * Has a descriptive message for a command not having proper format 5 | * @extends {FriendlyError} 6 | */ 7 | class CommandFormatError extends FriendlyError { 8 | /** 9 | * @param {CommandMessage} msg - The command message the error is for 10 | */ 11 | constructor(msg) { 12 | super( 13 | `Invalid command format. Use ${msg.anyUsage( 14 | `help ${msg.command.name}`, 15 | msg.guild ? undefined : null, 16 | msg.guild ? undefined : null 17 | )} for information.` 18 | ); 19 | this.name = 'CommandFormatError'; 20 | } 21 | } 22 | 23 | module.exports = CommandFormatError; 24 | -------------------------------------------------------------------------------- /commando/errors/friendly.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Has a message that can be considered user-friendly 3 | * @extends {Error} 4 | */ 5 | class FriendlyError extends Error { 6 | /** @param {string} message - The error message */ 7 | constructor(message) { 8 | super(message); 9 | this.name = 'FriendlyError'; 10 | } 11 | } 12 | 13 | module.exports = FriendlyError; 14 | -------------------------------------------------------------------------------- /commando/providers/helper.js: -------------------------------------------------------------------------------- 1 | /** Helper class to use {@link SettingProvider} methods for a specific Guild */ 2 | class GuildSettingsHelper { 3 | /** 4 | * @param {CommandoClient} client - Client to use the provider of 5 | * @param {?Guild} guild - Guild the settings are for 6 | * @private 7 | */ 8 | constructor(client, guild) { 9 | /** 10 | * Client to use the provider of 11 | * @name GuildSettingsHelper#client 12 | * @type {CommandoClient} 13 | * @readonly 14 | */ 15 | Object.defineProperty(this, 'client', { value: client }); 16 | 17 | /** 18 | * Guild the settings are for 19 | * @type {?Guild} 20 | */ 21 | this.guild = guild; 22 | } 23 | 24 | /** 25 | * Gets a setting in the guild 26 | * @param {string} key - Name of the setting 27 | * @param {*} [defVal] - Value to default to if the setting isn't set 28 | * @return {*} 29 | * @see {@link SettingProvider#get} 30 | */ 31 | get(key, defVal) { 32 | if(!this.client.provider) throw new Error('No settings provider is available.'); 33 | return this.client.provider.get(this.guild, key, defVal); 34 | } 35 | 36 | /** 37 | * Sets a setting for the guild 38 | * @param {string} key - Name of the setting 39 | * @param {*} val - Value of the setting 40 | * @return {Promise<*>} New value of the setting 41 | * @see {@link SettingProvider#set} 42 | */ 43 | set(key, val) { 44 | if(!this.client.provider) throw new Error('No settings provider is available.'); 45 | return this.client.provider.set(this.guild, key, val); 46 | } 47 | 48 | /** 49 | * Removes a setting from the guild 50 | * @param {string} key - Name of the setting 51 | * @return {Promise<*>} Old value of the setting 52 | * @see {@link SettingProvider#remove} 53 | */ 54 | remove(key) { 55 | if(!this.client.provider) throw new Error('No settings provider is available.'); 56 | return this.client.provider.remove(this.guild, key); 57 | } 58 | 59 | /** 60 | * Removes all settings in the guild 61 | * @return {Promise} 62 | * @see {@link SettingProvider#clear} 63 | */ 64 | clear() { 65 | if(!this.client.provider) throw new Error('No settings provider is available.'); 66 | return this.client.provider.clear(this.guild); 67 | } 68 | } 69 | 70 | module.exports = GuildSettingsHelper; 71 | -------------------------------------------------------------------------------- /commando/types/base.js: -------------------------------------------------------------------------------- 1 | /** A type for command arguments */ 2 | class ArgumentType { 3 | /** 4 | * @param {CommandoClient} client - The client the argument type is for 5 | * @param {string} id - The argument type ID (this is what you specify in {@link ArgumentInfo#type}) 6 | */ 7 | constructor(client, id) { 8 | if(!client) throw new Error('A client must be specified.'); 9 | if(typeof id !== 'string') throw new Error('Argument type ID must be a string.'); 10 | if(id !== id.toLowerCase()) throw new Error('Argument type ID must be lowercase.'); 11 | 12 | /** 13 | * Client that this argument type is for 14 | * @name ArgumentType#client 15 | * @type {CommandoClient} 16 | * @readonly 17 | */ 18 | Object.defineProperty(this, 'client', { value: client }); 19 | 20 | /** 21 | * ID of this argument type (this is what you specify in {@link ArgumentInfo#type}) 22 | * @type {string} 23 | */ 24 | this.id = id; 25 | } 26 | 27 | // eslint-disable-next-line valid-jsdoc 28 | /** 29 | * Validates a value against the type 30 | * @param {string} value - Value to validate 31 | * @param {CommandMessage} msg - Message the value was obtained from 32 | * @param {Argument} arg - Argument the value obtained from 33 | * @return {boolean|string|Promise} Whether the value is valid, or an error message 34 | * @abstract 35 | */ 36 | validate(value, msg, arg) { // eslint-disable-line no-unused-vars 37 | throw new Error(`${this.constructor.name} doesn't have a validate() method.`); 38 | } 39 | 40 | // eslint-disable-next-line valid-jsdoc 41 | /** 42 | * Parses the raw value into a usable value 43 | * @param {string} value - Value to parse 44 | * @param {CommandMessage} msg - Message the value was obtained from 45 | * @param {Argument} arg - Argument the value obtained from 46 | * @return {*|Promise<*>} Usable value 47 | * @abstract 48 | */ 49 | parse(value, msg, arg) { // eslint-disable-line no-unused-vars 50 | throw new Error(`${this.constructor.name} doesn't have a parse() method.`); 51 | } 52 | } 53 | 54 | module.exports = ArgumentType; 55 | -------------------------------------------------------------------------------- /commando/types/boolean.js: -------------------------------------------------------------------------------- 1 | const ArgumentType = require('./base'); 2 | 3 | class BooleanArgumentType extends ArgumentType { 4 | constructor(client) { 5 | super(client, 'boolean'); 6 | this.truthy = new Set(['true', 't', 'yes', 'y', 'on', 'enable', 'enabled', '1', '+']); 7 | this.falsy = new Set(['false', 'f', 'no', 'n', 'off', 'disable', 'disabled', '0', '-']); 8 | } 9 | 10 | validate(value) { 11 | const lc = value.toLowerCase(); 12 | return this.truthy.has(lc) || this.falsy.has(lc); 13 | } 14 | 15 | parse(value) { 16 | const lc = value.toLowerCase(); 17 | if(this.truthy.has(lc)) return true; 18 | if(this.falsy.has(lc)) return false; 19 | throw new RangeError('Unknown boolean value.'); 20 | } 21 | } 22 | 23 | module.exports = BooleanArgumentType; 24 | -------------------------------------------------------------------------------- /commando/types/channel.js: -------------------------------------------------------------------------------- 1 | const ArgumentType = require('./base'); 2 | const { disambiguation } = require('../util'); 3 | const { escapeMarkdown } = require('discord.js'); 4 | 5 | class ChannelArgumentType extends ArgumentType { 6 | constructor(client) { 7 | super(client, 'channel'); 8 | } 9 | 10 | validate(value, msg) { 11 | const matches = value.match(/^(?:<#)?([0-9]+)>?$/); 12 | if(matches) return msg.guild.channels.has(matches[1]); 13 | const search = value.toLowerCase(); 14 | let channels = msg.guild.channels.filterArray(nameFilterInexact(search)); 15 | if(channels.length === 0) return false; 16 | if(channels.length === 1) return true; 17 | const exactChannels = channels.filter(nameFilterExact(search)); 18 | if(exactChannels.length === 1) return true; 19 | if(exactChannels.length > 0) channels = exactChannels; 20 | return channels.length <= 15 ? 21 | `${disambiguation(channels.map(chan => escapeMarkdown(chan.name)), 'channels', null 22 | )}\n` : 23 | 'Multiple channels found, please be more specific!'; 24 | } 25 | 26 | parse(value, msg) { 27 | const matches = value.match(/^(?:<#)?([0-9]+)>?$/); 28 | if(matches) return msg.guild.channels.get(matches[1]) || null; 29 | const search = value.toLowerCase(); 30 | const channels = msg.guild.channels.filterArray(nameFilterInexact(search)); 31 | if(channels.length === 0) return null; 32 | if(channels.length === 1) return channels[0]; 33 | const exactChannels = channels.filter(nameFilterExact(search)); 34 | if(exactChannels.length === 1) return exactChannels[0]; 35 | return null; 36 | } 37 | } 38 | 39 | function nameFilterExact(search) { 40 | return thing => thing.name.toLowerCase() === search; 41 | } 42 | 43 | function nameFilterInexact(search) { 44 | return thing => thing.name.toLowerCase().includes(search); 45 | } 46 | 47 | module.exports = ChannelArgumentType; 48 | -------------------------------------------------------------------------------- /commando/types/float.js: -------------------------------------------------------------------------------- 1 | const ArgumentType = require('./base'); 2 | 3 | class FloatArgumentType extends ArgumentType { 4 | constructor(client) { 5 | super(client, 'float'); 6 | } 7 | 8 | validate(value, msg, arg) { 9 | const float = Number.parseFloat(value); 10 | return !Number.isNaN(float) && 11 | (arg.min === null || typeof arg.min === 'undefined' || float >= arg.min) && 12 | (arg.max === null || typeof arg.max === 'undefined' || float <= arg.max); 13 | } 14 | 15 | parse(value) { 16 | return Number.parseFloat(value); 17 | } 18 | } 19 | 20 | module.exports = FloatArgumentType; 21 | -------------------------------------------------------------------------------- /commando/types/integer.js: -------------------------------------------------------------------------------- 1 | const ArgumentType = require('./base'); 2 | 3 | class IntegerArgumentType extends ArgumentType { 4 | constructor(client) { 5 | super(client, 'integer'); 6 | } 7 | 8 | validate(value, msg, arg) { 9 | const int = Number.parseInt(value); 10 | return !Number.isNaN(int) && 11 | (arg.min === null || typeof arg.min === 'undefined' || int >= arg.min) && 12 | (arg.max === null || typeof arg.max === 'undefined' || int <= arg.max); 13 | } 14 | 15 | parse(value) { 16 | return Number.parseInt(value); 17 | } 18 | } 19 | 20 | module.exports = IntegerArgumentType; 21 | -------------------------------------------------------------------------------- /commando/types/message.js: -------------------------------------------------------------------------------- 1 | const ArgumentType = require('./base'); 2 | 3 | class MessageArgumentType extends ArgumentType { 4 | constructor(client) { 5 | super(client, 'message'); 6 | } 7 | 8 | async validate(value, msg) { 9 | if(!/^[0-9]+$/.test(value)) return false; 10 | return Boolean(await msg.channel.messages.fetch(value).catch(() => null)); 11 | } 12 | 13 | parse(value, msg) { 14 | return msg.channel.messages.get(value); 15 | } 16 | } 17 | 18 | module.exports = MessageArgumentType; 19 | -------------------------------------------------------------------------------- /commando/types/role.js: -------------------------------------------------------------------------------- 1 | const ArgumentType = require('./base'); 2 | const { disambiguation } = require('../util'); 3 | const { escapeMarkdown } = require('discord.js'); 4 | 5 | class RoleArgumentType extends ArgumentType { 6 | constructor(client) { 7 | super(client, 'role'); 8 | } 9 | 10 | validate(value, msg) { 11 | const matches = value.match(/^(?:<@&)?([0-9]+)>?$/); 12 | if(matches) return msg.guild.roles.has(matches[1]); 13 | const search = value.toLowerCase(); 14 | let roles = msg.guild.roles.filterArray(nameFilterInexact(search)); 15 | if(roles.length === 0) return false; 16 | if(roles.length === 1) return true; 17 | const exactRoles = roles.filter(nameFilterExact(search)); 18 | if(exactRoles.length === 1) return true; 19 | if(exactRoles.length > 0) roles = exactRoles; 20 | return roles.length <= 15 ? 21 | `${disambiguation(roles.map(role => `${escapeMarkdown(role.name)}`), 'roles', null 22 | )}\n` : 23 | 'Multiple roles found, please be more specific!'; 24 | } 25 | 26 | parse(value, msg) { 27 | const matches = value.match(/^(?:<@&)?([0-9]+)>?$/); 28 | if(matches) return msg.guild.roles.get(matches[1]) || null; 29 | const search = value.toLowerCase(); 30 | const roles = msg.guild.roles.filterArray(nameFilterInexact(search)); 31 | if(roles.length === 0) return null; 32 | if(roles.length === 1) return roles[0]; 33 | const exactRoles = roles.filter(nameFilterExact(search)); 34 | if(exactRoles.length === 1) return exactRoles[0]; 35 | return null; 36 | } 37 | } 38 | 39 | function nameFilterExact(search) { 40 | return thing => thing.name.toLowerCase() === search; 41 | } 42 | 43 | function nameFilterInexact(search) { 44 | return thing => thing.name.toLowerCase().includes(search); 45 | } 46 | 47 | module.exports = RoleArgumentType; -------------------------------------------------------------------------------- /commando/types/string.js: -------------------------------------------------------------------------------- 1 | const ArgumentType = require('./base'); 2 | 3 | class StringArgumentType extends ArgumentType { 4 | constructor(client) { 5 | super(client, 'string'); 6 | } 7 | 8 | validate(value, msg, arg) { 9 | return Boolean(value) && 10 | (arg.min === null || typeof arg.min === 'undefined' || value.length >= arg.min) && 11 | (arg.max === null || typeof arg.max === 'undefined' || value.length <= arg.max); 12 | } 13 | 14 | parse(value) { 15 | return value; 16 | } 17 | } 18 | 19 | module.exports = StringArgumentType; 20 | -------------------------------------------------------------------------------- /commands/action/cry.js: -------------------------------------------------------------------------------- 1 | const { Command } = require('../../commando'); 2 | const Discord = require('discord.js'); 3 | const { cryP } = require('../../assets/json/actions.json'); 4 | 5 | module.exports = class CryCommand extends Command { 6 | constructor(client) { 7 | super(client, { 8 | name: 'cry', 9 | aliases: ['sob', 'waa'], 10 | group: 'action', 11 | memberName: 'cry', 12 | guildOnly: true, 13 | description: 'UWAA~', 14 | examples: ['~cry'], 15 | throttling: { 16 | usages: 1, 17 | duration: 5 18 | } 19 | }); 20 | } 21 | 22 | run(message) { 23 | const embed = new Discord.MessageEmbed() 24 | .setColor('#FBCFCF') 25 | .setImage(cryP[Math.round(Math.random() * (cryP.length - 1))]); 26 | return message.channel.send(`${message.author} has started crying!`, { embed: embed }); 27 | } 28 | } -------------------------------------------------------------------------------- /commands/action/disgust.js: -------------------------------------------------------------------------------- 1 | const { Command } = require('../../commando'); 2 | const Discord = require('discord.js'); 3 | const { disgustP } = require('../../assets/json/actions.json'); 4 | 5 | module.exports = class DisgustCommand extends Command { 6 | constructor(client) { 7 | super(client, { 8 | name: 'disgust', 9 | aliases: ['gross', 'eww'], 10 | group: 'action', 11 | memberName: 'disgust', 12 | guildOnly: true, 13 | description: 'Absolutely **disgusting**, now which one of you likes handholding?', 14 | examples: ['~disgust'], 15 | throttling: { 16 | usages: 1, 17 | duration: 5 18 | } 19 | }); 20 | } 21 | 22 | run(message) { 23 | const embed = new Discord.MessageEmbed() 24 | .setColor('#FBCFCF') 25 | .setImage(disgustP[Math.round(Math.random() * (disgustP.length - 1))]); 26 | return message.channel.send({ embed }); 27 | } 28 | } -------------------------------------------------------------------------------- /commands/action/grope.js: -------------------------------------------------------------------------------- 1 | const { Command } = require('../../commando'); 2 | const Discord = require('discord.js'); 3 | const { disgustP, gropeP } = require('../../assets/json/actions.json'); 4 | 5 | module.exports = class GropeCommand extends Command { 6 | constructor(client) { 7 | super(client, { 8 | name: 'grope', 9 | group: 'action', 10 | memberName: 'grope', 11 | guildOnly: true, 12 | description: 'Gropes..? the user you mentioned...?', 13 | examples: ['~grope '], 14 | throttling: { 15 | usages: 1, 16 | duration: 3 17 | } 18 | }); 19 | } 20 | 21 | run(message) { 22 | var recipient = message.content.split(/\s+/g).slice(1).join(" "); 23 | var disgust = disgustP[Math.round(Math.random() * (disgustP.length - 1))]; 24 | var grope = gropeP[Math.round(Math.random() * (gropeP.length - 1))]; 25 | 26 | if (!recipient) { 27 | var embed = new Discord.MessageEmbed() 28 | .setColor('#FBCFCF') 29 | .setImage(disgust); 30 | return message.channel.send(`${message.author} gropes... themselves..?`, { embed: embed }); 31 | 32 | } else if (message.mentions.users.first() == message.author) { 33 | var embed = new Discord.MessageEmbed() 34 | .setColor('#FBCFCF') 35 | .setImage(disgust); 36 | return message.channel.send(`${message.author} gropes... themselves..?`, { embed: embed }); 37 | 38 | } else if (message.mentions.users.first() == this.client.user) { 39 | const embed = new Discord.MessageEmbed() 40 | .setColor('#FBCFCF') 41 | .setImage(grope); 42 | return message.channel.send(`E-EH?! Nya! Where...are you.. touching.. (✿\´ ꒳ \` ) I guess I'm okay with it as long as you are... Don't take this the wrong way!`, { embed: embed }); 43 | 44 | } else { 45 | var embed = new Discord.MessageEmbed() 46 | .setColor('#FBCFCF') 47 | .setImage(grope); 48 | return message.channel.send(`${message.author} has started... groping ${recipient}?`, { embed: embed }); 49 | } 50 | } 51 | } -------------------------------------------------------------------------------- /commands/action/hand.js: -------------------------------------------------------------------------------- 1 | const { Command } = require('../../commando'); 2 | const Discord = require('discord.js'); 3 | const { handP } = require('../../assets/json/actions.json'); 4 | 5 | module.exports = class HandCommand extends Command { 6 | constructor(client) { 7 | super(client, { 8 | name: 'hand', 9 | aliases: ['handhold', 'holdhands'], 10 | group: 'action', 11 | memberName: 'hand', 12 | guildOnly: true, 13 | description: 'Holds hands with the user you mentioned!', 14 | examples: ['~hand '], 15 | throttling: { 16 | usages: 1, 17 | duration: 3 18 | } 19 | }); 20 | } 21 | 22 | run(message) { 23 | var recipient = message.content.split(/\s+/g).slice(1).join(" "); 24 | var hand = handP[Math.round(Math.random() * (handP.length - 1))]; 25 | 26 | if (!recipient) { 27 | const embed = new Discord.MessageEmbed() 28 | .setColor('#FBCFCF') 29 | .setImage(hand) 30 | return message.channel.send(`You can\'t hold your own hand, but I'll hold your hand, ${message.author}!`, { embed: embed }) 31 | 32 | } else if (message.mentions.users.first() == message.author) { 33 | const embed = new Discord.MessageEmbed() 34 | .setColor('#FBCFCF') 35 | .setImage(hand) 36 | return message.channel.send(`You can\'t hold your own hand, but I'll hold your hand, ${message.author}!`, { embed: embed }) 37 | 38 | } else if (message.mentions.users.first() == this.client.user) { 39 | const embed = new Discord.MessageEmbed() 40 | .setColor('#FBCFCF') 41 | .setImage(hand); 42 | return message.channel.send(`K-Kya~~ I guess I'll hold you hand, senpai! (〃・ω・〃)ノ`, { embed: embed }); 43 | 44 | } else { 45 | const recipient = message.content.split(/\s+/g).slice(1).join(" "); 46 | const embed = new Discord.MessageEmbed() 47 | .setColor('#FBCFCF') 48 | .setImage(hand) 49 | return message.channel.send(`${message.author} holds hands with ${recipient}!`, { embed: embed }) 50 | } 51 | } 52 | } -------------------------------------------------------------------------------- /commands/action/hug.js: -------------------------------------------------------------------------------- 1 | const { Command } = require('../../commando'); 2 | const Discord = require('discord.js'); 3 | const { hugP } = require('../../assets/json/actions.json'); 4 | 5 | module.exports = class HugCommand extends Command { 6 | constructor(client) { 7 | super(client, { 8 | name: 'hug', 9 | aliases: ['cuddle'], 10 | group: 'action', 11 | memberName: 'hug', 12 | guildOnly: true, 13 | description: 'Hugs the user you mentioned!', 14 | examples: ['~hug '], 15 | throttling: { 16 | usages: 1, 17 | duration: 3 18 | } 19 | }); 20 | } 21 | 22 | run(message) { 23 | var recipient = message.content.split(/\s+/g).slice(1).join(" "); 24 | var hug = hugP[Math.round(Math.random() * (hugP.length - 1))] 25 | 26 | if (!recipient) { 27 | const embed = new Discord.MessageEmbed() 28 | .setColor('#FBCFCF') 29 | .setImage(hug); 30 | return message.channel.send(`You can't hug yourself, but I'll hug you, ${message.author}!`, { embed: embed }); 31 | 32 | } else if (message.mentions.users.first() == message.author) { 33 | const embed = new Discord.MessageEmbed() 34 | .setColor('#FBCFCF') 35 | .setImage(hug); 36 | return message.channel.send(`You can't hug yourself, but I'll hug you, ${message.author}!`, { embed: embed }); 37 | 38 | } else if (message.mentions.users.first() == this.client.user) { 39 | const embed = new Discord.MessageEmbed() 40 | .setColor('#FBCFCF') 41 | .setImage(hug); 42 | return message.channel.send(`ల(\*´= ◡ =`\*) Such a warm hug..thank you~~ Nyaa~~`, { embed: embed }); 43 | 44 | } else { 45 | const embed = new Discord.MessageEmbed() 46 | .setColor('#FBCFCF') 47 | .setImage(hug); 48 | return message.channel.send(`${message.author} hugs ${recipient}!`, { embed: embed }); 49 | } 50 | } 51 | } -------------------------------------------------------------------------------- /commands/action/kiss.js: -------------------------------------------------------------------------------- 1 | const { Command } = require('../../commando'); 2 | const Discord = require('discord.js'); 3 | const { kissP } = require('../../assets/json/actions.json'); 4 | 5 | module.exports = class KissCommand extends Command { 6 | constructor(client) { 7 | super(client, { 8 | name: 'kiss', 9 | aliases: ['smooch'], 10 | group: 'action', 11 | memberName: 'kiss', 12 | guildOnly: true, 13 | description: 'Kisses the user you mentioned!', 14 | examples: ['~kiss '], 15 | throttling: { 16 | usages: 1, 17 | duration: 3 18 | } 19 | }); 20 | } 21 | 22 | run(message) { 23 | const recipient = message.content.split(/\s+/g).slice(1).join(" "); 24 | var kiss = kissP[Math.round(Math.random() * (kissP.length - 1))] 25 | 26 | if (!recipient) { 27 | const embed = new Discord.MessageEmbed() 28 | .setColor('#FBCFCF') 29 | .setImage(kiss); 30 | return message.channel.send(`You can't kiss yourself, but I'll kiss you, ${message.author}!`, { embed: embed }); 31 | 32 | } else if (message.mentions.users.first() == message.author) { 33 | const embed = new Discord.MessageEmbed() 34 | .setColor('#FBCFCF') 35 | .setImage(kiss); 36 | return message.channel.send(`You can't kiss yourself, but I'll kiss you, ${message.author}!`, { embed: embed }); 37 | 38 | } else if (message.mentions.users.first() == this.client.user) { 39 | const embed = new Discord.MessageEmbed() 40 | .setColor('#FBCFCF') 41 | .setImage(kiss); 42 | return message.channel.send(`I-It's not like I wanted you to kiss me or anything...・:*(〃・ェ・〃人)*:・`, { embed: embed }); 43 | 44 | } else { 45 | const embed = new Discord.MessageEmbed() 46 | .setColor('#FBCFCF') 47 | .setImage(kiss); 48 | return message.channel.send(`${message.author} kisses ${recipient}!`, { embed: embed }); 49 | } 50 | } 51 | } -------------------------------------------------------------------------------- /commands/action/lewd.js: -------------------------------------------------------------------------------- 1 | const { Command } = require('../../commando'); 2 | const Discord = require('discord.js'); 3 | const { lewdP } = require('../../assets/json/actions.json'); 4 | 5 | module.exports = class LewdCommand extends Command { 6 | constructor(client) { 7 | super(client, { 8 | name: 'lewd', 9 | aliases: ['thatslewd'], 10 | group: 'action', 11 | memberName: 'lewd', 12 | guildOnly: true, 13 | description: 'That\'s lewd!', 14 | examples: ['~lewd'], 15 | throttling: { 16 | usages: 1, 17 | duration: 3 18 | } 19 | }); 20 | } 21 | 22 | run(message) { 23 | const embed = new Discord.MessageEmbed() 24 | .setColor('#FBCFCF') 25 | .setImage(lewdP[Math.round(Math.random() * (lewdP.length - 1))]); 26 | return message.channel.send('L-Lewd!', { embed: embed }); 27 | } 28 | } -------------------------------------------------------------------------------- /commands/action/nobully.js: -------------------------------------------------------------------------------- 1 | const { Command } = require('../../commando'); 2 | const Discord = require('discord.js'); 3 | const actions = require('../../assets/json/actions.json'); 4 | 5 | module.exports = class NoBullyCommand extends Command { 6 | constructor(client) { 7 | super(client, { 8 | name: 'nobully', 9 | aliases: ['antibully'], 10 | group: 'action', 11 | memberName: 'nobully', 12 | guildOnly: true, 13 | description: 'Absolutely no bullying allowed!', 14 | examples: ['~nobully '], 15 | throttling: { 16 | usages: 1, 17 | duration: 3 18 | } 19 | }); 20 | } 21 | 22 | run(message) { 23 | const recipient = message.content.split(/\s+/g).slice(1).join(" "); 24 | if (!recipient) { 25 | const embed = new Discord.MessageEmbed() 26 | .setColor('#FBCFCF') 27 | .setImage(actions.nobullyP[Math.round(Math.random() * (actions.nobullyP.length - 1))]); 28 | return message.channel.send({ embed: embed }); 29 | 30 | } else if (message.mentions.users.first() == this.client.user) { 31 | return message.channel.send(`(✿´ ꒳ \` ) am not bulli!!`); 32 | 33 | } else { 34 | const embed = new Discord.MessageEmbed() 35 | .setColor('#FBCFCF') 36 | .setImage(actions.nobullyP[Math.round(Math.random() * (actions.nobullyP.length - 1))]); 37 | return message.channel.send(`${recipient}, pls no bulli!!`, { embed: embed }); 38 | } 39 | } 40 | } -------------------------------------------------------------------------------- /commands/action/noswearing.js: -------------------------------------------------------------------------------- 1 | const { Command } = require('../../commando'); 2 | const Discord = require('discord.js'); 3 | const { noSwearP } = require('../../assets/json/actions.json'); 4 | 5 | 6 | module.exports = class PoutCommand extends Command { 7 | constructor(client) { 8 | super(client, { 9 | name: 'noswearing', 10 | aliases: ['sorrysir', 'noswear'], 11 | group: 'action', 12 | memberName: 'noswearing', 13 | guildOnly: true, 14 | description: 'Sorry sir no swearing in my Christian Minecraft server', 15 | examples: ['~wink '], 16 | throttling: { 17 | usages: 1, 18 | duration: 3 19 | } 20 | }); 21 | } 22 | 23 | run(message) { 24 | var recipient = message.content.split(/\s+/g).slice(1).join(" "); 25 | var noSwear = noSwearP[Math.round(Math.random() * (noSwearP.length - 1))]; 26 | 27 | if (!recipient) { 28 | var embed = new Discord.MessageEmbed() 29 | .setColor('#FBCFCF') 30 | .setImage(noSwear); 31 | return message.channel.send(`**NO SWEARING! <:NOSWEARING:379103012007706624>**`, { embed: embed }); 32 | 33 | } else { 34 | var embed = new Discord.MessageEmbed() 35 | .setColor('#FBCFCF') 36 | .setImage(noSwear); 37 | return message.channel.send(`${recipient}, NO SWEARING!`, { embed: embed }); 38 | 39 | } 40 | } 41 | } -------------------------------------------------------------------------------- /commands/action/nyan.js: -------------------------------------------------------------------------------- 1 | const { Command } = require('../../commando'); 2 | const Discord = require('discord.js'); 3 | const snekfetch = require('snekfetch'); 4 | 5 | module.exports = class NyanCommand extends Command { 6 | constructor(client) { 7 | super(client, { 8 | name: 'nyan', 9 | aliases: ['nya'], 10 | group: 'action', 11 | memberName: 'nyan', 12 | guildOnly: true, 13 | description: 'Nya!', 14 | examples: ['~nyan'], 15 | throttling: { 16 | usages: 1, 17 | duration: 3 18 | } 19 | }); 20 | } 21 | 22 | async run(message) { 23 | var text = await snekfetch.get(`https://rra.ram.moe/i/r?type=nyan`); 24 | var body = JSON.parse(text.text); 25 | 26 | var embed = new Discord.MessageEmbed() 27 | .setColor('#FBCFCF') 28 | .setImage(`https://rra.ram.moe${body.path}`); 29 | return message.channel.send(`Nya!`, { embed: embed }); 30 | } 31 | } -------------------------------------------------------------------------------- /commands/action/owo.js: -------------------------------------------------------------------------------- 1 | const { Command } = require('../../commando'); 2 | const Discord = require('discord.js'); 3 | const snekfetch = require('snekfetch'); 4 | 5 | module.exports = class OwoCommand extends Command { 6 | constructor(client) { 7 | super(client, { 8 | name: 'owo', 9 | aliases: ['whatsthis'], 10 | group: 'action', 11 | memberName: 'owo', 12 | guildOnly: true, 13 | description: 'OWO what\'s this!', 14 | examples: ['~owo'], 15 | throttling: { 16 | usages: 1, 17 | duration: 3 18 | } 19 | }); 20 | } 21 | 22 | async run(message) { 23 | var text = await snekfetch.get(`https://rra.ram.moe/i/r?type=owo`); 24 | var body = JSON.parse(text.text); 25 | 26 | var embed = new Discord.MessageEmbed() 27 | .setColor('#FBCFCF') 28 | .setImage(`https://rra.ram.moe${body.path}`); 29 | return message.channel.send({ embed }); 30 | } 31 | } -------------------------------------------------------------------------------- /commands/action/pat.js: -------------------------------------------------------------------------------- 1 | const { Command } = require('../../commando'); 2 | const Discord = require('discord.js'); 3 | const { patP } = require('../../assets/json/actions.json'); 4 | 5 | module.exports = class PatCommand extends Command { 6 | constructor(client) { 7 | super(client, { 8 | name: 'pat', 9 | aliases: ['pet'], 10 | group: 'action', 11 | memberName: 'pat', 12 | guildOnly: true, 13 | description: 'Pats the user you mentioned on the head!', 14 | examples: ['~pat '], 15 | throttling: { 16 | usages: 1, 17 | duration: 3 18 | } 19 | }); 20 | } 21 | 22 | run(message) { 23 | var recipient = message.content.split(/\s+/g).slice(1).join(" "); 24 | var pat = patP[Math.round(Math.random() * (patP.length - 1))]; 25 | 26 | if (!recipient) { 27 | const embed = new Discord.MessageEmbed() 28 | .setColor('#FBCFCF') 29 | .setImage(pat); 30 | return message.channel.send(`${message.author}, you can't pat yourself, but I'll pat you! (´꒳\`)`, { embed: embed }); 31 | 32 | } else if (message.mentions.users.first() == message.author) { 33 | const embed = new Discord.MessageEmbed() 34 | .setColor('#FBCFCF') 35 | .setImage(pat); 36 | return message.channel.send(`${message.author}, you can't pat yourself, but I'll pat you! (´꒳\`)`, { embed: embed }); 37 | 38 | } else if (message.mentions.users.first() == this.client.user) { 39 | const embed = new Discord.MessageEmbed() 40 | .setColor('#FBCFCF') 41 | .setImage(pat); 42 | return message.channel.send(`H-Haa.. (✿´ ꒳ \` ) please don't stop...`, { embed: embed }); 43 | 44 | } else { 45 | const embed = new Discord.MessageEmbed() 46 | .setColor('#FBCFCF') 47 | .setImage(pat); 48 | return message.channel.send(`${message.author} pats ${recipient}!`, { embed: embed }); 49 | } 50 | } 51 | } -------------------------------------------------------------------------------- /commands/action/pout.js: -------------------------------------------------------------------------------- 1 | const { Command } = require('../../commando'); 2 | const Discord = require('discord.js'); 3 | const snekfetch = require('snekfetch'); 4 | 5 | //remember to return before every promise 6 | module.exports = class PoutCommand extends Command { 7 | constructor(client) { 8 | super(client, { 9 | name: 'pout', 10 | group: 'action', 11 | memberName: 'pout', 12 | guildOnly: true, 13 | description: 'uWaa??', 14 | examples: ['~pout'], 15 | throttling: { 16 | usages: 1, 17 | duration: 3 18 | } 19 | }); 20 | } 21 | 22 | async run(message) { 23 | var recipient = message.content.split(/\s+/g).slice(1).join(" "); 24 | 25 | var res = await snekfetch.get(`https://rra.ram.moe/i/r?type=pout`); 26 | var body = JSON.parse(res.text); 27 | 28 | if (!recipient) { 29 | var embed = new Discord.MessageEmbed() 30 | .setColor('#FBCFCF') 31 | .setImage(`https://rra.ram.moe${body.path}`); 32 | return message.channel.send(`${message.author} has started pouting!`, { embed: embed }); 33 | 34 | } else { 35 | var embed = new Discord.MessageEmbed() 36 | .setColor('#FBCFCF') 37 | .setImage(`https://rra.ram.moe${body.path}`); 38 | return message.channel.send(`${message.author} pouts at ${recipient}!`, { embed: embed }); 39 | } 40 | } 41 | } -------------------------------------------------------------------------------- /commands/action/slap.js: -------------------------------------------------------------------------------- 1 | const { Command } = require('../../commando'); 2 | const Discord = require('discord.js'); 3 | const { slapP } = require('../../assets/json/actions.json'); 4 | 5 | module.exports = class SlapCommand extends Command { 6 | constructor(client) { 7 | super(client, { 8 | name: 'slap', 9 | aliases: ['punch', 'hit', 'punish'], 10 | group: 'action', 11 | memberName: 'slap', 12 | guildOnly: true, 13 | description: 'Slaps the user you mentioned!', 14 | examples: ['~slap '], 15 | throttling: { 16 | usages: 1, 17 | duration: 3 18 | } 19 | }); 20 | } 21 | 22 | run(message) { 23 | function selfSlap() { 24 | var rand = ['http://cdn.awwni.me/mz98.gif', 'https://media.giphy.com/media/UxFtCk3f62uGI/200.gif']; 25 | return rand[Math.floor(Math.random() * rand.length - 1)]; 26 | } 27 | 28 | const recipient = message.content.split(/\s+/g).slice(1).join(" "); 29 | var slap = slapP[Math.round(Math.random() * (slapP.length - 1))]; 30 | 31 | if (!recipient) { 32 | const embed = new Discord.MessageEmbed() 33 | .setColor('#FBCFCF') 34 | .setImage(selfSlap()); 35 | return message.channel.send(`${message.author}, please don't slap yourself!`, { embed: embed }); 36 | 37 | } else if (message.mentions.users.first() == message.author) { 38 | const embed = new Discord.MessageEmbed() 39 | .setColor('#FBCFCF') 40 | .setImage(selfSlap()); 41 | return message.channel.send(`${message.author}, please don't slap yourself!`, { embed: embed }); 42 | 43 | } else if (message.mentions.users.first() == this.client.user) { 44 | return message.channel.send(`(;︿ ;✿) I-I'm sorry.. please d-don't slap me...`, { embed: embed }); 45 | 46 | } else { 47 | const embed = new Discord.MessageEmbed() 48 | .setColor('#FBCFCF') 49 | .setImage(slap); 50 | return message.channel.send(`${message.author} slaps ${recipient}!`, { embed: embed }); 51 | } 52 | } 53 | } -------------------------------------------------------------------------------- /commands/action/smug.js: -------------------------------------------------------------------------------- 1 | //powered by smugs.safe.moe!! 2 | 3 | const { Command } = require('../../commando'); 4 | const Discord = require('discord.js'); 5 | const snekfetch = require('snekfetch'); 6 | 7 | module.exports = class SmugCommand extends Command { 8 | constructor(client) { 9 | super(client, { 10 | name: 'smug', 11 | group: 'action', 12 | memberName: 'smug', 13 | guildOnly: true, 14 | description: 'the epitome of arguments: smug anime girls.', 15 | examples: ['~smug'], 16 | throttling: { 17 | usages: 1, 18 | duration: 3 19 | } 20 | }); 21 | } 22 | 23 | async run(message) { 24 | var smugID = Math.floor(Math.random() * 58) + 1 25 | 26 | var embed = new Discord.MessageEmbed() 27 | .setColor('#727293') 28 | .setImage(`http://smug.moe/smg/${smugID}.png`); 29 | return message.channel.send({ embed }); 30 | } 31 | } -------------------------------------------------------------------------------- /commands/action/wasted.js: -------------------------------------------------------------------------------- 1 | const { Command } = require('../../commando'); 2 | const Discord = require('discord.js'); 3 | const { wastedP } = require('../../assets/json/actions.json'); 4 | 5 | module.exports = class WastedCommand extends Command { 6 | constructor(client) { 7 | super(client, { 8 | name: 'wasted', 9 | aliases: ['rekt', 'wrecked'], 10 | group: 'action', 11 | memberName: 'wasted', 12 | guildOnly: true, 13 | description: 'W A S T E D', 14 | examples: ['~wasted '], 15 | throttling: { 16 | usages: 1, 17 | duration: 3 18 | } 19 | }); 20 | } 21 | 22 | run(message) { 23 | const recipient = message.content.split(/\s+/g).slice(1).join(" "); 24 | const wasted = wastedP[Math.round(Math.random() * (wastedP.length - 1))]; 25 | 26 | if (!recipient) { 27 | const embed = new Discord.MessageEmbed() 28 | .setColor('#FBCFCF') 29 | .setImage(wasted); 30 | return message.channel.send(`${message.author} got wasted!`, { embed: embed }); 31 | 32 | } else if (message.mentions.users.first() == message.author) { 33 | const embed = new Discord.MessageEmbed() 34 | .setColor('#FBCFCF') 35 | .setImage(wasted); 36 | return message.channel.send(`${message.author} got wasted!`, { embed: embed }); 37 | 38 | } else if (message.mentions.users.first() == this.client.user) { 39 | return message.channel.send(`${message.author}... please don't bully me! (๑◕︵◕๑)`); 40 | 41 | } else { 42 | const embed = new Discord.MessageEmbed() 43 | .setColor('#FBCFCF') 44 | .setImage(wasted); 45 | return message.channel.send(`${recipient} just got wasted!`, { embed: embed }); 46 | } 47 | } 48 | } -------------------------------------------------------------------------------- /commands/action/wink.js: -------------------------------------------------------------------------------- 1 | const { Command } = require('../../commando'); 2 | const Discord = require('discord.js'); 3 | const { winkP } = require('../../assets/json/actions.json'); 4 | 5 | 6 | //remember to return before every promise 7 | module.exports = class PoutCommand extends Command { 8 | constructor(client) { 9 | super(client, { 10 | name: 'wink', 11 | group: 'action', 12 | memberName: 'wink', 13 | guildOnly: true, 14 | description: 'Winks at the specified user!', 15 | examples: ['~wink '], 16 | throttling: { 17 | usages: 1, 18 | duration: 3 19 | } 20 | }); 21 | } 22 | 23 | run(message) { 24 | var recipient = message.content.split(/\s+/g).slice(1).join(" "); 25 | var wink = winkP[Math.round(Math.random() * (winkP.length - 1))] 26 | 27 | if (!recipient) { 28 | const embed = new Discord.MessageEmbed() 29 | .setColor('#FBCFCF') 30 | .setImage(wink); 31 | return message.channel.send(`You can't wink at.... yourself, but I'll wink at.. you, ${message.author}!`, { embed: embed }); 32 | 33 | } else if (message.mentions.users.first() == message.author) { 34 | const embed = new Discord.MessageEmbed() 35 | .setColor('#FBCFCF') 36 | .setImage(wink); 37 | return message.channel.send(`You can't wink at.... yourself, but I'll wink at.. you, ${message.author}!`, { embed: embed }); 38 | 39 | } else if (message.mentions.users.first() == this.client.user) { 40 | const embed = new Discord.MessageEmbed() 41 | .setColor('#FBCFCF') 42 | .setImage(wink); 43 | return message.channel.send(`(´ω`*) Y-Yes?`, { embed: embed }); 44 | 45 | } else { 46 | const embed = new Discord.MessageEmbed() 47 | .setColor('#FBCFCF') 48 | .setImage(wink); 49 | return message.channel.send(`${message.author} winks ${recipient}!`, { embed: embed }); 50 | } 51 | } 52 | } -------------------------------------------------------------------------------- /commands/anime/booru.js: -------------------------------------------------------------------------------- 1 | const { Command } = require('../../commando'); 2 | const Discord = require('discord.js'); 3 | const booru = require('booru'); 4 | 5 | 6 | module.exports = class BooruCommand extends Command { 7 | constructor(client) { 8 | super(client, { 9 | name: 'booru', 10 | aliases: ['safebooru', 'sb', 'safe', 'animepic', 'sfwbooru'], 11 | group: 'anime', 12 | memberName: 'safebooru', 13 | guildOnly: true, 14 | description: 'Searches for images on Safebooru!', 15 | details: 'Keep in mind Safebooru\'s definition of safe!', 16 | examples: ['~safebooru [search]'], 17 | throttling: { 18 | usages: 1, 19 | duration: 3 20 | } 21 | }); 22 | } 23 | 24 | run(message) { 25 | if (message.content.toUpperCase().includes('LOLI') || message.content.toUpperCase().includes('GORE')) return message.channel.send('That kind of stuff is not allowed! Not even in NSFW channels!'); 26 | 27 | var query = message.content.split(/\s+/g).slice(1).join(" "); 28 | 29 | booru.search('safebooru', [query], { limit: 1, random: true }) 30 | .then(booru.commonfy) 31 | .then(images => { 32 | for (let image of images) { 33 | const embed = new Discord.MessageEmbed() 34 | .setAuthor(`Safebooru ${query}`, 'https://b.catgirlsare.sexy/NrAI.png') 35 | .setImage(image.common.file_url) 36 | .setDescription(`[Image URL](${image.common.file_url})`) 37 | .setColor('#C597B8'); 38 | return message.channel.send({ embed }); 39 | } 40 | 41 | }).catch(err => { 42 | if (err.name === 'booruError') { 43 | return message.channel.send(`No results found for **${query}**!`); 44 | } else { 45 | return message.channel.send(`No results found for **${query}**!`); 46 | } 47 | }) 48 | } 49 | } -------------------------------------------------------------------------------- /commands/anime/moe.js: -------------------------------------------------------------------------------- 1 | const { Command } = require('../../commando'); 2 | const Discord = require('discord.js'); 3 | const randomPuppy = require('random-puppy'); 4 | 5 | module.exports = class MoeCommand extends Command { 6 | constructor(client) { 7 | super(client, { 8 | name: 'moe', 9 | aliases: ['awwnime', 'loli'], 10 | group: 'anime', 11 | memberName: 'moe', 12 | guildOnly: true, 13 | description: 'Cute anime girls!', 14 | examples: ['~moe'], 15 | throttling: { 16 | usages: 1, 17 | duration: 5 18 | } 19 | }); 20 | } 21 | 22 | run(message) { 23 | randomPuppy('awwnime') 24 | .then(url => { 25 | const embed = new Discord.MessageEmbed() 26 | .setFooter(`awwnime`) 27 | .setDescription(`[Image URL](${url})`) 28 | .setImage(url) 29 | .setColor('#A187E0') 30 | return message.channel.send({ embed }) 31 | }) 32 | } 33 | } -------------------------------------------------------------------------------- /commands/core/iku.js: -------------------------------------------------------------------------------- 1 | const { Command } = require('../../commando'); 2 | const Discord = require('discord.js'); 3 | const iku = require('../../assets/json/iku.json'); 4 | 5 | module.exports = class IkuCommand extends Command { 6 | constructor(client) { 7 | super(client, { 8 | name: 'iku', 9 | guildOnly: true, 10 | aliases: ['bestgirl', 'i19'], 11 | group: 'core', 12 | memberName: 'iku', 13 | description: 'Iku is best girl and there\'s no denying it!!', 14 | examples: ['~iku'], 15 | throttling: { 16 | usages: 1, 17 | duration: 5 18 | } 19 | }); 20 | } 21 | 22 | run(message) { 23 | const embed = new Discord.MessageEmbed() 24 | .setColor('#FBCFCF') 25 | .setImage(iku[Math.round(Math.random() * (iku.length - 1))]); 26 | return message.channel.send({ embed }); 27 | } 28 | } -------------------------------------------------------------------------------- /commands/core/invite.js: -------------------------------------------------------------------------------- 1 | const { Command } = require('../../commando'); 2 | const Discord = require('discord.js'); 3 | 4 | module.exports = class InviteCommand extends Command { 5 | constructor(client) { 6 | super(client, { 7 | name: 'invite', 8 | guildOnly: true, 9 | aliases: ['oauth', 'get', 'link', 'invlink'], 10 | group: 'core', 11 | memberName: 'invite', 12 | description: 'Gives you the invite link!', 13 | examples: ['~invite'], 14 | throttling: { 15 | usages: 1, 16 | duration: 3 17 | } 18 | }); 19 | } 20 | 21 | run(message) { 22 | var phrases = [ 23 | 'Add me to your server with this link!', 24 | 'I-It\'s not like I want to be invited to your server...', 25 | 'Invite me Onee-chan!', 26 | 'Hello... Please take me...', 27 | 'I\'d love to be in your server!', 28 | 'B-Baka! u///u I-I\'s not like I wanted to be in your server...', 29 | 'Kyaaa~~ A server? Of course!', 30 | 'P-Please invite me.. to your server...' 31 | ] 32 | 33 | var phrase = phrases[Math.round(Math.random() * (phrases.length - 1))]; 34 | 35 | const embed = new Discord.MessageEmbed() 36 | .setColor('#727293') 37 | .setDescription(`[${phrase}](https://discordapp.com/oauth2/authorize?client_id=${this.client.user.id}&scope=bot&permissions=1043721303)`); 38 | 39 | return message.channel.send({ embed }); 40 | } 41 | } -------------------------------------------------------------------------------- /commands/core/nsfwcommands.js: -------------------------------------------------------------------------------- 1 | const { Command } = require('../../commando'); 2 | const Discord = require('discord.js'); 3 | 4 | 5 | module.exports = class NSFWCommandsCommand extends Command { 6 | constructor(client) { 7 | super(client, { 8 | name: 'nsfwcommands', 9 | aliases: ['commandsnsfw', 'cnsfw', 'pervert'], 10 | group: 'core', 11 | memberName: 'nsfwcommands', 12 | description: 'Lists all the NSFW commands!', 13 | examples: ['~nsfwcommands'] 14 | }); 15 | } 16 | 17 | run(message) { 18 | const embed = new Discord.MessageEmbed() 19 | .setAuthor("NSFW Commands", 'https://a.safe.moe/Tr9Jr.png') 20 | .setDescription(`Use \`~help [command]\` for more details.`) 21 | .setColor('727293') 22 | .setThumbnail(this.client.user.displayAvatarURL({ format: 'png' })) 23 | .setFooter("Any message from me can be removed by reacting with a 🎴 emoji!") 24 | .addField("__2D NSFW:__", "`ecchi` `hentai` `hentaigif`\n\`hentaiirl` `neko` `pantsu`\n\`oppai` `yaoi` `yuri` `zr `", true) 25 | .addField("__2D Fetish:__", "`ahegao` `bara` `bondage`\n\`futa` `monstergirl` `paizuri`\n\`sukebei` `tentacle` `trap`", true) 26 | .addField("__3D NSFW:__", "`4knsfw` `artsyporn` `ass` `boobs`\n\`nsfw` `nsfwgif` `pornhub` `pussy`", true) 27 | .addField("__3D Fetish:__", "`asian` `amateur` `bdsm`\n\`cosplay` `grool` `lingerie`", true) 28 | .addField("__NSFW Image Boards:__", "`danbooru` `gelbooru` `hypno` `konachan` `paheal` `rule34` `tbib` `yandere` `xbooru` `e621`"); 29 | message.channel.send({ embed }).then(m => { m.react('🎴') }); 30 | 31 | return null; 32 | } 33 | } -------------------------------------------------------------------------------- /commands/core/ping.js: -------------------------------------------------------------------------------- 1 | const { Command } = require('../../commando'); 2 | 3 | const responses = [ 4 | 'Pong!', 5 | 'I-It\'s not like I wanted to say pong or anything...', 6 | 'Pong...', 7 | 'Testing, testing, 1, 2, 3!', 8 | 'Anyone there?', 9 | 'Does anyone even use this?', 10 | 'Woo! A secret command!', 11 | 'Ping! ...I mean **pong!**', 12 | 'Hi there!', 13 | 'At your service!', 14 | 'Yes?', 15 | 'Hello!', 16 | "Konnichiwa~", 17 | "Ohayoo~", 18 | "I'm up and running!", 19 | "Here I am!", 20 | "Right here!", 21 | "Hai!", 22 | "Hey there!", 23 | "You found me!", 24 | "Nya!", 25 | "N-Nya..?", 26 | "Nyahaha you found me!" 27 | ]; 28 | 29 | module.exports = class PingCommand extends Command { 30 | constructor(client) { 31 | super(client, { 32 | name: 'ping', 33 | group: 'core', 34 | memberName: 'ping', 35 | description: 'Checks the ping latency and whether or not I\'m operating!', 36 | throttling: { 37 | usages: 2, 38 | duration: 10 39 | } 40 | }); 41 | } 42 | 43 | async run(message) { 44 | let choice = responses[Math.floor(Math.random() * responses.length - 1)]; 45 | 46 | const pingMsg = await message.channel.send('🔄 | Pinging...'); 47 | return pingMsg.edit(`🐱 | ${choice} \`(${pingMsg.createdTimestamp - message.createdTimestamp}ms)\``); 48 | } 49 | }; -------------------------------------------------------------------------------- /commands/core/uptime.js: -------------------------------------------------------------------------------- 1 | const { Command } = require('../../commando'); 2 | const moment = require('moment'); 3 | require('moment-duration-format'); 4 | 5 | module.exports = class UptimeCommand extends Command { 6 | constructor(client) { 7 | super(client, { 8 | name: 'uptime', 9 | group: 'core', 10 | memberName: 'uptime', 11 | description: 'Tells you how long the I\'ve been running consistently!', 12 | guarded: true 13 | }); 14 | } 15 | 16 | run(message) { 17 | var uptime = moment.duration(this.client.uptime).format('d[ days], h[ hours], m[ minutes, and ]s[ seconds]') 18 | return message.channel.send(`⌛ | I've been up and running for **${uptime}**!`); 19 | } 20 | }; 21 | -------------------------------------------------------------------------------- /commands/fun/8ball.js: -------------------------------------------------------------------------------- 1 | const { Command } = require('../../commando'); 2 | const Discord = require('discord.js'); 3 | const answer = [ 4 | "It is certain", 5 | "It is decidedly so", 6 | "Without a doubt", 7 | "Yes, definitely", 8 | "You may rely on it", 9 | "As I see it, yes", 10 | "Most likely", 11 | "Yes", 12 | "Signs point to yes", 13 | "The reply is hazy, try again", 14 | "Ask again later", 15 | "I'd better not tell you now", 16 | "I cannot predict now", 17 | "Concentrate and ask again", 18 | "Don't count on it", 19 | "My sources say no", 20 | "The outlook isn't so good", 21 | "Very doubtful", 22 | "B-Baka! No!", 23 | "Yes daddy..." 24 | ] 25 | 26 | 27 | module.exports = class EightBallCommand extends Command { 28 | constructor(client) { 29 | super(client, { 30 | name: '8ball', 31 | aliases: ['8b', 'ball'], 32 | group: 'fun', 33 | memberName: '8ball', 34 | guildOnly: true, 35 | description: 'Ask the magic 8ball a question!', 36 | examples: ['~8ball [question]'], 37 | throttling: { 38 | usages: 1, 39 | duration: 3 40 | } 41 | }); 42 | } 43 | 44 | run(message) { 45 | let question = message.content.split(/\s+/g).slice(1).join(" "); 46 | 47 | if (!question) { 48 | return message.channel.send('You must provide a question!'); 49 | } 50 | 51 | const embed = new Discord.MessageEmbed() 52 | .setAuthor(question, 'https://a.safe.moe/aKDHV.png') 53 | .setDescription(answer[Math.round(Math.random() * (answer.length - 1))] + '.') 54 | .setColor('#646770'); 55 | return message.channel.send({ embed }); 56 | 57 | } 58 | } -------------------------------------------------------------------------------- /commands/fun/_talk.js: -------------------------------------------------------------------------------- 1 | /*const { Command } = require('../../commando'); 2 | const cleverbot = require("cleverbot-node"); 3 | 4 | module.exports = class TalkCommand extends Command { 5 | constructor(client) { 6 | super(client, { 7 | name: 'talk', 8 | aliases: ['chat', 'cleverbot', '!', 'komugari'], 9 | group: 'fun', 10 | memberName: 'talk', 11 | description: 'Talk to Komugari using the Cleverbot API!', 12 | examples: ['~talk [sentence]'], 13 | guildOnly: true, 14 | throttling: { 15 | usages: 1, 16 | duration: 3 17 | } 18 | }); 19 | } 20 | 21 | run(message) { 22 | const clbot = new cleverbot; 23 | clbot.configure({ botapi: "CC30y25bSJBl1pLmgwxRZHmMUjA" }); 24 | cleverbot.prepare(function() {}); 25 | 26 | let clMessage = message.content.split(/\s+/g).slice(1).join(" "); 27 | if (!clMessage) return message.channel.send('Try saying something to me after `~talk`!\n\e.g. ~talk hello!') 28 | clbot.write(clMessage, (response) => { 29 | message.channel.startTyping(); 30 | setTimeout(() => { 31 | message.channel.send(response.output).catch(console.error); 32 | message.channel.stopTyping(); 33 | }, Math.floor(Math.random() * 1000) + 1); 34 | }); 35 | } 36 | } 37 | */ -------------------------------------------------------------------------------- /commands/fun/advice.js: -------------------------------------------------------------------------------- 1 | const { Command } = require('../../commando'); 2 | const Discord = require('discord.js'); 3 | const snekfetch = require('snekfetch'); 4 | 5 | 6 | module.exports = class AdviceCommand extends Command { 7 | constructor(client) { 8 | super(client, { 9 | name: 'advice', 10 | group: 'fun', 11 | memberName: 'advice', 12 | guildOnly: true, 13 | description: 'Get some advice!', 14 | examples: ['~advice'], 15 | throttling: { 16 | usages: 1, 17 | duration: 3 18 | } 19 | }); 20 | } 21 | 22 | async run(message) { 23 | var res = await snekfetch.get("http://api.adviceslip.com/advice"); 24 | var advice = JSON.parse(res.body) 25 | 26 | try { 27 | const embed = new Discord.MessageEmbed() 28 | .setAuthor(`Here's some advice!`, 'https://a.safe.moe/BVBr9.png') 29 | .setDescription(advice.slip.advice) 30 | .setColor('#727684'); 31 | return message.channel.send({ embed }); 32 | 33 | } catch (err) { 34 | return message.channel.send(`<:NOTLIKETHIIIIIIIIIIIIIIIIIIIIIIS:371071292146843658> Sorry! My API isn't working!`) 35 | } 36 | } 37 | } -------------------------------------------------------------------------------- /commands/fun/b.js: -------------------------------------------------------------------------------- 1 | const { Command } = require('../../commando'); 2 | 3 | module.exports = class BCommand extends Command { 4 | constructor(client) { 5 | super(client, { 6 | name: 'b', 7 | guildOnly: true, 8 | aliases: ['bmoji'], 9 | group: 'fun', 10 | memberName: 'b', 11 | description: 'Converts your text to 🅱 text!', 12 | examples: ['~b [text]'], 13 | throttling: { 14 | usages: 1, 15 | duration: 3 16 | }, 17 | args: [{ 18 | key: "text", 19 | prompt: "What text do you want to do B on?\n", 20 | type: "string", 21 | default: 'traps are not gay', 22 | parse: text => text.toLowerCase(), 23 | validate: value => { 24 | if (this.B(value.toLowerCase()).length < 2000) return true; 25 | return `The output is over 2000 characters! Please try again!` 26 | } 27 | }], 28 | }); 29 | } 30 | 31 | B(text) { 32 | return text.replace(new RegExp(/(b|d|g|p|q|t|h)/gi), "🅱"); 33 | } 34 | 35 | run (message, args) { 36 | var { text } = args; 37 | 38 | return message.channel.send(this.B(text)); 39 | } 40 | } -------------------------------------------------------------------------------- /commands/fun/bird.js: -------------------------------------------------------------------------------- 1 | const { Command } = require('../../commando'); 2 | const Discord = require('discord.js'); 3 | const snekfetch = require('snekfetch'); 4 | 5 | module.exports = class BirdCommand extends Command { 6 | constructor(client) { 7 | super(client, { 8 | name: 'bird', 9 | aliases: ['birb', 'burb', 'birbo'], 10 | group: 'fun', 11 | memberName: 'bird', 12 | guildOnly: true, 13 | description: 'Sends a random picture of a bird!', 14 | examples: ['~bird'], 15 | throttling: { 16 | usages: 1, 17 | duration: 5 18 | } 19 | }); 20 | } 21 | 22 | async run(message) { 23 | const res = await snekfetch.get('http://random.birb.pw/tweet/'); 24 | const image = res.body 25 | 26 | const embed = new Discord.MessageEmbed() 27 | .setImage(`http://random.birb.pw/img/${image}`) 28 | .setFooter('http://random.birb.pw/ ©', 'http://random.birb.pw/img/BPVpe.jpg') 29 | .setColor('#71A3BE'); 30 | return message.channel.send({ embed }); 31 | } 32 | } -------------------------------------------------------------------------------- /commands/fun/cat.js: -------------------------------------------------------------------------------- 1 | const { Command } = require('../../commando'); 2 | const Discord = require('discord.js'); 3 | const snekfetch = require('snekfetch'); 4 | const { formatXml } = require('../../commando/util') 5 | 6 | module.exports = class CatCommand extends Command { 7 | constructor(client) { 8 | super(client, { 9 | name: 'cat', 10 | aliases: ['kitty', 'meow', 'cate'], 11 | group: 'fun', 12 | memberName: 'cat', 13 | guildOnly: true, 14 | description: 'Sends a random picture of a cat!', 15 | examples: ['~cat'], 16 | throttling: { 17 | usages: 1, 18 | duration: 5 19 | } 20 | }); 21 | } 22 | 23 | async run(message) { 24 | var catID = ('000' + (Math.floor(Math.random() * 773) + 1)).substr(-3); 25 | 26 | const embed = new Discord.MessageEmbed() 27 | .setImage(`https://nadeko-pictures.nyc3.digitaloceanspaces.com/cats/${catID}.png`) 28 | .setColor('#71A3BE'); 29 | return message.channel.send({ embed }); 30 | } 31 | } -------------------------------------------------------------------------------- /commands/fun/dadjoke.js: -------------------------------------------------------------------------------- 1 | const { Command } = require('../../commando'); 2 | const Discord = require('discord.js'); 3 | const snekfetch = require('snekfetch'); 4 | 5 | 6 | module.exports = class DadJokeCommand extends Command { 7 | constructor(client) { 8 | super(client, { 9 | name: 'dadjoke', 10 | aliases: ['dadpun', 'joke', 'pun'], 11 | group: 'fun', 12 | memberName: 'dadjoke', 13 | guildOnly: true, 14 | description: 'Get a random dad joke!', 15 | examples: ['~dadjoke'], 16 | throttling: { 17 | usages: 1, 18 | duration: 3 19 | } 20 | }); 21 | } 22 | 23 | async run(message) { 24 | var joke = await snekfetch.get 25 | .get("https://icanhazdadjoke.com/") 26 | .set("Accept", "application/json"); 27 | 28 | try { 29 | const embed = new Discord.MessageEmbed() 30 | .setAuthor(`Here's a joke!`, 'https://a.safe.moe/X1gKJ.png') 31 | .setDescription(joke.body.joke) 32 | .setColor('#727684'); 33 | return message.channel.send({ embed }); 34 | 35 | } catch (err) { 36 | return message.channel.send(`Consult your dad! My API isn't working!`) 37 | } 38 | } 39 | } -------------------------------------------------------------------------------- /commands/fun/dog.js: -------------------------------------------------------------------------------- 1 | const { Command } = require('../../commando'); 2 | const Discord = require('discord.js'); 3 | const snekfetch = require('snekfetch'); 4 | 5 | module.exports = class DogCommand extends Command { 6 | constructor(client) { 7 | super(client, { 8 | name: 'dog', 9 | aliases: ['puppy', 'doggo', 'pupper'], 10 | group: 'fun', 11 | memberName: 'dog', 12 | guildOnly: true, 13 | description: 'Sends a random picture of a dog!', 14 | examples: ['~dog'], 15 | throttling: { 16 | usages: 1, 17 | duration: 5 18 | } 19 | }); 20 | } 21 | 22 | async run(message) { 23 | const res = await snekfetch.get('https://random.dog/woof.json'); 24 | const image = res.body.url; 25 | 26 | console.log(image) 27 | 28 | const embed = new Discord.MessageEmbed() 29 | .setImage(image) 30 | .setDescription(`[Image URL](${image})`) 31 | .setFooter('http://www.random.dog ©', 'https://random.dog/3f62f2c1-e0cb-4077-8cd9-1ca76bfe98d5.jpg') 32 | .setColor('#71A3BE'); 33 | return message.channel.send({ embed }); 34 | } 35 | } -------------------------------------------------------------------------------- /commands/fun/f.js: -------------------------------------------------------------------------------- 1 | const { Command } = require('../../commando'); 2 | const Discord = require('discord.js'); 3 | 4 | module.exports = class FCommand extends Command { 5 | constructor(client) { 6 | super(client, { 7 | name: 'f', 8 | aliases: ['respect', 'respects', 'rip'], 9 | group: 'fun', 10 | memberName: 'f', 11 | guildOnly: true, 12 | description: 'Press F to pay respects', 13 | examples: ['~f '], 14 | throttling: { 15 | usages: 1, 16 | duration: 5 17 | }, 18 | args: [{ 19 | key: 'respect', 20 | prompt: 'Please provide me something to respect!', 21 | type: 'string', 22 | default: 'none' 23 | }] 24 | }); 25 | } 26 | 27 | run(message, args) { 28 | const { respect } = args; 29 | if (respect == 'none') { 30 | const embed = new Discord.MessageEmbed() 31 | .setAuthor(`${message.author.username} has paid their respects.`, message.author.displayAvatarURL({ format: 'png' })) 32 | .setColor('#4E373B') 33 | .setFooter(`Press F to pay your respects.`); 34 | message.channel.send({ embed }).then(m => m.react("🇫")); 35 | 36 | return null; 37 | 38 | } else { 39 | const embed = new Discord.MessageEmbed() 40 | .setAuthor(`\u2000`, message.author.displayAvatarURL({ format: 'png' })) 41 | .setColor('#4E373B') 42 | .setDescription(`${message.author} has paid their respects to ${respect}`) 43 | .setFooter(`Press F to pay your respects.`); 44 | message.channel.send({ embed }).then(m => m.react("🇫")); 45 | 46 | return null; 47 | } 48 | } 49 | } -------------------------------------------------------------------------------- /commands/fun/fortune.js: -------------------------------------------------------------------------------- 1 | const { Command } = require('../../commando'); 2 | const Discord = require('discord.js'); 3 | const fortune = require('../../assets/json/fortune.json'); 4 | 5 | 6 | module.exports = class FortuneCommand extends Command { 7 | constructor(client) { 8 | super(client, { 9 | name: 'fortune', 10 | aliases: ['ft', 'fortunecookie'], 11 | group: 'fun', 12 | memberName: 'fortune', 13 | guildOnly: true, 14 | description: 'Get a random fortune!', 15 | examples: ['~fortune'], 16 | throttling: { 17 | usages: 1, 18 | duration: 3 19 | } 20 | }); 21 | } 22 | 23 | run(message) { 24 | const embed = new Discord.MessageEmbed() 25 | .setAuthor(`${message.author.username}'s fortune`, "https://a.safe.moe/KBMis.png") 26 | .setDescription(fortune[Math.round(Math.random() * (fortune.length - 1))]) 27 | .setColor('#FAC193'); 28 | return message.channel.send({ embed }); 29 | } 30 | } -------------------------------------------------------------------------------- /commands/fun/garfield.js: -------------------------------------------------------------------------------- 1 | const { Command } = require('../../commando'); 2 | const Discord = require('discord.js'); 3 | const moment = require('moment') 4 | 5 | module.exports = class GarfieldCommand extends Command { 6 | constructor(client) { 7 | super(client, { 8 | name: 'garfield', 9 | guildOnly: true, 10 | aliases: ['gar', 'comic'], 11 | group: 'fun', 12 | memberName: 'garfield', 13 | description: 'garfield', 14 | examples: ['garfield'], 15 | throttling: { 16 | usages: 1, 17 | duration: 3 18 | } 19 | }); 20 | } 21 | 22 | run(message) { 23 | let year = random(1990, 2016); 24 | let day = random(0, 366); 25 | let date = moment().year(year).dayOfYear(day); 26 | let dateFormat = date.format('YYYY-MM-DD'); 27 | let dateYear = date.year(); 28 | 29 | const embed = new Discord.MessageEmbed() 30 | .setColor('#E16935') 31 | .setFooter(`Published in ${dateYear}`) 32 | .setDescription(`[Image URL](https://d1ejxu6vysztl5.cloudfront.net/comics/garfield/${dateYear}/${dateFormat}.gif)`) 33 | .setImage(`https://d1ejxu6vysztl5.cloudfront.net/comics/garfield/${dateYear}/${dateFormat}.gif`) 34 | message.channel.send({ embed }) 35 | 36 | } 37 | } 38 | 39 | function random(min, max) { 40 | return Math.floor(Math.random() * (max - min) + min); 41 | } -------------------------------------------------------------------------------- /commands/fun/giphy.js: -------------------------------------------------------------------------------- 1 | const { Command } = require('../../commando'); 2 | const Discord = require('discord.js'); 3 | const snekfetch = require('snekfetch'); 4 | 5 | module.exports = class GiphyCommand extends Command { 6 | constructor(client) { 7 | super(client, { 8 | name: 'giphy', 9 | group: 'fun', 10 | aliases: ['gif'], 11 | memberName: 'giphy', 12 | description: 'Searches Giphy for gifs!', 13 | examples: ['~giphy [tags]'], 14 | args: [{ 15 | key: 'query', 16 | prompt: 'Please provide me a term to search for!', 17 | type: 'string', 18 | default: 'wtf' 19 | }] 20 | }); 21 | } 22 | 23 | async run(message, args) { 24 | var { query } = args; 25 | 26 | var res = await snekfetch 27 | .get('http://api.giphy.com/v1/gifs/search') 28 | .query({ 29 | q: query.split(' ').join('+'), 30 | api_key: process.env.GIPHYKEY, 31 | rating: message.channel.nsfw ? 'r' : 'pg', 32 | limit: 5 33 | }) 34 | 35 | var body = res.body 36 | if (!body.data.length) return message.channel.send(`No results found for **${query}**!`); 37 | const random = Math.floor(Math.random() * body.data.length); 38 | 39 | const embed = new Discord.MessageEmbed() 40 | .setImage(body.data[random].images.original.url) 41 | .setColor("#ADC4CC") 42 | 43 | message.channel.send({ embed }) 44 | } 45 | }; -------------------------------------------------------------------------------- /commands/fun/horoscope.js: -------------------------------------------------------------------------------- 1 | const { Command } = require('../../commando'); 2 | const Discord = require('discord.js'); 3 | const snekfetch = require('snekfetch'); 4 | const signs = [ 5 | "capricorn", 6 | "aquarius", 7 | "pisces", 8 | "aries", 9 | "taurus", 10 | "gemini", 11 | "cancer", 12 | "leo", 13 | "virgo", 14 | "libra", 15 | "scorpio", 16 | "sagittarius" 17 | ] 18 | 19 | module.exports = class HoroscopeCommand extends Command { 20 | constructor(client) { 21 | super(client, { 22 | name: 'horoscope', 23 | group: 'fun', 24 | memberName: 'horoscope', 25 | guildOnly: true, 26 | description: 'Gets your daily horoscope!', 27 | examples: ['~horoscope [sign]'], 28 | aliases: ["horo", "sign"], 29 | throttling: { 30 | usages: 1, 31 | duration: 8 32 | } 33 | }); 34 | } 35 | 36 | async run(message, args) { 37 | const sign = message.content.split(/\s+/g).slice(1).join(" "); 38 | if (!sign) return message.channel.send("Please give me a sign to get the horoscope of!"); 39 | 40 | if (!signs.includes(sign.toLowerCase())) return message.channel.send('That is not a valid sign!'); 41 | 42 | const text = await snekfetch 43 | .get(`http://sandipbgt.com/theastrologer/api/horoscope/${sign}/today`); 44 | const body = JSON.parse(text.body); 45 | 46 | var horoscope = body.horoscope 47 | var replaced = horoscope.replace('(c) Kelli Fox, The Astrologer, http://new.theastrologer.com', '') 48 | 49 | const embed = new Discord.MessageEmbed() 50 | .setColor('#5D7B9D') 51 | .setAuthor(`Horoscope for ${body.sunsign} on ${body.date}`, 'http://images.indianexpress.com/2017/01/zodiac-love-2017-main_820_thinkstockphotos-481896132.jpg?w=820') 52 | .setDescription(replaced) 53 | .setTimestamp() 54 | .setFooter(`${message.author.username}'s Horoscope`) 55 | .addField('Mood', body.meta.mood, true) 56 | .addField("Intensity", body.meta.intensity, true); 57 | return message.channel.send({ embed }); 58 | } 59 | } -------------------------------------------------------------------------------- /commands/fun/kaomoji.js: -------------------------------------------------------------------------------- 1 | const { Command } = require('../../commando'); 2 | const kaomojis = require('../../assets/json/kaomoji') 3 | 4 | module.exports = class KaomojiCommand extends Command { 5 | constructor(client) { 6 | super(client, { 7 | name: 'kaomoji', 8 | guildOnly: true, 9 | aliases: ['lenny', 'face', 'emoticon'], 10 | group: 'fun', 11 | memberName: 'kaomoji', 12 | description: 'Displays a random kaomoji! (´・ω・`) 3000 will definitely be enough to keep you busy! (v`▽´)v', 13 | examples: ['~kaomoji'], 14 | throttling: { 15 | usages: 1, 16 | duration: 3 17 | }, 18 | args: [{ 19 | key: 'emotion', 20 | prompt: 'Please enter a valid kaomoji emotion!', 21 | type: 'string', 22 | default: 'random', 23 | validate: emotion => { 24 | if (kaomojis.includes(emotion.toLowerCase())) return true; 25 | return 'Invalid kaomoji category! Use `~help kaomoji` for a list of valid kaomojis!'; 26 | }, 27 | parse: sign => sign.toLowerCase() 28 | }] 29 | }); 30 | } 31 | 32 | run(message, args) { 33 | 34 | var face = kaomojis[Math.round(Math.random() * (face.length - 1))]; 35 | return message.channel.send(face); 36 | } 37 | } -------------------------------------------------------------------------------- /commands/fun/lizard.js: -------------------------------------------------------------------------------- 1 | const { Command } = require('../../commando'); 2 | const Discord = require('discord.js'); 3 | const snekfetch = require('snekfetch'); 4 | 5 | module.exports = class LizardCommand extends Command { 6 | constructor(client) { 7 | super(client, { 8 | name: 'lizard', 9 | aliases: ['liz'], 10 | group: 'fun', 11 | memberName: 'lizard', 12 | guildOnly: true, 13 | description: 'Sends a random picture of a lizard!', 14 | examples: ['~lizard'], 15 | throttling: { 16 | usages: 1, 17 | duration: 5 18 | } 19 | }); 20 | } 21 | 22 | async run(message) { 23 | const res = await snekfetch.get('https://nekos.life/api/lizard'); 24 | const image = res.body.url 25 | 26 | const embed = new Discord.MessageEmbed() 27 | .setImage(image) 28 | .setDescription(`[Image URL](${image})`) 29 | .setFooter('https://nekos.life/ ©', 'https://nekos.life/static/lizard/010C.jpg') 30 | .setColor('#71A3BE'); 31 | return message.channel.send({ embed }); 32 | } 33 | } -------------------------------------------------------------------------------- /commands/fun/meme.js: -------------------------------------------------------------------------------- 1 | const { Command } = require('../../commando'); 2 | const Discord = require('discord.js'); 3 | const randomPuppy = require('random-puppy'); 4 | const subreddits = [ 5 | "memes", 6 | "DeepFriedMemes", 7 | "bonehurtingjuice", 8 | "surrealmemes", 9 | "dankmemes", 10 | "meirl", 11 | "me_irl", 12 | "funny" 13 | ] 14 | 15 | module.exports = class MemeCommand extends Command { 16 | constructor(client) { 17 | super(client, { 18 | name: 'meme', 19 | group: 'fun', 20 | memberName: 'meme', 21 | guildOnly: true, 22 | description: 'Sends a random meme from selected subreddits!', 23 | examples: ['~meme'], 24 | details: "There is no NSFW filter on this! \n\If there is an NSFW meme, please remove it by reacting with a '🎴' emoji!", 25 | throttling: { 26 | usages: 2, 27 | duration: 10 28 | } 29 | }); 30 | } 31 | 32 | run(message) { 33 | var randSubreddit = subreddits[Math.round(Math.random() * (subreddits.length - 1))]; 34 | 35 | randomPuppy(randSubreddit) 36 | .then(url => { 37 | const embed = new Discord.MessageEmbed() 38 | .setFooter(`${randSubreddit}`) 39 | .setDescription(`[Image URL](${url})`) 40 | .setImage(url) 41 | .setColor('#887064'); 42 | return message.channel.send({ embed }); 43 | }) 44 | } 45 | } -------------------------------------------------------------------------------- /commands/fun/mock.js: -------------------------------------------------------------------------------- 1 | const { Command } = require('../../commando'); 2 | 3 | const mock = [ 4 | "I love Emilia!", 5 | "Astolfo is best girl!", 6 | "Traps are not gay!", 7 | ] 8 | 9 | //remember to return before every promise 10 | module.exports = class MockCommand extends Command { 11 | constructor(client) { 12 | super(client, { 13 | name: 'mock', 14 | guildOnly: true, 15 | aliases: ['sayas', 'webhook'], 16 | group: 'fun', 17 | memberName: 'mock', 18 | clientPermissions: ['MANAGE_WEBHOOKS'], 19 | description: 'Mocks the provided user with your text!', 20 | details: 'This command works through webhooks!', 21 | examples: ['~mock [user] [text]'], 22 | throttling: { 23 | usages: 1, 24 | duration: 45 25 | }, 26 | args: [{ 27 | key: 'member', 28 | prompt: 'Please provide a user for me to mock!', 29 | type: 'member' 30 | }, 31 | { 32 | key: 'text', 33 | prompt: 'Please provide me some text for this user to say!', 34 | type: 'string', 35 | default: 'none' 36 | } 37 | ] 38 | }); 39 | } 40 | 41 | async run(message, args) { 42 | var { member, text } = args; 43 | let name; 44 | 45 | if (!member.nickname) { 46 | name = member.user.username; 47 | } else { 48 | name = member.nickname; 49 | } 50 | 51 | if (text == 'none') { 52 | text = mock[Math.round(Math.random() * (mock.length - 1))] 53 | } 54 | 55 | var hook = await message.channel.createWebhook(name, { 56 | avatar: member.user.displayAvatarURL({ format: 'png', size: 128 }), 57 | reason: `${message.author.tag} is mocking ${member.user.tag}` 58 | }) 59 | 60 | await hook.send(text) 61 | 62 | setTimeout(async function() { 63 | await hook.delete() 64 | }, 1000); 65 | 66 | } 67 | } -------------------------------------------------------------------------------- /commands/fun/pasta.js: -------------------------------------------------------------------------------- 1 | const { Command } = require('../../commando') 2 | const pasta = require('../../assets/json/pasta.json'); 3 | 4 | module.exports = class EasterEggCommand extends Command { 5 | constructor(client) { 6 | super(client, { 7 | name: 'pasta', 8 | aliases: ['tag', 'tags'], 9 | group: 'fun', 10 | memberName: 'pasta', 11 | guildOnly: true, 12 | examples: ['~pasta [tag]'], 13 | description: 'Cool custom pastas that I\'ll make at request', 14 | args: [{ 15 | key: 'tag', 16 | prompt: 'Provide me a tag to view the corresponding pasta!', 17 | type: 'string', 18 | validate: tag => { 19 | if (pasta[tag.toLowerCase()]) return true; 20 | return 'Invalid pasta! This is equivalent to an easter egg command that only the creator has full knowledge of!\nAsk around the support server or send a pasta through the `~support` command!\nRespond with `cancel` to cancel this prompt!'; 21 | }, 22 | parse: tag => tag.toLowerCase() 23 | }] 24 | }); 25 | } 26 | 27 | run(message, args) { 28 | const { tag } = args; 29 | return message.channel.send(pasta[tag]); 30 | } 31 | }; -------------------------------------------------------------------------------- /commands/fun/pickup.js: -------------------------------------------------------------------------------- 1 | const { Command } = require('../../commando'); 2 | const Discord = require('discord.js'); 3 | const line = require('../../assets/json/pickuplines.json'); 4 | 5 | 6 | module.exports = class PickUpCommand extends Command { 7 | constructor(client) { 8 | super(client, { 9 | name: 'pickup', 10 | aliases: ['pickupline'], 11 | group: 'fun', 12 | memberName: 'pickup', 13 | guildOnly: true, 14 | description: 'Get a random pick up line!', 15 | examples: ['~pickup'], 16 | throttling: { 17 | usages: 1, 18 | duration: 3 19 | } 20 | }); 21 | } 22 | 23 | run(message) { 24 | const embed = new Discord.MessageEmbed() 25 | .setDescription('💖 | ' + line[Math.round(Math.random() * (line.length - 1))]) 26 | .setColor('#C597B8'); 27 | return message.channel.send({ embed }); 28 | } 29 | } -------------------------------------------------------------------------------- /commands/fun/rate.js: -------------------------------------------------------------------------------- 1 | const { Command } = require('../../commando'); 2 | 3 | module.exports = class RateCommand extends Command { 4 | constructor(client) { 5 | super(client, { 6 | name: 'rate', 7 | aliases: ['ratewaifu'], 8 | group: 'fun', 9 | memberName: 'rate', 10 | guildOnly: true, 11 | description: 'Gives the item you specify a rating out of 10!', 12 | examples: ['~rate [item to be rated]'], 13 | }); 14 | } 15 | 16 | run(message) { 17 | let item = message.content.split(/\s+/g).slice(1).join(" "); 18 | if (!item) return message.channel.send('Please specify something for me to rate!'); 19 | 20 | if (item.toUpperCase().startsWith("KOMUGARI")) return message.channel.send('I\'d give myself a 10/10!'); 21 | 22 | const rating = Math.floor(Math.random() * 10) + 0; 23 | return message.channel.send(`I'd give **${item}** a ${rating}/10!`); 24 | } 25 | } -------------------------------------------------------------------------------- /commands/fun/regionals.js: -------------------------------------------------------------------------------- 1 | const { Command } = require('../../commando'); 2 | 3 | 4 | module.exports = class RegionalsCommand extends Command { 5 | constructor(client) { 6 | super(client, { 7 | name: 'regionals', 8 | guildOnly: true, 9 | aliases: ['letters', 'bigtext', 'big', 'textmoji', 'bigmoji'], 10 | group: 'fun', 11 | memberName: 'regionals', 12 | description: 'Converts your given text into regional indicators!', 13 | examples: ['~regionals [text]'], 14 | throttling: { 15 | usages: 1, 16 | duration: 3 17 | }, 18 | args: [{ 19 | key: 'text', 20 | prompt: 'Please provide me some text to render!', 21 | type: 'string', 22 | default: 'traps are not gay!', 23 | parse: text => text.toLowerCase() 24 | }] 25 | }); 26 | } 27 | 28 | async run(message, args) { 29 | var output = '' 30 | for (let c of args.text) { 31 | if (c in map) { 32 | c = map[c] + '\u200b' 33 | } 34 | output += c 35 | } 36 | 37 | return message.channel.send('\u200b' + output) 38 | } 39 | } 40 | 41 | const map = { 42 | a: '🇦', 43 | b: '🇧', 44 | c: '🇨', 45 | d: '🇩', 46 | e: '🇪', 47 | f: '🇫', 48 | g: '🇬', 49 | h: '🇭', 50 | i: '🇮', 51 | j: '🇯', 52 | k: '🇰', 53 | l: '🇱', 54 | m: '🇲', 55 | n: '🇳', 56 | o: '🇴', 57 | p: '🇵', 58 | q: '🇶', 59 | r: '🇷', 60 | s: '🇸', 61 | t: '🇹', 62 | u: '🇺', 63 | v: '🇻', 64 | w: '🇼', 65 | x: '🇽', 66 | y: '🇾', 67 | z: '🇿', 68 | 0: '0⃣', 69 | 1: '1⃣', 70 | 2: '2⃣', 71 | 3: '3⃣', 72 | 4: '4⃣', 73 | 5: '5⃣', 74 | 6: '6⃣', 75 | 7: '7⃣', 76 | 8: '8⃣', 77 | 9: '9⃣', 78 | '#': '#⃣', 79 | '*': '*⃣', 80 | '!': '❗', 81 | '?': '❓', 82 | } -------------------------------------------------------------------------------- /commands/fun/rightthere.js: -------------------------------------------------------------------------------- 1 | const { Command } = require('../../commando'); 2 | const rightThere = require('../../assets/json/rightthere'); 3 | 4 | module.exports = class RightThereCommand extends Command { 5 | constructor(client) { 6 | super(client, { 7 | name: 'rightthere', 8 | aliases: ['goodshit', "rthere"], 9 | group: 'fun', 10 | memberName: 'rightthere', 11 | guildOnly: true, 12 | description: 'Sends a random right there copypasta!', 13 | details: 'May include NSFW language and elements or considered as spam.', 14 | examples: ["~rightthere"], 15 | throttling: { 16 | usages: 1, 17 | duration: 10 18 | } 19 | }); 20 | } 21 | 22 | run(message) { 23 | return message.channel.send(`${rightThere[Math.round(Math.random() * (rightThere.length - 1))]}`); 24 | 25 | } 26 | } -------------------------------------------------------------------------------- /commands/fun/say.js: -------------------------------------------------------------------------------- 1 | const { Command } = require('../../commando'); 2 | 3 | module.exports = class SayCommand extends Command { 4 | constructor(client) { 5 | super(client, { 6 | name: 'say', 7 | aliases: ['copycat', 'repeat', 'echo', 'parrot'], 8 | group: 'fun', 9 | memberName: 'say', 10 | guildOnly: true, 11 | description: 'Makes me say something for you.', 12 | examples: ['~say [sentence]'], 13 | throttling: { 14 | usages: 1, 15 | duration: 5 16 | }, 17 | args: [{ 18 | key: 'sayMessage', 19 | prompt: 'Please provide me a message to say!', 20 | type: 'string', 21 | default: 'N////A' 22 | }] 23 | }); 24 | } 25 | 26 | run(message, args) { 27 | const { sayMessage } = args; 28 | if (sayMessage = 'N////A') return message.say('Please specify something for me to say!'); 29 | 30 | return message.say(sayMessage).catch(console.error); 31 | } 32 | } -------------------------------------------------------------------------------- /commands/fun/sayd.js: -------------------------------------------------------------------------------- 1 | const { Command } = require('../../commando'); 2 | 3 | module.exports = class SayCommand extends Command { 4 | constructor(client) { 5 | super(client, { 6 | name: 'sayd', 7 | aliases: ['copycatd', 'repeatd', 'echod', 'parrotd'], 8 | group: 'fun', 9 | memberName: 'sayd', 10 | guildOnly: true, 11 | description: 'Makes me say something for you, and then delete it!', 12 | examples: ['~say [sentence]'], 13 | throttling: { 14 | usages: 1, 15 | duration: 5 16 | }, 17 | args: [{ 18 | key: 'sayMessage', 19 | prompt: 'Please provide me a message to say!', 20 | type: 'string', 21 | default: 'N////A' 22 | }] 23 | }); 24 | } 25 | 26 | run(message, args) { 27 | const { sayMessage } = args; 28 | if (sayMessage == 'N////A') return message.say('Please specify something for me to say!'); 29 | 30 | message.delete(); 31 | return message.say(sayMessage).catch(console.error); 32 | } 33 | } -------------------------------------------------------------------------------- /commands/fun/skyrim.js: -------------------------------------------------------------------------------- 1 | const { Command } = require('../../commando'); 2 | const Discord = require('discord.js'); 3 | const line = require('../../assets/json/skyrim.json'); 4 | 5 | 6 | module.exports = class SkyrimCommand extends Command { 7 | constructor(client) { 8 | super(client, { 9 | name: 'skyrim', 10 | aliases: ['guard', 'skyrimguard', 'guardline'], 11 | group: 'fun', 12 | memberName: 'skyrim', 13 | guildOnly: true, 14 | description: 'Get a random guard quote from skyrim!', 15 | examples: ['~skyrim'], 16 | throttling: { 17 | usages: 1, 18 | duration: 3 19 | } 20 | }); 21 | } 22 | 23 | run(message) { 24 | return message.channel.send(line[Math.round(Math.random() * (line.length - 1))]); 25 | 26 | } 27 | } -------------------------------------------------------------------------------- /commands/fun/today.js: -------------------------------------------------------------------------------- 1 | const { Command } = require('../../commando'); 2 | const Discord = require('discord.js'); 3 | const snekfetch = require('snekfetch'); 4 | 5 | module.exports = class TodayCommand extends Command { 6 | constructor(client) { 7 | super(client, { 8 | name: 'today', 9 | guildOnly: true, 10 | aliases: ['date', 'history'], 11 | group: 'fun', 12 | memberName: 'today', 13 | description: 'Finds a historical event from today!', 14 | examples: ['~today'], 15 | throttling: { 16 | usages: 1, 17 | duration: 5 18 | } 19 | }); 20 | } 21 | 22 | async run(message) { 23 | const res = await snekfetch.get('http://history.muffinlabs.com/date') 24 | 25 | const data = JSON.parse(res.body) 26 | 27 | const source = data.data['Events'] 28 | const event = source[Math.round(Math.random() * (source.length - 1))] 29 | 30 | const embed = new Discord.MessageEmbed() 31 | .setAuthor(`Historical Event from ${data.date}, ${event.year}`) 32 | .setColor('#B1AFFC') 33 | .setDescription(event.text) 34 | .addField('❯\u2000\Information', `•\u2000\**Year:** ${event.year}\n\•\u2000\**External Link${event.links.length !== 1 ? 's' : ''}:** ${event.links.map(l => `[${l.title}](${l.link})`).join(', ')}`); 35 | return message.channel.send({ embed }); 36 | } 37 | } -------------------------------------------------------------------------------- /commands/fun/tsundere.js: -------------------------------------------------------------------------------- 1 | const { Command } = require('../../commando'); 2 | const tsun = [ 3 | "N-No, it's not like I did it for you! I did it because I had freetime, that's all! ┐( ̄ヘ ̄;)┌", 4 | "I like you, you idiot! 💢", 5 | "BAKAAAAAAAAAAAAAAA!!!!! YOU'RE A BAKAAAAAAA!!!! 💢💢", 6 | "I'm just here because I had nothing else to do!", 7 | "Are you stupid?", 8 | "💢 You're such a slob!", 9 | "You should be grateful!", 10 | "You're free anyways, right?", 11 | "Don't misunderstand, it's not like I like you or anything... (  ̄^ ̄)", 12 | "H-Hey.... (//・.・//)", 13 | "....T-Thanks.....", 14 | "B-Baka! 💢", 15 | "T-Tch! S-Shut up!", 16 | "I just had extra, so shut up and take it! 💢", 17 | "Can you be ANY MORE CLUELESS?", 18 | "HEY! It's a privilege to even be able to talk to me! You should be honored! 💢", 19 | "Geez, stop pushing yourself! You're going to get yourself hurt one day, you idiot!", 20 | "I-I am not a tsundere, you b-baka!", 21 | "💢 I'm only t-talking to you because I have nothing else to do, b-baka!", 22 | "Don't get the wrong idea! BAKA!", 23 | "I-I'm doing this p-purely for my own benefit. So d-don't misunderstand, you idiot!", 24 | "Urusai, urusai, urusai!! 💢", 25 | "I-It's not that I like you or anything, I just happened to make too much for lunch...", 26 | "Don't misunderstand...baka.", 27 | "B-baka! I am not a tsundere! 💢", 28 | "Na-nan des-ka?" 29 | ] 30 | 31 | 32 | module.exports = class TsundereCommand extends Command { 33 | constructor(client) { 34 | super(client, { 35 | name: 'tsundere', 36 | aliases: ['tsun'], 37 | group: 'fun', 38 | memberName: 'tsundere', 39 | guildOnly: true, 40 | description: 'Get a random tsundere quote!', 41 | examples: ['~tsundere'], 42 | throttling: { 43 | usages: 1, 44 | duration: 3 45 | } 46 | }); 47 | } 48 | 49 | run(message) { 50 | return message.channel.send(tsun[Math.round(Math.random() * (tsun.length - 1))]); 51 | } 52 | } -------------------------------------------------------------------------------- /commands/fun/zalgo.js: -------------------------------------------------------------------------------- 1 | const { Command } = require('../../commando'); 2 | const zalgo = require('zalgolize'); 3 | 4 | module.exports = class ZalgoCommand extends Command { 5 | constructor(client) { 6 | super(client, { 7 | name: 'zalgo', 8 | group: 'fun', 9 | memberName: 'zalgo', 10 | guildOnly: true, 11 | description: 'Converts your text into zalgo!', 12 | example: ['~zalgo [text]'], 13 | args: [{ 14 | key: 'text', 15 | prompt: 'What text would you like to convert to zalgo?', 16 | type: 'string', 17 | default: 'Just Monika', 18 | validate: text => { 19 | if (text.length < 500) return true; 20 | return 'Text must be under 500 characters.'; 21 | } 22 | }], 23 | throttling: { 24 | usages: 1, 25 | duration: 3 26 | } 27 | }); 28 | } 29 | 30 | run(message, args) { 31 | const { text } = args; 32 | return message.channel.send(`\u180E${zalgo(text, 0.2, [10, 5, 10])}`); 33 | } 34 | }; 35 | -------------------------------------------------------------------------------- /commands/info/avatar.js: -------------------------------------------------------------------------------- 1 | const { Command } = require('../../commando'); 2 | const Discord = require('discord.js'); 3 | 4 | //remember to return before every promise 5 | module.exports = class AvatarCommand extends Command { 6 | constructor(client) { 7 | super(client, { 8 | name: 'avatar', 9 | aliases: ['dp', 'ava', 'picture'], 10 | group: 'info', 11 | memberName: 'avatar', 12 | guildOnly: true, 13 | description: 'Shows the avatar of the specified user or yourself!', 14 | examples: ['~avatar '], 15 | args: [{ 16 | key: 'member', 17 | prompt: 'Which user would you like to get the avatar of?', 18 | type: 'member', 19 | default: '' 20 | }] 21 | }); 22 | } 23 | 24 | run(message, args) { 25 | const member = args.member || message.author; 26 | if (!member.user.avatar) return message.channel.send('This user does not have an avatar!'); 27 | const avatar = member.user.avatarURL({ 28 | format: member.user.avatar.startsWith('a_') ? 'gif' : 'png', 29 | size: 2048 30 | }); 31 | 32 | const embed = new Discord.MessageEmbed() 33 | .setAuthor(`${member.user.tag}`, avatar) 34 | .setColor(member.displayHexColor ? member.displayHexColor : '#D0C7FF') 35 | .setDescription(`[Avatar URL](${avatar})`) 36 | .setImage(avatar) 37 | return message.channel.send({ embed }); 38 | } 39 | } -------------------------------------------------------------------------------- /commands/info/discrim.js: -------------------------------------------------------------------------------- 1 | const { Command } = require('../../commando'); 2 | const Discord = require('discord.js'); 3 | 4 | module.exports = class DiscrimCommand extends Command { 5 | constructor(client) { 6 | super(client, { 7 | name: 'discrim', 8 | aliases: ['discriminator', 'search-discrim'], 9 | group: 'info', 10 | memberName: 'discrim', 11 | description: 'Finds all the users with the same discriminator!', 12 | args: [{ 13 | key: 'discrim', 14 | prompt: 'Please provide me a discriminator to search for!', 15 | type: 'string', 16 | default: '', 17 | validate: discrim => { 18 | if (/[0-9]+$/g.test(discrim) && discrim.length === 4) return true; 19 | return 'Invalid Discriminator.'; 20 | } 21 | }] 22 | }); 23 | } 24 | 25 | run(message, args) { 26 | const discrim = args.discrim || message.author.discriminator; 27 | const users = this.client.users.filter(user => user.discriminator === discrim).map(user => user.tag); 28 | if (users.length < 1) return message.channel.send(`**${message.author.username}**, no users found with the discriminator **${discrim}**!`); 29 | 30 | const embed = new Discord.MessageEmbed() 31 | .setTitle(`${users.length} ${users.length > 1 ? 'users' : 'user'} with the discriminator: ${discrim}`) 32 | .setColor('#4C6684') 33 | .setDescription(users); 34 | return message.channel.send({ embed }); 35 | } 36 | }; -------------------------------------------------------------------------------- /commands/memes/bonzi.js: -------------------------------------------------------------------------------- 1 | var { Command } = require('../../commando'); 2 | var Jimp = require('jimp'); 3 | 4 | //remember to return before every promise 5 | module.exports = class BonziCommand extends Command { 6 | constructor(client) { 7 | super(client, { 8 | name: 'bonzi', 9 | aliases: ['fact'], 10 | group: 'memes', 11 | guildOnly: true, 12 | clientPermissions: ['ATTACH_FILES'], 13 | memberName: 'bonzi', 14 | description: 'Makes Bonzi tell an interesting fact!', 15 | examples: ['~bonzi [message]'], 16 | throttling: { 17 | usages: 1, 18 | duration: 10 19 | }, 20 | args: [{ 21 | key: 'argument', 22 | prompt: 'Please provide Bonzi a message to say!', 23 | type: 'string', 24 | default: 'N////A' 25 | }] 26 | }); 27 | } 28 | 29 | async run(message, args) { 30 | var argu = args.argument 31 | if (argu = 'N////A') { 32 | return message.channel.send('Please provide something for Bonzi to say!'); 33 | } 34 | 35 | await message.channel.startTyping() 36 | 37 | var text = message.content.split(/\s+/g).slice(1).join(" "); 38 | var bonzi = await Jimp.read('assets/images/bonzi.png'); 39 | var blank = await Jimp.read('assets/images/blank.png'); 40 | 41 | var font = await Jimp.loadFont(Jimp.FONT_SANS_16_BLACK); 42 | 43 | blank.resize(175, 120); 44 | var fact = blank.print(font, 0, 0, text, 175); 45 | 46 | bonzi.composite(fact, 23, 12); 47 | bonzi.getBuffer(Jimp.MIME_PNG, async(err, buffer) => { 48 | await message.channel.send({ 49 | files: [{ 50 | name: 'bonzi.png', 51 | attachment: buffer 52 | }] 53 | }) 54 | await message.channel.stopTyping() 55 | }) 56 | 57 | return null; 58 | } 59 | } -------------------------------------------------------------------------------- /commands/memes/disabled.js: -------------------------------------------------------------------------------- 1 | const { Command } = require('../../commando'); 2 | const Jimp = require('jimp'); 3 | 4 | module.exports = class DisabledCommand extends Command { 5 | constructor(client) { 6 | super(client, { 7 | name: 'disabled', 8 | group: 'memes', 9 | guildOnly: true, 10 | clientPermissions: ['ATTACH_FILES'], 11 | memberName: 'disabled', 12 | description: 'The public should know what disability looks like!', 13 | examples: ['~disabled '], 14 | throttling: { 15 | usages: 1, 16 | duration: 10 17 | } 18 | }); 19 | } 20 | 21 | async run(message) { 22 | 23 | const args = message.content.split(" ").slice(1) 24 | 25 | await message.channel.startTyping() 26 | 27 | let avatarurl = (message.mentions.users.size > 0 ? message.mentions.users.first().displayAvatarURL({ format: 'png' }) : message.author.displayAvatarURL({ format: 'png' })).replace('gif', 'png'); 28 | if (['jpg', 'jpeg', 'gif', 'png', 'webp'].some(x => args.join(' ').includes(x))) { 29 | avatarurl = args.join(' ').replace(/gif|webp/g, 'png') 30 | } 31 | 32 | var avatar = await Jimp.read(avatarurl); 33 | const disabled = await Jimp.read('assets/images/disabled.png'); 34 | 35 | avatar.resize(157, 157); 36 | 37 | disabled.composite(avatar, 390, 252); 38 | disabled.getBuffer(Jimp.MIME_PNG, async(err, buffer) => { 39 | await message.channel.send({ 40 | files: [{ 41 | name: 'disabled.png', 42 | attachment: buffer 43 | }] 44 | }) 45 | await message.channel.stopTyping() 46 | }) 47 | 48 | return null; 49 | } 50 | } -------------------------------------------------------------------------------- /commands/memes/magik.js: -------------------------------------------------------------------------------- 1 | const { Command } = require('../../commando'); 2 | const Discord = require('discord.js'); 3 | const snekfetch = require('snekfetch'); 4 | 5 | module.exports = class MagikCommand extends Command { 6 | constructor(client) { 7 | super(client, { 8 | name: 'magik', 9 | guildOnly: true, 10 | aliases: ['magic', 'contentawareness', 'contentaware'], 11 | group: 'memes', 12 | memberName: 'magik', 13 | description: 'Applies the magik filter to your image!', 14 | examples: ['~magik [attachment/link]'], 15 | throttling: { 16 | usages: 1, 17 | duration: 15 18 | } 19 | }); 20 | } 21 | 22 | async run(message) { 23 | if (!message.channel.permissionsFor(this.client.user).has('ATTACH_FILES')) { 24 | return message.channel.send('I can\'t attach messages!'); 25 | } 26 | 27 | const args = message.content.split(" ").slice(1) 28 | 29 | const msg = await message.channel.send('🔄 | Adding a hint of magik...') 30 | 31 | let avatarurl = (message.mentions.users.size > 0 ? message.mentions.users.first().displayAvatarURL({ format: 'png', size: 512 }) : message.author.displayAvatarURL({ format: 'png', size: 512 })).replace('gif', 'png'); 32 | if (['jpg', 'jpeg', 'gif', 'png', 'webp'].some(x => args.join(' ').includes(x))) { 33 | avatarurl = args.join(' ').replace(/gif|webp/g, 'png') 34 | } 35 | 36 | const res = await snekfetch.get(`https://discord.services/api/magik?url=${avatarurl}`) 37 | 38 | if (res.body == 'some error sry :/') { 39 | await msg.delete() 40 | return message.channel.send('❎ | Invalid image/URL! Please try again!') 41 | } else { 42 | await msg.delete() 43 | const embed = new Discord.MessageEmbed() 44 | .setColor('#294475') 45 | .setImage(`https://discord.services/api/magik?url=${avatarurl}`); 46 | return message.channel.send({ embed }) 47 | } 48 | } 49 | } -------------------------------------------------------------------------------- /commands/memes/retarded.js: -------------------------------------------------------------------------------- 1 | const { Command } = require('../../commando'); 2 | const Jimp = require('jimp'); 3 | 4 | module.exports = class RetardedCommand extends Command { 5 | constructor(client) { 6 | super(client, { 7 | name: 'retarded', 8 | group: 'memes', 9 | memberName: 'retarded', 10 | guildOnly: true, 11 | description: 'A cute(???) little dog???', 12 | examples: ['~retarded [message]'], 13 | throttling: { 14 | usages: 1, 15 | duration: 10 16 | } 17 | }); 18 | } 19 | 20 | async run(message) { 21 | if (!message.channel.permissionsFor(this.client.user).has('ATTACH_FILES')) { 22 | return message.channel.send('I can\'t attach messages!') 23 | } 24 | 25 | const argu = message.content.split(/\s+/g).slice(1).join(" "); 26 | 27 | if (!argu) { 28 | return message.channel.send('Please provide some text!'); 29 | } 30 | 31 | const text = message.content.split(/\s+/g).slice(1).join(" "); 32 | const retarded = await Jimp.read('assets/images/retarded.png'); 33 | const blank = await Jimp.read('assets/images/blank.png'); 34 | 35 | const font = await Jimp.loadFont(Jimp.FONT_SANS_16_BLACK); 36 | 37 | blank.resize(225, 45); 38 | const search = blank.print(font, 0, 0, text, 225); 39 | 40 | retarded.composite(search, 295, 5); 41 | retarded.getBuffer(Jimp.MIME_PNG, async(err, buffer) => { 42 | return await message.channel.send({ 43 | files: [{ 44 | name: 'retarded.png', 45 | attachment: buffer 46 | }] 47 | }) 48 | }) 49 | } 50 | } -------------------------------------------------------------------------------- /commands/memes/shit.js: -------------------------------------------------------------------------------- 1 | const { Command } = require('../../commando'); 2 | const Jimp = require('jimp'); 3 | 4 | //remember to return before every promise 5 | module.exports = class ShitCommand extends Command { 6 | constructor(client) { 7 | super(client, { 8 | name: 'shit', 9 | group: 'memes', 10 | memberName: 'shit', 11 | guildOnly: true, 12 | description: 'It\'s shit!!!', 13 | examples: ['~shit [message]'], 14 | throttling: { 15 | usages: 1, 16 | duration: 10 17 | } 18 | }); 19 | } 20 | 21 | async run(message) { 22 | if (!message.channel.permissionsFor(this.client.user).has('ATTACH_FILES')) { 23 | return message.channel.send('I can\'t attach messages!'); 24 | } 25 | 26 | var args = message.content.split(/\s+/g).slice(1) 27 | 28 | if (message.mentions.users.size > 0) { 29 | args = message.mentions.users.first().username; 30 | } else { 31 | if (args < 1) { 32 | args = message.author.username; 33 | } else if (args.join(' ').length > 35) { 34 | return message.channel.send(`The limit is 35 characters! You're ${args.join(' ').length - 35} characters over the limit!`); 35 | } else { 36 | args = args.join(' '); 37 | } 38 | } 39 | 40 | await message.channel.startTyping() 41 | 42 | const text = args; 43 | const shit = await Jimp.read('assets/images/shit.jpg'); 44 | const blank = await Jimp.read('assets/images/Empty.png'); 45 | 46 | const font = await Jimp.loadFont(Jimp.FONT_SANS_32_BLACK); 47 | 48 | blank.resize(350, 350); 49 | const search = blank.print(font, 0, 0, text, 350); 50 | search.rotate(310); 51 | 52 | shit.composite(search, 195, 585); 53 | shit.getBuffer(Jimp.MIME_PNG, async(err, buffer) => { 54 | return await message.channel.send({ 55 | files: [{ 56 | name: 'shit.png', 57 | attachment: buffer 58 | }] 59 | }) 60 | 61 | await message.channel.stopTyping() 62 | }) 63 | 64 | return null; 65 | } 66 | } -------------------------------------------------------------------------------- /commands/memes/shits.js: -------------------------------------------------------------------------------- 1 | const { Command } = require('../../commando'); 2 | const Jimp = require('jimp'); 3 | 4 | //remember to return before every promise 5 | module.exports = class ShitsCommand extends Command { 6 | constructor(client) { 7 | super(client, { 8 | name: 'shits', 9 | group: 'memes', 10 | memberName: 'shits', 11 | guildOnly: true, 12 | description: 'It\'s shit!!!', 13 | examples: ['~shits [message]'], 14 | throttling: { 15 | usages: 1, 16 | duration: 10 17 | } 18 | }); 19 | } 20 | 21 | async run(message) { 22 | if (!message.channel.permissionsFor(this.client.user).has('ATTACH_FILES')) { 23 | return message.channel.send('I can\'t attach messages!'); 24 | } 25 | 26 | const args = message.content.split(/\s+/g).slice(1).join(" "); 27 | 28 | if (args.length < 1) { 29 | return message.channel.send('Please provide some text!'); 30 | } 31 | 32 | await message.channel.startTyping() 33 | 34 | const text = message.content.split(/\s+/g).slice(1).join(" "); 35 | const shits = await Jimp.read('assets/images/SHITS.png'); 36 | const blank = await Jimp.read('assets/images/blank.png'); 37 | 38 | const font = await Jimp.loadFont(Jimp.FONT_SANS_32_BLACK); 39 | 40 | blank.resize(195, 175); 41 | const search = blank.print(font, 0, 0, text, 175); 42 | 43 | shits.composite(search, 810, 31); 44 | shits.getBuffer(Jimp.MIME_PNG, async(err, buffer) => { 45 | await message.channel.send({ 46 | files: [{ 47 | name: 'shits.png', 48 | attachment: buffer 49 | }] 50 | }) 51 | 52 | await message.channel.stopTyping() 53 | }) 54 | 55 | return null; 56 | } 57 | } -------------------------------------------------------------------------------- /commands/memes/thesearch.js: -------------------------------------------------------------------------------- 1 | const { Command } = require('../../commando'); 2 | const Jimp = require('jimp'); 3 | 4 | //remember to return before every promise 5 | module.exports = class TheSearchCommand extends Command { 6 | constructor(client) { 7 | super(client, { 8 | name: 'thesearch', 9 | group: 'memes', 10 | memberName: 'thesearch', 11 | guildOnly: true, 12 | description: 'What if there\'s intelligible life on Earth?', 13 | examples: ['~thesearch [message]'], 14 | throttling: { 15 | usages: 1, 16 | duration: 10 17 | } 18 | }); 19 | } 20 | 21 | async run(message) { 22 | if (!message.channel.permissionsFor(this.client.user).has('ATTACH_FILES')) { 23 | return message.channel.send('I can\'t attach messages!'); 24 | } 25 | 26 | const args = message.content.split(/\s+/g).slice(1).join(" "); 27 | 28 | if (args.length < 1) { 29 | return message.channel.send('Please provide some text!'); 30 | } 31 | 32 | await message.channel.startTyping() 33 | 34 | const text = message.content.split(/\s+/g).slice(1).join(" "); 35 | const thesearch = await Jimp.read('assets/images/thesearch.png'); 36 | const blank = await Jimp.read('assets/images/blank.png'); 37 | 38 | const font = await Jimp.loadFont(Jimp.FONT_SANS_16_BLACK); 39 | 40 | blank.resize(160, 70); 41 | const search = blank.print(font, 0, 0, text, 150); 42 | 43 | thesearch.composite(search, 60, 331); 44 | thesearch.getBuffer(Jimp.MIME_PNG, async(err, buffer) => { 45 | await message.channel.send({ 46 | files: [{ 47 | name: 'thesearch.png', 48 | attachment: buffer 49 | }] 50 | }) 51 | await message.channel.stopTyping() 52 | }) 53 | 54 | return null; 55 | } 56 | } -------------------------------------------------------------------------------- /commands/moderation/addrole.js: -------------------------------------------------------------------------------- 1 | const { Command } = require('../../commando'); 2 | 3 | module.exports = class AddRoleCommand extends Command { 4 | constructor(client) { 5 | super(client, { 6 | name: 'addrole', 7 | group: 'moderation', 8 | aliases: ['newrole', 'ar', 'addr', 'assign'], 9 | memberName: 'addrole', 10 | description: 'Adds a role to a member!', 11 | examples: ['~addrole [name] [role]'], 12 | guildOnly: true, 13 | args: [{ 14 | key: 'member', 15 | prompt: 'Please provide me a member to add the role to!', 16 | type: 'member' 17 | }, 18 | { 19 | key: 'role', 20 | prompt: 'Please provide me a role to add!', 21 | type: 'role' 22 | } 23 | ] 24 | }); 25 | } 26 | 27 | hasPermission(message) { 28 | return message.member.hasPermission('MANAGE_ROLES'); 29 | } 30 | 31 | async run(message, args) { 32 | const { member, role } = args; 33 | if (member.roles.has(role.id)) return message.channel.send(`❎ | **${member.displayName}** already has the role **${role.name}**!`) 34 | 35 | try { 36 | await member.addRole(role) 37 | return message.channel.send(`✅ | **${member.displayName}** has been given the role **${role.name}**!`) 38 | } catch (err) { 39 | return message.channel.send(`❎ | **${memeber.displayName}** already has the role **${role.name}**!`) 40 | } 41 | }; 42 | }; -------------------------------------------------------------------------------- /commands/moderation/delrole.js: -------------------------------------------------------------------------------- 1 | const { Command } = require('../../commando'); 2 | 3 | module.exports = class DelRoleCommand extends Command { 4 | constructor(client) { 5 | super(client, { 6 | name: 'delrole', 7 | group: 'moderation', 8 | aliases: ['rmrole', 'deleterole', 'remrole', 'drole', 'dr'], 9 | memberName: 'delrole', 10 | clientPermissions: ['MANAGE_ROLES'], 11 | userPermissions: ['MANAGE_ROLES'], 12 | description: 'Removed a role from a member!', 13 | examples: ['~delrole [name] [role]'], 14 | guildOnly: true, 15 | args: [{ 16 | key: 'member', 17 | prompt: 'Please provide me a member to remove the role from!', 18 | type: 'member' 19 | }, 20 | { 21 | key: 'role', 22 | prompt: 'Please provide me a role to remove!', 23 | type: 'role' 24 | } 25 | ] 26 | }); 27 | } 28 | 29 | async run(message, args) { 30 | const { member, role } = args; 31 | if (!member.roles.has(role.id)) return message.channel.send(`❎ | **${member.displayName}** does not have have the role **${role.name}**!`) 32 | 33 | 34 | try { 35 | await member.removeRole(role) 36 | return message.channel.send(`✅ | **${member.displayName}** no longer has the role **${role.name}**!`); 37 | } catch (err) { 38 | return message.channel.send(`❎ | **${member.displayName}** does not have the ${role.name} role!`) 39 | } 40 | }; 41 | }; -------------------------------------------------------------------------------- /commands/moderation/lockdown.js: -------------------------------------------------------------------------------- 1 | const { Command } = require('../../commando'); 2 | 3 | 4 | module.exports = class LockdownCommand extends Command { 5 | constructor(client) { 6 | super(client, { 7 | name: 'lockdown', 8 | aliases: ['lock', 'ld'], 9 | group: 'moderation', 10 | memberName: 'lockdown', 11 | description: 'Prevents users from posting in the current channel!', 12 | details: 'Use `lockdown start` and `lockdown stop` to start and stop a lockdown respectively!', 13 | guildOnly: true, 14 | clientPermissions: ['ADMINISTRATOR'], 15 | userPermissions: ['ADMINISTRATOR'], 16 | examples: ['~lockdown [start/stop]'], 17 | args: [{ 18 | key: 'type', 19 | prompt: 'Please enter either start or stop.', 20 | type: 'string', 21 | default: 'start', 22 | validate: type => { 23 | if (['start', 'stop'].includes(type.toLowerCase())) return true; 24 | return 'Please enter either start or stop.'; 25 | }, 26 | parse: type => type.toLowerCase() 27 | }] 28 | }); 29 | } 30 | 31 | async run(message, args) { // eslint-disable-line consistent-return 32 | const { type } = args; 33 | if (type === 'start') { 34 | await message.channel.overwritePermissions(message.guild.defaultRole, { SEND_MESSAGES: false }, `Lockdown initiated by ${message.author.tag}`); 35 | return message.channel.send(`Lockdown has initiated! Most users are now unable to send a message in this channel!\n\Please use \`lockdown stop\` to end the lockdown!`); 36 | 37 | } else if (type === 'stop') { 38 | await message.channel.overwritePermissions(message.guild.defaultRole, { SEND_MESSAGES: null }, `Lockdown terminated by ${message.author.tag}`); 39 | return message.channel.send('Lockdown ended!'); 40 | } 41 | } 42 | }; -------------------------------------------------------------------------------- /commands/moderation/massadd.js: -------------------------------------------------------------------------------- 1 | const { Command } = require('../../commando'); 2 | 3 | 4 | module.exports = class MassAddCommand extends Command { 5 | constructor(client) { 6 | super(client, { 7 | name: 'massadd', 8 | guildOnly: true, 9 | aliases: ['ma', 'addroleall', 'roleall'], 10 | group: 'moderation', 11 | clientPermissions: ['MANAGE_ROLES'], 12 | userPermissions: ['MANAGE_ROLES'], 13 | memberName: 'massadd', 14 | description: 'Adds the role to everyone on the server!', 15 | details: 'Why..would you want to do that!!! Also this command will take a long time...', 16 | examples: ['~massadd [role]'], 17 | throttling: { 18 | usages: 1, 19 | duration: 60 20 | }, 21 | args: [{ 22 | key: 'role', 23 | prompt: 'Please provide me a role to add!', 24 | type: 'role' 25 | }] 26 | }); 27 | } 28 | 29 | async run(message, args) { 30 | const { role } = args; 31 | const members = await message.guild.members.fetch() 32 | const msg = await message.channel.send(`🔄 | Adding the **${role.name}** role to **${members.size}** members...this might take a while...`) 33 | await members.forEach(m => m.addRole(role)) 34 | 35 | msg.delete() 36 | } 37 | } -------------------------------------------------------------------------------- /commands/moderation/massrem.js: -------------------------------------------------------------------------------- 1 | const { Command } = require('../../commando'); 2 | 3 | 4 | module.exports = class MassRemCommand extends Command { 5 | constructor(client) { 6 | super(client, { 7 | name: 'massrem', 8 | guildOnly: true, 9 | aliases: ['mr', 'remroleall', 'remroleall'], 10 | group: 'moderation', 11 | memberName: 'massrem', 12 | clientPermissions: ['MANAGE_ROLES'], 13 | userPermissions: ['MANAGE_ROLES'], 14 | description: 'Removes the role from everyone on the server!', 15 | details: 'Why..would you want to do that!!! Also this command will take a long time...', 16 | examples: ['~massrem [role]'], 17 | throttling: { 18 | usages: 1, 19 | duration: 60 20 | }, 21 | args: [{ 22 | key: 'role', 23 | prompt: 'Please provide me a role to remove!', 24 | type: 'role' 25 | }] 26 | }); 27 | } 28 | 29 | async run(message, args) { 30 | const { role } = args; 31 | const members = await message.guild.members.fetch() 32 | await message.channel.send(`🔄 | Removing the **${role.name}** role from **${members.size}** members...this might take a while...`) 33 | await members.forEach(m => m.removeRole(role)) 34 | 35 | } 36 | } -------------------------------------------------------------------------------- /commands/moderation/nickname.js: -------------------------------------------------------------------------------- 1 | const { Command } = require('../../commando'); 2 | 3 | module.exports = class NickCommand extends Command { 4 | constructor(client) { 5 | super(client, { 6 | name: 'nickname', 7 | group: 'moderation', 8 | aliases: ['nick'], 9 | memberName: 'nickname', 10 | clientPermissions: ['MANAGE_NICKNAMES'], 11 | userPermissions: ['MANAGE_NICKNAMES'], 12 | description: 'Assigns a nickname to a member! Use "clear"or leave it blank to remove the nickname!', 13 | examples: ['~nickname [user] [name/clear]'], 14 | guildOnly: true, 15 | args: [{ 16 | key: 'member', 17 | prompt: 'Please provide me a member to assign nicknames for!', 18 | type: 'member' 19 | }, 20 | { 21 | key: 'nickname', 22 | prompt: 'Please provide me a nickname to assign!', 23 | default: 'clear', 24 | type: 'string' 25 | } 26 | ] 27 | }); 28 | } 29 | 30 | async run(message, args) { 31 | const { member, nickname } = args; 32 | if (member.highestRole.calculatedPosition > message.member.highestRole.calculatedPosition - 1) { 33 | return message.channel.send(`❎ | You can't change **${member.user.username}**'s nickname! Their position is higher than you!`); 34 | } 35 | if (!member.bannable) return message.channel.send(`❎ | I can't change **${member.user.username}**'s nickname! Their role is higher than mine!`); 36 | 37 | return await nickname !== 'clear' ? member.setNickname(nickname).then(() => message.say(`The nickname **${nickname}** has been assigned to **${member.user.username}**!`)) : member.setNickname('').then(() => message.say(`**${member.displayName}**'s nickname has been cleared!`)); 38 | }; 39 | }; -------------------------------------------------------------------------------- /commands/moderation/pruneuser.js: -------------------------------------------------------------------------------- 1 | const { Command } = require('../../commando'); 2 | 3 | module.exports = class PruneUserCommand extends Command { 4 | constructor(client) { 5 | super(client, { 6 | name: 'pruneuser', 7 | guildOnly: true, 8 | aliases: ['pruneu', 'pu'], 9 | group: 'moderation', 10 | clientPermissions: ['MANAGE_MESSAGES'], 11 | userPermissions: ['MANAGE_MESSAGES'], 12 | memberName: 'pruneuser', 13 | description: 'Prunes a specified number of messaged from a specific user!', 14 | examples: ['~prune [user] [count]'], 15 | throttling: { 16 | usages: 1, 17 | duration: 10 18 | }, 19 | args: [{ 20 | key: 'user', 21 | label: 'which user to prune', 22 | prompt: 'Please provide me a user to prune!', 23 | type: 'user' 24 | }, 25 | { 26 | key: 'count', 27 | label: 'messages to be pruned', 28 | prompt: 'Please provide me a set number of messages to prune!', 29 | type: 'integer', 30 | },] 31 | }); 32 | } 33 | 34 | async run(message, args) { 35 | const { user, count } = args; 36 | 37 | try { 38 | const messages = await message.channel.messages.fetch({ 39 | limit: count, 40 | before: message.id 41 | }) 42 | const flushable = messages.filter(m => m.author.id == user.id) 43 | if (flushable.size == 0) return message.channel.send(`🍇 | **${message.author.username}**, **${user.username}** did not send any messages in the last ${count} messages!`); 44 | 45 | await message.channel.bulkDelete(flushable) 46 | const m = await message.channel.send(`🍇 | **${message.author.username}**, successfully pruned ${flushable.size} ${flushable.size == 1 ? `message from **${user.username}**!` : `messages from **${user.username}**!`}`); 47 | 48 | return null; 49 | 50 | } catch (err) { 51 | console.log(err) 52 | return message.channel.send('❎ | These messages are too old to be deleted! I can only delete messages within two weeks!'); 53 | } 54 | } 55 | } -------------------------------------------------------------------------------- /commands/nsfw/4knsfw.js: -------------------------------------------------------------------------------- 1 | const { Command } = require('../../commando'); 2 | const Discord = require('discord.js'); 3 | const randomPuppy = require('random-puppy'); 4 | const errors = require('../../assets/json/errors'); 5 | 6 | 7 | module.exports = class FourKNSFWCommand extends Command { 8 | constructor(client) { 9 | super(client, { 10 | name: '4knsfw', 11 | aliases: ['hdnsfw', 'hqnsfw'], 12 | group: 'nsfw', 13 | memberName: '4knsfw', 14 | guildOnly: true, 15 | description: 'Finds high quality NSFW content for you!', 16 | details: 'This command can only be used in NSFW channels!', 17 | examples: ['~4knsfw'], 18 | throttling: { 19 | usages: 1, 20 | duration: 3 21 | } 22 | }); 23 | } 24 | 25 | run(message) { 26 | var errMessage = errors[Math.round(Math.random() * (errors.length - 1))]; 27 | if (!message.channel.nsfw) { 28 | message.react('💢'); 29 | return message.channel.send(errMessage); 30 | } 31 | 32 | var subreddits = [ 33 | 'NSFW_Wallpapers', 34 | 'SexyWallpapers', 35 | 'HighResNSFW', 36 | 'nsfw_hd', 37 | 'UHDnsfw' 38 | ] 39 | 40 | var sub = subreddits[Math.round(Math.random() * (subreddits.length - 1))]; 41 | 42 | randomPuppy(sub) 43 | .then(url => { 44 | const embed = new Discord.MessageEmbed() 45 | .setFooter(`4kNSFW`) 46 | .setDescription(`[Image URL](${url})`) 47 | .setImage(url) 48 | .setColor('#A187E0'); 49 | return message.channel.send({ embed }); 50 | }) 51 | } 52 | } -------------------------------------------------------------------------------- /commands/nsfw/ahegao.js: -------------------------------------------------------------------------------- 1 | const { Command } = require('../../commando'); 2 | const Discord = require('discord.js'); 3 | const randomPuppy = require('random-puppy'); 4 | const errors = require('../../assets/json/errors'); 5 | 6 | 7 | module.exports = class AhegaoCommand extends Command { 8 | constructor(client) { 9 | super(client, { 10 | name: 'ahegao', 11 | group: 'nsfw', 12 | memberName: 'ahegao', 13 | guildOnly: true, 14 | description: 'Finds ahegao for you!', 15 | details: 'This command can only be used in NSFW channels!', 16 | examples: ['~ahegao'], 17 | throttling: { 18 | usages: 1, 19 | duration: 3 20 | } 21 | }); 22 | } 23 | 24 | run(message) { 25 | var errMessage = errors[Math.round(Math.random() * (errors.length - 1))]; 26 | if (!message.channel.nsfw) { 27 | message.react('💢'); 28 | return message.channel.send(errMessage); 29 | } 30 | 31 | randomPuppy('ahegao') 32 | .then(url => { 33 | const embed = new Discord.MessageEmbed() 34 | .setFooter(`ahegao`) 35 | .setDescription(`[Image URL](${url})`) 36 | .setImage(url) 37 | .setColor('#A187E0'); 38 | return message.channel.send({ embed }); 39 | }) 40 | } 41 | } -------------------------------------------------------------------------------- /commands/nsfw/amateur.js: -------------------------------------------------------------------------------- 1 | const { Command } = require('../../commando'); 2 | const Discord = require('discord.js'); 3 | const randomPuppy = require('random-puppy'); 4 | const errors = require('../../assets/json/errors'); 5 | 6 | 7 | module.exports = class AmateurCommand extends Command { 8 | constructor(client) { 9 | super(client, { 10 | name: 'amateur', 11 | group: 'nsfw', 12 | memberName: 'amateur', 13 | guildOnly: true, 14 | description: 'Finds?? Amateur...nsfw?? For you...??', 15 | details: 'This command can only be used in NSFW channels!', 16 | examples: ['~amateur'], 17 | throttling: { 18 | usages: 1, 19 | duration: 3 20 | } 21 | }); 22 | } 23 | 24 | run(message) { 25 | var errMessage = errors[Math.round(Math.random() * (errors.length - 1))]; 26 | if (!message.channel.nsfw) { 27 | message.react('💢'); 28 | return message.channel.send(errMessage); 29 | } 30 | 31 | var subreddits = [ 32 | 'RealGirls', 33 | 'amateur', 34 | 'gonewild' 35 | ] 36 | 37 | var sub = subreddits[Math.round(Math.random() * (subreddits.length - 1))]; 38 | 39 | randomPuppy(sub) 40 | .then(url => { 41 | const embed = new Discord.MessageEmbed() 42 | .setFooter(`amateur`) 43 | .setDescription(`[Image URL](${url})`) 44 | .setImage(url) 45 | .setColor('#A187E0'); 46 | return message.channel.send({ embed }); 47 | }) 48 | } 49 | } -------------------------------------------------------------------------------- /commands/nsfw/artsyporn.js: -------------------------------------------------------------------------------- 1 | const { Command } = require('../../commando'); 2 | const Discord = require('discord.js'); 3 | const randomPuppy = require('random-puppy'); 4 | const errors = require('../../assets/json/errors'); 5 | 6 | 7 | module.exports = class ArtsyPornCommand extends Command { 8 | constructor(client) { 9 | super(client, { 10 | name: 'artsyporn', 11 | aliases: ['artsy'], 12 | group: 'nsfw', 13 | memberName: 'artsyporn', 14 | guildOnly: true, 15 | description: 'Finds artsy..? Porn?? For you!', 16 | details: 'This command can only be used in NSFW channels!', 17 | examples: ['~artsyporn'], 18 | throttling: { 19 | usages: 1, 20 | duration: 3 21 | } 22 | }); 23 | } 24 | 25 | run(message) { 26 | var errMessage = errors[Math.round(Math.random() * (errors.length - 1))]; 27 | if (!message.channel.nsfw) { 28 | message.react('💢'); 29 | return message.channel.send(errMessage); 30 | } 31 | 32 | randomPuppy('SexyButNotPorn') 33 | .then(url => { 34 | const embed = new Discord.MessageEmbed() 35 | .setFooter(`ArtsyPorn`) 36 | .setDescription(`[Image URL](${url})`) 37 | .setImage(url) 38 | .setColor('#A187E0'); 39 | return message.channel.send({ embed }); 40 | }) 41 | } 42 | } -------------------------------------------------------------------------------- /commands/nsfw/asian.js: -------------------------------------------------------------------------------- 1 | const { Command } = require('../../commando'); 2 | const Discord = require('discord.js'); 3 | const randomPuppy = require('random-puppy'); 4 | const errors = require('../../assets/json/errors'); 5 | 6 | 7 | module.exports = class AsianCommand extends Command { 8 | constructor(client) { 9 | super(client, { 10 | name: 'asian', 11 | group: 'nsfw', 12 | memberName: 'asian', 13 | guildOnly: true, 14 | description: 'Finds...asians?????...for??? you?!?!?!!', 15 | details: 'This command can only be used in NSFW channels!', 16 | examples: ['~asian'], 17 | throttling: { 18 | usages: 1, 19 | duration: 3 20 | } 21 | }); 22 | } 23 | 24 | run(message) { 25 | var errMessage = errors[Math.round(Math.random() * (errors.length - 1))]; 26 | if (!message.channel.nsfw) { 27 | message.react('💢'); 28 | return message.channel.send(errMessage); 29 | } 30 | 31 | var subreddits = [ 32 | 'AsianHotties', 33 | 'juicyasians', 34 | 'asianbabes' 35 | ] 36 | 37 | var sub = subreddits[Math.round(Math.random() * (subreddits.length - 1))]; 38 | 39 | randomPuppy(sub) 40 | .then(url => { 41 | const embed = new Discord.MessageEmbed() 42 | .setFooter(`asian`) 43 | .setDescription(`[Image URL](${url})`) 44 | .setImage(url) 45 | .setColor('#A187E0'); 46 | return message.channel.send({ embed }); 47 | }) 48 | } 49 | } -------------------------------------------------------------------------------- /commands/nsfw/ass.js: -------------------------------------------------------------------------------- 1 | const { Command } = require('../../commando'); 2 | const Discord = require('discord.js'); 3 | const snekfetch = require('snekfetch'); 4 | const errors = require('../../assets/json/errors'); 5 | 6 | 7 | module.exports = class AssCommand extends Command { 8 | constructor(client) { 9 | super(client, { 10 | name: 'ass', 11 | aliases: ['butt', 'booty', 'butts'], 12 | group: 'nsfw', 13 | memberName: 'ass', 14 | guildOnly: true, 15 | description: 'A random picture of...ASS!!', 16 | examples: ['~ass'], 17 | details: 'This command can only be used in NSFW channels!', 18 | throttling: { 19 | usages: 1, 20 | duration: 3 21 | } 22 | }); 23 | } 24 | 25 | async run(message) { 26 | var errMessage = errors[Math.round(Math.random() * (errors.length - 1))] 27 | if (!message.channel.nsfw) { 28 | message.react('💢'); 29 | return message.channel.send(errMessage); 30 | 31 | } else { 32 | 33 | const id = [Math.floor(Math.random() * 4923)]; 34 | const res = await snekfetch.get(`http://api.obutts.ru/butts/${id}`); 35 | const preview = res.body[0]["PREVIEW".toLowerCase()]; 36 | const image = `http://media.obutts.ru/${preview}`; 37 | 38 | const embed = new Discord.MessageEmbed() 39 | .setFooter('http://obutts.ru/') 40 | .setImage(image) 41 | .setColor('#CEA0A6'); 42 | return message.channel.send({ embed }); 43 | } 44 | } 45 | } -------------------------------------------------------------------------------- /commands/nsfw/bara.js: -------------------------------------------------------------------------------- 1 | const { Command } = require('../../commando'); 2 | const Discord = require('discord.js'); 3 | const randomPuppy = require('random-puppy'); 4 | const errors = require('../../assets/json/errors'); 5 | 6 | 7 | module.exports = class BaraCommand extends Command { 8 | constructor(client) { 9 | super(client, { 10 | name: 'bara', 11 | group: 'nsfw', 12 | memberName: 'bara', 13 | guildOnly: true, 14 | description: 'Finds bara...? For you!', 15 | details: 'This command can only be used in NSFW channels!', 16 | examples: ['~bara'], 17 | throttling: { 18 | usages: 1, 19 | duration: 3 20 | } 21 | }); 22 | } 23 | 24 | run(message) { 25 | var errMessage = errors[Math.round(Math.random() * (errors.length - 1))]; 26 | if (!message.channel.nsfw) { 27 | message.react('💢'); 28 | return message.channel.send(errMessage); 29 | } 30 | 31 | randomPuppy('baramanga') 32 | .then(url => { 33 | const embed = new Discord.MessageEmbed() 34 | .setFooter(`bara`) 35 | .setDescription(`[Image URL](${url})`) 36 | .setImage(url) 37 | .setColor('#A187E0'); 38 | return message.channel.send({ embed }); 39 | }) 40 | } 41 | } -------------------------------------------------------------------------------- /commands/nsfw/bdsm.js: -------------------------------------------------------------------------------- 1 | const { Command } = require('../../commando'); 2 | const Discord = require('discord.js'); 3 | const randomPuppy = require('random-puppy'); 4 | const errors = require('../../assets/json/errors'); 5 | 6 | 7 | module.exports = class BDSMCommand extends Command { 8 | constructor(client) { 9 | super(client, { 10 | name: 'bdsm', 11 | group: 'nsfw', 12 | memberName: 'bdsm', 13 | guildOnly: true, 14 | description: 'Finds....BDSM????? For you...!', 15 | details: 'This command can only be used in NSFW channels!', 16 | examples: ['~bdsm'], 17 | throttling: { 18 | usages: 1, 19 | duration: 3 20 | } 21 | }); 22 | } 23 | 24 | run(message) { 25 | var errMessage = errors[Math.round(Math.random() * (errors.length - 1))]; 26 | if (!message.channel.nsfw) { 27 | message.react('💢'); 28 | return message.channel.send(errMessage); 29 | } 30 | 31 | var subreddits = [ 32 | 'bdsm', 33 | 'bondage' 34 | ] 35 | 36 | var sub = subreddits[Math.round(Math.random() * (subreddits.length - 1))]; 37 | 38 | randomPuppy(sub) 39 | .then(url => { 40 | const embed = new Discord.MessageEmbed() 41 | .setFooter(`BDSM`) 42 | .setDescription(`[Image URL](${url})`) 43 | .setImage(url) 44 | .setColor('#A187E0'); 45 | return message.channel.send({ embed }); 46 | }) 47 | } 48 | } -------------------------------------------------------------------------------- /commands/nsfw/bondage.js: -------------------------------------------------------------------------------- 1 | const { Command } = require('../../commando'); 2 | const Discord = require('discord.js'); 3 | const randomPuppy = require('random-puppy'); 4 | const errors = require('../../assets/json/errors'); 5 | 6 | 7 | module.exports = class HentaiBondageCommand extends Command { 8 | constructor(client) { 9 | super(client, { 10 | name: 'bondage', 11 | aliases: ['hbondage', 'hentaibondage'], 12 | group: 'nsfw', 13 | memberName: 'bondage', 14 | guildOnly: true, 15 | description: 'Finds...hentai..bondage??..For...you!', 16 | details: 'This command can only be used in NSFW channels!', 17 | examples: ['~bondage'], 18 | throttling: { 19 | usages: 1, 20 | duration: 3 21 | } 22 | }); 23 | } 24 | 25 | run(message) { 26 | var errMessage = errors[Math.round(Math.random() * (errors.length - 1))]; 27 | if (!message.channel.nsfw) { 28 | message.react('💢'); 29 | return message.channel.send(errMessage); 30 | } 31 | 32 | randomPuppy('hentaibondage') 33 | .then(url => { 34 | const embed = new Discord.MessageEmbed() 35 | .setFooter(`hentaibondage`) 36 | .setDescription(`[Image URL](${url})`) 37 | .setImage(url) 38 | .setColor('#A187E0'); 39 | return message.channel.send({ embed }); 40 | }) 41 | } 42 | } -------------------------------------------------------------------------------- /commands/nsfw/boobs.js: -------------------------------------------------------------------------------- 1 | const { Command } = require('../../commando'); 2 | const Discord = require('discord.js'); 3 | const snekfetch = require('snekfetch'); 4 | const errors = require('../../assets/json/errors'); 5 | 6 | 7 | module.exports = class BoobsCommand extends Command { 8 | constructor(client) { 9 | super(client, { 10 | name: 'boobs', 11 | aliases: ['boobies', 'bobs'], 12 | group: 'nsfw', 13 | memberName: 'boobs', 14 | guildOnly: true, 15 | description: 'Show a picture of boobs!', 16 | details: 'This command can only be used in NSFW channels!', 17 | examples: ['~boobs'], 18 | throttling: { 19 | usages: 1, 20 | duration: 3 21 | } 22 | }); 23 | } 24 | 25 | async run(message) { 26 | var errMessage = errors[Math.round(Math.random() * (errors.length - 1))]; 27 | if (!message.channel.nsfw) { 28 | message.react('💢'); 29 | return message.channel.send(errMessage); 30 | 31 | } else { 32 | 33 | const id = [Math.floor(Math.random() * 10930)]; 34 | const res = await snekfetch.get(`http://api.oboobs.ru/boobs/${id}`); 35 | const preview = res.body[0]["PREVIEW".toLowerCase()]; 36 | const image = `http://media.oboobs.ru/${preview}`; 37 | 38 | const embed = new Discord.MessageEmbed() 39 | .setFooter('http://oboobs.ru/') 40 | .setImage(image) 41 | .setColor('#CEA0A6'); 42 | return message.channel.send({ embed }); 43 | } 44 | } 45 | } -------------------------------------------------------------------------------- /commands/nsfw/cosplay.js: -------------------------------------------------------------------------------- 1 | const { Command } = require('../../commando'); 2 | const Discord = require('discord.js'); 3 | const randomPuppy = require('random-puppy'); 4 | const errors = require('../../assets/json/errors'); 5 | 6 | 7 | module.exports = class CosplayCommand extends Command { 8 | constructor(client) { 9 | super(client, { 10 | name: 'cosplay', 11 | group: 'nsfw', 12 | memberName: 'cosplay', 13 | guildOnly: true, 14 | description: 'Finds NSFW cosplay for you!', 15 | details: 'This command can only be used in NSFW channels!', 16 | examples: ['~cosplay'], 17 | throttling: { 18 | usages: 1, 19 | duration: 3 20 | } 21 | }); 22 | } 23 | 24 | run(message) { 25 | var errMessage = errors[Math.round(Math.random() * (errors.length - 1))]; 26 | if (!message.channel.nsfw) { 27 | message.react('💢'); 28 | return message.channel.send(errMessage); 29 | } 30 | 31 | var subreddits = [ 32 | 'nsfwcosplay', 33 | 'cosplayonoff', 34 | 'cosporn', 35 | 'cosplayboobs' 36 | ] 37 | 38 | var sub = subreddits[Math.round(Math.random() * (subreddits.length - 1))]; 39 | 40 | randomPuppy(sub) 41 | .then(url => { 42 | const embed = new Discord.MessageEmbed() 43 | .setFooter('cosplay') 44 | .setDescription(`[Image URL](${url})`) 45 | .setImage(url) 46 | .setColor('#A187E0'); 47 | return message.channel.send({ embed }); 48 | }) 49 | } 50 | } -------------------------------------------------------------------------------- /commands/nsfw/e621.js: -------------------------------------------------------------------------------- 1 | const { Command } = require('../../commando'); 2 | const Discord = require('discord.js'); 3 | const booru = require('booru'); 4 | const errors = require('../../assets/json/errors'); 5 | 6 | 7 | module.exports = class E621Command extends Command { 8 | constructor(client) { 9 | super(client, { 10 | name: 'e621', 11 | aliases: ['e6'], 12 | group: 'nsfw', 13 | memberName: 'e621', 14 | guildOnly: true, 15 | description: 'Searches for images on e621!', 16 | details: 'This command can only be used in NSFW channels!', 17 | examples: ['~e621 '], 18 | throttling: { 19 | usages: 1, 20 | duration: 3 21 | } 22 | }); 23 | } 24 | 25 | run(message) { 26 | var errMessage = errors[Math.round(Math.random() * (errors.length - 1))]; 27 | if (!message.channel.nsfw) { 28 | message.react('💢'); 29 | return message.channel.send(errMessage); 30 | } 31 | 32 | if (message.content.toUpperCase().includes('LOLI') || message.content.toUpperCase().includes('GORE')) return message.channel.send('That kind of stuff is not allowed! Not even in NSFW channels!'); 33 | 34 | var query = message.content.split(/\s+/g).slice(1).join(" "); 35 | 36 | booru.search('e621', [query], { limit: 1, random: true }) 37 | .then(booru.commonfy) 38 | .then(images => { 39 | for (let image of images) { 40 | const embed = new Discord.MessageEmbed() 41 | .setAuthor(`e621 ${query}`, 'https://b.catgirlsare.sexy/NrAI.png') 42 | .setDescription(`[Image URL](${image.common.file_url})`) 43 | .setImage(image.common.file_url) 44 | .setColor('#E89F3E'); 45 | return message.channel.send({ embed }); 46 | } 47 | }).catch(err => { 48 | if (err.name === 'booruError') { 49 | return message.channel.send(`No results found for **${query}**!`); 50 | } else { 51 | return message.channel.send(`No results found for **${query}**!`); 52 | } 53 | }) 54 | } 55 | } -------------------------------------------------------------------------------- /commands/nsfw/ecchi.js: -------------------------------------------------------------------------------- 1 | const { Command } = require('../../commando'); 2 | const Discord = require('discord.js'); 3 | const randomPuppy = require('random-puppy'); 4 | const errors = require('../../assets/json/errors'); 5 | 6 | 7 | module.exports = class EcchiCommand extends Command { 8 | constructor(client) { 9 | super(client, { 10 | name: 'ecchi', 11 | group: 'nsfw', 12 | memberName: 'ecchi', 13 | guildOnly: true, 14 | description: 'Finds ecchi for you!', 15 | details: 'This command can only be used in NSFW channels!', 16 | examples: ['~ecchi'], 17 | throttling: { 18 | usages: 1, 19 | duration: 3 20 | } 21 | }); 22 | } 23 | 24 | run(message) { 25 | var errMessage = errors[Math.round(Math.random() * (errors.length - 1))]; 26 | if (!message.channel.nsfw) { 27 | message.react('💢'); 28 | return message.channel.send(errMessage); 29 | } 30 | 31 | randomPuppy('ecchi') 32 | .then(url => { 33 | const embed = new Discord.MessageEmbed() 34 | .setFooter(`ecchi`) 35 | .setDescription(`[Image URL](${url})`) 36 | .setImage(url) 37 | .setColor('#A187E0'); 38 | return message.channel.send({ embed }); 39 | }) 40 | } 41 | } -------------------------------------------------------------------------------- /commands/nsfw/futa.js: -------------------------------------------------------------------------------- 1 | const { Command } = require('../../commando'); 2 | const Discord = require('discord.js'); 3 | const randomPuppy = require('random-puppy'); 4 | const errors = require('../../assets/json/errors'); 5 | 6 | 7 | module.exports = class FutaCommand extends Command { 8 | constructor(client) { 9 | super(client, { 10 | name: 'futa', 11 | aliases: ['futarani'], 12 | group: 'nsfw', 13 | memberName: 'futa', 14 | guildOnly: true, 15 | description: 'Finds... futas...? For...you?', 16 | details: 'This command can only be used in NSFW channels!', 17 | examples: ['~futa'], 18 | throttling: { 19 | usages: 1, 20 | duration: 3 21 | } 22 | }); 23 | } 24 | 25 | run(message) { 26 | var errMessage = errors[Math.round(Math.random() * (errors.length - 1))]; 27 | if (!message.channel.nsfw) { 28 | message.react('💢'); 29 | return message.channel.send(errMessage); 30 | } 31 | 32 | randomPuppy('futanari') 33 | .then(url => { 34 | const embed = new Discord.MessageEmbed() 35 | .setFooter(`futanari`) 36 | .setDescription(`[Image URL](${url})`) 37 | .setImage(url) 38 | .setColor('#A187E0'); 39 | return message.channel.send({ embed }); 40 | }) 41 | 42 | return null; 43 | } 44 | } -------------------------------------------------------------------------------- /commands/nsfw/grool.js: -------------------------------------------------------------------------------- 1 | const { Command } = require('../../commando'); 2 | const Discord = require('discord.js'); 3 | const randomPuppy = require('random-puppy'); 4 | const errors = require('../../assets/json/errors'); 5 | 6 | 7 | module.exports = class GroolCommand extends Command { 8 | constructor(client) { 9 | super(client, { 10 | name: 'grool', 11 | group: 'nsfw', 12 | memberName: 'grool', 13 | guildOnly: true, 14 | description: 'Finds..grool?? For you...??', 15 | details: 'This command can only be used in NSFW channels!', 16 | examples: ['~grool'], 17 | throttling: { 18 | usages: 1, 19 | duration: 3 20 | } 21 | }); 22 | } 23 | 24 | run(message) { 25 | var errMessage = errors[Math.round(Math.random() * (errors.length - 1))]; 26 | if (!message.channel.nsfw) { 27 | message.react('💢'); 28 | return message.channel.send(errMessage); 29 | } 30 | 31 | randomPuppy('grool') 32 | .then(url => { 33 | const embed = new Discord.MessageEmbed() 34 | .setFooter(`grool`) 35 | .setDescription(`[Image URL](${url})`) 36 | .setImage(url) 37 | .setColor('#A187E0'); 38 | return message.channel.send({ embed }); 39 | }) 40 | } 41 | } -------------------------------------------------------------------------------- /commands/nsfw/gtn.js: -------------------------------------------------------------------------------- 1 | const { Command } = require('../../commando'); 2 | const Discord = require('discord.js'); 3 | const snekfetch = require('snekfetch'); 4 | const errors = require('../../assets/json/errors'); 5 | 6 | module.exports = class GTNCommand extends Command { 7 | constructor(client) { 8 | super(client, { 9 | name: 'gtn', 10 | aliases: ['nsfwcomics'], 11 | group: 'nsfw', 12 | memberName: 'gtn', 13 | guildOnly: true, 14 | description: 'Finds a GreenTeaNeko comic!', 15 | details: 'This command can only be used in NSFW channels!', 16 | examples: ['~gtn'], 17 | throttling: { 18 | usages: 1, 19 | duration: 3 20 | } 21 | }); 22 | } 23 | 24 | async run(message) { 25 | var errMessage = errors[Math.round(Math.random() * (errors.length - 1))]; 26 | if (!message.channel.nsfw) { 27 | message.react('💢'); 28 | return message.channel.send(errMessage); 29 | } 30 | 31 | var text = await snekfetch.get(`https://rra.ram.moe/i/r?nsfw=true`); 32 | var body = JSON.parse(text.text); 33 | 34 | var recipient = message.content.split(/\s+/g).slice(1).join(" "); 35 | var embed = new Discord.MessageEmbed() 36 | .setColor('#FBCFCF') 37 | .setImage(`https://rra.ram.moe${body.path}`); 38 | return message.channel.send({ embed }); 39 | } 40 | } -------------------------------------------------------------------------------- /commands/nsfw/hentai.js: -------------------------------------------------------------------------------- 1 | const { Command } = require('../../commando'); 2 | const Discord = require('discord.js'); 3 | const randomPuppy = require('random-puppy'); 4 | const errors = require('../../assets/json/errors'); 5 | const subreddits = [ 6 | "hentai", 7 | "rule34", 8 | "HQHentai" 9 | ] 10 | 11 | module.exports = class HentaiCommand extends Command { 12 | constructor(client) { 13 | super(client, { 14 | name: 'hentai', 15 | group: 'nsfw', 16 | memberName: 'hentai', 17 | description: 'Finds hentai for you!', 18 | guildOnly: true, 19 | details: 'This command can only be used in NSFW channels!', 20 | examples: ['~hentai'], 21 | throttling: { 22 | usages: 1, 23 | duration: 3 24 | } 25 | }); 26 | } 27 | 28 | run(message) { 29 | var errMessage = errors[Math.round(Math.random() * (errors.length - 1))]; 30 | if (!message.channel.nsfw) { 31 | message.react('💢'); 32 | return message.channel.send(errMessage); 33 | } 34 | 35 | var randSubreddit = subreddits[Math.round(Math.random() * (subreddits.length - 1))]; 36 | 37 | randomPuppy(randSubreddit) 38 | .then(url => { 39 | const embed = new Discord.MessageEmbed() 40 | .setFooter(`${randSubreddit}`) 41 | .setDescription(`[Image URL](${url})`) 42 | .setImage(url) 43 | .setColor('#A187E0'); 44 | return message.channel.send({ embed }); 45 | }) 46 | } 47 | } -------------------------------------------------------------------------------- /commands/nsfw/hentaigif.js: -------------------------------------------------------------------------------- 1 | const { Command } = require('../../commando'); 2 | const Discord = require('discord.js'); 3 | const randomPuppy = require('random-puppy'); 4 | const errors = require('../../assets/json/errors'); 5 | 6 | 7 | module.exports = class HentaiGifCommand extends Command { 8 | constructor(client) { 9 | super(client, { 10 | name: 'hentaigif', 11 | aliases: ['hgif'], 12 | group: 'nsfw', 13 | memberName: 'hentaigif', 14 | guildOnly: true, 15 | description: 'Finds hentai gifs for you!', 16 | details: 'This command can only be used in NSFW channels!', 17 | examples: ['~hentaigif'], 18 | throttling: { 19 | usages: 1, 20 | duration: 3 21 | } 22 | }); 23 | } 24 | 25 | run(message) { 26 | var errMessage = errors[Math.round(Math.random() * (errors.length - 1))]; 27 | if (!message.channel.nsfw) { 28 | message.react('💢'); 29 | return message.channel.send(errMessage); 30 | } 31 | 32 | randomPuppy('HENTAI_GIF') 33 | .then(url => { 34 | const embed = new Discord.MessageEmbed() 35 | .setFooter(`hentai.gif`) 36 | .setDescription(`[Image URL](${url})`) 37 | .setImage(url) 38 | .setColor('#A187E0'); 39 | return message.channel.send({ embed }); 40 | }) 41 | } 42 | } -------------------------------------------------------------------------------- /commands/nsfw/hentaiirl.js: -------------------------------------------------------------------------------- 1 | const { Command } = require('../../commando'); 2 | const Discord = require('discord.js'); 3 | const randomPuppy = require('random-puppy'); 4 | const errors = require('../../assets/json/errors'); 5 | 6 | 7 | module.exports = class HentaiIrlCommand extends Command { 8 | constructor(client) { 9 | super(client, { 10 | name: 'hentaiirl', 11 | aliases: ['irl', 'hirl'], 12 | group: 'nsfw', 13 | memberName: 'hentaiirl', 14 | guildOnly: true, 15 | description: 'Hentai! But depicts of real situations!', 16 | details: 'This command can only be used in NSFW channels!', 17 | examples: ['~hentaiirl'], 18 | throttling: { 19 | usages: 1, 20 | duration: 3 21 | } 22 | }); 23 | } 24 | 25 | run(message) { 26 | var errMessage = errors[Math.round(Math.random() * (errors.length - 1))]; 27 | if (!message.channel.nsfw) { 28 | message.react('💢') 29 | return message.channel.send(errMessage); 30 | } 31 | 32 | randomPuppy('hentai_irl') 33 | .then(url => { 34 | const embed = new Discord.MessageEmbed() 35 | .setFooter('Hentai_irl', 'https://a.safe.moe/jZZKM.png') 36 | .setDescription(`[Image URL](${url})`) 37 | .setImage(url) 38 | .setColor('#A187E0'); 39 | return message.channel.send({ embed }); 40 | }) 41 | } 42 | } -------------------------------------------------------------------------------- /commands/nsfw/lingerie.js: -------------------------------------------------------------------------------- 1 | const { Command } = require('../../commando'); 2 | const Discord = require('discord.js'); 3 | const randomPuppy = require('random-puppy'); 4 | const errors = require('../../assets/json/errors'); 5 | 6 | 7 | module.exports = class LingerieCommand extends Command { 8 | constructor(client) { 9 | super(client, { 10 | name: 'lingerie', 11 | aliases: ['thighhighs', 'stockings'], 12 | group: 'nsfw', 13 | memberName: 'lingerie', 14 | guildOnly: true, 15 | description: 'Finds...girls wearing..lingerie? ...For you!', 16 | details: 'This command can only be used in NSFW channels!', 17 | examples: ['~'], 18 | throttling: { 19 | usages: 1, 20 | duration: 3 21 | } 22 | }); 23 | } 24 | 25 | run(message) { 26 | var errMessage = errors[Math.round(Math.random() * (errors.length - 1))]; 27 | if (!message.channel.nsfw) { 28 | message.react('💢'); 29 | return message.channel.send(errMessage); 30 | } 31 | 32 | var subreddits = [ 33 | 'lingerie', 34 | 'stockings', 35 | 'pantyfetish', 36 | 'panties' 37 | ] 38 | 39 | var sub = subreddits[Math.round(Math.random() * (subreddits.length - 1))]; 40 | 41 | randomPuppy(sub) 42 | .then(url => { 43 | const embed = new Discord.MessageEmbed() 44 | .setFooter(`Lingerie`) 45 | .setDescription(`[Image URL](${url})`) 46 | .setImage(url) 47 | .setColor('#A187E0'); 48 | return message.channel.send({ embed }); 49 | }) 50 | } 51 | } -------------------------------------------------------------------------------- /commands/nsfw/monstergirl.js: -------------------------------------------------------------------------------- 1 | const { Command } = require('../../commando'); 2 | const Discord = require('discord.js'); 3 | const randomPuppy = require('random-puppy'); 4 | const errors = require('../../assets/json/errors'); 5 | 6 | 7 | module.exports = class MonsterGirlCommand extends Command { 8 | constructor(client) { 9 | super(client, { 10 | name: 'monstergirl', 11 | aliases: ['mg', 'monster'], 12 | group: 'nsfw', 13 | memberName: 'monstergirl', 14 | guildOnly: true, 15 | description: 'Finds monstergirls for you!', 16 | details: 'This command can only be used in NSFW channels!', 17 | examples: ['~monstergirl'], 18 | throttling: { 19 | usages: 1, 20 | duration: 3 21 | } 22 | }); 23 | } 24 | 25 | run(message) { 26 | var errMessage = errors[Math.round(Math.random() * (errors.length - 1))]; 27 | if (!message.channel.nsfw) { 28 | message.react('💢'); 29 | return message.channel.send(errMessage); 30 | } 31 | 32 | randomPuppy('MonsterGirl') 33 | .then(url => { 34 | const embed = new Discord.MessageEmbed() 35 | .setFooter(`MonsterGirl`) 36 | .setDescription(`[Image URL](${url})`) 37 | .setImage(url) 38 | .setColor('#A187E0'); 39 | return message.channel.send({ embed }); 40 | }) 41 | } 42 | } -------------------------------------------------------------------------------- /commands/nsfw/neko.js: -------------------------------------------------------------------------------- 1 | const { Command } = require('../../commando'); 2 | const Discord = require('discord.js'); 3 | const snekfetch = require('snekfetch'); 4 | 5 | 6 | module.exports = class NekoCommand extends Command { 7 | constructor(client) { 8 | super(client, { 9 | name: 'neko', 10 | aliases: ['catgirl', 'nekomimi', 'nekos'], 11 | group: 'nsfw', 12 | memberName: 'neko', 13 | guildOnly: true, 14 | description: 'Nekos!', 15 | details: 'This command is NSFW in NSFW channels and not NSFW in normal channels!', 16 | examples: ['~neko'], 17 | throttling: { 18 | usages: 1, 19 | duration: 3 20 | } 21 | }); 22 | } 23 | 24 | async run(message) { 25 | if (!message.channel.nsfw) { 26 | const res = await snekfetch.get(`http://nekos.life/api/neko`); 27 | const preview = res.body.neko; 28 | 29 | const embed = new Discord.MessageEmbed() 30 | .setImage(preview) 31 | .setColor('#A187E0') 32 | .setFooter('http://nekos.life', 'https://a.safe.moe/3XYZ6.gif'); 33 | return message.channel.send({ embed }); 34 | 35 | } else { 36 | const res = await snekfetch.get(`http://nekos.life/api/lewd/neko`); 37 | const preview = res.body.neko; 38 | 39 | const embed = new Discord.MessageEmbed() 40 | .setImage(preview) 41 | .setColor('#A187E0') 42 | .setFooter('http://nekos.life', 'https://a.safe.moe/3XYZ6.gif'); 43 | return message.channel.send({ embed }); 44 | } 45 | } 46 | } -------------------------------------------------------------------------------- /commands/nsfw/nsfw.js: -------------------------------------------------------------------------------- 1 | const { Command } = require('../../commando'); 2 | const Discord = require('discord.js'); 3 | const randomPuppy = require('random-puppy'); 4 | const errors = require('../../assets/json/errors'); 5 | const subreddits = [ 6 | "nsfw", 7 | "porn", 8 | "BonerMaterial", 9 | "adorableporn", 10 | "nsfw2", 11 | "Sexy", 12 | "NSFW_nospam" 13 | ] 14 | 15 | 16 | module.exports = class NSFWCommand extends Command { 17 | constructor(client) { 18 | super(client, { 19 | name: 'nsfw', 20 | aliases: ['porn'], 21 | group: 'nsfw', 22 | memberName: 'nsfw', 23 | guildOnly: true, 24 | description: 'Finds porn for you!', 25 | details: 'This command can only be used in NSFW channels!', 26 | examples: ['~nsfw'], 27 | throttling: { 28 | usages: 1, 29 | duration: 3 30 | } 31 | }); 32 | } 33 | 34 | run(message) { 35 | var errMessage = errors[Math.round(Math.random() * (errors.length - 1))]; 36 | if (!message.channel.nsfw) { 37 | message.react('💢'); 38 | return message.channel.send(errMessage); 39 | } 40 | 41 | var randSubreddit = subreddits[Math.round(Math.random() * (subreddits.length - 1))]; 42 | 43 | randomPuppy(randSubreddit) 44 | .then(url => { 45 | const embed = new Discord.MessageEmbed() 46 | .setFooter(`${randSubreddit}`) 47 | .setDescription(`[Image URL](${url})`) 48 | .setImage(url) 49 | .setColor('#CEA0A6'); 50 | return message.channel.send({ embed }); 51 | }) 52 | } 53 | } -------------------------------------------------------------------------------- /commands/nsfw/nsfwgif.js: -------------------------------------------------------------------------------- 1 | const { Command } = require('../../commando'); 2 | const Discord = require('discord.js'); 3 | const randomPuppy = require('random-puppy'); 4 | const errors = require('../../assets/json/errors'); 5 | const subreddits = [ 6 | "NSFW_GIF", 7 | "nsfw_gifs", 8 | "porninfifteenseconds", 9 | "60FPSPorn", 10 | "porn_gifs", 11 | "nsfw_Best_Porn_Gif", 12 | "LipsThatGrip", 13 | "adultgifs" 14 | ] 15 | 16 | 17 | module.exports = class NSFWGifCommand extends Command { 18 | constructor(client) { 19 | super(client, { 20 | name: 'nsfwgif', 21 | aliases: ['nsfwg', 'porngif'], 22 | group: 'nsfw', 23 | memberName: 'nsfwgif', 24 | guildOnly: true, 25 | description: 'Finds NSFW gifs for you!', 26 | details: 'This command can only be used in NSFW channels!', 27 | examples: ['~nsfwgif'], 28 | throttling: { 29 | usages: 1, 30 | duration: 3 31 | } 32 | }); 33 | } 34 | 35 | run(message) { 36 | var errMessage = errors[Math.round(Math.random() * (errors.length - 1))]; 37 | if (!message.channel.nsfw) { 38 | message.react('💢'); 39 | return message.channel.send(errMessage); 40 | } 41 | 42 | var randSubreddit = subreddits[Math.round(Math.random() * (subreddits.length - 1))]; 43 | 44 | randomPuppy(randSubreddit) 45 | .then(url => { 46 | const embed = new Discord.MessageEmbed() 47 | .setFooter('NSFW.gif', 'https://a.safe.moe/O8TDd.png') 48 | .setDescription(`[Image URL](${url})`) 49 | .setImage(url) 50 | .setColor('#CEA0A6'); 51 | return message.channel.send({ embed }); 52 | }) 53 | } 54 | } -------------------------------------------------------------------------------- /commands/nsfw/oppai.js: -------------------------------------------------------------------------------- 1 | const { Command } = require('../../commando'); 2 | const Discord = require('discord.js'); 3 | const randomPuppy = require('random-puppy'); 4 | const errors = require('../../assets/json/errors'); 5 | 6 | 7 | module.exports = class OppaiCommand extends Command { 8 | constructor(client) { 9 | super(client, { 10 | name: 'oppai', 11 | aliases: ['tiddy', 'animetiddy'], 12 | group: 'nsfw', 13 | memberName: 'oppai', 14 | guildOnly: true, 15 | description: 'Finds oppai for you!', 16 | details: 'This command can only be used in NSFW channels!', 17 | examples: ['~oppai'], 18 | throttling: { 19 | usages: 1, 20 | duration: 3 21 | } 22 | }); 23 | } 24 | 25 | run(message) { 26 | var errMessage = errors[Math.round(Math.random() * (errors.length - 1))]; 27 | if (!message.channel.nsfw) { 28 | message.react('💢'); 29 | return message.channel.send(errMessage); 30 | } 31 | 32 | randomPuppy('OppaiLove') 33 | .then(url => { 34 | const embed = new Discord.MessageEmbed() 35 | .setFooter(`oppai`) 36 | .setDescription(`[Image URL](${url})`) 37 | .setImage(url) 38 | .setColor('#A187E0'); 39 | return message.channel.send({ embed }); 40 | }) 41 | 42 | } 43 | } -------------------------------------------------------------------------------- /commands/nsfw/paheal.js: -------------------------------------------------------------------------------- 1 | const { Command } = require('../../commando'); 2 | const Discord = require('discord.js'); 3 | const booru = require('booru'); 4 | const errors = require('../../assets/json/errors'); 5 | 6 | 7 | module.exports = class PahealCommand extends Command { 8 | constructor(client) { 9 | super(client, { 10 | name: 'paheal', 11 | aliases: ['ph'], 12 | group: 'nsfw', 13 | memberName: 'paheal', 14 | guildOnly: true, 15 | description: 'Searches for images on Paheal!', 16 | details: 'This command can only be used in NSFW channels!', 17 | examples: ['~paheal '], 18 | throttling: { 19 | usages: 1, 20 | duration: 3 21 | } 22 | }); 23 | } 24 | 25 | run(message) { 26 | var errMessage = errors[Math.round(Math.random() * (errors.length - 1))]; 27 | if (!message.channel.nsfw) { 28 | message.react('💢'); 29 | return message.channel.send(errMessage); 30 | } 31 | 32 | if (message.content.toUpperCase().includes('LOLI') || message.content.toUpperCase().includes('GORE')) return message.channel.send('That kind of stuff is not allowed! Not even in NSFW channels!'); 33 | 34 | var query = message.content.split(/\s+/g).slice(1).join(" "); 35 | booru.search('paheal', [query], { limit: 1, random: true }) 36 | .then(booru.commonfy) 37 | .then(images => { 38 | for (let image of images) { 39 | const embed = new Discord.MessageEmbed() 40 | .setAuthor(`Paheal ${query}`, 'https://b.catgirlsare.sexy/NrAI.png') 41 | .setDescription(`[Image URL](${image.common.file_url})`) 42 | .setImage(image.common.file_url) 43 | .setColor('#E89F3E'); 44 | return message.channel.send({ embed }); 45 | } 46 | 47 | }).catch(err => { 48 | if (err.name === 'booruError') { 49 | return message.channel.send(`No results found for **${query}**!`); 50 | } else { 51 | return message.channel.send(`No results found for **${query}**!`); 52 | } 53 | }) 54 | } 55 | } -------------------------------------------------------------------------------- /commands/nsfw/paizuri.js: -------------------------------------------------------------------------------- 1 | const { Command } = require('../../commando'); 2 | const Discord = require('discord.js'); 3 | const randomPuppy = require('random-puppy'); 4 | const errors = require('../../assets/json/errors'); 5 | 6 | 7 | module.exports = class PaizuriCommand extends Command { 8 | constructor(client) { 9 | super(client, { 10 | name: 'paizuri', 11 | group: 'nsfw', 12 | memberName: 'paizuri', 13 | guildOnly: true, 14 | description: 'Anime tiddy fuck...?', 15 | details: 'This command can only be used in NSFW channels!', 16 | examples: ['~paizuri'], 17 | throttling: { 18 | usages: 1, 19 | duration: 3 20 | } 21 | }); 22 | } 23 | 24 | run (message) { 25 | var errMessage = errors[Math.round(Math.random() * (errors.length - 1))]; 26 | if(!message.channel.nsfw) { 27 | message.react('💢'); 28 | return message.channel.send(errMessage); 29 | } 30 | 31 | randomPuppy('Paizuri') 32 | .then(url => { 33 | const embed = new Discord.MessageEmbed() 34 | .setFooter(`paizuri`) 35 | .setDescription(`[Image URL](${url})`) 36 | .setImage(url) 37 | .setColor('#A187E0'); 38 | return message.channel.send({embed}); 39 | }) 40 | } 41 | } -------------------------------------------------------------------------------- /commands/nsfw/pantsu.js: -------------------------------------------------------------------------------- 1 | const { Command } = require('../../commando'); 2 | const Discord = require('discord.js'); 3 | const randomPuppy = require('random-puppy'); 4 | const errors = require('../../assets/json/errors'); 5 | 6 | 7 | module.exports = class PantsuCommand extends Command { 8 | constructor(client) { 9 | super(client, { 10 | name: 'pantsu', 11 | group: 'nsfw', 12 | memberName: 'pantsu', 13 | guildOnly: true, 14 | description: 'Finds pantsu for you!', 15 | details: 'This command can only be used in NSFW channels!', 16 | examples: ['~pantsu'], 17 | throttling: { 18 | usages: 1, 19 | duration: 3 20 | } 21 | }); 22 | } 23 | 24 | run(message) { 25 | var errMessage = errors[Math.round(Math.random() * (errors.length - 1))]; 26 | if (!message.channel.nsfw) { 27 | message.react('💢'); 28 | return message.channel.send(errMessage); 29 | } 30 | 31 | randomPuppy('pantsu') 32 | .then(url => { 33 | const embed = new Discord.MessageEmbed() 34 | .setFooter(`pantsu`) 35 | .setDescription(`[Image URL](${url})`) 36 | .setImage(url) 37 | .setColor('#A187E0'); 38 | return message.channel.send({ embed }); 39 | }) 40 | } 41 | } -------------------------------------------------------------------------------- /commands/nsfw/pornhub.js: -------------------------------------------------------------------------------- 1 | const { Command } = require('../../commando'); 2 | const Discord = require('discord.js'); 3 | const Pornsearch = require('pornsearch').default; 4 | const errors = require('../../assets/json/errors'); 5 | 6 | 7 | module.exports = class PornHubCommand extends Command { 8 | constructor(client) { 9 | super(client, { 10 | name: 'pornhub', 11 | group: 'nsfw', 12 | memberName: 'pornhub', 13 | guildOnly: true, 14 | description: 'Searches for videos on Pornhub!', 15 | details: 'This command can only be used in NSFW channels!', 16 | examples: ['~pornhub [search]'], 17 | throttling: { 18 | usages: 1, 19 | duration: 3 20 | } 21 | }); 22 | } 23 | 24 | run(message) { 25 | var errMessage = errors[Math.round(Math.random() * (errors.length - 1))]; 26 | if (!message.channel.nsfw) { 27 | message.react('💢'); 28 | return message.channel.send(errMessage); 29 | } 30 | 31 | var s = message.content.split(/\s+/g).slice(1).join(" "); 32 | 33 | if (!s) { 34 | return message.channel.send('Please provide me something to search for!') 35 | } 36 | 37 | var Searcher = new Pornsearch(s); 38 | 39 | try { 40 | Searcher.videos() 41 | .then(videos => message.channel.send(videos[1].url)); 42 | 43 | return null; 44 | 45 | } catch (err) { 46 | return message.channel.send(`No results found for **${s}**`) 47 | } 48 | } 49 | } -------------------------------------------------------------------------------- /commands/nsfw/pussy.js: -------------------------------------------------------------------------------- 1 | const { Command } = require('../../commando'); 2 | const Discord = require('discord.js'); 3 | const randomPuppy = require('random-puppy'); 4 | const errors = require('../../assets/json/errors'); 5 | 6 | 7 | module.exports = class PussyCommand extends Command { 8 | constructor(client) { 9 | super(client, { 10 | name: 'pussy', 11 | group: 'nsfw', 12 | memberName: 'pussy', 13 | guildOnly: true, 14 | description: 'Finds... pussy?? For..you!', 15 | details: 'This command can only be used in NSFW channels!', 16 | examples: ['~pussy'], 17 | throttling: { 18 | usages: 1, 19 | duration: 3 20 | } 21 | }); 22 | } 23 | 24 | run(message) { 25 | var errMessage = errors[Math.round(Math.random() * (errors.length - 1))]; 26 | if (!message.channel.nsfw) { 27 | message.react('💢'); 28 | return message.channel.send(errMessage); 29 | } 30 | 31 | var subreddits = [ 32 | 'pussy', 33 | 'rearpussy', 34 | 'simps', 35 | 'vagina', 36 | 'MoundofVenus', 37 | 'PerfectPussies', 38 | 'spreading' 39 | ] 40 | 41 | var sub = subreddits[Math.round(Math.random() * (subreddits.length - 1))]; 42 | 43 | randomPuppy(sub) 44 | .then(url => { 45 | const embed = new Discord.MessageEmbed() 46 | .setFooter(`pussy`) 47 | .setDescription(`[Image URL](${url})`) 48 | .setImage(url) 49 | .setColor('#A187E0'); 50 | return message.channel.send({ embed }); 51 | }) 52 | } 53 | } -------------------------------------------------------------------------------- /commands/nsfw/rule34.js: -------------------------------------------------------------------------------- 1 | const { Command } = require('../../commando'); 2 | const Discord = require('discord.js'); 3 | const booru = require('booru'); 4 | const errors = require('../../assets/json/errors'); 5 | 6 | 7 | module.exports = class Rule34Command extends Command { 8 | constructor(client) { 9 | super(client, { 10 | name: 'rule34', 11 | aliases: ['r34'], 12 | group: 'nsfw', 13 | memberName: 'rule34', 14 | guildOnly: true, 15 | description: 'Searches for images on rule34!', 16 | details: 'This command can only be used in NSFW channels!', 17 | examples: ['~rule34 '], 18 | throttling: { 19 | usages: 1, 20 | duration: 3 21 | } 22 | }); 23 | } 24 | 25 | run(message) { 26 | var errMessage = errors[Math.round(Math.random() * (errors.length - 1))]; 27 | if (!message.channel.nsfw) { 28 | message.react('💢'); 29 | return message.channel.send(errMessage); 30 | } 31 | 32 | if (message.content.toUpperCase().includes('LOLI') || message.content.toUpperCase().includes('GORE')) return message.channel.send('That kind of stuff is not allowed! Not even in NSFW channels!'); 33 | 34 | var query = message.content.split(/\s+/g).slice(1).join(" "); 35 | booru.search('r34', [query], { limit: 1, random: true }) 36 | .then(booru.commonfy) 37 | .then(images => { 38 | for (let image of images) { 39 | const embed = new Discord.MessageEmbed() 40 | .setAuthor(`Rule34 ${query}`, 'https://b.catgirlsare.sexy/NrAI.png') 41 | .setDescription(`[Image URL](${image.common.file_url})`) 42 | .setImage(image.common.file_url) 43 | .setColor('#E89F3E'); 44 | return message.channel.send({ embed }); 45 | } 46 | 47 | }).catch(err => { 48 | if (err.name === 'booruError') { 49 | return message.channel.send(`No results found for **${query}**!`); 50 | } else { 51 | return message.channel.send(`No results found for **${query}**!`); 52 | } 53 | }) 54 | } 55 | } -------------------------------------------------------------------------------- /commands/nsfw/sukebei.js: -------------------------------------------------------------------------------- 1 | const { Command } = require('../../commando'); 2 | const Discord = require('discord.js'); 3 | const randomPuppy = require('random-puppy'); 4 | const errors = require('../../assets/json/errors'); 5 | 6 | 7 | module.exports = class SukebeiCommand extends Command { 8 | constructor(client) { 9 | super(client, { 10 | name: 'sukebei', 11 | group: 'nsfw', 12 | memberName: 'sukebei', 13 | guildOnly: true, 14 | description: 'Anime girls who\'ve lost their clothing..?', 15 | details: 'This command can only be used in NSFW channels!', 16 | examples: ['~sukebei'], 17 | throttling: { 18 | usages: 1, 19 | duration: 3 20 | } 21 | }); 22 | } 23 | 24 | run(message) { 25 | var errMessage = errors[Math.round(Math.random() * (errors.length - 1))]; 26 | if (!message.channel.nsfw) { 27 | message.react('💢'); 28 | return message.channel.send(errMessage); 29 | } 30 | 31 | randomPuppy('Sukebei') 32 | .then(url => { 33 | const embed = new Discord.MessageEmbed() 34 | .setFooter(`sukebei`) 35 | .setDescription(`[Image URL](${url})`) 36 | .setImage(url) 37 | .setColor('#A187E0'); 38 | return message.channel.send({ embed }); 39 | }) 40 | } 41 | } -------------------------------------------------------------------------------- /commands/nsfw/tbib.js: -------------------------------------------------------------------------------- 1 | const { Command } = require('../../commando'); 2 | const Discord = require('discord.js'); 3 | const booru = require('booru'); 4 | const errors = require('../../assets/json/errors'); 5 | 6 | 7 | module.exports = class YandereCommand extends Command { 8 | constructor(client) { 9 | super(client, { 10 | name: 'tbib', 11 | group: 'nsfw', 12 | memberName: 'tbib', 13 | guildOnly: true, 14 | description: 'Searches for images on TBIB!', 15 | details: 'This command can only be used in NSFW channels!', 16 | examples: ['~tbib '], 17 | throttling: { 18 | usages: 1, 19 | duration: 3 20 | } 21 | }); 22 | } 23 | 24 | run(message) { 25 | var errMessage = errors[Math.round(Math.random() * (errors.length - 1))]; 26 | if (!message.channel.nsfw) { 27 | message.react('💢'); 28 | return message.channel.send(errMessage); 29 | } 30 | 31 | if (message.content.toUpperCase().includes('LOLI') || message.content.toUpperCase().includes('GORE')) return message.channel.send('That kind of stuff is not allowed! Not even in NSFW channels!'); 32 | 33 | var query = message.content.split(/\s+/g).slice(1).join(" "); 34 | 35 | booru.search('tbib', [query], { limit: 1, random: true }) 36 | .then(booru.commonfy) 37 | .then(images => { 38 | for (let image of images) { 39 | const embed = new Discord.MessageEmbed() 40 | .setAuthor(`TBIB ${query}`, 'https://b.catgirlsare.sexy/NrAI.png') 41 | .setDescription(`[Image URL](${image.common.file_url})`) 42 | .setImage(image.common.file_url) 43 | .setColor('#E89F3E'); 44 | message.channel.send({ embed }); 45 | } 46 | }).catch(err => { 47 | if (err.name === 'booruError') { 48 | return message.channel.send(`No results found for **${query}**!`); 49 | } else { 50 | return message.channel.send(`No results found for **${query}**!`); 51 | } 52 | }) 53 | } 54 | } -------------------------------------------------------------------------------- /commands/nsfw/tentacle.js: -------------------------------------------------------------------------------- 1 | const { Command } = require('../../commando'); 2 | const Discord = require('discord.js'); 3 | const randomPuppy = require('random-puppy'); 4 | const errors = require('../../assets/json/errors'); 5 | 6 | 7 | module.exports = class TentacleCommand extends Command { 8 | constructor(client) { 9 | super(client, { 10 | name: 'tentacle', 11 | aliases: ['shokushu', 'tentai', 'tentacles'], 12 | group: 'nsfw', 13 | memberName: 'tentacle', 14 | guildOnly: true, 15 | description: 'Finds...tentacle..porn?? For...?? You!', 16 | details: 'This command can only be used in NSFW channels!', 17 | examples: ['~tentacle'], 18 | throttling: { 19 | usages: 1, 20 | duration: 3 21 | } 22 | }); 23 | } 24 | 25 | run(message) { 26 | var errMessage = errors[Math.round(Math.random() * (errors.length - 1))]; 27 | if (!message.channel.nsfw) { 28 | message.react('💢'); 29 | return message.channel.send(errMessage); 30 | } 31 | 32 | randomPuppy('tentai') 33 | .then(url => { 34 | const embed = new Discord.MessageEmbed() 35 | .setFooter(`tentacles`) 36 | .setDescription(`[Image URL](${url})`) 37 | .setImage(url) 38 | .setColor('#A187E0'); 39 | return message.channel.send({ embed }); 40 | }) 41 | } 42 | } -------------------------------------------------------------------------------- /commands/nsfw/trap.js: -------------------------------------------------------------------------------- 1 | const { Command } = require('../../commando'); 2 | const Discord = require('discord.js'); 3 | const randomPuppy = require('random-puppy'); 4 | const errors = require('../../assets/json/errors'); 5 | 6 | 7 | module.exports = class TrapCommand extends Command { 8 | constructor(client) { 9 | super(client, { 10 | name: 'trap', 11 | aliases: ['traps'], 12 | group: 'nsfw', 13 | memberName: 'trap', 14 | guildOnly: true, 15 | description: 'Finds...traps? for...you?', 16 | details: 'This command can only be used in NSFW channels!', 17 | examples: ['~trap'], 18 | throttling: { 19 | usages: 1, 20 | duration: 3 21 | } 22 | }); 23 | } 24 | 25 | run(message) { 26 | var errMessage = errors[Math.round(Math.random() * (errors.length - 1))]; 27 | if (!message.channel.nsfw) { 28 | message.react('💢'); 29 | return message.channel.send(errMessage); 30 | } 31 | 32 | randomPuppy('traphentai') 33 | .then(url => { 34 | const embed = new Discord.MessageEmbed() 35 | .setFooter(`traphentai`) 36 | .setDescription(`[Image URL](${url})`) 37 | .setImage(url) 38 | .setColor('#A187E0'); 39 | return message.channel.send({ embed }); 40 | }) 41 | } 42 | } -------------------------------------------------------------------------------- /commands/nsfw/xbooru.js: -------------------------------------------------------------------------------- 1 | const { Command } = require('../../commando'); 2 | const Discord = require('discord.js'); 3 | const booru = require('booru'); 4 | const errors = require('../../assets/json/errors'); 5 | 6 | 7 | module.exports = class XBooruCommand extends Command { 8 | constructor(client) { 9 | super(client, { 10 | name: 'xbooru', 11 | aliases: ['xb'], 12 | group: 'nsfw', 13 | memberName: 'xbooru', 14 | guildOnly: true, 15 | description: 'Searches for images on xbooru!', 16 | details: 'This command can only be used in NSFW channels!', 17 | examples: ['~xbooru '], 18 | throttling: { 19 | usages: 1, 20 | duration: 3 21 | } 22 | }); 23 | } 24 | 25 | run(message) { 26 | var errMessage = errors[Math.round(Math.random() * (errors.length - 1))]; 27 | if (!message.channel.nsfw) { 28 | message.react('💢'); 29 | return message.channel.send(errMessage); 30 | } 31 | 32 | if (message.content.toUpperCase().includes('LOLI') || message.content.toUpperCase().includes('GORE')) return message.channel.send('That kind of stuff is not allowed! Not even in NSFW channels!'); 33 | 34 | var query = message.content.split(/\s+/g).slice(1).join(" "); 35 | 36 | booru.search('xbooru', [query], { limit: 1, random: true }) 37 | .then(booru.commonfy) 38 | .then(images => { 39 | for (let image of images) { 40 | const embed = new Discord.MessageEmbed() 41 | .setAuthor(`xbooru ${query}`, 'https://b.catgirlsare.sexy/NrAI.png') 42 | .setDescription(`[Image URL](${image.common.file_url})`) 43 | .setImage(image.common.file_url) 44 | .setColor('#E89F3E'); 45 | return message.channel.send({ embed }); 46 | } 47 | }).catch(err => { 48 | if (err.name === 'booruError') { 49 | return message.channel.send(`No results found for **${query}**!`); 50 | } else { 51 | return message.channel.send(`No results found for **${query}**!`); 52 | } 53 | }) 54 | } 55 | } -------------------------------------------------------------------------------- /commands/nsfw/yandere.js: -------------------------------------------------------------------------------- 1 | const { Command } = require('../../commando'); 2 | const Discord = require('discord.js'); 3 | const booru = require('booru'); 4 | const errors = require('../../assets/json/errors'); 5 | 6 | 7 | module.exports = class YandereCommand extends Command { 8 | constructor(client) { 9 | super(client, { 10 | name: 'yandere', 11 | aliases: ['yd'], 12 | group: 'nsfw', 13 | memberName: 'yandere', 14 | guildOnly: true, 15 | description: 'Searches for images on Yandere!', 16 | details: 'This command can only be used in NSFW channels!', 17 | examples: ['~yandere '], 18 | throttling: { 19 | usages: 1, 20 | duration: 3 21 | } 22 | }); 23 | } 24 | 25 | run(message) { 26 | var errMessage = errors[Math.round(Math.random() * (errors.length - 1))]; 27 | if (!message.channel.nsfw) { 28 | message.react('💢'); 29 | return message.channel.send(errMessage); 30 | } 31 | 32 | if (message.content.toUpperCase().includes('LOLI') || message.content.toUpperCase().includes('GORE')) return message.channel.send('That kind of stuff is not allowed! Not even in NSFW channels!'); 33 | 34 | var query = message.content.split(/\s+/g).slice(1).join(" "); 35 | 36 | booru.search('yandere', [query], { limit: 1, random: true }) 37 | .then(booru.commonfy) 38 | .then(images => { 39 | for (let image of images) { 40 | const embed = new Discord.MessageEmbed() 41 | .setAuthor(`Yandere ${query}`, 'https://b.catgirlsare.sexy/NrAI.png') 42 | .setImage(image.common.file_url) 43 | .setColor('#E89F3E'); 44 | message.channel.send({ embed }); 45 | } 46 | }).catch(err => { 47 | if (err.name === 'booruError') { 48 | return message.channel.send(`No results found for **${query}**!`); 49 | } else { 50 | return message.channel.send(`No results found for **${query}**!`); 51 | } 52 | }) 53 | } 54 | } -------------------------------------------------------------------------------- /commands/nsfw/yaoi.js: -------------------------------------------------------------------------------- 1 | const { Command } = require('../../commando'); 2 | const Discord = require('discord.js'); 3 | const randomPuppy = require('random-puppy'); 4 | const errors = require('../../assets/json/errors'); 5 | 6 | 7 | module.exports = class YaoiCommand extends Command { 8 | constructor(client) { 9 | super(client, { 10 | name: 'yaoi', 11 | aliases: ['bl'], 12 | group: 'nsfw', 13 | memberName: 'yaoi', 14 | guildOnly: true, 15 | description: 'Finds yaoi for you!', 16 | details: 'This command can only be used in NSFW channels!', 17 | examples: ['~yaoi'], 18 | throttling: { 19 | usages: 1, 20 | duration: 3 21 | } 22 | }); 23 | } 24 | 25 | run(message) { 26 | var errMessage = errors[Math.round(Math.random() * (errors.length - 1))]; 27 | if (!message.channel.nsfw) { 28 | message.react('💢'); 29 | return message.channel.send(errMessage); 30 | } 31 | 32 | randomPuppy('yaoi') 33 | .then(url => { 34 | const embed = new Discord.MessageEmbed() 35 | .setFooter(`yaoi`) 36 | .setDescription(`[Image URL](${url})`) 37 | .setImage(url) 38 | .setColor('#A187E0'); 39 | return message.channel.send({ embed }); 40 | }) 41 | } 42 | } -------------------------------------------------------------------------------- /commands/nsfw/yuri.js: -------------------------------------------------------------------------------- 1 | const { Command } = require('../../commando'); 2 | const Discord = require('discord.js'); 3 | const randomPuppy = require('random-puppy'); 4 | const errors = require('../../assets/json/errors'); 5 | 6 | 7 | module.exports = class YuriCommand extends Command { 8 | constructor(client) { 9 | super(client, { 10 | name: 'yuri', 11 | aliases: ['gl'], 12 | group: 'nsfw', 13 | memberName: 'yuri', 14 | guildOnly: true, 15 | description: 'Finds yuri for you!', 16 | details: 'This command can only be used in NSFW channels!', 17 | examples: ['~yuri'], 18 | throttling: { 19 | usages: 1, 20 | duration: 3 21 | } 22 | }); 23 | } 24 | 25 | run(message) { 26 | var errMessage = errors[Math.round(Math.random() * (errors.length - 1))]; 27 | if (!message.channel.nsfw) { 28 | message.react('💢'); 29 | return message.channel.send(errMessage); 30 | } 31 | 32 | randomPuppy('yuri') 33 | .then(url => { 34 | const embed = new Discord.MessageEmbed() 35 | .setFooter(`yuri`) 36 | .setDescription(`[Image URL](${url})`) 37 | .setImage(url) 38 | .setColor('#A187E0'); 39 | return message.channel.send({ embed }); 40 | }) 41 | } 42 | } -------------------------------------------------------------------------------- /commands/nsfw/zr.js: -------------------------------------------------------------------------------- 1 | const { Command } = require('../../commando'); 2 | const Discord = require('discord.js'); 3 | const randomPuppy = require('random-puppy'); 4 | 5 | //remember to return before every promise 6 | module.exports = class ZrCommand extends Command { 7 | constructor(client) { 8 | super(client, { 9 | name: 'zr', 10 | aliases: ['zettairyouiki'], 11 | group: 'nsfw', 12 | memberName: 'zr', 13 | guildOnly: true, 14 | description: '"Absolute Territory" (絶対領域, zettai ryouiki) describes the amount of bare thigh skin between the skirt and stockings or socks for female characters.', 15 | examples: ['~zr'], 16 | throttling: { 17 | usages: 1, 18 | duration: 3 19 | } 20 | }); 21 | } 22 | 23 | run(message) { 24 | randomPuppy('ZettaiRyouiki') 25 | .then(url => { 26 | const embed = new Discord.MessageEmbed() 27 | .setFooter(`ZettaiRyouiki`) 28 | .setDescription(`[Image URL](${url})`) 29 | .setImage(url) 30 | .setColor('#A187E0'); 31 | return message.channel.send({ embed }); 32 | }) 33 | } 34 | } -------------------------------------------------------------------------------- /commands/owner/backdoor.js: -------------------------------------------------------------------------------- 1 | const { Command } = require('../../commando'); 2 | 3 | module.exports = class BackdoorCommand extends Command { 4 | constructor(bot) { 5 | super(bot, { 6 | name: 'backdoor', 7 | aliases: ['getinvite', 'getinv', 'forceinv', 'bd'], 8 | group: 'owner', 9 | memberName: 'backdoor', 10 | description: 'Sends a server invite to the specified server. Only the developer can use this!', 11 | examples: ['~backdoor [server ID]'], 12 | args: [{ 13 | key: 'guild', 14 | label: 'guild', 15 | prompt: 'What server would you like to backdoor?', 16 | type: 'string' 17 | }], 18 | }); 19 | } 20 | 21 | hasPermission(msg) { 22 | return this.client.isOwner(msg.author); 23 | } 24 | 25 | async run(message, args) { 26 | 27 | if (!message.guild) { 28 | const getGuild = this.client.guilds.get(args.guild) 29 | const toInv = getGuild.channels.first() 30 | 31 | const invite = toInv.createInvite({ 32 | maxAge: 120, 33 | maxUses: 1 34 | }).then(async invite => { 35 | message.author.send(`Here's the invite link to **${getGuild.name}**!\n${invite}`) 36 | }).catch(console.error) 37 | 38 | } else { 39 | const getGuild = this.client.guilds.get(args.guild) 40 | const toInv = getGuild.channels.first() 41 | 42 | const invite = toInv.createInvite({ 43 | maxAge: 120, 44 | maxUses: 1 45 | }).then(async invite => { 46 | message.author.send(`Here's the invite link to **${getGuild.name}**!\n${invite}`) 47 | message.channel.send('✅ | I\'ve sent the invite link to your DMs!') 48 | }).catch(console.error) 49 | } 50 | } 51 | }; 52 | 53 | process.on('unhandledRejection', err => { 54 | console.error('Uncaught Promise Error: \n' + err.stack); 55 | }); -------------------------------------------------------------------------------- /commands/owner/fleave.js: -------------------------------------------------------------------------------- 1 | const { Command } = require('../../commando'); 2 | 3 | module.exports = class FLeaveCommand extends Command { 4 | constructor(bot) { 5 | super(bot, { 6 | name: 'fleave', 7 | aliases: ['forceleave', 'leaveguild', 'removeguild'], 8 | group: 'owner', 9 | memberName: 'fleave', 10 | description: 'Leaves a guild!', 11 | details: 'Only the bot owner can use this command!', 12 | examples: ['~fleave 1234567890'], 13 | 14 | args: [{ 15 | key: 'toLeave', 16 | label: 'toLeave', 17 | prompt: 'Please specify a guild to leave!', 18 | type: 'string' 19 | }, 20 | { 21 | key: 'reason', 22 | label: 'reason', 23 | prompt: 'For what reason am I leaving the server?', 24 | type: 'string' 25 | } 26 | ], 27 | }); 28 | } 29 | 30 | hasPermission(message) { 31 | return this.client.isOwner(message.author); 32 | } 33 | 34 | async run(message, args) { 35 | 36 | let guild = this.client.guilds.get(args.toLeave) || 'woopsies' 37 | if (guild == 'woopsies') return message.channel.send('That guild was not found! Please try again!') 38 | 39 | let reason = args.reason 40 | const defaultChannel = guild.channels.find(c => c.permissionsFor(guild.me).has('SEND_MESSAGES')); 41 | 42 | try { 43 | try { 44 | defaultChannel.send(`👋 My developer has requested that I leave this server!\n\**Reason:** ${args.reason}`) 45 | } catch (err) { 46 | guild.owner.send(`👋 My developer has requested that I leave this server!\n\**Reason:** ${args.reason}`) 47 | } 48 | guild.leave() 49 | return message.channel.send(`Successfully left the guild **${guild.name}**!`) 50 | } catch (err) { 51 | return message.channel.send(`There was an error leaving the specified guild! \`${err}\``) 52 | } 53 | } 54 | }; -------------------------------------------------------------------------------- /commands/owner/reload.js: -------------------------------------------------------------------------------- 1 | const { Command } = require('../../commando'); 2 | const stripIndents = require('common-tags') 3 | 4 | function disambiguation(items, label, property = 'name') { 5 | const itemList = items.map(item => `"${(property ? item[property] : item).replace(/ /g, '\xa0')}"`).join(', '); 6 | return `Multiple ${label} found, please be more specific!`; 7 | } 8 | 9 | module.exports = class ReloadCommand extends Command { 10 | constructor(client) { 11 | super(client, { 12 | name: 'reload', 13 | aliases: ['reload-command', 'rl', 'load'], 14 | group: 'owner', 15 | memberName: 'reload', 16 | description: 'Reloads a command or command group.', 17 | details: 'This is an owner-only command!', 18 | examples: ['~reload help'], 19 | guarded: true, 20 | 21 | args: [{ 22 | key: 'cmdOrGrp', 23 | label: 'command/group', 24 | prompt: 'Which command or group would you like to reload?', 25 | validate: val => { 26 | if (!val) return false; 27 | const groups = this.client.registry.findGroups(val); 28 | if (groups.length === 1) return true; 29 | const commands = this.client.registry.findCommands(val); 30 | if (commands.length === 1) return true; 31 | if (commands.length === 0 && groups.length === 0) return false; 32 | return `${commands.length > 1 ? disambiguation(commands, 'commands') : ''}\n${groups.length > 1 ? disambiguation(groups, 'groups') : ''}`; 33 | }, 34 | parse: val => this.client.registry.findGroups(val)[0] || this.client.registry.findCommands(val)[0] 35 | }] 36 | }); 37 | } 38 | 39 | hasPermission(message) { 40 | return this.client.isOwner(message.author); 41 | } 42 | 43 | async run(message, args) { 44 | args.cmdOrGrp.reload(); 45 | if (args.cmdOrGrp.group) { 46 | await message.channel.send(`Reloaded \`${args.cmdOrGrp.name}\` command!`); 47 | } else { 48 | await message.channel.send(`Reloaded all of the commands in the \`${args.cmdOrGrp.name}\` group!`); 49 | } 50 | return null; 51 | } 52 | }; -------------------------------------------------------------------------------- /commands/owner/saychannel.js: -------------------------------------------------------------------------------- 1 | const { Command } = require('../../commando'); 2 | 3 | module.exports = class SayChannelCommand extends Command { 4 | constructor(client) { 5 | super(client, { 6 | name: 'saychannel', 7 | aliases: ['sc', 'send', 'portal', 'announce'], 8 | group: 'owner', 9 | memberName: 'saychannel', 10 | description: 'This is an admin-only command', 11 | examples: ['none'], 12 | guildOnly: true, 13 | throttling: { 14 | usages: 1, 15 | duration: 10 16 | } 17 | }); 18 | } 19 | 20 | async run(message) { 21 | if (message.guild.id !== '198399488614727680') return message.channel.send(`This command can only be used in the owner's server.`); 22 | if (!message.member.hasPermission('MANAGE_GUILD')) return message.channel.send('You cannot use this command!'); 23 | 24 | try { 25 | let channelMessage = message.content.split(/\s+/g).slice(2).join(" "); 26 | if (!channelMessage) return message.channel.send('Provide something for me to send.'); 27 | let channelid = message.content.split(/\s+/g)[1] 28 | let channel = this.client.channels.get(channelid) 29 | channel.send(channelMessage); 30 | 31 | await message.react("🇸").catch(console.error); 32 | await message.react("🇪").catch(console.error); 33 | await message.react("🇳").catch(console.error); 34 | await message.react("🇹").catch(console.error); 35 | 36 | return null; 37 | 38 | } catch (err) { 39 | return message.channel.send(`❎ | **An error occurred while running this command!** \`${err}\``); 40 | } 41 | } 42 | } -------------------------------------------------------------------------------- /commands/utility/color.js: -------------------------------------------------------------------------------- 1 | const { Command } = require('../../commando'); 2 | const Discord = require('discord.js'); 3 | 4 | module.exports = class ColorCommand extends Command { 5 | constructor(client) { 6 | super(client, { 7 | name: 'color', 8 | aliases: ['colour', 'hex'], 9 | group: 'utility', 10 | memberName: 'color', 11 | guildOnly: true, 12 | description: 'Shows a random color or a preview of the given color!', 13 | examples: ['~color '] 14 | }); 15 | } 16 | 17 | async run(message) { 18 | var color = message.content.split(/\s+/g).slice(1).join(" "); 19 | 20 | if (!color) { 21 | var genColour = '#' + Math.floor(Math.random() * 16777215).toString(16); 22 | const embed = new Discord.MessageEmbed() 23 | .setColor(genColour) 24 | .setImage(`https://dummyimage.com/50/${genColour.slice(1)}/&text=%20`) 25 | .setFooter(genColour); 26 | return message.channel.send('Here\'s your color!', { embed: embed }); 27 | } 28 | 29 | if (((color.indexOf("#") === 0) && color.length === 7) || (!isNaN(color) && color.length <= 8 && color < 16777215)) { 30 | const embed = await new Discord.MessageEmbed() 31 | .setColor(color) 32 | .setImage(`https://dummyimage.com/50/${color.slice(1)}/&text=%20`) 33 | .setFooter(color); 34 | return message.channel.send({ embed }); 35 | 36 | } else { 37 | return message.channel.send("Invalid Parameters!"); 38 | } 39 | } 40 | } -------------------------------------------------------------------------------- /commands/utility/img.js: -------------------------------------------------------------------------------- 1 | const { Command } = require('../../commando'); 2 | const Discord = require('discord.js'); 3 | const GoogleImages = require("google-images"); 4 | 5 | module.exports = class ImgCommand extends Command { 6 | constructor(client) { 7 | super(client, { 8 | name: 'img', 9 | aliases: ['google', 'image', 'googleimage'], 10 | group: 'utility', 11 | memberName: 'img', 12 | guildOnly: true, 13 | description: 'Searches for your query on google images!', 14 | examples: ['~img [query]'], 15 | details: 'Safe search is off for this command, please be considerate!', 16 | throttling: { 17 | usages: 1, 18 | duration: 5 19 | } 20 | }); 21 | } 22 | 23 | async run(message) { 24 | const gClient = new GoogleImages(process.env.GOOGLECSE, process.env.GOOGLEAPI); 25 | 26 | let search = message.content.split(/\s+/g).slice(1).join(" "); 27 | 28 | if (!search) return message.channel.send('Please specify something to search.'); 29 | 30 | if (search.length > 0) { 31 | try { 32 | const response = await gClient.search(search, { 33 | safe: "off" 34 | }); 35 | if (!response) { 36 | message.channel.send("Nothing Found!"); 37 | return; 38 | } else { 39 | let image = response[0].url; 40 | const embed = await new Discord.MessageEmbed() 41 | .setAuthor(`${search}`, 'https://a.safe.moe/F3RvU.png') 42 | .setColor(`#3369E8`) 43 | .setImage(image); 44 | message.channel.send({ embed }); 45 | } 46 | 47 | } catch (err) { 48 | message.channel.send("<:NOTLIKETHIIIIIIIIIIIIIIIIIIIIIIS:371071292146843658> Something went wrong with the search."); 49 | return console.error(err); 50 | } 51 | } else { 52 | return message.channel.send("Invalid Parameters(???)"); 53 | } 54 | } 55 | } -------------------------------------------------------------------------------- /commands/utility/math.js: -------------------------------------------------------------------------------- 1 | const { Command } = require('../../commando'); 2 | const Discord = require('discord.js'); 3 | const math = require('mathjs'); 4 | 5 | 6 | module.exports = class MathCommand extends Command { 7 | constructor(client) { 8 | super(client, { 9 | name: 'math', 10 | aliases: ['solve', 'calc'], 11 | group: 'utility', 12 | memberName: 'math', 13 | description: 'I\'ll do your math homework!', 14 | examples: ['~math [equation]'], 15 | throttling: { 16 | usages: 1, 17 | duration: 5 18 | }, 19 | args: [{ 20 | key: 'equation', 21 | prompt: 'Please provide me with an equation to solve!', 22 | type: 'string' 23 | }] 24 | }); 25 | } 26 | 27 | run(message, args) { 28 | var { equation } = args; 29 | try { 30 | var solution = math.eval(equation) 31 | } catch (err) { 32 | return message.channel.send(`❎ | I couldn\'t solve that equation! \`${err}\``) 33 | } 34 | 35 | const embed = new Discord.MessageEmbed() 36 | .setColor('#767CC1') 37 | .addField('**📥 Expression**', `\`\`\`${equation}\`\`\``) 38 | .addField('**📤 Result**', `\`\`\`${solution}\`\`\``); 39 | return message.channel.send({ embed }) 40 | 41 | } 42 | } -------------------------------------------------------------------------------- /commands/utility/remindme.js: -------------------------------------------------------------------------------- 1 | const { Command } = require('../../commando'); 2 | const moment = require('moment'); 3 | const sherlock = require('sherlockjs'); 4 | 5 | module.exports = class RemindMeCommand extends Command { 6 | constructor(client) { 7 | super(client, { 8 | name: 'remindme', 9 | aliases: ['remind', 'timer', 'alarm'], 10 | group: 'utility', 11 | memberName: 'remindme', 12 | description: 'I\'ll remind you of something!', 13 | details: 'This does not persist across restarts! Please keep it short!', 14 | guildOnly: true, 15 | throttling: { 16 | usages: 2, 17 | duration: 3 18 | }, 19 | 20 | args: [{ 21 | key: 'remind', 22 | label: 'reminder', 23 | prompt: 'what would you like me to remind you about?', 24 | type: 'string', 25 | }, 26 | { 27 | key: 'time', 28 | label: 'time', 29 | prompt: 'In how long would you like me to remind you?', 30 | type: 'string', 31 | validate: time => { 32 | const remindTime = sherlock.parse(time); 33 | if (!remindTime.startDate) return `please provide a valid starting time.`; 34 | 35 | return true; 36 | }, 37 | parse: time => sherlock.parse(time) 38 | } 39 | ] 40 | }); 41 | } 42 | 43 | async run(message, args) { 44 | const { remind, time } = args; 45 | 46 | const timer = time.startDate.getTime() - Date.now(); 47 | const preRemind = await message.channel.send(`Got it! I will remind you in **${moment().add(timer, 'ms').fromNow(true)}**! \`(${timer}ms)\``); 48 | const remindMessage = await new Promise(resolve => { 49 | setTimeout(() => resolve(message.author.send(`⏰ | ${remind}!`)), timer); 50 | }); 51 | 52 | return [preRemind, remindMessage]; 53 | } 54 | }; -------------------------------------------------------------------------------- /commands/utility/time.js: -------------------------------------------------------------------------------- 1 | const { Command } = require('../../commando'); 2 | const snekfetch = require('snekfetch'); 3 | const moment = require('moment'); 4 | const clocks = ["🕛", "🕐", "🕑", "🕒", "🕓", "🕔", "🕕", "🕖", "🕗", "🕘", "🕙", "🕚"] 5 | 6 | module.exports = class TimeCommand extends Command { 7 | constructor(client) { 8 | super(client, { 9 | name: 'time', 10 | aliases: ['clock'], 11 | group: 'utility', 12 | memberName: 'time', 13 | guildOnly: true, 14 | description: 'Shows the time for the given location!', 15 | examples: ['~time [city/country]'], 16 | throttling: { 17 | usages: 1, 18 | duration: 5 19 | } 20 | }); 21 | } 22 | 23 | async run(message) { 24 | const location = message.content.split(/\s+/g).slice(1).join(" "); 25 | if (!location) return message.channel.send('Please specify a location for me to gather information from!'); 26 | 27 | try { 28 | const res = await snekfetch.get(`https://time.is/${location.replace(/^in/, "")}`); 29 | if (res.status !== 200) { 30 | return message.channel.send('❎ | Could not connect to the server!') 31 | } 32 | 33 | const text = res.text || res.body.toString(); 34 | 35 | const date = text.match(new RegExp('
([^]+?)
'))[1] 36 | const time = text.match(/
([^]+?)<\/div>/)[1].replace(/(AM|PM)<\/span>/, ' $1') 37 | const place = text.match(/

Time in ([^]+?) now<\/h1>/)[1] 38 | const clock = clocks[parseInt(time.split(':')[0], 10) % 12] 39 | 40 | var parsedTime = moment(`${date} ${time}`, 'dddd, MMMM D, YYYY HH:mm:ss A') 41 | return message.channel.send(`${clock} | The time in **${place}** is \`${parsedTime.format('dddd, MMMM Do YYYY @ h:mm:ss a')}\`!`) 42 | 43 | } catch (err) { 44 | console.log(err) 45 | return message.channel.send(`❎ | Location **${location}** was not found!`); 46 | } 47 | 48 | } 49 | } -------------------------------------------------------------------------------- /commands/utility/translate.js: -------------------------------------------------------------------------------- 1 | const { Command } = require('../../commando'); 2 | const Discord = require('discord.js'); 3 | const translate = require('google-translate-api'); 4 | 5 | module.exports = class TranslateCommand extends Command { 6 | constructor(client) { 7 | super(client, { 8 | name: 'translate', 9 | aliases: ['tl', 'translate', 'trans'], 10 | group: 'utility', 11 | memberName: 'translate', 12 | guildOnly: true, 13 | description: 'Translates your text into the desired language!', 14 | examples: ['~translate [language] [text]'], 15 | throttling: { 16 | usages: 1, 17 | duration: 10 18 | } 19 | }); 20 | } 21 | 22 | run(message) { 23 | const lang = message.content.split(/\s+/g)[1]; 24 | const input = message.content.split(/\s+/g).slice(2).join(" "); 25 | 26 | if (!lang) { 27 | return message.channel.send('You must provide a language and some text to translate!') 28 | } 29 | 30 | try { 31 | translate(input, { to: lang }).then(res => { 32 | const embed = new Discord.MessageEmbed() 33 | .setAuthor('Translated Text:') 34 | .setColor('#4c8bf5') 35 | .setFooter('Google Translate', 'https://a.safe.moe/2jXgX.png') 36 | .addField(`📥 Input: \`[auto]\``, `\`\`\`${input}\`\`\``) 37 | .addField(`📤 Output: \`[${lang}]\``, `\`\`\`${res.text}\`\`\``); 38 | return message.channel.send({ embed }); 39 | }).catch(err => { 40 | return message.channel.send(`❎ | **${message.author.username}**, you provided an invalid language! Try using \`en\` as your first argument, and \`こむがりは可愛いねえ\` as your second!\n\`~translate en こむがりは可愛いねえ\``) 41 | }) 42 | 43 | } catch (err) { 44 | return message.channel.send(`<:NOTLIKETHIIIIIIIIIIIIIIIIIIIIIIS:371071292146843658> Something went wrong while executing that command! \`${err}\``); 45 | } 46 | } 47 | } -------------------------------------------------------------------------------- /commands/utility/youtube.js: -------------------------------------------------------------------------------- 1 | const { Command } = require('../../commando'); 2 | var youtube_node = require('youtube-node'); 3 | youtube = new youtube_node(); 4 | youtube.setKey(process.env.YOUTUBEKEY); 5 | youtube.addParam('type', 'video'); 6 | 7 | module.exports = class YouTubeCommand extends Command { 8 | constructor(client) { 9 | super(client, { 10 | name: 'youtube', 11 | aliases: ['yt', 'video'], 12 | group: 'utility', 13 | memberName: 'youtube', 14 | guildOnly: true, 15 | description: 'Searches for your query on YouTube!', 16 | examples: ['~youtube [query]'], 17 | throttling: { 18 | usages: 1, 19 | duration: 5 20 | } 21 | }); 22 | } 23 | 24 | run(message) { 25 | var query = message.content.split(/\s+/g).slice(1).join(" "); 26 | try { 27 | youtube.search(query, 1, function(error, result) { 28 | if (!query) { 29 | return message.channel.send('Please provide me with something to search!'); 30 | } 31 | if (error) { 32 | return message.channel.send("There was an error executing that search!"); 33 | 34 | } else { 35 | if (!result || !result.items || result.items.length < 1) { 36 | return message.channel.send(`No results found for **${query}**`); 37 | } else if (!result.items[0].id.videoId) { 38 | return message.channel.send(`No results found for **${query}**`); 39 | } else { 40 | return message.channel.send(`<:youtubBwwWOWWwowwWOWwthanks:341350435312893953> **${query}** (http://www.youtube.com/watch?v=${result.items[0].id.videoId})`); 41 | } 42 | } 43 | }); 44 | 45 | } catch (err) { 46 | return message.channel.send('<:NOTLIKETHIIIIIIIIIIIIIIIIIIIIIIS:371071292146843658> Something went wrong while executing that command!'); 47 | } 48 | } 49 | } -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "komugari", 3 | "version": "0.7.6", 4 | "description": "A simple, multi-functional Discord bot with a focus around anime and NSFW!", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1", 8 | "start": "node index.js" 9 | }, 10 | "repository": "github:Mitorisia/Komugari", 11 | "bugs": { 12 | "url": "https://github.com/Mitorisia/Komugari/issues" 13 | }, 14 | "homepage": "https://github.com/Mitorisia/Komugari#readme", 15 | "directories": { 16 | "doc": "docs" 17 | }, 18 | "keywords": [ 19 | "discord", 20 | "bot", 21 | "discord.js-commando", 22 | "discord.js" 23 | ], 24 | "engines": { 25 | "node": ">= 8.11.3", 26 | "npm": ">= 6.2.0" 27 | }, 28 | "author": "Mitorisia / Mako#8739", 29 | "license": "ISC", 30 | "dependencies": { 31 | "animequote": "^1.1.1", 32 | "booru": "^0.3.6", 33 | "bufferutil": "^3.0.2", 34 | "cleverbot-node": "^0.3.11", 35 | "common-tags": "^1.4.0", 36 | "discord.js": "github:hydrabolt/discord.js", 37 | "dotenv": "^4.0.0", 38 | "erlpack": "github:hammerandchisel/erlpack", 39 | "escape-string-regexp": "^1.0.5", 40 | "gifencoder": "^1.1.0", 41 | "google-images": "^2.1.0", 42 | "google-translate-api": "^2.3.0", 43 | "https": "^1.0.0", 44 | "jimp": "^0.2.28", 45 | "kitsu.js": "^2.0.0", 46 | "libsodium-wrappers": "^0.7.0", 47 | "mathjs": "^3.16.5", 48 | "moment": "^2.22.2", 49 | "moment-duration-format": "^1.3.0", 50 | "node-osu": "^1.3.0", 51 | "os-toolbox": "^0.2.9", 52 | "pornsearch": "^2.2.5", 53 | "random-puppy": "^1.1.0", 54 | "relevant-urban": "^2.0.0", 55 | "request": "^2.83.0", 56 | "require-all": "^2.2.0", 57 | "sherlockjs": "^1.3.7", 58 | "snekfetch": "^4.0.4", 59 | "util": "^0.10.3", 60 | "uws": "^8.14.1", 61 | "wanakana": "^2.3.1", 62 | "wikijs": "^3.1.4", 63 | "ws": "^3.2.0", 64 | "youtube-node": "^1.3.2", 65 | "zalgolize": "^1.2.4" 66 | }, 67 | "false": {} 68 | } 69 | --------------------------------------------------------------------------------