├── .gitignore ├── README.md ├── package.json └── src ├── AlphaConsole.js ├── cmds ├── addcom.js ├── auto.js ├── ban.js ├── blacklist.js ├── case.js ├── check.js ├── checkTitles.js ├── checkdb.js ├── checksub.js ├── checkwhitelist.js ├── delcom.js ├── disable.js ├── disablebanner.js ├── editcom.js ├── forcelock.js ├── getinfo.js ├── gettitle.js ├── givebeta.js ├── help.js ├── kick.js ├── lastseen.js ├── listcom.js ├── listroles.js ├── lockdown.js ├── mute.js ├── nick.js ├── partner.js ├── permit.js ├── ping.js ├── purge.js ├── requestBanner.js ├── resetbeta.js ├── role.js ├── serverinfo.js ├── settitle.js ├── status.js ├── swearwords.js ├── titles.js ├── toggleLinks.js ├── unban.js ├── unlock.js ├── unmute.js ├── update.js └── warn.js ├── events ├── guildMemberAdd.js ├── guildMemberRemove.js ├── guildMemberUpdate.js ├── message.js ├── messageDelete.js ├── messageReactionAdd.js ├── messageReactionRemove.js ├── ready.js ├── spamProtection.js ├── userUpdate.js └── voiceChannelUpdate.js ├── helpers ├── api_calls.js ├── checkUser.js ├── scheduled.js └── sql.js ├── serverInfo-OfficialDiscord.js ├── serverInfo.js └── tokens.example.js /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | 8 | # Package locks 9 | yarn.lock 10 | package-lock.json 11 | 12 | # Runtime data 13 | pids 14 | *.pid 15 | *.seed 16 | *.pid.lock 17 | 18 | # Directory for instrumented libs generated by jscoverage/JSCover 19 | lib-cov 20 | 21 | # Coverage directory used by tools like istanbul 22 | coverage 23 | 24 | # nyc test coverage 25 | .nyc_output 26 | 27 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 28 | .grunt 29 | 30 | # Bower dependency directory (https://bower.io/) 31 | bower_components 32 | 33 | # node-waf configuration 34 | .lock-wscript 35 | 36 | # Compiled binary addons (http://nodejs.org/api/addons.html) 37 | build/Release 38 | 39 | # Dependency directories 40 | node_modules/ 41 | jspm_packages/ 42 | 43 | # Typescript v1 declaration files 44 | typings/ 45 | 46 | # Optional npm cache directory 47 | .npm 48 | 49 | # Optional eslint cache 50 | .eslintcache 51 | 52 | # Optional REPL history 53 | .node_repl_history 54 | 55 | # Output of 'npm pack' 56 | *.tgz 57 | 58 | # Yarn Integrity file 59 | .yarn-integrity 60 | 61 | # dotenv environment variables file 62 | .env 63 | 64 | #Ignore AC keys & passwords 65 | src/tokensOfficialServer.js 66 | src/tokens.js 67 | .vscode/launch.json 68 | src/sqlite/AlphaConsole.db 69 | src/sqlite/Bot.db 70 | .vs 71 | id.csv 72 | images/ -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | AlphaConsole Discord Bot 2 | =================== 3 | 4 | 5 | This was the official Discord bot for the [AlphaConsole Discord Server](https://discordapp.com/invite/alphaconsole). 6 | This bot served the over 200k members we had at our peak. 7 | 8 | ---------- 9 | 10 | 11 | What was AlphaConsole? 12 | ------------- 13 | AlphaConsole was the largest 3rd party mod for the popular PC game Rocket League with over 200k users. 14 | 15 | Unfortunately due to the nature of the program, most of AlphaConsole cannot be open source, excluding the Discord bot in this repo. 16 | 17 | 18 | ---------- 19 | ### So what is this bot? 20 | 21 | This bot is a re-write of our old C# Discord bot. It serves our server in many different ways. 22 | 23 | ##### For our users: 24 | 25 | - Allows them to set a custom title in game 26 | 27 | ![](https://cdn.discordapp.com/attachments/328236864534216704/381109222563250176/EveryTitleColor.gif) 28 | - Responds automatically to commonly asked questions 29 | 30 | ##### For the AlphaConsole Staff 31 | The bot helps the AlphaConsole staff with lots of different things. 32 | Some examples would be user database lookups, auto spam/swear word protection, custom commands, warning, timed mutes, bans, kicks & way more than I want to list. 33 | 34 | For a breakdown of all commands you can go to `src\cmds` 35 | For a breakdown of event calls you can go to `src\events` 36 | 37 | ### Contributing 38 | 39 | If you are interested in contributing to this project it will require some setup. 40 | 41 | #### Tokens 42 | You will need to create a `tokens.js` file in `src/`. Currently there is a template file called `tokens.example.js` if you prefer renaming that and using that. 43 | 44 | Due to security reasons the rest of `tokens.js` must be blank otherwise people could mess with our database (meaning you can't use some of the bots functionality like `!set title`). 45 | 46 | #### ServerInfo 47 | 48 | `serverInfo.js` contains all the channel ids. This may or may not need to be updated depending on what you are working on. 49 | 50 | #### Database 51 | 52 | We are using a MySQL database. You can link your details of your MySQL server in the `tokens.js` file. 53 | You can copy the create statements from `tokens.example.js` if you would like to copy over the tables. 54 | 55 | 56 | ##### Please create a pull request into the `dev` branch :) 57 | 58 | 59 | ### Questions? 60 | 61 | Feel free to message our ModMail on discord, our tag is: 62 | 63 | 64 | 65 | ---------- 66 | 67 | ![enter image description here](https://pbs.twimg.com/profile_banners/882574441494065152/1510692080/1500x500) 68 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "alphaconsolebot", 3 | "version": "1.0.0", 4 | "description": "Bot for AlphaConsole discord", 5 | "main": "alphaconsole.js", 6 | "scripts": { 7 | "test": "nodemon src/alphaconsole.js -serverfile=../src/serverInfo.js", 8 | "prod": "node src/AlphaConsole.js -serverfile=../src/serverInfo-OfficialDiscord.js" 9 | }, 10 | "author": "Hayden Meloche", 11 | "license": "ISC", 12 | "dependencies": { 13 | "body-parser": "^1.18.3", 14 | "discord.js": "github:discordjs/discord.js", 15 | "express": "^4.16.3", 16 | "jimp": "^0.5.6", 17 | "moment": "^2.24.0", 18 | "mysql": "^2.18.1", 19 | "node-schedule": "^1.3.0", 20 | "nodemon": "^1.19.4", 21 | "request": "^2.88.2", 22 | "sentiment": "^4.2.0", 23 | "shelljs": "^0.7.8" 24 | } 25 | } -------------------------------------------------------------------------------- /src/cmds/addcom.js: -------------------------------------------------------------------------------- 1 | /** 2 | * ! Add command command 3 | * 4 | * ? Simply adds a custom command. 5 | */ 6 | const Discord = require('discord.js'); 7 | 8 | module.exports = { 9 | title: "AddCommand", 10 | details: [ 11 | { 12 | perms : "Staff", 13 | command : "!addcom ", 14 | description: "Adds a custom command to the list." 15 | } 16 | ], 17 | 18 | run: ({ client, serverInfo, message, args, sql, config, sendEmbed }) => { 19 | if (!message.member.isStaff) return; 20 | if (args.length < 3) return sendEmbed(message.channel, "You did not include the command & the response.") 21 | 22 | let command = args[1].startsWith('!') ? args[1].substring(1,0) : args[1]; 23 | let response = ""; 24 | for (i = 2; i < args.length; i++) { 25 | if (args[i] == "@everyone") { 26 | response += "`@everyone` "; 27 | } else if (args[i] == "@here") { 28 | response += "`@here` "; 29 | } else if (message.mentions.roles.cache.has(args[i].replace(/[^0-9]/g, ""))) { 30 | response +="**" + message.mentions.roles.get(args[i].replace(/[^0-9]/g, "")).name + "** "; 31 | } else if (message.mentions.users.has(args[i].replace(/[^0-9]/g, ""))) { 32 | response += "**" + message.mentions.users.get(args[i].replace(/[^0-9]/g, "")).tag + "** "; 33 | } else { 34 | response += args[i] + " "; 35 | } 36 | } 37 | 38 | sql.query("Select * from Commands where Command = ?", [ command ], (err, res) => { 39 | if (err) { 40 | let errorCode = Math.floor(Math.random() * (9999 - 1000 + 1)) + 1000; 41 | console.error(`Error code ${errorCode} by ${message.author.tag}`, err); 42 | return sendEmbed(message.author, "🚫 An error occurred. Please contact Pollie#0001. Error code: `" + errorCode + "`"); 43 | } 44 | if (res.length !== 0) return sendEmbed(message.channel, `Command "${command}" already exist!`); 45 | 46 | sql.query("Insert into Commands(Command, Response) Values(?, ?)", [ command, response ]); 47 | sendEmbed(message.channel, "Custom command added!"); 48 | 49 | const embedlog = new Discord.MessageEmbed() 50 | .setColor([255, 255, 0]) 51 | .setAuthor("Custom Command Added", client.user.displayAvatarURL()) 52 | .addField("Command", command) 53 | .addField("Response", response) 54 | .addField("Added by", `**${message.author.tag}** (${message.member})`) 55 | .setThumbnail(message.author.displayAvatarURL()) 56 | .setTimestamp(); 57 | message.guild.channels.resolve(serverInfo.channels.aclog).send(embedlog); 58 | }) 59 | } 60 | } -------------------------------------------------------------------------------- /src/cmds/auto.js: -------------------------------------------------------------------------------- 1 | /** 2 | * ! Auto Response functionality 3 | * 4 | * ? For faster support we set up a couple of words that needs to be triggered for the bot to answer 5 | * ? This often includes FAQ questions and does help a lot of the time 6 | */ 7 | const Discord = require("discord.js"); 8 | 9 | module.exports = { 10 | title: "AutoResponse", 11 | details: [ 12 | { 13 | perms : "Moderator", 14 | command : "!auto", 15 | description: "Check all auto responses" 16 | }, 17 | { 18 | perms : "Moderator", 19 | command : "!auto Add :", 20 | description: "Adds an auto response to the bot" 21 | }, 22 | { 23 | perms : "Moderator", 24 | command : "!auto Remove ", 25 | description: "Remove an auto response. ID findable in `!Auto` command" 26 | } 27 | ], 28 | 29 | run: ({ client, serverInfo, message, args, sql, config, sendEmbed }) => { 30 | 31 | if (!message.member.isModerator || message.member.id === "345769053538746368") return; 32 | 33 | if (args.length === 1) { 34 | sql.query("Select * from Config where Config = 'autoResponds'", [], (err, res) => { 35 | if (err) { 36 | let errorCode = Math.floor(Math.random() * (9999 - 1000 + 1)) + 1000; 37 | console.error(`Error code ${errorCode} by ${message.author.tag}`, err); 38 | return sendEmbed(message.author, "🚫 An error occurred. Please contact Pollie#0001. Error code: `" + errorCode + "`"); 39 | } 40 | let output = ""; 41 | for (let i = 0; i < res.length; i++) output += `\`${res[i].ID}.\` ${res[i].Value1} -> ${res[i].Value2}\n`; 42 | 43 | const embed = new Discord.MessageEmbed() 44 | .setColor([255, 255, 0]) 45 | .setAuthor("All auto respond messages", client.user.displayAvatarURL()) 46 | .setDescription(output) 47 | 48 | message.channel.send(embed); 49 | }); 50 | } else if (args[1].toLowerCase() == "add") { 51 | if (args.length < 3 || !message.content.includes(":")) return sendEmbed(message.channel, "You did not include the word(s) or you did not include the seperator (:)") 52 | 53 | let word = ""; 54 | for (let i = 2; i < args.length; i++) word += args[i] + " "; 55 | let words = word.trim().split(':'); 56 | 57 | config.autoResponds[words[0]] = words[1]; 58 | sql.query("Insert into Config(Config, Value1, Value2) Values('autoResponds', ?, ?)", [ words[0], words[1] ]); 59 | 60 | sendEmbed(message.channel, "Auto response added to the list!"); 61 | 62 | } else if (args[1].toLowerCase() == "remove") { 63 | if (args.length < 3) return sendEmbed(message.channel, "You did not include the ID to remove."); 64 | 65 | sql.query("Select * from Config where Config = 'autoResponds' and ID = ?", [ args[2] ], (err, res) => { 66 | if (err) { 67 | let errorCode = Math.floor(Math.random() * (9999 - 1000 + 1)) + 1000; 68 | console.error(`Error code ${errorCode} by ${message.author.tag}`, err); 69 | return sendEmbed(message.author, "🚫 An error occurred. Please contact Pollie#0001. Error code: `" + errorCode + "`"); 70 | } 71 | 72 | if (res.length === 0) return sendEmbed(message.channel, "No swearword found with this ID."); 73 | 74 | delete config.autoResponds[res[0].Value1] 75 | sql.query("Delete from Config where Config = 'autoResponds' and ID = ?", [ args[2] ]); 76 | 77 | sendEmbed(message.channel, "Auto response deleted from the list!"); 78 | }) 79 | 80 | } 81 | 82 | } 83 | } 84 | -------------------------------------------------------------------------------- /src/cmds/ban.js: -------------------------------------------------------------------------------- 1 | /** 2 | * ! Ban command 3 | * 4 | * ? Kinda obvious, too lazy to write anything smart anyway 5 | * ? We also have command description for a reason. So I actually don't know why I added this here. Welp... 6 | */ 7 | const Discord = require('discord.js'); 8 | 9 | module.exports = { 10 | title: "Ban", 11 | details: [ 12 | { 13 | perms : "Moderator", 14 | command : "!ban <@tag> ", 15 | description: "Bans the person with the given reason" 16 | } 17 | ], 18 | 19 | run: ({ client, serverInfo, message, args, sql, config, sendEmbed }) => { 20 | 21 | if (!message.member.isModerator || message.member.id === "345769053538746368") return; 22 | if (args.length < 2) return sendEmbed(message.channel, "You must have forgotten the user", "`!Ban <@tag | user Id> `") 23 | 24 | let reason = ""; 25 | for (i = 2; i < args.length; i++) reason += args[i] + " "; 26 | if (reason === "") reason = "No reason provided"; 27 | 28 | let user = message.mentions.users.first() ? message.mentions.users.first().id : args[1]; 29 | client.guilds.resolve(serverInfo.guildId).members.fetch(user).then(m => { 30 | require('../helpers/checkUser').run(sql, m.user, (err, user) => { 31 | if (err) { 32 | let errorCode = Math.floor(Math.random() * (9999 - 1000 + 1)) + 1000; 33 | console.error(`Error code ${errorCode} by ${message.author.tag}`, err); 34 | return sendEmbed(message.author, "🚫 An error occurred. Please contact Pollie#0001. Error code: `" + errorCode + "`"); 35 | } 36 | 37 | if (isStaff(m, serverInfo)) 38 | return sendEmbed(message.channel, "You cannot ban a staff member."); 39 | 40 | m.ban({ reason: reason }); 41 | 42 | sql.query("Insert into `Logs`(Action, Member, Moderator, Reason, Time, ChannelID) values(?, ?, ?, ?, ?, ?)", 43 | [ 'ban', m.id, message.author.id, reason, new Date().getTime(), message.channel.id ], (err, res) => { 44 | if (err) { 45 | let errorCode = Math.floor(Math.random() * (9999 - 1000 + 1)) + 1000; 46 | console.error(`Error code ${errorCode} by ${message.author.tag}`, err); 47 | return sendEmbed(message.author, "🚫 An error occurred. Please contact Pollie#0001. Error code: `" + errorCode + "`"); 48 | } 49 | 50 | let caseId = res.insertId; 51 | sendEmbed(message.channel, `${m.user.tag} has been banned from the server. Case number: ${caseId}`); 52 | 53 | const embedlog = new Discord.MessageEmbed() 54 | .setColor([255, 255, 0]) 55 | .setAuthor(`Case ${caseId} | User ban`, client.user.displayAvatarURL({ format: "png" })) 56 | .setDescription(`**${m.user.tag}** (${ m.id }) has been banned by ${message.member}`) 57 | .setTimestamp() 58 | .addField("Reason", reason); 59 | client.guilds.resolve(serverInfo.guildId).channels.resolve(serverInfo.channels.modlog).send(embedlog).then(msg => { 60 | sql.query(`update Logs set MessageID = ? where ID = ?`, [ msg.id, caseId ]); 61 | }); 62 | 63 | }); 64 | 65 | }); 66 | }).catch(e => { 67 | if (e.message == "Unknown Member") { 68 | sql.query("Select * from Members where DiscordID = ?", [ user ], (err, res) => { 69 | let dbUser = res[0]; 70 | if (dbUser) { 71 | sql.query("Update Members set Banned = 1 where DiscordID = ?", [ user ]); 72 | 73 | sql.query("Insert into `Logs`(Action, Member, Moderator, Reason, Time, ChannelID) values(?, ?, ?, ?, ?, ?)", 74 | [ 'ban', user, message.author.id, reason, new Date().getTime(), message.channel.id ], (err, res) => { 75 | if (err) { 76 | let errorCode = Math.floor(Math.random() * (9999 - 1000 + 1)) + 1000; 77 | console.error(`Error code ${errorCode} by ${message.author.tag}`, err); 78 | return sendEmbed(message.author, "🚫 An error occurred. Please contact Pollie#0001. Error code: `" + errorCode + "`"); 79 | } 80 | 81 | let caseId = res.insertId; 82 | sendEmbed(message.channel, `Ban on rejoin. Case number: ${caseId}`, "I could not find the user in this server but I did find the user in the database.\nOn his next rejoin he'll automatically be banned."); 83 | 84 | const embedlog = new Discord.MessageEmbed() 85 | .setColor([255, 255, 0]) 86 | .setAuthor(`Case ${caseId} | User ban`, client.user.displayAvatarURL({ format: "png" })) 87 | .setDescription(`**${dbUser.Username}** (${ user }) has been banned by ${message.member}`) 88 | .setTimestamp() 89 | .addField("Reason", reason); 90 | client.guilds.resolve(serverInfo.guildId).channels.resolve(serverInfo.channels.modlog).send(embedlog).then(msg => { 91 | sql.query(`update Logs set MessageID = ? where ID = ?`, [ msg.id, caseId ]); 92 | }); 93 | 94 | }); 95 | } 96 | }) 97 | } 98 | else 99 | console.log(e); 100 | }) 101 | } 102 | }; 103 | 104 | function isStaff(m, serverInfo) { 105 | if (m.roles.cache.has(serverInfo.roles.staff)) return true; 106 | if (m.roles.cache.has(serverInfo.roles.support)) return true; 107 | if (m.roles.cache.has(serverInfo.roles.seniorS)) return true; 108 | if (m.roles.cache.has(serverInfo.roles.moderator)) return true; 109 | if (m.roles.cache.has(serverInfo.roles.admin)) return true; 110 | return false; 111 | } 112 | -------------------------------------------------------------------------------- /src/cmds/blacklist.js: -------------------------------------------------------------------------------- 1 | /** 2 | * ! Blacklist command 3 | * 4 | * ? Kinda obvious, too lazy to write anything smart anyway 5 | * ? We also have command description for a reason. So I actually don't know why I added this here. Welp... 6 | */ 7 | const Discord = require('discord.js'); 8 | 9 | module.exports = { 10 | title: "Blacklist", 11 | details: [ 12 | { 13 | perms : "Support", 14 | command : "!blacklist check ", 15 | description: "Checks if word provided is in blacklist" 16 | }, 17 | { 18 | perms : "Moderator", 19 | command : "!blacklist add ", 20 | description: "Adds a word to the blacklist" 21 | }, 22 | { 23 | perms : "Moderator", 24 | command : "!blacklist remove ", 25 | description: "Remove a word from the blacklist" 26 | } 27 | ], 28 | 29 | run: async ({ client, serverInfo, message, args, sql, config, sendEmbed, checkStatus }) => { 30 | 31 | if (!message.member.isSupport) return; 32 | if (args.length < 2) return sendEmbed(message.channel, "Incorrect Usage: !blacklist ") 33 | let blackListedWords = config.blacklistedWords; 34 | 35 | if (args[1].toLowerCase() == "check") { 36 | var badWord = makeWord(args); 37 | 38 | if (blackListedWords.indexOf(badWord) > -1) 39 | sendEmbed(message.channel, `${badWord} -> was found in the blacklist`) 40 | else 41 | sendEmbed(message.channel, `${badWord} -> was not found in the blacklist`) 42 | 43 | } else if (args[1].toLowerCase() == "add") { 44 | if (!message.member.isModerator) return; 45 | 46 | var badWord = makeWord(args); 47 | var index = blackListedWords.indexOf(badWord); 48 | 49 | if (index == -1) { 50 | blackListedWords.push(badWord); 51 | sql.query(`Insert into Config(Config, Value1) VALUES (?, ?)`, [ "blacklistedWords", badWord ]); 52 | sendEmbed(message.channel, `${badWord} -> was added to the blacklist`) 53 | } else 54 | sendEmbed(message.channel, `${badWord} -> is already in the blacklist`) 55 | 56 | } else if (args[1].toLowerCase() == "remove") { 57 | if (!message.member.isModerator) return; 58 | 59 | var badWord = makeWord(args); 60 | 61 | var index = blackListedWords.indexOf(badWord); 62 | if (index > -1) { 63 | blackListedWords.splice(index, 1); 64 | sql.query(`Delete from Config where Config = ? and Value1 = ?`, [ "blacklistedWords", badWord ]); 65 | sendEmbed(message.channel, `${badWord} -> was removed from the blacklist`) 66 | } else 67 | sendEmbed(message.channel, `Error. Word not found in cached list.`) 68 | 69 | } 70 | } 71 | }; 72 | 73 | 74 | 75 | function makeWord(args) { 76 | var badWord = ""; 77 | for (let index = 2; index < args.length; index++) { 78 | badWord += " " + args[index].toLowerCase(); 79 | } 80 | return badWord.trim(); 81 | } -------------------------------------------------------------------------------- /src/cmds/case.js: -------------------------------------------------------------------------------- 1 | /** 2 | * ! Case command 3 | * 4 | * ? Kinda obvious, too lazy to write anything smart anyway 5 | * ? We also have command description for a reason. So I actually don't know why I added this here. Welp... 6 | */ 7 | const Discord = require('discord.js'); 8 | 9 | module.exports = { 10 | title: "Case", 11 | details: [ 12 | { 13 | perms : "Support", 14 | command : "!Case ", 15 | description: "Shows all details of a case" 16 | }, 17 | { 18 | perms : "Support", 19 | command : "!Case edit ", 20 | description: "Changes the reason of a case" 21 | }, 22 | { 23 | perms : "Support", 24 | command : "!Case remove ", 25 | description: "Removes the case" 26 | } 27 | ], 28 | 29 | run: ({ client, serverInfo, message, args, sql, config, sendEmbed }) => { 30 | 31 | if (!message.member.isSupport) return; 32 | 33 | if (args.length === 2) { 34 | let caseId = args[1]; 35 | 36 | sql.query("Select * from Logs where ID = ?", [ caseId ], (err, res) => { 37 | if (err) { 38 | let errorCode = Math.floor(Math.random() * (9999 - 1000 + 1)) + 1000; 39 | console.error(`Error code ${errorCode} by ${message.author.tag}`, err); 40 | return sendEmbed(message.author, "🚫 An error occurred. Please contact Pollie#0001. Error code: `" + errorCode + "`"); 41 | } 42 | 43 | let row = res[0]; 44 | if (row) { 45 | const embed = new Discord.MessageEmbed() 46 | .setColor([255, 255, 0]) 47 | .setAuthor(`Case check`, serverInfo.logo) 48 | .addField(`Case ID`, row.ID, true) 49 | .addField(`Member`, `<@${row.Member}>`, true) 50 | .addField(`Action`, capitalizeFirstLetter(row.Action)) 51 | .addField(`Reason`, row.Reason, true); 52 | 53 | if (row.Value != null) { 54 | if (row.Value == 0) embed.addField(`Time`, "Permanent", true) 55 | else embed.addField(`Time`, dhm(row.Value), true); 56 | } 57 | 58 | embed.setThumbnail("https://upload.wikimedia.org/wikipedia/commons/c/c4/600_px_Transparent_flag.png"); 59 | embed.addField("Case by", `<@${row.Moderator}>`, true); 60 | embed.addField("At channel", `<#${row.ChannelID}>`, true); 61 | 62 | var date = new Date(parseInt(row.Time)); 63 | embed.setFooter(`Time of case`) 64 | embed.setTimestamp(date) 65 | message.channel.send(embed); 66 | } else { 67 | sendEmbed(message.channel, "Case not found.") 68 | } 69 | }) 70 | } else if (args.length > 2 && args[1].toLowerCase() === "edit") { 71 | 72 | let caseId = args[2]; 73 | let reason = ""; 74 | for (i = 3; i < args.length; i++) reason += args[i] + " "; 75 | if (reason === "") reason = "No reason provided"; 76 | 77 | sql.query("Update Logs set Reason = ? where ID = ?", [ reason, caseId ], (err, res) => { 78 | if (err) { 79 | let errorCode = Math.floor(Math.random() * (9999 - 1000 + 1)) + 1000; 80 | console.error(`Error code ${errorCode} by ${message.author.tag}`, err); 81 | return sendEmbed(message.author, "🚫 An error occurred. Please contact Pollie#0001. Error code: `" + errorCode + "`"); 82 | } 83 | 84 | if (res.affectedRows === 0) 85 | sendEmbed(message.channel, "No case found with this id.") 86 | else 87 | sendEmbed(message.channel, `Case ${caseId} updated!`) 88 | }) 89 | 90 | } else if (args.length > 2 && (args[1].toLowerCase() === "remove" || args[1].toLowerCase() === "delete")) { 91 | 92 | let caseId = args[2]; 93 | 94 | sql.query("delete from Logs where ID = ?", [ caseId ], (err, res) => { 95 | if (err) { 96 | let errorCode = Math.floor(Math.random() * (9999 - 1000 + 1)) + 1000; 97 | console.error(`Error code ${errorCode} by ${message.author.tag}`, err); 98 | return sendEmbed(message.author, "🚫 An error occurred. Please contact Pollie#0001. Error code: `" + errorCode + "`"); 99 | } 100 | 101 | if (res.affectedRows === 0) 102 | sendEmbed(message.channel, "No case found with this id.") 103 | else 104 | sendEmbed(message.channel, `Case ${caseId} deleted!`) 105 | }) 106 | 107 | } else { 108 | sendEmbed(message.channel, "You must have forgotten the case id.", "`!Case `") 109 | } 110 | 111 | } 112 | }; 113 | 114 | function dhm(t){ 115 | var cd = 24 * 60 * 60 * 1000, 116 | ch = 60 * 60 * 1000, 117 | d = Math.floor(t / cd), 118 | h = Math.floor( (t - d * cd) / ch), 119 | m = Math.round( (t - d * cd - h * ch) / 60000), 120 | pad = function(n){ return n < 10 ? '0' + n : n; }; 121 | if( m === 60 ){ 122 | h++; 123 | m = 0; 124 | } 125 | if( h === 24 ){ 126 | d++; 127 | h = 0; 128 | } 129 | return `${d}d ${pad(h)}h ${pad(m)}m` 130 | } 131 | 132 | function capitalizeFirstLetter(string) { 133 | return string.charAt(0).toUpperCase() + string.slice(1); 134 | } -------------------------------------------------------------------------------- /src/cmds/check.js: -------------------------------------------------------------------------------- 1 | /** 2 | * ! Check command 3 | * 4 | * ? Kinda obvious, too lazy to write anything smart anyway 5 | * ? We also have command description for a reason. So I actually don't know why I added this here. Welp... 6 | */ 7 | const Discord = require('discord.js'); 8 | 9 | module.exports = { 10 | title: "Check", 11 | details: [ 12 | { 13 | perms : "Support", 14 | command : "!Check <@tag | user Id>", 15 | description: "Checks all warns, mutes etc... from the user." 16 | } 17 | ], 18 | 19 | run: ({ client, serverInfo, message, args, sql, config, sendEmbed }) => { 20 | 21 | if (!message.member.isSupport) return; 22 | if (args.length < 2) return sendEmbed(message.channel, "You must have forgotten the user", "`!Check <@tag | user Id>`") 23 | 24 | let user = message.mentions.users.first() ? message.mentions.users.first().id : args[1]; 25 | sql.query("Select * from Logs where Member = ? order by Time desc", [ user ], (err, res) => { 26 | if (err) { 27 | let errorCode = Math.floor(Math.random() * (9999 - 1000 + 1)) + 1000; 28 | console.error(`Error code ${errorCode} by ${message.author.tag}`, err); 29 | return sendEmbed(message.author, "🚫 An error occurred. Please contact Pollie#0001. Error code: `" + errorCode + "`"); 30 | } 31 | 32 | let mutes = res.filter(c => c.Action === "mute"); 33 | let warns = res.filter(c => c.Action === "warn"); 34 | let kicks = res.filter(c => c.Action === "kick"); 35 | let bans = res.filter(c => c.Action === "ban"); 36 | 37 | const embed = new Discord.MessageEmbed() 38 | .setAuthor("Cases check", client.user.displayAvatarURL({ format: "png" })) 39 | .setColor([255, 255, 0]) 40 | .setThumbnail("http://www.pngmart.com/files/5/Snow-PNG-Transparent-Image.png") 41 | .addField(`Mutes (${mutes.length})`, mutes.map(c => `\`${c.ID}.\` ${c.Reason}`).join("\n") === "" ? "Nothing found" : mutes.map(c => `\`${c.ID}.\` ${c.Reason}`).join("\n").substring(0, 245), true) 42 | .addField(`Warnings (${warns.length})`, warns.map(c => `\`${c.ID}.\` ${c.Reason}`).join("\n") === "" ? "Nothing found" : warns.map(c => `\`${c.ID}.\` ${c.Reason}`).join("\n").substring(0, 245), true) 43 | .addField(`Kicks (${kicks.length})`, kicks.map(c => `\`${c.ID}.\` ${c.Reason}`).join("\n") === "" ? "Nothing found" : kicks.map(c => `\`${c.ID}.\` ${c.Reason}`).join("\n").substring(0, 245), true) 44 | .addField(`Bans (${bans.length})`, bans.map(c => `\`${c.ID}.\` ${c.Reason}`).join("\n") === "" ? "Nothing found" : bans.map(c => `\`${c.ID}.\` ${c.Reason}`).join("\n").substring(0, 245), true) 45 | message.channel.send(embed); 46 | }) 47 | 48 | } 49 | }; 50 | -------------------------------------------------------------------------------- /src/cmds/checkTitles.js: -------------------------------------------------------------------------------- 1 | const request = require('request'); 2 | const Discord = require('discord.js'); 3 | 4 | module.exports = { 5 | title: "checktitles", 6 | details: [ 7 | { 8 | perms : "Support", 9 | command : "!checktitle >", 10 | description: "Checks the official Rocket League titles of this steam account" 11 | } 12 | ], 13 | 14 | run: ({ client, serverInfo, message, args, sql, config, sendEmbed, member }) => { 15 | 16 | if (!message.member.isSupport) return; 17 | const { keys } = config; 18 | const apiToken = keys.RL_API_Token; 19 | 20 | function sendTitles(steamid) { 21 | request(`https://api.rocketleague.com/api/v1/steam/playertitles/${steamid}?format=json`, 22 | { headers: { 23 | Authorization: `Token ${apiToken}` 24 | }}, (req, res, body) => { 25 | let data = JSON.parse(body); 26 | 27 | if (data) { 28 | if (data.detail) message.channel.send(data.detail) 29 | else if (data.titles.length === 0) message.channel.send("No titles found.") 30 | else message.channel.send(data.titles.map(t => `- ${t}`).join("\n")); 31 | } else 32 | message.channel.send("No data returned from API call.") 33 | }) 34 | } 35 | 36 | args.shift(); 37 | 38 | try { 39 | 40 | if (args.length != 1) { 41 | sendEmbed(message.author, "Your input is incorrect. Valid inputs are: Steam link, SteamID64 or Steam Custom URL."); 42 | return; 43 | } else { 44 | let id = message.mentions.users.first() ? message.mentions.users.first().id : args[0]; 45 | 46 | if (id.length === 18) { 47 | var url = config.keys.CheckdbURL + "?DiscordID=" + id; 48 | request({ method: "GET", url: url }, function (err, response, body) { 49 | if (err) { 50 | let errorCode = Math.floor(Math.random() * (9999 - 1000 + 1)) + 1000; 51 | console.error(`Error code ${errorCode} by ${message.author.tag}`, err); 52 | return sendEmbed(message.author, "🚫 An error occurred. Please contact Pollie#0001. Error code: `" + errorCode + "`"); 53 | } 54 | 55 | let result = ""; 56 | 57 | if (body) { 58 | if (body.toLowerCase().includes("not signed up for db")) { 59 | sendEmbed(message.channel, "An error occured", `It appears you have not signed up for our title service. Please click this link and makes sure you are logging in with the correct account.\n\nhttp://www.alphaconsole.net/auth/index.php`) 60 | 61 | } else if (body.toLowerCase().includes("no title set")) { 62 | sendEmbed(message.channel, "An error occured", `No title set. Go to #set-title and set a title!`); 63 | 64 | } else { 65 | var info = body.split(" "); 66 | var steamID = info[info.length - 2]; 67 | sendTitles(steamID); 68 | } 69 | } else { 70 | sendEmbed(message.channel, "An error occured", "There was an error. Please try again. If this problem continues please contact an admin.") 71 | } 72 | }); 73 | } else { 74 | //Steam ID 75 | var steamID = id; 76 | var shouldQuerySteamAPI = false; 77 | if (steamID.includes("steamcommunity.com")) { 78 | var splited = steamID.split("/").filter(v => v != ''); 79 | var commIndex = splited.indexOf("steamcommunity.com"); 80 | if (splited.length > commIndex + 2) { 81 | var field = splited[commIndex + 1]; 82 | if (!(field == "id" || field == "profiles")) { 83 | sendEmbed(message.author, "Your input is incorrect. Valid inputs are: Steam link, SteamID64 or Steam Custom URL."); 84 | return; 85 | return; 86 | } else { 87 | steamID = splited[commIndex + 2]; 88 | } 89 | } else { 90 | sendEmbed(message.author, "Your input is incorrect. Valid inputs are: Steam link, SteamID64 or Steam Custom URL."); 91 | return; 92 | } 93 | } 94 | if (!steamID.match(/^7\d{16}$/)) shouldQuerySteamAPI = true; 95 | if (shouldQuerySteamAPI) { 96 | var url = keys.SteamAPIURL; 97 | url += '?key=' + keys.SteamAPIKey + '&vanityurl=' + steamID; 98 | request({ 99 | method: "GET", 100 | url: url 101 | }, 102 | function (err, response, body) { 103 | if (err) { 104 | let errorCode = Math.floor(Math.random() * (9999 - 1000 + 1)) + 1000; 105 | console.error(`Error code ${errorCode} by ${message.author.tag}`, err); 106 | return sendEmbed(message.author, "🚫 An error occurred. Please contact Pollie#0001. Error code: `" + errorCode + "`"); 107 | } else { 108 | if (body) { 109 | var jsonObject = JSON.parse(body); 110 | if (jsonObject != null && jsonObject.response && jsonObject.response.success) { 111 | if (jsonObject.response.success == 1) { 112 | steamID = jsonObject.response.steamid; 113 | sendTitles(steamID); 114 | } else { 115 | sendEmbed(message.author, "Your input is incorrect. Valid inputs are: Steam link, SteamID64 or Steam Custom URL."); 116 | return; 117 | } 118 | } else { 119 | sendEmbed(message.author, "An error occured. Please try again later."); 120 | return; 121 | } 122 | 123 | } else { 124 | sendEmbed(message.author, "An error occured. Please try again later."); 125 | return; 126 | } 127 | } 128 | } 129 | ); 130 | } else { 131 | sendTitles(steamID); 132 | } 133 | } 134 | } 135 | } catch (error) { 136 | console.log(error) 137 | } 138 | } 139 | }; -------------------------------------------------------------------------------- /src/cmds/checkdb.js: -------------------------------------------------------------------------------- 1 | /** 2 | * ! Checkdb command 3 | * 4 | * ? Kinda obvious, too lazy to write anything smart anyway 5 | * ? We also have command description for a reason. So I actually don't know why I added this here. Welp... 6 | */ 7 | const Discord = require("discord.js"); 8 | const request = require("request"); 9 | 10 | module.exports = { 11 | title: "Checkdb", 12 | details: [ 13 | { 14 | perms: "Support", 15 | command: "!Checkdb <@tag | user Id>", 16 | description: "Check the users his title & colour" 17 | } 18 | ], 19 | 20 | run: ({ client, serverInfo, message, args, sql, config, sendEmbed }) => { 21 | if (!message.member.isCH) return; 22 | if (args.length < 2) 23 | return sendEmbed( 24 | message.channel, 25 | "You must have forgotten the user", 26 | "`!Checkdb <@tag | user Id>`" 27 | ); 28 | 29 | try { 30 | var id = message.mentions.users.first() 31 | ? message.mentions.users.first().id 32 | : args[1]; 33 | sql.query( 34 | "Select * from Titles where DiscordID = ?", 35 | [id], 36 | (err, rows) => { 37 | if (err) return console.error(err); 38 | sql.query( 39 | "Select * from Players where DiscordID = ?", 40 | [id], 41 | (err, steams) => { 42 | if (err) return console.error(err); 43 | const user = rows[0]; 44 | 45 | if (!user) 46 | return sendEmbed( 47 | message.channel, 48 | "An error occured", 49 | "This user was not found in the database. Here is the info for him to know:\n\n```It appears you have not signed up for our title service. Please click this link and makes sure you are logging in with the correct account.\n\nhttp://www.alphaconsole.net/auth/index.php```" 50 | ); 51 | 52 | let betaUntil = user.BetaUntil 53 | ? new Date(user.BetaUntil * 1000).toUTCString() 54 | : undefined; 55 | sendEmbed( 56 | message.channel, 57 | "Database Check", 58 | `Discord: <@${user.DiscordID}>\n\nSteam accounts:\n${ 59 | steams.length > 0 60 | ? steams 61 | .map( 62 | s => 63 | `[${ 64 | s.SteamID 65 | }](https://steamcommunity.com/profiles/${ 66 | s.SteamID 67 | }) (${ 68 | s.LastSeen 69 | ? new Date(s.LastSeen * 1000).toUTCString() 70 | : "never" 71 | })` 72 | ) 73 | .join("\n") 74 | : "No steam accounts linked, click here to link your steam accounts:\nhttp://www.alphaconsole.net/auth/index.php" 75 | }\n\nTitle: ${user.Title}\nColor: ${user.Color}\nGlow: ${ 76 | user.GlowColor 77 | }${ 78 | user.Title === "X" || user.Color === "X" 79 | ? "\n__Information:__ This user has his title disabled.\n" 80 | : "\n" 81 | }${ 82 | betaUntil ? "\nBeta until: " + betaUntil : "" 83 | }\n**[All details of this user](http://staff.alphaconsole.net/details/${ 84 | user.DiscordID 85 | })**`, 86 | undefined, 87 | undefined, 88 | user.Banner 89 | ? `${config.keys.cdn_banners}${ 90 | user.Banner 91 | }.png?random=${random()}` 92 | .split(" ") 93 | .join("%20") 94 | : undefined 95 | ); 96 | } 97 | ); 98 | } 99 | ); 100 | } catch (error) { 101 | console.log(error); 102 | } 103 | } 104 | }; 105 | 106 | function random() { 107 | var text = ""; 108 | var possible = 109 | "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; 110 | 111 | for (var i = 0; i < 10; i++) 112 | text += possible.charAt(Math.floor(Math.random() * possible.length)); 113 | 114 | return text; 115 | } 116 | -------------------------------------------------------------------------------- /src/cmds/checksub.js: -------------------------------------------------------------------------------- 1 | let subs = []; 2 | let lastFetched; 3 | 4 | /** 5 | * ! Checksub command 6 | * 7 | * ? Kinda obvious, too lazy to write anything smart anyway 8 | * ? We also have command description for a reason. So I actually don't know why I added this here. Welp... 9 | */ 10 | const Discord = require('discord.js'); 11 | const request = require('request'); 12 | 13 | module.exports = { 14 | title: "Checksub", 15 | details: [ 16 | { 17 | perms : "Moderator", 18 | command : "!Checksub ", 19 | description: "Shows if the user is subbed or not." 20 | } 21 | ], 22 | 23 | run: ({ client, serverInfo, message, args, sql, config, sendEmbed }) => { 24 | 25 | try { 26 | if (!message.member.isCH) return; 27 | 28 | if (args[0].toLowerCase() === "!subcount") { 29 | if (!lastFetched) { 30 | return message.channel.send(" **Fetching all Twitch users...**").then(m => { 31 | getSubList(config.keys.TwitchClientID, config.keys.TwitchOauth).then(list => { 32 | m.delete(); 33 | 34 | const embed = new Discord.MessageEmbed() 35 | .setAuthor(`There are currently ${list.length} subscribed to AlphaConsole!`, client.user.displayAvatarURL({ format: "png" })) 36 | .setColor([255, 255, 0]) 37 | return message.channel.send(embed); 38 | }); 39 | }); 40 | } 41 | const embed = new Discord.MessageEmbed() 42 | .setAuthor(`There are currently ${subs.length} subscribed to AlphaConsole!`, client.user.displayAvatarURL({ format: "png" })) 43 | .setColor([255, 255, 0]) 44 | .setFooter("Last fetched") 45 | .setTimestamp(new Date(lastFetched)) 46 | return message.channel.send(embed); 47 | } 48 | 49 | 50 | if (args.length < 2) return sendEmbed(message.channel, "You must have forgotten the user", "`!checksub `"); 51 | 52 | let twitchName = ""; 53 | for (let i = 1; i < args.length; i++) twitchName += args[i] + " "; 54 | twitchName = twitchName.trim(); 55 | 56 | if (lastFetched && lastFetched > new Date().getTime() - 1800000 && !message.member.isModerator) { 57 | let filtered = subs.filter(s => s.user.name.toLowerCase().includes(twitchName.toLowerCase())); 58 | 59 | if (filtered.length === 1) { 60 | let u = filtered[0]; 61 | 62 | const embed = new Discord.MessageEmbed() 63 | .setAuthor("Sub check on " + u.user.display_name, client.user.displayAvatarURL({ format: "png" })) 64 | .setThumbnail(u.user.logo) 65 | .addField("Subscribed on", new Date(u.created_at).toUTCString()) 66 | .setColor([255, 255, 0]) 67 | .setFooter("Last fetched") 68 | .setTimestamp(new Date(lastFetched)) 69 | message.channel.send(embed); 70 | } else if (filtered.length > 1) { 71 | let users = ""; 72 | for (let i = 0; i < filtered.length; i++) { 73 | const e = filtered[i]; 74 | 75 | users += `- ${e.user.name}\n`; 76 | 77 | if (users.length > 1900) { 78 | users += `And ${filtered.length - (i + 1)} more...` 79 | break; 80 | } 81 | } 82 | 83 | const embed = new Discord.MessageEmbed() 84 | .setAuthor("Multiple twitch users found", client.user.displayAvatarURL({ format: "png" })) 85 | .setDescription(`\`\`\`${users}\`\`\``) 86 | .setColor([255, 255, 0]) 87 | .setFooter("Last fetched") 88 | .setTimestamp(new Date(lastFetched)) 89 | message.channel.send(embed); 90 | } else { 91 | sendEmbed(message.channel, "No twitch users found with provided name") 92 | } 93 | return; 94 | } 95 | 96 | message.channel.send(" **Fetching all Twitch users...**").then(m => { 97 | getSubList(config.keys.TwitchClientID, config.keys.TwitchOauth).then(list => { 98 | let filtered = list.filter(s => s.user.name.toLowerCase().includes(twitchName.toLowerCase())); 99 | m.delete(); 100 | 101 | if (filtered.length === 1) { 102 | let u = filtered[0]; 103 | 104 | const embed = new Discord.MessageEmbed() 105 | .setAuthor("Sub check on " + u.user.display_name, client.user.displayAvatarURL({ format: "png" })) 106 | .setThumbnail(u.user.logo) 107 | .addField("Subscribed on", new Date(u.created_at).toUTCString()) 108 | .setColor([255, 255, 0]) 109 | message.channel.send(embed); 110 | } else if (filtered.length > 1) { 111 | let users = ""; 112 | for (let i = 0; i < filtered.length; i++) { 113 | const e = filtered[i]; 114 | 115 | users += `- ${e.user.name}\n`; 116 | 117 | if (users.length > 1900) { 118 | users += `And ${filtered.length - (i + 1)} more...` 119 | break; 120 | } 121 | } 122 | 123 | sendEmbed(message.channel, "Multiple twitch users found", `\`\`\`${users}\`\`\``); 124 | } else { 125 | sendEmbed(message.channel, "No twitch users found with provided name") 126 | } 127 | }) 128 | }) 129 | 130 | } catch(e) { 131 | console.log(e); 132 | } 133 | 134 | } 135 | }; 136 | 137 | function getSubList(clientid, token) { 138 | return new Promise(async (resolve, reject) => { 139 | let link = `https://api.twitch.tv/kraken/channels/alphaconsole/subscriptions?direction=asc&limit=100&offset=`; 140 | let more = true; 141 | let offset = 0; 142 | let list = []; 143 | 144 | while(more) { 145 | res = await apiCall(`${link}${offset}`, clientid, token); 146 | 147 | if (!res) more = false; 148 | if (res && res.subscriptions && res.subscriptions.length === 0) more = false; 149 | offset += 100; 150 | 151 | list = list.concat(res.subscriptions) 152 | } 153 | 154 | subs = list; 155 | lastFetched = new Date().getTime(); 156 | 157 | resolve(list); 158 | }) 159 | } 160 | 161 | function apiCall(url, clientid, token) { 162 | return new Promise(function(resolve, reject){ 163 | request(url, { 164 | headers: { 165 | 'Client-ID': clientid, 166 | 'Authorization': `OAuth ${token}` 167 | } 168 | }, (err, res, body) => { 169 | if (err) return reject(err); 170 | 171 | let data = JSON.parse(body); 172 | resolve(data); 173 | 174 | }) 175 | }); 176 | } -------------------------------------------------------------------------------- /src/cmds/checkwhitelist.js: -------------------------------------------------------------------------------- 1 | /** 2 | * ! CheckWhitelist command 3 | * 4 | * ? Kinda obvious, too lazy to write anything smart anyway 5 | * ? We also have command description for a reason. So I actually don't know why I added this here. Welp... 6 | */ 7 | const Discord = require('discord.js'); 8 | 9 | module.exports = { 10 | title: "CheckWhitelist", 11 | details: [ 12 | { 13 | perms : "Support", 14 | command : "!CheckWhitelist <@tag | user Id>", 15 | description: "Check if the user has whitelisted titles" 16 | }, 17 | { 18 | perms : "Support", 19 | command : "!Checkw <@tag | user Id>", 20 | description: "Check if the user has whitelisted titles" 21 | } 22 | ], 23 | 24 | run: ({ client, serverInfo, message, args, sql, config, sendEmbed }) => { 25 | 26 | if (!message.member.isSupport) return; 27 | if (args.length < 2) return sendEmbed(message.channel, "You must have forgotten the user", "`!Checkw <@tag | user Id>`") 28 | 29 | try { 30 | var id = message.mentions.users.first() ? message.mentions.users.first().id : args[1]; 31 | sql.query("Select * from TitleReports where (DiscordID = ? OR SteamID = ?) AND Permitted = 1", [ id, id ], (err, res) => { 32 | if (err) { 33 | let errorCode = Math.floor(Math.random() * (9999 - 1000 + 1)) + 1000; 34 | console.error(`Error code ${errorCode} by ${message.author.tag}`, err); 35 | return sendEmbed(message.author, "🚫 An error occurred. Please contact Pollie#0001. Error code: `" + errorCode + "`"); 36 | } 37 | 38 | let text = ""; 39 | for (let i = 0; i < res.length; i++) text += `- \`${res[i].Title}\``; 40 | if (text === "") text = "No whitelisted titles found."; 41 | 42 | sendEmbed(message.channel, "Title whitelist check", text) 43 | }) 44 | 45 | } catch (error) { 46 | console.log(error) 47 | } 48 | 49 | } 50 | }; 51 | 52 | 53 | function returnColour(colourID) { 54 | switch (colourID) { 55 | case "0": 56 | return "No title"; 57 | break; 58 | case "1": 59 | return "Gray"; 60 | break; 61 | case "2": 62 | return "Glowing Green (Twitch Subs & Legacy)"; 63 | break; 64 | case "3": 65 | return "Non-glowing Green"; 66 | break; 67 | case "4": 68 | return "Non-glowing Yellow"; 69 | break; 70 | case "5": 71 | return "Glowing Yellow"; 72 | break; 73 | case "6": 74 | return "Purple (Twitch Subs & Legacy)"; 75 | break; 76 | case "7": 77 | return "RLCS Blue"; 78 | break; 79 | case "X": 80 | return "Disabled (X)"; 81 | break; 82 | default: 83 | return "Cycling Colours"; 84 | } 85 | } -------------------------------------------------------------------------------- /src/cmds/delcom.js: -------------------------------------------------------------------------------- 1 | /** 2 | * ! Delete command command 3 | * 4 | * ? Simply deletes a custom command. 5 | */ 6 | const Discord = require('discord.js'); 7 | 8 | module.exports = { 9 | title: "DeleteCommand", 10 | details: [ 11 | { 12 | perms : "Staff", 13 | command : "!delcom ", 14 | description: "Deletes a command" 15 | } 16 | ], 17 | 18 | run: ({ client, serverInfo, message, args, sql, config, sendEmbed }) => { 19 | if (!message.member.isStaff) return; 20 | if (args.length < 2) return sendEmbed(message.channel, "You did not include the command") 21 | 22 | let command = args[1].startsWith('!') ? args[1].substring(1,0) : args[1]; 23 | 24 | sql.query("Select * from Commands where Command = ?", [ command ], (err, res) => { 25 | if (err) { 26 | let errorCode = Math.floor(Math.random() * (9999 - 1000 + 1)) + 1000; 27 | console.error(`Error code ${errorCode} by ${message.author.tag}`, err); 28 | return sendEmbed(message.author, "🚫 An error occurred. Please contact Pollie#0001. Error code: `" + errorCode + "`"); 29 | } 30 | if (res.length === 0) return sendEmbed(message.channel, `Command "${command}" not found!`); 31 | 32 | sql.query("delete from Commands where Command = ?", [ command ]); 33 | sendEmbed(message.channel, "Custom command deleted!"); 34 | 35 | const embedlog = new Discord.MessageEmbed() 36 | .setColor([255, 255, 0]) 37 | .setAuthor("Custom Command Deleted", client.user.displayAvatarURL()) 38 | .addField("Command", command) 39 | .addField("Deleted by", `**${message.author.tag}** (${message.member})`) 40 | .setThumbnail(message.author.displayAvatarURL()) 41 | .setTimestamp(); 42 | message.guild.channels.resolve(serverInfo.channels.aclog).send(embedlog); 43 | }) 44 | } 45 | } -------------------------------------------------------------------------------- /src/cmds/disable.js: -------------------------------------------------------------------------------- 1 | /** 2 | * ! Disable command 3 | */ 4 | const request = require("request"); 5 | 6 | module.exports = { 7 | title: "Disable", 8 | details: [ 9 | { 10 | perms: "Everyone", 11 | command: "!Disable", 12 | description: "Disables your custom title or banner" 13 | } 14 | ], 15 | 16 | run: ({ client, serverInfo, message, args, sql, config, sendEmbed }) => { 17 | switch (message.channel.id) { 18 | case serverInfo.channels.setBanner: 19 | sql.query("UPDATE Titles SET Banner = null WHERE DiscordID = ?", [ 20 | message.author.id 21 | ]); 22 | sendEmbed(message.author, "Your banner has been disabled."); 23 | break; 24 | 25 | case serverInfo.channels.setTitle: 26 | case serverInfo.channel.setSpecialTitle: 27 | sql.query("UPDATE Titles SET Title = 'X' WHERE DiscordID = ?", [ 28 | message.author.id 29 | ]); 30 | sendEmbed(message.author, "Your title has been disabled."); 31 | break; 32 | 33 | default: 34 | break; 35 | } 36 | } 37 | }; 38 | -------------------------------------------------------------------------------- /src/cmds/disablebanner.js: -------------------------------------------------------------------------------- 1 | /** 2 | * ! disablebanner command 3 | * 4 | * ? Simply removes a user's banner. For now it's left on the server but that will be updated when I have access. 5 | */ 6 | const Discord = require('discord.js'); 7 | 8 | module.exports = { 9 | title: "Status", 10 | details: [ 11 | { 12 | perms : "Moderator", 13 | command : "!disablebanner", 14 | description: "Removes a user's banner" 15 | } 16 | ], 17 | 18 | run: async ({ client, message, args, sql, config, sendEmbed, serverInfo}) => { 19 | if (!message.member.isModerator && message.author.id != "345769053538746368") return; 20 | 21 | if(args.length < 2) return sendEmbed("An error occured", "Please supply a user who's banner you want to reset!") 22 | sql.query( 23 | "Select * from Titles where DiscordID = ?", 24 | [args[1]], 25 | (err, rows) => { 26 | const user = rows[0]; 27 | //console.log(rows) 28 | if (!user) 29 | return sendEmbed( 30 | message.channel, 31 | "An error occured", 32 | "This user has not signed up for our title service!" 33 | ); 34 | 35 | if (user.Banner === null) { 36 | return sendEmbed( 37 | message.channel, 38 | "An error occured", 39 | "This user does not have a banner to disable!" 40 | ); 41 | } 42 | else { 43 | config.sql.query(`UPDATE Titles set Banner = NULL WHERE DiscordID = ?`, [ 44 | args[1] 45 | ]); 46 | config.sql.query("UPDATE Titles set BannerAccepted = 0 WHERE DiscordID = ?", [ 47 | args[1] 48 | ]); 49 | sendEmbed(message.guild.channels.resolve(serverInfo.channels.modlog), "Success", 50 | "This user's banner has successfully been reset by <@!"+message.author+">!") 51 | return sendEmbed( 52 | message.channel, 53 | "Success", 54 | "This user's banner has successfully been reset by <@!"+message.author+">!" 55 | ) 56 | } 57 | } 58 | ); 59 | } 60 | }; 61 | -------------------------------------------------------------------------------- /src/cmds/editcom.js: -------------------------------------------------------------------------------- 1 | /** 2 | * ! Edit command command 3 | * 4 | * ? Simply edits a custom command. 5 | */ 6 | const Discord = require('discord.js'); 7 | 8 | module.exports = { 9 | title: "EditCommand", 10 | details: [ 11 | { 12 | perms : "Staff", 13 | command : "!editcom ", 14 | description: "Edits an already existing command" 15 | } 16 | ], 17 | 18 | run: ({ client, serverInfo, message, args, sql, config, sendEmbed }) => { 19 | if (!message.member.isStaff) return; 20 | if (args.length < 3) return sendEmbed(message.channel, "You did not include the command & the response.") 21 | 22 | let command = args[1].startsWith('!') ? args[1].substring(1,0) : args[1]; 23 | let response = ""; 24 | for (i = 2; i < args.length; i++) { 25 | if (args[i] == "@everyone") { 26 | response += "`@everyone` "; 27 | } else if (args[i] == "@here") { 28 | response += "`@here` "; 29 | } else if (message.mentions.roles.cache.has(args[i].replace(/[^0-9]/g, ""))) { 30 | response +="**" + message.mentions.roles.get(args[i].replace(/[^0-9]/g, "")).name + "** "; 31 | } else if (message.mentions.users.has(args[i].replace(/[^0-9]/g, ""))) { 32 | response += "**" + message.mentions.users.get(args[i].replace(/[^0-9]/g, "")).tag + "** "; 33 | } else { 34 | response += args[i] + " "; 35 | } 36 | } 37 | 38 | sql.query("Select * from Commands where Command = ?", [ command ], (err, res) => { 39 | if (err) { 40 | let errorCode = Math.floor(Math.random() * (9999 - 1000 + 1)) + 1000; 41 | console.error(`Error code ${errorCode} by ${message.author.tag}`, err); 42 | return sendEmbed(message.author, "🚫 An error occurred. Please contact Pollie#0001. Error code: `" + errorCode + "`"); 43 | } 44 | if (res.length === 0) return sendEmbed(message.channel, `Command "${command}" not found!`); 45 | 46 | sql.query("update Commands set Response = ? where Command = ?", [ response, command ]); 47 | sendEmbed(message.channel, "Custom command edited!"); 48 | 49 | const embedlog = new Discord.MessageEmbed() 50 | .setColor([255, 255, 0]) 51 | .setAuthor("Custom Command Edit", client.user.displayAvatarURL()) 52 | .addField("Command", command) 53 | .addField("Response", response) 54 | .addField("Edited by", `**${message.author.tag}** (${message.member})`) 55 | .setThumbnail(message.author.displayAvatarURL()) 56 | .setTimestamp(); 57 | message.guild.channels.resolve(serverInfo.channels.aclog).send(embedlog); 58 | }) 59 | } 60 | } -------------------------------------------------------------------------------- /src/cmds/forcelock.js: -------------------------------------------------------------------------------- 1 | /** 2 | * ! Lockdown command 3 | * 4 | * ? Kinda obvious, too lazy to write anything smart anyway 5 | * ? We also have command description for a reason. So I actually don't know why I added this here. Welp... 6 | */ 7 | const Discord = require('discord.js'); 8 | 9 | module.exports = { 10 | title: "Forcelock", 11 | details: [ 12 | { 13 | perms : "Admin", 14 | command : "!Forcelock", 15 | description: "Disables all channels in case of a raid." 16 | } 17 | ], 18 | 19 | run: ({ client, serverInfo, message, args, sql, config, sendEmbed }) => { 20 | 21 | if (!message.member.isAdmin) return; 22 | 23 | try { 24 | let channels = client.guilds.resolve(serverInfo.guildId).channels.filter(c => c.parentID !== serverInfo.channels.staffChannelsCat && c.type === "text"); 25 | 26 | if (args[0].toLowerCase() === "!forcelock") { 27 | channels.forEach(c => { 28 | c.updateOverwrite(message.guild.id, { 29 | SEND_MESSAGES: false 30 | }); 31 | }); 32 | sendEmbed(message.channel, "All channels have been locked down.") 33 | } 34 | 35 | if (args[0].toLowerCase() === "!forceunlock") { 36 | serverInfo.publicChannels.forEach(id => { 37 | if (client.guilds.resolve(serverInfo.guildId) && client.guilds.resolve(serverInfo.guildId).channels.resolve(id)) { 38 | client.guilds.resolve(serverInfo.guildId).channels.resolve(id) 39 | .updateOverwrite(message.guild.id, { 40 | SEND_MESSAGES: true 41 | }); 42 | } 43 | }); 44 | sendEmbed(message.channel, "All channels have been unlocked.") 45 | } 46 | 47 | } catch (error) { 48 | console.log(error) 49 | } 50 | } 51 | }; -------------------------------------------------------------------------------- /src/cmds/getinfo.js: -------------------------------------------------------------------------------- 1 | /** 2 | * ! getinfo command 3 | * 4 | * ? Pulls a users info from the main server 5 | */ 6 | const Discord = require('discord.js'); 7 | const moment = require('moment'); 8 | 9 | module.exports = { 10 | title: "Getinfo", 11 | details: [{ 12 | perms: "Support", 13 | command: "!getinfo", 14 | description: "Pulls a user's info from the main server" 15 | }], 16 | 17 | run: async ({ 18 | client, 19 | message, 20 | args, 21 | sql, 22 | config, 23 | sendEmbed 24 | }) => { 25 | var sinfo = require("../serverInfo.js") 26 | if(!args[1]) return sendEmbed(message.channel, "An error occured", "Missing a user to pull from.\nComamnd format: !getinfo ") 27 | try { 28 | client.users.fetch(args[1]).then(u => { 29 | if(u === undefined) return; 30 | }) 31 | } catch(err) { 32 | return; 33 | } 34 | client.guilds.resolve(sinfo.guildId).members.fetch(args[1]).then(tU => { 35 | sql.query("Select * from members where DiscordID = ?", [args[1]], (err, res) => { 36 | if (err) return message.channel(err); 37 | let jDate = moment.unix(res[0].JoinedDate / 1000) 38 | let r = tU.roles.cache 39 | let sr = []; 40 | for (let i = 0; i < r.length; i++) { 41 | let n = r[i].name; 42 | n = n.charAt(0).toUpperCase() + r[i].name.slice(1) 43 | sr.push(" " + n); 44 | } 45 | sr = sr.reverse() 46 | sr = sr.slice(1) 47 | sr = sr.reverse() 48 | if (sr.length === 0) { 49 | sr = "No Roles" 50 | } 51 | sql.query("Select * from Logs where Member = ?", [tU.id], (err, res) => { 52 | if (err) return message.channel(err); 53 | let mutes = res.filter(c => c.Action === "mute"); 54 | let warns = res.filter(c => c.Action === "warn"); 55 | let kicks = res.filter(c => c.Action === "kick"); 56 | let bans = res.filter(c => c.Action === "ban"); 57 | sql.query("Select * from Titles where DiscordID = ?", [tU.id], (err, re) => { 58 | if (err) return message.channel(err); 59 | sql.query("Select * from Players where DiscordID = ?", [tU.id], (err, players) => { 60 | if (err) return message.channel(err); 61 | return sendEmbed(message.channel, tU.user.username, "**> Roles:** " + sr + "\n**> Join Date:** " + jDate.toString() + "\n**> Warns:** ``" + warns.length + "``" + "\n**> Mutes:** ``" + mutes.length + "``\n**> Kicks:** ``" + kicks.length + "``\n**> Bans:** ``" + bans.length + "``\n**> Title: **" + re[0].Title + "\n**> Color: **" + re[0].Color + `\n**> Steam Account:** [${players[0].SteamID}](https://steamcommunity.com/profiles/${players[0].SteamID})\n**> Last Seen: ** ${moment.unix(players[0].LastSeen).toString()}`) 62 | }) 63 | }) 64 | }) 65 | }); 66 | }).catch(err => { 67 | sql.query("Select * from members where DiscordID = ?", [args[1]], (err, res) => { 68 | if(res.length === 0) {return sendEmbed(message.channel, args[1], "ERROR. That user does not exist in our system.")} 69 | //TODO: Repeat above steps if they were in there but no longer in the server. 70 | sql.query("Select * from Logs where Member = ?", [args[1]], (err, res) => { 71 | if (err) return message.channel(err); 72 | let mutes = res.filter(c => c.Action === "mute"); 73 | let warns = res.filter(c => c.Action === "warn"); 74 | let kicks = res.filter(c => c.Action === "kick"); 75 | let bans = res.filter(c => c.Action === "ban"); 76 | sql.query("Select * from Titles where DiscordID = ?", [args[1]], (err, re) => { 77 | if (err) return message.channel(err); 78 | let t; 79 | let c; 80 | if(re[0] === undefined) {t = "No title set."; c = "No color set."} else {t = re[0].Title;c=re[0].Color} 81 | sql.query("Select * from Players where DiscordID = ?", [args[1]], (err, players) => { 82 | if (err) return message.channel(err); 83 | let s; 84 | let ls; 85 | if(re[0] === undefined) {s = "No steam account linked";ls="Never"} else {s=`[${players[0].SteamID}](https://steamcommunity.com/profiles/${players[0].SteamID}})`;ls=`${moment.unix(players[0].LastSeen).toString()}`} 86 | return sendEmbed(message.channel, args[1], "User is not currently in the server\n**> Warns:** ``" + warns.length + "``" + "\n**> Mutes:** ``" + mutes.length + "``\n**> Kicks:** ``" + kicks.length + "``\n**> Bans:** ``" + bans.length + "``\n**> Title: **" + t + "\n**> Color: **" + c + `\n**> Steam Account:** ${s}\n**> Last Seen: ** ${ls}`) 87 | }) 88 | }) 89 | }) 90 | }); 91 | }) 92 | // 93 | } 94 | }; 95 | -------------------------------------------------------------------------------- /src/cmds/gettitle.js: -------------------------------------------------------------------------------- 1 | /** 2 | * ! Get title command 3 | */ 4 | 5 | module.exports = { 6 | title: "GetTitle", 7 | details: [ 8 | { 9 | perms: "Everyone", 10 | command: "!get title", 11 | description: "Returns your current title" 12 | } 13 | ], 14 | 15 | run: ({ client, serverInfo, message, args, sql, config, sendEmbed }) => { 16 | if (message.channel.id !== serverInfo.channels.setTitle) return; 17 | if (args.length < 2 || !(args[1] && args[1].toLowerCase() === "title")) 18 | return; 19 | 20 | sql.query( 21 | "Select * from Titles where DiscordID = ?", 22 | [message.author.id], 23 | (err, rows) => { 24 | const user = rows[0]; 25 | 26 | if (!user) 27 | return sendEmbed( 28 | message.author, 29 | "An error occured", 30 | `It appears you have not signed up for our title service. Please click this link and makes sure you are logging in with the correct account.\n\nhttp://www.alphaconsole.net/auth/index.php` 31 | ); 32 | 33 | if (user.Title === "X" || user.Color === "X") 34 | return sendEmbed( 35 | message.author, 36 | "Your title information", 37 | `Discord: <@${ 38 | user.DiscordID 39 | }>\n\nInformation: You have your title disabled. Set a new title & color to enable your title again.` 40 | ); 41 | 42 | sendEmbed( 43 | message.author, 44 | "Your title information", 45 | `Discord: <@${user.DiscordID}>\n\nTitle: ${user.Title}\nColor: ${ 46 | user.Color 47 | }\nGlow: ${user.GlowColor}` 48 | ); 49 | } 50 | ); 51 | 52 | /* try { 53 | var url = config.keys.CheckdbURL + "?DiscordID=" + message.author.id; 54 | var user = message.author; 55 | request({ method: "GET", url: url }, function (err, response, body) { 56 | if (err) { 57 | let errorCode = Math.floor(Math.random() * (9999 - 1000 + 1)) + 1000; 58 | console.error(`Error code ${errorCode} by ${message.author.tag}`, err); 59 | return sendEmbed(message.author, "🚫 An error occurred. Please contact Pollie#0001. Error code: `" + errorCode + "`"); 60 | } 61 | 62 | let result = ""; 63 | 64 | if (body) { 65 | if (body.toLowerCase().includes("not signed up for db")) { 66 | sendEmbed(message.author, "An error occured", `It appears you have not signed up for our title service. Please click this link and makes sure you are logging in with the correct account.\n\nhttp://www.alphaconsole.net/auth/index.php`) 67 | 68 | } else if (body.toLowerCase().includes("no title set")) { 69 | sendEmbed(message.author, "An error occured", `No title set. Go to #set-title and set a title!`); 70 | 71 | } else { 72 | var info = body.split(" "); 73 | var colour = info[info.length - 3]; 74 | var steamID = info[info.length - 2]; 75 | for (let index = 0; index < info.length - 3; index++) result += info[index] + " "; 76 | 77 | if (result.trim() == "X" && returnColour(colour) == "Cycling Colours") { 78 | sendEmbed(message.author, "Database Check", `User: ${user}\nSteam: https://steamcommunity.com/profiles/${steamID}\nInformation: User has disabled their title.`); 79 | } else { 80 | sendEmbed(message.author, "Database Check", `User: ${user}\nSteam: https://steamcommunity.com/profiles/${steamID}\nTitle: ${result.trim()}\nColour: ${returnColour(colour)}`); 81 | } 82 | } 83 | } else { 84 | sendEmbed(message.author, "An error occured", "There was an error. Please try again. If this problem continues please contact an admin.") 85 | } 86 | }); 87 | } catch (error) { 88 | console.log(error) 89 | } */ 90 | } 91 | }; 92 | 93 | function returnColour(colourID) { 94 | switch (colourID) { 95 | case "0": 96 | return "No title"; 97 | break; 98 | case "1": 99 | return "Gray"; 100 | break; 101 | case "2": 102 | return "Glowing Green (Twitch Subs & Legacy)"; 103 | break; 104 | case "3": 105 | return "Non-glowing Green"; 106 | break; 107 | case "4": 108 | return "Non-glowing Yellow"; 109 | break; 110 | case "5": 111 | return "Glowing Yellow"; 112 | break; 113 | case "6": 114 | return "Purple (Twitch Subs & Legacy)"; 115 | break; 116 | case "7": 117 | return "RLCS Blue"; 118 | break; 119 | case "X": 120 | return "Disabled (X)"; 121 | break; 122 | default: 123 | return "Cycling Colours"; 124 | } 125 | } 126 | -------------------------------------------------------------------------------- /src/cmds/givebeta.js: -------------------------------------------------------------------------------- 1 | /** 2 | * ! givebeta command 3 | * 4 | * ? Kinda obvious, too lazy to write anything smart anyway 5 | * ? We also have command description for a reason. So I actually don't know why I added this here. Welp... 6 | */ 7 | const Discord = require('discord.js'); 8 | 9 | module.exports = { 10 | title: "givebeta", 11 | details: [ 12 | { 13 | perms : "Moderator", 14 | command : "!givebeta <@tag>", 15 | description: "Give the beta role to @tag for 1 day" 16 | } 17 | ], 18 | 19 | run: ({ client, serverInfo, message, args, sql, config, sendEmbed }) => { 20 | 21 | if (!message.member.isModerator || message.member.id === "345769053538746368") return; 22 | if (args.length < 2) return sendEmbed(message.channel, "You must have forgotten the user", "`!givebeta <@tag | user Id>`") 23 | 24 | let user = message.mentions.users.first() ? message.mentions.users.first().id : args[1]; 25 | client.guilds.resolve(serverInfo.guildId).members.fetch(user).then(m => { 26 | require('../helpers/checkUser').run(sql, m.user, (err, user) => { 27 | if (err) { 28 | let errorCode = Math.floor(Math.random() * (9999 - 1000 + 1)) + 1000; 29 | console.error(`Error code ${errorCode} by ${message.author.tag}`, err); 30 | return sendEmbed(message.author, "🚫 An error occurred. Please contact Pollie#0001. Error code: `" + errorCode + "`"); 31 | } 32 | 33 | m.roles.add(serverInfo.roles.beta); 34 | let betaUntil = new Date().getTime() + 86400000; 35 | sql.query("Update Members set tempBeta = ? where DiscordID = ?", [ betaUntil, m.id ]); 36 | 37 | sendEmbed(message.channel, "Beta given to " + m.user.tag + " for one day by "+message.author); 38 | 39 | const embedlog = new Discord.MessageEmbed() 40 | .setColor([255, 255, 0]) 41 | .setAuthor("1 day beta", client.user.displayAvatarURL()) 42 | .addField("Given to", `${m} (${m.id})`) 43 | .addField("By", `**${message.author.tag}** (${message.member})`) 44 | .setThumbnail(message.author.displayAvatarURL()) 45 | .setTimestamp(); 46 | client.guilds.resolve(serverInfo.guildId).channels.resolve(serverInfo.channels.aclog).send(embedlog); 47 | 48 | }); 49 | }).catch(e => { 50 | if (e.message == "Unknown Member") 51 | sendEmbed(message.channel, "User not found..") 52 | else 53 | console.log(e); 54 | }) 55 | } 56 | }; 57 | -------------------------------------------------------------------------------- /src/cmds/help.js: -------------------------------------------------------------------------------- 1 | /** 2 | * ! Help command 3 | * 4 | * ? Well... Show the information of the commands? Hehe 5 | */ 6 | const Discord = require('discord.js'); 7 | 8 | module.exports = { 9 | title: "Help", 10 | details: [ 11 | { 12 | perms : "Everyone", 13 | command : "!Help", 14 | description: "Shows the help command" 15 | } 16 | ], 17 | 18 | run: ({ client, serverInfo, message, args, sql, config, sendEmbed, member }, isDM) => { 19 | 20 | if (args.length === 1) { 21 | let a = config.commands; 22 | let help = { 23 | everyone : [], 24 | staff : [], 25 | support : [], 26 | moderator: [], 27 | admin : [], 28 | } 29 | 30 | for (let i = 0; i < a.length; i++) { 31 | if (!help[a[i].perms.toLowerCase()].includes(a[i].title)) 32 | help[a[i].perms.toLowerCase()].push(a[i].title); 33 | } 34 | 35 | if (isDM) { 36 | 37 | const emb = new Discord.MessageEmbed() 38 | .setColor([255, 255, 0]) 39 | .setAuthor("Help command", client.user.displayAvatarURL()) 40 | .setFooter('Execute "!help " for details') 41 | if (help.everyone.length !== 0) emb.addField("Everyone commands", help.everyone.join("\n")) 42 | if (member.isStaff && help.staff.length !== 0) emb.addField("Staff commands", help.staff.join("\n")) 43 | if (member.isSupport && help.support.length !== 0) emb.addField("Support commands", help.support.join("\n")) 44 | if (member.isModerator && help.moderator.length !== 0) emb.addField("Moderator commands", help.moderator.join("\n")) 45 | if (member.isAdmin && help.admin.length !== 0) emb.addField("Admin commands", help.admin.join("\n")) 46 | message.channel.send(emb); 47 | 48 | 49 | } else if (message.channel.id === serverInfo.channels.botSpam) { 50 | 51 | const emb = new Discord.MessageEmbed() 52 | .setColor([255, 255, 0]) 53 | .setAuthor("Help command", client.user.displayAvatarURL()) 54 | .setFooter('Private message "!help " for details') 55 | if (help.everyone.length !== 0) emb.addField("Everyone commands", help.everyone.join("\n")) 56 | message.channel.send(emb); 57 | 58 | } 59 | } else if (args.length === 2 && isDM) { 60 | 61 | let filtered = config.commands.filter(c => c.title.toLowerCase().includes(args[1].toLowerCase())); 62 | const emb = new Discord.MessageEmbed() 63 | .setColor([255, 255, 0]) 64 | .setAuthor("Help command: " + args[1], client.user.displayAvatarURL()) 65 | for (let i = 0; i < filtered.length; i++) { 66 | emb.addField(filtered[i].command, `${filtered[i].description}\n\`[${filtered[i].perms}]\``); 67 | } 68 | message.channel.send(emb); 69 | 70 | } 71 | 72 | } 73 | } -------------------------------------------------------------------------------- /src/cmds/kick.js: -------------------------------------------------------------------------------- 1 | /** 2 | * ! Kick command 3 | * 4 | * ? Kinda obvious, too lazy to write anything smart anyway 5 | * ? We also have command description for a reason. So I actually don't know why I added this here. Welp... 6 | */ 7 | const Discord = require('discord.js'); 8 | 9 | module.exports = { 10 | title: "Kick", 11 | details: [ 12 | { 13 | perms : "Moderator", 14 | command : "!Kick <@tag> ", 15 | description: "Kicks the person with the given reason" 16 | } 17 | ], 18 | 19 | run: ({ client, serverInfo, message, args, sql, config, sendEmbed }) => { 20 | 21 | if (!message.member.isModerator || message.member.id === "345769053538746368") return; 22 | if (args.length < 2) return sendEmbed(message.channel, "You must have forgotten the user", "`!Kick <@tag | user Id> `") 23 | 24 | let user = message.mentions.users.first() ? message.mentions.users.first().id : args[1]; 25 | client.guilds.resolve(serverInfo.guildId).members.fetch(user).then(m => { 26 | require('../helpers/checkUser').run(sql, m.user, (err, user) => { 27 | if (err) { 28 | let errorCode = Math.floor(Math.random() * (9999 - 1000 + 1)) + 1000; 29 | console.error(`Error code ${errorCode} by ${message.author.tag}`, err); 30 | return sendEmbed(message.author, "🚫 An error occurred. Please contact Pollie#0001. Error code: `" + errorCode + "`"); 31 | } 32 | 33 | if (isStaff(m, serverInfo)) 34 | return sendEmbed(message.channel, "You cannot kick a staff member."); 35 | 36 | let reason = ""; 37 | for (i = 2; i < args.length; i++) reason += args[i] + " "; 38 | if (reason === "") reason = "No reason provided"; 39 | 40 | m.kick(reason); 41 | 42 | sql.query("Insert into `Logs`(Action, Member, Moderator, Reason, Time, ChannelID) values(?, ?, ?, ?, ?, ?)", 43 | [ 'kick', m.id, message.author.id, reason, new Date().getTime(), message.channel.id ], (err, res) => { 44 | if (err) { 45 | let errorCode = Math.floor(Math.random() * (9999 - 1000 + 1)) + 1000; 46 | console.error(`Error code ${errorCode} by ${message.author.tag}`, err); 47 | return sendEmbed(message.author, "🚫 An error occurred. Please contact Pollie#0001. Error code: `" + errorCode + "`"); 48 | } 49 | 50 | let caseId = res.insertId; 51 | sendEmbed(message.channel, `${m.user.tag} has been kicked from the server. Case number: ${caseId}`); 52 | 53 | const embedlog = new Discord.MessageEmbed() 54 | .setColor([255, 255, 0]) 55 | .setAuthor(`Case ${caseId} | User Kick`, client.user.displayAvatarURL({ format: "png" })) 56 | .setDescription(`**${m.user.tag}** (${ m.id }) has been kicked by ${message.member}`) 57 | .setTimestamp() 58 | .addField("Reason", reason); 59 | client.guilds.resolve(serverInfo.guildId).channels.resolve(serverInfo.channels.modlog).send(embedlog).then(msg => { 60 | sql.query(`update Logs set MessageID = ? where ID = ?`, [ msg.id, caseId ]); 61 | }); 62 | 63 | }); 64 | 65 | }); 66 | }).catch(e => { 67 | if (e.message == "Unknown Member") 68 | sendEmbed(message.channel, "User not found..") 69 | else 70 | console.log(e); 71 | }) 72 | } 73 | }; 74 | 75 | function isStaff(m, serverInfo) { 76 | if (m.roles.cache.has(serverInfo.roles.staff)) return true; 77 | if (m.roles.cache.has(serverInfo.roles.support)) return true; 78 | if (m.roles.cache.has(serverInfo.roles.seniorS)) return true; 79 | if (m.roles.cache.has(serverInfo.roles.moderator)) return true; 80 | if (m.roles.cache.has(serverInfo.roles.admin)) return true; 81 | return false; 82 | } 83 | -------------------------------------------------------------------------------- /src/cmds/lastseen.js: -------------------------------------------------------------------------------- 1 | /** 2 | * ! lastseen command 3 | */ 4 | const request = require('request'); 5 | const Discord = require('discord.js'); 6 | 7 | module.exports = { 8 | title: "Lastseen", 9 | details: [ 10 | { 11 | perms : "Everyone", 12 | command : "!Lastseen <@tag | user Id | steam Id>", 13 | description: "Returns last seen in DB and Discord if applicable" 14 | } 15 | ], 16 | 17 | run: ({ client, serverInfo, message, args, sql, config, sendEmbed }) => { 18 | 19 | if (!message.member.isSupport) return; 20 | 21 | try { 22 | var url = config.keys.LastSeenURL; 23 | var user; 24 | if (args[1] == undefined) { 25 | return sendEmbed(message.channel, "Need a parameter."); 26 | 27 | } else if (isNaN(args[1]) && message.mentions.users.first()) { 28 | //discord 29 | url += "?DiscordID=" + message.mentions.users.first().id; 30 | user = message.mentions.users.first(); 31 | 32 | } else if (args[1].length == 18) { 33 | url += "?DiscordID=" + args[1]; 34 | user = client.users.get(args[1]); 35 | 36 | } else if (args[1].length == 17) { 37 | //steam 38 | url += "?SteamID=" + args[1]; 39 | user = false 40 | } else { 41 | return sendEmbed(message.channel, "Incorrect parameter. Please use mention/discordID/steamID") 42 | } 43 | request({ method: "GET", url: url }, function (err, response, body) { 44 | if (err) { 45 | let errorCode = Math.floor(Math.random() * (9999 - 1000 + 1)) + 1000; 46 | console.error(`Error code ${errorCode} by ${message.author.tag}`, err); 47 | return sendEmbed(message.author, "🚫 An error occurred. Please contact Pollie#0001. Error code: `" + errorCode + "`"); 48 | } 49 | 50 | 51 | if (body) { 52 | if (body.toLowerCase().includes("db")) 53 | return sendEmbed(message.channel, "User not found in db.") 54 | 55 | var dbTime = convertUnixTime(body.trim()); 56 | console.log(user); 57 | if (user) { 58 | if (user.lastMessage == null || user.lastMessage == undefined) { 59 | const embed = new Discord.MessageEmbed() 60 | .setColor([255, 255, 0]) 61 | .setAuthor("Last Seen Check", client.user.displayAvatarURL({ format: "png" })) 62 | .addField("User", user) 63 | .addField("Last Seen in DB", `${dbTime}`) 64 | .addField( 65 | "Discord Information", 66 | `Info could not be retrieved. Message was not cached` 67 | ); 68 | message.channel.send(embed); 69 | } else { 70 | const embed = new Discord.MessageEmbed() 71 | .setColor([255, 255, 0]) 72 | .setAuthor("Last Seen Check", client.user.displayAvatarURL({ format: "png" })) 73 | .addField("User", user) 74 | .addField("Last Seen in DB", `${dbTime}`) 75 | .addField("Last Message on Discord", `${user.lastMessage}`) 76 | .addField( 77 | "Date of Last Message", 78 | `${user.lastMessage.createdAt}` 79 | ); 80 | message.channel.send(embed); 81 | } 82 | } else { 83 | const embed = new Discord.MessageEmbed() 84 | .setColor([255, 255, 0]) 85 | .setAuthor("Last Seen Check", client.user.displayAvatarURL({ format: "png" })) 86 | .addField("User", user) 87 | .addField("Last Seen in DB", `${dbTime}`); 88 | message.channel.send(embed); 89 | } 90 | } else { 91 | message.reply("There was an error. Please try again."); 92 | } 93 | }); 94 | 95 | } catch (error) { 96 | console.log(error); 97 | } 98 | 99 | } 100 | }; 101 | 102 | 103 | 104 | function convertUnixTime(timestamp) { 105 | var d = new Date(timestamp * 1000), // Convert the passed timestamp to milliseconds 106 | yyyy = d.getFullYear(), 107 | mm = ("0" + (d.getMonth() + 1)).slice(-2), // Months are zero based. Add leading 0. 108 | dd = ("0" + d.getDate()).slice(-2), // Add leading 0. 109 | hh = d.getHours(), 110 | h = hh, 111 | min = ("0" + d.getMinutes()).slice(-2), // Add leading 0. 112 | ampm = "AM", 113 | time; 114 | 115 | if (hh > 12) { 116 | h = hh - 12; 117 | ampm = "PM"; 118 | } else if (hh === 12) { 119 | h = 12; 120 | ampm = "PM"; 121 | } else if (hh == 0) { 122 | h = 12; 123 | } 124 | 125 | return yyyy + "-" + mm + "-" + dd + ", " + h + ":" + min + " " + ampm; 126 | } -------------------------------------------------------------------------------- /src/cmds/listcom.js: -------------------------------------------------------------------------------- 1 | /** 2 | * ! List commands command 3 | * 4 | * ? Displays all custom commands 5 | */ 6 | 7 | module.exports = { 8 | title: "ListCommands", 9 | details: [ 10 | { 11 | perms : "Staff", 12 | command : "!listcom", 13 | description: "Shows all custom commands" 14 | } 15 | ], 16 | 17 | run: ({ client, serverInfo, message, args, sql, config, sendEmbed }) => { 18 | if (!message.member.isCH) return; 19 | 20 | sql.query("Select * from Commands", [], (err, rows) => { 21 | if (err) { 22 | let errorCode = Math.floor(Math.random() * (9999 - 1000 + 1)) + 1000; 23 | console.error(`Error code ${errorCode} by ${message.author.tag}`, err); 24 | return sendEmbed(message.author, "🚫 An error occurred. Please contact Pollie#0001. Error code: `" + errorCode + "`"); 25 | } 26 | 27 | let allCommands = ""; 28 | rows.forEach(row => { 29 | allCommands += "- !" + row.Command + "\n"; 30 | }); 31 | 32 | sendEmbed(message.channel, "All custom commands", allCommands); 33 | }) 34 | } 35 | } -------------------------------------------------------------------------------- /src/cmds/listroles.js: -------------------------------------------------------------------------------- 1 | /** 2 | * ! List roles command 3 | * 4 | * ? Lists up all the roles in the server 5 | */ 6 | const Discord = require('discord.js'); 7 | 8 | module.exports = { 9 | title: "Listroles", 10 | details: [ 11 | { 12 | perms : "Moderator", 13 | command : "!listroles", 14 | description: "List all the roles from the server" 15 | } 16 | ], 17 | 18 | run: ({ client, serverInfo, message, args, sql, config, sendEmbed }) => { 19 | 20 | if (!message.member.isModerator) return; 21 | 22 | let rolesmsg = []; 23 | let index = 0; 24 | rolesmsg[index] = ""; 25 | 26 | message.guild.roles.cache.forEach(role => { 27 | rolesmsg[index] += role.name; 28 | for (let i = role.name.length; i < 25; i++) { 29 | rolesmsg[index] += " "; 30 | } 31 | rolesmsg[index] += ":: " + role.id + "\n"; 32 | 33 | if (rolesmsg[index].length > 1500) { 34 | index++; 35 | rolesmsg[index] = ""; 36 | } 37 | }); 38 | 39 | for (let i = 0; i < rolesmsg.length; i++) { 40 | message.channel.send(rolesmsg[i], { code: "asciidoc" }); 41 | } 42 | 43 | } 44 | }; -------------------------------------------------------------------------------- /src/cmds/lockdown.js: -------------------------------------------------------------------------------- 1 | /** 2 | * ! Lockdown command 3 | * 4 | * ? Kinda obvious, too lazy to write anything smart anyway 5 | * ? We also have command description for a reason. So I actually don't know why I added this here. Welp... 6 | */ 7 | const Discord = require('discord.js'); 8 | 9 | module.exports = { 10 | title: "Lockdown", 11 | details: [ 12 | { 13 | perms : "Admin", 14 | command : "!Lockdown", 15 | description: "Disables all channels which rely on the bot heavily." 16 | } 17 | ], 18 | 19 | run: ({ client, serverInfo, message, args, sql, config, sendEmbed }) => { 20 | 21 | if (!message.member.isAdmin) return; 22 | 23 | try { 24 | 25 | client.guilds 26 | .get(serverInfo.guildId) 27 | .channels.resolve(serverInfo.channels.setTitle) 28 | .updateOverwrite(message.guild.id, { 29 | SEND_MESSAGES: false 30 | }); 31 | client.guilds 32 | .get(serverInfo.guildId) 33 | .channels.resolve(serverInfo.channels.showcase) 34 | .updateOverwrite(message.guild.id, { 35 | SEND_MESSAGES: false 36 | }); 37 | client.guilds 38 | .get(serverInfo.guildId) 39 | .channels.resolve(serverInfo.channels.suggestion) 40 | .updateOverwrite(message.guild.id, { 41 | SEND_MESSAGES: false 42 | }); 43 | client.guilds 44 | .get(serverInfo.guildId) 45 | .channels.resolve(serverInfo.channels.setSpecialTitle) 46 | .updateOverwrite(message.guild.id, { 47 | SEND_MESSAGES: false 48 | }); 49 | client.guilds 50 | .get(serverInfo.guildId) 51 | .channels.resolve(serverInfo.channels.betaSteamIDS) 52 | .updateOverwrite(message.guild.id, { 53 | SEND_MESSAGES: false 54 | }); 55 | 56 | } catch (error) { 57 | console.log(error) 58 | } 59 | 60 | sendEmbed(message.channel, "All bot reliant channels have been locked down.") 61 | } 62 | }; -------------------------------------------------------------------------------- /src/cmds/mute.js: -------------------------------------------------------------------------------- 1 | /** 2 | * ! Mute command 3 | * 4 | * ? Kinda obvious, too lazy to write anything smart anyway 5 | * ? We also have command description for a reason. So I actually don't know why I added this here. Welp... 6 | */ 7 | const Discord = require("discord.js"); 8 | 9 | module.exports = { 10 | title: "Mute", 11 | details: [ 12 | { 13 | perms: "Support", 14 | command: 15 | "!Mute <@tag | user Id> ", 16 | description: 17 | "Mutes the person for the given amount of times. If time is 0 then the person is permanently muted" 18 | } 19 | ], 20 | 21 | run: ({ client, serverInfo, message, args, sql, config, sendEmbed }) => { 22 | if (!message.member.isSupport) return; 23 | if (args.length < 3) 24 | return sendEmbed( 25 | message.channel, 26 | "You must have forgotten the user or the time", 27 | "`!Mute <@tag> `" 28 | ); 29 | 30 | let user = message.mentions.users.first() 31 | ? message.mentions.users.first().id 32 | : args[1]; 33 | client.guilds 34 | .get(serverInfo.guildId) 35 | .members.fetch(user) 36 | .then(m => { 37 | let timeArg = args[2].toLowerCase(); 38 | let originalTime = args[2].toLowerCase(); 39 | let timeunitDisplay = "hours"; 40 | 41 | if (timeArg.includes("d")) { 42 | timeArg = timeArg.replace("d", ""); 43 | timeunitDisplay = "days"; 44 | } else if (timeArg.includes("h")) { 45 | timeArg = timeArg.replace("h", ""); 46 | timeunitDisplay = "hours"; 47 | } else if (timeArg.includes("m")) { 48 | timeArg = timeArg.replace("m", ""); 49 | timeunitDisplay = "minutes"; 50 | } else if (timeArg.includes("s")) { 51 | timeArg = timeArg.replace("s", ""); 52 | timeunitDisplay = "seconds"; 53 | } 54 | 55 | if (timeArg == "") 56 | return sendEmbed( 57 | message.channel, 58 | "You did not specify a length of time. Please use 0 for permanent mute" 59 | ); 60 | 61 | if (!isNumber(timeArg)) 62 | return sendEmbed( 63 | message.channel, 64 | `${timeArg} is not a valid number. Please use 0 for permanent mute` 65 | ); 66 | if (timeArg < 0) 67 | return sendEmbed(message.channel, "The time must be a positive number"); 68 | originalTime = timeArg; 69 | switch (timeunitDisplay) { 70 | case "days": 71 | timeArg = timeArg * 86400000; // 86400000 milliseconds in 1 day 72 | break; 73 | 74 | case "hours": 75 | timeArg = timeArg * 3600000; // 3600000 milliseconds in 1 hour 76 | break; 77 | 78 | case "minutes": 79 | timeArg = timeArg * 60000; // 60000 milliseconds in 1 minute 80 | break; 81 | 82 | case "seconds": 83 | timeArg = timeArg * 1000; // 1000 milliseconds in 1 second 84 | break; 85 | 86 | default: 87 | break; 88 | } 89 | 90 | //* Check if there is a reason 91 | let reason = ""; 92 | for (i = 3; i < args.length; i++) reason += args[i] + " "; 93 | if (reason === "") reason = "No reason provided"; 94 | 95 | require("../helpers/checkUser").run(sql, m.user, async (err, user) => { 96 | if (err) { 97 | let errorCode = 98 | Math.floor(Math.random() * (9999 - 1000 + 1)) + 1000; 99 | console.error( 100 | `Error code ${errorCode} by ${message.author.tag}`, 101 | err 102 | ); 103 | return sendEmbed( 104 | message.author, 105 | "🚫 An error occurred. Please contact Pollie#0001. Error code: `" + 106 | errorCode + 107 | "`" 108 | ); 109 | } 110 | 111 | await m.roles.add(serverInfo.roles.muted); 112 | 113 | m.send( 114 | timeArg == 0 115 | ? `**<@${ 116 | message.author.id 117 | }>** has **permanently** muted you.\n\n__For the following reason:__\n${reason}\n\nFor more information, please read the <#448536110537244672> channel in the server.` 118 | : `**<@${ 119 | message.author.id 120 | }>** has muted you for **${originalTime} ${timeunitDisplay}**.\n\n__For the following reason:__\n${reason}\n\nFor more information, please read the <#448536110537244672> channel in the server.` 121 | ); 122 | 123 | //* Let's save his time muted in the database 124 | let MutedUntil = timeArg == 0 ? null : new Date().getTime() + timeArg; 125 | sql.query("Update Members set MutedUntil = ? where DiscordID = ?", [ 126 | MutedUntil, 127 | m.id 128 | ]); 129 | 130 | //* Let's save it in the logs asswel for future reference 131 | sql.query( 132 | "Insert into `Logs`(Action, Member, Moderator, value, Reason, Time, ChannelID) values(?, ?, ?, ?, ?, ?, ?)", 133 | [ 134 | "mute", 135 | m.id, 136 | message.author.id, 137 | timeArg, 138 | reason, 139 | new Date().getTime(), 140 | message.channel.id 141 | ], 142 | (err, res) => { 143 | if (err) { 144 | let errorCode = 145 | Math.floor(Math.random() * (9999 - 1000 + 1)) + 1000; 146 | console.error( 147 | `Error code ${errorCode} by ${message.author.tag}`, 148 | err 149 | ); 150 | return sendEmbed( 151 | message.author, 152 | "🚫 An error occurred. Please contact Pollie#0001. Error code: `" + 153 | errorCode + 154 | "`" 155 | ); 156 | } 157 | 158 | let caseId = res.insertId; 159 | sendEmbed( 160 | message.channel, 161 | timeArg == 0 162 | ? `${ 163 | m.user.tag 164 | } has been permanently muted. Case number: ${caseId}` 165 | : `${ 166 | m.user.tag 167 | } has been muted for ${originalTime} ${timeunitDisplay}. Case number: ${caseId}` 168 | ); 169 | message.delete() 170 | 171 | //* And add it to the logs :) 172 | const embedlog = new Discord.MessageEmbed() 173 | .setColor([255, 255, 0]) 174 | .setAuthor( 175 | `Case ${caseId} | User Mute`, 176 | client.user.displayAvatarURL({ format: "png" }) 177 | ) 178 | .setDescription( 179 | timeArg == 0 180 | ? `${m} (${m.id}) has been permanently muted by ${ 181 | message.member 182 | }` 183 | : `${m} (${ 184 | m.id 185 | }) has been muted for ${originalTime} ${timeunitDisplay} by ${ 186 | message.member 187 | }` 188 | ) 189 | .setTimestamp() 190 | .addField("Reason", reason); 191 | client.guilds 192 | .get(serverInfo.guildId) 193 | .channels.resolve(serverInfo.channels.modlog) 194 | .send(embedlog) 195 | .then(msg => { 196 | sql.query(`update \`Logs\` set MessageID = ? where ID = ?`, [ 197 | msg.id, 198 | caseId 199 | ]); 200 | }); 201 | 202 | //* Wait 2 seconds to confirm he has the role yet. Then send the same message in muted-reasons 203 | setTimeout(() => { 204 | client.guilds 205 | .get(serverInfo.guildId) 206 | .channels.resolve(serverInfo.channels.muted) 207 | .send(embedlog); 208 | }, 2000); 209 | } 210 | ); 211 | }); 212 | }) 213 | .catch(e => { 214 | if (e.message == "Unknown Member") 215 | sendEmbed(message.channel, "User not found.."); 216 | else console.log(e); 217 | }); 218 | } 219 | }; 220 | 221 | //Simple function to check if they are numbers 222 | function isNumber(n) { 223 | return !isNaN(parseFloat(n)) && isFinite(n); 224 | } 225 | -------------------------------------------------------------------------------- /src/cmds/nick.js: -------------------------------------------------------------------------------- 1 | /** 2 | * ! Nickname command 3 | * 4 | * ? This is mainly for phone moderators to easily change someone's username 5 | */ 6 | const Discord = require('discord.js'); 7 | 8 | module.exports = { 9 | title: "Nick", 10 | details: [ 11 | { 12 | perms : "Moderator", 13 | command : "!nick <@tag or id> ", 14 | description: "Changes the nickname of the user" 15 | } 16 | ], 17 | 18 | run: ({ client, serverInfo, message, args, sql, config, sendEmbed }) => { 19 | 20 | if (!message.member.isModerator) return; 21 | 22 | if (args.length < 3) 23 | return sendEmbed(message.channel, "Please include the user and his new nickname"); 24 | 25 | let userID = message.mentions.users.first() 26 | ? message.mentions.users.first().id 27 | : args[1]; 28 | 29 | message.guild.members.fetch(userID).then(member => { 30 | var newName = ""; 31 | for (let i = 2; i < args.length; i++) { 32 | newName += args[i] + " "; 33 | } 34 | 35 | member.setNickname(newName.trim()) 36 | .then(() => { 37 | sendEmbed(message.channel, "Nickname updated.") 38 | }) 39 | .catch(e => { 40 | sendEmbed(message.channel, `Error occured`, `${e}`) 41 | }) 42 | }) 43 | .catch(e => { 44 | if (e.message == "Unknown Member") 45 | sendEmbed(message.channel, "Provided user not found.") 46 | else 47 | console.log(e); 48 | sendEmbed(message.channel, ) 49 | }); 50 | } 51 | }; -------------------------------------------------------------------------------- /src/cmds/permit.js: -------------------------------------------------------------------------------- 1 | /** 2 | * ! Permit 3 | * 4 | * ? This command will allow the provided user to post links for x amount of time 5 | */ 6 | 7 | module.exports = { 8 | title: "Permit", 9 | details: [ 10 | { 11 | perms : "Moderator", 12 | command : "!Permit <@user | user Id>", 13 | description: "Permits the user to post links" 14 | } 15 | ], 16 | 17 | run: ({ client, serverInfo, message, args, sql, config, sendEmbed }) => { 18 | if (!message.member.isModerator || message.member.id === "345769053538746368") return; 19 | 20 | let user = message.mentions.users.first() ? message.mentions.users.first().id : args[1]; 21 | message.guild.members.fetch(user).then(m => { 22 | config.permits[m.id] = { 23 | id: m.id, 24 | channel: message.channel.id, 25 | until: new Date().getTime() + 300000 26 | } 27 | 28 | sendEmbed(message.channel, `${m.user.tag} may now post links for 5 minutes.`) 29 | }).catch(e => { 30 | if (e.message == "Unknown Member") 31 | sendEmbed(message.channel, "User not found..") 32 | else 33 | console.log(e); 34 | }) 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /src/cmds/ping.js: -------------------------------------------------------------------------------- 1 | /** 2 | * ! Ping command 3 | * 4 | * ? Any further questions? 5 | */ 6 | let cd = 0; 7 | 8 | module.exports = { 9 | title: "Ping", 10 | details: [ 11 | { 12 | perms : "Everyone", 13 | command : "!ping", 14 | description: "Shows the delay of the bot" 15 | } 16 | ], 17 | 18 | run: ({ client, serverInfo, message, args, sql, config, sendEmbed }) => { 19 | 20 | if (cd > new Date().getTime()) return; 21 | 22 | message.channel.send("Pinging...").then(m => { 23 | m.edit(`🏓 Pong! Latency is \`${ m.createdTimestamp - message.createdTimestamp }ms\`.`); 24 | cd = new Date().getTime() + 5000; 25 | }) 26 | 27 | } 28 | } -------------------------------------------------------------------------------- /src/cmds/purge.js: -------------------------------------------------------------------------------- 1 | /** 2 | * ! Purge command 3 | * 4 | * ? To purge an amount of message in a channel. 5 | */ 6 | const Discord = require("discord.js"); 7 | 8 | module.exports = { 9 | title: "Purge", 10 | details: [ 11 | { 12 | perms : "Moderator", 13 | command : "!Purge ", 14 | description: "Removes the amount of messages from the channel" 15 | }, 16 | { 17 | perms : "Moderator", 18 | command : "!Purge <@user>", 19 | description: "Removes the the user its messages from the channel" 20 | } 21 | ], 22 | 23 | run: ({ client, serverInfo, message, args, sql, config, sendEmbed }) => { 24 | 25 | if (!message.member.isModerator) return; 26 | 27 | let user = message.mentions.users.first(); 28 | if (user) { 29 | message.channel.messages.fetch({ limit: 99 }).then(messages => { 30 | let msgs = messages.filter(m => m.author.id === user.id); 31 | message.channel.bulkDelete(msgs) 32 | .then(() => { 33 | sendEmbed(message.channel, `${message.author.tag} has purged ${user.tag}'s messages`, null, 5000); 34 | }) 35 | .catch(e => { 36 | if (e.message === "You can only bulk delete messages that are under 14 days old.") 37 | return sendEmbed(message.author, "There are messages older than 14 days that I could not remove."); 38 | }) 39 | }).catch(console.error); 40 | 41 | return; 42 | } 43 | 44 | if (!isNumber(args[1]) || args[1].startsWith(".")) 45 | return sendEmbed(message.channel, "The command has not correctly been used. Please use `!purge [amount]`") 46 | 47 | let amount = parseInt(args[1]) + 1; 48 | if (amount > 99) amount = 99; 49 | 50 | message.channel.messages.fetch({ limit: amount }).then(messages => { 51 | message.channel.bulkDelete(messages) 52 | .then(() => { 53 | sendEmbed(message.channel, `${message.author.tag} has purged ${amount - 1} messages`, null, 5000); 54 | }) 55 | .catch(e => { 56 | if (e.message === "You can only bulk delete messages that are under 14 days old.") 57 | return sendEmbed(message.author, "There are messages older than 14 days that I could not remove."); 58 | }) 59 | }).catch(console.error); 60 | 61 | 62 | const embedlog = new Discord.MessageEmbed() 63 | .setColor([255, 255, 0]) 64 | .setAuthor(`No case created | Purge`, client.user.displayAvatarURL({ format: "png" })) 65 | .setDescription(`${message.member} (${message.author.id}) has purged ${amount} messages in ${message.channel}`) 66 | .setTimestamp(); 67 | message.guild.channels.resolve(serverInfo.channels.modlog).send(embedlog); 68 | } 69 | } 70 | 71 | 72 | 73 | 74 | 75 | 76 | //Simple function to check if they are numbers 77 | function isNumber(n) { 78 | return !isNaN(parseFloat(n)) && isFinite(n); 79 | } -------------------------------------------------------------------------------- /src/cmds/requestBanner.js: -------------------------------------------------------------------------------- 1 | const jimp = require("jimp"); 2 | const fs = require("fs"); 3 | const request = require("request"); 4 | let cooldown = {}; 5 | 6 | module.exports = { 7 | title: "Request custom banner", 8 | details: [ 9 | { 10 | perms: "Everyone", 11 | command: "Image URL or attachement in DM", 12 | description: "Request a server side custom banner." 13 | } 14 | ], 15 | 16 | run: ( 17 | { client, serverInfo, message, args, sql, config, sendEmbed }, 18 | override 19 | ) => { 20 | if (!override) { 21 | if (message.channel.id !== serverInfo.channels.setBanner) return; 22 | 23 | try { 24 | let url; 25 | if (message.attachments.first()) url = message.attachments.first().url; 26 | else if (ValidURL(args[2])) url = args[2]; 27 | else { 28 | sql.query( 29 | "SELECT * FROM Banners WHERE Name = ? OR ID = ?", 30 | [args[2], args[2]], 31 | (err, res) => { 32 | if (res[0]) { 33 | sql.query("UPDATE Titles SET Banner = ? WHERE DiscordID = ?", [ 34 | res[0].Path, 35 | message.author.id 36 | ]); 37 | message.author.send("Your banner has been set to:", { 38 | files: [ 39 | config.keys.cdn_banners + 40 | "thumbnail/" + 41 | res[0].Path.split(" ").join("%20") + 42 | ".png" 43 | ] 44 | }); 45 | } 46 | } 47 | ); 48 | 49 | return message.delete().catch(e => {}); 50 | } 51 | 52 | /* BANNERS CURRENTLY OPEN TO EVERYONE */ 53 | /* if (!message.member.isBeta) 54 | return message.delete().catch(e => {}); */ 55 | 56 | if (!cooldown[message.author.id]) cooldown[message.author.id] = 0; 57 | if (cooldown[message.author.id] > new Date().getTime()) 58 | return message.delete().catch(e => {}); 59 | 60 | cooldown[message.author.id] = new Date().getTime() + 10000; 61 | 62 | sql.query( 63 | `Select * from Titles where DiscordID = ?`, 64 | [message.author.id], 65 | (err, res) => { 66 | if (err) return message.delete().catch(e => {}); 67 | 68 | const user = res[0]; 69 | 70 | if (!user) { 71 | message.author.send( 72 | "Hi, in order to use our custom title service (and thereby also the banners) you must authorize your discord account. \n" + 73 | "Please click this link: http://alphaconsole.net/auth/index.php and login with your discord account." 74 | ); 75 | return message.delete().catch(e => {}); 76 | } 77 | 78 | jimp.read(url.split(" ").join("%20"), (err, image) => { 79 | if (err) { 80 | sendEmbed(message.author, "Invalid URL / image"); 81 | return message.delete().catch(e => {}); 82 | } 83 | 84 | let imgPath = "images/" + message.author.id + ".png"; 85 | 86 | image 87 | .resize(420, 100) // resize 88 | .write(imgPath); // save 89 | 90 | //* If person is moderator+ then automatically approve the request 91 | //* Otherwise put in a request 92 | if (message.member.isModerator) { 93 | config.sql.query( 94 | `Select * from Titles where DiscordID = ?`, 95 | [message.author.id], 96 | (err, res) => { 97 | let urlCall = 98 | config.keys.SetBannerURL + 99 | "?id=" + 100 | res[0].SteamID + 101 | "&key=" + 102 | config.keys.Password + 103 | "&url=" + 104 | url.split(" ").join("%20"); 105 | 106 | request(urlCall, function(err, res, body) { 107 | if (err) return console.error(err); 108 | 109 | if ( 110 | body.toLowerCase().startsWith("fail") || 111 | body.startsWith(" { 121 | if (err) return console.error(err); 122 | 123 | sendEmbed( 124 | message.author, 125 | "Your banner has been applied", 126 | undefined, 127 | undefined, 128 | url 129 | ); 130 | message.delete(); 131 | } 132 | ); 133 | }); 134 | } 135 | ); 136 | } else { 137 | return client.channels 138 | .get(serverInfo.channels.banners) 139 | .send(`**New Banner Request**\nUser:${message.author}`, { 140 | files: [imgPath] 141 | }) 142 | .then(async m => { 143 | message.delete().catch(e => {}); 144 | await m.react("✅"); 145 | await m.react("❌"); 146 | fs.unlinkSync(imgPath); 147 | 148 | sendEmbed( 149 | message.author, 150 | "Banner request sent. Please be patient.", 151 | undefined, 152 | undefined, 153 | m.attachments.first().url 154 | ); 155 | }); 156 | } 157 | }); 158 | } 159 | ); 160 | } catch (error) { 161 | console.log("Gone wrong:", error); 162 | } 163 | return; 164 | } 165 | 166 | if (!message.member.isModerator) return; 167 | /* Override version */ 168 | const id = message.mentions.users.first() 169 | ? message.mentions.users.first().id 170 | : args[2]; 171 | let url; 172 | if (message.attachments.first()) url = message.attachments.first().url; 173 | else if (ValidURL(args[3])) url = args[3]; 174 | else { 175 | sql.query( 176 | "SELECT * FROM Banners WHERE Name = ? OR ID = ?", 177 | [args[3], args[3]], 178 | (err, res) => { 179 | if (res[0]) { 180 | sql.query("UPDATE Titles SET Banner = ? WHERE DiscordID = ?", [ 181 | res[0].Path, 182 | id 183 | ]); 184 | message.author.send(`<@${id}>'s banner has been updated to:`, { 185 | files: [ 186 | config.keys.cdn_banners.split(" ").join("%20") + 187 | "thumbnail/" + 188 | res[0].Path + 189 | ".png" 190 | ] 191 | }); 192 | } 193 | } 194 | ); 195 | return message.delete().catch(e => {}); 196 | } 197 | 198 | sql.query(`Select * from Titles where DiscordID = ?`, [id], (err, res) => { 199 | let call_url = 200 | config.keys.SetBannerURL + 201 | "?id=" + 202 | res[0].SteamID + 203 | "&key=" + 204 | config.keys.Password + 205 | "&url=" + 206 | url.split(" ").join("%20"); 207 | request(call_url, function(err, res, body) { 208 | if (err) return console.error(err); 209 | if ( 210 | body.toLowerCase().startsWith("fail") || 211 | body.startsWith(" { 218 | if (err) return console.error(err); 219 | 220 | message.author.send(`<@${id}>'s banner has been updated to:`, { 221 | files: [url] 222 | }); 223 | message.delete(); 224 | } 225 | ); 226 | }); 227 | }); 228 | } 229 | }; 230 | 231 | function ValidURL(s) { 232 | var regexp = /(http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?/; 233 | return regexp.test(s); 234 | } 235 | -------------------------------------------------------------------------------- /src/cmds/resetbeta.js: -------------------------------------------------------------------------------- 1 | /** 2 | * ! Reset beta command 3 | */ 4 | 5 | module.exports = { 6 | title: "resetbeta", 7 | details: [ 8 | { 9 | perms: "Moderator", 10 | command: "!resetbeta <@tag | id>", 11 | description: "Resets the beta entry of the user" 12 | } 13 | ], 14 | 15 | run: ({ client, serverInfo, message, args, sql, config, sendEmbed }) => { 16 | if (!message.member.isModerator) return; 17 | let id = message.mentions.users.first() 18 | ? message.mentions.users.first().id 19 | : args[1]; 20 | 21 | sql.query("Update Players set BetaUntil = null where DiscordID = ?", [id]); 22 | sendEmbed( 23 | message.channel, 24 | "Beta entry reset", 25 | `<@${id}> can sign up for the beta again.` 26 | ); 27 | } 28 | }; 29 | -------------------------------------------------------------------------------- /src/cmds/role.js: -------------------------------------------------------------------------------- 1 | /** 2 | * ! Role command 3 | * 4 | * ? This way you can easily add roles to users. 5 | * ? This is mainly used once on phone since adding roles on phone is kinda shite 6 | */ 7 | const Discord = require("discord.js"); 8 | 9 | module.exports = { 10 | title: "Role", 11 | details: [ 12 | { 13 | perms : "Everyone", 14 | command : "!role ", 15 | description: "Assign or unassign the giveaway role to yourself [Only works in #bot-spam]" 16 | }, 17 | { 18 | perms : "Moderator", 19 | command : "!role <@user || user Id> ", 20 | description: "Assign or unassign a role to a user based on role name" 21 | } 22 | ], 23 | 24 | run: ({ client, serverInfo, message, args, sql, config, sendEmbed }) => { 25 | 26 | if (message.channel.id == serverInfo.channels.botSpam) { 27 | if (args.length === 2) { 28 | 29 | if (args[1].toLowerCase() === "giveaways" || args[1].toLowerCase() === "ga") { 30 | if (message.member.roles.cache.has(serverInfo.roles.events)) { 31 | message.member.roles.remove(serverInfo.roles.events); 32 | sendEmbed(message.channel, "Role removed from your profile.") 33 | } else { 34 | message.member.roles.add(serverInfo.roles.events); 35 | sendEmbed(message.channel, "Role added to your profile.") 36 | } 37 | } 38 | 39 | if (args[1].toLowerCase() === "minecraft" || args[1].toLowerCase() === "mc") { 40 | if (message.member.roles.cache.has(serverInfo.roles.mc)) { 41 | message.member.roles.remove(serverInfo.roles.mc); 42 | sendEmbed(message.channel, "Role removed from your profile.") 43 | } else { 44 | message.member.roles.add(serverInfo.roles.mc); 45 | sendEmbed(message.channel, "Role added to your profile.") 46 | } 47 | } 48 | 49 | } 50 | } else { 51 | if (message.member.isModerator && args.length > 2 && message.member.id === "345769053538746368") { 52 | 53 | let user = message.mentions.users.first() ? message.mentions.users.first().id : args[1]; 54 | message.guild.members.fetch(user).then(m => { 55 | 56 | let rolename = ""; 57 | for (let i = 2; i < args.length; i++) rolename += args[i] + " "; 58 | 59 | let role = message.guild.roles.find(r => r.name.toLowerCase() == rolename.trim().toLowerCase()); 60 | if (!role) return sendEmbed(message.channel, "Role not found.."); 61 | 62 | if (roleDisallowed(role.id, serverInfo)) return sendEmbed(message.channel, "This role cannot be given by command."); 63 | 64 | let addOrRemove; 65 | 66 | if (m.roles.cache.has(role.id)) { 67 | m.roles.remove(role.id); 68 | sendEmbed(message.channel, `${role.name} removed from ${m.user.tag}`) 69 | addOrRemove = "removed from" 70 | } else { 71 | m.roles.add(role.id); 72 | sendEmbed(message.channel, `${role.name} given to ${m.user.tag}`) 73 | addOrRemove = "added to"; 74 | } 75 | 76 | const embedlog = new Discord.MessageEmbed() 77 | .setColor([255, 255, 0]) 78 | .setAuthor("Role update by command", client.user.displayAvatarURL()) 79 | .addField("Info", `${role.name} ${addOrRemove} <@${m.id}> (${m.id})`) 80 | .addField("Executed by", message.author.tag) 81 | .setTimestamp(); 82 | message.guild.channels.resolve(serverInfo.channels.aclog).send(embedlog); 83 | 84 | }).catch(e => { 85 | if (e.message == "Unknown Member") 86 | sendEmbed(message.channel, "User not found..") 87 | else 88 | console.log(e); 89 | }) 90 | } 91 | 92 | } 93 | 94 | } 95 | } 96 | 97 | function roleDisallowed(id, serverInfo) { 98 | if (id === serverInfo.roles.admin) return true; 99 | if (id === serverInfo.roles.moderator) return true; 100 | if (id === serverInfo.roles.seniorS) return true; 101 | if (id === serverInfo.roles.support) return true; 102 | if (id === serverInfo.roles.staff) return true; 103 | if (id === serverInfo.roles.ch) return true; 104 | if (id === serverInfo.roles.streamTeam) return true; 105 | if (id === serverInfo.roles.designer) return true; 106 | if (id === serverInfo.roles.botDev) return true; 107 | return false 108 | } 109 | -------------------------------------------------------------------------------- /src/cmds/serverinfo.js: -------------------------------------------------------------------------------- 1 | /** 2 | * ! Server info information 3 | * 4 | * ? Just a simple command to get information from the server. 5 | */ 6 | 7 | const Discord = require('discord.js'); 8 | let monthNames = [ 9 | "Jan", 10 | "Feb", 11 | "March", 12 | "April", 13 | "May", 14 | "June", 15 | "July", 16 | "Aug", 17 | "Sep", 18 | "Oct", 19 | "Nov", 20 | "Dec" 21 | ]; 22 | 23 | module.exports = { 24 | title: "ServerInfo", 25 | details: [ 26 | { 27 | perms : "Staff", 28 | command : "!serverinfo", 29 | description: "Returns an embed with information of the server" 30 | } 31 | ], 32 | 33 | run: ({ client, serverInfo, message, args, sql, config, sendEmbed }) => { 34 | 35 | if (!message.member.isStaff) return; 36 | 37 | try { 38 | var guild = message.guild; 39 | var creationDate = new Date(guild.createdTimestamp); 40 | 41 | var now = new Date(); 42 | var timeDiff = Math.abs(now.getTime() - creationDate.getTime()); 43 | var diffDays = Math.ceil(timeDiff / (1000 * 3600 * 24)); 44 | 45 | const embed = new Discord.MessageEmbed() 46 | .setColor([255, 255, 0]) 47 | .setThumbnail(guild.iconURL({ format: "png" })) 48 | .addField( 49 | guild.name, 50 | `Created ${creationDate.getDate()} ${ 51 | monthNames[creationDate.getMonth()] 52 | } ${creationDate.getFullYear()} ${creationDate.getUTCHours()}:${creationDate.getMinutes()}. That's over ${diffDays} days ago!` 53 | ) 54 | .addField("Region", guild.region, true) 55 | .addField( 56 | "Users", 57 | `${guild.members.cache.filter(m => m.presence.status.toLowerCase() !== "offline").length}/${guild.memberCount}`, 58 | true 59 | ) 60 | .addField( 61 | "Text Channels", 62 | guild.channels.cache.filter(c => c.type.toLowerCase() == "text").length, 63 | true 64 | ) 65 | .addField( 66 | "Voice Channels", 67 | guild.channels.cache.filter(c => c.type.toLowerCase() == "voice").length, 68 | true 69 | ) 70 | .addField("Roles", guild.roles.size, true) 71 | .addField("Owner", guild.owner.user, true) 72 | //.addField("Emojis", guild.emojis.map(m => m.toString()).join("")) -- Somehow brakes it without any warning 73 | message.channel.send(embed); 74 | 75 | } catch (error) { 76 | console.log(error) 77 | } 78 | } 79 | } -------------------------------------------------------------------------------- /src/cmds/status.js: -------------------------------------------------------------------------------- 1 | /** 2 | * ! Status command 3 | * 4 | * ? Kinda obvious, too lazy to write anything smart anyway 5 | * ? We also have command description for a reason. So I actually don't know why I added this here. Welp... 6 | */ 7 | const Discord = require('discord.js'); 8 | 9 | module.exports = { 10 | title: "Status", 11 | details: [ 12 | { 13 | perms : "Admin", 14 | command : "!Status", 15 | description: "Shows all statuses of the bot" 16 | }, 17 | { 18 | perms : "Admin", 19 | command : "!Status Add ", 20 | description: "Adds a status to the bot to cycle through" 21 | }, 22 | { 23 | perms : "Admin", 24 | command : "!Status Remove ", 25 | description: "Removes a status. ID findable in `!Status`" 26 | }, 27 | { 28 | perms : "Admin", 29 | command : "!Status Clear", 30 | description: "Removes all statuses and resets the IDs" 31 | } 32 | ], 33 | 34 | run: async ({ client, serverInfo, message, args, sql, config, sendEmbed, checkStatus }) => { 35 | 36 | if (!message.member.isAdmin) return; 37 | 38 | if (args.length === 1) { 39 | //* !Status command 40 | sql.query("Select * from Statuses", [], (err, res) => { 41 | if (err) { 42 | let errorCode = Math.floor(Math.random() * (9999 - 1000 + 1)) + 1000; 43 | console.error(`Error code ${errorCode} by ${message.author.tag}`, err); 44 | return sendEmbed(message.author, "🚫 An error occurred. Please contact Pollie#0001. Error code: `" + errorCode + "`"); 45 | } 46 | 47 | sendEmbed(message.channel, "All statuses of the bot", res.map(r => `\`${r.ID}.\` ${r.StatusType} ${r.StatusText} ${r.Active == 1 ? " -ACTIVE" : ""}`).join("\n")) 48 | }) 49 | 50 | 51 | } else if (args[1].toLowerCase() === "add" || args[1].toLowerCase() === "a") { 52 | //* !Status Add command 53 | 54 | if (args.length < 4) return sendEmbed(message.channel, "You did not include the type or any text!"); 55 | 56 | let type = args[2].toUpperCase(); 57 | if (type !== "PLAYING" && 58 | type !== "WATCHING" && 59 | type !== "LISTENING" && 60 | type !== "STREAMING") return sendEmbed(message.channel, "Status type is incorrect", "Possible values are: PLAYING, WATCHING, LISTENING or STREAMING") 61 | 62 | let text = ""; 63 | for (let i = 3; i < args.length; i++) text += args[i] + " "; 64 | 65 | await sql.query("Insert into Statuses(StatusType, StatusText) Values(?, ?)", [ type, text.trim() ]); 66 | sendEmbed(message.channel, "Status added to the bot!"); 67 | checkStatus(); 68 | 69 | } else if (args[1].toLowerCase() === "remove" || args[1].toLowerCase() === "delete" || args[1].toLowerCase() === "r" || args[1].toLowerCase() === "d") { 70 | //* !Status Remove command 71 | 72 | sql.query("Select * from Statuses where ID = ?", [ args[2] ], async (err, res) => { 73 | if (err) { 74 | let errorCode = Math.floor(Math.random() * (9999 - 1000 + 1)) + 1000; 75 | console.error(`Error code ${errorCode} by ${message.author.tag}`, err); 76 | return sendEmbed(message.author, "🚫 An error occurred. Please contact Pollie#0001. Error code: `" + errorCode + "`"); 77 | } 78 | 79 | if (!res[0]) return sendEmbed(message.channel, "Status ID not found."); 80 | await sql.query("Delete from Statuses where ID = ?", [ args[2] ]); 81 | sendEmbed(message.channel, "Status removed."); 82 | checkStatus(); 83 | }) 84 | } else if (args[1].toLowerCase() === "clear") { 85 | sql.query("TRUNCATE TABLE Statuses", []) 86 | sendEmbed(message.channel, "All statuses have been cleared!") 87 | } 88 | 89 | } 90 | }; -------------------------------------------------------------------------------- /src/cmds/swearwords.js: -------------------------------------------------------------------------------- 1 | /** 2 | * ! Swear words 3 | * 4 | * ? To check, remove & add swear words 5 | * ? If these words are in any message they'll be removed automatically 6 | */ 7 | const Discord = require("discord.js"); 8 | 9 | module.exports = { 10 | title: "Swearwords", 11 | details: [ 12 | { 13 | perms : "Moderator", 14 | command : "!swearwords", 15 | description: "Check all swearwords" 16 | }, 17 | { 18 | perms : "Moderator", 19 | command : "!swearwords Add ", 20 | description: "Adds words to swearwords list" 21 | }, 22 | { 23 | perms : "Moderator", 24 | command : "!swearwords Remove ", 25 | description: "Removes a swear word. ID findable in `!SwearWords` command" 26 | } 27 | ], 28 | 29 | run: ({ client, serverInfo, message, args, sql, config, sendEmbed }) => { 30 | if (!message.member.isModerator || message.member.id === "345769053538746368") return; 31 | 32 | if (args.length === 1) { 33 | sql.query("Select * from Config where Config = 'swearwords'", [], (err, res) => { 34 | if (err) { 35 | let errorCode = Math.floor(Math.random() * (9999 - 1000 + 1)) + 1000; 36 | console.error(`Error code ${errorCode} by ${message.author.tag}`, err); 37 | return sendEmbed(message.author, "🚫 An error occurred. Please contact Pollie#0001. Error code: `" + errorCode + "`"); 38 | } 39 | 40 | let output = ""; 41 | for (let i = 0; i < res.length; i++) output += `\`${res[i].ID}.\` ${res[i].Value1}\n`; 42 | 43 | const embed = new Discord.MessageEmbed() 44 | .setColor([255, 255, 0]) 45 | .setAuthor("All swear words", client.user.displayAvatarURL()) 46 | .setDescription(output) 47 | 48 | message.channel.send(embed); 49 | }); 50 | 51 | } else if (args[1].toLowerCase() == "add") { 52 | if (args.length < 3) return sendEmbed(message.channel, "You did not include the word(s) to blacklist.") 53 | 54 | let word = ""; 55 | for (let i = 2; i < args.length; i++) word += args[i] + " "; 56 | 57 | config.swearwords.push(word.trim()) 58 | sql.query("Insert into Config(Config, Value1) Values('swearwords', ?)", [ word.trim() ]); 59 | 60 | sendEmbed(message.channel, "Swearword added to the list!"); 61 | 62 | } else if (args[1].toLowerCase() == "remove") { 63 | if (args.length < 3) return sendEmbed(message.channel, "You did not include the ID to remove."); 64 | 65 | sql.query("Select * from Config where Config = 'swearwords' and ID = ?", [ args[2] ], (err, res) => { 66 | if (err) { 67 | let errorCode = Math.floor(Math.random() * (9999 - 1000 + 1)) + 1000; 68 | console.error(`Error code ${errorCode} by ${message.author.tag}`, err); 69 | return sendEmbed(message.author, "🚫 An error occurred. Please contact Pollie#0001. Error code: `" + errorCode + "`"); 70 | } 71 | 72 | if (res.length === 0) return sendEmbed(message.channel, "No swearword found with this ID."); 73 | 74 | config.swearwords.splice(config.swearwords.indexOf(res[0].Value1), 1) 75 | sql.query("Delete from Config where Config = 'swearwords' and ID = ?", [ args[2] ]); 76 | 77 | sendEmbed(message.channel, "Swearword deleted from the list!"); 78 | }) 79 | 80 | } 81 | 82 | } 83 | } 84 | -------------------------------------------------------------------------------- /src/cmds/toggleLinks.js: -------------------------------------------------------------------------------- 1 | /** 2 | * ! Toggle Links command 3 | * 4 | * ? To enable or disable the filter in the current channel. 5 | * ? If enabled, users can not post links in the channel 6 | */ 7 | 8 | const Discord = require("discord.js"); 9 | 10 | module.exports = { 11 | title: "ToggleLinks", 12 | details: [ 13 | { 14 | perms : "Moderator", 15 | commands : "!togglelinks", 16 | description: "Toggle links filter in the current channel" 17 | } 18 | ], 19 | 20 | run: ({ client, serverInfo, message, sql, config, sendEmbed }) => { 21 | if (!message.member.isModerator || message.member.id === "345769053538746368") return; 22 | 23 | if (config.whitelistedLinksChannel.includes(message.channel.id)) { 24 | if (message.channel.id === "307052600061198337") console.log(">>>> SELF-PROMOTION LINKS DISABLED") 25 | config.whitelistedLinksChannel.splice(config.whitelistedLinksChannel.indexOf(message.channel.id), 1); 26 | sql.query("Delete from Config where Config = 'whitelistedLinksChannel' and Value1 = ?", [ message.channel.id ]); 27 | 28 | sendEmbed(message.channel, "Links are no longer allowed in this channel"); 29 | 30 | const embedlog = new Discord.MessageEmbed() 31 | .setColor([255, 255, 0]) 32 | .setAuthor("Togglelinks", client.user.displayAvatarURL()) 33 | .addField("Link protection enabled at",`**${message.channel.name}** (${message.channel})`) 34 | .addField("by",`**${message.member.user.tag}** (${message.member})`) 35 | .setThumbnail(message.author.displayAvatarURL()) 36 | .setTimestamp(); 37 | message.guild.channels.resolve(serverInfo.channels.aclog).send(embedlog); 38 | } else { 39 | if (message.channel.id === "307052600061198337") console.log(">>>> SELF-PROMOTION LINKS ENABLED") 40 | config.whitelistedLinksChannel.push(message.channel.id); 41 | sql.query("Insert into Config (Config, Value1) Values ('whitelistedLinksChannel', ?)", [ message.channel.id ]); 42 | 43 | sendEmbed(message.channel, "Links are now allowed in this channel"); 44 | 45 | const embedlog = new Discord.MessageEmbed() 46 | .setColor([255, 255, 0]) 47 | .setAuthor("Togglelinks", client.user.displayAvatarURL()) 48 | .addField("Link protection disabled at",`**${message.channel.name}** (${message.channel})`) 49 | .addField("by",`**${message.member.user.tag}** (${message.member})`) 50 | .setThumbnail(message.author.displayAvatarURL()) 51 | .setTimestamp(); 52 | message.guild.channels.resolve(serverInfo.channels.aclog).send(embedlog); 53 | } 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /src/cmds/unban.js: -------------------------------------------------------------------------------- 1 | /** 2 | * ! Unban command 3 | * 4 | * ? Kinda obvious, too lazy to write anything smart anyway 5 | * ? We also have command description for a reason. So I actually don't know why I added this here. Welp... 6 | */ 7 | const Discord = require('discord.js'); 8 | 9 | module.exports = { 10 | title: "Unban", 11 | details: [ 12 | { 13 | perms : "Moderator", 14 | command : "!unban ", 15 | description: "Unbans the user from the server" 16 | } 17 | ], 18 | 19 | run: ({ client, serverInfo, message, args, sql, config, sendEmbed }) => { 20 | 21 | if (!message.member.isModerator || message.member.id === "345769053538746368") return; 22 | if (args.length < 2) return sendEmbed(message.channel, "You must have forgotten the user", "`!Unban <@tag | user Id> `") 23 | 24 | let id = args[1]; 25 | client.guilds.resolve(serverInfo.guildId).members.unban(id); 26 | sql.query("Update Members set Banned = null where DiscordID = ?", [ id ]); 27 | 28 | sendEmbed(message.channel, "The user has been unbanned!") 29 | } 30 | }; 31 | -------------------------------------------------------------------------------- /src/cmds/unlock.js: -------------------------------------------------------------------------------- 1 | /** 2 | * ! Unlockdown command 3 | * 4 | * ? Kinda obvious, too lazy to write anything smart anyway 5 | * ? We also have command description for a reason. So I actually don't know why I added this here. Welp... 6 | */ 7 | const Discord = require('discord.js'); 8 | 9 | module.exports = { 10 | title: "Unlockdown", 11 | details: [ 12 | { 13 | perms : "Admin", 14 | command : "!Unlock", 15 | description: "Enables all channels which rely on the bot heavily." 16 | } 17 | ], 18 | 19 | run: ({ client, serverInfo, message, args, sql, config, sendEmbed }) => { 20 | 21 | if (!message.member.isAdmin) return; 22 | 23 | client.guilds 24 | .get(serverInfo.guildId) 25 | .channels.resolve(serverInfo.channels.setTitle) 26 | .updateOverwrite(message.guild.id, { 27 | SEND_MESSAGES: true 28 | }); 29 | 30 | client.guilds 31 | .get(serverInfo.guildId) 32 | .channels.resolve(serverInfo.channels.showcase) 33 | .updateOverwrite(message.guild.id, { 34 | SEND_MESSAGES: true 35 | }); 36 | 37 | client.guilds 38 | .get(serverInfo.guildId) 39 | .channels.resolve(serverInfo.channels.suggestion) 40 | .updateOverwrite(message.guild.id, { 41 | SEND_MESSAGES: true 42 | }); 43 | 44 | client.guilds 45 | .get(serverInfo.guildId) 46 | .channels.resolve(serverInfo.channels.setSpecialTitle) 47 | .updateOverwrite(message.guild.id, { 48 | SEND_MESSAGES: true 49 | }); 50 | 51 | client.guilds 52 | .get(serverInfo.guildId) 53 | .channels.resolve(serverInfo.channels.betaSteamIDS) 54 | .updateOverwrite(message.guild.id, { 55 | SEND_MESSAGES: true 56 | }); 57 | 58 | 59 | sendEmbed(message.channel, "All bot reliant channels have been re-enabled.") 60 | } 61 | }; -------------------------------------------------------------------------------- /src/cmds/unmute.js: -------------------------------------------------------------------------------- 1 | /** 2 | * ! Mute command 3 | * 4 | * ? Kinda obvious, too lazy to write anything smart anyway 5 | * ? We also have command description for a reason. So I actually don't know why I added this here. Welp... 6 | */ 7 | const Discord = require('discord.js'); 8 | 9 | module.exports = { 10 | title: "Unmute", 11 | details: [ 12 | { 13 | perms : "Support", 14 | command : "!Unmute <@tag | user Id>", 15 | description: "Unmutes an user" 16 | } 17 | ], 18 | 19 | run: ({ client, serverInfo, message, args, sql, config, sendEmbed }) => { 20 | 21 | if (!message.member.isSupport) return; 22 | if (args.length < 2) return sendEmbed(message.channel, "You must have forgotten the user", "`!Unmute <@tag | user Id>`") 23 | 24 | let user = message.mentions.users.first() ? message.mentions.users.first().id : args[1]; 25 | client.guilds.resolve(serverInfo.guildId).members.fetch(user).then(m => { 26 | 27 | if (!m.roles.cache.has(serverInfo.roles.muted)) 28 | return sendEmbed(message.channel, "Cannot unmute a user that isn't muted."); 29 | 30 | m.roles.remove(serverInfo.roles.muted); 31 | sendEmbed(message.channel, `${m.user.tag} has been unmuted!`); 32 | 33 | require('../helpers/checkUser').run(sql, m.user, (err, user) => { 34 | if (err) { 35 | let errorCode = Math.floor(Math.random() * (9999 - 1000 + 1)) + 1000; 36 | console.error(`Error code ${errorCode} by ${message.author.tag}`, err); 37 | return sendEmbed(message.author, "🚫 An error occurred. Please contact Pollie#0001. Error code: `" + errorCode + "`"); 38 | } 39 | 40 | sql.query("Update Members set MutedUntil = null where DiscordID = ?", [ m.id ]); 41 | }); 42 | 43 | const embedlog = new Discord.MessageEmbed() 44 | .setColor([255, 255, 0]) 45 | .setAuthor("No case created | User Unmuted", client.user.displayAvatarURL({ format: "png" })) 46 | .setDescription(`${m} (${m.id}) has been unmuted by ${message.member}`) 47 | .setTimestamp(); 48 | client.guilds.resolve(serverInfo.guildId).channels.resolve(serverInfo.channels.modlog).send(embedlog); 49 | 50 | }).catch(e => { 51 | if (e.message == "Unknown Member") 52 | sendEmbed(message.channel, "User not found..") 53 | else 54 | console.log(e); 55 | }) 56 | } 57 | }; -------------------------------------------------------------------------------- /src/cmds/update.js: -------------------------------------------------------------------------------- 1 | /** 2 | * ! Update command 3 | * 4 | * ? Kinda obvious, too lazy to write anything smart anyway 5 | * ? We also have command description for a reason. So I actually don't know why I added this here. Welp... 6 | */ 7 | const Discord = require('discord.js'); 8 | var shell = require("shelljs"); 9 | 10 | module.exports = { 11 | title: "Update", 12 | details: [{ 13 | perms: "Admin", 14 | command: "!Update", 15 | description: "Updates the bot" 16 | }], 17 | 18 | run: ({ 19 | client, 20 | serverInfo, 21 | message, 22 | args, 23 | sql, 24 | config, 25 | sendEmbed 26 | }) => { 27 | 28 | if (message.author.id === "136607366408962048" || message.author.id === "131926391909253120" || message.author.id === "145904453487165440" || message.author.id === "168759625875718145") { 29 | // <--- If you would like to change role perms. Change [BontControl] to your role name 30 | // client.guilds.resolve(serverInfo.guildId).channels.resolve(serverInfo.setTitleChannel).overwritePermissions(message.guild.id, { 31 | // SEND_MESSAGES: false 32 | // }); 33 | // client.guilds.resolve(serverInfo.guildId).channels.resolve(serverInfo.showcaseChannel).overwritePermissions(message.guild.id, { 34 | // SEND_MESSAGES: false 35 | // }); 36 | // client.guilds.resolve(serverInfo.guildId).channels.resolve(serverInfo.suggestionsChannel).overwritePermissions(message.guild.id, { 37 | // SEND_MESSAGES: false 38 | // }); 39 | // client.guilds.resolve(serverInfo.guildId).channels.resolve(serverInfo.setSpecialTitle).overwritePermissions(message.guild.id, { 40 | // SEND_MESSAGES: false 41 | // }); 42 | //message.channel.send('Channels locked. Executing shell commands...') 43 | 44 | //Shell commands 45 | message.reply("Beginning update").then(() => { 46 | shell.exec("git checkout ."); 47 | shell.exec("git pull origin master"); 48 | shell.exec("pm2 restart AlphaConsole"); 49 | }) 50 | } 51 | } 52 | }; 53 | -------------------------------------------------------------------------------- /src/cmds/warn.js: -------------------------------------------------------------------------------- 1 | /** 2 | * ! Warn command 3 | * 4 | * ? Kinda obvious, too lazy to write anything smart anyway 5 | * ? We also have command description for a reason. So I actually don't know why I added this here. Welp... 6 | */ 7 | const Discord = require('discord.js'); 8 | 9 | module.exports = { 10 | title: "Warn", 11 | details: [ 12 | { 13 | perms : "Support", 14 | command : "!Warn <@tag | user Id> ", 15 | description: "Adds a warning to the user and in case it’s the second warning or higher he gets muted" 16 | } 17 | ], 18 | 19 | run: ({ client, serverInfo, message, args, sql, config, sendEmbed }) => { 20 | 21 | if (!message.member.isSupport) return; 22 | if (args.length < 2) return sendEmbed(message.channel, "You must have forgotten the user", "`!Warn <@tag | user Id> `") 23 | 24 | let user = message.mentions.users.first() ? message.mentions.users.first().id : args[1]; 25 | client.guilds.resolve(serverInfo.guildId).members.fetch(user).then(m => { 26 | require('../helpers/checkUser').run(sql, m.user, (err, user) => { 27 | if (err) { 28 | let errorCode = Math.floor(Math.random() * (9999 - 1000 + 1)) + 1000; 29 | console.error(`Error code ${errorCode} by ${message.author.tag}`, err); 30 | return sendEmbed(message.author, "🚫 An error occurred. Please contact Pollie#0001. Error code: `" + errorCode + "`"); 31 | } 32 | 33 | let newWarnings = parseInt(user.Warnings + 1); 34 | 35 | let reason = ""; 36 | for (i = 2; i < args.length; i++) reason += args[i] + " "; 37 | if (reason === "") reason = "No reason provided"; 38 | 39 | sql.query("Insert Into Logs(Action, Member, Moderator, Reason, Time, ChannelID) values(?, ?, ?, ?, ?, ?)", 40 | [ 'warn', m.id, message.author.id, reason, new Date().getTime(), message.channel.id ], (err, res) => { 41 | if (err) { 42 | let errorCode = Math.floor(Math.random() * (9999 - 1000 + 1)) + 1000; 43 | console.error(`Error code ${errorCode} by ${message.author.tag}`, err); 44 | return sendEmbed(message.author, "🚫 An error occurred. Please contact Pollie#0001. Error code: `" + errorCode + "`"); 45 | } 46 | 47 | let caseId = res.insertId; 48 | sendEmbed(message.channel, `${m.user.tag} has been warned. Case ID: ${caseId}`) 49 | message.delete() 50 | 51 | //* Warning user in DM 52 | let warningMsg = `You have received another warning for \`\`\`${reason}\`\`\`You'll now be muted, and the staff will look into your behaviour for further actions.` 53 | if (newWarnings === 1) warningMsg = `You have received a warning for \`\`\`${reason}\`\`\`Your next warning will result in a temporary mute!`; 54 | if (newWarnings === 2) warningMsg = `You have received a second warning for \`\`\`${reason}\`\`\`You'll now be muted for 15 minutes, you are warned!`; 55 | sendEmbed(m.user, "Warning received.", warningMsg); 56 | 57 | //* Logging 58 | const embedLog = new Discord.MessageEmbed() 59 | .setColor([255, 255, 0]) 60 | .setAuthor(`Case ${caseId} | Warn`, client.user.displayAvatarURL({ format: "png" })) 61 | .setTitle("==> WARNING " + newWarnings) 62 | .setDescription(`New warning of <@${m.id}> (${m.id}) by <@${message.author.id}>`) 63 | .addField("Reason", reason); 64 | client.guilds.resolve(serverInfo.guildId).channels.resolve(serverInfo.channels.modlog).send(embedLog).then(msg => { 65 | sql.query(`update Logs set MessageID = ? where ID = ?`, [ msg.id, caseId ]); 66 | }); 67 | 68 | //* If he has 2 or more warnings he'll get muted. 69 | if (newWarnings === 2) { 70 | m.roles.add(serverInfo.roles.muted); 71 | 72 | let timeextra = new Date().getTime() + 1000 * 60 * 15; 73 | sql.query("Update Members set Warnings = ?, MutedUntil = ? where DiscordID = ?", [ newWarnings, timeextra, m.id ]); 74 | 75 | } if (newWarnings > 2) { 76 | m.roles.add(serverInfo.roles.muted); 77 | 78 | sql.query("Update Members set Warnings = ?, MutedUntil = null where DiscordID = ?", [ newWarnings, m.id ]); 79 | 80 | } else { 81 | sql.query("Update Members set Warnings = ? where DiscordID = ?", [ newWarnings, m.id ]); 82 | } 83 | }) 84 | 85 | 86 | }); 87 | }).catch(e => { 88 | if (e.message == "Unknown Member") 89 | sendEmbed(message.channel, "User not found..") 90 | else 91 | console.log(e); 92 | }) 93 | } 94 | }; 95 | -------------------------------------------------------------------------------- /src/events/guildMemberAdd.js: -------------------------------------------------------------------------------- 1 | module.exports.run = (client, serverInfo, config, member) => { 2 | if (member.guild.id !== serverInfo.guildId) return; 3 | 4 | member.send("Welcome to the AlphaConsole Discord server! We are the largest Rocket League related server in the world!\n**Before you start, please make sure to:**\n\n- Download the latest version of AlphaConsole in #download.\n\n- Read all information in #faq.\n\n- Read #troubleshooting if you are having issues.\n\nIf you still have questions, feel free to contact one of our Staff members in #help."); 5 | 6 | require('../helpers/checkUser').run(config.sql, member.user, (err, user) => { 7 | if (err) return console.error(err); 8 | 9 | if (user.Banned == 1) 10 | return member.ban(); 11 | 12 | if (user.Roles && user.Roles !== "") { 13 | let roleIDs = user.Roles.split(/[ ]+/); 14 | 15 | for (let i = 0; i < roleIDs.length; i++) 16 | member.roles.add(roleIDs[i]).catch(err => console.log(err)); 17 | } 18 | }) 19 | 20 | } -------------------------------------------------------------------------------- /src/events/guildMemberRemove.js: -------------------------------------------------------------------------------- 1 | module.exports.run = (client, serverInfo, config, member) => { 2 | if (member.guild.id !== serverInfo.guildId) return; 3 | 4 | require('../helpers/checkUser').run(config.sql, member.user, (err, user) => { 5 | if (err) return console.error(err); 6 | 7 | let roles = ""; 8 | member.roles.cache.forEach(role => { 9 | if (role.name != "@everyone") roles += " " + role.id; 10 | }); 11 | 12 | config.sql.query("Update Members set Roles = ? where DiscordID = ?", [ roles.trim(), member.id ]); 13 | }) 14 | 15 | } -------------------------------------------------------------------------------- /src/events/guildMemberUpdate.js: -------------------------------------------------------------------------------- 1 | const Discord = require("discord.js"); 2 | const request = require("request"); 3 | 4 | module.exports.run = (client, serverInfo, config, oldMember, newMember) => { 5 | if (oldMember.guild.id !== serverInfo.guildId) return; 6 | 7 | try { 8 | //* If nickname has been changed, then log it. 9 | if (oldMember.nickname != newMember.nickname) { 10 | if (newMember.nickname == null) 11 | client.guilds 12 | .get(serverInfo.guildId) 13 | .channels.resolve(serverInfo.channels.serverlog) 14 | .send( 15 | `:spy: \`[${new Date().toTimeString().split(" ")[0]}]\` **\`${ 16 | newMember.user.tag 17 | }\`** (${newMember.user.id}) has reset their nickname to **\`${ 18 | newMember.user.username 19 | }\`**` 20 | ); 21 | else 22 | client.guilds 23 | .get(serverInfo.guildId) 24 | .channels.resolve(serverInfo.channels.serverlog) 25 | .send( 26 | `:spy: \`[${new Date().toTimeString().split(" ")[0]}]\` **\`${ 27 | newMember.user.tag 28 | }\`** (${newMember.user.id}) has changed their nickname to **\`${ 29 | newMember.nickname 30 | }\`**` 31 | ); 32 | } 33 | 34 | //* If roles are different, we'll save the new roles but also check if the user still has access to certain things 35 | if (oldMember.roles.size !== newMember.roles.size) { 36 | let oldRoles = ""; 37 | oldMember.roles.array().forEach(role => { 38 | if (role.name != "@everyone") oldRoles += ", " + role.name; 39 | }); 40 | 41 | let newRoles = ""; 42 | newMember.roles.array().forEach(role => { 43 | if (role.name != "@everyone") newRoles += ", " + role.name; 44 | }); 45 | 46 | let newRolesID = ""; 47 | newMember.roles.array().forEach(role => { 48 | if (role.name != "@everyone") newRolesID += " " + role.id; 49 | }); 50 | 51 | //* User just received Legacy role 52 | if (newRoles.includes("Legacy") && !oldRoles.includes("Legacy")) { 53 | newMember.send( 54 | "Congratulations on becoming a Legacy member! :smile: You now have access to several benefits including:\n\n" + 55 | "Green & Purple title colors\n" + 56 | "Our beta program (Please read `#beta-info` and the pin in `#beta-signup` carefully!)\n" + 57 | "The `#subs-and-legacy` text channel and priority support\n" + 58 | "Various Discord server enhancements such as nickname perms\n\n" + 59 | "You will keep these benefits forever! Thank you for your support of AlphaConsole!" 60 | ); 61 | } 62 | 63 | //* User just received Twitch Sub role 64 | if (newRoles.includes("Twitch Sub") && !oldRoles.includes("Twitch Sub")) { 65 | newMember.send( 66 | "Thank you for subscribing to our twitch! :smile: You now have access to several benefits including:\n\n" + 67 | "Green & Purple title colors\n" + 68 | "The `AlphaConsole Twitch Sub` special title (found in `#set-special-title`)\n" + 69 | "Our beta program (Please read `#beta-info` and the pin in `#beta-signup` carefully!)\n" + 70 | "The `#subs-and-legacy` text channel and priority support\n" + 71 | "Various Discord server enhancements such as nickname perms\n\n" + 72 | "You will keep these benefits for as long as you are subscribed, and you will have a 3 day window to resubscribe if your subscription runs out. Thank you again for your subscription and your extra level of support for AlphaConsole!" + 73 | "\n\n**Be sure to check out `#giveaways` whilst you can, exclusive for __subs__!**" 74 | ); 75 | 76 | const embedlog = new Discord.MessageEmbed() 77 | .setColor([255, 255, 0]) 78 | .setAuthor("New Twitch Subscriber!", serverInfo.logo) 79 | .setDescription("<@" + newMember.id + "> subscribed to AlphaConsole!") 80 | .setTimestamp(); 81 | client.guilds 82 | .get(serverInfo.guildId) 83 | .channels.resolve(serverInfo.channels.aclog) 84 | .send(embedlog); 85 | 86 | newMember.roles.remove(serverInfo.roles.tempRole); 87 | } 88 | 89 | //* User just lost Twitch Sub role 90 | if ( 91 | oldRoles.includes("Twitch Sub") && 92 | !newRoles.includes("Twitch Sub") && 93 | !canKeepTitle(newMember, serverInfo) 94 | ) { 95 | let user = newMember; 96 | config.sql.query("UPDATE Titles set Color = 1 WHERE DiscordID = ?", [ 97 | user.id 98 | ]); 99 | config.sql.query("UPDATE Titles set Banner = NULL WHERE DiscordID = ?", [ 100 | user.id 101 | ]); 102 | config.sql.query("UPDATE Titles set BannerAccepted = 0 WHERE DiscordID = ?", [ 103 | user.id 104 | ]); 105 | oldMember.send( 106 | "Hi, your Twitch Subscription to AlphaConsole has ended, therefore your access to the subscriber features has been removed and your title colour along with your banner have been reset. If you subscribe again, you will have access to those features again. \n \nHave a great day!" 107 | ); 108 | 109 | const embedlog = new Discord.MessageEmbed() 110 | .setColor([255, 255, 0]) 111 | .setAuthor("Title Colour And Banner Auto Reset", serverInfo.logo) 112 | .setDescription( 113 | "<@" + 114 | user.id + 115 | ">'s colour and banner have been reset because Twitch Subscription ended." 116 | ) 117 | .setTimestamp(); 118 | client.guilds 119 | .get(serverInfo.guildId) 120 | .channels.resolve(serverInfo.channels.aclog) 121 | .send(embedlog); 122 | 123 | require("../helpers/checkUser").run(config.sql, user.user, (err, u) => { 124 | if (err) return console.error(err); 125 | 126 | config.sql.query("Update Members set Roles = ? where DiscordID = ?", [ 127 | newRolesID, 128 | user.id 129 | ]); 130 | }); 131 | } 132 | 133 | client.guilds 134 | .get(serverInfo.guildId) 135 | .channels.resolve(serverInfo.channels.serverlog) 136 | .send( 137 | `:man_with_gua_pi_mao: \`[${ 138 | new Date().toTimeString().split(" ")[0] 139 | }]\` **${newMember.user.tag}**'s roles have changed. Old: ${ 140 | oldRoles === "" 141 | ? "''" 142 | : `\`${oldRoles.substring(2, oldRoles.length)}\`` 143 | } | New: ${ 144 | newRoles === "" 145 | ? "''" 146 | : `\`${newRoles.substring(2, newRoles.length)}\`` 147 | }` 148 | ); 149 | } 150 | } catch (error) { 151 | console.log(error); 152 | } 153 | }; 154 | 155 | function canKeepTitle(m, serverInfo) { 156 | if (m.roles.cache.has(serverInfo.roles.partnerP)) return true; 157 | if (m.roles.cache.has(serverInfo.roles.orgPartner)) return true; 158 | if (m.roles.cache.has(serverInfo.roles.legacy)) return true; 159 | if (m.roles.cache.has(serverInfo.roles.support)) return true; 160 | if (m.roles.cache.has(serverInfo.roles.moderator)) return true; 161 | if (m.roles.cache.has(serverInfo.roles.admin)) return true; 162 | return false; 163 | } 164 | -------------------------------------------------------------------------------- /src/events/messageDelete.js: -------------------------------------------------------------------------------- 1 | module.exports.run = (client, serverInfo, config, message) => { 2 | if (message.guild.id !== serverInfo.guildId) return; 3 | 4 | let args = message.content.split(/[ ]+/); 5 | 6 | let ResponseText = ""; 7 | for (i = 0; i < args.length; i++) { 8 | if (args[i] == "@everyone") ResponseText += "`@everyone` " 9 | else if (args[i] == "@here") ResponseText += "`@here` " 10 | else if (message.mentions.roles.has(args[i].replace(/[^0-9]/g, ""))) ResponseText += `**${message.mentions.roles.get(args[i].replace(/[^0-9]/g, "")).name}** ` 11 | else if (message.mentions.users.has(args[i].replace(/[^0-9]/g, ""))) ResponseText += `**${message.mentions.users.get(args[i].replace(/[^0-9]/g, "")).tag}** ` 12 | else ResponseText += args[i] + " "; 13 | } 14 | 15 | let channel = message.channel.type === "text" ? `<#${message.channel.id}>` : '**DM**'; 16 | client.guilds.resolve(serverInfo.guildId).channels.resolve(serverInfo.channels.serverlog).send( 17 | `:pencil: \`[${new Date().toTimeString().split(" ")[0]}]\` ` + 18 | `**Channel: ${channel} ${message.author.tag}**'s (${message.author.id}) message was deleted. Content: ${ResponseText}` 19 | ); 20 | } -------------------------------------------------------------------------------- /src/events/messageReactionAdd.js: -------------------------------------------------------------------------------- 1 | /** 2 | * ! Message Reaction add event 3 | * 4 | * ? This is triggered whenever a reaction has been added to a fetched message. 5 | * ? This is used for example to remove suggestions & showcases easily by ❌ 6 | * ? But also purposes for other reasons 7 | */ 8 | const Discord = require("discord.js"); 9 | const request = require("request"); 10 | var cooldown = {}; 11 | 12 | module.exports.run = ( 13 | client, 14 | serverInfo, 15 | config, 16 | reaction, 17 | user, 18 | sendEmbed, 19 | messageProcess 20 | ) => { 21 | if (reaction.message.guild.id !== serverInfo.guildId) return; 22 | if (user.bot) return; 23 | getRoles(user, serverInfo, client, member => { 24 | if (reaction.emoji.name === "❌" && member.isAdmin) { 25 | //* Showcase deletion 26 | if (reaction.message.channel.id === serverInfo.channels.showcase) { 27 | user 28 | .send( 29 | `Please respond with the reason why you deleted the showcase. \n**This reason will be logged & sent to the user** \nYou have 30 seconds to respond.` 30 | ) 31 | .then(msg => { 32 | msg.channel 33 | .awaitMessages(response => response.content, { 34 | max: 1, 35 | time: 30000, 36 | errors: ["time"] 37 | }) 38 | .then(collected => { 39 | let reason = collected.first().content; 40 | handleMessage( 41 | client, 42 | serverInfo, 43 | user, 44 | reaction, 45 | reason, 46 | "Showcase", 47 | sendEmbed 48 | ); 49 | }) 50 | .catch(e => { 51 | let reason = "Unrelated to the channel's purpose."; 52 | handleMessage( 53 | client, 54 | serverInfo, 55 | user, 56 | reaction, 57 | reason, 58 | "Showcase", 59 | sendEmbed 60 | ); 61 | }); 62 | }); 63 | } 64 | 65 | //* Suggestion deletion 66 | if (reaction.message.channel.id === serverInfo.channels.suggestion) { 67 | user 68 | .send( 69 | `Please respond with the reason why you deleted the suggestion. \n**This reason will be logged & sent to the user** \nYou have 30 seconds to respond.` 70 | ) 71 | .then(msg => { 72 | msg.channel 73 | .awaitMessages(response => response.content, { 74 | max: 1, 75 | time: 30000, 76 | errors: ["time"] 77 | }) 78 | .then(collected => { 79 | let reason = collected.first().content; 80 | handleMessage( 81 | client, 82 | serverInfo, 83 | user, 84 | reaction, 85 | reason, 86 | "Suggestion", 87 | sendEmbed 88 | ); 89 | }) 90 | .catch(e => { 91 | let reason = 92 | "Not a valid suggestion, already been suggested, or in violation of the information listed at the top of our suggestions channel."; 93 | handleMessage( 94 | client, 95 | serverInfo, 96 | user, 97 | reaction, 98 | reason, 99 | "Suggestion", 100 | sendEmbed 101 | ); 102 | }); 103 | }); 104 | } 105 | } 106 | 107 | //* Title reports 108 | if ( 109 | (member.isAdmin || member.isModerator) && 110 | reaction.message.channel.id === serverInfo.channels.ingameReports 111 | ) { 112 | if (!reaction.message.content.startsWith("**===")) { 113 | if (reaction._emoji.name == "🔨") { 114 | config.sql.query( 115 | `select * from TitleReports where MessageID = ?`, 116 | [reaction.message.id], 117 | (err, res) => { 118 | if (res && res[0]) { 119 | let url = 120 | config.keys.SetTitleURL + 121 | "?DiscordID=" + 122 | res[0].DiscordID + 123 | "&key=" + 124 | config.keys.Password + 125 | "&title=" + 126 | escape("Title reset by admin!"); 127 | 128 | request(url, (err, result, body) => { 129 | if (err) { 130 | let errorCode = 131 | Math.floor(Math.random() * (9999 - 1000 + 1)) + 1000; 132 | console.error( 133 | `Error code ${errorCode} by ${user.tag}`, 134 | err 135 | ); 136 | return sendEmbed( 137 | user, 138 | "🚫 An error occurred. Please contact Pollie#0001. Error code: `" + 139 | errorCode + 140 | "`" 141 | ); 142 | } 143 | 144 | if (body.toLowerCase().includes("done")) { 145 | config.sql.query( 146 | `update TitleReports set Fixed = 1 where MessageID = ?`, 147 | [reaction.message.id] 148 | ); 149 | reaction.message.delete(); 150 | 151 | let urlRating = 152 | config.keys.RatingURL + 153 | "?DiscordID=" + 154 | res[0].Reporter + 155 | "&key=" + 156 | config.keys.Password + 157 | "&Type=1"; 158 | request(urlRating, err => { 159 | if (err) { 160 | let errorCode = 161 | Math.floor(Math.random() * (9999 - 1000 + 1)) + 1000; 162 | console.error( 163 | `Error code ${errorCode} by ${user.tag}`, 164 | err 165 | ); 166 | return sendEmbed( 167 | user, 168 | "🚫 An error occurred. Please contact Pollie#0001. Error code: `" + 169 | errorCode + 170 | "`" 171 | ); 172 | } 173 | }); 174 | } else { 175 | user.send( 176 | "I did not receive a confirmation from the server. This is what the server sent back:\n`" + 177 | body + 178 | "`" 179 | ); 180 | } 181 | }); 182 | } 183 | } 184 | ); 185 | } 186 | 187 | if (reaction._emoji.name == "✅") { 188 | config.sql.query( 189 | `update TitleReports set Permitted = 1, Fixed = 1 where MessageID = ?`, 190 | [reaction.message.id] 191 | ); 192 | reaction.message.delete().catch(e => {}); 193 | } 194 | 195 | if (reaction._emoji.name == "❎") { 196 | config.sql.query(`delete from TitleReports where MessageID = ?`, [ 197 | reaction.message.id 198 | ]); 199 | reaction.message.delete().catch(e => {}); 200 | } 201 | } 202 | 203 | //* Title user reporter 204 | if (reaction.message.content.startsWith("**===")) { 205 | if (reaction.emoji.name === "❌") { 206 | reaction.message.delete(); 207 | 208 | if (reaction.message.mentions.users.first()) { 209 | let urlRating = 210 | config.keys.RatingURL + 211 | "?DiscordID=" + 212 | reaction.message.mentions.users.first().id + 213 | "&key=" + 214 | config.keys.Password + 215 | "&Type=-1"; 216 | request(urlRating, err => { 217 | if (err) { 218 | let errorCode = 219 | Math.floor(Math.random() * (9999 - 1000 + 1)) + 1000; 220 | console.error(`Error code ${errorCode} by ${user.tag}`, err); 221 | return sendEmbed( 222 | user, 223 | "🚫 An error occurred. Please contact Pollie#0001. Error code: `" + 224 | errorCode + 225 | "`" 226 | ); 227 | } 228 | }); 229 | } 230 | } 231 | 232 | if (reaction.emoji.name === "✅") { 233 | reaction.message.delete(); 234 | } 235 | } 236 | } 237 | 238 | 239 | //* Banner Requests 240 | if (reaction.message.channel.id == serverInfo.channels.banners) { 241 | if (member.isAdmin || member.isModerator) { 242 | if (reaction.emoji.name === "✅") { 243 | config.sql.query( 244 | `Select * from Players where DiscordID = ?`, 245 | [reaction.message.mentions.users.first().id], 246 | (err, res) => { 247 | let url = 248 | config.keys.SetBannerURL + 249 | "?id=" + 250 | res[0].SteamID + 251 | "&key=" + 252 | config.keys.Password + 253 | "&url=" + 254 | reaction.message.attachments 255 | .first() 256 | .url.split(" ") 257 | .join("%20"); 258 | 259 | request(url, function (err, res, body) { 260 | if (err) return console.error(err); 261 | 262 | if ( 263 | body.toLowerCase().startsWith("fail") || 264 | body.startsWith(" { 271 | if (err) return console.error(err); 272 | 273 | sendEmbed( 274 | reaction.message.mentions.users.first(), 275 | "Your banner has been approved", 276 | undefined, 277 | undefined, 278 | reaction.message.attachments.first().url 279 | ); 280 | reaction.message.delete(); 281 | } 282 | ); 283 | }); 284 | } 285 | ); 286 | } else if (reaction.emoji.name === "❌") { 287 | sendEmbed( 288 | reaction.message.mentions.users.first(), 289 | "Your banner has been denied." 290 | ); 291 | reaction.message.delete(); 292 | } 293 | } 294 | } 295 | //partners 296 | if ( 297 | `:${reaction.emoji.name}:${reaction.emoji.id}` == 298 | serverInfo.partnerEmoji && 299 | reaction.message.channel.id === serverInfo.channels.partners 300 | ) { 301 | // Reacted to message, remove reaction, send messages 302 | reaction.users.remove(user); 303 | if (cooldown[user.id] && cooldown[user.id] + 5000 > new Date().getTime()) 304 | return; 305 | cooldown[user.id] = new Date().getTime(); 306 | 307 | var errChannel = reaction.message.guild.channels.resolve( 308 | serverInfo.channels.modlog 309 | ); 310 | 311 | config.sql.query( 312 | "Select * from partners where id = ?", 313 | [reaction.message.id], 314 | (err, res) => { 315 | if (!res[0]) 316 | return sendEmbed( 317 | errChannel, 318 | "Partner Database Error", 319 | "Something has gone wrong getting the 'message_data' from the 'partners' table. That's all I know." 320 | ); 321 | 322 | var data = JSON.parse(res[0].message_data); 323 | sendMessages(user, data, serverInfo, config.sql, errChannel); 324 | } 325 | ); 326 | } 327 | 328 | if (reaction.emoji.id == serverInfo.runCommandEmoji) { 329 | config.sql.query("Select * from reactions where messageID = ?", [reaction.message.id], (err, res) => { 330 | if (res.length != 0 && res[0].processed === true) return; 331 | if (member.isModerator || member.isAdmin) { 332 | //* Runs if the user is a mod and changes the author for easy logging 333 | let newCol = reaction.message; 334 | newCol.author = member 335 | return messageProcess(newCol); 336 | } else if (member.isSupport) { 337 | if (res.length === 0) { 338 | if (member.id === "408260674943451137") { //Do for joey counting as 2, since one was already set, no matter what it's two 339 | return config.sql.query(`INSERT INTO reactions(messageID,nOfSupports,processed) VALUES(?,?,?)`, [reaction.message.id, 2, false], (err, res) => { 340 | if (err) console.log(err); 341 | }); 342 | } else { 343 | return config.sql.query(`INSERT INTO reactions(messageID,nOfSupports,processed) VALUES(?,?,?)`, [reaction.message.id, 1, false], (err, res) => { 344 | if (err) console.log(err); 345 | }); 346 | } 347 | } else { 348 | if (res[0].nOfSupports < 2) { 349 | if (member.id === "408260674943451137") { //Do for joey counting as 2, since one was already set, no matter what it's two 350 | config.sql.query("UPDATE reactions set processed = ?", [true]); 351 | let newCol = reaction.message; 352 | newCol.author = reaction.message.guild.member("345769053538746368") //blame account id 353 | return messageProcess(newCol); 354 | } else { 355 | return config.sql.query("UPDATE reactions set nOfSupports = ?", [2], (err, ress) => { 356 | if (err) console.log(err) 357 | }); 358 | } 359 | } else { 360 | config.sql.query("UPDATE reactions set processed = ?", [true]); 361 | let newCol = reaction.message; 362 | newCol.author = reaction.message.guild.member("345769053538746368") //blame account id 363 | return messageProcess(newCol); 364 | } 365 | } 366 | } 367 | }); 368 | } 369 | }); 370 | }; 371 | 372 | /** 373 | * 374 | * @param {Collection} user 375 | * @param {Object} serverInfo 376 | * @param {Collection} client 377 | * @param {Function} callback 378 | */ 379 | function getRoles(user, serverInfo, client, callback) { 380 | client.guilds 381 | .get(serverInfo.guildId) 382 | .members.fetch(user.id) 383 | .then(m => { 384 | 385 | if (m.roles.cache.has(serverInfo.roles.admin)) 386 | m.isAdmin = true; 387 | else m.isAdmin = false; 388 | 389 | if (m.roles.cache.has(serverInfo.roles.moderator) || m.isAdmin) 390 | m.isModerator = true; 391 | else m.isModerator = false; 392 | 393 | if (m.roles.cache.has(serverInfo.roles.support) || m.isModerator) 394 | m.isSupport = true; 395 | else m.isSupport = false; 396 | 397 | if (m.roles.cache.has(serverInfo.roles.staff) || m.isSupport) m.isStaff = true; 398 | else m.isStaff = false; 399 | 400 | if (m.roles.cache.has(serverInfo.roles.ch) || m.isStaff) m.isCH = true; 401 | else m.isCH = false; 402 | 403 | callback(m); 404 | }); 405 | } 406 | 407 | /** 408 | * @param {Collection} client 409 | * @param {Object} serverInfo 410 | * @param {Collection} user 411 | * @param {Collection} reaction 412 | * @param {String} reason 413 | * @param {String} event 414 | * @param {Function} sendEmbed 415 | */ 416 | function handleMessage( 417 | client, 418 | serverInfo, 419 | user, 420 | reaction, 421 | reason, 422 | event, 423 | sendEmbed 424 | ) { 425 | reaction.message.delete(); 426 | sendEmbed( 427 | reaction.message.author, 428 | `Your ${event.toLowerCase()} was deleted by ${user.tag}`, 429 | `Reason: ${reason}` 430 | ); 431 | 432 | const embedLog = new Discord.MessageEmbed() 433 | .setColor([255, 255, 0]) 434 | .setAuthor( 435 | `${event.toUpperCase()} DELETED`, 436 | client.user.displayAvatarURL({ 437 | format: "png" 438 | }) 439 | ) 440 | .addField( 441 | `${event} by `, 442 | `${reaction.message.member} (${reaction.message.author.id})` 443 | ); 444 | 445 | if (reaction.message.content.length != 0) 446 | embedLog.addField(`Content`, `${reaction.message.content}`); 447 | embedLog.addField(`Channel`, `${reaction.message.channel}`); 448 | embedLog.addField(`Deleted by`, `${user.tag}`); 449 | embedLog.addField("Reason:", reason); 450 | client.guilds 451 | .get(serverInfo.guildId) 452 | .channels.resolve(serverInfo.channels.aclog) 453 | .send(embedLog); 454 | } 455 | 456 | function sendMessages(user, data, serverInfo, sql, errChannel) { 457 | // format fo messages {type: "", content: "", url: "", react: bool, id: ""} 458 | // if react then is partner message, and update db to new message id where message.id 459 | 460 | return new Promise((resolve, reject) => { 461 | var chain = Promise.resolve(); 462 | for (let message of data.messages) { 463 | chain = chain.then(() => { 464 | switch (message.type) { 465 | case "hybrid": 466 | return user.send(message.content, { 467 | files: [message.url] 468 | }); 469 | case "file": 470 | return user.send("", { 471 | files: [message.url] 472 | }); 473 | case "text": 474 | return user.send(message.content); 475 | default: 476 | reject( 477 | "A Message Type error has occurred. Please contact an AlphaConsole Admin!" 478 | ); 479 | } 480 | }); 481 | } 482 | chain = chain.then(resolve()).catch(err => reject(err)); 483 | }); 484 | } 485 | -------------------------------------------------------------------------------- /src/events/messageReactionRemove.js: -------------------------------------------------------------------------------- 1 | /** 2 | * ! Message Reaction add event 3 | * 4 | * ? This is triggered whenever a reaction has been added to a fetched message. 5 | * ? This is used for example to remove suggestions & showcases easily by ❌ 6 | * ? But also purposes for other reasons 7 | */ 8 | const Discord = require("discord.js"); 9 | const request = require("request"); 10 | var cooldown = {}; 11 | 12 | module.exports.run = ( 13 | client, 14 | serverInfo, 15 | config, 16 | reaction, 17 | user, 18 | sendEmbed, 19 | messageProcess 20 | ) => { 21 | if (reaction.message.guild.id !== serverInfo.guildId) return; 22 | if (user.bot) return; 23 | getRoles(user, serverInfo, client, member => { 24 | if (reaction.emoji.id == serverInfo.runCommandEmoji) { 25 | config.sql.query("Select * from reactions where messageID = ?", [reaction.message.id], (err, res) => { 26 | if (res.length != 0 && res[0].processed === true) return; 27 | if (member.isModerator || member.isAdmin) { 28 | //* Runs if the user is a mod and changes the author for easy logging 29 | let newCol = reaction.message; 30 | newCol.author = member 31 | return messageProcess(newCol); 32 | } else if (member.isSupport) { 33 | if (member.id === "408260674943451137") { //Do for joey counting as 2, since one was already set, no matter what it's two 34 | return config.sql.query(`UPDATE reactions set nOfSupports = ?`, [res[0].nOfSupports - 2], (err, res) => { 35 | if (err) console.log(err); 36 | }); 37 | } else if(member.id != "408260674943451137") { 38 | return config.sql.query(`UPDATE reactions set nOfSupports = ?`, [res[0].nOfSupports - 1], (err, res) => { 39 | if (err) console.log(err); 40 | }); 41 | } 42 | } 43 | }); 44 | } 45 | }); 46 | }; 47 | 48 | /** 49 | * 50 | * @param {Collection} user 51 | * @param {Object} serverInfo 52 | * @param {Collection} client 53 | * @param {Function} callback 54 | */ 55 | function getRoles(user, serverInfo, client, callback) { 56 | client.guilds 57 | .get(serverInfo.guildId) 58 | .members.fetch(user.id) 59 | .then(m => { 60 | 61 | if (m.roles.cache.has(serverInfo.roles.admin)) 62 | m.isAdmin = true; 63 | else m.isAdmin = false; 64 | 65 | if (m.roles.cache.has(serverInfo.roles.moderator) || m.isAdmin) 66 | m.isModerator = true; 67 | else m.isModerator = false; 68 | 69 | if (m.roles.cache.has(serverInfo.roles.support) || m.isModerator) 70 | m.isSupport = true; 71 | else m.isSupport = false; 72 | 73 | if (m.roles.cache.has(serverInfo.roles.staff) || m.isSupport) m.isStaff = true; 74 | else m.isStaff = false; 75 | 76 | if (m.roles.cache.has(serverInfo.roles.ch) || m.isStaff) m.isCH = true; 77 | else m.isCH = false; 78 | 79 | callback(m); 80 | }); 81 | } 82 | 83 | /** 84 | * @param {Collection} client 85 | * @param {Object} serverInfo 86 | * @param {Collection} user 87 | * @param {Collection} reaction 88 | * @param {String} reason 89 | * @param {String} event 90 | * @param {Function} sendEmbed 91 | */ 92 | function sendMessages(user, data, serverInfo, sql, errChannel) { 93 | // format fo messages {type: "", content: "", url: "", react: bool, id: ""} 94 | // if react then is partner message, and update db to new message id where message.id 95 | 96 | return new Promise((resolve, reject) => { 97 | var chain = Promise.resolve(); 98 | for (let message of data.messages) { 99 | chain = chain.then(() => { 100 | switch (message.type) { 101 | case "hybrid": 102 | return user.send(message.content, { 103 | files: [message.url] 104 | }); 105 | case "file": 106 | return user.send("", { 107 | files: [message.url] 108 | }); 109 | case "text": 110 | return user.send(message.content); 111 | default: 112 | reject( 113 | "A Message Type error has occurred. Please contact an AlphaConsole Admin!" 114 | ); 115 | } 116 | }); 117 | } 118 | chain = chain.then(resolve()).catch(err => reject(err)); 119 | }); 120 | } 121 | -------------------------------------------------------------------------------- /src/events/ready.js: -------------------------------------------------------------------------------- 1 | /** 2 | * ! Ready event file 3 | * 4 | * ? This is activated whenever the bot started & is ready to serve. 5 | * ? It'll fetch data from the database and save it in the config to prevent more db calls 6 | */ 7 | let fs = require('fs'); 8 | 9 | module.exports.run = (client, serverInfo, config, checkStatus) => { 10 | console.log("AlphaConsole Bot logged in and ready."); 11 | 12 | /** 13 | * ! Config variables setup 14 | * 15 | * ? We'll grab all details from database and save them in variables. 16 | * ? This way we can use the variables to check stuff, and we don't need to query 17 | * ? the database over & over again. 18 | */ 19 | 20 | config.sql.query("SELECT * FROM Config", (error, result) => { 21 | if (error) return console.error(error); 22 | 23 | for (let i = 0; i < result.length; i++) { 24 | if (config[result[i].Config]) { 25 | if (result[i].Config === "autoResponds") 26 | config[result[i].Config][result[i].Value1] = result[i].Value2 27 | else 28 | config[result[i].Config].push(result[i].Value1.toLowerCase()) 29 | 30 | } 31 | } 32 | }) 33 | 34 | 35 | /** 36 | * ! Help command setup 37 | * 38 | * ? On bot start we'll fetch all the files from cmds. 39 | * ? Every single file includes a title & details. We'll be fetching those to make a fast a smooth help 40 | */ 41 | 42 | fs.readdir('./src/cmds', (err, files) => { 43 | for (let i = 0; i < files.length; i++) { 44 | let info = require(`../cmds/${files[i]}`); 45 | if (!info.title || !info.details) continue; 46 | for (let ii = 0; ii < info.details.length; ii++) { 47 | config.commands.push({ 48 | title : info.title, 49 | perms : info.details[ii].perms, 50 | command : info.details[ii].command, 51 | description: info.details[ii].description 52 | }) 53 | } 54 | } 55 | }); 56 | 57 | /** 58 | * ! Channel messages fetching 59 | * 60 | * ? Channels like showcase & suggestions requires fetching because reactions won't work 61 | * ? if the messages aren't fetched. So by fetching them at least the last 100 messages will work 62 | * 63 | * ? We also delay this by 30 seconds. Since yea, AC is a big Discord and it takes time for all channels to be fetched. 64 | */ 65 | 66 | setTimeout(() => { 67 | checkStatus(); 68 | client.guilds.resolve(serverInfo.guildId).channels.resolve(serverInfo.channels.showcase).messages.fetch(); 69 | client.guilds.resolve(serverInfo.guildId).channels.resolve(serverInfo.channels.suggestion).messages.fetch(); 70 | client.guilds.resolve(serverInfo.guildId).channels.resolve(serverInfo.channels.ingameReports).messages.fetch(); 71 | client.guilds.resolve(serverInfo.guildId).channels.resolve(serverInfo.channels.partners).messages.fetch(); 72 | client.guilds.resolve(serverInfo.guildId).channels.resolve(serverInfo.channels.banners).messages.fetch(); 73 | }, 10000); 74 | } -------------------------------------------------------------------------------- /src/events/spamProtection.js: -------------------------------------------------------------------------------- 1 | /** 2 | * ! Spam Protection 3 | * 4 | * ? Every message gets checked and added to a list to detect spam. 5 | * ? In case the users spams we'll take action :) 6 | */ 7 | const Discord = require('discord.js'); 8 | let authors = {}; 9 | let warned = []; 10 | let mutes = {}; 11 | 12 | module.exports.run = ({ client, serverInfo, message, args, sql, config, sendEmbed }) => { 13 | 14 | if (ignore()) return; 15 | 16 | // Set options 17 | const warnBuffer = 5; 18 | const maxBuffer = 7; 19 | const interval = 2000; 20 | const reason = "Spamming when already been warned."; 21 | 22 | if (!authors[message.author.id]) authors[message.author.id] = []; 23 | let now = new Date().getTime(); 24 | authors[message.author.id].push({ 25 | date: now, 26 | message: message 27 | }) 28 | 29 | let messagesInInterval = authors[message.author.id].filter(r => r.date > now - interval).length; 30 | if (messagesInInterval >= warnBuffer && !warned.includes(message.author.id)) { 31 | if (!mutes[message.author.id] || (mutes[message.author.id] && mutes[message.author.id] < new Date().getTime())) { 32 | //* User has been spamming for the first time. Warn him and add it to the warned list 33 | sendEmbed(message.author, "Alright buddy... Keep it calm, reduce the spam or you'll be muted.") 34 | if (message.channel.id !== serverInfo.channels.setTitle && message.channel.id !== serverInfo.channels.setBanner && message.channel.id !== serverInfo.channels.setSpecialTitle) 35 | sendEmbed(message.channel, `${message.author.tag} has been warned.`) 36 | warned.push(message.author.id); 37 | } 38 | 39 | } else if (messagesInInterval >= maxBuffer || (messagesInInterval >= warnBuffer && warned.includes(message.author.id))) { 40 | //* User kept spamming OR has been spamming again. User will be muted for an hour. 41 | 42 | if (!mutes[message.author.id] || (mutes[message.author.id] && mutes[message.author.id] < new Date().getTime())) { 43 | mutes[message.author.id] = new Date().getTime() + 3000; 44 | if (message.channel.id !== serverInfo.channels.setTitle && message.channel.id !== serverInfo.channels.setBanner && message.channel.id !== serverInfo.channels.setSpecialTitle) 45 | sendEmbed(message.channel, `${message.author.tag} has been muted for an hour.`); 46 | warned.splice(warned.indexOf(message.author.id), 1); 47 | 48 | message.guild.members.fetch(message.author.id).then(m => { 49 | require('../helpers/checkUser').run(sql, m.user, async (err, user) => { 50 | if (err) return console.error(err); 51 | 52 | await m.roles.add(serverInfo.roles.muted); 53 | m.send(`The bot has muted you for 1 hour.\n\n__For the following reason:__\n${reason}\n\nFor more information, please read the <#448536110537244672> channel in the server.`); 54 | 55 | let MutedUntil = new Date().getTime() + 3600000; 56 | sql.query("Update Members set MutedUntil = ? where DiscordID = ?", [ MutedUntil, m.id ]); 57 | 58 | sql.query("Insert into `Logs`(Action, Member, Moderator, value, Reason, Time, ChannelID) values(?, ?, ?, ?, ?, ?, ?)", 59 | [ 'mute', m.id, "bot", 3600000, reason, new Date().getTime(), message.channel.id ], (err, res) => { 60 | if (err) return console.error(err); 61 | 62 | let caseId = res.insertId; 63 | //* Add it to the logs :) 64 | const embedlog = new Discord.MessageEmbed() 65 | .setColor([255, 255, 0]) 66 | .setAuthor(`Case ${caseId} | User Mute`, client.user.displayAvatarURL({ format: "png" })) 67 | .setDescription(`${m} (${m.id}) has been muted for 1 hour by the bot`) 68 | .setTimestamp() 69 | .addField("reason", reason); 70 | message.guild.channels 71 | .get(serverInfo.channels.modlog) 72 | .send(embedlog).then(msg => { 73 | sql.query(`update \`Logs\` set MessageID = ? where ID = ?`, [ msg.id, caseId ]); 74 | }); 75 | 76 | //* Wait 2 seconds to confirm he has the role yet. Then send the same message in muted-reasons 77 | setTimeout(() => { 78 | message.guild.channels 79 | .get(serverInfo.channels.muted) 80 | .send(embedlog) 81 | }, 2000); 82 | }) 83 | }); 84 | }); 85 | } 86 | } 87 | 88 | 89 | 90 | 91 | 92 | 93 | function ignore() { 94 | let m = message.member; 95 | let c = message.channel.id; 96 | 97 | if (m.roles.cache.has(serverInfo.roles.streamTeam)) return true; 98 | if (m.roles.cache.has(serverInfo.roles.ch)) return true; 99 | if (m.roles.cache.has(serverInfo.roles.staff)) return true; 100 | if (m.roles.cache.has(serverInfo.roles.support)) return true; 101 | if (m.roles.cache.has(serverInfo.roles.moderator)) return true; 102 | if (m.roles.cache.has(serverInfo.roles.admin)) return true; 103 | 104 | if (c === serverInfo.channels.slaughter) return true; 105 | if (c === serverInfo.channels.staff) return true; 106 | if (c === serverInfo.channels.botConfig) return true; 107 | if (c === serverInfo.channels.setTitle) return true; 108 | if (c === serverInfo.channels.setSpecialTitle) return true; 109 | if (c === serverInfo.channels.betaSteamIDS) return true; 110 | if (c === serverInfo.channels.showcase) return true; 111 | if (c === serverInfo.channels.suggestion) return true; 112 | return false; 113 | } 114 | } -------------------------------------------------------------------------------- /src/events/userUpdate.js: -------------------------------------------------------------------------------- 1 | module.exports.run = (client, serverInfo, config, user) => { 2 | require("../helpers/checkUser").run(config.sql, user, (err, u) => { 3 | if (err) return console.error(err); 4 | 5 | config.sql.query("Update Members set Username = ? where DiscordID = ?", [ 6 | user.username.replace(/[^0-9a-z\!\-\?\.\,\'\"\#\@\/ ]/gi, ""), 7 | user.id 8 | ]); 9 | }); 10 | }; 11 | -------------------------------------------------------------------------------- /src/events/voiceChannelUpdate.js: -------------------------------------------------------------------------------- 1 | module.exports.run = (client, serverInfo, config, oldMember, newMember) => { 2 | 3 | if (newMember.voiceChannel) { 4 | if (newMember.voiceChannel.parentID == serverInfo.DynamicCat) { 5 | if (newMember.voiceChannel.members.cache.length == 1) { 6 | Extra = 0; 7 | client.guilds.resolve(serverInfo.guildId).channels.forEach(channel => { 8 | if (channel.parentID == serverInfo.DynamicCat) { 9 | if (channel.members.cache.length == 0) { 10 | if (Extra == 1) { 11 | channel.delete(); 12 | } else { 13 | Extra = 1; 14 | } 15 | } 16 | } 17 | }); 18 | if (Extra == 0) newMember.guild.channels.create("🎮 Game Channel", { type: "voice", parent: serverInfo.DynamicCat }); 19 | } 20 | } 21 | } 22 | 23 | if (oldMember.voiceChannel) { 24 | if (oldMember.voiceChannel.parentID == serverInfo.DynamicCat) { 25 | if (oldMember.voiceChannel.members.cache.length == 0) { 26 | Extra = 0; 27 | client.guilds.resolve(serverInfo.guildId).channels.forEach(channel => { 28 | if (channel.parentID == serverInfo.DynamicCat) { 29 | if (channel.members.cache.length == 0) { 30 | if (Extra == 1) { 31 | if (channel) { 32 | channel.delete(); 33 | } 34 | } else { 35 | Extra = 1; 36 | } 37 | } 38 | } 39 | }); 40 | if (Extra == 0) oldMember.guild.channels.create("🎮 Game Channel", { type: "voice", parent: serverInfo.DynamicCat }); 41 | } 42 | } 43 | } 44 | 45 | } -------------------------------------------------------------------------------- /src/helpers/api_calls.js: -------------------------------------------------------------------------------- 1 | const request = require('request'); 2 | const express = require('express'); 3 | const bodyParser = require('body-parser'); 4 | 5 | module.exports.run = (client, serverInfo, config, checkStatus) => { 6 | const { sql, keys } = config; 7 | let app = express(); 8 | 9 | app.use(bodyParser.urlencoded({ extended: true })) 10 | 11 | app.get('/config', (req, res) => { 12 | if (!(req.query.key && req.query.key === keys.Password)) { 13 | res.status(401); 14 | return res.json({ error: true, message: "Not authorized" }) 15 | } 16 | 17 | console.log("Updating config values") 18 | 19 | let temp = {}; 20 | 21 | config.sql.query("SELECT * FROM Config", (error, result) => { 22 | if (error) return console.error(error); 23 | 24 | for (let i = 0; i < result.length; i++) { 25 | if (config[result[i].Config]) { 26 | if (!temp[result[i].Config]) { 27 | temp[result[i].Config] = true; 28 | config[result[i].Config] = []; 29 | console.log(result[i].Config + " cleared") 30 | } 31 | 32 | if (result[i].Config === "autoResponds") 33 | config[result[i].Config][result[i].Value1] = result[i].Value2 34 | else 35 | config[result[i].Config].push(result[i].Value1.toLowerCase()) 36 | 37 | } 38 | } 39 | }) 40 | 41 | res.status(200); 42 | return res.json({ error: false, message: "Config of bot has been updated!" }) 43 | }) 44 | 45 | app.listen(1337); 46 | } -------------------------------------------------------------------------------- /src/helpers/checkUser.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * @param {SQL Object} sql 4 | * @param {User Collection} user 5 | * @param {Function(err, user)} callback 6 | */ 7 | 8 | module.exports.run = (sql, user, callback) => { 9 | sql.query( 10 | `Select * from Members where DiscordID = ?;`, 11 | [user.id], 12 | (err, res) => { 13 | if (err) return callback(err, null); 14 | 15 | if (res.length === 0) { 16 | sql.query( 17 | `Insert Into Members(DiscordID, Username, JoinedDate) VALUES(?, ?, ?)`, 18 | [ 19 | user.id, 20 | user.username.replace(/[^0-9a-z\!\-\?\.\,\'\"\#\@\/ ]/gi, ""), 21 | new Date().getTime() 22 | ], 23 | error => { 24 | if (error) { 25 | if (error.code === "ER_DUP_ENTRY") 26 | return callback(`Error: ${error}`, null); 27 | else return callback(`Error: ${error.code}`, null); 28 | } 29 | 30 | sql.query( 31 | `Select * from Members where DiscordID = ?;`, 32 | [user.id], 33 | (errr, ress) => { 34 | if (errr) return callback(errr, null); 35 | 36 | return callback(null, ress); 37 | } 38 | ); 39 | } 40 | ); 41 | } else { 42 | return callback(null, res[0]); 43 | } 44 | } 45 | ); 46 | }; 47 | -------------------------------------------------------------------------------- /src/helpers/scheduled.js: -------------------------------------------------------------------------------- 1 | const request = require('request'); 2 | 3 | module.exports.run = (client, serverInfo, { sql, keys }, checkStatus) => { 4 | const schedule = require("node-schedule"); 5 | 6 | //* Check every minute (For automated unmutes etc...) 7 | let a = schedule.scheduleJob({ second: 1 }, function() { 8 | sql.query("Select * from Members where MutedUntil IS NOT NULL or tempBeta IS NOT NULL", [], (err, res) => { 9 | if (err) return console.error(err); 10 | 11 | let mutes = res.filter(r => r.MutedUntil); 12 | let betas = res.filter(r => r.tempBeta); 13 | 14 | mutes.forEach(r => { 15 | if (r.MutedUntil < new Date().getTime()) { 16 | client.guilds.resolve(serverInfo.guildId).members.fetch(r.DiscordID).then(m => { 17 | m.roles.remove(serverInfo.roles.muted); 18 | sql.query('Update Members set MutedUntil = null where ID = ?', [ r.ID ]); 19 | }).catch(e => { }) 20 | } 21 | }); 22 | 23 | betas.forEach(r => { 24 | if (r.tempBeta < new Date().getTime()) { 25 | client.guilds.resolve(serverInfo.guildId).members.fetch(r.DiscordID).then(m => { 26 | m.roles.remove(serverInfo.roles.beta); 27 | m.roles.remove(serverInfo.roles.tempRole); 28 | sql.query('Update Members set tempBeta = null where ID = ?', [ r.ID ]); 29 | }).catch(e => { }) 30 | } 31 | }); 32 | }) 33 | }); 34 | 35 | //* Check every half an hour. First job is at min 1 of every hour. Second check at every min 31 of every hour 36 | //* For Status rotation & channel cleanup 37 | let b = schedule.scheduleJob({ minute: 1 }, function() { 38 | statusRotation(); 39 | titleCleanUp(); 40 | }); 41 | 42 | let c = schedule.scheduleJob({ minute: 31 }, function() { 43 | statusRotation(); 44 | titleCleanUp(); 45 | }); 46 | 47 | 48 | 49 | 50 | 51 | 52 | async function statusRotation() { 53 | let clientID = keys.TwitchClientID 54 | const twitchUserName = "alphaconsole"; 55 | const url = `https://api.twitch.tv/kraken/streams/${twitchUserName}?client_id=${clientID}`; 56 | 57 | request({ method: "GET", url: url }, function(err, response, body) { 58 | if (err) return console.error(err); 59 | 60 | if (body) { 61 | const twitchData = JSON.parse(body); 62 | 63 | if (twitchData["stream"] != null) { 64 | //Update status 65 | client.user.setActivity( 66 | twitchData["stream"]["channel"]["status"], 67 | { 68 | type: "STREAMING", 69 | url: "https://www.twitch.tv/alphaconsole" 70 | } 71 | ); 72 | } else { 73 | sql.query("Select * from Statuses", [], (err, res) => { 74 | if (err) return console.error(err); 75 | 76 | let active = res.filter(r => r.Active == 1)[0]; 77 | if (active) { 78 | let index = res.indexOf(active); 79 | let newID = res[index + 1] ? res[index + 1].ID : res[0].ID; 80 | sql.query("Update Statuses set Active = 0 where ID = ?", [ active.ID ], () => { 81 | sql.query("Update Statuses set Active = 1 where ID = ?", [ newID ], () => { 82 | checkStatus(); 83 | }); 84 | }) 85 | } else { 86 | checkStatus(); 87 | } 88 | }) 89 | } 90 | } 91 | }) 92 | } 93 | 94 | function titleCleanUp() { 95 | client.guilds.resolve(serverInfo.guildId).channels.resolve(serverInfo.channels.setTitle).messages.fetch() 96 | .then(messages => { 97 | for (var message of messages.values()) { 98 | if ( 99 | message.author.id !== client.user.id && 100 | message.author.id !== "345769053538746368" && 101 | message.author.id !== "181076473757696000" && 102 | !message.member.roles.cache.has(serverInfo.roles.admin) 103 | ) { 104 | message.delete(); 105 | } 106 | } 107 | }); 108 | } 109 | } -------------------------------------------------------------------------------- /src/helpers/sql.js: -------------------------------------------------------------------------------- 1 | const mysql = require('mysql'); 2 | const keys = require("../tokens"); 3 | const pool = mysql.createPool({ 4 | host : keys.dbHost, 5 | port : 3306, 6 | user : keys.dbUser, 7 | password: keys.dbPass, 8 | database: keys.dbName 9 | }); 10 | 11 | // ? Database function to ensure we always have a connection but without having to repeat ourself in the code. 12 | let sql = {}; 13 | sql.query = function(query, params, callback) { 14 | pool.getConnection(function(err, connection) { 15 | if(err) { 16 | if (callback) callback(err, null, null); 17 | return; 18 | } 19 | 20 | connection.query(query, params, function(error, results, fields) { 21 | connection.release(); // always put connection back in pool after last query 22 | if(error) { 23 | if (callback) callback(error, null, null); 24 | return; 25 | } 26 | if (callback) callback(false, results, fields); 27 | }); 28 | }); 29 | }; 30 | 31 | module.exports = sql; -------------------------------------------------------------------------------- /src/serverInfo-OfficialDiscord.js: -------------------------------------------------------------------------------- 1 | //Server Information 2 | module.exports = { 3 | guildName: "AlphaConsole", 4 | guildId: "278333760666075136", 5 | 6 | roles: { 7 | developer : "278334037133754369", 8 | admin : "333374037998960640", 9 | moderator : "341650875649097728", 10 | seniorS : "460497991250345984", 11 | support : "304709520985292802", 12 | staff : "377965712532045825", 13 | ch : "335563840551125002", 14 | streamTeam: "386697815251877898", 15 | designer : "364909159432454145", 16 | botDev : "391084907188846593", 17 | 18 | legacy : "278334510221885451", 19 | sub : "359910776397496330", 20 | orgPartner: "354507027017629697", 21 | partnerP : "360929233633280000", 22 | donator : "369347889383735297", 23 | beta : "422542338510946304", 24 | tempRole : "466459885840629760", 25 | linksFiles: "409826811124514827", 26 | 27 | events : "389234045709582337", 28 | mc : "475794004064337940", 29 | muted : "318485165687177227" 30 | }, 31 | 32 | channels: { 33 | basement : "xxxx", 34 | staff : "325079897209044993", 35 | slaughter : "378420714941972480", 36 | serverlog : "364569370065895424", 37 | aclog : "352861631128272897", 38 | modlog : "371462852063789068", 39 | ingameReports : "446186367303680000", 40 | editPartners : "445304697755009024", 41 | botConfig : "377992732418768907", 42 | staffChannelsCat : "355922959367405579", 43 | staffBox : "569407319482302494", 44 | 45 | setTitle : "328236864534216704", 46 | setSpecialTitle : "363137607540015106", 47 | betaSteamIDS : "423943897329303552", 48 | 49 | botSpam : "420659899744124928", 50 | showcase : "358833347486810112", 51 | suggestion : "352855430315376640", 52 | partners : "445325924771037185", 53 | muted : "448536437453881355", 54 | banners : "513653275275296777", 55 | setBanner : "513790692229906433", 56 | submitBanners : "514189565435707393", 57 | bannersSubmissions : "514235430581829633" 58 | }, 59 | 60 | publicChannels: [ 61 | "378420714941972480", // #slaighter-house 62 | "377992732418768907", // #bot-config-spam 63 | "328236864534216704", // #set-title 64 | "363137607540015106", // #set-special-title 65 | "423943897329303552", // #beta-signup 66 | "390736805533843477", // #beta-help 67 | "278336241114677258", // #help 68 | "297536247734206464", // #general 69 | "362782211101163550", // #subs-and-legacy 70 | "362785662069374976", // #partner-chat 71 | "359557988643635200", // #non-english-chat 72 | "358833347486810112", // #showcase 73 | "352855430315376640", // #suggestions 74 | "365159739329347585", // #programming 75 | "475796728952520704", // #minecraft 76 | "420659899744124928", // #bot-spam 77 | "304539114269573123", // #looking-to-play 78 | "307052600061198337", // #self-promotion 79 | ], 80 | 81 | partnerEmoji: ":ACQuestion:506579449618104320", 82 | DynamicCat: "355924371367395329", 83 | runCommandEmoji: "588153018676019230", 84 | 85 | mm: { 86 | guildId: "420394999440474132", 87 | roles: { 88 | developer : "420404967585873921", 89 | admin : "420404934912245770", 90 | moderator : "420404988171386920", 91 | support : "420421785876430858", 92 | } 93 | } 94 | }; 95 | -------------------------------------------------------------------------------- /src/serverInfo.js: -------------------------------------------------------------------------------- 1 | //Server Information 2 | module.exports = { 3 | guildName: "AC Beta", 4 | guildId: "348214140889989140", 5 | 6 | roles: { 7 | developer : "381845745147314186", 8 | admin : "381845798331088896", 9 | moderator : "381845817327353856", 10 | support : "381845840412540930", 11 | staff : "388523448839831566", 12 | ch : "453803987771326476", 13 | streamTeam: "386697815251877898", 14 | designer : "364909159432454145", 15 | botDev : "391084907188846593", 16 | designer : "364909159432454145", 17 | 18 | legacy : "278334510221885451", 19 | sub : "359910776397496330", 20 | orgPartner: "354507027017629697", 21 | partnerP : "360929233633280000", 22 | donator : "369347889383735297", 23 | beta : "458736486112559145", 24 | tempRole : "466459885840629760", 25 | 26 | events : "389384990087053312", 27 | mc : "381845840412540930", // Support ID, was just for testing 28 | muted : "388505596615327774" 29 | }, 30 | 31 | channels: { 32 | basement : "xxxx", 33 | staff : "453829517849526274", 34 | slaughter : "378420714941972480", 35 | serverlog : "389536059177828374", 36 | aclog : "389536034041495562", 37 | modlog : "389536131089432596", 38 | ingameReports : "457862052237541387", 39 | editPartners : "413841364032159764", 40 | botConfig : "377992732418768907", 41 | staffChannelsCat : "381827097632702466", 42 | staffBox : "389241234100715520", 43 | 44 | setTitle : "349645232910106625", 45 | setSpecialTitle : "396350002886344714", 46 | betaSteamIDS : "391345364919123968", 47 | 48 | botSpam : "389241234100715520", 49 | showcase : "349637406393237514", 50 | suggestion : "389870221906804737", 51 | partners : "413841399306518530", 52 | muted : "445364228900257792", 53 | banners : "513588179492667394", 54 | setBanner : "513797031626801164", 55 | submitBanners : "513588179492667394", 56 | bannersSubmissions : "514227613779099659" 57 | }, 58 | 59 | publicChannels: [ 60 | "381844964780277762", 61 | "381835006936612874", 62 | "381834500503764992" 63 | ], 64 | 65 | partnerEmoji: ":ACQuestion:444631913949560855", 66 | DynamicCat: "388834196782579712", 67 | 68 | mm: { 69 | guildId: "420394999440474132", 70 | roles: { 71 | developer : "420404967585873921", 72 | admin : "420404934912245770", 73 | moderator : "420404988171386920", 74 | support : "420421785876430858", 75 | } 76 | } 77 | }; 78 | -------------------------------------------------------------------------------- /src/tokens.example.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | token: '', // Discord Bot Token 3 | 4 | // Database connection information 5 | dbHost: '', 6 | dbUser: '', 7 | dbPass: '', 8 | dbName: '', 9 | 10 | // API Calls towards our Title backend system 11 | Password : "", 12 | CheckdbURL : "", 13 | RatingURL : "", 14 | SetTitleURL: "", 15 | SetBetaURL : "", 16 | 17 | // Steam API 18 | SteamAPIURL: "", 19 | SteamAPIKey: "" 20 | } 21 | 22 | 23 | /** 24 | * ! Database tables. 25 | * 26 | * ? In case you are copying this bot for functionalities 27 | * ? you'll need some tables, maybe not all of them but some of them. 28 | * ? If you do this be sure your database info at module.exports is linked. 29 | */ 30 | 31 | /* 32 | 33 | * Commands 34 | CREATE TABLE `Commands` ( 35 | `ID` int(11) NOT NULL AUTO_INCREMENT, 36 | `Command` mediumtext CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci, 37 | `Response` mediumtext CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci, 38 | PRIMARY KEY (`ID`) 39 | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; 40 | 41 | * Config 42 | CREATE TABLE `Config` ( 43 | `ID` int(11) NOT NULL AUTO_INCREMENT, 44 | `Config` varchar(45) NOT NULL, 45 | `Value1` mediumtext NOT NULL CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci, 46 | `Value2` mediumtext, 47 | PRIMARY KEY (`ID`) 48 | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; 49 | 50 | * Logs 51 | CREATE TABLE `Logs` ( 52 | `ID` int(11) NOT NULL AUTO_INCREMENT, 53 | `Action` varchar(50) NOT NULL, 54 | `Member` varchar(25) NOT NULL, 55 | `Moderator` varchar(25) NOT NULL, 56 | `Value` int(11) DEFAULT NULL, 57 | `Reason` varchar(500) DEFAULT NULL CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci, 58 | `Time` varchar(20) DEFAULT NULL, 59 | `ChannelID` varchar(25) DEFAULT NULL, 60 | `MessageID` varchar(25) DEFAULT NULL, 61 | PRIMARY KEY (`ID`) 62 | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; 63 | 64 | * Members 65 | CREATE TABLE `Members` ( 66 | `ID` int(11) NOT NULL AUTO_INCREMENT, 67 | `DiscordID` varchar(25) NOT NULL, 68 | `Username` varchar(100) DEFAULT NULL CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci, 69 | `JoinedDate` varchar(20) DEFAULT NULL, 70 | `MutedUntil` varchar(20) DEFAULT NULL, 71 | `Warnings` int(11) DEFAULT '0', 72 | `TagWarnings` int(11) DEFAULT '0', 73 | `Suggestion` varchar(25) DEFAULT NULL, 74 | `Showcase` varchar(25) DEFAULT NULL, 75 | `Roles` varchar(500) DEFAULT NULL, 76 | PRIMARY KEY (`ID`), 77 | UNIQUE KEY `DiscordID` (`DiscordID`) 78 | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; 79 | 80 | * Misc 81 | CREATE TABLE `Misc` ( 82 | `ID` int(11) NOT NULL AUTO_INCREMENT, 83 | `message` text, 84 | `value` text, 85 | PRIMARY KEY (`ID`) 86 | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; 87 | 88 | * partners 89 | CREATE TABLE `partners` ( 90 | `id` varchar(25) NOT NULL, 91 | `type` varchar(100) DEFAULT NULL, 92 | `partner_name` varchar(100) DEFAULT NULL, 93 | `message_data` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci, 94 | `header_data` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci, 95 | `enabled` int(11) DEFAULT NULL, 96 | UNIQUE KEY `id` (`id`) 97 | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; 98 | 99 | * partner_types 100 | CREATE TABLE `partner_types` ( 101 | `id` int(11) NOT NULL AUTO_INCREMENT, 102 | `type` varchar(100) NOT NULL, 103 | `json_data` longtext NOT NULL CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci, 104 | PRIMARY KEY (`id`) 105 | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; 106 | 107 | * Statuses 108 | CREATE TABLE `Statuses` ( 109 | `ID` int(11) NOT NULL AUTO_INCREMENT, 110 | `StatusType` varchar(20) DEFAULT NULL, 111 | `StatusText` varchar(200) DEFAULT NULL CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci, 112 | `Active` int(11) DEFAULT '0', 113 | PRIMARY KEY (`ID`) 114 | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; 115 | 116 | * TitleReports 117 | CREATE TABLE `TitleReports` ( 118 | `ID` int(11) NOT NULL AUTO_INCREMENT, 119 | `DiscordID` varchar(25) DEFAULT NULL, 120 | `SteamID` varchar(25) DEFAULT NULL, 121 | `Title` varchar(100) DEFAULT NULL, 122 | `Color` varchar(20) DEFAULT NULL, 123 | `MessageID` varchar(25) DEFAULT NULL, 124 | `Fixed` int(11) DEFAULT '0', 125 | `Permitted` int(11) DEFAULT '0', 126 | `Reporter` varchar(25) DEFAULT NULL, 127 | PRIMARY KEY (`ID`) 128 | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; 129 | 130 | */ --------------------------------------------------------------------------------