From bc6944c91e95b3ed807017dfaf3498383cdbb234 Mon Sep 17 00:00:00 2001 From: TheSomeoneXD <31833556+TheSomeoneXD@users.noreply.github.com> Date: Tue, 16 Oct 2018 00:29:22 -0500 Subject: [PATCH] Added SANCTUM Developer Discord Bot --- .envdev | 1 + DeveloperDiscord/developerdiscord.js | 248 +++++++++++++++++++++++++++ DeveloperDiscord/package-lock.json | 59 +++++++ DeveloperDiscord/package.json | 22 +++ 4 files changed, 330 insertions(+) create mode 100644 DeveloperDiscord/developerdiscord.js create mode 100644 DeveloperDiscord/package-lock.json create mode 100644 DeveloperDiscord/package.json diff --git a/.envdev b/.envdev index 58e02ab..ca72adb 100644 --- a/.envdev +++ b/.envdev @@ -86,6 +86,7 @@ MONTGOMERY_GENESIS_TOKEN="" KAMALA_OBSIDIAN_TOKEN="" DAIRO_HAND_TOKEN="" GHOST_TOKEN="" +DEVELOPER_TOKEN="" # Server Pass Key SERVER_PASS_KEY="" \ No newline at end of file diff --git a/DeveloperDiscord/developerdiscord.js b/DeveloperDiscord/developerdiscord.js new file mode 100644 index 0000000..73baddd --- /dev/null +++ b/DeveloperDiscord/developerdiscord.js @@ -0,0 +1,248 @@ +// .env Variables +require('dotenv').config({path: '../.env'}); + +// Node Modules +const Discord = require('discord.js'); +const client = new Discord.Client(); +//const cron = require('node-cron'); + +// Bot Modules +//const dataRequest = require('../modules/dataRequest'); +//const calcRandom = require('../modules/calcRandom'); + +const playingMessage = '!join | Bot Things.'; + +const roles = { + "roles": [ + "artists", + "developers", + "designers", + "writers" + ], + + "artists": { + "name": "Artists" + }, + "developers": { + "name": "Developers" + }, + "designers": { + "name": "Designers" + }, + "writers": { + "name": "Writers" + } +} + +// The ready event is vital, it means that your bot will only start reacting to information +// from Discord _after_ ready is emitted +client.on('ready', async () => { + // Generates invite link + try { + let link = await client.generateInvite(["ADMINISTRATOR"]); + console.log("Invite Link: " + link); + } catch(e) { + console.log(e.stack); + } + + // You can set status to 'online', 'invisible', 'away', or 'dnd' (do not disturb) + client.user.setStatus('online'); + // Sets your "Playing" + client.user.setActivity(playingMessage); + console.log(`Connected! \ + \nLogged in as: ${client.user.username} - (${client.user.id})`); +}); + +// Create an event listener for messages +client.on('message', async message => { + // Ignores ALL bot messages + if (message.author.bot) return; + /* + // Message has to be in Outskirts (should be edited later) + if (!(message.channel.id === process.env.TAVERN_CHANNEL_ID + || message.channel.id === process.env.TEST_CHANNEL_ID)) return; + // Has to be (prefix)command + if (message.content.indexOf(process.env.PREFIX) !== 0) return; + */ + // "This is the best way to define args. Trust me." + // - Some tutorial dude on the internet + const args = message.content.slice(process.env.PREFIX.length).trim().split(/ +/g); + const command = args.shift().toLowerCase(); + + switch (command) { + case "ping": + if (isAdmin(message.author.id)) + message.reply("What is your command, glorious master!"); + break; + case "test": + // For testing embeds + + break; + case "join": + // If chose a parameter + if (args[0]) { + var moddedArgs = args[0].toLowerCase(); + if (roles.roles.includes(moddedArgs)) { + console.log("[JOIN] Found it! " + moddedArgs + "\nAdding role to " + message.author.username); + + // Gets specified role + var roleName = roles[moddedArgs].name; + var newRole = message.guild.roles.find(role => role.name === roleName); + + // Checks if user already has roles + if (!message.member.roles.has(newRole.id)) { + // Adds Team Role + var addTeam = false; + var teamRole = message.guild.roles.find(role => role.name === "Team"); + if (!message.member.roles.has(teamRole.id)) addTeam = true; + + if (!addTeam) await message.member.addRole(newRole).catch(console.error); + else await message.member.addRoles([newRole, teamRole]).catch(console.error); + + const embed = new Discord.RichEmbed() + .setAuthor(client.user.username, client.user.avatarURL) + .setTitle("Successful") + .setDescription(`${message.author}, you have been given the ${newRole} role!`) + .setColor(message.guild.members.get(client.user.id).displayColor) + .setFooter("Check out the general category and your role specific channel!", message.author.avatarURL) + await message.channel.send(embed); + } else { + const embed = new Discord.RichEmbed() + .setAuthor(client.user.username, client.user.avatarURL) + .setTitle("Failed") + .setDescription(`${message.author}, you already have the ${newRole} role!`) + .setColor(message.guild.members.get(client.user.id).displayColor) + .setFooter("To leave a role, use !leave [ROLE NAME].", message.author.avatarURL) + await message.channel.send(embed); + } + } else { + showErrorMessage(args, command, message); + } + } else { + displayJoinMessage(message); + } + break; + case "leave": + // If chose a parameter + if (args[0]) { + var moddedArgs = args[0].toLowerCase(); + if (roles.roles.includes(moddedArgs)) { + console.log("[LEAVE] Found it! " + moddedArgs + "\nRemoving role to " + message.author.username); + const joinRoleMessage = "To join a role, use !join [ROLE NAME]."; + var playerRoles = message.member.roles.filter(role => role.name === roles[moddedArgs].name); + + // Gets specified role + var roleName = roles[moddedArgs].name; + var newRole = message.guild.roles.find(role => role.name === roleName); + + // Checks if user already has roles + if (message.member.roles.has(newRole.id)) { + // Removes Team Role (if it's the last "team" type role) + var removeTeam = false; + var teamRole = message.guild.roles.find(role => role.name === "Team"); + var playerRoles = message.member.roles.filter(role => roles.roles.includes(role.name.toLowerCase())); + var debugString = "All the roles a user has:\n"; + + // Grabs + message.member.roles.forEach(element => { + debugString += `> ${element.name}\n` + }); + console.log(debugString + "removeTeam = " + removeTeam); + debugString = "All the team-defined roles a user has:\n"; + playerRoles.forEach(element => { + debugString += `> ${element.name}\n` + }); + console.log(debugString); + + if (playerRoles.size <= 1) { + if (message.member.roles.has(teamRole.id)) removeTeam = true; + } + + // Removes specified role + var roleName = roles[moddedArgs].name; + var newRole = message.guild.roles.find(role => role.name === roleName); + + if (!removeTeam) { + console.log("Removed only one role: removeTeam = " + removeTeam) + await message.member.removeRole(newRole).catch(console.error); + } else { + console.log("Removing team role: removeTeam = " + removeTeam) + await message.member.removeRoles([newRole, teamRole]).catch(console.error) + } + + const embed = new Discord.RichEmbed() + .setAuthor(client.user.username, client.user.avatarURL) + .setTitle("Successful") + .setDescription(`${message.author}, you have removed the ${newRole} role!`) + .setColor(message.guild.members.get(client.user.id).displayColor) + .setFooter(joinRoleMessage, message.author.avatarURL) + await message.channel.send(embed); + } else { + const embed = new Discord.RichEmbed() + .setAuthor(client.user.username, client.user.avatarURL) + .setTitle("Failed") + .setDescription(`${message.author}, you already don't have the ${newRole} role!`) + .setColor(message.guild.members.get(client.user.id).displayColor) + .setFooter(joinRoleMessage, message.author.avatarURL) + await message.channel.send(embed); + } + } else { + showErrorMessage(args, command, message); + } + } else { + displayJoinMessage(message); + } + break; + } +}); + +client.on('error', console.error); + +// Async Waiting +function sleep(time) { + return new Promise((resolve, reject) => { + setTimeout(resolve, time); + }); +} + +// Gets if user has an Overseers rank +function isAdmin(userID) { + // Developer's Discord + var guild = client.guilds.get("500140223871582228"); + return guild.members.get(userID).roles.find(role => role.name === "Team Leads"); +} + +// Show !join message listing commands +function displayJoinMessage(message) { + var newDialog = ""; + roles.roles.forEach(element => { + var roleName = roles[element].name; + var newRole = message.guild.roles.find(role => role.name === roleName); + var memberLength = newRole.members.size; + newDialog += `${newRole} __${element}__ \`${memberLength} Members\`\n`; + }); + + const embed = new Discord.RichEmbed() + .setAuthor(client.user.username, client.user.avatarURL) + .setTitle("Roles") + .setDescription(newDialog) + .setColor(message.guild.members.get(client.user.id).displayColor) + .setFooter("To join or leave a role, use !join [ROLE NAME] or !leave [ROLE NAME].") + + message.channel.send(embed); +} + +// Shows error messages for !join and !leave for unknown roles +function showErrorMessage(args, command, message) { + const embed = new Discord.RichEmbed() + .setAuthor(client.user.username, client.user.avatarURL) + .setTitle("Failed") + .setDescription(`Sorry, I couldn't find the "${args[0]}" role.`) + .setFooter(`Use !${command} to get a list of roles to ${command}.`) + .setColor(message.guild.members.get(client.user.id).displayColor) + + message.channel.send(embed); +} + +// Log our bot in (change the token by looking into the .env file) +client.login(process.env.DEVELOPER_TOKEN); \ No newline at end of file diff --git a/DeveloperDiscord/package-lock.json b/DeveloperDiscord/package-lock.json new file mode 100644 index 0000000..3090471 --- /dev/null +++ b/DeveloperDiscord/package-lock.json @@ -0,0 +1,59 @@ +{ + "name": "developerdiscord", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "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==" + }, + "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" + } + }, + "long": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" + }, + "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==" + }, + "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==" + }, + "snekfetch": { + "version": "3.6.4", + "resolved": "https://registry.npmjs.org/snekfetch/-/snekfetch-3.6.4.tgz", + "integrity": "sha512-NjxjITIj04Ffqid5lqr7XdgwM7X61c/Dns073Ly170bPQHLm6jkmelye/eglS++1nfTWktpP6Y2bFXjdPlQqdw==" + }, + "tweetnacl": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.0.tgz", + "integrity": "sha1-cT2LgY2kIGh0C/aDhtBHnmb8ins=" + }, + "ws": { + "version": "4.1.0", + "resolved": "http://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" + } + } + } +} diff --git a/DeveloperDiscord/package.json b/DeveloperDiscord/package.json new file mode 100644 index 0000000..3d0c6de --- /dev/null +++ b/DeveloperDiscord/package.json @@ -0,0 +1,22 @@ +{ + "name": "developerdiscord", + "version": "1.0.0", + "description": "Developer Discord Bot", + "main": "developerdiscord.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/TimRuswick/SANCTUM.git" + }, + "author": "TheSomeoneXD", + "license": "MIT", + "bugs": { + "url": "https://github.com/TimRuswick/SANCTUM/issues" + }, + "homepage": "https://github.com/TimRuswick/SANCTUM#readme", + "dependencies": { + "discord.js": "^11.4.2" + } +}