diff --git a/README.md b/README.md index f5102ac..d31aec0 100644 --- a/README.md +++ b/README.md @@ -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. diff --git a/commands/help.js b/commands/help.js new file mode 100644 index 0000000..d3551c2 --- /dev/null +++ b/commands/help.js @@ -0,0 +1,32 @@ +const { MessageEmbed } = require("discord.js"); +const prefix = process.env.BOT_PREFIX || '-'; + +module.exports.meta = { + name: 'help', + aliases: ['h'], + staffOnly: false +} + +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'); + + message.channel.send(embed); +} + +/** + * + * @param {MessageEmbed} embed + * @param {string} cmd + * @param {string} text + */ +function addCmd(embed, cmd, text) { + embed.addField(`${prefix}cmd`, text, true); +} \ No newline at end of file diff --git a/commands/karma.js b/commands/karma.js new file mode 100644 index 0000000..3ebe4c3 --- /dev/null +++ b/commands/karma.js @@ -0,0 +1,33 @@ +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; + +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); +} \ No newline at end of file diff --git a/commands/obamium.js b/commands/obamium.js new file mode 100644 index 0000000..0387a1d --- /dev/null +++ b/commands/obamium.js @@ -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} 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); + } +} \ No newline at end of file diff --git a/commands/ping.js b/commands/ping.js new file mode 100644 index 0000000..a97d668 --- /dev/null +++ b/commands/ping.js @@ -0,0 +1,29 @@ +const Discord = require('discord.js'); +const { client } = require('..'); + +module.exports.meta = { + name: 'ping', + aliases: [], + staffOnly: false +} + +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); + } +} \ No newline at end of file diff --git a/commands/setcoins.js b/commands/setcoins.js new file mode 100644 index 0000000..ffa24e5 --- /dev/null +++ b/commands/setcoins.js @@ -0,0 +1,28 @@ +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; + +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') + ) +} \ No newline at end of file diff --git a/commands/test.js b/commands/test.js new file mode 100644 index 0000000..2be06c3 --- /dev/null +++ b/commands/test.js @@ -0,0 +1,9 @@ +module.exports.meta = { + name: 'test', + aliases: ['t'], + staffOnly: false +} + +module.exports.run = async (message, args) => { + message.channel.send('cool, your test worked. i hope you\'re happy now'); +} \ No newline at end of file diff --git a/commands/top.js b/commands/top.js new file mode 100644 index 0000000..ce43b07 --- /dev/null +++ b/commands/top.js @@ -0,0 +1,34 @@ +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; + +module.exports.run = async (message, args) => { + const karmaID1 = '733339045463064607'; + const karmaEmote1 = message.guild.emojis.cache.get(karmaID1).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(karmaEmote1 + ' 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]`, `${karmaEmote1} ${karmaboard[x].karma} Karma`, true); else embed.addField(`${x+1}. ${u.user.username}#${u.user.discriminator} ${u.user.bot ? '(Bot)' : ''}`, `${karmaEmote1} ${karmaboard[x].karma} Karma`, true); + } + + message.channel.send(embed); +} \ No newline at end of file diff --git a/commands/truefan.js b/commands/truefan.js new file mode 100644 index 0000000..1aeffc5 --- /dev/null +++ b/commands/truefan.js @@ -0,0 +1,36 @@ +const Discord = require('discord.js'); + +module.exports.meta = { + name: 'truefan', + aliases: [], + staffOnly: true +} + +const roleid = '718862546395988078'; +const cid = '718908301555007518'; + +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(cid); + 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: <#${cid}>`) + .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.`); + } +} \ No newline at end of file diff --git a/commands/vbucks.js b/commands/vbucks.js new file mode 100644 index 0000000..3678792 --- /dev/null +++ b/commands/vbucks.js @@ -0,0 +1,15 @@ +const Discord = require('discord.js'); + +module.exports.meta = { + name: 'vbucks', + aliases: ['vbuck'], + staffOnly: false +} + +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); +} \ No newline at end of file diff --git a/config.json.example b/config.json.example deleted file mode 100644 index e27d146..0000000 --- a/config.json.example +++ /dev/null @@ -1,6 +0,0 @@ -{ - "token": "Put the bot token here", - "prefix": "-", - - "wit-token": "Put the token you get from Wit.ai here" -} \ No newline at end of file diff --git a/index.js b/index.js index d977946..629e7e5 100644 --- a/index.js +++ b/index.js @@ -1,484 +1,25 @@ +require('dotenv').config(); // Require and run dotenv + +// Import modules const Discord = require('discord.js'); -const client = new Discord.Client({partials: ["REACTION", "MESSAGE"]}); -const config = require('./config.json'); const Enmap = require('enmap'); -client.login(config.token); +const client = new Discord.Client({partials: ["REACTION", "MESSAGE"]}); -const karma = new Enmap({name: "karma"}); -const coins = new Enmap({name: "coins"}); +// 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.karma = karma; -module.exports.coins = coins; - -module.exports.client = client; - -const witmodule = require('./wit'); - -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); +module.exports = { + client: client, + logger: logger } - -client.once('ready', () => { - console.log('Logged in as ' + client.user.username); - client.user.setActivity(`hamborger`, {type: "STREAMING", url: "https://www.youtube.com/watch?v=sHwvUFjaNdU"}); - - // Start the module thingys - require('./karma'); - require('./vibechat'); - require('./shitposts'); -}); - -client.on('guildCreate', g => { - if (g.id != '653568812578373643') { - g.leave(); +// Execute modules in util folder in order +async function runModules() { + for (const file of ['commandLoader', 'login', 'eventHandler', 'karma']) { + logger.debug(`Running module ${file}`); + await require(`./util/${file}`).run(); } -}) - -let allowEval = false; - -client.on('message', message => { - - addToDatabase(message.author.id); - - function checkMod(silent) { - if (!message.member.permissions.has('ADMINISTRATOR')) { - let erEmbed = new Discord.MessageEmbed() - .setTitle('You are not allowed to use this.') - .setDescription('Only the mod team can use this command.') - .setImage('https://media1.tenor.com/images/1056e92668594b262d3338c897ce9bd3/tenor.gif?itemid=7706023'); - if (silent !== true) message.channel.send(erEmbed); - return true; - } - return false; - } - - function checkPremium(silent) { - if (!message.member.permissions.has('ADMINISTRATOR') && !message.member.roles.cache.has('718862546395988078' /* True ObamaFan */) && !message.member.roles.cache.has('653569849888473145' /* Obama sphere */) && !message.member.roles.cache.has('733394201957498901' /* Obama circle */)) { - let erEmbed = new Discord.MessageEmbed() - .setTitle('You are not allowed to use this.') - .setDescription('Only approved users can use this command.'); - if (silent !== true) message.channel.send(erEmbed); - return true; - } - return false; - } - - try { - if (message.author.bot) return; - if (!message.guild) return message.channel.send('You can only use me on the r/Obamium Discord right now.'); - if (message.guild.id != '653568812578373643') message.guild.leave(); - - console.log(`Message by ${message.author.username}: ${message.content}`); - - witmodule.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', - '69 is funny haha', - 'you have achieved comedy by saying 69', - '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', - 'Obama signed that your 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)]); - } - - // Actual command stuff - if (message.content.startsWith(`<@!${client.user.id}> help`) || message.content.startsWith(`<@!${client.user.id}>help`)) return message.channel.send(`My prefix is \`${config.prefix}\`, type ${config.prefix}help for help.`); - if (!message.content.startsWith(config.prefix)) return; - const args = message.content.slice(config.prefix.length).split(' '); - const command = args.shift().toLowerCase(); - switch(command) { - case 'help': - let owner = client.users.cache.get('284323826165350400'); - let embed = new Discord.MessageEmbed() - .setTitle('Commands') - .addField('­', '**----- Public commands -----**') - .setDescription(`Kneel down, mortals, for the command list, signed by Obama himself.\nEvery command starts with the prefix '**${config.prefix}**', for example ${config.prefix}help.`) - .addField('-obamium', 'Send a Obamid in all its beauty') - .addField('-vbucks', 'Totally working V-Bucks generator') - .addField('-copypasta', 'oh shit oh fuck') - .addField('-karma', 'Shows your karma and coins on this server') - .addField('-top', 'Shows the users with the highest karma!') - .addField('-ping', 'Shows the bot\'s latency') - .addField('-brother', 'RGBRoachGang brothers, use this command to get access to a special channel!') - .addField('­', '**----- Admin commands -----**') - .addField('-truefan @Member', 'Give someone access to the top secret text channel™️') - .addField('-coins @Member [give/set] [value]', 'Manage the coins of an user') - .setFooter(`© Obamium Research | Developed by ${owner.username}#${owner.discriminator}`, 'https://cdn.discordapp.com/emojis/716021350883393566.gif') - .setColor('9c6341'); - message.channel.send(embed); - break; - case 'obama': - case 'obamid': - case 'obamium': - let msg = ''; - msg += message.guild.emojis.cache.get('715931208135213087').toString(); - msg += message.guild.emojis.cache.get('715931208281882666').toString(); - msg += message.guild.emojis.cache.get('715931208936325141').toString(); - msg += message.guild.emojis.cache.get('715931208332345366').toString(); - msg += '\n'; - msg += message.guild.emojis.cache.get('715931208269168812').toString(); - msg += message.guild.emojis.cache.get('715931208432746537').toString(); - msg += message.guild.emojis.cache.get('715931208491597924').toString(); - msg += message.guild.emojis.cache.get('715931208357249044').toString(); - msg += '\n'; - msg += message.guild.emojis.cache.get('715931208361574421').toString(); - msg += message.guild.emojis.cache.get('715931208134950963').toString(); - msg += message.guild.emojis.cache.get('715931208290140172').toString(); - msg += message.guild.emojis.cache.get('715931208374026332').toString(); - msg += '\n'; - msg += message.guild.emojis.cache.get('715931208378220666').toString(); - msg += message.guild.emojis.cache.get('715931208319500310').toString(); - msg += message.guild.emojis.cache.get('715931208898445402').toString(); - msg += message.guild.emojis.cache.get('715931208550318170').toString(); - - message.channel.send(msg); - break; - case 'vbuck': - case 'vbucks': - message.delete(); - let embed2 = 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(embed2); - break; - case 'amitheowner': - if (message.author.id == '284323826165350400') { - message.channel.send(`Yes, ${message.author}, you definitely are my owner.`) - } else { - message.channel.send(`No, ${message.author}, you are not my owner.`) - } - break; - case 'ping': - let pingEmbed = new Discord.MessageEmbed() - .setTitle('Pong?') - .setDescription('Measuring...') - .setColor('#2F62CA'); - message.channel.send(pingEmbed).then(msg => { - pingEmbed.setTitle('Pong!'); - pingEmbed.description = undefined; - pingEmbed.addField(':speech_balloon: Message delay', `\`${msg.createdTimestamp - message.createdTimestamp}ms\``, true); - pingEmbed.addField(':robot: Bot Ping', `\`${Date.now() - message.createdTimestamp}ms\``, true); - msg.edit(pingEmbed); - }); - break; - case 'brother': - let vibecheckembed = new Discord.MessageEmbed() - .setTitle('Are you a brother?') - .setDescription('If you are a r/rgbroachgang member, you can get acces to a secret rgbroachgang channel! I need to vibe check your reddit and Discord account first. You need to link a reddit account to your Discord account, and then [click here](https://obamium-subreddit.herokuapp.com/) to start the vibe check.'); - message.channel.send(vibecheckembed); - break; - case 'truefan': - if (checkMod()) return; - let target = message.mentions.members.first(); - let roleid = '718862546395988078'; - let role = message.guild.roles.cache.get(roleid); - let cid = '718908301555007518'; - let channel = message.guild.channels.cache.get(cid); - 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: <#${cid}>`) - .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.`); - } - - break; - case 'toggleeval': - if (message.author.id != '284323826165350400') return console.log('Toggle Eval attemped by unauthorized user: ' + message.author.id); - if (allowEval == true) allowEval = false; else allowEval = true; - message.channel.send('Toggled ' + (allowEval ? 'on' : 'off')); - break; - case 'eval': - if (message.author.id != '284323826165350400') return console.log('Eval attemped by unauthorized user: ' + message.author.id); - if (!allowEval) return message.channel.send('Eval is disabled.'); - message.suppressEmbeds(true); - var res = eval(args.join(' ')); - if (typeof res == 'object') res = JSON.stringify(res); - else if (typeof res == 'function') res = '`(Function)`'; - else if (typeof res == 'undefined') res = '`undefined`'; - if (res == "{}") return; - message.channel.send(res); - break; - case 'copypasta': - if (checkPremium()) return; - if (!args[0]) args[0] = ''; - switch(args[0].toLowerCase()) { - case 'toddler': - message.channel.send('**AITA For Dropkicking an Toddler off a cliff because he used my Dead Name**', {tts: true}); - message.channel.send('The title speaks for itself. So me (20F transitioning) was going on a hike with my cousin and his parents.', {tts: true}); - message.channel.send('There’s this really large cliff that looms over my house. I recently told my family I was trans.', {tts: true}); - message.channel.send('I thought my toddler cousin had realize me new name is Jenny. Instead he said Max.', {tts: true}); - message.channel.send('I instantly flew into a mentally unstable rage and my eyes turned red. I began to drool and have a mini-seizure.', {tts: true}); - message.channel.send('I ran toward my cousin at the speed of light. I picked him up by the back of his shirt.', {tts: true}); - message.channel.send('His parents ran toward him but with my tranny-powers I managed to use my telekineses and freeze them in mid-air.', {tts: true}); - message.channel.send('I threw my toddler cousin up in the air and using my tranny in the 40% powers kicked him at the speed of light.', {tts: true}); - message.channel.send('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.', {tts: true}); - message.channel.send('I saw him fall to the ground and splatter by then I was so horny I came all over the place.', {tts: true}); - break; - case 'cum': - message.channel.send('**Infinite cum.**', {tts: true}); - message.channel.send('You sit on the toilet to jack off, but you begin to cum uncontrollably.', {tts: true}); - message.channel.send('After ten spurts you start to worry. Your hand is sticky and it reeks of semen.', {tts: true}); - message.channel.send('You desperately shove your dick into a wad of toilet paper, but that only makes your balls hurt.', {tts: true}); - message.channel.send('The cum accelerates. It’s been three minutes. You can’t stop cumming.', {tts: true}); - message.channel.send('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.', {tts: true}); - message.channel.send('You try the toilet. The cum is too thick to be flushed. You lock the bathroom door to prevent the cum from escaping.', {tts: true}); - message.channel.send('The air grows hot and humid from the cum. The cum accelerates. You slip and fall in your own sperm.', {tts: true}); - message.channel.send('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.', {tts: true}); - message.channel.send('Globs of the sticky white fluid begin to fall like raindrops, giving you a facial with your own cum. The cum accelerates.', {tts: true}); - message.channel.send('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.', {tts: true}); - message.channel.send('Still on your knees, the cum is now at chin height. To avoid drowning you open the bathroom door.', {tts: true}); - message.channel.send('The deluge of man juice reminds you of the Great Molasses Flood of 1919, only with cum instead of molasses.', {tts: true}); - message.channel.send('The cum accelerates. It’s been two hours. Your children and wife scream in terror as their bodies are engulfed by the snow-white sludge.', {tts: true}); - message.channel.send('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.', {tts: true}); - message.channel.send('You squeeze your dick to stop the cum, but it begins to leak out of your asshole instead. You let go.', {tts: true}); - message.channel.send('The force of the cum tears your urethra open, leaving only a gaping hole in your crotch that spews semen.', {tts: true}); - message.channel.send('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.', {tts: true}); - message.channel.send('From a bird’s eye view you see your house is completely white. Your neighbor calls the cops. The cum accelerates.', {tts: true}); - message.channel.send('As you continue to ascend, you spot police cars racing towards your house.', {tts: true}); - message.channel.send('The cops pull out their guns and take aim, but stray loads of cum hit them in the eyes, blinding them. The cum accelerates.', {tts: true}); - message.channel.send('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.', {tts: true}); - message.channel.send('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.', {tts: true}); - message.channel.send('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.', {tts: true}); - message.channel.send('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.', {tts: true}); - message.channel.send('You narrowly miss the ISS, giving it a new white paint job as you fly past. Physicists struggle to calculate your erratic trajectory.', {tts: true}); - message.channel.send('The cum accelerates. The cum begins to gravitate towards itself, forming a comet trail of semen. Astronomers begin calling you the “Cummet.”', {tts: true}); - message.channel.send('You are stuck in space forever, stripped of your body and senses, forced to endure an eternity of cumshots. Eventually, you stop thinking.', {tts: true}); - break; - case 'navyseal': - case 'navy': - message.channel.send('What the fuck did you just fucking say about me, you little bitch?', {tts: true}); - message.channel.send('I’ll have you know I graduated top of my class in the Navy Seals, and I’ve been involved in numerous secret raids on Al-Quaeda, and I have over 300 confirmed kills.', {tts: true}); - message.channel.send('I am trained in gorilla warfare and I’m the top sniper in the entire US armed forces. You are nothing to me but just another target.', {tts: true}); - message.channel.send('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.', {tts: true}); - message.channel.send('You think you can get away with saying that shit to me over the Internet? Think again, fucker.', {tts: true}); - message.channel.send('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.', {tts: true}); - message.channel.send('The storm that wipes out the pathetic little thing you call your life.', {tts: true}); - message.channel.send('You’re fucking dead, kid. I can be anywhere, anytime, and I can kill you in over seven hundred ways, and that’s just with my bare hands.', {tts: true}); - message.channel.send('Not only am I extensively trained in unarmed combat, but I have access to the entire arsenal of the United States Marine Corps', {tts: true}); - message.channel.send('and I will use it to its full extent to wipe your miserable ass off the face of the continent, you little shit.', {tts: true}); - message.channel.send('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.', {tts: true}); - message.channel.send('But you couldn’t, you didn’t, and now you’re paying the price, you goddamn idiot. I will shit fury all over you and you will drown in it. You’re fucking dead, kiddo.', {tts: true}); - break; - case 'ben-shapiro': - message.channel.send('You know, let\'s just say, hypothetically speaking, that I were to have sex with your mom.', {tts: true}); - message.channel.send('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', {tts: true}); - message.channel.send('touching anything or anyone, but instead, the atoms surrounding your body and this object or person are coming into contact with one another.', {tts: true}); - message.channel.send('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', {tts: true}); - message.channel.send(' with one another.', {tts: true}); - break; - case 'a': - case 'aa': - case 'aaa': - case 'aaaa': - case 'aaaaa': - case 'aaaaaa': - case 'aaaaaaa': - case 'aaaaaaaa': - case 'aaaaaaaaa': - case 'aaaaaaaaaa': - case 'aaaaaaaaaaa': - case 'aaaaaaaaaaaa': - case 'aaaaaaaaaaaaa': - case 'aaaaaaaaaaaaaa': - case 'aaaaaaaaaaaaaaa': - case 'aaaaaaaaaaaaaaaa': - // i want to die - const oldName = message.guild.members.cache.get(client.user.id).nickname; - message.guild.members.cache.get(client.user.id).setNickname('AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA').then(() => { - message.channel.send('AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', {tts: true}).then(() => { - message.channel.send('AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', {tts: true}).then(() => { - message.channel.send('AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', {tts: true}).then(() => { - message.channel.send('AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', {tts: true}).then(() => { - message.channel.send('AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', {tts: true}).then(() => { - message.channel.send('AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', {tts: true}).then(() => { - message.channel.send('AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', {tts: true}).then(() => { - message.channel.send('AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', {tts: true}).then(() => { - message.channel.send('AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', {tts: true}).then(() => { - message.channel.send('AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', {tts: true}).then(() => { - message.channel.send('AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', {tts: true}).then(() => { - message.channel.send('AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', {tts: true}).then(() => { - message.channel.send('AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', {tts: true}).then(() => { - message.channel.send('AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', {tts: true}).then(() => { - message.channel.send('AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', {tts: true}).then(() => { - message.channel.send('AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', {tts: true}).then(() => { - message.channel.send('AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', {tts: true}).then(() => { - message.channel.send('AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', {tts: true}).then(() => { - message.channel.send('AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', {tts: true}).then(() => { - message.channel.send('AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', {tts: true}).then(() => { - message.channel.send('AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', {tts: true}).then(() => { - message.channel.send('AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', {tts: true}).then(() => { - message.channel.send('AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', {tts: true}).then(() => { - message.channel.send('AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', {tts: true}).then(() => { - message.channel.send('AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', {tts: true}).then(() => { - message.channel.send('AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', {tts: true}).then(() => { - message.channel.send('AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', {tts: true}).then(() => { - message.channel.send('AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', {tts: true}).then(() => { - message.channel.send('AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', {tts: true}).then(() => { - message.channel.send('AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', {tts: true}) - .then(() => message.guild.members.cache.get(client.user.id).setNickname(oldName)); - })})})})})})})})})})})})})})})})})})})})})})})})})})})})}); - }); - break; - default: - message.channel.send('cum', {tts: true}).then(m => m.edit('Choose a copypasta:\n- toddler (10 lines, 1:15 minutes)\n- cum (28 lines, 4:10 minutes)\n- navyseal (12 lines, 1:45 minutes)\n- aaaaaaaaaa (30 lines, *forever*)\n- ben-shapiro (5 lines, 50.59 seconds)')); - break; - } - break; - case 'karma': - case 'coins': - case 'coin': - case 'gold': - 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); - break; - case 'top': - const karmaID1 = '733339045463064607'; - const karmaEmote1 = message.guild.emojis.cache.get(karmaID1).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 karmaboardembed = new Discord.MessageEmbed() - .setTitle('Karma Leaderboard') - .setDescription(karmaEmote1 + ' 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) karmaboardembed.addField(`${x+1}. [Unknown user]`, `${karmaEmote1} ${karmaboard[x].karma} Karma`, true); else karmaboardembed.addField(`${x+1}. ${u.user.username}#${u.user.discriminator} ${u.user.bot ? '(Bot)' : ''}`, `${karmaEmote1} ${karmaboard[x].karma} Karma`, true); - } - - message.channel.send(karmaboardembed); - break; - case 'managecoins': - case 'setcoins': - case 'usercoins': - if (checkMod()) return; - 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 pass = false; - let amount = 0; - if (args[1] == 'set') { - if (isNaN(args[2])) return message.channel.send('You gotta put in a number!'); - pass = true; - amount = args[2]; - } - else if (args[1] == 'give' ||args[1] == 'add') { - if (isNaN(args[2])) return message.channel.send('You gotta put in a number!'); - pass = true; - amount = coins.get(member.id) + Number(args[2]); - } - else if (isNaN(args[1])) return message.channel.send('You gotta put in a number!'); - else { - pass = true; - amount = coins.get(member.id) + Number(args[1]); - } - - if (!pass) return; - - let old = coins.get(member.id); - - let coinsSetEmbed = new Discord.MessageEmbed() - .setTitle('Coins updated for '+ member.user.username) - .setDescription(`Coins set to ${amount} (Old amount: ${old})`) - .setColor('ddbd37'); - message.channel.send(coinsSetEmbed) - .then(() => { - coins.set(member.id, amount); - }); - break; - } - } catch (e) { - message.channel.send(new Discord.MessageEmbed() - .setTitle('An error has occurred.') - .setDescription(`\`\`\`js\n${e}\`\`\``) - .setColor('ff0000')); - console.error(e); - } -}); - -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; -} \ No newline at end of file +} +runModules(); \ No newline at end of file diff --git a/karma.js b/karma.js deleted file mode 100644 index a6cb923..0000000 --- a/karma.js +++ /dev/null @@ -1,137 +0,0 @@ -const Enmap = require('enmap'); -const { ReactionUserManager } = require('discord.js'); -const client = require('./index').client; - -// Stores the karma and coins of users -const karma = require('./index').karma; -const coins = require('./index').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" - } -} - - -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]; - if (coins.get(user.id) < award.cost) { - message.channel.send(`${user}, you don't have sufficient coins to use this award.`); - reaction.users.remove(user.id); - return; - } - if (message.author.id == user.id) { - //reaction.remove(); - reaction.users.remove(user.id); - return message.channel.send(`${user}, why would you give an award to yourself? smh my head`); - } - 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); - } - }); -} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 69436ad..c55c0ea 100644 --- a/package-lock.json +++ b/package-lock.json @@ -335,6 +335,11 @@ } } }, + "dotenv": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz", + "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==" + }, "ecc-jsbn": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", @@ -725,11 +730,24 @@ "verror": "1.10.0" } }, + "kleur": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.3.tgz", + "integrity": "sha512-H1tr8QP2PxFTNwAFM74Mui2b6ovcY9FoxJefgrwxY+OCJcq01k5nvhf4M/KnizzrJvLRap5STUy7dgDV35iUBw==" + }, "lodash": { "version": "4.17.19", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==" }, + "log75": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/log75/-/log75-1.0.2.tgz", + "integrity": "sha512-PZCslcLNZXaVXmYCISWwMants71/3hGl9iB96RrkzU5MYQZ9idNsRKo1JlokpDc6cgXWEZJT3voptFsdOl+ZBQ==", + "requires": { + "kleur": "^4.0.2" + } + }, "media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", diff --git a/package.json b/package.json index 14bde2e..867c1e3 100644 --- a/package.json +++ b/package.json @@ -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" } } diff --git a/shitposts.js b/shitposts.js deleted file mode 100644 index a2775c2..0000000 --- a/shitposts.js +++ /dev/null @@ -1,37 +0,0 @@ -const Discord = require('discord.js'); -const client = require('./index').client; - -const tChannelID = '740207856288268289'; -const emoji = '719181283393142786'; - -client.on('messageReactionAdd', async function(reaction, user) { - - // Some people abused this "feature", to it is temporarily disabled. - return; - - let publish = false; - - // Fetch partials - if (reaction.partial) reaction = await reaction.fetch(); - if (user.partial) user = await user.fetch(); - - if (user.bot && user.id != client.user.id) return; - if (reaction.message.channel.id != tChannelID) return; - if (reaction.message.channel.type != 'news') return; - - if (reaction.emoji.id != emoji) return; - - const count = reaction.message.reactions.cache.filter(e => e.emoji.id == emoji).array()[0].count; - - if (count == 3) publish = true; // When the message has an attachment, publish it at 3 upvotes, else at 5 - - // This publishes the message using a direct API call. (Copied from https://github.com/Forcellrus/Discord-Auto-Publisher/blob/master/bot.js) - if (!publish) return; - reaction.message.react(client.emojis.cache.get('730053273561727063')).catch(); - await fetch(`https://discord.com/api/v6/channels/${reaction.message.channel.id}/messages/${reaction.message.id}/crosspost`, { - method: 'POST', - headers: { - Authorization: `Bot ${require('./config.json').token}`, - }, - }); -}); \ No newline at end of file diff --git a/util/69Reply.js b/util/69Reply.js new file mode 100644 index 0000000..f17af99 --- /dev/null +++ b/util/69Reply.js @@ -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)]); + } +} \ No newline at end of file diff --git a/util/commandLoader.js b/util/commandLoader.js new file mode 100644 index 0000000..025f4c2 --- /dev/null +++ b/util/commandLoader.js @@ -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`); +} \ No newline at end of file diff --git a/util/eventHandler.js b/util/eventHandler.js new file mode 100644 index 0000000..5d03022 --- /dev/null +++ b/util/eventHandler.js @@ -0,0 +1,71 @@ +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.split(usedPrefix)[1]; + if (msgContent.startsWith(' ') && usedPrefix != prefix) msgContent = msgContent.substr(1, msgContent.length); + const args = msgContent.split(' '); + const cmdName = args.shift(); + + const cmd = commands.find(cmd => cmd.meta?.name == cmdName || cmd.meta?.aliases?.indexOf(cmdName) > -1); + if (!cmd) return require('./69Reply').execute(message); + + if (cmd.meta?.staffOnly && !message.member.permissions.has('ADMINISTRATOR')) { + 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; + } + + 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; +} \ No newline at end of file diff --git a/util/karma.js b/util/karma.js new file mode 100644 index 0000000..8051575 --- /dev/null +++ b/util/karma.js @@ -0,0 +1,140 @@ +const client = require('../index').client; +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" + } +} + +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]; + if (coins.get(user.id) < award.cost) { + message.channel.send(`${user}, you don't have sufficient coins to use this award.`); + reaction.users.remove(user.id); + return; + } + if (message.author.id == user.id) { + //reaction.remove(); + reaction.users.remove(user.id); + return message.channel.send(`${user}, why would you give an award to yourself? smh my head`); + } + 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); + } + }); +} \ No newline at end of file diff --git a/util/login.js b/util/login.js new file mode 100644 index 0000000..bb52d90 --- /dev/null +++ b/util/login.js @@ -0,0 +1,31 @@ +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(); + }); + }); +} \ No newline at end of file diff --git a/wit.js b/util/wit.js similarity index 80% rename from wit.js rename to util/wit.js index 6aa080e..4ce62bd 100644 --- a/wit.js +++ b/util/wit.js @@ -1,7 +1,8 @@ -const config = require('./config.json'); const { Wit } = require('node-wit'); const { Message } = require('discord.js'); -const client = new Wit({accessToken: config["wit-token"]}); +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); @@ -11,9 +12,9 @@ function random(low, high) { return Math.floor(rndm * (high - low) + low); } -// The database karma sets stored in -const karmaDB = require('./index').karma; -const coinsDB = require('./index').coins; +// The database karma is stored in +const karmaDB = require('./karma').karma; +const coinsDB = require('./karma').coins; /** * @param {Message} message @@ -25,7 +26,6 @@ module.exports.execute = function(message) { // Send the message to wit.ai client.message(message.content) .then(response => { - let action = response.intents[0]; // "Execute" the intent. @@ -69,10 +69,10 @@ module.exports.execute = function(message) { return message.react('716021350883393566').catch(); } const randomNum = random(0, 10000) / 100; - if (randomNum > 99.9) {message.react('731508866273247252').catch(); coinsDB.set(message.author.id, (coinsDB.get(message.author.id) + 2500))} // Argentinum + 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 > 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); } -} +} \ No newline at end of file diff --git a/vibechat.js b/vibechat.js deleted file mode 100644 index 4ee8e3f..0000000 --- a/vibechat.js +++ /dev/null @@ -1,21 +0,0 @@ -const Discord = require('discord.js'); -const client = require('./index').client; - -const TCID = '737698514209079377'; -const VCID = '700734003174703265'; - -const TC = client.channels.cache.get(TCID); -const VC = client.channels.cache.get(VCID); - -client.on('voiceStateUpdate', (oldMember, newMember) => { - if (oldMember.channelID == newMember.channelID) return; - if (newMember.member.hasPermission('ADMINISTRATOR')) return; - if (newMember.channelID == VCID) { - TC.createOverwrite(newMember.member, { - VIEW_CHANNEL: true - } - , 'Does anyone even read this?'); - } else if (newMember.channelID != VCID && oldMember.channelID == VCID) { - TC.permissionOverwrites.get(oldMember.id).delete('Does anyone even read this?').catch(); - } -}); \ No newline at end of file