Compare commits

..

31 commits

Author SHA1 Message Date
Jan be37e998e5 h 2021-02-18 15:22:32 +01:00
Jan 216960f3e2 h 2021-02-13 15:50:55 +01:00
Jan 09bda53ece fix readme 2021-02-13 15:39:40 +01:00
Jan befc5dc8e6 oh no 2021-02-13 15:35:24 +01:00
Jan a4e568dec6 fix death 2021-02-10 14:21:09 +01:00
Jan 6720bee0e5 Merge branch 'master' of https://gitea.janderedev.xyz/Jan/obama-bot 2021-02-07 16:37:07 +01:00
Jan 35bbe61979 fix warning message timeout 2021-02-07 16:37:03 +01:00
Jan 8f463087ed fix dependencies 2021-01-21 12:18:50 +00:00
Jan c9d19e77ff magic 2021-01-07 02:40:57 +01:00
Jan 0af48d3f0b bruh 2021-01-07 02:08:52 +01:00
Jan 6cb0156106 add 'bruh' intent and random award multiplier 2020-12-30 16:24:31 +01:00
Jan bace97c0f0 process.exit() 2020-12-27 14:42:22 +01:00
Jan 955fe8c462 Set activity 2020-12-27 14:32:23 +01:00
Jan e3c471e390 Add credits 2020-12-27 14:32:05 +01:00
Jan 01c647d675 Add SIGINT handler 2020-12-27 14:31:47 +01:00
Jan f39c4a7ee1 delete useless info command 2020-12-27 14:02:39 +01:00
Jan 5149dab7c6 Add the jsdoc thingy to every command to fix intellisense 2020-12-27 13:59:54 +01:00
Jan 41fbaa84ce Add copypasta command 2020-12-27 13:57:35 +01:00
Jan c6a7ea023c renamed variables 2020-12-27 13:27:16 +01:00
Jan 2e077cfe1a Updated license
to the shitass who parked giant-penis-license.org, I hope your digestive system rips
2020-12-27 13:24:22 +01:00
Jan ee908585ae Fix logging 2020-12-27 13:04:08 +01:00
Jan 19b4583d2c Fixed bug 2020-12-27 12:57:38 +01:00
Jan 6b03ce8f7d moar coed 2020-12-23 14:12:45 +01:00
Jan a9e18d9750 add code 2020-12-23 14:08:41 +01:00
Jan c953f74e30 r 2020-12-23 14:03:07 +01:00
Jan 91693ce2ae testing in prod 2020-12-23 13:58:04 +01:00
Jan 1e1b78e24f aaaaaaaaaaaa 2020-12-23 13:50:02 +01:00
Jan a96e3cbd96 add code 2020-12-23 13:48:30 +01:00
Jan f50de3e481 h 2020-12-23 13:38:31 +01:00
Jan c15e5b4d01 burh 2020-11-28 23:51:35 +01:00
Jan 810b2b9236 Remade bot 2020-11-28 17:38:23 +01:00
32 changed files with 7436 additions and 16 deletions

116
.gitignore vendored Normal file
View file

@ -0,0 +1,116 @@
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
lerna-debug.log*
# Diagnostic reports (https://nodejs.org/api/report.html)
report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
# Runtime data
pids
*.pid
*.seed
*.pid.lock
# Directory for instrumented libs generated by jscoverage/JSCover
lib-cov
# Coverage directory used by tools like istanbul
coverage
*.lcov
# nyc test coverage
.nyc_output
# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
.grunt
# Bower dependency directory (https://bower.io/)
bower_components
# node-waf configuration
.lock-wscript
# Compiled binary addons (https://nodejs.org/api/addons.html)
build/Release
# Dependency directories
node_modules/
jspm_packages/
# Snowpack dependency directory (https://snowpack.dev/)
web_modules/
# TypeScript v1 declaration files
typings/
# TypeScript cache
*.tsbuildinfo
# Optional npm cache directory
.npm
# Optional eslint cache
.eslintcache
# Microbundle cache
.rpt2_cache/
.rts2_cache_cjs/
.rts2_cache_es/
.rts2_cache_umd/
# Optional REPL history
.node_repl_history
# Output of 'npm pack'
*.tgz
# Yarn Integrity file
.yarn-integrity
# dotenv environment variables file
.env
.env.test
# parcel-bundler cache (https://parceljs.org/)
.cache
# Next.js build output
.next
# Nuxt.js build / generate output
.nuxt
dist
# Gatsby files
.cache/
# Comment in the public line in if your project uses Gatsby and not Next.js
# https://nextjs.org/blog/next-9-1#public-directory-support
# public
# vuepress build output
.vuepress/dist
# Serverless directories
.serverless/
# FuseBox cache
.fusebox/
# DynamoDB Local files
.dynamodb/
# TernJS port file
.tern-port
# Stores VSCode versions used for testing VSCode extensions
.vscode-test
# The config file that contains the bot token
config.json
# The database that stores karma and coins
data

View file

@ -1,5 +1,5 @@
The Giant Penis License (GPL)
Copyright (c) 2020 Im_Verum
Copyright (c) 2020 jan
▄▄██▄██▄▄
▄█ █ █▄

View file

@ -1,5 +1,8 @@
# Obama Bot
A small Discord bot with crappy code that I made for the r/Obamium Discord server. pls dont judge my code
# Hosting the bot
If you, for whatever reason, want to host this bot yourself, good luck getting it to work.
# Copyright
This project is licensed under the [Giant Penis License](http://giant-penis-license.org/) which is basically a deformed MIT license.

61
commands/copypasta.js Normal file
View file

@ -0,0 +1,61 @@
const Discord = require('discord.js');
const fs = require('fs').promises;
const events = require('events');
const shutEmitter = new events.EventEmitter();
module.exports.meta = {
name: 'copypasta',
aliases: ['pasta'],
staffOnly: false,
epicOnly: true
}
/**
*
* @param {Discord.Message} message
* @param {Array<string>} args
*/
module.exports.run = async (message, args) => {
let copypastas = await fs.readdir(__dirname + '/copypastas');
let pasta = copypastas.find((p) => p.toLowerCase() == args[0]?.toLowerCase());
if (!pasta) {
message.channel.send(`Please choose one of: \`${copypastas.join('`, `')}\``);
return;
}
let lines = (await fs.readFile(__dirname + '/copypastas/' + pasta))
.toString('utf-8')
.split('\n')
.filter(line => line.trim() != '');
this.copypastaing[message.channel.id] = true;
sendLine();
const interval = setInterval(sendLine, 1500);
const listener = shutEmitter.once('shut', cid => {
if (cid == message.channel.id) {
clearInterval(interval);
this.copypastaing[message.channel.id] = false;
}
});
async function sendLine() {
if (lines.length == 0) {
this.copypastaing[message.channel.id] = false;
clearTimeout(interval);
shutEmitter.removeListener('shut', listener);
return;
}
const line = lines.shift();
await message.channel.send(line, { tts: true });
}
}
module.exports.shut = (channelID) => {
shutEmitter.emit('shut', channelID);
}
module.exports.copypastaing = {}

30
commands/copypastas/aaa Normal file
View file

@ -0,0 +1,30 @@
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

4565
commands/copypastas/beemovie Normal file

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,5 @@
You know, let's just say, hypothetically speaking, that I were to have sex with your mom.
Now, hypothetically speaking, if this did happen, I mean, you must remember that all physical matter has a very thin layer of atoms surrounding it, so technically, you are never truly
touching anything or anyone, but instead, the atoms surrounding your body and this object or person are coming into contact with one another.
So, once again, hypothetically speaking, if I were to attempt to have sex with your mom, I would fail miserably, because, according to science, our bodies would never come into contact
with one another.

28
commands/copypastas/cum Normal file
View file

@ -0,0 +1,28 @@
**Infinite cum.**
You sit on the toilet to jack off, but you begin to cum uncontrollably.
After ten spurts you start to worry. Your hand is sticky and it reeks of semen.
You desperately shove your dick into a wad of toilet paper, but that only makes your balls hurt.
The cum accelerates. Its been three minutes. You cant stop cumming.
Your bathroom floor is covered in a thin layer of baby fluid. You try to cum into the shower drain but it builds up too fast.
You try the toilet. The cum is too thick to be flushed. You lock the bathroom door to prevent the cum from escaping.
The air grows hot and humid from the cum. The cum accelerates. You slip and fall in your own sperm.
The cum is now six inches deep, almost as long as your still-erect semen hose. Sprawled on your back, you begin to cum all over the ceiling.
Globs of the sticky white fluid begin to fall like raindrops, giving you a facial with your own cum. The cum accelerates.
You struggle to stand as the force of the cum begins to propel you backwards as if you were on a bukkake themed slip-and-slide.
Still on your knees, the cum is now at chin height. To avoid drowning you open the bathroom door.
The deluge of man juice reminds you of the Great Molasses Flood of 1919, only with cum instead of molasses.
The cum accelerates. Its been two hours. Your children and wife scream in terror as their bodies are engulfed by the snow-white sludge.
Your youngest child goes under, with viscous bubbles and muffled cries rising from the goop. You plead to God to end your suffering. The cum accelerates.
You squeeze your dick to stop the cum, but it begins to leak out of your asshole instead. You let go.
The force of the cum tears your urethra open, leaving only a gaping hole in your crotch that spews semen.
Your body picks up speed as it slides backwards along the cum. You smash through the wall, hurtling into the sky at thirty miles an hour.
From a birds eye view you see your house is completely white. Your neighbor calls the cops. The cum accelerates.
As you continue to ascend, you spot police cars racing towards your house.
The cops pull out their guns and take aim, but stray loads of cum hit them in the eyes, blinding them. The cum accelerates.
You are now at an altitude of 1000 feet. The SWAT team arrives. Military helicopters circle you. Hundreds of bullets pierce your body at once, yet you stay conscious.
Your testicles have now grown into a substitute brain. The cum accelerates. It has been two days. With your body now destroyed, the cum begins to spray in all directions.
You break the sound barrier. The government deploys fighter jets to chase you down, but the impact of your cum sends one plane crashing to the ground.
The government decides to let you leave the earth. You feel your gonads start to burn up as you reach the edges of the atmosphere.
You narrowly miss the ISS, giving it a new white paint job as you fly past. Physicists struggle to calculate your erratic trajectory.
The cum accelerates. The cum begins to gravitate towards itself, forming a comet trail of semen. Astronomers begin calling you the “Cummet.”
You are stuck in space forever, stripped of your body and senses, forced to endure an eternity of cumshots. Eventually, you stop thinking.

View file

@ -0,0 +1,12 @@
What the fuck did you just fucking say about me, you little bitch?
Ill have you know I graduated top of my class in the Navy Seals, and Ive been involved in numerous secret raids on Al-Quaeda, and I have over 300 confirmed kills.
I am trained in gorilla warfare and Im the top sniper in the entire US armed forces. You are nothing to me but just another target.
I will wipe you the fuck out with precision the likes of which has never been seen before on this Earth, mark my fucking words.
You think you can get away with saying that shit to me over the Internet? Think again, fucker.
As we speak I am contacting my secret network of spies across the USA and your IP is being traced right now so you better prepare for the storm, maggot.
The storm that wipes out the pathetic little thing you call your life.
Youre fucking dead, kid. I can be anywhere, anytime, and I can kill you in over seven hundred ways, and thats just with my bare hands.
Not only am I extensively trained in unarmed combat, but I have access to the entire arsenal of the United States Marine Corps
and I will use it to its full extent to wipe your miserable ass off the face of the continent, you little shit.
If only you could have known what unholy retribution your little “clever” comment was about to bring down upon you, maybe you would have held your fucking tongue.
But you couldnt, you didnt, and now youre paying the price, you goddamn idiot. I will shit fury all over you and you will drown in it. Youre fucking dead, kiddo.

View file

@ -0,0 +1,10 @@
**AITA For Dropkicking an Toddler off a cliff because he used my Dead Name**
The title speaks for itself. So me (20F transitioning) was going on a hike with my cousin and his parents.
Theres this really large cliff that looms over my house. I recently told my family I was trans.
I thought my toddler cousin had realize me new name is Jenny. Instead he said Max.
I instantly flew into a mentally unstable rage and my eyes turned red. I began to drool and have a mini-seizure.
I ran toward my cousin at the speed of light. I picked him up by the back of his shirt.
His parents ran toward him but with my tranny-powers I managed to use my telekineses and freeze them in mid-air.
I threw my toddler cousin up in the air and using my tranny in the 40% powers kicked him at the speed of light.
He went fucking flying and I heard his little screams which made my gaping hole which used to be my dick until I forcefully castrated myself began to drip with precum.
I saw him fall to the ground and splatter by then I was so horny I came all over the place.

52
commands/eval.js Normal file
View file

@ -0,0 +1,52 @@
const Discord = require('discord.js');
const { inspect } = require('util');
const { logger, client } = require('../');
module.exports.meta = {
name: 'eval',
aliases: ['e']
}
/**
* @param {Discord.Message} message
* @param {Array<string>} args
*/
module.exports.run = async (message, args) => {
const ownerID = process.env.OWNER_ID;
if (!ownerID) return message.channel.send('Error: Bot owner is not configured. Set `OWNER_ID` env var.');
if (ownerID != message.author.id) {
logger.warn(`${message.author.tag} ${message.author.id} => Not bot owner`);
return;
}
try {
const exec = args.join(' ');
if (!exec) return message.channel.send('What do you want me to do, dumbass');
eval(
`(async () => {` +
`${exec.replace(/(```\w*\n)|\n```$/g, '')}\n` +
`})()`
)
.then(res => {
if (res == undefined)
message.react('✅')
.catch(() => message.channel.send('```js\nundefined\n```'));
else
message.channel.send(
`\`\`\`js\n${
inspect(res)
.replace(new RegExp(client.token, 'g'), '[Token removed]')
.slice(0, 1989)
}\n\`\`\``
);
})
.catch(e => {
message.channel.send(`\`\`\`js\n${(e && e.name && e.message ? `${e.name}: ${e.message}` : `Error: ${e}`).slice(0, 1989)}\n\`\`\``)
.catch(a => message.channel.send(a));
});
} catch(e) {
message.channel.send(`\`\`\`js\n${(e && e.name && e.message ? `${e.name}: ${e.message}` : `Error: ${e}`).slice(0, 1989)}\n\`\`\``)
.catch(a => message.channel.send(a));
}
}

41
commands/help.js Normal file
View file

@ -0,0 +1,41 @@
const { MessageEmbed } = require("discord.js");
const { client } = require("..");
const prefix = process.env.BOT_PREFIX || '-';
module.exports.meta = {
name: 'help',
aliases: ['info'],
staffOnly: false
}
/**
*
* @param {Discord.Message} message
* @param {Array<string>} args
*/
module.exports.run = async (message, args) => {
let embed = new MessageEmbed()
.setTitle('Obama bot')
.setDescription(`Epic obama bot help`)
addCmd(embed, 'obamium', 'Spawn obamium');
addCmd(embed, 'vbucks', 'Get free vbucks');
addCmd(embed, 'ping', 'Show the bot\'s ping');
addCmd(embed, 'coins', 'See how much karma/coins you have');
addCmd(embed, 'top', 'Karma leaderboard');
addCmd(embed, 'setcoins', '[Staff command] Manage a user\'s coins')
embed.addField('\u200b', `This bot was made by \`${client.users.cache.get('284323826165350400')?.tag}\`.\nCheck out the source code [here](https://gitea.janderedev.xyz/Jan/obama-bot "Click me!").`, false);
message.channel.send(embed);
}
/**
*
* @param {MessageEmbed} embed
* @param {string} cmd
* @param {string} text
*/
function addCmd(embed, cmd, text) {
embed.addField(`${prefix}${cmd}`, text, true);
}

38
commands/karma.js Normal file
View file

@ -0,0 +1,38 @@
const Discord = require('discord.js');
module.exports.meta = {
name: 'karma',
aliases: ['coins'],
staffOnly: false
}
const karma = require('../util/karma').karma;
const coins = require('../util/karma').coins;
/**
*
* @param {Discord.Message} message
* @param {Array<string>} args
*/
module.exports.run = async (message, args) => {
const karmaID = '733339045463064607';
const coinsID = '733339908273602662';
const karmaEmote = message.guild.emojis.cache.get(karmaID).toString();
const coinsEmote = message.guild.emojis.cache.get(coinsID).toString();
let targetID = message.mentions.members.first() || message.author;
targetID = targetID.id;
let karmaembed = new Discord.MessageEmbed()
.setTitle(message.mentions.members.first() ? 'Balance of ' + message.mentions.members.first().user.username : 'Your balance')
.setDescription(`${karmaEmote} Karma: \`${karma.get(targetID) || '0'}\`\n${coinsEmote} Coins: \`${coins.get(targetID) || '0'}\``);
let kCount = karma.get(targetID);
if (kCount) {
if (kCount > 0) karmaembed.setColor('f36916');
if (kCount < 0) karmaembed.setColor('9494ff');
}
message.channel.send(karmaembed);
}

37
commands/obamium.js Normal file
View file

@ -0,0 +1,37 @@
const { Message } = require("discord.js");
const { client } = require("..");
module.exports.meta = {
name: 'obamium',
aliases: ['obab'],
staffOnly: false
}
const gID = '653568812578373643';
const IDs = [
['715931208135213087', '715931208281882666', '715931208936325141', '715931208332345366'],
['715931208269168812', '715931208432746537', '715931208491597924', '715931208357249044'],
['715931208361574421', '782261410876751943', '715931208290140172', '715931208374026332'],
['715931208378220666', '715931208319500310', '715931208898445402', '715931208550318170']
];
/**
*
* @param {Message} message
* @param {Array<string>} args
*/
module.exports.run = async (message, args) => {
try {
const guild = client.guilds.cache.get(gID);
let msg = '';
IDs.forEach(row => {
row.forEach(eID => {
msg += guild.emojis.cache.get(eID).toString();
});
msg += '\n'
});
message.channel.send(msg);
} catch(e) {
console.error(e);
}
}

34
commands/ping.js Normal file
View file

@ -0,0 +1,34 @@
const Discord = require('discord.js');
const { client } = require('..');
module.exports.meta = {
name: 'ping',
aliases: [],
staffOnly: false
}
/**
*
* @param {Discord.Message} message
* @param {Array<string>} args
*/
module.exports.run = async (message, args) => {
try {
let embed = new Discord.MessageEmbed()
.setTitle('Pong?')
.setDescription('Measuring...')
.setColor('#2F62CA');
message.channel.send(embed).then(msg => {
embed.setTitle('Pong!');
embed.description = undefined;
embed.addField(':robot: Bot Ping', `\`${Date.now() - message.createdTimestamp}ms\``, true);
embed.addField(':robot: API Ping', `\`${client.ws.ping}ms\``, true);
embed.addField(':speech_balloon: Message delay', `\`${msg.createdTimestamp - message.createdTimestamp}ms\``, true);
msg.edit(embed);
});
} catch(e) {
console.error(e);
message.channel.send(e);
}
}

33
commands/setcoins.js Normal file
View file

@ -0,0 +1,33 @@
const Discord = require('discord.js');
module.exports.meta = {
name: 'setcoins',
aliases: ['setcoin'],
staffOnly: true
}
const karma = require('../util/karma').karma;
const coins = require('../util/karma').coins;
/**
*
* @param {Discord.Message} message
* @param {Array<string>} args
*/
module.exports.run = async (message, args) => {
let member = message.mentions.members.first();
if (!member) return message.channel.send('You need to @mention a member!')
if (!coins.get(member.id)) coins.set(member.id, 0);
let old = coins.get(member.id);
if (isNaN(args[1])) return message.channel.send('Invalid number');
coins.set(member.id, Number(args[1]));
message.channel.send(
new Discord.MessageEmbed()
.setTitle('Coins updated')
.setDescription(`Coins for \`${member.user.tag}\` set to \`${coins.get(member.id)}\` (old: \`${old}\`)`)
.setColor('ddbd37')
)
}

17
commands/stop.js Normal file
View file

@ -0,0 +1,17 @@
const Discord = require('discord.js');
module.exports.meta = {
name: 'stop',
aliases: ['stfu', 'shut'],
staffOnly: false,
epicOnly: true
}
/**
* Kills -copypasta
* @param {Discord.Message} message
* @param {Array<string>} args
*/
module.exports.run = async (message, args) => {
require('./copypasta').shut(message.channel.id);
}

14
commands/test.js Normal file
View file

@ -0,0 +1,14 @@
module.exports.meta = {
name: 'test',
aliases: ['t'],
staffOnly: false
}
/**
*
* @param {Discord.Message} message
* @param {Array<string>} args
*/
module.exports.run = async (message, args) => {
message.channel.send('cool, your test worked. i hope you\'re happy now');
}

39
commands/top.js Normal file
View file

@ -0,0 +1,39 @@
const Discord = require('discord.js');
module.exports.meta = {
name: 'top',
aliases: ['leaderboard'],
staffOnly: false
}
const karma = require('../util/karma').karma;
const coins = require('../util/karma').coins;
/**
*
* @param {Discord.Message} message
* @param {Array<string>} args
*/
module.exports.run = async (message, args) => {
const karmaID = '733339045463064607';
const karmaEmote = message.guild.emojis.cache.get(karmaID).toString();
let karmaboard = [];
karma.keyArray().forEach(uid => {
karmaboard.push({id: uid, karma: karma.get(uid)});
});
karmaboard.sort((a, b) => a.karma - b.karma);
karmaboard.reverse();
let embed = new Discord.MessageEmbed()
.setTitle('Karma Leaderboard')
.setDescription(karmaEmote + ' Karma leaderboard - Top 12 for ' + message.guild.name);
for (let x=0; x < 12; x += 1) {
if (!karmaboard[x]) break;
let u = message.guild.members.cache.get(karmaboard[x].id);
if (!u) embed.addField(`${x+1}. [Unknown user]`, `${karmaEmote} ${karmaboard[x].karma} Karma`, true); else embed.addField(`${x+1}. ${u.user.username}#${u.user.discriminator} ${u.user.bot ? '(Bot)' : ''}`, `${karmaEmote} ${karmaboard[x].karma} Karma`, true);
}
message.channel.send(embed);
}

41
commands/truefan.js Normal file
View file

@ -0,0 +1,41 @@
const Discord = require('discord.js');
module.exports.meta = {
name: 'truefan',
aliases: [],
staffOnly: true
}
const roleID = '718862546395988078';
const channelID = '718908301555007518';
/**
*
* @param {Discord.Message} message
* @param {Array<string>} args
*/
module.exports.run = async (message, args) => {
let target = message.mentions.members.first();
let role = message.guild.roles.cache.get(roleID);
let channel = message.guild.channels.cache.get(channelID);
if (!role) return message.channel.send('Error: Could not find role');
if (!channel) return message.channel.send('Error: Could not find channel');
if (!target) return message.channel.send('You need to @mention someone for this to work!');
if (target.user.bot) return message.channel.send('You can\'t do this with bots.');
if (!target.roles.cache.has(roleID)) {
// Give the role
target.roles.add(role);
channel.send(`${target.user} is now able to access this channel.`);
let msg = new Discord.MessageEmbed()
.setTitle('Congratulations!')
.setDescription(`The r/Obamium Discord Staff has decided to give you access to a secret text channel: <#${channelID}>`)
.setThumbnail('https://discordemoji.com/assets/emoji/ClapClap.gif');
target.send(msg);
message.channel.send(`${target.user.username} is now a true obama fan.`);
} else {
// Take the role
target.roles.remove(role);
channel.send(`${target.user} is no longer able to access this channel.`);
message.channel.send(`${target.user.username} is no longer a true obama fan.`);
}
}

20
commands/vbucks.js Normal file
View file

@ -0,0 +1,20 @@
const Discord = require('discord.js');
module.exports.meta = {
name: 'vbucks',
aliases: ['vbuck'],
staffOnly: false
}
/**
*
* @param {Discord.Message} message
* @param {Array<string>} args
*/
module.exports.run = async (message, args) => {
let embed = new Discord.MessageEmbed()
.setAuthor('Free Vbucks 100% legit no virus', 'https://external-content.duckduckgo.com/iu/?u=https%3A%2F%2Fdiscordemoji.com%2Fassets%2Femoji%2FVBuck.png&f=1&nofb=1')
.setDescription('Click here to download free Vbucks: [https://vbuck-free-generator.com](https://bit.ly/freevbucks2020legitworking)')
.setColor('88ccdb');
message.channel.send(embed);
}

View file

@ -1,6 +0,0 @@
{
"token": "Put the bot token here",
"prefix": "-",
"wit-token": "Put the token you get from Wit.ai here"
}

44
index.js Normal file
View file

@ -0,0 +1,44 @@
require('dotenv').config(); // Require and run dotenv
// Import modules
const Discord = require('discord.js');
const Enmap = require('enmap');
const client = new Discord.Client({partials: ["REACTION", "MESSAGE"]});
// Use log75 for logging
const { default: Log75, LogLevel } = require('log75')
const logger = new Log75(process.env.NODE_ENV == 'production' ? LogLevel.Standard : LogLevel.Debug, true);
module.exports = {
client: client,
logger: logger
}
// Execute modules in util folder in order
async function runModules() {
for (const file of ['commandLoader', 'login', 'eventHandler', 'karma', 'carloscounter']) {
logger.debug(`Running module ${file}`);
await require(`./util/${file}`).run();
}
}
runModules();
// Destroy client when SIGINT
process.on('SIGINT', async () => {
process.stdin.resume(); // Don't exit immediately
console.log('');
logger.info('SIGINT received.');
try {
await client.destroy();
} catch(e) {
logger.warn('Failed to destroy client');
process.exit();
}
logger.done('Logged out client, exiting.');
process.exit();
});

1701
package-lock.json generated

File diff suppressed because it is too large Load diff

View file

@ -11,7 +11,9 @@
"dependencies": {
"better-sqlite3": "^7.1.0",
"discord.js": "^12.2.0",
"dotenv": "^8.2.0",
"enmap": "^5.3.2",
"log75": "^1.0.2",
"node-wit": "^6.0.0"
}
}

54
util/69Reply.js Normal file
View file

@ -0,0 +1,54 @@
const Discord = require('discord.js');
function random(low, high) {
low = Math.ceil(low);
high = Math.floor(high);
high = high + 1;
rndm = Math.random();
return Math.floor(rndm * (high - low) + low);
}
/**
*
* @param {Discord.Message} message
*/
module.exports.execute = (message) => {
// 69 nice haha le funny number
if (message.content.toLowerCase().indexOf('69') > -1) {
let replies = [
'You said the funny number nice',
'Haha funny 69',
'You did a funny right here:\n> 69',
'lmao funny number',
'https://external-content.duckduckgo.com/iu/?u=https%3A%2F%2Fi.kym-cdn.com%2Fentries%2Ficons%2Foriginal%2F000%2F016%2F588%2Fsixtynine.jpg&f=1&nofb=1',
'youre\'r funny lmao',
'haha funny sex number',
'sex',
'69 nice'
];
let curIndex = 0;
let continueSearch = true;
let found = [];
while (continueSearch) {
if (message.content.toLowerCase().indexOf('69', curIndex) == -1) {
continueSearch = false;
break;
}
let f = message.content.toLowerCase().indexOf('69', curIndex);
curIndex = f + 1;
found.push(f);
}
delete continueSearch;
delete curIndex;
let send = false;
found.forEach(index => {
let charL = message.content.charAt(index - 1);
let charR = message.content.charAt(index + 2);
if ((isNaN(charL) || charL == '' || charL == ' ') && (isNaN(charR) || charR == '' || charR == ' ')) send = true;
});
if (send) message.channel.send(replies[random(0, replies.length - 1)]);
}
}

59
util/carloscounter.js Normal file
View file

@ -0,0 +1,59 @@
const Discord = require('discord.js');
const { client, logger } = require('../index');
const Enmap = require('enmap');
const { updateRoles } = require('./karma');
const stats = new Enmap({name: 'carlos_stats'});
let uID = '566239971309256704';
let guildID = '653568812578373643';
let muteRoleID = '751522580300693608';
let statusRoleID = '795371115513249862';
module.exports.run = () => {
}
/**
* This counts how often a specific user got banned/muted.
*/
if (stats.get('bans') == undefined) stats.set('bans', 0);
if (stats.get('mutes') == undefined) stats.set('mutes', 0);
try {
let role = client.guilds.cache.get(guildID).roles.cache.get(statusRoleID), roleName = role.name;
let [bans, mutes] = roleName.split(' bans, ');
mutes = Number(mutes.split(' mutes')[0]);
bans = Number(bans);
if (mutes != undefined && bans != undefined) {
stats.set('bans', bans);
stats.set('mutes', mutes);
}
} catch(e) {
logger.warn('Failed to parse role name: ' + e);
}
client.on('guildBanAdd', (guild, user) => {
if (user.id != uID) return;
stats.set('bans', Number(stats.get('bans')) + 1);
updateRole();
});
client.on('guildMemberUpdate', (oldMember, newMember) => {
if (newMember.id != uID) return;
if (!oldMember.roles.cache.get(muteRoleID) && newMember.roles.cache.get(muteRoleID)) {
stats.set('mutes', Number(stats.get('mutes')) + 1);
updateRole();
}
});
client.on('guildMemberAdd', (member) => {
if (member.id == uID) member.roles.add(statusRoleID).catch(e => logger.warn(`Failed to assign role ${muteRoleID}: ${e}`));
});
let updateRole = () => {
let role = client.guilds.cache.get(guildID).roles.cache.get(statusRoleID);
if (!role) return;
if (role.editable) role.setName(`${stats.get('bans')} bans, ${stats.get('mutes')} mutes`, 'Carlos is a dipfuck');
else logger.warn('Can\'t manage role ' + statusRoleID);
}

25
util/commandLoader.js Normal file
View file

@ -0,0 +1,25 @@
const { client, logger } = require('../index');
const fs = require('fs');
const Discord = require('discord.js');
module.exports.commands = new Discord.Collection();
module.exports.run = () => {
for (const file of fs.readdirSync('commands/')) {
if (file.endsWith('.js')) {
try {
const command = require(`../commands/${file}`);
if (!command.meta?.name)
logger.warn(`Command ${file} does not have a 'name' attribute; skipping.`);
else
this.commands.set(command.meta.name, command);
} catch(e) {
logger.error(`Failed to load command '${file}'`);
console.error(e);
process.exit(1);
}
}
}
logger.info(`${this.commands.size} command${this.commands.size != 1 ? 's' : ''} loaded`);
}

88
util/eventHandler.js Normal file
View file

@ -0,0 +1,88 @@
const Discord = require('discord.js');
const { client, logger } = require('../index');
const prefix = process.env.BOT_PREFIX || '-';
module.exports.run = () => {
}
const { commands } = require('./commandLoader');
client.on('message', message => {
if (message.author?.bot) return;
addToDatabase(message.author.id);
require('./wit').execute(message);
try {
logger.debug(`${message.author.tag} => ${message.content}`);
let msgContent = message.content;
let usedPrefix;
if (msgContent.startsWith(prefix)) usedPrefix = prefix;
else if (msgContent.startsWith(`<@${client.user.id}>`)) usedPrefix = `<@${client.user.id}>`;
else if (msgContent.startsWith(`<@!${client.user.id}>`)) usedPrefix = `<@!${client.user.id}>`;
if (!usedPrefix) return require('./69Reply').execute(message);
msgContent = msgContent.substr(msgContent.indexOf(usedPrefix) + 1, msgContent.length);
if (msgContent.startsWith(' ') && usedPrefix != prefix) msgContent = msgContent.substr(1, msgContent.length);
const args = msgContent.split(' ');
const cmdName = args.shift()?.toLowerCase();
const cmd = commands.find(cmd => cmd.meta?.name == cmdName || cmd.meta?.aliases?.indexOf(cmdName) > -1);
if (!cmd) return require('./69Reply').execute(message);
logger.info(`[CMD] ${message.author.id} ${message.author.tag} => ${cmdName} ${args.join(' ')}`);
if (cmd.meta?.name != 'stop' && require('../commands/copypasta').copypastaing[message.channel?.id])
return message.react('810153990733561876').catch(console.warn);
if (cmd.meta?.staffOnly && !message.member.permissions.has('ADMINISTRATOR')) {
logger.warn(`${message.author.tag} => Refusing to run staff command`);
message.channel.send(
new Discord.MessageEmbed()
.setTitle('You are unworthy')
.setDescription('This command can only be used by this server\'s staff.')
.setImage('https://media1.tenor.com/images/1056e92668594b262d3338c897ce9bd3/tenor.gif?itemid=7706023')
.setColor('ff0000')
)
return;
}
else if (cmd.meta?.epicOnly && !message.member?.roles.cache.get('718862546395988078')) {
logger.warn(`${message.author.tag} => Refusing to run epic only command`);
message.channel.send(
new Discord.MessageEmbed()
.setTitle('You are unworthy')
.setDescription('Only epic people can use this command. You are not epic.')
.setImage('https://media1.tenor.com/images/1056e92668594b262d3338c897ce9bd3/tenor.gif?itemid=7706023')
.setColor('ff0000')
)
return;
}
try {
cmd.run(message, args);
} catch(e) {
console.error(e);
message.channel.send(
new Discord.MessageEmbed()
.setTitle('You broke Obama')
.setDescription(`Good job, you broke Obama. Debug info: \`\`\`js\n${e}\`\`\``)
.setColor('ff0000')
)
return;
}
} catch(e) {
console.error(e);
message.channel.send('An error has occurred. fuck');
return;
}
});
const karma = require('./karma').karma;
const coins = require('./karma').coins;
function addToDatabase(id) {
if (!id) return;
if (typeof karma.get(id) != 'number') karma.set(id, 0);
if (typeof coins.get(id) != 'number') coins.set(id, 0);
return;
}

153
util/karma.js Normal file
View file

@ -0,0 +1,153 @@
const { client, logger } = require('../index');
const Enmap = require('enmap');
// Stores the karma and coins of users
const karma = new Enmap({name: "karma"});
const coins = new Enmap({name: "coins"});
module.exports.karma = karma;
module.exports.coins = coins;
const upvoteID = '719181283393142786';
const downvoteID = '719181283774955540';
// Awards
const awards = {
"731192828415443116": {
name: "Silver",
cost: 100,
give: 0,
role: "733407208536277113"
},
"731192829262692372": {
name: "Gold",
cost: 500,
give: 100,
role: "733407216199008416"
},
"731192942080950333":{
name: "Platinum",
cost: 1800,
give: 700,
role: "733407213900660807"
},
"731508866273247252": {
name: "Argentium",
cost: 20000,
give: 2500,
role: "733407211178557583"
},
"739266335128944683": {
name: "Argentobamium",
cost: 100000,
give: 69420,
role: "739266563038904421"
}
}
let timeouts = {}
module.exports.run = () => {
client.on('messageReactionAdd', async function(reaction, user) {
// Fetch reaction and user if they are partial
if (reaction.partial) reaction = await reaction.fetch();
if (user.partial) reaction = await user.fetch();
if (reaction.message.author.bot) return; // Dont give karma to bots
await addToDatabase(reaction.message.author.id); // Add the user to the database
if (!reaction.emoji.id) return; // Return when emoji has no ID (is a "default" emoji)
if (user.bot) return; // Don't accept reactions from bots.
if (!reaction.message.guild) return; // Don't accept reactions from DMs
const message = reaction.message; // The message object the reaction was added to
if (reaction.emoji.id == upvoteID) {
karma.inc(message.author.id);
return;
}
else if (reaction.emoji.id == downvoteID) {
karma.dec(message.author.id);
return;
} else if (awards[reaction.emoji.id]) {
let award = awards[reaction.emoji.id];
let noTimeout = (!timeouts[user.id] || timeouts[user.id] < Date.now());
let perms = message.channel.permissionsFor(user.id);
if (!perms.has('SEND_MESSAGES') || !perms.has('ADD_REACTIONS')) {
logger.warn(`${user.tag} => Ignoring reaction in #${message.channel.name}: User is missing permission`);
reaction.users.remove(user.id);
return;
}
if (coins.get(user.id) < award.cost) {
if (noTimeout) message.channel.send(`${user}, you don't have sufficient coins to use this award.`);
reaction.users.remove(user.id);
timeouts[user.id] = Date.now() + 5000;
return;
}
if (message.author.id == user.id) {
reaction.users.remove(user.id);
if (noTimeout) message.channel.send(`${user}, why would you give an award to yourself? smh my head`);
timeouts[user.id] = Date.now() + 5000;
return;
}
coins.set(user.id, (coins.get(user.id) - award.cost));
coins.set(message.author.id, (coins.get(message.author.id) + award.give));
message.channel.send(`${user} just gave the ${client.emojis.cache.get(reaction.emoji.id).toString()} ${award.name} award (Price: ${award.cost} coins) to ${message.author}${award.give > 0 ? `. ${message.author.username} has received ${award.give} coins` : ''}!`);
require('./karma').updateRoles(user.id);
require('./karma').updateRoles(message.author.id);
}
});
client.on('messageReactionRemove', async function(reaction, user) {
// Fetch reaction and user if they are partial
if (reaction.partial) reaction = await reaction.fetch();
if (user.partial) reaction = await user.fetch();
await addToDatabase(reaction.message.author.id); // Add the user to the database
if (!reaction.emoji.id) return; // Return when emoji has no ID (is a "default" emoji)
if (user.bot) return; // Don't accept reactions from bots.
if (!reaction.message.guild) return; // Don't accept reactions from DMs
const message = reaction.message; // The message object the reaction was added to
if (reaction.emoji.id == upvoteID) {
karma.dec(message.author.id);
return;
}
else if (reaction.emoji.id == downvoteID) {
karma.dec(message.author.id);
return;
}
});
}
// Milestones for reaching certain karma values
function milestone(id) {
}
// Reset a user's coin/karma count when its not of type number
async function addToDatabase(id) {
if (!id) return;
if (typeof karma.get(id) != 'number') karma.set(id, 0);
if (typeof coins.get(id) != 'number') coins.set(id, 100);
return;
}
module.exports.updateRoles = function(id) {
let member = client.guilds.cache.get('653568812578373643').members.cache.get(id);
let membercoins = coins.get(member.id);
Object.keys(awards).forEach(awardid => {
let award = awards[awardid];
if (member.roles.cache.has(award.role)) {
if (membercoins < award.cost) member.roles.remove(award.role);
} else {
if (membercoins >= award.cost) member.roles.add(award.role);
}
});
}

45
util/login.js Normal file
View file

@ -0,0 +1,45 @@
const { client, logger } = require('../index');
module.exports.run = () => {
return new Promise((resolve, reject) => {
const token = process.env.BOT_TOKEN;
if (!token) {
logger.error('No bot token provided. Please provide the bot token as environment variable \'BOT_TOKEN\'.');
process.exit(1);
}
logger.info('Logging in');
const loginStartTime = Date.now();
client.login(token)
.catch(error => {
logger.error(`Failed to log in\n${error}`);
process.exit(1);
});
client.on('ready', () => {
logger.done(
`Logged in as ${client.user.tag}\n` +
logger.createBox([
`Login took ${Date.now() - loginStartTime}ms`,
`${client.guilds.cache.size} cached guilds`,
`${client.users.cache.size} cached users`
])
);
resolve();
// Set the bot's activity and update it every 60 seconds in case it gets reset
let setActivity = () => {
try {
// Activity type 5 corresponds to 'Competing in': https://discord.com/developers/docs/game-sdk/activities#data-models-activitytype-enum
client.user.setPresence({ activity: { type: 5, name: 'being Obama' }, status: 'dnd' })
.then(() => logger.debug('Updated activity'));
} catch(e) {
console.error(e);
}
}
setActivity();
setInterval(setActivity, (1000 * 60));
});
});
}

77
util/wit.js Normal file
View file

@ -0,0 +1,77 @@
const { Wit } = require('node-wit');
const { Message } = require('discord.js');
const { logger } = require('..');
if (!process.env.WIT_TOKEN) return logger.warn(`No wit.ai token found, disabling AI features`);
const client = new Wit({accessToken: process.env.WIT_TOKEN});
function random(low, high) {
low = Math.ceil(low);
high = Math.floor(high);
high = high + 1;
rndm = Math.random();
return Math.floor(rndm * (high - low) + low);
}
// The database karma is stored in
const karmaDB = require('./karma').karma;
const coinsDB = require('./karma').coins;
/**
* @param {Message} message
*/
module.exports.execute = async (message) => {
if (!message.content) return;
if (message.content.length > 280) return randomAward();
// Send the message to wit.ai
client.message(message.content)
.then(response => {
if (message.deleted) return;
let action = response.intents[0];
// "Execute" the intent.
if (!action) return randomAward();
switch(action.name) {
case 'awardspam':
// Disabled for "karma balancing reasons"
randomAward(1.1);
return;
// Spam a fuckton of awards
['731564182079799306', '719181283393142786', '731192828415443116', '731192829262692372', '731192942080950333', '731508866273247252', '716021350883393566']
.forEach(async id => await message.react(id));
break;
case 'upvote':
message.react('719181283393142786');
karmaDB.inc(message.author.id);
break;
case 'downvote':
message.react('719181283774955540');
karmaDB.dec(message.author.id);
break;
case 'bruh':
message.react('730882526259707997');
break;
default:
randomAward(1);
break;
}
})
.catch(error => {
console.error(error);
message.channel.send(`Wit.ai error:\n\`\`\`js\n${error}\`\`\``);
});
function randomAward(multiplier) {
if (!multiplier) multiplier = 1;
// Randomly decide if the message should get a random "award" or yeet an obamium on it
if (message.content.toLowerCase().indexOf('obamium') > -1 || message.content.toLowerCase().indexOf('obama') > -1) {
return message.react('716021350883393566').catch();
}
const randomNum = (random(0, 10000) / 100) * multiplier;
if (randomNum > 99.9) {message.react('731508866273247252').catch(); coinsDB.set(message.author.id, (coinsDB.get(message.author.id) + 2500))} // Argentinum
else if (randomNum > 99.5) {message.react('731192942080950333').catch(); coinsDB.set(message.author.id, (coinsDB.get(message.author.id) + 700)) } // Platinum
else if (randomNum > 99) {message.react('731192829262692372').catch(); coinsDB.set(message.author.id, (coinsDB.get(message.author.id) + 100)) } // Gold
else if (randomNum > 98) {message.react('731192828415443116').catch(); coinsDB.set(message.author.id, (coinsDB.get(message.author.id) + 0)) } // Silver
require('./karma').updateRoles(message.author.id);
}
}