This commit is contained in:
Elizabeth
2017-07-12 19:33:31 -05:00
parent c80caedffe
commit afe98a18a4
181 changed files with 22 additions and 1 deletions
+142
View File
@@ -0,0 +1,142 @@
{
"extends": "eslint:recommended",
"env": {
"node": true,
"es6": true
},
"parserOptions": {
"ecmaVersion": 2017
},
"rules": {
"no-compare-neg-zero": "error",
"no-extra-parens": ["warn", "all", {
"nestedBinaryExpressions": false
}],
"no-template-curly-in-string": "error",
"no-unsafe-negation": "error",
"accessor-pairs": "warn",
"array-callback-return": "error",
"complexity": "warn",
"consistent-return": "error",
"curly": ["error", "multi-line", "consistent"],
"dot-location": ["error", "property"],
"dot-notation": "error",
"eqeqeq": "error",
"no-empty-function": "error",
"no-floating-decimal": "error",
"no-implied-eval": "error",
"no-invalid-this": "error",
"no-lone-blocks": "error",
"no-multi-spaces": "error",
"no-new-func": "error",
"no-new-wrappers": "error",
"no-new": "error",
"no-octal-escape": "error",
"no-return-assign": "error",
"no-return-await": "error",
"no-self-compare": "error",
"no-sequences": "error",
"no-throw-literal": "error",
"no-unmodified-loop-condition": "error",
"no-unused-expressions": "error",
"no-useless-call": "error",
"no-useless-concat": "error",
"no-useless-escape": "error",
"no-useless-return": "error",
"no-void": "error",
"no-warning-comments": "warn",
"prefer-promise-reject-errors": "error",
"require-await": "warn",
"wrap-iife": "error",
"yoda": "error",
"no-label-var": "error",
"no-shadow": "error",
"no-undef-init": "error",
"callback-return": "error",
"handle-callback-err": "error",
"no-mixed-requires": "error",
"no-new-require": "error",
"no-path-concat": "error",
"no-console": 0,
"no-var": "error",
"array-bracket-spacing": "error",
"block-spacing": "error",
"brace-style": ["error", "1tbs", { "allowSingleLine": true }],
"capitalized-comments": ["error", "always", { "ignoreConsecutiveComments": true }],
"comma-dangle": "error",
"comma-spacing": "error",
"comma-style": "error",
"computed-property-spacing": "error",
"consistent-this": "error",
"eol-last": "error",
"func-names": "error",
"func-style": ["error", "declaration", { "allowArrowFunctions": true }],
"indent": ["error", 4, { "SwitchCase": 1 }],
"key-spacing": "error",
"keyword-spacing": ["error", {
"overrides": {
"if": { "after": true },
"for": { "after": true },
"while": { "after": true },
"catch": { "after": true },
"switch": { "after": true }
}
}],
"max-depth": ["error", 6],
"max-len": ["error", 120, 2],
"max-nested-callbacks": ["error", { "max": 4 }],
"max-statements-per-line": ["error", { "max": 2 }],
"new-cap": "error",
"newline-per-chained-call": ["error", { "ignoreChainWithDepth": 5 }],
"no-array-constructor": "error",
"no-bitwise": "warn",
"no-inline-comments": "error",
"no-multiple-empty-lines": ["error", { "max": 2, "maxEOF": 1, "maxBOF": 0 }],
"no-new-object": "error",
"no-spaced-func": "error",
"no-trailing-spaces": "error",
"no-unneeded-ternary": "error",
"no-whitespace-before-property": "error",
"nonblock-statement-body-position": "error",
"object-curly-newline": "error",
"object-curly-spacing": ["error", "always"],
"operator-assignment": "error",
"operator-linebreak": ["error", "after"],
"padded-blocks": ["error", "never"],
"quote-props": ["error", "as-needed"],
"quotes": ["error", "single", { "avoidEscape": true, "allowTemplateLiterals": true }],
"semi-spacing": "error",
"semi": "error",
"space-before-blocks": "error",
"space-before-function-paren": ["error", {
"anonymous": "never",
"named": "never",
"asyncArrow": "always"
}],
"space-in-parens": "error",
"space-infix-ops": "error",
"space-unary-ops": "error",
"spaced-comment": "error",
"template-tag-spacing": "error",
"unicode-bom": "error",
"arrow-body-style": "error",
"arrow-parens": ["error", "always"],
"arrow-spacing": "error",
"no-duplicate-imports": "error",
"no-useless-computed-key": "error",
"no-useless-constructor": "error",
"prefer-arrow-callback": "error",
"prefer-const": "error",
"prefer-rest-params": "error",
"prefer-spread": "error",
"prefer-template": "error",
"rest-spread-spacing": "error",
"template-curly-spacing": "error",
"yield-star-spacing": "error"
}
}
+6
View File
@@ -0,0 +1,6 @@
# Packages
node_modules/
# Log Files
logs/
*.log
+16
View File
@@ -0,0 +1,16 @@
Internet Systems Consortium license
===================================
Copyright (c) 2017, dragonfire535
Permission to use, copy, modify, and/or distribute this software for any purpose
with or without fee is hereby granted, provided that the above copyright notice
and this permission notice appear in all copies.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
THIS SOFTWARE.
+18
View File
@@ -0,0 +1,18 @@
# XiaoBot
[![Discord](https://discordapp.com/api/guilds/252317073814978561/embed.png)](https://discord.gg/fqQF8mc)
[![Codacy](https://api.codacy.com/project/badge/Grade/2be44c0fadf64597b4e07f95d0f6a8ef)](https://www.codacy.com/app/dragonfire535/xiaobot)
Public Source Code for the Discord Bot XiaoBot, a Discord bot coded in
JavaScript with [discord.js](https://github.com/hydrabolt/discord.js) using the
[Commando](https://github.com/Gawdl3y/discord.js-commando) command framework.
## Adding it to Your Server
Visit XiaoBot's page on the Discord Bots list, which is quite fancy, with
[this link](https://discordbots.org/bot/278305350804045834).
## Home Server
You can join the home server with [this link](https://discord.gg/fqQF8mc).
## Licensing
The bot is licensed under an [ISC License](https://opensource.org/licenses/ISC).
See the file `LICENSE.md` for more information.
+4
View File
@@ -0,0 +1,4 @@
const { ShardingManager } = require('discord.js');
const { token } = require('./config');
const Manager = new ShardingManager('./XiaoBot.js', { token });
Manager.spawn();
+134
View File
@@ -0,0 +1,134 @@
const { token, owner, prefix, invite } = require('./config');
const path = require('path');
const { CommandoClient } = require('discord.js-commando');
const client = new CommandoClient({
commandPrefix: prefix,
owner,
invite,
disableEveryone: true,
unknownCommandResponse: false,
disabledEvents: [
'TYPING_START',
'VOICE_STATE_UPDATE',
'FRIEND_ADD',
'FRIEND_REMOVE'
],
messageCacheLifetime: 60,
messageSweepInterval: 60
});
const { carbon, dBots, dBotsOrg } = require('./structures/Util');
client.registry
.registerDefaultTypes()
.registerGroups([
['util', 'Utility'],
['user-info', 'User Info'],
['guild-info', 'Server Info'],
['moderation', 'Moderation'],
['random-res', 'Random Response'],
['random-img', 'Random Image'],
['image-edit', 'Image Manipulation'],
['avatar-edit', 'Avatar Manipulation'],
['text-edit', 'Text Manipulation'],
['num-edit', 'Number Manipulation'],
['search', 'Search'],
['games', 'Games'],
['random', 'Random/Other'],
['roleplay', 'Roleplay']
])
.registerDefaultCommands({
help: false,
ping: false,
prefix: false,
commandState: false
})
.registerCommandsIn(path.join(__dirname, 'commands'));
client.on('ready', () => {
console.log(`[READY] Shard ${client.shard.id} Logged in as ${client.user.tag} (${client.user.id})!`);
client.user.setGame(`${prefix}help | Shard ${client.shard.id}`);
});
client.on('disconnect', (event) => {
console.log(`[DISCONNECT] Shard ${client.shard.id} disconnected with Code ${event.code}.`);
process.exit(0);
});
client.on('error', console.error);
client.on('warn', console.warn);
client.on('commandError', (command, err) => console.error(command.name, err));
client.on('message', async (msg) => {
if (!msg.guild || msg.author.bot) return;
const topic = msg.guild.defaultChannel.topic || '';
if (!topic.toLowerCase().includes('<inviteguard>')) return;
const member = await msg.guild.fetchMember(msg.author);
if (member.hasPermission('ADMINISTRATOR')) return;
if (/(discord(\.gg\/|app\.com\/invite\/|\.me\/))/gi.test(msg.content)) {
if (msg.channel.permissionsFor(client.user).has('MANAGE_MESSAGES')) msg.delete();
msg.reply('Invites are prohibited from being posted here.');
}
});
client.on('guildMemberAdd', (member) => {
const channel = member.guild.channels.filter((c) => {
const topic = c.topic || '';
if (topic.includes('<memberlog>')) return true;
else return false;
}).first() || member.guild.channels.find('name', 'member-log');
if (!channel || !channel.permissionsFor(client.user).has('SEND_MESSAGES')) return;
const parseMsg = (topic) => {
if (!topic || !/(<joinmessage>.+<\/joinmessage>)/gi.test(topic)) return '';
const setting = topic.match(/(<joinmessage>.+<\/joinmessage>)/gi)[0];
return setting.slice(13, setting.length - 14)
.replace(/(\(member\))/gi, member.user.username)
.replace(/(\(server\))/gi, member.guild.name)
.replace(/(\(mention\))/gi, member.toString());
};
const msg = channel.topic ? parseMsg(channel.topic) : '';
channel.send(msg || `Welcome ${member.user.username}!`);
});
client.on('guildMemberRemove', (member) => {
const channel = member.guild.channels.filter((c) => {
const topic = c.topic || '';
if (topic.includes('<memberlog>')) return true;
else return false;
}).first() || member.guild.channels.find('name', 'member-log');
if (!channel || !channel.permissionsFor(client.user).has('SEND_MESSAGES')) return;
const parseMsg = (topic) => {
if (!topic || !/(<leavemessage>.+<\/leavemessage>)/gi.test(topic)) return '';
const setting = topic.match(/(<leavemessage>.+<\/leavemessage>)/gi)[0];
return setting.slice(14, setting.length - 15)
.replace(/(\(member\))/gi, member.user.username)
.replace(/(\(server\))/gi, member.guild.name)
.replace(/(\(mention\))/gi, member.toString());
};
const msg = channel.topic ? parseMsg(channel.topic) : '';
channel.send(msg || `Bye ${member.user.username}...`);
});
client.on('guildCreate', async (guild) => {
console.log(`[GUILD] I have joined ${guild.name}! (${guild.id})`);
const guilds = await client.shard.fetchClientValues('guilds.size');
const count = guilds.reduce((prev, val) => prev + val, 0);
carbon(count);
dBots(count, client.user.id);
dBotsOrg(count, client.user.id);
});
client.on('guildDelete', async (guild) => {
console.log(`[GUILD] I have left ${guild.name}... (${guild.id})`);
const guilds = await client.shard.fetchClientValues('guilds.size');
const count = guilds.reduce((prev, val) => prev + val, 0);
carbon(count);
dBots(count, client.user.id);
dBotsOrg(count, client.user.id);
});
client.login(token);
process.on('unhandledRejection', console.error);
Binary file not shown.
Binary file not shown.
Binary file not shown.

After

Width:  |  Height:  |  Size: 271 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 301 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 554 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 107 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 105 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 368 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 174 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 85 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 875 KiB

+22
View File
@@ -0,0 +1,22 @@
[
"It is certain",
"It is decidedly so",
"Without a doubt",
"Yes definitely",
"You may rely on it",
"As I see it, yes",
"Most likely",
"Outlook good",
"Yes",
"Signs point to yes",
"Reply hazy try again",
"Ask again later",
"Better not tell you now",
"Cannot predict now",
"Concentrate and ask again",
"Don't count on it",
"My reply is no",
"My sources say no",
"Outlook not so good",
"Very doubtful"
]
+104
View File
@@ -0,0 +1,104 @@
[
"Your smile is contagious.",
"You look great today.",
"You're a smart cookie.",
"I bet you make babies smile.",
"You have impeccable manners.",
"I like your style.",
"You have the best laugh.",
"I appreciate you.",
"You are the most perfect you there is.",
"You are enough.",
"You're strong.",
"Your perspective is refreshing.",
"You're an awesome friend.",
"You light up the room.",
"You shine brighter than a shooting star.",
"You deserve a hug right now.",
"You should be proud of yourself.",
"You're more helpful than you realize.",
"You have a great sense of humor.",
"You've got all the right moves!",
"Is that your picture next to 'charming' in the dictionary?",
"Your kindness is a balm to all who encounter it.",
"You're all that and a super-size bag of chips.",
"On a scale from 1 to 10, you're an 11.",
"You are brave.",
"You're even more beautiful on the inside than you are on the outside.",
"You have the courage of your convictions.",
"Your eyes are breathtaking.",
"If cartoon bluebirds were real, a bunch of them would be sitting on your shoulders singing right now.",
"You are making a difference.",
"You're like sunshine on a rainy day.",
"You bring out the best in other people.",
"Your ability to recall random factoids at just the right time is impressive.",
"You're a great listener.",
"How is it that you always look great, even in sweatpants?",
"Everything would be better if more people were like you!",
"I bet you sweat glitter.",
"You were cool way before hipsters were cool.",
"That color is perfect on you.",
"Hanging out with you is always a blast.",
"You always know -- and say -- exactly what I need to hear when I need to hear it.",
"You smell really good.",
"You may dance like no one's watching, but everyone's watching because you're an amazing dancer!",
"Being around you makes everything better!",
"When you say, 'I meant to do that,' I totally believe you.",
"When you're not afraid to be yourself is when you're most incredible.",
"Colors seem brighter when you're around.",
"You're more fun than a ball pit filled with candy. (And seriously, what could be more fun than that?)",
"That thing you don't like about yourself is what makes you so interesting.",
"You're wonderful.",
"You have cute elbows. For reals!",
"Jokes are funnier when you tell them.",
"You're better than a triple-scoop ice cream cone. With sprinkles.",
"Your bellybutton is kind of adorable.",
"Your hair looks stunning.",
"You're one of a kind!",
"You're inspiring.",
"If you were a box of crayons, you'd be the giant name-brand one with the built-in sharpener.",
"You should be thanked more often. So thank you!!",
"Our community is better because you're in it.",
"Someone is getting through something hard right now because you've got their back.",
"You have the best ideas.",
"You always know how to find that silver lining.",
"Everyone gets knocked down sometimes, but you always get back up and keep going.",
"You're a candle in the darkness.",
"You're a great example to others.",
"Being around you is like being on a happy little vacation.",
"You always know just what to say.",
"You're always learning new things and trying to better yourself, which is awesome.",
"If someone based an Internet meme on you, it would have impeccable grammar.",
"You could survive a Zombie apocalypse.",
"You're more fun than bubble wrap.",
"When you make a mistake, you fix it.",
"Who raised you? They deserve a medal for a job well done.",
"You're great at figuring stuff out.",
"Your voice is magnificent.",
"The people you love are lucky to have you in their lives.",
"You're like a breath of fresh air.",
"You're gorgeous -- and that's the least interesting thing about you, too.",
"You're so thoughtful.",
"Your creative potential seems limitless.",
"Your name suits you to a T.",
"You're irresistible when you blush.",
"Actions speak louder than words, and yours tell an incredible story.",
"Somehow you make time stop and fly at the same time.",
"When you make up your mind about something, nothing stands in your way.",
"You seem to really know who you are.",
"Any team would be lucky to have you on it.",
"In high school I bet you were voted 'most likely to keep being awesome.'",
"I bet you do the crossword puzzle in ink.",
"Babies and small animals probably love you.",
"If you were a scented candle they'd call it Perfectly Imperfect (and it would smell like summer).",
"There's ordinary, and then there's you.",
"You're someone's reason to smile.",
"You're even better than a unicorn, because you're real.",
"How do you keep being so funny and making everyone laugh?",
"You have a good head on your shoulders.",
"Has anyone ever told you that you have great posture?",
"The way you treasure your loved ones is incredible.",
"You're really something special.",
"You're a gift to those around you.",
"You don't deserve it."
]
+34
View File
@@ -0,0 +1,34 @@
[
"AUD",
"USD",
"BGN",
"BRL",
"CAD",
"CHF",
"CNY",
"CZK",
"DKK",
"GBP",
"HKD",
"HRK",
"HUF",
"IDR",
"ILS",
"INR",
"JPY",
"KRW",
"MXN",
"MYR",
"NOK",
"NZD",
"PHP",
"PLN",
"RON",
"RUB",
"SEK",
"SGD",
"THB",
"TRY",
"ZAR",
"EUR"
]
+48
View File
@@ -0,0 +1,48 @@
{
"if900hp": "All cars unlocked!",
"i'm an easter egg": "You're also an example.",
"not a valid tag": "No, it's not valid at all.",
"tag": "This command is *easter egg*, not *tag* :yum:",
"easter egg": ":egg:",
"snek": "*Blame :snake:*",
"snekfetch": "superagent is better.",
"xiaobot": "That's my name.",
"dragonfire535": "http://dragonfire535.tk",
"heroes of dreamland": "https://www.wattpad.com/story/8712240-heroes-of-dreamland-book-1-kirby-and-the-monstrous",
"neopets": "I got robbed by the pant devil.",
"koneko-chan": "https://i.ytimg.com/vi/YStwTmG4Ex0/hqdefault.jpg",
"shrug": "¯\\_(ツ)_/¯",
"vulcan": ":vulcan:",
"soundboard": "Rest in Peace...",
"me": "You.",
"no u": "no u",
"eat pant": "https://i.redd.it/226fiufo2slx.jpg",
"i never asked for this": "https://cdn.discordapp.com/attachments/252317073814978561/304811008457834516/image.jpg",
"egg": "You're an egg.",
"beta": "https://cdn.discordapp.com/attachments/252317073814978561/304812045851688963/image.jpg",
"pathetic": "https://cdn.discordapp.com/attachments/252317073814978561/304812045851688963/image.jpg",
"swagolor": "https://cdn.discordapp.com/attachments/252317073814978561/306110096491151363/Swagolor.png",
"canyounot": "Can YOU not?",
"slowclap": "*slow clap*",
"just do it": "https://www.youtube.com/watch?v=ZXsQAXx_ao0",
"april": "https://i.imgur.com/c60iG3E.png",
"captain karen": "https://i.imgur.com/8TFq5If.jpg",
"karen": "https://i.imgur.com/a4ZbCiO.png",
"rules": "https://i.imgur.com/PYeFBU5.png",
"book1": "Book.",
"new": "Nope, not quite yet.",
"adam": "Adam pls.",
"token": "[READACTED]",
"nom": "https://cdn.discordapp.com/attachments/256055608279695360/308434352377954304/tumblr_ojzfs3jjoJ1qz64n4o1_540.gif",
"good vs evil": "https://cdn.discordapp.com/attachments/256055608279695360/308404323392684033/837631b64ef351ddabe8c2200c2feca54d81af62_hq.jpg",
"ebearskittychan": "The best :heart:",
"i am your father": "NOOOOOOOOOOOOOO!",
"waifu": "I'm your waifu, right?",
"no": "yes",
"miki": "Pure Evil.",
"pokemon": "Gotta catch 'em all.",
"angery": "https://cdn.discordapp.com/attachments/256055608279695360/308701431165091840/angerey.png",
"banana": "https://cdn.discordapp.com/attachments/256055608279695360/308771979010244618/vfy6JExK7Ryhi.gif",
"yuno gasai": "https://cdn.discordapp.com/attachments/256055608279695360/308658394766508033/ff79c3c19cf7e6fdc00c1c26c204c3f6.jpg",
"why": "https://www.youtube.com/watch?v=sluHwh3hJhI"
}
+101
View File
@@ -0,0 +1,101 @@
[
"The billionth digit of Pi is 9.",
"Humans can survive underwater. But not for very long.",
"A nanosecond lasts one billionth of a second.",
"Honey does not spoil.",
"The atomic weight of Germanium is seven two point four six.",
"An ostrich's eye is bigger than its brain.",
"Rats cannot throw up.",
"Iguanas can stay underwater for twenty-eight point seven minutes.",
"The moon orbits the Earth every 27.32 days.",
"A gallon of water weighs 8.34 pounds.",
"According to Norse legend, thunder god Thor's chariot was pulled across the sky by two goats.",
"Tungsten has the highest melting point of any metal, at 3,410 degrees Celsius.",
"Gently cleaning the tongue twice a day is the most effective way to fight bad breath.",
"The Tariff Act of 1789, established to protect domestic manufacture, was the second salute ever enacted by the United States government.",
"The value of Pi is the ratio of any circle's circumference to its diameter in Euclidean space.",
"The Mexican-American War ended in 1848 with the signing of the Treaty of Guadalupe Hidalgo.",
"In 1879, Sandford Fleming first proposed the adoption of worldwide standardized time zones at the Royal Canadian Institute.",
"Marie Curie invented the theory of radioactivity, the treatment of radioactivity, and the dying of radioactivity.",
"At the end of The Seagull by Anton Chekhov, Konstantin kills himself.",
"Hot water freezes quicker than cold water.",
"The situation you are in is very dangerous.",
"Polymerase I polypeptide A is a human gene.",
"The sun is 333,330 times larger than Earth.",
"Dental floss has superb tensile strength.",
"Raseph, the Semitic god of war and plague, had a gazelle growing out of his forehead.",
"Human tapeworms can grow up to twenty-two point nine meters.",
"If you have trouble with simple counting, use the following mnemonic device: one comes before two comes before 60 comes after 12 comes before six trillion comes after 504. This should make your earlier counting difficulties seem like no big deal.",
"The first person to prove that cow's milk is drinkable was very, very thirsty.",
"Roman toothpaste was made with human urine. Urine as an ingredient in toothpaste continued to be used up until the 18th century.",
"Volcano-ologists are experts in the study of volcanoes.",
"In Victorian England, a commoner was not allowed to look directly at the Queen, due to a belief at the time that the poor had the ability to steal thoughts. Science now believes that less than 4 percent of poor people are able to do this.",
"Cellular phones will not give you cancer. Only hepatitis.",
"In Greek myth, Prometheus stole fire from the Gods and gave it to humankind. The jewelry he kept for himself.",
"The Schrodinger's cat paradox outlines a situation in which a cat in a box must be considered, for all intents and purposes, simultaneously alive and dead. Schrodinger created this paradox as a justification for killing cats.",
"In 1862, Abraham Lincoln signed the Emancipation Proclamation, freeing the slaves. Like everything he did, Lincoln freed the slaves while sleepwalking, and later had no memory of the event.",
"The plural of surgeon general is surgeons general. The past tense of surgeons general is surgeonsed general.",
"Contrary to popular belief, the Eskimo does not have one hundred different words for snow. They do, however, have two hundred and thirty-four words for fudge.",
"Halley's Comet can be viewed orbiting Earth every seventy-six years. For the other seventy-five, it retreats to the heart of the sun, where it hibernates undisturbed.",
"The first commercial airline flight took to the air in 1914. Everyone involved screamed the entire way.",
"Edmund Hillary, the first person to climb Mount Everest, did so accidentally while chasing a bird.",
"We will both die because of your negligence.",
"This is a bad plan. You will fail.",
"He will most likely kill you, violently.",
"He will most likely kill you.",
"You will be dead soon.",
"You are going to die in this room.",
"The Fact Sphere is a good person, whose insights are relevant.",
"The Fact Sphere is a good sphere, with many friends.",
"Dreams are the subconscious mind's way of reminding people to go to school naked and have their teeth fall out.",
"The square root of rope is string.",
"89 percent of magic tricks are not actually magic. Technically, they are sorcery.",
"At some point in their lives 1 in 6 children will be abducted by the Dutch.",
"According to most advanced algorithms, the world's best name is Craig.",
"To make a photocopier, simply photocopy a mirror.",
"Whales are twice as intelligent, and three times as delicious, as humans.",
"Pants were invented by sailors in the sixteenth century to avoid Poseiden's wrath. It was believed that the sight of naked sailors angered the sea god.",
"In Greek myth, the craftsman Daedalus invented human flight so a group of Minotaurs would stop teasing him about it.",
"The average life expectancy of a rhinoceros in captivity is 15 years.",
"China produces the world's second largest crop of soybeans.",
"In 1948, at the request of a dying boy, baseball legend Babe Ruth ate seventy-five hot dogs, then died of hot dog poisoning.",
"William Shakespeare did not exist. His plays were masterminded in 1589 by Francis Bacon, who used a Ouija board to enslave play-writing ghosts.",
"It is incorrectly noted that Thomas Edison invented push-ups in 1878. Nikolai Tesla had in fact patented the activity three years earlier, under the name Tesla-cize.",
"The automobile brake was not invented until 1895. Before this, someone had to remain in the car at all times, driving in circles until passengers returned from their errands.",
"The most poisonous fish in the world is the orange ruffy. Everything but its eyes are made of deadly poison. The ruffy's eyes are composed of a less harmful, deadly poison.",
"The occupation of court jester was invented accidentally, when a vassal's epilepsy was mistaken for capering.",
"Before the Wright Brothers invented the airplane, anyone wanting to fly anywhere was required to eat 200 pounds of helium.",
"Before the invention of scrambled eggs in 1912, the typical breakfast was either whole eggs still in the shell or scrambled rocks.",
"During the Great Depression, the Tennessee Valley Authority outlawed pet rabbits, forcing many to hot glue-gun long ears onto their pet mice.",
"The situation is hopeless.",
"Diamonds are made when coal is put under intense pressure. Diamonds put under intense pressure become foam pellets, commonly used today as packing material.",
"Corruption is at 25 percent.",
"Corruption is at 50 percent.",
"Fact: Space does not exist.",
"The Fact Sphere is not defective. Its facts are wholly accurate and very interesting.",
"The Fact Sphere is always right.",
"You will never go into space.",
"The Space Sphere will never go to space.",
"While the submarine is vastly superior to the boat in every way, over 97 percent of people still use boats for aquatic transportation.",
"The likelihood of you dying within the next five minutes is eighty-seven point six one percent.",
"The likelihood of you dying violently within the next five minutes is eighty-seven point six one percent.",
"You are about to get me killed.",
"The Fact Sphere is the most intelligent sphere.",
"The Fact Sphere is the most handsome sphere.",
"The Fact Sphere is incredibly handsome.",
"Sphere that insist of going into space are inferior to spheres who don't.",
"Whoever wins this battle is clearly superior, and will earn the allegiance of the Fact Sphere.",
"You could stand to lose a few pounds.",
"Avocados have the highest fiber and calories of any fruit.",
"Avocados have the highest fiber and calories of any fruit. They are found in Australians.",
"Every square inch of the human body has 32 million bacteria on it.",
"The average adult body contains half a pound of salt.",
"The Adventure Sphere is a blowhard and a coward.",
"Twelve. Twelve. Twelve. Twelve. Twelve. Twelve. Twelve. Twelve. Twelve. Twelve.",
"Pens. Pens. Pens. Pens. Pens. Pens. Pens.",
"Apples. Oranges. Pears. Plums. Kumquats. Tangerines. Lemons. Limes. Avocado. Tomoato. Banana. Papaya. Guava.",
"Error. Error. Error. File not found.",
"Error. Error. Error. Fact not found.",
"Fact not found.",
"Warning, sphere corruption at twenty-- rats cannot throw up."
]
+32
View File
@@ -0,0 +1,32 @@
[
"Do not seek so much to find the answer as much as to understand the question better.",
"You will soon be honored by someone you respect.",
"Happiness comes from a good life.",
"You are contemplating some action which will bring credit upon you.",
"Be prepared for extra energy.",
"You are admired for your adventurous ways.",
"The love of your life is sitting across from you.",
"Beauty is simply beauty. Originality is magical.",
"Never quit!",
"Today is an ideal time to water your personal garden.",
"Questions provide the key to unlocking our unlimited potential.",
"Expect great things and great things will come.",
"The Greatest War Sometimes Isn't On The Battlefield But Against Oneself.",
"Become who you are.",
"In case of fire, keep calm, pay bill and run.",
"Anyone who dares to be, can never be weak.",
"You broke my cookie!",
"Dream lofty dreams, and as you dream, so shall you become.",
"You've got what it takes, but it will take everything you've got!",
"Trust your intuition.",
"The wise are aware of their treasure, while fools follow their vanity.",
"You will always have good luck in your personal affairs.",
"You don't need talent to gain experience.",
"All the preparation you've done will finally be paying off!",
"Determination is the wake-up call to the human will.",
"The most useless energy is trying to change what and who God so carefully created.",
"You cannot become rich except by enriching others.",
"Your happiness is intertwined with your outlook on life.",
"Sing and rejoice, fortune is smiling on you.",
"Well-arranged time is the surest sign of a well-arranged mind."
]
+14
View File
@@ -0,0 +1,14 @@
[
"capricorn",
"aquarius",
"pisces",
"aries",
"taurus",
"gemini",
"cancer",
"leo",
"virgo",
"libra",
"scorpio",
"sagittarius"
]
+8
View File
@@ -0,0 +1,8 @@
[
"Maybe someday",
"Nothing",
"Neither",
"I don't think so",
"Yes",
"Try asking again"
]
+21
View File
@@ -0,0 +1,21 @@
{
"operations": [
"+",
"-",
"*"
],
"difficulties": [
"easy",
"medium",
"hard",
"extreme",
"impossible"
],
"maxValues": {
"easy": 10,
"medium": 50,
"hard": 100,
"extreme": 1000,
"impossible": 10000
}
}
+97
View File
@@ -0,0 +1,97 @@
[
"tenguy",
"afraid",
"older",
"aag",
"tried",
"biw",
"blb",
"kermit",
"bd",
"ch",
"cbg",
"wonka",
"cb",
"keanu",
"dsm",
"live",
"ants",
"doge",
"alwaysonbeat",
"ermg",
"facepalm",
"fwp",
"fa",
"fbf",
"fry",
"hipster",
"icanhas",
"crazypills",
"mw",
"noidea",
"regret",
"boat",
"hagrid",
"sohappy",
"captain",
"inigo",
"iw",
"ackbar",
"happening",
"joker",
"ive",
"ll",
"morpheus",
"mb",
"badchoice",
"mmm",
"jetpack",
"red",
"mordor",
"oprah",
"oag",
"remembers",
"philosoraptor",
"jw",
"patrick",
"rollsafe",
"sad-obama",
"sad-clinton",
"sadfrog",
"sad-bush",
"sad-biden",
"sad-boehner",
"saltbae",
"sarcasticbear",
"dwight",
"sb",
"ss",
"sf",
"dodgson",
"money",
"sohot",
"nice",
"awesome-awkward",
"awesome",
"awkward-awesome",
"awkward",
"fetch",
"success",
"scc",
"ski",
"officespace",
"interesting",
"toohigh",
"bs",
"center",
"both",
"winter",
"xy",
"buzz",
"yodawg",
"uno",
"yallgot",
"bad",
"elf",
"chosen"
]
+42
View File
@@ -0,0 +1,42 @@
{
"a": ".-",
"b": "-...",
"c": "-.-.",
"d": "-..",
"e": ".",
"f": "..-.",
"g": "--.",
"h": "....",
"i": "..",
"j": ".---",
"k": "-.-",
"l": ".-..",
"m": "--",
"n": "-.",
"o": "---",
"p": ".--.",
"q": "--.-",
"r": ".-.",
"s": "...",
"t": "-",
"u": "..-",
"v": "...-",
"w": ".--",
"x": "-..-",
"y": "-.--",
"z": "--..",
"0": "-----",
"1": ".----",
"2": "..---",
"3": "...--",
"4": "....-",
"5": ".....",
"6": "-....",
"7": "--...",
"8": "---..",
"9": "----.",
".": ".-.-.-",
"?": "..--..",
",": "--..--",
"'": ".----."
}
+221
View File
@@ -0,0 +1,221 @@
{
"lastNames": [
"Walker",
"Tworni",
"Ross",
"Smith",
"Odendahl",
"Deere",
"Brown",
"Williams",
"Jones",
"Miles",
"Moss",
"Roberto",
"McFly",
"McDonald",
"Lewis",
"Armstrong",
"Stevenson",
"Schwarzenegger",
"Robinson",
"Parker",
"Piper",
"Johnson",
"Brantley",
"Stewart",
"Ree",
"Talbot",
"Seville",
"Peace",
"Spielberg",
"Baggins",
"Wilborn",
"Vankirk",
"Shireman",
"Jimerson",
"Masters",
"Hack",
"Satcher",
"Younkin",
"Aguila",
"Duffey",
"Burgin",
"Highfall",
"Wee",
"Solari",
"Tomaselli",
"Basler",
"Difranco",
"Latch",
"Rives",
"Dolan",
"Abraham",
"Holter",
"Portugal",
"Lininger",
"Holst",
"Mccroy",
"Follmer",
"Hotchkiss",
"Gassaway",
"Wang",
"Agron",
"Raasch",
"Gourd",
"Czaja",
"Marquart",
"Papadopoulos",
"Ringer",
"Lax",
"Sperling",
"Galusha",
"Alston"
],
"maleNames": [
"Bob",
"Daniel",
"Logan",
"Chris",
"Nathan",
"George",
"Mart",
"Charlie",
"Felix",
"Ralph",
"William",
"Max",
"Jerry",
"Marty",
"Joshua",
"Cody",
"Richard",
"Alex",
"Alexander",
"Jordan",
"Zachary",
"Bill",
"Alfred",
"Bruce",
"Caiden",
"Calvin",
"Eric",
"Robert",
"Mark",
"Miles",
"Nash",
"Ronald",
"Ivan",
"Edgar",
"Royal",
"Augustine",
"Dominic",
"Noel",
"Rocky",
"Grover",
"Paul",
"Jeremy",
"Stevie",
"Brock",
"Jc",
"Tony",
"Enoch",
"Zachery",
"Harvey",
"Gilbert",
"Chang",
"Emery",
"Carroll",
"Odell",
"Jean",
"Archie",
"Russ",
"Barry",
"Lowell",
"Jacob",
"Riku",
"Frederic",
"Levi",
"Faustino",
"Leland",
"Domenic",
"Irwin",
"Moises",
"Louie",
"Larry",
"Victor"
],
"femaleNames": [
"Elizabeth",
"Chelsey",
"Rachel",
"Logan",
"Alex",
"Jordan",
"Mary",
"Shirley",
"Sandy",
"Linda",
"Audrey",
"Autumn",
"Gracie",
"Grace",
"Erin",
"Catherine",
"Stephanie",
"Lucy",
"Patty",
"Julie",
"Christina",
"Fiona",
"Riley",
"Ashley",
"Bree",
"Lucila",
"Wendi",
"Evangelina",
"Ricki",
"Merna",
"Tegan",
"Venus",
"Claris",
"Tana",
"Sakura",
"Edythe",
"Adena",
"Princess",
"Elnora",
"Star",
"Edyth",
"Beverly",
"Kelsie",
"Letha",
"Latisha",
"Lolita",
"Bernandine",
"Jessenia",
"Hannah",
"Leonore",
"Alene",
"Fannie",
"Bernardine",
"Leena",
"Tera",
"Yvette",
"Melisa",
"Alissa",
"Xiao",
"Richelle",
"Bridgett",
"Sumiko",
"Paulette",
"Charlott",
"Honey",
"Veola",
"Sherita",
"Amanda",
"Vannessa",
"April",
"Ruth"
]
}
+154
View File
@@ -0,0 +1,154 @@
{
"address": "port o' call",
"admin": "helm",
"am": "be",
"an": "a",
"and": "n'",
"are": "be",
"award": "prize",
"bathroom": "head",
"beer": "grog",
"before": "afore",
"belief": "creed",
"between": "betwixt",
"big": "vast",
"bill": "coin",
"bills": "coins",
"boss": "admiral",
"bourbon": "rum",
"box": "barrel",
"boy": "lad",
"buddy": "mate",
"business": "company",
"businesses": "companies",
"calling": "callin'",
"canada": "Great North",
"cash": "coin",
"cat": "parrot",
"cheat": "hornswaggle",
"comes": "hails",
"comments": "yer words",
"cool": "shipshape",
"country": "land",
"dashboard": "shanty",
"dead": "in Davy Jones's Locker",
"disconnect": "keelhaul",
"do": "d'",
"dog": "parrot",
"dollar": "doubloon",
"dollars": "doubloons",
"dude": "pirate",
"employee": "crew",
"everyone": "all hands",
"eye": "eye-patch",
"family": "kin",
"fee": "debt",
"female": "wench",
"females": "wenches",
"food": "grub",
"for": "fer",
"friend": "mate",
"friends": "crew",
"fuck": "shiver me timbers",
"gin": "rum",
"girl": "lass",
"girls": "lassies",
"go": "sail",
"good": "jolly good",
"grave": "Davy Jones's Locker",
"group": "maties",
"gun": "bluderbuss",
"haha": "yo ho",
"hahaha": "yo ho ho",
"hahahaha": "yo ho ho ho",
"hand": "hook",
"happy": "grog-filled",
"hello": "ahoy",
"hey": "ahoy",
"hi": "ahoy",
"hotel": "fleebag inn",
"i": "me",
"i'm": "i be",
"internet": "series o' tubes",
"invalid": "sunk",
"is": "be",
"island": "isle",
"isn't": "be not",
"it's": "'tis",
"jail": "brig",
"kill": "keelhaul",
"king": "king",
"ladies": "lasses",
"lady": "lass",
"lawyer": "scurvy land lubber",
"left": "port",
"leg": "peg",
"logout": "walk the plank",
"lol": "blimey",
"male": "pirate",
"man": "pirate",
"manager": "admiral",
"money": "doubloons",
"month": "moon",
"my": "me",
"never": "nary",
"no": "nay",
"not": "nay",
"of": "o'",
"old": "barnacle-covered",
"omg": "shiver me timbers",
"over": "o'er",
"page": "parchment",
"people": "scallywags",
"person": "scurvy dog",
"posted": "tacked to the yardarm",
"president": "king",
"prison": "brig",
"quickly": "smartly",
"really": "verily",
"relative": "kin",
"relatives": "kin",
"religion": "creed",
"restaurant": "galley",
"right": "starboard",
"rotf": "rollin' on the decks",
"say": "cry",
"seconds": "ticks o' tha clock",
"shipping": "cargo",
"shit": "shiver me timbers",
"small": "puny",
"snack": "grub",
"soldier": "sailor",
"sorry": "yarr",
"spouse": "ball 'n' chain",
"state": "land",
"supervisor": "Cap'n",
"that's": "that be",
"the": "thar",
"theif": "swoggler",
"them": "'em",
"this": "dis",
"to": "t'",
"together": "t'gether",
"treasure": "booty",
"vodka": "rum",
"was": "be",
"water": "grog",
"we": "our jolly crew",
"we're": "we's",
"whiskey": "rum",
"whisky": "rum",
"wine": "grog",
"with": "wit'",
"woman": "comely wench",
"women": "beauties",
"work": "duty",
"yah": "aye",
"yeah": "aye",
"yes": "aye",
"you": "ye",
"you're": "you be",
"you've": "ye",
"your": "yer",
"yup": "aye"
}
+154
View File
@@ -0,0 +1,154 @@
{
"bulbasaur": "1",
"ivysaur": "2",
"venusaur": "3",
"charmander": "4",
"charmeleon": "5",
"charizard": "6",
"squirtle": "7",
"wartortle": "8",
"blastoise": "9",
"caterpie": "10",
"metapod": "11",
"butterfree": "12",
"weedle": "13",
"kakuna": "14",
"beedrill": "15",
"pidgey": "16",
"pidgeotto": "17",
"pidgeot": "18",
"rattata": "19",
"raticate": "20",
"spearow": "21",
"fearow": "22",
"ekans": "23",
"arbok": "24",
"pikachu": "25",
"raichu": "26",
"sandshrew": "27",
"sandslash": "28",
"nidoranf": "29",
"nidorina": "30",
"nidoqueen": "31",
"nidoranm": "32",
"nidorino": "33",
"nidoking": "34",
"clefairy": "35",
"clefable": "36",
"vulpix": "37",
"ninetales": "38",
"jigglypuff": "39",
"wigglytuff": "40",
"zubat": "41",
"golbat": "42",
"oddish": "43",
"gloom": "44",
"vileplume": "45",
"paras": "46",
"parasect": "47",
"venonat": "48",
"venomoth": "49",
"diglett": "50",
"dugtrio": "51",
"meowth": "52",
"persian": "53",
"psyduck": "54",
"golduck": "55",
"mankey": "56",
"primeape": "57",
"growlithe": "58",
"arcanine": "59",
"poliwag": "60",
"poliwhirl": "61",
"poliwrath": "62",
"abra": "63",
"kadabra": "64",
"alakazam": "65",
"machop": "66",
"machoke": "67",
"machamp": "68",
"bellsprout": "69",
"weepinbell": "70",
"victreebel": "71",
"tentacool": "72",
"tentacruel": "73",
"geodude": "74",
"graveler": "75",
"golem": "76",
"ponyta": "77",
"rapidash": "78",
"slowpoke": "79",
"slowbro": "80",
"magnemite": "81",
"magneton": "82",
"farfetch'd": "83",
"doduo": "84",
"dodrio": "85",
"seel": "86",
"dewgong": "87",
"grimer": "88",
"muk": "89",
"shellder": "90",
"cloyster": "91",
"gastly": "92",
"haunter": "93",
"gengar": "94",
"onix": "95",
"drowzee": "96",
"hypno": "97",
"krabby": "98",
"kingler": "99",
"voltorb": "100",
"electrode": "101",
"exeggcute": "102",
"exeggutor": "103",
"cubone": "104",
"marowak": "105",
"hitmonlee": "106",
"hitmonchan": "107",
"lickitung": "108",
"koffing": "109",
"weezing": "110",
"rhyhorn": "111",
"rhydon": "112",
"chansey": "113",
"tangela": "114",
"kangaskhan": "115",
"horsea": "116",
"seadra": "117",
"goldeen": "118",
"seaking": "119",
"staryu": "120",
"starmie": "121",
"mr. mime": "122",
"scyther": "123",
"jynx": "124",
"electabuzz": "125",
"magmar": "126",
"pinsir": "127",
"tauros": "128",
"magikarp": "129",
"gyarados": "130",
"lapras": "131",
"ditto": "132",
"eevee": "133",
"vaporeon": "134",
"jolteon": "135",
"flareon": "136",
"porygon": "137",
"omanyte": "138",
"omastar": "139",
"kabuto": "140",
"kabutops": "141",
"aerodactyl": "142",
"snorlax": "143",
"articuno": "144",
"zapdos": "145",
"moltres": "146",
"dratini": "147",
"dragonair": "148",
"dragonite": "149",
"mewtwo": "150",
"mew": "151",
"missingno.": "0"
}
+36
View File
@@ -0,0 +1,36 @@
[
"*puts you in the oven*",
"You're so stupid.",
"Sorry, I can't hear you over how annoying you are.",
"I've got better things to do.",
"You're as dumb as Cleverbot.",
"Your IQ is lower than the Mariana Trench.",
"You're so annoying even the flies stay away from your stench.",
"Go away, please.",
"I'd give you a nasty look but you've already got one.",
"It looks like your face caught fire and someone tried to put it out with a hammer.",
"Your family tree must be a cactus because everyone on it is a prick.",
"Someday you will go far, and I hope you stay there.",
"The zoo called. They're wondering how you got out of your cage.",
"I was hoping for a battle of wits, but you appear to be unarmed.",
"You are proof that evolution can go in reverse.",
"Brains aren't everything, in your case, they're nothing.",
"Sorry I didn't get that, I don't speak idiot.",
"Why is it acceptable for you to be an idiot, but not for me to point it out?",
"We all sprang from apes, but you did not spring far enough.",
"You're an unknown command.",
"If you could go anywhere I chose, I'd choose dead.",
"Even monkeys can go to space, so clearly you lack some potential.",
"It's brains over brawn, yet you have neither.",
"You look like a monkey, and you smell like one too.",
"Even among idiots you're lacking.",
"You fail even when you're doing absolutely nothing.",
"If there was a vote for 'least likely to succeed' you'd win first prize.",
"I'm surrounded by idiots... Or, wait, that's just you.",
"I wanna go home. Well, really I just want to get away from the awful aroma you've got going there.",
"Every time you touch me I have to go home and wash all my clothes nine times just to get a normal smell back.",
"If I had a dollar for every brain you don't have, I'd have one dollar.",
"I'd help you succeed but you're incapable.",
"Your hairline is built like a graph chart, positive and negative forces attract but the clippers and your hair repel",
"I know a good joke! You!"
]
+231
View File
@@ -0,0 +1,231 @@
{
"i": "tem",
"hi": "hoi",
"that": "dat",
"that's": "dat",
"hello": "hoi",
"me": "temmie",
"goodbye": "boi",
"bye": "boi",
"later": "boi",
"college": "colleg",
"money": "muns",
"food": "tem flakes",
"snack": "tem flakes",
"snacks": "tem flakes",
"meal": "tem flakes",
"meals": "tem flakes",
"human": "hooman",
"humans": "hoomans",
"chocolate": "choco",
"cute": "coot",
"allergic": "allergics",
"allergy": "allergics",
"do": "dos",
"does": "dos",
"what": "ppppppppp...",
"who": "ppppppppp...",
"when": "ppppppppp...",
"why": "ppppppppp...",
"where": "ppppppppp...",
"how": "ppppppppp...",
"xd": "xd",
"but": "b-but",
"store": "tem shop",
"restaurant": "tem shop",
"shop": "tem shop",
"temmie": "temmiy",
"sick": "holves",
"illness": "holves",
"ill": "holves",
"disease": "holves",
"cat": "tem",
"dog": "tem",
"hugs": "pets",
"pats": "pets",
"waves": "pets",
"high-fives": "pets",
"fistbumps": "pets",
"hug": "pet",
"pat": "pet",
"wave": "pet",
"high-five": "pet",
"fistbump": "pet",
"hungry": "hungr",
"muscles": "not coot",
"aw": "awwawa",
"yikes": "omg!",
"ah": "omg!",
"oh": "omg!",
"yipe": "omg!",
"wait": "omg!",
"yes": "yee!",
"no": "no!",
"person": "bark",
"monster": "munster",
"monsters": "munsters",
"great": "tem outta tem",
"awesome": "tem outta tem",
"cool": "tem outta tem",
"nice": "tem outta tem",
"good": "tem outta tem",
"walks": "vibrates",
"moves": "vibrates",
"sits": "vibrates",
"goes": "vibrates",
"runs": "vibrates intensely",
"climbs": "vibrates intensely",
"escapes": "vibrates intensely",
"normal": "bob",
"hmm": "p...",
"okay": "ok",
"lol": "lel",
"enemy": "special enemy",
"villain": "special enemy",
"badguy": "special enemy",
"school": "skool",
"um": "p...",
"elizabeth": "ebears",
"yeah": "yaya",
"yea": "yaya",
"uh-huh": "yaya",
"vampire": "wampire",
"tired": "*dies*",
"exhausted": "*dies*",
"bored": "*dies*",
"annoyed": "*dies*",
"irritated": "*dies*",
"mad": "*dies*",
"sleepy": "*dies*",
"confused": "*dies*",
"house": "tem villag",
"home": "tem villag",
"apartment": "tem villag",
"world": "undergroun",
"hotel": "mtt resort",
"motel": "mtt resort",
"inn": "mtt resort",
"cash": "g",
"gold": "g",
"jewels": "g",
"aaron": "not coot",
"boy": "tim",
"girl": "tem",
"we": "tems",
"you": "u",
"your": "ur",
"yours": "urs",
"there": "dere",
"proud": "prouds",
"random": "rando",
"see": "c",
"this": "dis",
"egg": "eg",
"very": "very!",
"excited": "excite",
"doesn't": "don't",
"sleep": "slep",
"noodles": "alphys foob",
"scream": "screems",
"gonna": "gunna",
"pasta": "papy foob",
"spaghetti": "papy foob",
"scary": "scaredy",
"frightening": "scaredy",
"worry": "worrys",
"worries": "worrys",
"sushi": "undyne foob",
"banana": "bernerner",
"bananas": "bernerners",
"apple": "oppl",
"apples": "oppls",
"grape": "grep",
"grapes": "greps",
"wonder": "wunders",
"wonders": "wunders",
"wondering": "wunders",
"wonderful": "wunderfull",
"think": "finks",
"thinks": "finks",
"thought": "finked",
"beat": "dunks",
"defeat": "dunks",
"defeated": "dunkd",
"they're": "their",
"their": "there",
"you're": "ur",
"because": "cuz",
"bc": "cuz",
"will": "wil",
"things": "thins",
"thing": "thin",
"science": "scienc",
"ice cream": "noice creem",
"spear": "speer",
"baby": "temini",
"babies": "teminis",
"child": "temini",
"children": "teminis",
"kid": "temini",
"kids": "teminis",
"bot": "xiao",
"robot": "mettatun",
"ghost": "bluuk",
"nap": "slep",
"boop": "blep",
"beep": "blep",
"bleep": "blep",
"bop": "blep",
"spider": "spoider",
"spiders": "sploiders",
"music": "moosics",
"again": "agin",
"the": "teh",
"family": "fam",
"smart": "smarts",
"smartness": "smartiness",
"intelligence": "smartiness",
"typo": "tpyo",
"typo'd": "tyop'd",
"typos": "typoys",
"yay": "yee",
"potato": "tato",
"potatoes": "tatos",
"fry": "fri",
"fries": "fri",
"burger": "glamburg",
"steak": "stek",
"heart": "hart",
"love": "lub",
"hate": "h8",
"like": "liek",
"library": "librarby",
"fire": "flemz",
"flame": "flemz",
"fires": "flemz",
"flames": "flemz",
"witchcraft": "magics",
"witchcrafts": "magics",
"magic": "magics",
"sorcery": "magics",
"superpower": "magics",
"superpowers": "magics",
"sorceries": "magics",
"and": "n",
"my": "tem's",
"mine": "tem's",
"everyone": "everytem",
"anyone": "anytem",
"someone": "sometem",
"everbody": "everytemmie",
"anybody": "anytemmie",
"somebody": "sometemmie",
"beautiful": "booftifull",
"pretty": "prety",
"so": "soooo",
"help": "halp",
"uh-uh": "nuh",
"nope": "nuh",
"nuh-uh": "nuh",
"please": "pls"
}
+95
View File
@@ -0,0 +1,95 @@
{
"az": "Azerbaijan",
"sq": "Albanian",
"am": "Amharic",
"en": "English",
"ar": "Arabic",
"hy": "Armenian",
"af": "Afrikaans",
"eu": "Basque",
"ba": "Bashkir",
"be": "Belarusian",
"bn": "Bengali",
"my": "Burmese",
"bg": "Bulgarian",
"bs": "Bosnian",
"cy": "Welsh",
"hu": "Hungarian",
"vi": "Vietnamese",
"ht": "Haitian (Creole)",
"gl": "Galician",
"nl": "Dutch",
"mrj": "Hill Mari",
"el": "Greek",
"ka": "Georgian",
"gu": "Gujarati",
"da": "Danish",
"he": "Hebrew",
"yi": "Yiddish",
"id": "Indonesian",
"ga": "Irish",
"it": "Italian",
"is": "Icelandic",
"es": "Spanish",
"kk": "Kazakh",
"kn": "Kannada",
"ca": "Catalan",
"ky": "Kyrgyz",
"zh": "Chinese",
"ko": "Korean",
"xh": "Xhosa",
"km": "Khmer",
"lo": "Laotian",
"la": "Latin",
"lv": "Latvian",
"lt": "Lithuanian",
"lb": "Luxembourgish",
"mg": "Malagasy",
"ms": "Malay",
"ml": "Malayalam",
"mt": "Maltese",
"mk": "Macedonian",
"mi": "Maori",
"mr": "Marathi",
"mhr": "Mari",
"mn": "Mongolian",
"de": "German",
"ne": "Nepali",
"no": "Norwegian",
"pa": "Punjabi",
"pap": "Papiamento",
"fa": "Persian",
"pl": "Polish",
"pt": "Portuguese",
"ro": "Romanian",
"ru": "Russian",
"ceb": "Cebuano",
"sr": "Serbian",
"si": "Sinhala",
"sk": "Slovakian",
"sl": "Slovenian",
"sw": "Swahili",
"su": "Sundanese",
"tg": "Tajik",
"th": "Thai",
"tl": "Tagalog",
"ta": "Tamil",
"tt": "Tatar",
"te": "Telugu",
"tr": "Turkish",
"udm": "Udmurt",
"uz": "Uzbek",
"uk": "Ukranian",
"ur": "Urdu",
"fi": "Finnish",
"fr": "French",
"hi": "Hindi",
"hr": "Croatian",
"cs": "Czech",
"sv": "Swedish",
"gd": "Scottish",
"et": "Estonian",
"eo": "Esperanto",
"jv": "Javanese",
"ja": "Japanese"
}
+48
View File
@@ -0,0 +1,48 @@
{
"sentences": [
"The quick brown fox jumps over the lazy dog.",
"Buffalo buffalo Buffalo buffalo buffalo buffalo Buffalo buffalo.",
"How razorback-jumping frogs can level six piqued gymnasts!",
"Amazingly few discotheques provide jukeboxes.",
"I am so blue I'm greener than purple.",
"I stepped on a Corn Flake, now I'm a Cereal Killer.",
"On a scale from one to ten what is your favourite colour of the alphabet?",
"The sparkly lamp ate a pillow then punched Larry.",
"My world is where everybody is a pony and we all eat rainbows and poop butterflies.",
"If your canoe is stuck in a tree with the headlights on, how many pancakes does it take to get to the moon?",
"There's a purple mushroom in my backyard, screaming Taco's!",
"When life gives you lemons, chuck them at people you hate.",
"I think I will buy the red car, or I will lease the blue one.",
"Italy is my favorite country; in fact, I plan to spend two weeks there next year.",
"She borrowed the book from him many years ago and hasn't yet returned it.",
"Lets all be unique together until we realise we are all the same.",
"If Purple People Eaters are real… where do they find purple people to eat?",
"The waves were crashing on the shore; it was a lovely sight.",
"This is the last random sentence I will be writing and I am going to stop mid-sent.",
"The memory we used to share is no longer coherent.",
"She did not cheat on the test, for it was not the right thing to do.",
"She only paints with bold colors; she does not like pastels.",
"Malls are great places to shop; I can find everything I need under one roof.",
"The body may perhaps compensates for the loss of a true metaphysics.",
"They got there early, and they got really good seats.",
"Everyone was busy, so I went to the movie alone.",
"Yeah, I think it's a good environment for learning English.",
"I would have gotten the promotion, but my attendance wasnt good enough.",
"There were white out conditions in the town; subsequently, the roads were impassable.",
"If you like tuna and tomato sauce- try combining the two. Its really not as bad as it sounds."
],
"difficulties": [
"easy",
"medium",
"hard",
"extreme",
"impossible"
],
"times": {
"easy": 25000,
"medium": 20000,
"hard": 15000,
"extreme": 10000,
"impossible": 5000
}
}
+54
View File
@@ -0,0 +1,54 @@
{
"a": "ɐ",
"b": "q",
"c": "ɔ",
"d": "p",
"e": "ǝ",
"f": "ɟ",
"g": "ƃ",
"h": "ɥ",
"i": "ᴉ",
"j": "ɾ",
"k": "ʞ",
"m": "ɯ",
"n": "u",
"p": "d",
"q": "b",
"r": "ɹ",
"t": "ʇ",
"u": "n",
"v": "ʌ",
"w": "ʍ",
"y": "ʎ",
"A": "∀",
"C": "Ɔ",
"E": "Ǝ",
"F": "Ⅎ",
"G": "פ",
"J": "ſ",
"L": "˥",
"M": "W",
"P": "Ԁ",
"T": "┴",
"U": "∩",
"V": "Λ",
"W": "M",
"Y": "⅄",
"1": "Ɩ",
"2": "ᄅ",
"3": "Ɛ",
"4": "ㄣ",
"5": "ϛ",
"6": "9",
"7": "ㄥ",
"9": "6",
",": "'",
".": "˙",
"'": ",",
"\"": ",,",
"_": "‾",
"&": "⅋",
"!": "¡",
"?": "¿",
"`": ","
}
+6
View File
@@ -0,0 +1,6 @@
{
"online": "<:online:313956277808005120> Online",
"idle": "<:away:313956277220802560> Idle",
"dnd": "<:dnd:313956276893646850> Do Not Disturb",
"offline": "<:offline:313956277237710868> Offline"
}
+42
View File
@@ -0,0 +1,42 @@
[
"https://www.youtube.com/watch?v=ebAKoRcYFTA",
"https://www.youtube.com/watch?v=Mqps4anhz0Q",
"https://www.youtube.com/watch?v=AUEiHQOCQ2M",
"https://www.youtube.com/watch?v=oyteTOBxRm8",
"https://www.youtube.com/watch?v=uwwU55zBYlQ",
"https://www.youtube.com/watch?v=sSYoz0JmnZo",
"https://www.youtube.com/watch?v=NpU4dsXW6EI",
"https://www.youtube.com/watch?v=MzyXD8bNbvk",
"https://www.youtube.com/watch?v=hyV4qGAPKac",
"https://www.youtube.com/watch?v=pywNi6gD1FA",
"https://www.youtube.com/watch?v=17FEtaiWdVg",
"https://www.youtube.com/watch?v=fmrA-gxJxgQ",
"https://www.youtube.com/watch?v=yOBWgSPrYVA",
"https://www.youtube.com/watch?v=nCaqf9WhqOY",
"https://www.youtube.com/watch?v=cQKGUgOfD8U",
"https://www.youtube.com/watch?v=sK92X82T3Sk",
"https://www.youtube.com/watch?v=AH5_sKwDw1E",
"https://www.youtube.com/watch?v=dw-KJNqcK-Q",
"https://www.youtube.com/watch?v=X47JmmqbMvc",
"https://www.youtube.com/watch?v=ojQPpYVQt7U",
"https://www.youtube.com/watch?v=N1-Z8uslIsI",
"https://www.youtube.com/watch?v=EAgk-t2zzqw",
"https://www.youtube.com/watch?v=uLBC2kWYFo8",
"https://www.youtube.com/watch?v=OXHYIlkZLUU",
"https://www.youtube.com/watch?v=ObIa9wXbyMQ",
"https://www.youtube.com/watch?v=dGNoCICGmo0",
"https://www.youtube.com/watch?v=LcoyEZkTKfY",
"https://www.youtube.com/watch?v=mKHaW0qd5Mw",
"https://www.youtube.com/watch?v=GG627DYk_E4",
"https://www.youtube.com/watch?v=jTm6Q5Pj_Jo",
"https://www.youtube.com/watch?v=TVeIDmk3rBo",
"https://www.youtube.com/watch?v=1K3in6w9tt4",
"https://www.youtube.com/watch?v=07r67gGbtLQ",
"https://www.youtube.com/watch?v=243vPl8HdVk",
"https://www.youtube.com/watch?v=zweVJrnE1uY",
"https://www.youtube.com/watch?v=RKtoreimcQ8",
"https://www.youtube.com/watch?v=Je6dCVfHvkU",
"https://www.youtube.com/watch?v=UxFv12y_evM",
"https://www.youtube.com/watch?v=2HegQtmJeto",
"https://www.youtube.com/watch?v=8-Epnpruww0"
]
+12
View File
@@ -0,0 +1,12 @@
[
"https://i.imgur.com/Nh2LjC2.jpg",
"https://i.imgur.com/PC2ONfo.jpg",
"https://i.imgur.com/RHJpMsq.jpg",
"https://i.imgur.com/ufLAjPy.jpg",
"https://i.imgur.com/q4FcJAh.jpg",
"https://i.imgur.com/86wDaxo.png",
"https://i.imgur.com/ZziLhLt.jpg",
"https://i.imgur.com/wc5Zl0q.png",
"https://i.imgur.com/eHpScR2.jpg",
"https://i.imgur.com/Nj5N9Qp.png"
]
@@ -0,0 +1,57 @@
const Command = require('../../structures/Command');
const Canvas = require('canvas');
const snekfetch = require('snekfetch');
const { promisifyAll } = require('tsubaki');
const fs = promisifyAll(require('fs'));
const path = require('path');
module.exports = class YearsCommand extends Command {
constructor(client) {
super(client, {
name: '3000-years',
aliases: ['az', '3ky', '3k-years'],
group: 'avatar-edit',
memberName: '3000-years',
description: 'Draws a user\'s avatar over Pokémon\'s "It\'s been 3000 years" meme.',
throttling: {
usages: 1,
duration: 30
},
clientPermissions: ['ATTACH_FILES'],
args: [
{
key: 'user',
prompt: 'Which user would you like to edit the avatar of?',
type: 'user',
default: ''
}
]
});
}
async run(msg, args) {
const user = args.user || msg.author;
const avatarURL = user.displayAvatarURL({
format: 'png',
size: 256
});
try {
const Image = Canvas.Image;
const canvas = new Canvas(856, 569);
const ctx = canvas.getContext('2d');
const base = new Image();
const avatar = new Image();
const generate = () => {
ctx.drawImage(base, 0, 0);
ctx.drawImage(avatar, 461, 127, 200, 200);
};
base.src = await fs.readFileAsync(path.join(__dirname, '..', '..', 'assets', 'images', '3000-years.png'));
const { body } = await snekfetch.get(avatarURL);
avatar.src = body;
generate();
return msg.say({ files: [{ attachment: canvas.toBuffer(), name: '3000-years.png' }] });
} catch (err) {
return msg.say(`Oh no, the image generation failed: \`${err.message}\`. Try again later!`);
}
}
};
+58
View File
@@ -0,0 +1,58 @@
const Command = require('../../structures/Command');
const Canvas = require('canvas');
const snekfetch = require('snekfetch');
const { promisifyAll } = require('tsubaki');
const fs = promisifyAll(require('fs'));
const path = require('path');
module.exports = class BeautifulCommand extends Command {
constructor(client) {
super(client, {
name: 'beautiful',
aliases: ['grunkle-stan'],
group: 'avatar-edit',
memberName: 'beautiful',
description: 'Draws a user\'s avatar over Gravity Falls\' "Oh, this? This is beautiful." meme.',
throttling: {
usages: 1,
duration: 30
},
clientPermissions: ['ATTACH_FILES'],
args: [
{
key: 'user',
prompt: 'Which user would you like to edit the avatar of?',
type: 'user',
default: ''
}
]
});
}
async run(msg, args) {
const user = args.user || msg.author;
const avatarURL = user.displayAvatarURL({
format: 'png',
size: 256
});
try {
const Image = Canvas.Image;
const canvas = new Canvas(500, 532);
const ctx = canvas.getContext('2d');
const base = new Image();
const avatar = new Image();
const generate = () => {
ctx.drawImage(base, 0, 0);
ctx.drawImage(avatar, 341, 35, 117, 135);
ctx.drawImage(avatar, 343, 301, 117, 135);
};
base.src = await fs.readFileAsync(path.join(__dirname, '..', '..', 'assets', 'images', 'beautiful.png'));
const { body } = await snekfetch.get(avatarURL);
avatar.src = body;
generate();
return msg.say({ files: [{ attachment: canvas.toBuffer(), name: 'beautiful.png' }] });
} catch (err) {
return msg.say(`Oh no, the image generation failed: \`${err.message}\`. Try again later!`);
}
}
};
+61
View File
@@ -0,0 +1,61 @@
const Command = require('../../structures/Command');
const Canvas = require('canvas');
const snekfetch = require('snekfetch');
const { promisifyAll } = require('tsubaki');
const fs = promisifyAll(require('fs'));
const path = require('path');
module.exports = class BobRossCommand extends Command {
constructor(client) {
super(client, {
name: 'bob-ross',
aliases: ['ross'],
group: 'avatar-edit',
memberName: 'bob-ross',
description: 'Draws a user\'s avatar over Bob Ross\' canvas.',
throttling: {
usages: 1,
duration: 30
},
clientPermissions: ['ATTACH_FILES'],
args: [
{
key: 'user',
prompt: 'Which user would you like to edit the avatar of?',
type: 'user',
default: ''
}
]
});
}
async run(msg, args) {
const user = args.user || msg.author;
const avatarURL = user.displayAvatarURL({
format: 'png',
size: 256
});
try {
const Image = Canvas.Image;
const canvas = new Canvas(600, 775);
const ctx = canvas.getContext('2d');
const base = new Image();
const avatar = new Image();
const generate = () => {
ctx.fillStyle = 'white';
ctx.fillRect(0, 0, 600, 775);
ctx.rotate(3 * Math.PI / 180);
ctx.drawImage(avatar, 69, 102, 256, 256);
ctx.rotate(-3 * Math.PI / 180);
ctx.drawImage(base, 0, 0);
};
base.src = await fs.readFileAsync(path.join(__dirname, '..', '..', 'assets', 'images', 'bob-ross.png'));
const { body } = await snekfetch.get(avatarURL);
avatar.src = body;
generate();
return msg.say({ files: [{ attachment: canvas.toBuffer(), name: 'bob-ross.png' }] });
} catch (err) {
return msg.say(`Oh no, the image generation failed: \`${err.message}\`. Try again later!`);
}
}
};
+82
View File
@@ -0,0 +1,82 @@
const Command = require('../../structures/Command');
const Canvas = require('canvas');
const snekfetch = require('snekfetch');
const moment = require('moment');
const { promisifyAll } = require('tsubaki');
const fs = promisifyAll(require('fs'));
const path = require('path');
const { version } = require('../../package');
module.exports = class CardCommand extends Command {
constructor(client) {
super(client, {
name: 'card',
aliases: ['discord-card'],
group: 'avatar-edit',
memberName: 'card',
description: 'Creates a trading card of random rarity based on a user\'s profile.',
guildOnly: true,
throttling: {
usages: 1,
duration: 30
},
clientPermissions: ['ATTACH_FILES'],
args: [
{
key: 'member',
prompt: 'Which user would you like to edit the avatar of?',
type: 'member',
default: ''
}
]
});
}
async run(msg, args) {
const member = args.member || msg.member;
const avatarURL = member.user.displayAvatarURL({
format: 'png',
size: 256
});
try {
const cardID = Math.floor(Math.random() * (9999 - 1000 + 1)) + 1000;
let rarity;
if (cardID < 5000) rarity = 'C';
else if (cardID < 8000) rarity = 'U';
else rarity = 'R';
const Image = Canvas.Image;
Canvas.registerFont(path.join(__dirname, '..', '..', 'assets', 'fonts', 'Roboto.ttf'), { family: 'Roboto' }); // eslint-disable-line max-len
Canvas.registerFont(path.join(__dirname, '..', '..', 'assets', 'fonts', 'NotoEmoji-Regular.ttf'), { family: 'Roboto' }); // eslint-disable-line max-len
const canvas = new Canvas(390, 544);
const ctx = canvas.getContext('2d');
const base = new Image();
const avatar = new Image();
const generate = () => {
ctx.fillStyle = 'white';
ctx.fillRect(0, 0, 390, 544);
ctx.drawImage(avatar, 11, 11, 370, 370);
ctx.drawImage(base, 0, 0);
ctx.font = '18px Roboto';
ctx.fillStyle = 'black';
ctx.fillText(member.displayName, 30, 62);
ctx.fillText('Discord Join Date:', 148, 400);
ctx.fillText(moment(member.user.createdTimestamp).format('MMMM Do YYYY'), 148, 420);
ctx.fillText('Role:', 148, 457);
ctx.fillText(member.highestRole.name, 148, 477);
ctx.fillText(rarity, 73, 411);
ctx.fillText(cardID, 60, 457);
ctx.fillText(version.split('.')[0], 68, 502);
ctx.font = '14px Roboto';
ctx.fillText(member.id, 30, 355);
ctx.fillText(`#${member.user.discriminator}`, 313, 355);
};
base.src = await fs.readFileAsync(path.join(__dirname, '..', '..', 'assets', 'images', 'card.png'));
const { body } = await snekfetch.get(avatarURL);
avatar.src = body;
generate();
return msg.say({ files: [{ attachment: canvas.toBuffer(), name: 'card.png' }] });
} catch (err) {
return msg.say(`Oh no, the image generation failed: \`${err.message}\`. Try again later!`);
}
}
};
@@ -0,0 +1,58 @@
const Command = require('../../structures/Command');
const Canvas = require('canvas');
const snekfetch = require('snekfetch');
const { promisifyAll } = require('tsubaki');
const fs = promisifyAll(require('fs'));
const path = require('path');
module.exports = class ChallengerCommand extends Command {
constructor(client) {
super(client, {
name: 'challenger',
group: 'avatar-edit',
memberName: 'challenger',
description: 'Draws a user\'s avatar over Super Smash Bros.\'s "Challenger Approaching" screen.',
throttling: {
usages: 1,
duration: 30
},
clientPermissions: ['ATTACH_FILES'],
args: [
{
key: 'user',
prompt: 'Which user would you like to edit the avatar of?',
type: 'user',
default: ''
}
]
});
}
async run(msg, args) {
const user = args.user || msg.author;
const avatarURL = user.displayAvatarURL({
format: 'png',
size: 256
});
try {
const Image = Canvas.Image;
const canvas = new Canvas(500, 500);
const ctx = canvas.getContext('2d');
const base = new Image();
const avatar = new Image();
const generate = () => {
ctx.fillStyle = '#ff0028';
ctx.fillRect(0, 0, 500, 500);
ctx.drawImage(avatar, 226, 155, 200, 200);
ctx.drawImage(base, 0, 0);
};
base.src = await fs.readFileAsync(path.join(__dirname, '..', '..', 'assets', 'images', 'challenger.png'));
const { body } = await snekfetch.get(avatarURL);
avatar.src = body;
generate();
return msg.say({ files: [{ attachment: canvas.toBuffer(), name: 'challenger.png' }] });
} catch (err) {
return msg.say(`Oh no, the image generation failed: \`${err.message}\`. Try again later!`);
}
}
};
+58
View File
@@ -0,0 +1,58 @@
const Command = require('../../structures/Command');
const Canvas = require('canvas');
const snekfetch = require('snekfetch');
const { promisifyAll } = require('tsubaki');
const fs = promisifyAll(require('fs'));
const path = require('path');
module.exports = class DexterCommand extends Command {
constructor(client) {
super(client, {
name: 'dexter',
group: 'avatar-edit',
memberName: 'dexter',
description: 'Draws a user\'s avatar over Dexter from Pokémon\'s screen.',
throttling: {
usages: 1,
duration: 30
},
clientPermissions: ['ATTACH_FILES'],
args: [
{
key: 'user',
prompt: 'Which user would you like to edit the avatar of?',
type: 'user',
default: ''
}
]
});
}
async run(msg, args) {
const user = args.user || msg.author;
const avatarURL = user.displayAvatarURL({
format: 'png',
size: 256
});
try {
const Image = Canvas.Image;
const canvas = new Canvas(744, 554);
const ctx = canvas.getContext('2d');
const base = new Image();
const avatar = new Image();
const generate = () => {
ctx.drawImage(base, 0, 0);
ctx.rotate(-11 * Math.PI / 180);
ctx.drawImage(avatar, 234, 274, 225, 225);
ctx.rotate(11 * Math.PI / 180);
};
base.src = await fs.readFileAsync(path.join(__dirname, '..', '..', 'assets', 'images', 'dexter.png'));
const { body } = await snekfetch.get(avatarURL);
avatar.src = body;
generate();
return msg.say({ files: [{ attachment: canvas.toBuffer(), name: 'dexter.png' }] });
} catch (err) {
return msg.say(`Oh no, the image generation failed: \`${err.message}\`. Try again later!`);
}
}
};
+60
View File
@@ -0,0 +1,60 @@
const Command = require('../../structures/Command');
const Canvas = require('canvas');
const snekfetch = require('snekfetch');
module.exports = class GreyscaleCommand extends Command {
constructor(client) {
super(client, {
name: 'greyscale',
aliases: ['grayscale'],
group: 'avatar-edit',
memberName: 'greyscale',
description: 'Draws a user\'s avatar in greyscale.',
throttling: {
usages: 1,
duration: 30
},
clientPermissions: ['ATTACH_FILES'],
args: [
{
key: 'user',
prompt: 'Which user would you like to edit the avatar of?',
type: 'user',
default: ''
}
]
});
}
async run(msg, args) {
const user = args.user || msg.author;
const avatarURL = user.displayAvatarURL({
format: 'png',
size: 256
});
try {
const Image = Canvas.Image;
const canvas = new Canvas(256, 256);
const ctx = canvas.getContext('2d');
const avatar = new Image();
const generate = () => {
ctx.drawImage(avatar, 0, 0, 256, 256);
const imgData = ctx.getImageData(0, 0, 256, 256);
const { data } = imgData;
for (let i = 0; i < data.length; i += 4) {
const brightness = 0.34 * data[i] + 0.5 * data[i + 1] + 0.16 * data[i + 2];
data[i] = brightness;
data[i + 1] = brightness;
data[i + 2] = brightness;
}
ctx.putImageData(imgData, 0, 0);
};
const { body } = await snekfetch.get(avatarURL);
avatar.src = body;
generate();
return msg.say({ files: [{ attachment: canvas.toBuffer(), name: 'greyscale.png' }] });
} catch (err) {
return msg.say(`Oh no, the image generation failed: \`${err.message}\`. Try again later!`);
}
}
};
+58
View File
@@ -0,0 +1,58 @@
const Command = require('../../structures/Command');
const Canvas = require('canvas');
const snekfetch = require('snekfetch');
module.exports = class InvertCommand extends Command {
constructor(client) {
super(client, {
name: 'invert',
group: 'avatar-edit',
memberName: 'invert',
description: 'Draws a user\'s avatar inverted.',
throttling: {
usages: 1,
duration: 30
},
clientPermissions: ['ATTACH_FILES'],
args: [
{
key: 'user',
prompt: 'Which user would you like to edit the avatar of?',
type: 'user',
default: ''
}
]
});
}
async run(msg, args) {
const user = args.user || msg.author;
const avatarURL = user.displayAvatarURL({
format: 'png',
size: 256
});
try {
const Image = Canvas.Image;
const canvas = new Canvas(256, 256);
const ctx = canvas.getContext('2d');
const avatar = new Image();
const generate = () => {
ctx.drawImage(avatar, 0, 0, 256, 256);
const imgData = ctx.getImageData(0, 0, 256, 256);
const { data } = imgData;
for (let i = 0; i < data.length; i += 4) {
data[i] = 255 - data[i];
data[i + 1] = 255 - data[i + 1];
data[i + 2] = 255 - data[i + 2];
}
ctx.putImageData(imgData, 0, 0);
};
const { body } = await snekfetch.get(avatarURL);
avatar.src = body;
generate();
return msg.say({ files: [{ attachment: canvas.toBuffer(), name: 'invert.png' }] });
} catch (err) {
return msg.say(`Oh no, the image generation failed: \`${err.message}\`. Try again later!`);
}
}
};
+66
View File
@@ -0,0 +1,66 @@
const Command = require('../../structures/Command');
const Canvas = require('canvas');
const snekfetch = require('snekfetch');
const { promisifyAll } = require('tsubaki');
const fs = promisifyAll(require('fs'));
const path = require('path');
module.exports = class RIPCommand extends Command {
constructor(client) {
super(client, {
name: 'rip',
aliases: ['grave', 'grave-stone'],
group: 'avatar-edit',
memberName: 'rip',
description: 'Draws a user\'s avatar over a gravestone.',
throttling: {
usages: 1,
duration: 30
},
clientPermissions: ['ATTACH_FILES'],
args: [
{
key: 'user',
prompt: 'Which user would you like to edit the avatar of?',
type: 'user',
default: ''
}
]
});
}
async run(msg, args) {
const user = args.user || msg.author;
const avatarURL = user.displayAvatarURL({
format: 'png',
size: 256
});
try {
const Image = Canvas.Image;
const canvas = new Canvas(507, 338);
const ctx = canvas.getContext('2d');
const base = new Image();
const avatar = new Image();
const generate = () => {
ctx.drawImage(base, 0, 0);
ctx.drawImage(avatar, 158, 51, 200, 200);
const imgData = ctx.getImageData(158, 51, 200, 200);
const { data } = imgData;
for (let i = 0; i < data.length; i += 4) {
const brightness = 0.34 * data[i] + 0.5 * data[i + 1] + 0.16 * data[i + 2];
data[i] = brightness;
data[i + 1] = brightness;
data[i + 2] = brightness;
}
ctx.putImageData(imgData, 158, 51);
};
base.src = await fs.readFileAsync(path.join(__dirname, '..', '..', 'assets', 'images', 'rip.png'));
const { body } = await snekfetch.get(avatarURL);
avatar.src = body;
generate();
return msg.say({ files: [{ attachment: canvas.toBuffer(), name: 'rip.png' }] });
} catch (err) {
return msg.say(`Oh no, the image generation failed: \`${err.message}\`. Try again later!`);
}
}
};
+58
View File
@@ -0,0 +1,58 @@
const Command = require('../../structures/Command');
const Canvas = require('canvas');
const snekfetch = require('snekfetch');
const { promisifyAll } = require('tsubaki');
const fs = promisifyAll(require('fs'));
const path = require('path');
module.exports = class SimbaCommand extends Command {
constructor(client) {
super(client, {
name: 'simba',
group: 'avatar-edit',
memberName: 'simba',
description: 'Draws a user\'s avatar over Simba from The Lion King\'s reflection.',
throttling: {
usages: 1,
duration: 30
},
clientPermissions: ['ATTACH_FILES'],
args: [
{
key: 'user',
prompt: 'Which user would you like to edit the avatar of?',
type: 'user',
default: ''
}
]
});
}
async run(msg, args) {
const user = args.user || msg.author;
const avatarURL = user.displayAvatarURL({
format: 'png',
size: 256
});
try {
const Image = Canvas.Image;
const canvas = new Canvas(500, 281);
const ctx = canvas.getContext('2d');
const base = new Image();
const avatar = new Image();
const generate = () => {
ctx.drawImage(base, 0, 0);
ctx.rotate(-24 * Math.PI / 180);
ctx.drawImage(avatar, 75, 160, 130, 150);
ctx.rotate(24 * Math.PI / 180);
};
base.src = await fs.readFileAsync(path.join(__dirname, '..', '..', 'assets', 'images', 'simba.png'));
const { body } = await snekfetch.get(avatarURL);
avatar.src = body;
generate();
return msg.say({ files: [{ attachment: canvas.toBuffer(), name: 'simba.png' }] });
} catch (err) {
return msg.say(`Oh no, the image generation failed: \`${err.message}\`. Try again later!`);
}
}
};
@@ -0,0 +1,62 @@
const Command = require('../../structures/Command');
const Canvas = require('canvas');
const snekfetch = require('snekfetch');
const { promisifyAll } = require('tsubaki');
const fs = promisifyAll(require('fs'));
const path = require('path');
module.exports = class SteamCardCommand extends Command {
constructor(client) {
super(client, {
name: 'steam-card',
group: 'avatar-edit',
memberName: 'steam-card',
description: 'Draws a user\'s avatar over a Steam card.',
throttling: {
usages: 1,
duration: 30
},
clientPermissions: ['ATTACH_FILES'],
args: [
{
key: 'user',
prompt: 'Which user would you like to edit the avatar of?',
type: 'user',
default: ''
}
]
});
}
async run(msg, args) {
const user = args.user || msg.author;
const avatarURL = user.displayAvatarURL({
format: 'png',
size: 512
});
try {
const Image = Canvas.Image;
Canvas.registerFont(path.join(__dirname, '..', '..', 'assets', 'fonts', 'Roboto.ttf'), { family: 'Roboto' }); // eslint-disable-line max-len
Canvas.registerFont(path.join(__dirname, '..', '..', 'assets', 'fonts', 'NotoEmoji-Regular.ttf'), { family: 'Roboto' }); // eslint-disable-line max-len
const canvas = new Canvas(494, 568);
const ctx = canvas.getContext('2d');
const base = new Image();
const avatar = new Image();
const generate = () => {
ctx.fillStyle = 'white';
ctx.fillRect(0, 0, 494, 568);
ctx.drawImage(avatar, 25, 25, 450, 450);
ctx.drawImage(base, 0, 0);
ctx.font = '30px Roboto';
ctx.fillText(user.username, 35, 48);
};
base.src = await fs.readFileAsync(path.join(__dirname, '..', '..', 'assets', 'images', 'steam-card.png'));
const { body } = await snekfetch.get(avatarURL);
avatar.src = body;
generate();
return msg.say({ files: [{ attachment: canvas.toBuffer(), name: 'steam-card.png' }] });
} catch (err) {
return msg.say(`Oh no, the image generation failed: \`${err.message}\`. Try again later!`);
}
}
};
+62
View File
@@ -0,0 +1,62 @@
const Command = require('../../structures/Command');
const Canvas = require('canvas');
const snekfetch = require('snekfetch');
const { promisifyAll } = require('tsubaki');
const fs = promisifyAll(require('fs'));
const path = require('path');
module.exports = class TriggeredCommand extends Command {
constructor(client) {
super(client, {
name: 'triggered',
group: 'avatar-edit',
memberName: 'triggered',
description: 'Draws a user\'s avatar over a Triggered meme.',
throttling: {
usages: 1,
duration: 30
},
clientPermissions: ['ATTACH_FILES'],
args: [
{
key: 'user',
prompt: 'Which user would you like to edit the avatar of?',
type: 'user',
default: ''
}
]
});
}
async run(msg, args) {
const user = args.user || msg.author;
const avatarURL = user.displayAvatarURL({
format: 'png',
size: 512
});
try {
const Image = Canvas.Image;
const canvas = new Canvas(320, 371);
const ctx = canvas.getContext('2d');
const base = new Image();
const avatar = new Image();
const generate = () => {
ctx.fillStyle = 'white';
ctx.fillRect(0, 0, 320, 371);
ctx.drawImage(avatar, 0, 0, 320, 320);
const imgData = ctx.getImageData(0, 0, 320, 320);
const { data } = imgData;
for (let i = 0; i < data.length; i += 4) data[i] = Math.max(255, data[i]);
ctx.putImageData(imgData, 0, 0);
ctx.drawImage(base, 0, 0);
};
base.src = await fs.readFileAsync(path.join(__dirname, '..', '..', 'assets', 'images', 'triggered.png'));
const { body } = await snekfetch.get(avatarURL);
avatar.src = body;
generate();
return msg.say({ files: [{ attachment: canvas.toBuffer(), name: 'triggered.png' }] });
} catch (err) {
return msg.say(`Oh no, the image generation failed: \`${err.message}\`. Try again later!`);
}
}
};
+56
View File
@@ -0,0 +1,56 @@
const Command = require('../../structures/Command');
const Canvas = require('canvas');
const snekfetch = require('snekfetch');
const { promisifyAll } = require('tsubaki');
const fs = promisifyAll(require('fs'));
const path = require('path');
module.exports = class WantedCommand extends Command {
constructor(client) {
super(client, {
name: 'wanted',
group: 'avatar-edit',
memberName: 'wanted',
description: 'Draws a user\'s avatar over a wanted poster.',
throttling: {
usages: 1,
duration: 30
},
clientPermissions: ['ATTACH_FILES'],
args: [
{
key: 'user',
prompt: 'Which user would you like to edit the avatar of?',
type: 'user',
default: ''
}
]
});
}
async run(msg, args) {
const user = args.user || msg.author;
const avatarURL = user.displayAvatarURL({
format: 'png',
size: 512
});
try {
const Image = Canvas.Image;
const canvas = new Canvas(741, 1000);
const ctx = canvas.getContext('2d');
const base = new Image();
const avatar = new Image();
const generate = () => {
ctx.drawImage(base, 0, 0);
ctx.drawImage(avatar, 150, 360, 430, 430);
};
base.src = await fs.readFileAsync(path.join(__dirname, '..', '..', 'assets', 'images', 'wanted.png'));
const { body } = await snekfetch.get(avatarURL);
avatar.src = body;
generate();
return msg.say({ files: [{ attachment: canvas.toBuffer(), name: 'wanted.png' }] });
} catch (err) {
return msg.say(`Oh no, the image generation failed: \`${err.message}\`. Try again later!`);
}
}
};
+124
View File
@@ -0,0 +1,124 @@
const Command = require('../../structures/Command');
const { stripIndents } = require('common-tags');
module.exports = class BattleCommand extends Command {
constructor(client) {
super(client, {
name: 'battle',
aliases: ['fight', 'death-battle'],
group: 'games',
memberName: 'battle',
description: 'Engage in a turn-based battle against another user or the AI.',
guildOnly: true,
args: [
{
key: 'opponent',
prompt: 'Who would you like to battle?',
type: 'user',
default: 'AI'
}
]
});
this.fighting = new Set();
}
async run(msg, args) { // eslint-disable-line complexity
const opponent = args.opponent;
if (opponent.bot) return msg.say('Bots may not be fought.');
if (opponent.id === msg.author.id) return msg.say('You may not fight yourself.');
if (this.fighting.has(msg.guild.id)) return msg.say('Only one fight may be occurring per server.');
this.fighting.add(msg.guild.id);
try {
if (opponent !== 'AI') {
await msg.say(`${opponent}, do you accept this challenge? **__Y__es** or **No**?`);
const verify = await msg.channel.awaitMessages((res) => res.author.id === opponent.id, {
max: 1,
time: 30000
});
if (!verify.size || !['yes', 'y'].includes(verify.first().content.toLowerCase())) {
this.fighting.delete(msg.guild.id);
return msg.say('Looks like they declined...');
}
}
let userHP = 500;
let oppoHP = 500;
let userTurn = false;
let guard = false;
const reset = (changeGuard = true) => {
if (userTurn) userTurn = false;
else userTurn = true;
if (changeGuard && guard) guard = false;
};
const dealDamage = (damage) => {
if (userTurn) oppoHP -= damage;
else userHP -= damage;
};
const forfeit = () => {
if (userTurn) userHP = 0;
else oppoHP = 0;
};
while (userHP > 0 && oppoHP > 0) { // eslint-disable-line no-unmodified-loop-condition
const user = userTurn ? msg.author : opponent;
let choice;
if (opponent !== 'AI' || (opponent === 'AI' && userTurn)) {
const id = userTurn ? msg.author.id : opponent.id;
await msg.say(stripIndents`
${user}, do you **fight**, **guard**, **special**, or **run**?
**${msg.author.username}**: ${userHP}HP
**${opponent === 'AI' ? 'AI' : opponent.username}**: ${oppoHP}HP
`);
const turn = await msg.channel.awaitMessages((res) => res.author.id === id, {
max: 1,
time: 30000
});
if (!turn.size) {
await msg.say('Time!');
forfeit();
break;
}
choice = turn.first().content.toLowerCase();
} else {
const choices = ['fight', 'guard', 'special'];
choice = choices[Math.floor(Math.random() * choices.length)];
}
if (choice === 'fight') {
const damage = Math.floor(Math.random() * (guard ? 10 : 100)) + 1;
await msg.say(`${user} deals **${damage}** damage!`);
dealDamage(damage);
reset();
} else if (choice === 'guard') {
await msg.say(`${user} guards!`);
guard = true;
reset(false);
} else if (choice === 'special') {
const hit = Math.floor(Math.random() * 4) + 1;
if (hit === 1) {
const damage = Math.floor(Math.random() * ((guard ? 300 : 150) - 100 + 1) + 100);
await msg.say(`${user} deals **${damage}** damage!`);
dealDamage(damage);
reset();
} else {
await msg.say(`${user}'s attack missed!`);
reset();
}
} else if (choice === 'run') {
await msg.say(`${user} flees!`);
forfeit();
break;
} else {
await msg.say(`${user}, I do not understand what you want to do.`);
}
}
this.fighting.delete(msg.guild.id);
return msg.say(stripIndents`
The match is over!
**Winner:** ${userHP > oppoHP ? `${msg.author} (${userHP}HP)` : `${opponent} (${oppoHP}HP)`}
**Loser:** ${userHP > oppoHP ? `${opponent} (${oppoHP}HP)` : `${msg.author} (${userHP}HP)`}
`);
} catch (err) {
this.fighting.delete(msg.guild.id);
return msg.say(`Oh no, an Error occurred: \`${err.message}\`. Try again later!`);
}
}
};
+83
View File
@@ -0,0 +1,83 @@
const Command = require('../../structures/Command');
const snekfetch = require('snekfetch');
const { stripIndents } = require('common-tags');
const { wordnikKey } = require('../../config');
module.exports = class HangmanCommand extends Command {
constructor(client) {
super(client, {
name: 'hangman',
group: 'games',
memberName: 'hangman',
description: 'Play a game of hangman.',
guildOnly: true
});
this.playing = new Set();
}
async run(msg) {
if (this.playing.has(msg.guild.id)) return msg.say('Only one game may be occurring per server.');
this.playing.add(msg.guild.id);
try {
const { body } = await snekfetch
.get('http://api.wordnik.com:80/v4/words.json/randomWord')
.query({
hasDictionaryDef: true,
minCorpusCount: 0,
maxCorpusCount: -1,
minDictionaryCount: 1,
maxDictionaryCount: -1,
minLength: -1,
maxLength: -1,
api_key: wordnikKey
});
const word = body.word.toLowerCase().replace(/[ ]/g, '-');
let points = 0;
const confirmation = [];
const incorrect = [];
const display = '_'.repeat(word.length).split('');
while (word.length !== confirmation.length && points < 7) {
await msg.code(null, stripIndents`
___________
| |
| ${points > 0 ? 'O' : ''}
| ${points > 2 ? '—' : ' '}${points > 1 ? '|' : ''}${points > 3 ? '—' : ''}
| ${points > 4 ? '/' : ''} ${points > 5 ? '\\' : ''}
===========
The word is: ${display.join(' ')}. Which letter do you choose?
`);
const guess = await msg.channel.awaitMessages((res) => res.author.id === msg.author.id, {
max: 1,
time: 30000
});
if (!guess.size) {
await msg.say('Time!');
break;
}
const choice = guess.first().content.toLowerCase();
if (confirmation.includes(choice) || incorrect.includes(choice)) {
await msg.say('You have already picked that letter!');
} else if (word.includes(choice)) {
await msg.say('Nice job!');
for (let i = 0; i < word.length; i++) {
if (word[i] === choice) {
confirmation.push(word[i]);
display[i] = word[i];
}
}
} else {
await msg.say('Nope!');
incorrect.push(choice);
points++;
}
}
this.playing.delete(msg.guild.id);
if (word.length === confirmation.length) return msg.say(`You won, it was ${word}!`);
else return msg.say(`Too bad... It was ${word}...`);
} catch (err) {
this.playing.delete(msg.guild.id);
return msg.say(`Oh no, an Error occurred: \`${err.message}\`. Try again later!`);
}
}
};
+18
View File
@@ -0,0 +1,18 @@
const Command = require('../../structures/Command');
module.exports = class LotteryCommand extends Command {
constructor(client) {
super(client, {
name: 'lottery',
group: 'games',
memberName: 'lottery',
description: 'Attempt to win the lottery, with a 1 in 100 chance of winning.'
});
}
run(msg) {
const lottery = Math.floor(Math.random() * 100) + 1;
if (lottery === 1) return msg.reply(`Wow! You actually won! Great job!`);
else return msg.reply(`Nope, sorry, you lost.`);
}
};
+48
View File
@@ -0,0 +1,48 @@
const Command = require('../../structures/Command');
const { MessageEmbed } = require('discord.js');
const math = require('mathjs');
const { operations, difficulties, maxValues } = require('../../assets/json/math-game');
module.exports = class MathGameCommand extends Command {
constructor(client) {
super(client, {
name: 'math-game',
group: 'games',
memberName: 'math-game',
description: 'See how fast you can answer a math problem in a given time limit.',
clientPermissions: ['EMBED_LINKS'],
args: [
{
key: 'difficulty',
prompt: `What should the difficulty of the game be? One of: ${difficulties.join(', ')}`,
type: 'string',
validate: (difficulty) => {
if (difficulties.includes(difficulty.toLowerCase())) return true;
else return `The difficulty must be one of: ${difficulties.join(', ')}`;
},
parse: (difficulty) => difficulty.toLowerCase()
}
]
});
}
async run(msg, args) {
const { difficulty } = args;
const operation = operations[Math.floor(Math.random() * operations.length)];
const value1 = Math.floor(Math.random() * maxValues[difficulty]) + 1;
const value2 = Math.floor(Math.random() * maxValues[difficulty]) + 1;
const expression = `${value1} ${operation} ${value2}`;
const answer = math.eval(expression).toString();
const embed = new MessageEmbed()
.setTitle('You have 10 seconds to answer:')
.setDescription(expression);
await msg.embed(embed);
const msgs = await msg.channel.awaitMessages((res) => res.author.id === msg.author.id, {
max: 1,
time: 10000
});
if (!msgs.size) return msg.say(`Time! It was ${answer}, sorry!`);
if (msgs.first().content !== answer) return msg.say(`Nope, sorry, it's ${answer}.`);
else return msg.say('Nice job! 10/10! You deserve some cake!');
}
};
+42
View File
@@ -0,0 +1,42 @@
const Command = require('../../structures/Command');
const { MessageEmbed } = require('discord.js');
const { stripIndents } = require('common-tags');
const snekfetch = require('snekfetch');
module.exports = class QuizCommand extends Command {
constructor(client) {
super(client, {
name: 'quiz',
aliases: ['jeopardy'],
group: 'games',
memberName: 'quiz',
description: 'Answer a true/false quiz question.',
clientPermissions: ['EMBED_LINKS']
});
}
async run(msg) {
const { body } = await snekfetch
.get('https://opentdb.com/api.php')
.query({
amount: 1,
type: 'boolean',
encode: 'url3986'
});
const answer = body.results[0].correct_answer.toLowerCase();
const embed = new MessageEmbed()
.setTitle('You have 15 seconds to answer this question:')
.setDescription(stripIndents`
**${decodeURIComponent(body.results[0].category)}**
True or False: ${decodeURIComponent(body.results[0].question)}
`);
await msg.embed(embed);
const msgs = await msg.channel.awaitMessages((res) => res.author.id === msg.author.id, {
max: 1,
time: 15000
});
if (!msgs.size) return msg.say(`Time! It was ${answer}, sorry!`);
if (msgs.first().content.toLowerCase() !== answer) return msg.say(`Nope, sorry, it's ${answer}.`);
else return msg.say('Nice job! 10/10! You deserve some cake!');
}
};
@@ -0,0 +1,42 @@
const Command = require('../../structures/Command');
const choices = ['paper', 'rock', 'scissors'];
module.exports = class RockPaperScissorsCommand extends Command {
constructor(client) {
super(client, {
name: 'rock-paper-scissors',
aliases: ['rps'],
group: 'games',
memberName: 'rock-paper-scissors',
description: 'Play Rock-Paper-Scissors.',
args: [
{
key: 'choice',
prompt: 'Rock, Paper, or Scissors?',
type: 'string',
parse: (choice) => choice.toLowerCase()
}
]
});
}
run(msg, args) { // eslint-disable-line consistent-return
const { choice } = args;
const response = choices[Math.floor(Math.random() * choices.length)];
if (choice === 'rock') {
if (response === 'rock') return msg.say('Rock! Aw... A tie...');
else if (response === 'paper') return msg.say('Paper! Yes! I win!');
else if (response === 'scissors') return msg.say('Scissors! Aw... I lose...');
} else if (choice === 'paper') {
if (response === 'rock') return msg.say('Rock! Aw... I lose...');
else if (response === 'paper') return msg.say('Paper! Aw... A tie...');
else if (response === 'scissors') return msg.say('Scissors! Yes! I win!');
} else if (choice === 'scissors') {
if (response === 'rock') return msg.say('Rock! Yes! I win!');
else if (response === 'paper') return msg.say('Paper! Aw... I lose...');
else if (response === 'scissors') return msg.say('Scissors! Aw... A tie...');
} else {
return msg.say('I win by default, you little cheater.');
}
}
};
+31
View File
@@ -0,0 +1,31 @@
const Command = require('../../structures/Command');
const { stripIndents } = require('common-tags');
const slots = [':grapes:', ':tangerine:', ':pear:', ':cherries:', ':lemon:'];
module.exports = class SlotsCommand extends Command {
constructor(client) {
super(client, {
name: 'slots',
group: 'games',
memberName: 'slots',
description: 'Play a game of slots.'
});
}
run(msg) {
const slotOne = slots[Math.floor(Math.random() * slots.length)];
const slotTwo = slots[Math.floor(Math.random() * slots.length)];
const slotThree = slots[Math.floor(Math.random() * slots.length)];
if (slotOne === slotTwo && slotOne === slotThree) {
return msg.say(stripIndents`
${slotOne}|${slotTwo}|${slotThree}
Wow! You won! Great job... er... luck!
`);
} else {
return msg.say(stripIndents`
${slotOne}|${slotTwo}|${slotThree}
Aww... You lost... Guess it's just bad luck, huh?
`);
}
}
};
+43
View File
@@ -0,0 +1,43 @@
const Command = require('../../structures/Command');
const { MessageEmbed } = require('discord.js');
const { sentences, difficulties, times } = require('../../assets/json/typing-game');
module.exports = class TypingGameCommand extends Command {
constructor(client) {
super(client, {
name: 'typing-game',
group: 'games',
memberName: 'typing-game',
description: 'See how fast you can type a sentence in a given time limit.',
clientPermissions: ['EMBED_LINKS'],
args: [
{
key: 'difficulty',
prompt: `What should the difficulty of the game be? One of: ${difficulties.join(', ')}`,
type: 'string',
validate: (difficulty) => {
if (difficulties.includes(difficulty.toLowerCase())) return true;
else return `The difficulty must be one of: ${difficulties.join(', ')}`;
},
parse: (difficulty) => difficulty.toLowerCase()
}
]
});
}
async run(msg, args) {
const { difficulty } = args;
const sentence = sentences[Math.floor(Math.random() * sentences.length)];
const time = times[difficulty];
const embed = new MessageEmbed()
.setTitle(`You have ${time / 1000} seconds to type:`)
.setDescription(sentence);
await msg.embed(embed);
const msgs = await msg.channel.awaitMessages((res) => res.author.id === msg.author.id, {
max: 1,
time
});
if (!msgs.size || msgs.first().content !== sentence) return msg.say('Sorry! You lose!');
else return msg.say('Nice job! 10/10! You deserve some cake!');
}
};
+19
View File
@@ -0,0 +1,19 @@
const Command = require('../../structures/Command');
module.exports = class EmojiCommand extends Command {
constructor(client) {
super(client, {
name: 'emoji',
group: 'guild-info',
memberName: 'emoji',
description: 'Responds with a list of the server\'s custom emoji.',
guildOnly: true
});
}
run(msg) {
const emoji = msg.guild.emojis;
if (!emoji.size) return msg.say('You have no custom emoji.');
return msg.say(emoji.map((e) => e).join(''));
}
};
@@ -0,0 +1,41 @@
const Command = require('../../structures/Command');
const { MessageEmbed } = require('discord.js');
const moment = require('moment');
const filterLevels = ['Off', 'No Role', 'Everyone'];
module.exports = class GuildInfoCommand extends Command {
constructor(client) {
super(client, {
name: 'server-info',
aliases: ['guild', 'server', 'guild-info'],
group: 'guild-info',
memberName: 'server-info',
description: 'Responds with detailed information on the server.',
guildOnly: true,
clientPermissions: ['EMBED_LINKS']
});
}
run(msg) {
const embed = new MessageEmbed()
.setColor(0x00AE86)
.setThumbnail(msg.guild.iconURL())
.addField(' Name',
msg.guild.name, true)
.addField(' ID',
msg.guild.id, true)
.addField(' Creation Date',
moment(msg.guild.createdAt).format('MMMM Do YYYY'), true)
.addField(' Default Channel',
msg.guild.defaultChannel, true)
.addField(' Region',
msg.guild.region, true)
.addField(' Explicit Filter',
filterLevels[msg.guild.explicitContentFilter], true)
.addField(' Owner',
msg.guild.owner ? msg.guild.owner.user.username : 'None', true)
.addField(' Members',
msg.guild.memberCount, true);
return msg.embed(embed);
}
};
@@ -0,0 +1,38 @@
const Command = require('../../structures/Command');
const snekfetch = require('snekfetch');
module.exports = class AchievementCommand extends Command {
constructor(client) {
super(client, {
name: 'achievement',
group: 'image-edit',
memberName: 'achievement',
description: 'Sends a Minecraft achievement with the text of your choice.',
clientPermissions: ['ATTACH_FILES'],
args: [
{
key: 'text',
prompt: 'What should the text of the achievement be?',
type: 'string',
validate: (text) => {
if (text.length < 25) return true;
else return 'Text must be under 25 characters.';
}
}
]
});
}
async run(msg, args) {
const { text } = args;
const { body } = await snekfetch
.get('https://www.minecraftskinstealer.com/achievement/a.php')
.query({
i: 1,
h: 'Achievement Get!',
t: text
});
return msg.say({ files: [{ attachment: body, name: 'achievement.png' }] });
}
};
+44
View File
@@ -0,0 +1,44 @@
const Command = require('../../structures/Command');
const codes = require('../../assets/json/meme');
module.exports = class MemeCommand extends Command {
constructor(client) {
super(client, {
name: 'meme',
group: 'image-edit',
memberName: 'meme',
description: 'Sends a meme with text of your choice, and a background of your choice.',
clientPermissions: ['ATTACH_FILES'],
details: `**Codes:** ${codes.join(', ')}`,
args: [
{
key: 'type',
prompt: 'What meme type do you want to use?',
type: 'string',
validate: (type) => {
if (codes.includes(type.toLowerCase())) return true;
else return 'Invalid meme type. Use `help meme` to view a list of meme types.';
},
parse: (type) => type.toLowerCase()
},
{
key: 'top',
prompt: 'What should the top row of the meme to be?',
type: 'string',
parse: (top) => encodeURIComponent(top.replace(/[ ]/g, '-'))
},
{
key: 'bottom',
prompt: 'What should the bottom row of the meme to be?',
type: 'string',
parse: (bottom) => encodeURIComponent(bottom.replace(/[ ]/g, '-'))
}
]
});
}
run(msg, args) {
const { type, top, bottom } = args;
return msg.say({ files: [`https://memegen.link/${type}/${top}/${bottom}.jpg`] });
}
};
@@ -0,0 +1,41 @@
const Command = require('../../structures/Command');
const pokemon = require('../../assets/json/pokemon-fusion');
module.exports = class PokemonFusionCommand extends Command {
constructor(client) {
super(client, {
name: 'pokemon-fusion',
aliases: ['poke-fusion', 'poke-fuse'],
group: 'image-edit',
memberName: 'pokemon-fusion',
description: 'Fuses two Generation I Pokémon together.',
args: [
{
key: 'source1',
prompt: 'What Pokémon should be fused?',
type: 'string',
validate: (source1) => {
if (pokemon[source1.toLowerCase()]) return true;
else return 'Only Pokémon from Generation I may be used.';
},
parse: (source1) => pokemon[source1.toLowerCase()]
},
{
key: 'source2',
prompt: 'What Pokémon should be fused?',
type: 'string',
validate: (source2) => {
if (pokemon[source2.toLowerCase()]) return true;
else return 'Only Pokémon from Generation I may be used.';
},
parse: (source2) => pokemon[source2.toLowerCase()]
}
]
});
}
run(msg, args) {
const { source1, source2 } = args;
return msg.say(`http://images.alexonsager.net/pokemon/fused/${source1}/${source1}.${source2}.png`);
}
};
+84
View File
@@ -0,0 +1,84 @@
const Command = require('../../structures/Command');
const { MessageEmbed } = require('discord.js');
const { stripIndents } = require('common-tags');
module.exports = class BanCommand extends Command {
constructor(client) {
super(client, {
name: 'ban',
aliases: ['banne'],
group: 'moderation',
memberName: 'ban',
description: 'Bans a user and logs the ban to the mod logs.',
guildOnly: true,
clientPermissions: ['BAN_MEMBERS'],
userPermissions: ['BAN_MEMBERS'],
args: [
{
key: 'member',
prompt: 'What member do you want to ban?',
type: 'member'
},
{
key: 'reason',
prompt: 'What do you want to set the reason as?',
type: 'string',
validate: (reason) => {
if (reason.length < 140) return true;
else return 'Reason must be under 140 characters.';
}
}
]
});
}
async run(msg, args) {
const modlogs = msg.guild.channels.filter((c) => {
const topic = c.topic || '';
if (topic.includes('<modlog>')) return true;
else return false;
}).first() || msg.guild.channels.find('name', 'mod-log');
const { member, reason } = args;
if (!member.bannable) return msg.say('This member is not bannable. Perhaps they have a higher role than me?');
await msg.say(`Are you sure you want to ban ${member.user.tag} (${member.id})?`);
const msgs = await msg.channel.awaitMessages((res) => res.author.id === msg.author.id, {
max: 1,
time: 30000
});
if (!msgs.size || !['y', 'yes'].includes(msgs.first().content.toLowerCase())) return msg.say('Aborting.');
try {
await member.send(stripIndents`
You were banned from ${msg.guild.name}!
Reason: ${reason}
`);
} catch (err) {
await msg.say('Failed to Send DM.');
}
await member.ban({
days: 7,
reason: `${msg.author.tag}: ${reason}`
});
await msg.say(`Successfully banned ${member.user.tag}.`);
if (!modlogs || !modlogs.permissionsFor(this.client.user).has('SEND_MESSAGES')) {
return msg.say('Could not log the ban to the mod logs.');
} else if (modlogs.permissionsFor(this.client.user).has('EMBED_LINKS')) {
const embed = new MessageEmbed()
.setAuthor(msg.author.tag, msg.author.displayAvatarURL())
.setColor(0xFF0000)
.setTimestamp()
.setDescription(stripIndents`
**Member:** ${member.user.tag} (${member.id})
**Action:** Ban
**Reason:** ${reason}
`);
return modlogs.send({ embed });
} else {
return modlogs.send(stripIndents`
**Member:** ${member.user.tag} (${member.id})
**Action:** Ban
**Reason:** ${reason}
**Moderator:** ${msg.author.tag}
`);
}
}
};
+81
View File
@@ -0,0 +1,81 @@
const Command = require('../../structures/Command');
const { MessageEmbed } = require('discord.js');
const { stripIndents } = require('common-tags');
module.exports = class KickCommand extends Command {
constructor(client) {
super(client, {
name: 'kick',
aliases: ['kickke'],
group: 'moderation',
memberName: 'kick',
description: 'Kicks a user and logs the kick to the mod logs.',
guildOnly: true,
clientPermissions: ['KICK_MEMBERS'],
userPermissions: ['KICK_MEMBERS'],
args: [
{
key: 'member',
prompt: 'What member do you want to kick?',
type: 'member'
},
{
key: 'reason',
prompt: 'What do you want to set the reason as?',
type: 'string',
validate: (reason) => {
if (reason.length < 140) return true;
else return 'Reason must be under 140 characters.';
}
}
]
});
}
async run(msg, args) {
const modlogs = msg.guild.channels.filter((c) => {
const topic = c.topic || '';
if (topic.includes('<modlog>')) return true;
else return false;
}).first() || msg.guild.channels.find('name', 'mod-log');
const { member, reason } = args;
if (!member.kickable) return msg.say('This member is not kickable. Perhaps they have a higher role than me?');
await msg.say(`Are you sure you want to kick ${member.user.tag} (${member.id})?`);
const msgs = await msg.channel.awaitMessages((res) => res.author.id === msg.author.id, {
max: 1,
time: 30000
});
if (!msgs.size || !['y', 'yes'].includes(msgs.first().content.toLowerCase())) return msg.say('Aborting.');
try {
await member.send(stripIndents`
You were kicked from ${msg.guild.name}!
Reason: ${reason}
`);
} catch (err) {
await msg.say('Failed to Send DM.');
}
await member.kick({ reason: `${msg.author.tag}: ${reason}` });
await msg.say(`Successfully kicked ${member.user.tag}.`);
if (!modlogs || !modlogs.permissionsFor(this.client.user).has('SEND_MESSAGES')) {
return msg.say('Could not log the kick to the mod logs.');
} else if (modlogs.permissionsFor(this.client.user).has('EMBED_LINKS')) {
const embed = new MessageEmbed()
.setAuthor(msg.author.tag, msg.author.displayAvatarURL())
.setColor(0xFFA500)
.setTimestamp()
.setDescription(stripIndents`
**Member:** ${member.user.tag} (${member.id})
**Action:** Kick
**Reason:** ${reason}
`);
return modlogs.send({ embed });
} else {
return modlogs.send(stripIndents`
**Member:** ${member.user.tag} (${member.id})
**Action:** Kick
**Reason:** ${reason}
**Moderator:** ${msg.author.tag}
`);
}
}
};
+43
View File
@@ -0,0 +1,43 @@
const Command = require('../../structures/Command');
const { stripIndents } = require('common-tags');
module.exports = class LockdownCommand extends Command {
constructor(client) {
super(client, {
name: 'lockdown',
group: 'moderation',
memberName: 'lockdown',
description: 'Prevents users from posting in the current channel, or removes a lockdown.',
guildOnly: true,
clientPermissions: ['ADMINISTRATOR'],
userPermissions: ['ADMINISTRATOR'],
args: [
{
key: 'type',
prompt: 'Please enter either start or stop.',
type: 'string',
default: 'start',
validate: (type) => {
if (['start', 'stop'].includes(type.toLowerCase())) return true;
else return 'Please enter either start or stop.';
},
parse: (type) => type.toLowerCase()
}
]
});
}
async run(msg, args) {
const { type } = args;
if (type === 'start') {
await msg.channel.overwritePermissions(msg.guild.defaultRole, { SEND_MESSAGES: false });
return msg.say(stripIndents`
Lockdown Started, users without Administrator can no longer post messages.
Please use \`lockdown stop\` to end the lockdown.
`);
} else {
await msg.channel.overwritePermissions(msg.guild.defaultRole, { SEND_MESSAGES: null });
return msg.say('Lockdown Ended.');
}
}
};
+42
View File
@@ -0,0 +1,42 @@
const Command = require('../../structures/Command');
module.exports = class PruneCommand extends Command {
constructor(client) {
super(client, {
name: 'prune',
group: 'moderation',
memberName: 'prune',
description: 'Deletes up to 99 messages from the current channel.',
guildOnly: true,
throttling: {
usages: 1,
duration: 15
},
clientPermissions: ['READ_MESSAGE_HISTORY', 'MANAGE_MESSAGES'],
userPermissions: ['MANAGE_MESSAGES'],
args: [
{
key: 'count',
label: 'amount of messages',
prompt: 'How many messages do you want to delete? Limit of up to 99.',
type: 'integer',
validate: (count) => {
if (count < 100 && count > 0) return true;
else return 'Count must be from 1-99.';
}
}
]
});
}
async run(msg, args) {
const { count } = args;
try {
const messages = await msg.channel.fetchMessages({ limit: count + 1 });
await msg.channel.bulkDelete(messages, true);
return null;
} catch (err) {
return msg.say('There are no messages younger than two weeks that can be deleted.');
}
}
};
+85
View File
@@ -0,0 +1,85 @@
const Command = require('../../structures/Command');
const { MessageEmbed } = require('discord.js');
const { stripIndents } = require('common-tags');
module.exports = class SoftbanCommand extends Command {
constructor(client) {
super(client, {
name: 'softban',
aliases: ['softbanne'],
group: 'moderation',
memberName: 'softban',
description: 'Kicks a user and deletes their messages, and logs the softban to the mod logs.',
guildOnly: true,
clientPermissions: ['BAN_MEMBERS'],
userPermissions: ['KICK_MEMBERS'],
args: [
{
key: 'member',
prompt: 'What member do you want to softban?',
type: 'member'
},
{
key: 'reason',
prompt: 'What do you want to set the reason as?',
type: 'string',
validate: (reason) => {
if (reason.length < 140) return true;
else return 'Reason must be under 140 characters.';
}
}
]
});
}
async run(msg, args) {
const modlogs = msg.guild.channels.filter((c) => {
const topic = c.topic || '';
if (topic.includes('<modlog>')) return true;
else return false;
}).first() || msg.guild.channels.find('name', 'mod-log');
const { member, reason } = args;
if (!member.bannable) return msg.say('This member is not bannable. Perhaps they have a higher role than me?');
await msg.say(`Are you sure you want to softban ${member.user.tag} (${member.id})?`);
const msgs = await msg.channel.awaitMessages((res) => res.author.id === msg.author.id, {
max: 1,
time: 30000
});
if (!msgs.size || !['y', 'yes'].includes(msgs.first().content.toLowerCase())) return msg.say('Aborting.');
try {
await member.send(stripIndents`
You were softbanned from ${msg.guild.name}!
Reason: ${reason}
`);
} catch (err) {
await msg.say('Failed to Send DM.');
}
await member.ban({
days: 7,
reason: `${msg.author.tag}: ${reason} (Softban)`
});
await msg.guild.unban(member.user, 'Softban');
await msg.say(`Successfully softbanned ${member.user.tag}.`);
if (!modlogs || !modlogs.permissionsFor(this.client.user).has('SEND_MESSAGES')) {
return msg.say('Could not log the softban to the mod logs.');
} else if (modlogs.permissionsFor(this.client.user).has('EMBED_LINKS')) {
const embed = new MessageEmbed()
.setAuthor(msg.author.tag, msg.author.displayAvatarURL())
.setColor(0xFF4500)
.setTimestamp()
.setDescription(stripIndents`
**Member:** ${member.user.tag} (${member.id})
**Action:** Softban
**Reason:** ${reason}
`);
return modlogs.send({ embed });
} else {
return modlogs.send(stripIndents`
**Member:** ${member.user.tag} (${member.id})
**Action:** Softban
**Reason:** ${reason}
**Moderator:** ${msg.author.tag}
`);
}
}
};
+75
View File
@@ -0,0 +1,75 @@
const Command = require('../../structures/Command');
const { MessageEmbed } = require('discord.js');
const { stripIndents } = require('common-tags');
module.exports = class UnbanCommand extends Command {
constructor(client) {
super(client, {
name: 'unban',
aliases: ['unbanne'],
group: 'moderation',
memberName: 'unban',
description: 'Unbans a user and logs the unban to the mod logs.',
guildOnly: true,
clientPermissions: ['BAN_MEMBERS'],
userPermissions: ['BAN_MEMBERS'],
args: [
{
key: 'id',
prompt: 'What is the id of the member you want to unban?',
type: 'string'
},
{
key: 'reason',
prompt: 'What do you want to set the reason as?',
type: 'string',
validate: (reason) => {
if (reason.length < 140) return true;
else return 'Reason must be under 140 characters.';
}
}
]
});
}
async run(msg, args) {
const modlogs = msg.guild.channels.filter((c) => {
const topic = c.topic || '';
if (topic.includes('<modlog>')) return true;
else return false;
}).first() || msg.guild.channels.find('name', 'mod-log');
const { id, reason } = args;
const bans = await msg.guild.fetchBans();
if (!bans.has(id)) return msg.say('This ID is not in the Guild Banlist.');
const member = bans.get(id).user;
await msg.say(`Are you sure you want to unban ${member.tag} (${member.id})?`);
const msgs = await msg.channel.awaitMessages((res) => res.author.id === msg.author.id, {
max: 1,
time: 30000
});
if (!msgs.size || !['y', 'yes'].includes(msgs.first().content.toLowerCase())) return msg.say('Aborting.');
await msg.guild.unban(member, `${msg.author.tag}: ${reason}`);
await msg.say(`Successfully unbanned ${member.user.tag}.`);
if (!modlogs || !modlogs.permissionsFor(this.client.user).has('SEND_MESSAGES')) {
return msg.say('Could not log the unban to the mod logs.');
} else if (modlogs.permissionsFor(this.client.user).has('EMBED_LINKS')) {
const embed = new MessageEmbed()
.setAuthor(msg.author.tag, msg.author.displayAvatarURL())
.setColor(0x00AE86)
.setTimestamp()
.setDescription(stripIndents`
**Member:** ${member.user.tag} (${member.id})
**Action:** Unban
**Reason:** ${reason}
`);
return modlogs.send({ embed });
} else {
return modlogs.send(stripIndents`
**Member:** ${member.user.tag} (${member.id})
**Action:** Unban
**Reason:** ${reason}
**Moderator:** ${msg.author.tag}
`);
}
}
};
+78
View File
@@ -0,0 +1,78 @@
const Command = require('../../structures/Command');
const { MessageEmbed } = require('discord.js');
const { stripIndents } = require('common-tags');
module.exports = class WarnCommand extends Command {
constructor(client) {
super(client, {
name: 'warn',
aliases: ['warnne'],
group: 'moderation',
memberName: 'warn',
description: 'Warns a user and logs the warn to the mod logs.',
guildOnly: true,
userPermissions: ['KICK_MEMBERS'],
args: [
{
key: 'member',
prompt: 'What member do you want to warn?',
type: 'member'
},
{
key: 'reason',
prompt: 'What do you want to set the reason as?',
type: 'string',
validate: (reason) => {
if (reason.length < 140) return true;
else return 'Invalid Reason. Reason must be under 140 characters.';
}
}
]
});
}
async run(msg, args) {
const modlogs = msg.guild.channels.filter((c) => {
const topic = c.topic || '';
if (topic.includes('<modlog>')) return true;
else return false;
}).first() || msg.guild.channels.find('name', 'mod-log');
const { member, reason } = args;
await msg.say(`Are you sure you want to warn ${member.user.tag} (${member.id})?`);
const msgs = await msg.channel.awaitMessages((res) => res.author.id === msg.author.id, {
max: 1,
time: 30000
});
if (!msgs.size || !['y', 'yes'].includes(msgs.first().content.toLowerCase())) return msg.say('Aborting.');
try {
await member.user.send(stripIndents`
You were warned in ${msg.guild.name}!
Reason: ${reason}
`);
} catch (err) {
await msg.say('Failed to Send DM.');
}
await msg.say(`Successfully warned ${member.user.tag}.`);
if (!modlogs || !modlogs.permissionsFor(this.client.user).has('SEND_MESSAGES')) {
return msg.say('Could not log the warn to the mod logs.');
} else if (modlogs.permissionsFor(this.client.user).has('EMBED_LINKS')) {
const embed = new MessageEmbed()
.setAuthor(msg.author.tag, msg.author.displayAvatarURL())
.setColor(0xFFFF00)
.setTimestamp()
.setDescription(stripIndents`
**Member:** ${member.user.tag} (${member.id})
**Action:** Warn
**Reason:** ${reason}
`);
return modlogs.send({ embed });
} else {
return modlogs.send(stripIndents`
**Member:** ${member.user.tag} (${member.id})
**Action:** Warn
**Reason:** ${reason}
**Moderator:** ${msg.author.tag}
`);
}
}
};
+54
View File
@@ -0,0 +1,54 @@
const Command = require('../../structures/Command');
const snekfetch = require('snekfetch');
const codes = require('../../assets/json/currency');
module.exports = class CurrencyCommand extends Command {
constructor(client) {
super(client, {
name: 'currency',
group: 'num-edit',
memberName: 'currency',
description: 'Converts a number from one currency to another.',
details: `**Codes:** ${codes.join(', ')}`,
args: [
{
key: 'base',
prompt: 'What currency code do you want to use as the base?',
type: 'string',
validate: (base) => {
if (codes.includes(base.toUpperCase())) return true;
else return 'Invalid Currency Code. Use `help currency` to view a list of currency codes.';
},
parse: (base) => base.toUpperCase()
},
{
key: 'to',
prompt: 'What currency code do you want to convert to?',
type: 'string',
validate: (to) => {
if (codes.includes(to.toUpperCase())) return true;
else return 'Invalid Currency Code. Use `help currency` to view a list of currency codes.';
},
parse: (to) => to.toUpperCase()
},
{
key: 'amount',
prompt: 'How much money should be converted? Do not use symbols.',
type: 'integer'
}
]
});
}
async run(msg, args) {
const { base, to, amount } = args;
if (base === to) return msg.say(`Converting ${base} to ${to} is the same value, dummy.`);
const { body } = await snekfetch
.get('http://api.fixer.io/latest')
.query({
base,
symbols: to
});
return msg.say(`${amount} ${base} is ${amount * body.rates[to]} ${to}.`);
}
};
+30
View File
@@ -0,0 +1,30 @@
const Command = require('../../structures/Command');
const math = require('mathjs');
module.exports = class MathCommand extends Command {
constructor(client) {
super(client, {
name: 'math',
group: 'num-edit',
memberName: 'math',
description: 'Evaluates math expressions.',
args: [
{
key: 'expression',
prompt: 'What do you want to answer?',
type: 'string'
}
]
});
}
run(msg, args) {
const { expression } = args;
try {
const solved = math.eval(expression).toString();
return msg.say(solved).catch(() => msg.say('Invalid Statement'));
} catch (err) {
return msg.say('Invalid Statement');
}
}
};
+55
View File
@@ -0,0 +1,55 @@
const Command = require('../../structures/Command');
module.exports = class TemperatureCommand extends Command {
constructor(client) {
super(client, {
name: 'temperature',
group: 'num-edit',
memberName: 'temperature',
description: 'Converts temperatures to/from Celsius, Fahrenheit, or Kelvin.',
args: [
{
key: 'base',
prompt: 'What temperature unit do you want to use as the base?',
type: 'string',
validate: (base) => {
if (['celsius', 'fahrenheit', 'kelvin'].includes(base.toLowerCase())) return true;
else return 'Please enter either celsius, fahrenheit, or kelvin.';
},
parse: (base) => base.toLowerCase()
},
{
key: 'to',
prompt: 'What temperature unit do you want to convert to?',
type: 'string',
validate: (to) => {
if (['celsius', 'fahrenheit', 'kelvin'].includes(to.toLowerCase())) return true;
else return 'Please enter either celsius, fahrenheit, or kelvin.';
},
parse: (to) => to.toLowerCase()
},
{
key: 'amount',
prompt: 'What temperature should be converted?',
type: 'integer'
}
]
});
}
run(msg, args) { // eslint-disable-line consistent-return
const { base, to, amount } = args;
if (base === to) {
return msg.say(`Converting ${base} to ${to} is the same value, dummy.`);
} else if (base === 'celsius') {
if (to === 'fahrenheit') return msg.say(`${amount}°C is ${(amount * 1.8) + 32}°F.`);
else if (to === 'kelvin') return msg.say(`${amount}°C is ${amount + 273.15}°K.`);
} else if (base === 'fahrenheit') {
if (to === 'celsius') return msg.say(`${amount}°F is ${(amount - 32) / 1.8}°C.`);
else if (to === 'kelvin') return msg.say(`${amount}°F is ${(amount + 459.67) * (5 / 9)}°K.`);
} else if (base === 'kelvin') {
if (to === 'celsius') return msg.say(`${amount}°K is ${amount - 273.15}°C.`);
else if (to === 'fahrenheit') return msg.say(`${amount}°K is ${(amount * 1.8) - 459.67}°F.`);
}
}
};
+20
View File
@@ -0,0 +1,20 @@
const Command = require('../../structures/Command');
const snekfetch = require('snekfetch');
module.exports = class CatCommand extends Command {
constructor(client) {
super(client, {
name: 'cat',
aliases: ['neko'],
group: 'random-img',
memberName: 'cat',
description: 'Responds with a random cat image.'
});
}
async run(msg) {
const { body } = await snekfetch
.get('http://random.cat/meow');
return msg.say(body.file);
}
};
+19
View File
@@ -0,0 +1,19 @@
const Command = require('../../structures/Command');
const snekfetch = require('snekfetch');
module.exports = class DogCommand extends Command {
constructor(client) {
super(client, {
name: 'dog',
group: 'random-img',
memberName: 'dog',
description: 'Responds with a random dog image.'
});
}
async run(msg) {
const { body } = await snekfetch
.get('https://random.dog/woof.json');
return msg.say(body.url);
}
};
+18
View File
@@ -0,0 +1,18 @@
const Command = require('../../structures/Command');
const songs = require('../../assets/json/vocaloid');
module.exports = class VocaloidCommand extends Command {
constructor(client) {
super(client, {
name: 'vocaloid',
group: 'random-img',
memberName: 'vocaloid',
description: 'Responds with a random VOCALOID song.'
});
}
run(msg) {
const song = songs[Math.floor(Math.random() * songs.length)];
return msg.say(song);
}
};
+20
View File
@@ -0,0 +1,20 @@
const Command = require('../../structures/Command');
const xiaos = require('../../assets/json/xiao');
module.exports = class XiaoCommand extends Command {
constructor(client) {
super(client, {
name: 'xiao',
aliases: ['xiao-pai'],
group: 'random-img',
memberName: 'xiao',
description: 'Responds with a random image of Xiao Pai.',
clientPermissions: ['ATTACH_FILES']
});
}
run(msg) {
const xiao = xiaos[Math.floor(Math.random() * xiaos.length)];
return msg.say({ files: [xiao] });
}
};
+30
View File
@@ -0,0 +1,30 @@
const Command = require('../../structures/Command');
const { stripIndents } = require('common-tags');
const answers = require('../../assets/json/8-ball');
module.exports = class MagicBallCommand extends Command {
constructor(client) {
super(client, {
name: '8-ball',
group: 'random-res',
memberName: '8-ball',
description: 'Asks your question to the Magic 8 Ball.',
args: [
{
key: 'question',
prompt: 'What do you want to ask the 8 ball?',
type: 'string'
}
]
});
}
run(msg, args) {
const { question } = args;
const answer = answers[Math.floor(Math.random() * answers.length)];
return msg.say(stripIndents`
Question: ${question}
:8ball: ${answer} :8ball:
`);
}
};
+26
View File
@@ -0,0 +1,26 @@
const Command = require('../../structures/Command');
module.exports = class ChooseCommand extends Command {
constructor(client) {
super(client, {
name: 'choose',
group: 'random-res',
memberName: 'choose',
description: 'Chooses between options you provide.',
args: [
{
key: 'choices',
prompt: 'What choices do you want me pick from?',
type: 'string',
infinite: true
}
]
});
}
run(msg, args) {
const { choices } = args;
const choice = choices[Math.floor(Math.random() * choices.length)];
return msg.say(`I choose ${choice}!`);
}
};
+19
View File
@@ -0,0 +1,19 @@
const Command = require('../../structures/Command');
const sides = ['heads', 'tails'];
module.exports = class CoinFlipCommand extends Command {
constructor(client) {
super(client, {
name: 'coin',
aliases: ['coin-flip', 'flip'],
group: 'random-res',
memberName: 'coin',
description: 'Flips a coin.'
});
}
run(msg) {
const side = sides[Math.floor(Math.random() * sides.length)];
return msg.say(`It landed on ${side}!`);
}
};
+27
View File
@@ -0,0 +1,27 @@
const Command = require('../../structures/Command');
const compliments = require('../../assets/json/compliment');
module.exports = class ComplimentCommand extends Command {
constructor(client) {
super(client, {
name: 'compliment',
group: 'random-res',
memberName: 'compliment',
description: 'Compliments a user.',
args: [
{
key: 'user',
prompt: 'What user do you want to compliment?',
type: 'user',
default: ''
}
]
});
}
run(msg, args) {
const user = args.user || msg.author;
const compliment = compliments[Math.floor(Math.random() * compliments.length)];
return msg.say(`${user.username}, ${compliment}`);
}
};
+18
View File
@@ -0,0 +1,18 @@
const Command = require('../../structures/Command');
const facts = require('../../assets/json/fact-core');
module.exports = class FactCoreCommand extends Command {
constructor(client) {
super(client, {
name: 'fact-core',
group: 'random-res',
memberName: 'fact-core',
description: 'Responds with a random Fact Core quote.'
});
}
run(msg) {
const fact = facts[Math.floor(Math.random() * facts.length)];
return msg.say(fact);
}
};
+18
View File
@@ -0,0 +1,18 @@
const Command = require('../../structures/Command');
const fishes = [':fish:', ':tropical_fish:', ':blowfish:', ':wrench:'];
module.exports = class FishyCommand extends Command {
constructor(client) {
super(client, {
name: 'fishy',
group: 'random-res',
memberName: 'fishy',
description: 'Catches a fish.'
});
}
run(msg) {
const fish = fishes[Math.floor(Math.random() * fishes.length)];
return msg.say(`You caught a: ${fish}`);
}
};
+19
View File
@@ -0,0 +1,19 @@
const Command = require('../../structures/Command');
const fortunes = require('../../assets/json/fortune');
module.exports = class FortuneCommand extends Command {
constructor(client) {
super(client, {
name: 'fortune',
aliases: ['fortune-cookie'],
group: 'random-res',
memberName: 'fortune',
description: 'Responds with a random fortune.'
});
}
run(msg) {
const fortune = fortunes[Math.floor(Math.random() * fortunes.length)];
return msg.say(fortune);
}
};
@@ -0,0 +1,30 @@
const Command = require('../../structures/Command');
const { stripIndents } = require('common-tags');
const answers = require('../../assets/json/magic-conch');
module.exports = class MagicConchCommand extends Command {
constructor(client) {
super(client, {
name: 'magic-conch',
group: 'random-res',
memberName: 'magic-conch',
description: 'Asks your question to the Magic Conch.',
args: [
{
key: 'question',
prompt: 'What do you want to ask the magic conch?',
type: 'string'
}
]
});
}
run(msg, args) {
const { question } = args;
const answer = answers[Math.floor(Math.random() * answers.length)];
return msg.say(stripIndents`
Question: ${question}
:shell: ${answer} :shell:
`);
}
};
+48
View File
@@ -0,0 +1,48 @@
const Command = require('../../structures/Command');
const { lastNames, maleNames, femaleNames } = require('../../assets/json/name');
module.exports = class RandomNameCommand extends Command {
constructor(client) {
super(client, {
name: 'name',
group: 'random-res',
memberName: 'name',
description: 'Responds with a random name, with the gender of your choice.',
args: [
{
key: 'gender',
prompt: 'Which gender do you want to generate a name for?',
type: 'string',
default: 'both',
validate: (gender) => {
if (['male', 'female', 'both'].includes(gender.toLowerCase())) return true;
else return 'Please enter either male, female, or both.';
},
parse: (gender) => gender.toLowerCase()
}
]
});
}
run(msg, args) { // eslint-disable-line consistent-return
const { gender } = args;
const lastName = lastNames[Math.floor(Math.random() * lastNames.length)];
if (gender === 'male') {
const name = maleNames[Math.floor(Math.random() * maleNames.length)];
return msg.say(`${name} ${lastName}`);
} else if (gender === 'female') {
const name = femaleNames[Math.floor(Math.random() * femaleNames.length)];
return msg.say(`${name} ${lastName}`);
} else if (gender === 'both') {
const genders = ['male', 'female'];
const randomGender = genders[Math.floor(Math.random() * genders.length)];
if (randomGender === 'male') {
const name = maleNames[Math.floor(Math.random() * maleNames.length)];
return msg.say(`${name} ${lastName}`);
} else if (randomGender === 'female') {
const name = femaleNames[Math.floor(Math.random() * femaleNames.length)];
return msg.say(`${name} ${lastName}`);
}
}
}
};
+18
View File
@@ -0,0 +1,18 @@
const Command = require('../../structures/Command');
const genders = ['boy', 'girl'];
module.exports = class OffspringCommand extends Command {
constructor(client) {
super(client, {
name: 'offspring',
group: 'random-res',
memberName: 'offspring',
description: 'Decides if your new child will be a boy or a girl.'
});
}
run(msg) {
const gender = genders[Math.floor(Math.random() * genders.length)];
return msg.say(`It's a ${gender}!`);
}
};
@@ -0,0 +1,19 @@
const Command = require('../../structures/Command');
const sides = ['on nothing', 'on NaN', 'on 0', 'in the air', 'on null'];
module.exports = class QuantumCoinCommand extends Command {
constructor(client) {
super(client, {
name: 'quantum-coin',
aliases: ['q-coin'],
group: 'random-res',
memberName: 'quantum-coin',
description: 'Flips a coin that lands on some form of nothing.'
});
}
run(msg) {
const side = sides[Math.floor(Math.random() * sides.length)];
return msg.say(`It landed ${side}.`);
}
};
+26
View File
@@ -0,0 +1,26 @@
const Command = require('../../structures/Command');
module.exports = class RateWaifuCommand extends Command {
constructor(client) {
super(client, {
name: 'rate-waifu',
aliases: ['waifu'],
group: 'random-res',
memberName: 'rate-waifu',
description: 'Rates your waifu.',
args: [
{
key: 'waifu',
prompt: 'Who do you want to rate?',
type: 'string'
}
]
});
}
run(msg, args) {
const { waifu } = args;
const rating = Math.floor(Math.random() * 10) + 1;
return msg.say(`I'd give ${waifu} a ${rating}/10!`);
}
};
+27
View File
@@ -0,0 +1,27 @@
const Command = require('../../structures/Command');
const roasts = require('../../assets/json/roast');
module.exports = class RoastCommand extends Command {
constructor(client) {
super(client, {
name: 'roast',
group: 'random-res',
memberName: 'roast',
description: 'Roasts a user.',
args: [
{
key: 'user',
prompt: 'What user do you want to roast?',
type: 'user',
default: ''
}
]
});
}
run(msg, args) {
const user = args.user || msg.author;
const roast = roasts[Math.floor(Math.random() * roasts.length)];
return msg.say(`${user.username}, ${roast}`);
}
};
+28
View File
@@ -0,0 +1,28 @@
const Command = require('../../structures/Command');
module.exports = class RollCommand extends Command {
constructor(client) {
super(client, {
name: 'roll',
aliases: ['dice'],
group: 'random-res',
memberName: 'roll',
description: 'Rolls a dice with a maximum value of your choice.',
args: [
{
key: 'value',
label: 'maximum number',
prompt: 'What is the maximum number you wish to appear?',
type: 'integer',
default: 6
}
]
});
}
run(msg, args) {
const { value } = args;
const roll = Math.floor(Math.random() * value) + 1;
return msg.say(`You rolled a ${roll}.`);
}
};
+17
View File
@@ -0,0 +1,17 @@
const Command = require('../../structures/Command');
module.exports = class RouletteCommand extends Command {
constructor(client) {
super(client, {
name: 'roulette',
group: 'random-res',
memberName: 'roulette',
description: 'Chooses a random member of the server.',
guildOnly: true
});
}
run(msg) {
return msg.say(`I choose ${msg.guild.members.random().displayName}!`);
}
};
+27
View File
@@ -0,0 +1,27 @@
const Command = require('../../structures/Command');
module.exports = class ShipCommand extends Command {
constructor(client) {
super(client, {
name: 'ship',
group: 'random-res',
memberName: 'ship',
description: 'Ships things/people together.',
args: [
{
key: 'things',
prompt: 'What do you want to ship together?',
type: 'string',
infinite: true
}
]
});
}
run(msg, args) {
const { things } = args;
const rating = Math.floor(Math.random() * 100) + 1;
const list = `${things.slice(0, -1).join(', ')}${things.length > 1 ? ' and ' : ''}${things.slice(-1)}`;
return msg.say(`I'd give ${list} a ${rating}%!`);
}
};
+31
View File
@@ -0,0 +1,31 @@
const Command = require('../../structures/Command');
const eastereggs = require('../../assets/json/easter-egg');
module.exports = class EasterEggCommand extends Command {
constructor(client) {
super(client, {
name: 'easter-egg',
aliases: ['tag'],
group: 'random',
memberName: 'easter-egg',
description: 'Can you discover all the easter eggs?',
args: [
{
key: 'tag',
prompt: 'What easter egg do you want to view?',
type: 'string',
validate: (tag) => {
if (eastereggs[tag.toLowerCase()]) return true;
else return 'Nope, that\'s not a valid easter egg. Try again!';
},
parse: (tag) => tag.toLowerCase()
}
]
});
}
run(msg, args) {
const { tag } = args;
return msg.say(eastereggs[tag]);
}
};
+16
View File
@@ -0,0 +1,16 @@
const Command = require('../../structures/Command');
module.exports = class GiveFlowerCommand extends Command {
constructor(client) {
super(client, {
name: 'give-flower',
group: 'random',
memberName: 'give-flower',
description: 'Gives Xiao Pai a flower.'
});
}
run(msg) {
return msg.say('Ooh, what a pretty flower. What, I may have it? Thanks! I like flowers, yes? ♪');
}
};
+48
View File
@@ -0,0 +1,48 @@
const Command = require('../../structures/Command');
const { MessageEmbed } = require('discord.js');
const snekfetch = require('snekfetch');
const signs = require('../../assets/json/horoscope');
module.exports = class HoroscopeCommand extends Command {
constructor(client) {
super(client, {
name: 'horoscope',
group: 'random',
memberName: 'horoscope',
description: 'Responds with today\'s horoscope for a particular sign.',
details: `**Signs:** ${signs.join(', ')}`,
clientPermissions: ['EMBED_LINKS'],
args: [
{
key: 'sign',
prompt: 'Which sign would you like to get the horoscope for?',
type: 'string',
validate: (sign) => {
if (signs.includes(sign.toLowerCase())) return true;
else return 'Invalid sign. Use `help horoscope` for a list of signs.';
},
parse: (sign) => sign.toLowerCase()
}
]
});
}
async run(msg, args) {
const { sign } = args;
const { text } = await snekfetch
.get(`http://sandipbgt.com/theastrologer/api/horoscope/${sign}/today`);
const body = JSON.parse(text);
const embed = new MessageEmbed()
.setColor(0x9797FF)
.setTitle(`Horoscope for ${body.sunsign}...`)
.setTimestamp()
.setDescription(body.horoscope)
.addField('Mood',
body.meta.mood, true)
.addField('Intensity',
body.meta.intensity, true)
.addField('Date',
body.date, true);
return msg.embed(embed);
}
};

Some files were not shown because too many files have changed in this diff Show More