// requirements const Discord = require('discord.js'); const auth = require('./auth.json'); const XMLHttpRequest = require("xmlhttprequest").XMLHttpRequest; // voice setup var playQueue = []; var playVolume = []; var queueExists = false; var channel = null; // available commands function availableCommands() { return "Available commands: " + "\n**[SFW]** b.<*coinflip, 8ball, roll, compute, bunny, dankmemes, meirl, animemes, moe, moe-boys, hotguys , kgirls, kboys*>" + "\n**[NSFW]** b.<*lewd, ecchi, hentai, yaoi, yuri, neko, pokeporn, hgifs*>" + "\nFor more information on a command, you may use: *b.help *"; } // help commands function commandsHelp(requestedCommand) { var commands = {"coinflip": "**coinflip:** Returns a result of heads or tails.", "8ball": "**8ball:** Shakes an 8 ball and returns a result.", "roll": "**roll:** Rolls a number between 1-100 (or a specified range [ex: b.roll 50-100])", "compute": "**compute:** Uses WolframAlpha to process the question asked.", "bunny": "**bunny:** Posts a picture of different bunnies", "dankmemes": "**dankmemes:** Posts a picture of some dank memes (r/dankmemes)", "meirl": "**meirl:** Posts a picture of anime irl (r/anime_irl)", "animemes": "**animemes:** Posts a picture of anime memes (r/animemes)", "moe": "**moe:** Posts a picture of moe anime (r/awwnime)", "moe-boys": "**moe-boys:** Posts a picture of moe anime boys (r/cuteanimeboys)", "hotguys": "**hotguys:** Posts a picture of hot anime guys (r/bishounen)", "kgirls": "**kgirls:** Posts a picture of k-pop girls (r/kpics or r/kpopfap)", "kboys": "**kboys:** Posts a picture of k-pop guys (r/kfanservice, r/kpecs, or r/cutekboys)", "lewd": "[NSFW] **lewd:** Posts a picture of lewd anime girls (r/pantsu)", "ecchi": "[NSFW] **ecchi:** Posts a picture of ecchi anime girls (r/ecchi)", "hentai": "[NSFW] **hentai:** Posts a picture of hentai (r/hentai or r/sukebei)", "yaoi": "[NSFW] **yaoi:** Posts a picture of yaoi (r/yaoi)", "yuru": "[NSFW] **yuri:** Post a picture of yuri (r/yuri)", "neko": "[NSFW] **neko:** Posts a picture of cat girls (r/nekomimi)", "pokeporn": "[NSFW] **pokeporn:** Posts a picture of pokemon hentai (r/pokeporn)", "hgifs": "[NSFW] **hgifs:** Posts a gif of hentai (r/nsfwanimegifs)", "hentaibondage": "[NSFW] **hentaibondage:** Posts a picture of hentai in bondage (r/hentaibondage)"}; if (commands[requestedCommand] === undefined) { return "Command not found, try entering **b.commands** for a full list of commands"; } else { return commands[requestedCommand]; } } // coin flip function coinFlip() { return (Math.floor(Math.random() * 2) === 0) ? 'heads' : 'tails'; } // 8 ball function eightBall() { var answers = [ 'Maybe.', 'Certainly not.', 'I hope so.', 'Not in your wildest dreams.', 'There is a good chance.', 'Quite likely.', 'I think so.', 'I hope not.', 'I hope so.', 'Never!', 'Fuhgeddaboudit.', 'Ahaha! Really?!?', 'Pfft.', 'Sorry, bucko.', 'Hell, yes.', 'Hell to the no.', 'The future is bleak.', 'The future is uncertain.', 'I would rather not say.', 'Who cares?', 'Possibly.', 'Never, ever, ever.', 'There is a small chance.', 'Yes!']; return answers[(Math.floor(Math.random() * answers.length))]; } // number roll function numberRoll(startingRange, endingRange) { startingRange = Math.ceil(startingRange); endingRange = Math.floor(endingRange); return Math.floor(Math.random() * (endingRange-startingRange)) + startingRange; } // stupid question response function stupidQuestion() { var answers = [ 'What kind of dumb question is that?', 'A real question please.', 'Is that supposed to be a question?', 'Who asked such a dumb question?', 'How about a good question instead?', 'Only good questions please', 'Oh god, is that a question?', 'Are you dumb because that\'s a dumb question.']; return answers[(Math.floor(Math.random() * answers.length))]; } function noQuestion() { var answers = ['it helps to ask a question...', 'question plz.', 'where is the question?']; return answers[(Math.floor(Math.random() * answers.length))]; } // imgur request function imgurRequest(subreddit, page_max) { var multiSubreddit = subreddit.split(','); var request_url = 'https://api.imgur.com/3/gallery/r/' + multiSubreddit[getRandomInt(0, multiSubreddit.length-1)] + '/time/' + getRandomInt(1,page_max); var req = new XMLHttpRequest(); var returnText = ""; req.onreadystatechange = function() { if (req.readyState === 4 && req.status === 200) { if(req.responseText != "Not found") { var json = JSON.parse(req.responseText); returnText = json.data[getRandomInt(0,json.data.length-1)].link; } } }; req.open("GET", request_url, false); req.setRequestHeader('Authorization', 'Client-ID ' + auth.imgur); req.send(); return returnText; } // subreddit request function subredditRequest(subreddit) { var multiSubreddit = subreddit.split(','); var redditURL = "https://www.reddit.com/r/" + multiSubreddit[getRandomInt(0, multiSubreddit.length-1)] + "/.json?show=all&count=25&limit=100"; var req = new XMLHttpRequest(); var returnText = ""; req.onreadystatechange = function() { if(req.readyState === 4 && req.status === 200) { var json = JSON.parse(req.responseText); while(true) { var i = getRandomInt(0,json.data.children.length-1); try { if(json.data.children[i].data.post_hint === "image" || json.data.children[i].data.post_hint === "link" || json.data.children.data.post_hint === "rich:video") { returnText = json.data.children[i].data.url; break; } } catch (error) // error parsing json { // Ignore the error and continue. // continue; <-- last line in the loop... so does nothing. } } } }; req.open("GET", redditURL, false); req.send(); return returnText; } // redditbooru request function redditbooruRequest(subreddit) { var multiSubreddit = subreddit.split(','); var url = "https://" + multiSubreddit[getRandomInt(0, multiSubreddit.length-1)] + ".redditbooru.com/images/?limit=1000"; var req = new XMLHttpRequest(); var returnText = ""; req.onreadystatechange = function() { if(req.readyState === 4 && req.status === 200) { var json = JSON.parse(req.responseText); var imageID = getRandomInt(0, json.length); returnText = json[imageID].cdnUrl; } } req.open("GET", url, false); req.send(); return returnText; } // wolframalpha computation function calculate(message) { var url = "http://api.wolframalpha.com/v1/result?appid=" + auth.wolframalpha + "&i=" + encodeURIComponent(message); var req = new XMLHttpRequest(); var returnText = ""; req.onreadystatechange = function() { if(req.readyState === 4 && req.status === 200) { returnText = req.responseText; } } req.open("GET", url, false); req.send(); return returnText; } // get random number with starting and ending number function getRandomInt(min, max) { return Math.floor(Math.random() * (max - min + 1)) + min; } // voice setup function setupVoice(file, volume, voice_channel) { playQueue.unshift(file); playVolume.unshift(volume); if(!channel) { channel = voice_channel; } if(channel instanceof Discord.VoiceChannel) { if(!queueExists) { queueExists = true; channel.join().then(connection => { handlePlayQueue(connection); }); } } else { playQueue.pop(); playVolume.pop(); channel = null; } } // voice queue function handlePlayQueue(connection) { if (playQueue.length === 0) { return; } currentCommand = playQueue[0]; const dispatcher = connection.playFile(currentCommand) dispatcher.on("end", () => { playQueue.pop(); playVolume.pop(); if(playQueue.length === 0) { queueExists = false; if(channel != null) { channel.leave(); channel = null; } } else { handlePlayQueue(connection); } }); dispatcher.setVolume(playVolume[0]); } // discord setup const client = new Discord.Client(); client.on('ready', () => { console.log('Bot is ready'); client.user.setGame("with cute bunnies.") }); // commands client.on('message', message => { if (message.content.substring(0, 2).toUpperCase() === 'B.') { var args = message.content.substring(2).split(' '); var cmd = args[0]; switch(cmd) { // Reply commands case 'command': case 'commands': case 'help': //var message_content = message.content.substring(2).split(' '); if(message.content.substring(2).split(' ')[1] === undefined) { message.channel.send(availableCommands()); } else { message.channel.send(commandsHelp(message_content[1])); } break; case 'coinflip': case 'coin': message.channel.send(message.author + ' flipped a coin, it landed on **' + coinFlip() + '!**'); break; case '8ball': if(message.content.substring(8).length > 0) { message.channel.send(message.author + ' asked: *' + message.content.substring(8) + '*\n' + 'The magic 8 ball says: **' + eightBall() + '**'); } else { message.reply(noQuestion()); } break; case 'roll': var message_content = message.content.substring(2).split(' '); if(message_content[1] !== undefined && message_content[1].length > 0) // ranged roll { var regex = /^[0-9]+-[0-9]+$/; if(regex.test(message_content[1])) { var range_break = message_content[1].split('-'); message.channel.send(message.author + ' rolls a number between ' + range_break[0] + ' and ' + range_break[1] + '. They roll **' + numberRoll(range_break[0], range_break[1]) + '**.'); } else { message.channel.send('Unknown roll format. Use "**b.help roll**" for more information.'); } } else // default roll (1-100) { message.channel.send(message.author + ' rolls a number between 1 and 100. They roll **' + numberRoll(1, 100) + '**.'); } break; case 'compute': case 'convert': case 'calculate': var message_content = message.content.substring(2).split(' '); if(message_content[1] !== undefined && message_content[1].length > 0) { var response = calculate(message.content.substring(message.content.indexOf(' ')+1)); if(response === "") { response = stupidQuestion(); } message.channel.send(message.author + ' wants to compute: *' + message.content.substring(message.content.indexOf(' ')+1) + '*\n' + 'The result is: **' + response + '**') } else { message.reply(noQuestion()); } break; // SFW Generic Image commands case 'bun': case 'bunny': case 'bunnies': message.channel.send(imgurRequest('rabbits',5)); break; case 'dankmeme': case 'dankmemes': message.channel.send((Math.floor(Math.random() * 2) === 0) ? subredditRequest('dankmemes') : imgurRequest('dankmemes', 5)); break; case 'source': message.channel.send("BunnyBot's source code: https://git.dtam.pw/daniel/discord-bot-js"); break; /*case 'testcommand': break; */ // SFW Anime Image commands case 'meirl': message.channel.send((Math.floor(Math.random() * 2) === 0) ? subredditRequest('anime_irl') : imgurRequest('anime_irl', 5)); break; case 'animemes': message.channel.send((Math.floor(Math.random() * 2) === 0) ? subredditRequest('animemes') : imgurRequest('animemes', 5)); break; case 'moe': message.channel.send((Math.floor(Math.random() * 2) === 0) ? redditbooruRequest('awwnime') : imgurRequest('awwnime', 5)); break; case 'moe-boys': message.channel.send((Math.floor(Math.random() * 2) === 0) ? subredditRequest('cuteanimeboys') : imgurRequest('cuteanimeboys', 1)); break; case 'hotguys': message.channel.send((Math.floor(Math.random() * 2) === 0) ? redditbooruRequest('bishounen') : subredditRequest('bishounen')); break; case 'kgirls': var availableRequests = [ redditbooruRequest('kpics'), imgurRequest('kpics', 5), subredditRequest('kpopfap') ]; message.channel.send(availableRequests[Math.floor(Math.random() * availableRequests.length)]); break; case 'kboys': var availableRequests = [ imgurRequest('kfanservice',1), imgurRequest('kpecs',1), imgurRequest('cutekboys', 1) ]; message.channel.send(availableRequests[Math.floor(Math.random() * availableRequests.length)]); break; // NSFW case 'lewd': message.channel.send(redditbooruRequest('pantsu')); break; case 'ecchi': var availableRequests = [ subredditRequest('ecchi'), redditbooruRequest('ecchi'), redditbooruRequest('Sukebei'), imgurRequest('ecchi', 5) ]; message.channel.send(availableRequests[Math.floor(Math.random() * availableRequests.length)]); break; case 'hentai': message.channel.send((Math.floor(Math.random() * 2) === 0) ? imgurRequest('hentai', 5) : subredditRequest('hentai', 5)); break; case 'yaoi': message.channel.send(imgurRequest('yaoi', 5)); break; case 'yuri': message.channel.send(imgurRequest('yuri', 5)); break; case 'neko': message.channel.send((Math.floor(Math.random() * 2) === 0) ? imgurRequest('Nekomimi', 5) : subredditRequest('Nekomimi', 5)); break; case 'pokeporn': message.channel.send((Math.floor(Math.random() * 2) === 0) ? subredditRequest('pokeporn') : redditbooruRequest('pokeporn')); break; case 'hgifs': message.channel.send(subredditRequest('nsfwanimegifs', 5)); break; case 'hentaibondage': message.channel.send((Math.floor(Math.random() * 2) === 0) ? subredditRequest('hentaibondage') : imgurRequest('hentaibondage', 5)); break; case 'summon': var redditToSummon = message.content.substring(message.content.indexOf(' ')+1); if(redditToSummon) { message.channel.send(message.author + ' summons ' + redditToSummon + '*\n'); message.channel.send(subredditRequest(redditToSummon)) } else { message.reply("wut do i summon?"); } message.channel.send('commandArgOne=' + commandArgOne + '\nphrase=' + message.author + ' summons ' + redditToSummon + '*\n' + 'redditToSummon=' + redditToSummon); break; // Voice commands case 'join': channel = message.member.voiceChannel; channel.join(); break; case 'leave': case 'stop': case 'skip': if(channel != null) { channel.leave(); channel = null; } playQueue = []; break; case 'airhorn': setupVoice('voice/mlg-airhorn.mp3', 0.4, message.member.voiceChannel); break; case 'quiethorn': setupVoice('voice/mlg-airhorn.mp3', 0.03, message.member.voiceChannel); break; case 'weed': setupVoice('voice/smoke-weed.mp3', 0.2, message.member.voiceChannel); break; case 'damnson': setupVoice('voice/damnson.mp3', 0.35, message.member.voiceChannel); break; case 'wombo': setupVoice('voice/wombocombo.mp3', 0.06, message.member.voiceChannel); break; case 'cena': setupVoice('voice/cena.mp3', 0.10, message.member.voiceChannel); break; case 'triple': setupVoice('voice/triple.mp3', 0.20, message.member.voiceChannel); break; } } }); // login client.login(auth.token);