commit 5dd1619545471c83b097904c74f8515591cacf06 Author: Max Litruv Boonzaayer Date: Sat Mar 16 14:48:09 2019 +1100 Initial commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..252af85 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +node_modules +dbconfig.json diff --git a/README.md b/README.md new file mode 100644 index 0000000..d3e6d29 --- /dev/null +++ b/README.md @@ -0,0 +1 @@ +DadminYT diff --git a/command.template.js b/command.template.js new file mode 100644 index 0000000..4385173 --- /dev/null +++ b/command.template.js @@ -0,0 +1,9 @@ +exports.name = "name" +exports.alias = ['clear'] +exports.helptext = "helpmessage" +exports.helphide = false +exports.permissions = ['READ_MESSAGES'] +exports.args = ['template'] +exports.category = 'general' + +exports.command = (client, msg) => {} diff --git a/commands/anagram.js b/commands/anagram.js new file mode 100644 index 0000000..678cd7f --- /dev/null +++ b/commands/anagram.js @@ -0,0 +1,31 @@ +const fs = require('fs') +const Discord = require('discord.js') +var request = require('request'); + + +exports.name = "Anagram Finder" +exports.alias = ['anagram', 'nagaram'] +exports.helptext = "finds anagrams up to 9 letters" +exports.permissions = ['VIEW_CHANNEL'] +exports.args = ['letters'] +exports.command = (client, msg) => { + + var url = "http://www.anagramica.com/best/:"; + + if (msg.suffix.length > 9){ + msg.reply("That anagram is too long. Max 9 Letters."); + return; + } + request({ + url: url + msg.suffix, + json: true + }, function (error, response, body) { + if (!error && response.statusCode === 200) { + var replystring = ""; + for (i = 0; i < body.best.length; i++) + replystring += body.best[i] + ', '; + msg.reply(replystring.substr(0, replystring.length - 2)); // Print the json response + } + }); + +} \ No newline at end of file diff --git a/commands/botname.js b/commands/botname.js new file mode 100644 index 0000000..7fb3235 --- /dev/null +++ b/commands/botname.js @@ -0,0 +1,9 @@ +exports.name = "Change <@476369946386104330>'s Name" +exports.alias = ['botname'] +exports.helptext = "Changes the bots name on the server" +exports.permissions = ["MANAGE_NICKNAMES"] +exports.args = ["new-name"] +exports.category = 'admin' +exports.command = (client, msg) => { + msg.guild.me.setNickname(msg.suffix); +} \ No newline at end of file diff --git a/commands/changeprefix.js b/commands/changeprefix.js new file mode 100644 index 0000000..883444f --- /dev/null +++ b/commands/changeprefix.js @@ -0,0 +1,16 @@ +exports.name = "Change Prefix" +exports.alias = ['changeprefix','prefix'] +exports.helptext = "Changes the bots prefix for the server" +exports.permissions = ["ADMINISTRATOR"] +exports.category = 'admin' +exports.args = ["new-prefix"] +exports.command = (client, msg) => { + if (msg.suffix.length != 1) { + msg.reply("please only use 1 character") + return; + } + client.database.set_setting(msg.guild.id, "prefix", msg.suffix) + client.cachedserversettings.filter(function (server) { + return server.guildID == msg.guild.id; + })[0].prefix = msg.suffix; +} \ No newline at end of file diff --git a/commands/clear.js b/commands/clear.js new file mode 100644 index 0000000..0a6a181 --- /dev/null +++ b/commands/clear.js @@ -0,0 +1,12 @@ +exports.name = "Clear Messages" +exports.alias = ['clear'] +exports.helptext = "Clears messages from the channel" +exports.helphide = false +exports.permissions = ['VIEW_CHANNEL'] +exports.args = ['number'] +exports.category = 'admin' + +exports.command = (client, msg) => { + console.log("Clearing: " + msg.suffix); + msg.channel.bulkDelete(parseInt(msg.suffix)+1); +} \ No newline at end of file diff --git a/commands/diagnose.js b/commands/diagnose.js new file mode 100644 index 0000000..6e1e2f1 --- /dev/null +++ b/commands/diagnose.js @@ -0,0 +1,94 @@ +exports.name = 'Self Diagnosis' +exports.alias = ['diagnose', 'webmd'] +exports.helptext = 'What cancer do you have today?' +exports.helphide = false +exports.permissions = ['READ_MESSAGES'] +exports.category = 'general' +exports.command = (client, msg) => { + switch(getRandomInt(0,25)) { + case 0: + msg.reply("I'm sorry, It's Cancer."); + break; + case 1: + msg.reply("I'm sorry, It's Lukemia."); + break; + case 2: + msg.reply("I'm sorry, It's AIDS."); + break; + case 3: + msg.reply("I'm sorry, It's Lesch-Nyhan."); + break; + case 4: + msg.reply("I'm sorry, It's Heart Disease."); + break; + case 5: + msg.reply("I'm sorry, It's Ebola."); + break; + case 6: + msg.reply("I'm sorry, It's Addison’s disease."); + break; + case 7: + msg.reply("I'm sorry, It's Asthma."); + break; + case 8: + msg.reply("I'm sorry, It's Cardiac failure."); + break; + case 9: + msg.reply("I'm sorry, It's Cardiomyopathy."); + break; + case 10: + msg.reply("I'm sorry, It's Chronic obstructive pulmonary disorder."); + break; + case 11: + msg.reply("I'm sorry, It's Chronic renal disease."); + break; + case 12: + msg.reply("I'm sorry, It's Coronary artery disease."); + break; + case 13: + msg.reply("I'm sorry, It's Crohn’s disease."); + break; + case 14: + msg.reply("I'm sorry, It's Diabetes."); + break; + case 15: + msg.reply("I'm sorry, It's Glaucoma."); + break; + case 16: + msg.reply("I'm sorry, It's Haemophilia."); + break; + case 17: + msg.reply("I'm sorry, It's Hypertension."); + break; + case 18: + msg.reply("I'm sorry, It's Hypothyroidism."); + break; + case 19: + msg.reply("I'm sorry, It's Multiple sclerosis."); + break; + case 20: + msg.reply("I'm sorry, It's Parkinson’s disease."); + break; + case 21: + msg.reply("I'm sorry, It's Rheumatoid arthritis."); + break; + case 22: + msg.reply("I'm sorry, It's Schizophrenia."); + break; + case 23: + msg.reply("I'm sorry, It's Systemic lupus erythematosus."); + break; + case 24: + msg.reply("I'm sorry, It's Ulcerative colitis."); + break; + case 25: + msg.reply("I'm sorry, It's Bipolar Mood Disorder."); + break; + } +} + +function getRandomInt(min, max) { + min = Math.ceil(min); + max = Math.floor(max); + return Math.floor(Math.random() * (max - min)) + min; //The maximum is exclusive and the minimum is inclusive + } \ No newline at end of file diff --git a/commands/emotepage.js b/commands/emotepage.js new file mode 100644 index 0000000..31b78ac --- /dev/null +++ b/commands/emotepage.js @@ -0,0 +1,18 @@ +exports.name = "Emote Page Test" +exports.alias = ['emotetest'] +exports.helptext = "testing for emote responses" +exports.helphide = true; +exports.command = (client, msg) => { + + msg.reply ("testing emote thing") + .then(sent => { + sent.react('555213405217226776').then( + () => message.react('555213429200388116')); + const filter = (reaction, user) => user.id === msg.member.user.id + + sent.awaitReactions(filter) + .then(collected => console.log(`Collected ${collected.size} reactions`)) + .catch(console.error); + }) + return true; +} \ No newline at end of file diff --git a/commands/getautoparent.js b/commands/getautoparent.js new file mode 100644 index 0000000..be0238e --- /dev/null +++ b/commands/getautoparent.js @@ -0,0 +1,11 @@ +exports.name = 'Get auto parent' +exports.alias = ['getautoparent'] +exports.helptext = 'gets the auto creation channel' +exports.helphide = false +exports.permissions = ['ADMINISTRATOR'] +exports.category = 'admin' +exports.command = (client, msg) => { + client.database.get_setting("autoParent", msg.guild.id).then((r) => { + msg.reply(`${r} - ${msg.guild.channels.get(r).name}`); + }); +} \ No newline at end of file diff --git a/commands/getautovoice.js b/commands/getautovoice.js new file mode 100644 index 0000000..abcb52e --- /dev/null +++ b/commands/getautovoice.js @@ -0,0 +1,12 @@ +exports.name = 'Get auto voice' +exports.alias = ['getautovoice'] +exports.helptext = 'Set the auto-sorting channel' +exports.helphide = false +exports.permissions = ['READ_MESSAGES'] +exports.category = 'admin' +exports.command = (client, msg) => { + client.database.get_setting("autoVoice", msg.guild.id).then((r) => { + msg.reply(`${r} - ${msg.guild.channels.get(r).name}`); + }); + +} \ No newline at end of file diff --git a/commands/help.js b/commands/help.js new file mode 100644 index 0000000..370d071 --- /dev/null +++ b/commands/help.js @@ -0,0 +1,91 @@ +const fs = require('fs') +const Discord = require('discord.js') + +exports.name = "Help file" +exports.alias = ['help', '?'] +exports.helptext = "Runs this help menu" +exports.permissions = ['VIEW_CHANNEL'] +exports.args = ['(general)/music/admin'] +exports.command = (client, msg) => { + + + fs.readdir("./commands/", function (err, items) { + var embed = new Discord.RichEmbed + embed.color = 0x0ca9fe + //embed.setAuthor("DAdmin", "https://cdn.discordapp.com/avatars/476369946386104330/833d7f2fcae8a31f6c74551c8f703ca8.png", "https://litruv.com") + + + var suffix = msg.suffix; + var lookingfor = 0 + if (msg.suffix.toLowerCase() == "admin"){ + lookingfor = 1 + suffix = "admin" + } else if (msg.suffix.toLowerCase() == "music"){ + lookingfor = 2 + suffix = "music" + } else { + lookingfor = 0; + suffix = "general" + + } + + var description = ""; + switch(lookingfor){ + case 0: + description += "General Commands" + break; + case 1: + description += "Admin Commands" + break; + case 2: + description += "Music Commands" + break + } + + description += "\n\n" + + for (var i = 0; i < items.length; i++) { + var reqcommand = require("./" + items[i]) + if (reqcommand.helphide) + continue; + if (reqcommand.category == undefined) + reqcommand.category = 'general' + + + + if (reqcommand.category != suffix) + continue; + + + + description += "**" + reqcommand.name + "** - *" + reqcommand.helptext + "* \n " + args = ""; + + if (reqcommand.args != undefined) + for (var z = 0; z < reqcommand.args.length; z++) { + args += "<" + reqcommand.args[z] + ">" + } + description += "```apache\n" + for (var z = 0; z < reqcommand.alias.length; z++) { + description += client.cachedserversettings.filter(function (server) { + return server.guildID == msg.guild.id; + })[0].prefix + + description += reqcommand.alias[z] + " "; + if (z != reqcommand.alias.length -1) + description += "/ "; + } + + description += "\n" + args + "```" + if (i != items.length -1) + description += "\n"; + + delete require.cache[require.resolve('./' + items[i])] + + } + embed.setDescription(description) + + msg.channel.send(embed); + }) + +} \ No newline at end of file diff --git a/commands/joke.js b/commands/joke.js new file mode 100644 index 0000000..67f4cbf --- /dev/null +++ b/commands/joke.js @@ -0,0 +1,29 @@ +var request = require('request'); +var url = "https://www.reddit.com/r/dadjokes/hot/.json?limit=100"; + + +exports.name = 'joke' +exports.alias = ['joke'] +exports.helptext = 'Fresh dad jokes from reddit.com/r/dadjokes' +exports.helphide = false +exports.permissions = ['READ_MESSAGES'] +exports.category = 'general' +exports.command = (client, msg) => { + request({ + url: url, + json: true + }, function (error, response, body) { + if (!error && response.statusCode === 200) { + + //var parsed = JSON.parse(response) + var jokenumber = getRandomInt(0, 25); + msg.reply(body.data.children[jokenumber].data.title + " " + body.data.children[jokenumber].data.selftext); // Print the json response + } + }); +} + +function getRandomInt(min, max) { + min = Math.ceil(min); + max = Math.floor(max); + return Math.floor(Math.random() * (max - min)) + min; //The maximum is exclusive and the minimum is inclusive + } \ No newline at end of file diff --git a/commands/kick.js b/commands/kick.js new file mode 100644 index 0000000..2f082d9 --- /dev/null +++ b/commands/kick.js @@ -0,0 +1,20 @@ +exports.name = 'Kick' +exports.alias = ['kick'] +exports.helptext = 'Kicks users from the voice channel' +exports.helphide = false +exports.permissions = ['MOVE_MEMBERS'] +exports.args = ['@Tag'] +exports.category = 'admin' +exports.command = (client, msg) => { + if (msg.mentions.members.array().length > 0) + msg.member.guild.createChannel('Kicked', 'voice') + .then(channel => { + msg.mentions.members.first().setVoiceChannel(channel.id); + c = channel; + setTimeout(function () { + c.delete() + }, 150); + }) + .catch(console.error); + +} \ No newline at end of file diff --git a/commands/moveall.js b/commands/moveall.js new file mode 100644 index 0000000..0496de5 --- /dev/null +++ b/commands/moveall.js @@ -0,0 +1,16 @@ +exports.name = 'Move all' +exports.alias = ['moveall'] +exports.helptext = 'Moves all people from one Voice Chat, to the next' +exports.helphide = false +exports.permissions = ['MOVE_MEMBERS'] +exports.args = ['ChannelID', 'ChannelID'] +exports.category = 'admin' +exports.command = (client, msg) => { + cleaner = msg.cleanContent.replace(/\s\s+/g, ' '); + chans = cleaner.split(' '); + console.log("From: " + chans[1]); + msg.guild.channels.get(chans[1]).members.forEach(m => { + m.setVoiceChannel(chans[2]); + }); + +} \ No newline at end of file diff --git a/commands/permissions.js b/commands/permissions.js new file mode 100644 index 0000000..af49ca8 --- /dev/null +++ b/commands/permissions.js @@ -0,0 +1,21 @@ +exports.name = 'Permissions' +exports.alias = ['permissions'] +exports.helptext = 'Check permissions for user' +exports.helphide = false +exports.permissions = ['MANAGE_ROLES_OR_PERMISSIONS'] +exports.args = ['@Tag'] +exports.category = 'admin' +exports.command = (client, msg) => { + if(msg.mentions.members.array().length != 1) + return; + + var perms = msg.mentions.members.first().permissions.toArray(true); + + var message = ""; + for (var i = 0; i < perms.length; i++) { + message += perms[i]; + if (i != perms.length -1) + message += ", "; + } + msg.reply(message); +} \ No newline at end of file diff --git a/commands/redditdoggo.js b/commands/redditdoggo.js new file mode 100644 index 0000000..531187d --- /dev/null +++ b/commands/redditdoggo.js @@ -0,0 +1,33 @@ +var request = require('request'); +var url = "https://www.reddit.com/r/doggos/hot/.json?limit=100"; + +exports.name = 'Doggo' +exports.alias = ['doggo'] +exports.helptext = 'Inserts good boye from reddit/r/doggos' +exports.helphide = false +exports.permissions = ['READ_MESSAGES'] +exports.category = 'general' +exports.command = (client, msg) => { + request({ + url: url, + json: true + }, function (error, response, body) { + if (!error && response.statusCode === 200) { + var sent = false; + while (!sent) { + var jokenumber = getRandomInt(1, 25); + if (body.data.children[jokenumber].data.url.endsWith(".jpg")) + { + msg.channel.send({file:body.data.children[jokenumber].data.url}); + sent = true; + } + } + } + }); +} + +function getRandomInt(min, max) { + min = Math.ceil(min); + max = Math.floor(max); + return Math.floor(Math.random() * (max - min)) + min; +} \ No newline at end of file diff --git a/commands/redditkitty.js b/commands/redditkitty.js new file mode 100644 index 0000000..09e56d8 --- /dev/null +++ b/commands/redditkitty.js @@ -0,0 +1,33 @@ +var request = require('request'); +var url = "https://www.reddit.com/r/cats/hot/.json?limit=100"; + +exports.name = 'Kitty' +exports.alias = ['kitty'] +exports.helptext = 'Inserts good boye from reddit/r/cats' +exports.helphide = false +exports.permissions = ['READ_MESSAGES'] +exports.category = 'general' +exports.command = (client, msg) => { + request({ + url: url, + json: true + }, function (error, response, body) { + if (!error && response.statusCode === 200) { + var sent = false; + while (!sent) { + var jokenumber = getRandomInt(1, 25); + if (body.data.children[jokenumber].data.url.endsWith(".jpg")) + { + msg.channel.send({file:body.data.children[jokenumber].data.url}); + sent = true; + } + } + } + }); +} + +function getRandomInt(min, max) { + min = Math.ceil(min); + max = Math.floor(max); + return Math.floor(Math.random() * (max - min)) + min; +} \ No newline at end of file diff --git a/commands/redditlizard.js b/commands/redditlizard.js new file mode 100644 index 0000000..1e71b77 --- /dev/null +++ b/commands/redditlizard.js @@ -0,0 +1,33 @@ +var request = require('request'); +var url = "https://www.reddit.com/r/lizards/hot/.json?limit=100"; + +exports.name = 'Lizard' +exports.alias = ['lizard'] +exports.helptext = 'Inserts good boye from reddit/r/lizards' +exports.helphide = false +exports.permissions = ['READ_MESSAGES'] +exports.category = 'general' +exports.command = (client, msg) => { + request({ + url: url, + json: true + }, function (error, response, body) { + if (!error && response.statusCode === 200) { + var sent = false; + while (!sent) { + var jokenumber = getRandomInt(1, 25); + if (body.data.children[jokenumber].data.url.endsWith(".jpg")) + { + msg.channel.send({file:body.data.children[jokenumber].data.url}); + sent = true; + } + } + } + }); +} + +function getRandomInt(min, max) { + min = Math.ceil(min); + max = Math.floor(max); + return Math.floor(Math.random() * (max - min)) + min; +} \ No newline at end of file diff --git a/commands/redditmlem.js b/commands/redditmlem.js new file mode 100644 index 0000000..a40d124 --- /dev/null +++ b/commands/redditmlem.js @@ -0,0 +1,33 @@ +var request = require('request'); +var url = "https://www.reddit.com/r/mlem/hot/.json?limit=100"; + +exports.name = 'Mlem' +exports.alias = ['mlem'] +exports.helptext = 'Inserts good boye from reddit/r/mlem' +exports.helphide = false +exports.permissions = ['READ_MESSAGES'] +exports.category = 'general' +exports.command = (client, msg) => { + request({ + url: url, + json: true + }, function (error, response, body) { + if (!error && response.statusCode === 200) { + var sent = false; + while (!sent) { + var jokenumber = getRandomInt(1, 25); + if (body.data.children[jokenumber].data.url.endsWith(".jpg")) + { + msg.channel.send({file:body.data.children[jokenumber].data.url}); + sent = true; + } + } + } + }); +} + +function getRandomInt(min, max) { + min = Math.ceil(min); + max = Math.floor(max); + return Math.floor(Math.random() * (max - min)) + min; +} \ No newline at end of file diff --git a/commands/redditsloth.js b/commands/redditsloth.js new file mode 100644 index 0000000..f98ae2f --- /dev/null +++ b/commands/redditsloth.js @@ -0,0 +1,33 @@ +var request = require('request'); +var url = "https://www.reddit.com/r/sloths/hot/.json?limit=100"; + +exports.name = 'Sloth' +exports.alias = ['sloth'] +exports.helptext = 'Inserts good boye from reddit/r/sloths' +exports.helphide = false +exports.permissions = ['READ_MESSAGES'] +exports.category = 'general' +exports.command = (client, msg) => { + request({ + url: url, + json: true + }, function (error, response, body) { + if (!error && response.statusCode === 200) { + var sent = false; + while (!sent) { + var jokenumber = getRandomInt(1, 25); + if (body.data.children[jokenumber].data.url.endsWith(".jpg")) + { + msg.channel.send({file:body.data.children[jokenumber].data.url}); + sent = true; + } + } + } + }); +} + +function getRandomInt(min, max) { + min = Math.ceil(min); + max = Math.floor(max); + return Math.floor(Math.random() * (max - min)) + min; +} \ No newline at end of file diff --git a/commands/restart.js b/commands/restart.js new file mode 100644 index 0000000..57ca0c6 --- /dev/null +++ b/commands/restart.js @@ -0,0 +1,18 @@ +exports.name = 'Restart' +exports.alias = ['restart'] +exports.helptext = 'Restart DAdmin' +exports.helphide = true +exports.permissions = ['READ_MESSAGES'] +exports.category = 'admin' +exports.command = (client, msg) => { + var r = "220772082055774210"; + if (msg.member.id == r) { + msg.react("✅"); + msg.reply("Shutting Down.. 😭"); + setTimeout(function () { + process.exit(22); + }, 1000); + } else { + msg.react("❌"); + } +} \ No newline at end of file diff --git a/commands/setautoparent.js b/commands/setautoparent.js new file mode 100644 index 0000000..8ff3d48 --- /dev/null +++ b/commands/setautoparent.js @@ -0,0 +1,10 @@ +exports.name = 'Set auto parent' +exports.alias = ['setautoparent'] +exports.helptext = 'sets the auto creation category' +exports.helphide = false +exports.permissions = ['ADMINISTRATOR'] +exports.args = ['VChannelID'] +exports.category = 'admin' +exports.command = (client, msg) => { + database.set_setting(msg.guild.id, "autoParent", msg.suffix); +} \ No newline at end of file diff --git a/commands/setautovoice.js b/commands/setautovoice.js new file mode 100644 index 0000000..42e6a70 --- /dev/null +++ b/commands/setautovoice.js @@ -0,0 +1,10 @@ +exports.name = 'Set auto voice' +exports.alias = ['setautovoice'] +exports.helptext = 'Sets the auto-sorting voice channel' +exports.helphide = false +exports.permissions = ['ADMINISTRATOR'] +exports.args = ['VChannelID'] +exports.category = 'admin' +exports.command = (client, msg) => { + client.database.set_setting(msg.guild.id, "autoVoice", msg.suffix); +} \ No newline at end of file diff --git a/commands/slap.js b/commands/slap.js new file mode 100644 index 0000000..26813a6 --- /dev/null +++ b/commands/slap.js @@ -0,0 +1,33 @@ +exports.name = 'Slap' +exports.alias = ['slap'] +exports.helptext = 'Slaps users to empty channels and back again' +exports.helphide = false +exports.permissions = ['MOVE_MEMBERS'] +exports.args = ['@Tag'] +exports.category = 'admin' +exports.command = (client, msg) => { + client.database.get_setting("autoVoice", msg.guild.id).then((autochan) => { + var itemsProcessed = 0; + var cid = msg.mentions.members.first().voiceChannelID; + + msg.guild.channels.filter(isVoice).forEach(element => { + itemsProcessed++; + + if (itemsProcessed <= 8) { + if (element.id != autochan) { + if (element.members.array().length == 0); + msg.mentions.members.first().setVoiceChannel(element.id); + + } + if (itemsProcessed >= msg.guild.channels.filter(isVoice).array().length || itemsProcessed >= 8) { + msg.mentions.members.first().setVoiceChannel(cid); + } + } + }); + }); + +} + +function isVoice(value) { + return value.type == "voice"; +} diff --git a/commands/stats.js b/commands/stats.js new file mode 100644 index 0000000..9713bcc --- /dev/null +++ b/commands/stats.js @@ -0,0 +1,50 @@ +exports.name = 'Stats for DAdmin' +exports.alias = ['stats'] +exports.helptext = 'Metrics on DAdmin, uptime, users, servers' +exports.helphide = false +exports.permissions = ['READ_MESSAGES'] +exports.category = 'general' +exports.command = (client, msg) => { + var users = 0; + for (var i = 0; i < client.guilds.array().length; i++){ + users += client.guilds.array()[i].members.array().length; + } + + msg.reply("Running DAdmin for " + millisecondsToStr(client.uptime) + " on " + client.guilds.array().length + " servers for " + users + " users, since 09 Aug 2018"); + +} + + +function millisecondsToStr (milliseconds) { + // TIP: to find current time in milliseconds, use: + // var current_time_milliseconds = new Date().getTime(); + + function numberEnding (number) { + return (number > 1) ? 's' : ''; + } + + var temp = Math.floor(milliseconds / 1000); + var years = Math.floor(temp / 31536000); + if (years) { + return years + ' year' + numberEnding(years); + } + //TODO: Months! Maybe weeks? + var days = Math.floor((temp %= 31536000) / 86400); + if (days) { + return days + ' day' + numberEnding(days); + } + var hours = Math.floor((temp %= 86400) / 3600); + if (hours) { + return hours + ' hour' + numberEnding(hours); + } + var minutes = Math.floor((temp %= 3600) / 60); + if (minutes) { + return minutes + ' minute' + numberEnding(minutes); + } + var seconds = temp % 60; + if (seconds) { + return seconds + ' second' + numberEnding(seconds); + } + return 'less than a second'; //'just now' //or other string you like; +} + diff --git a/database.js b/database.js new file mode 100644 index 0000000..dc031af --- /dev/null +++ b/database.js @@ -0,0 +1,149 @@ +var mysql = require('mysql'); +var config = require('./dbconfig.json'); + +module.exports = { + checkguilds: function (discordclient) { + discordclient.guilds.forEach(guild => { + check_guild_exists(discordclient, guild.id).then((r) => { + console.log(r); + console.log(guild.name); + }); + + this.checkusers(discordclient, guild); + }); + }, + + checkusers: async function (client, guild) { + await guild.members.forEach(member => { + check_user_exists(client, member.id, guild.id); + }); + }, + + get_setting: async function (settingname, guildID=0) { + + var settingreturn = await sql_q(settingname, guildID); + return settingreturn[0].value; + }, + + set_setting: async function (guildID, settingname, value) { + sql_qs(guildID, settingname, value); + }, + + connect: async function () { + this.con = await connecttodb(); + }, + + user_add_command(userid, guildID) { + increment_user_commands(userid, guildID); + } +}; + +function connecttodb() { + new Promise(resolve => { + this.con = mysql.createConnection({ + host: config.mysql_host, + user: config.mysql_user, + password: config.mysql_password, + database: config.mysql_db, + charset: "utf8mb4_unicode_ci" + }); + + resolve(this.con); + }); +} +async function check_user_exists(client, userid, guildid) { + var exists = await sql_user(client, userid, guildid); + return exists[0]; +} + +function sql_user(client, userid, guildid) { + return new Promise(resolve => { + con.query("SELECT AI_ID FROM users WHERE ID = '" + userid + "'", function (err, result, fields) { + if (err) throw err; + + var user = client.guilds.get(guildid).members.get(userid); + var username = user.displayName; + var usericon = user.user.avatarURL; + var bot = user.user.bot; + var discriminator = user.user.discriminator; + var actualusername = user.user.username; + + if (result.length == 0) + var sql = `INSERT INTO users (ID, name, username, avatarURL, bot, discriminator, serverID, joined) VALUES (${con.escape(userid)}, ${con.escape(username)}, ${con.escape(actualusername)}, ${con.escape(usericon)}, ${con.escape(bot)}, ${con.escape(discriminator)}, ${con.escape(guildid)}, ${con.escape(user.joinedTimestamp)});`; + + else + var sql = `UPDATE users SET name=${con.escape(username)}, avatarURL=${con.escape(usericon)}, discriminator=${con.escape(discriminator)} WHERE (ID=${con.escape(userid)} AND serverID=${con.escape(guildid)});`; + + con.query(sql, function (err, result) { + if (err) throw err; + }); + }); + }); +} + +function sql_guild(client, guildid) { + return new Promise(resolve => { + con.query("SELECT AI_ID FROM servers WHERE ServerID = '" + guildid + "'", function (err, result, fields) { + if (err) throw err; + if (result.length == 0) { + var guild = client.guilds.get(guildid); + var guildname = guild.name; + var guildicon = guild.iconURL; + + if (guildname != null) { + var sql = "INSERT INTO `servers` (`ServerID`, `ServerName`, `ServerIcon`) VALUES (" + con.escape(guildid) + ", " + con.escape(guildname) + ", " + con.escape(guildicon) + ");"; + + con.query(sql, function (err, result) { + if (err) throw err; + console.log(`${guildname} inserted into DB`); + }); + } + } + }); + }); +} + +async function check_guild_exists(client, guildid) { + var exists = await sql_guild(client, guildid); + return exists[0]; +} + +function sql_q(settingname, serverID = 0) { + return new Promise(resolve => { + this.con.query(`SELECT value FROM settings WHERE setting = ${con.escape(settingname)} AND serverID = ${con.escape(serverID)}`, function (err, result, fields) { + if (err) throw err; + resolve(result); + }); + }); +} + +function sql_qs(guildid, settingname, value) { + return new Promise(resolve => { + this.con.query(`SELECT value FROM settings WHERE setting = ${con.escape(settingname)} AND serverID = ${con.escape(guildid)}`, function (err, result, fields) { + if (err) throw err; + + if (result.length == 0) + var sql = `INSERT INTO settings (setting, value, serverID) VALUES (${con.escape(settingname)}, ${con.escape(value)}, ${con.escape(guildid)});`; + + else + var sql = `UPDATE settings SET value=${con.escape(value)} WHERE (setting=${con.escape(settingname)} AND serverID=${con.escape(guildid)});`; + + con.query(sql, function (err, result) { + if (err) throw err; + }); + }); + + + }); +} + +function increment_user_commands(userid, guildid) { + this.con.query(`UPDATE users SET usedCommands=usedCommands+1 WHERE (ID=${con.escape(userid)} AND serverID=${con.escape(guildid)})`, function (err, result, fields) { + + //UPDATE images SET counter=counter+1 WHERE image_id=15 + if (err) throw err; + }); +} + +console.log("=MySQL===================="); +console.log("Logged in as " + config.mysql_user + " to " + config.mysql_host); \ No newline at end of file diff --git a/dbconfig.template.json b/dbconfig.template.json new file mode 100644 index 0000000..31a2d3e --- /dev/null +++ b/dbconfig.template.json @@ -0,0 +1,6 @@ +{ + "mysql_user" : "username", + "mysql_host" : "db.host.com", + "mysql_password" : "hunter2", + "mysql_db" : "bot_db" +} diff --git a/index.js b/index.js new file mode 100644 index 0000000..6b4e6ba --- /dev/null +++ b/index.js @@ -0,0 +1,145 @@ +//Includes +const Discord = require('discord.js') +const client = new Discord.Client() +client.database = require('./database') +const linkify = require('linkifyjs') +const fs = require('fs') +const colors = require('colors'); + +//Globals + +//Database Connection +client.database.connect().then(con => { + try { + client.database.get_setting('token').then(token => { + console.log("=Discord==================") + client.login(token) + }) + } catch (e) { + console.log(e) + } +}) + +class cachedsettings { + constructor(guildID, prefix) { + this.prefix = prefix + this.guildID = guildID + } + + getPrefix() { + return this.prefix + } +} + +class CachedCommand { + constructor(alias, file) { + this.alias = alias + this.file = file + } +} + +class Commands { + loadcommands() { + fs.readdir("./commands/", function (err, items) { + for (var i = 0; i < items.length; i++) { + var reqcommand = require('./commands/' + items[i]) + for (var z = 0; z < reqcommand.alias.length; z++) { + var cachedcommand = new CachedCommand(reqcommand.alias[z], items[i]) + client.cachedcommands.push(cachedcommand) + } + } + + for (var i = 0; i < client.cachedcommands.length; i++) + console.log("Loaded: " + client.cachedcommands[i].alias + " - " + client.cachedcommands[i].file) + }); + } +} + +client.commands = new Commands() +client.cachedcommands = new Array() +client.cachedserversettings = new Array(); + +client.on('ready', () => { + console.log("Logged in as " + client.user.tag.green.bold + "!") + + client.commands.loadcommands() + loadplugins() +}) + +function loadplugins(){ + fs.readdir("./plugins/", function (err, items) { + + for (var i = 0; i < items.length; i++) { + var reqcommand = require('./commands/' + items[i]) + } + }) +} + +client.on("message", (msg) => { + if (msg.author.bot) return + onMessage(msg) +}) + +function onMessage(msg, again = true) { + if (client.cachedserversettings.filter(function (server) { + return server.guildID == msg.guild.id + }).length == 0) + client.database.get_setting("prefix", msg.guild.id).then(prefix => { + client.cachedserversettings.push(new cachedsettings(msg.guild.id, prefix)) + doCommand(msg, prefix) + }).catch(err => { + if (again == true) { + client.database.set_setting(msg.guild.id, "prefix", "~") + onMessage(msg, false) + } + }) + else + doCommand(msg, client.cachedserversettings.filter(function (server) { + return server.guildID == msg.guild.id + })[0].getPrefix()) +} + +function doCommand(msg, prefix) { + var message = msg.cleanContent + if (!message.startsWith(prefix)) return + + //Split into command + args + const command = message.substring(prefix.length).split(/[ \n]/)[0].trim() + msg.suffix = message.substring(prefix.length + command.length).trim() + + var cmds = client.cachedcommands.filter(cmd => cmd.alias == command); + if (cmds.length > 0) { + console.log("CMD:".green + " ".reset + msg.member.user.username.bold + "#".reset + msg.member.user.discriminator.reset + " " + prefix.grey + command.green.bold + " ".reset + msg.suffix + " | " + msg.guild.name) + var reqcommand = require('./commands/' + cmds[0].file) + if (msg.member.hasPermission(reqcommand.permissions)) { + msg.react('✅') + try { + reqcommand.command(client, msg) + } catch (err) { + console.error('There was an error running: ' + command); + console.error(err.stack); + } + } else { + msg.react('⛔') + } + + delete require.cache[require.resolve('./commands/' + cmds[0].file)] + } + + + //if (msg.guild.id != "355555081296412683") return; + + //if (linkify.find(message).length > 0) + //msg.reply(linkify.find(message)[0].href); + + /* + if (fs.existsSync('./commands/' + command + '.js')) { + console.log(msg.member.displayName + ": " + command); + + var reqcommand = require('./commands/' + command); + reqcommand.runcommand(client, msg, database); + delete require.cache[require.resolve('./commands/' + command)]; + + database.user_add_command(msg.member.id, msg.guild.id); + }*/ +} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..8e87a1e --- /dev/null +++ b/package-lock.json @@ -0,0 +1,724 @@ +{ + "name": "dadminyt", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "ajv": { + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz", + "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==", + "requires": { + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + }, + "async-limiter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz", + "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" + }, + "aws4": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", + "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==" + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "requires": { + "tweetnacl": "^0.14.3" + }, + "dependencies": { + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" + } + } + }, + "bignumber.js": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-4.1.0.tgz", + "integrity": "sha512-eJzYkFYy9L4JzXsbymsFn3p54D+llV27oTQ+ziJG7WFRheJcNZilgVXMG0LoZtlQSKBsJdWtLFqOD0u+U0jZKA==" + }, + "bindings": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.2.1.tgz", + "integrity": "sha1-FK1hE4EtLTfXLme0ystLtyZQXxE=" + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" + }, + "colors": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.3.3.tgz", + "integrity": "sha512-mmGt/1pZqYRjMxB1axhTo16/snVZ5krrKkcmMeVKxzECMMXoCgnvTPp10QgHfcbQZw8Dq2jMNG6je4JlWU0gWg==" + }, + "combined-stream": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz", + "integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "commander": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", + "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==" + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "requires": { + "assert-plus": "^1.0.0" + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "optional": true, + "requires": { + "ms": "2.0.0" + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + }, + "discord.js": { + "version": "11.4.2", + "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-11.4.2.tgz", + "integrity": "sha512-MDwpu0lMFTjqomijDl1Ed9miMQe6kB4ifKdP28QZllmLv/HVOJXhatRgjS8urp/wBlOfx+qAYSXcdI5cKGYsfg==", + "requires": { + "long": "^4.0.0", + "prism-media": "^0.0.3", + "snekfetch": "^3.6.4", + "tweetnacl": "^1.0.0", + "ws": "^4.0.0" + } + }, + "discord.js-musicbot-addon": { + "version": "13.4.5", + "resolved": "https://registry.npmjs.org/discord.js-musicbot-addon/-/discord.js-musicbot-addon-13.4.5.tgz", + "integrity": "sha512-FEHvXPZxA+s+rMjm5DyiPO10JrKILmnyBFDitMHCiz65Bz5BdN1aKt4AaRc1dnma0BERAhC/vnqCYR3fTCcoRA==", + "requires": { + "ytdl-core": "^0.29.1", + "ytpl": "^0.1.14", + "ytsearcher": "^1.2.2" + } + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" + }, + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=" + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "get-urls": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/get-urls/-/get-urls-9.0.0.tgz", + "integrity": "sha512-5S10Ya9GeUuiiCZ7M47oqznuC00WJEYpO5m5VgjAi07LoIf6GEk4y1FYPBiG1CXMFdNXDa/awszuipUX5JVTFg==", + "requires": { + "normalize-url": "^4.1.0", + "url-regex": "^4.0.0" + } + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "requires": { + "assert-plus": "^1.0.0" + } + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" + }, + "har-validator": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", + "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", + "requires": { + "ajv": "^6.5.5", + "har-schema": "^2.0.0" + } + }, + "html-entities": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.2.1.tgz", + "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=" + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "ip-regex": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-1.0.3.tgz", + "integrity": "sha1-3FiQdvZZ9BnCIgOaMzFvHHOH7/0=" + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + }, + "jquery": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.3.1.tgz", + "integrity": "sha512-Ubldcmxp5np52/ENotGxlLe6aGMvmF4R8S6tZjsP6Knsaxd/xp3Zrh50cG93lR6nPXyUFwzN3ZSOQI0wRJNdGg==", + "optional": true + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "optional": true + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "linkifyjs": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/linkifyjs/-/linkifyjs-2.1.8.tgz", + "integrity": "sha512-j3QpiEr4UYzN5foKhrr9Sr06VI9vSlI4HisDWt+7Mq+TWDwpJ6H/LLpogYsXcyUIJLVhGblXXdUnblHsVNMPpg==", + "requires": { + "jquery": "^3.3.1", + "react": "^16.4.2", + "react-dom": "^16.4.2" + } + }, + "long": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" + }, + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "optional": true, + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, + "m3u8stream": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/m3u8stream/-/m3u8stream-0.6.2.tgz", + "integrity": "sha512-WsuM2bd5pPN80xvfrB+1DZqr4M7+kJl8byi6+ZCy6cmVjEiHhmr/desN53Ngsa6Hs13kYumeVgT4wL0oIJ+v6g==", + "requires": { + "miniget": "^1.4.0", + "sax": "^1.2.4" + } + }, + "mime-db": { + "version": "1.38.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.38.0.tgz", + "integrity": "sha512-bqVioMFFzc2awcdJZIzR3HjZFX20QhilVS7hytkKrv7xFAn8bM1gzc/FOX2awLISvWe0PV8ptFKcon+wZ5qYkg==" + }, + "mime-types": { + "version": "2.1.22", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.22.tgz", + "integrity": "sha512-aGl6TZGnhm/li6F7yx82bJiBZwgiEa4Hf6CNr8YO+r5UHr53tSTYZb102zyU50DOWWKeOv0uQLRL0/9EiKWCog==", + "requires": { + "mime-db": "~1.38.0" + } + }, + "miniget": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/miniget/-/miniget-1.5.1.tgz", + "integrity": "sha512-KJ3AyIVZ76QuWAq43BWjkK+jLdhxhy3s4tsdg9Je91+cIFkeOSW2VEj2lSeKw50CPu1eCCkSbiQEBKL36mpA5w==" + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "optional": true + }, + "mysql": { + "version": "2.16.0", + "resolved": "https://registry.npmjs.org/mysql/-/mysql-2.16.0.tgz", + "integrity": "sha512-dPbN2LHonQp7D5ja5DJXNbCLe/HRdu+f3v61aguzNRQIrmZLOeRoymBYyeThrR6ug+FqzDL95Gc9maqZUJS+Gw==", + "requires": { + "bignumber.js": "4.1.0", + "readable-stream": "2.3.6", + "safe-buffer": "5.1.2", + "sqlstring": "2.3.1" + } + }, + "nan": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.12.1.tgz", + "integrity": "sha512-JY7V6lRkStKcKTvHO5NVSQRv+RV+FIL5pvDoLiAtSL9pKlC5x9PKQcZDsq7m4FO4d57mkhC6Z+QhAh3Jdk5JFw==" + }, + "node-opus": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/node-opus/-/node-opus-0.3.1.tgz", + "integrity": "sha512-1Cb8OvHhdDspVfeKMjEgbedJabyE1Ib6OcN2BMEsRCU7FIsciuBpOErcie3y0qTf83nclPAY+kBU3Oj+U+oRlQ==", + "requires": { + "bindings": "~1.2.1", + "commander": "^2.9.0", + "nan": "^2.10.0", + "ogg-packet": "^1.0.0" + } + }, + "normalize-url": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.2.0.tgz", + "integrity": "sha512-n69+KXI+kZApR+sPwSkoAXpGlNkaiYyoHHqKOFPjJWvwZpew/EjKvuPE4+tStNgb42z5yLtdakgZCQI+LalSPg==" + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "optional": true + }, + "ogg-packet": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ogg-packet/-/ogg-packet-1.0.0.tgz", + "integrity": "sha1-RbiFchrI991c8iOR1CEGrlM6xng=", + "optional": true, + "requires": { + "ref-struct": "*" + } + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + }, + "prism-media": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/prism-media/-/prism-media-0.0.3.tgz", + "integrity": "sha512-c9KkNifSMU/iXT8FFTaBwBMr+rdVcN+H/uNv1o+CuFeTThNZNTOrQ+RgXA1yL/DeLk098duAeRPP3QNPNbhxYQ==" + }, + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" + }, + "prop-types": { + "version": "15.7.2", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", + "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", + "optional": true, + "requires": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.8.1" + } + }, + "psl": { + "version": "1.1.31", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.31.tgz", + "integrity": "sha512-/6pt4+C+T+wZUieKR620OpzN/LlnNKuWjy1iFLQ/UG35JqHlR/89MP1d96dUfkf6Dne3TuLQzOYEYshJ+Hx8mw==" + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" + }, + "react": { + "version": "16.8.4", + "resolved": "https://registry.npmjs.org/react/-/react-16.8.4.tgz", + "integrity": "sha512-0GQ6gFXfUH7aZcjGVymlPOASTuSjlQL4ZtVC5YKH+3JL6bBLCVO21DknzmaPlI90LN253ojj02nsapy+j7wIjg==", + "optional": true, + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.2", + "scheduler": "^0.13.4" + } + }, + "react-dom": { + "version": "16.8.4", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.8.4.tgz", + "integrity": "sha512-Ob2wK7XG2tUDt7ps7LtLzGYYB6DXMCLj0G5fO6WeEICtT4/HdpOi7W/xLzZnR6RCG1tYza60nMdqtxzA8FaPJQ==", + "optional": true, + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.2", + "scheduler": "^0.13.4" + } + }, + "react-is": { + "version": "16.8.4", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.8.4.tgz", + "integrity": "sha512-PVadd+WaUDOAciICm/J1waJaSvgq+4rHE/K70j0PFqKhkTBsPv/82UGQJNXAngz1fOQLLxI6z1sEDmJDQhCTAA==", + "optional": true + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "ref": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ref/-/ref-1.3.5.tgz", + "integrity": "sha512-2cBCniTtxcGUjDpvFfVpw323a83/0RLSGJJY5l5lcomZWhYpU2cuLdsvYqMixvsdLJ9+sTdzEkju8J8ZHDM2nA==", + "optional": true, + "requires": { + "bindings": "1", + "debug": "2", + "nan": "2" + } + }, + "ref-struct": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ref-struct/-/ref-struct-1.1.0.tgz", + "integrity": "sha1-XV7mWtQc78Olxf60BYcmHkee3BM=", + "optional": true, + "requires": { + "debug": "2", + "ref": "1" + } + }, + "request": { + "version": "2.88.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", + "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.0", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.4.3", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + }, + "scheduler": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.13.4.tgz", + "integrity": "sha512-cvSOlRPxOHs5dAhP9yiS/6IDmVAVxmk33f0CtTJRkmUWcb1Us+t7b1wqdzoC0REw2muC9V5f1L/w5R5uKGaepA==", + "optional": true, + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } + }, + "snekfetch": { + "version": "3.6.4", + "resolved": "https://registry.npmjs.org/snekfetch/-/snekfetch-3.6.4.tgz", + "integrity": "sha512-NjxjITIj04Ffqid5lqr7XdgwM7X61c/Dns073Ly170bPQHLm6jkmelye/eglS++1nfTWktpP6Y2bFXjdPlQqdw==" + }, + "sqlstring": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.1.tgz", + "integrity": "sha1-R1OT/56RR5rqYtyvDKPRSYOn+0A=" + }, + "sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + }, + "dependencies": { + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" + } + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "tlds": { + "version": "1.203.1", + "resolved": "https://registry.npmjs.org/tlds/-/tlds-1.203.1.tgz", + "integrity": "sha512-7MUlYyGJ6rSitEZ3r1Q1QNV8uSIzapS8SmmhSusBuIc7uIxPPwsKllEP0GRp1NS6Ik6F+fRZvnjDWm3ecv2hDw==" + }, + "tough-cookie": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", + "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", + "requires": { + "psl": "^1.1.24", + "punycode": "^1.4.1" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + } + } + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.1.tgz", + "integrity": "sha512-kcoMoKTPYnoeS50tzoqjPY3Uv9axeuuFAZY9M/9zFnhoVvRfxz9K29IMPD7jGmt2c8SW7i3gT9WqDl2+nV7p4A==" + }, + "twitch-m3u8": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/twitch-m3u8/-/twitch-m3u8-1.0.5.tgz", + "integrity": "sha512-2m9Ukv0PoAwrt5mCucffVNCfWKbaYknVWLVte+EPsBFiOtq+JqY68iWCRwvgF8cIQuPa7zaFBnLhDk41xIS4RA==" + }, + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "requires": { + "punycode": "^2.1.0" + } + }, + "url-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/url-regex/-/url-regex-4.1.1.tgz", + "integrity": "sha512-ViSDgDPNKkrQHI81GLCjdDN+Rsk3tAW/uLXlBOJxtcHzWZjta58Z0APXhfXzS89YszsheMnEvXeDXsWUB53wwA==", + "requires": { + "ip-regex": "^1.0.1", + "tlds": "^1.187.0" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "uuid": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "ws": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-4.1.0.tgz", + "integrity": "sha512-ZGh/8kF9rrRNffkLFV4AzhvooEclrOH0xaugmqGsIfFgOE/pIz4fMc4Ef+5HSQqTEug2S9JZIWDR47duDSLfaA==", + "requires": { + "async-limiter": "~1.0.0", + "safe-buffer": "~5.1.0" + } + }, + "ytdl-core": { + "version": "0.29.1", + "resolved": "https://registry.npmjs.org/ytdl-core/-/ytdl-core-0.29.1.tgz", + "integrity": "sha512-J/TW3rupqE6y+TczHTTFjuwf23tweA9fasmnbU/5yYH0O2IRFLcwgHbbvEPt3t8mtXWGX207+TWH7uuJpB1FKQ==", + "requires": { + "html-entities": "^1.1.3", + "m3u8stream": "^0.6.2", + "miniget": "^1.4.0", + "sax": "^1.1.3" + } + }, + "ytpl": { + "version": "0.1.14", + "resolved": "https://registry.npmjs.org/ytpl/-/ytpl-0.1.14.tgz", + "integrity": "sha512-e5GZDAakgu7EC0ooPAtvuiUz0gugivU8ZkyNen5hwfnl4NAo4HuoDeYODGYso9T8/M7thEW9VZTlCedjXmL/mQ==", + "requires": { + "html-entities": "^1.1.3" + } + }, + "ytsearcher": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/ytsearcher/-/ytsearcher-1.2.2.tgz", + "integrity": "sha512-nQ38akKe3O2OGfQba0aTetMx25U/V+jD+MN1v26/lR497KyzpPIolQuNEf5x4O0ANvLLIS9iPSc91Zle1OP+ww==" + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..c47f17b --- /dev/null +++ b/package.json @@ -0,0 +1,23 @@ +{ + "name": "dadminyt", + "version": "1.0.0", + "description": "", + "main": "index.js", + "dependencies": { + "colors": "^1.3.3", + "discord.js": "^11.4.2", + "discord.js-musicbot-addon": "^13.4.5", + "get-urls": "^9.0.0", + "linkifyjs": "^2.1.8", + "mysql": "^2.16.0", + "node-opus": "^0.3.1", + "request": "^2.88.0", + "twitch-m3u8": "^1.0.5" + }, + "devDependencies": {}, + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "author": "", + "license": "ISC" +} diff --git a/permissions.txt b/permissions.txt new file mode 100644 index 0000000..9701a1e --- /dev/null +++ b/permissions.txt @@ -0,0 +1,32 @@ +ADMINISTRATOR +CREATE_INSTANT_INVITE +KICK_MEMBERS +BAN_MEMBERS +MANAGE_CHANNELS +MANAGE_GUILD +ADD_REACTIONS +VIEW_AUDIT_LOG +PRIORITY_SPEAKER +VIEW_CHANNEL +READ_MESSAGES +SEND_MESSAGES +SEND_TTS_MESSAGES +MANAGE_MESSAGES +EMBED_LINKS +ATTACH_FILES +READ_MESSAGE_HISTORY +MENTION_EVERYONE +USE_EXTERNAL_EMOJIS +EXTERNAL_EMOJIS +CONNECT +SPEAK +MUTE_MEMBERS +DEAFEN_MEMBERS +MOVE_MEMBERS +USE_VAD +CHANGE_NICKNAME +MANAGE_NICKNAMES +MANAGE_ROLES +MANAGE_ROLES_OR_PERMISSIONS +MANAGE_WEBHOOKS +MANAGE_EMOJIS \ No newline at end of file