diff --git a/.gitignore b/.gitignore index c78cfdb..1f23498 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,3 @@ node_modules/ -json.sqlite \ No newline at end of file +config.json \ No newline at end of file diff --git a/app.js b/app.js index a5333f8..664fee7 100644 --- a/app.js +++ b/app.js @@ -1,6 +1,6 @@ const fs = require("fs"); const Discord = require("discord.js"); -const client = new Discord.Client({partials: ["GUILD_MEMBER"], intents: ["GUILDS", "GUILD_MESSAGES", "GUILD_MEMBERS", "DIRECT_MESSAGES", "GUILD_PRESENCES"], fetchAllMembers: true }); +const client = new Discord.Client({partials: ["GUILD_MEMBER"], intents: ["GUILDS", "GUILD_MESSAGES", "GUILD_MEMBERS", "DIRECT_MESSAGES", "GUILD_PRESENCES", "GUILD_MESSAGE_REACTIONS"], fetchAllMembers: true }); if (!fs.existsSync("./config.json")) { console.log("config.json not found"); @@ -22,15 +22,14 @@ fs.readdir("./events/", (err, files) => { }); client.commands = new Discord.Collection(); +client.aliases = new Discord.Collection(); -fs.readdir("./commands/", (err, files) => { - if (err) return console.error(err); - files.forEach(file => { - if (!file.endsWith(".js")) return; - let props = require(`./commands/${file}`); - let commandName = file.split(".")[0]; - client.commands.set(commandName, props); - }); +["commandHandler"].forEach(x => require(`./helpers/${x}`)(client)); + +client.categories = fs.readdirSync("./commands/"); + +["commandHandler"].forEach(handler => { + require(`./helpers/${handler}`)(client); }); client.login(client.config.token); \ No newline at end of file diff --git a/commands/ban.js b/commands/ban.js deleted file mode 100644 index 3c3b212..0000000 --- a/commands/ban.js +++ /dev/null @@ -1,72 +0,0 @@ -const Discord = require('discord.js'); -const GphApiClient = require('giphy-js-sdk-core'); -const giphkey = require('../config.json'); -const { messageEmbed } = require('../helpers/messageEmbeds'); -const giphy = GphApiClient(giphkey.giphy); - - -exports.run = async(client, message, args) => { -if (message.member.permissions.has('BAN_MEMBERS')) { - const member = message.mentions.members.first() || await message.guild.members.fetch(args[0]) - - const reason = args.slice(1).join(' ') - - if ( !args[0] ) { - - const options = { - - title: `**πŸ’£ Command: ${client.config.prefix}ban**`, - fieldValue: 'Bans a member from the current server.', - field: `**πŸ›  Usage: **${client.config.prefix}ban _[username/user_id]_ _[reason]_ - \n**🧾 Aliases: **${client.config.prefix}banish - \n**πŸ” Required permissions: **BAN_MEMBERS - \n**πŸ“ Examples: **\n ${client.config.prefix}ban ${message.member}\n${client.config.prefix}banish \`${message.member.id}\``, - color: 'random' - - } - const banEmbed = messageEmbed(options, true) - return message.channel.send({ embeds: [banEmbed]}); - } - else { - member.ban().then(() => { - giphy.search('gifs', { q: 'ban' }).then((response) => { - const totalResponses = response.data.length; - const responseIndex = - Math.floor(Math.random() * 10 + 1) % totalResponses; - const responseFinal = response.data[responseIndex]; - - const options = { - description: `βœ… ${member} was banned. - \n**πŸ“Reason:** _${reason}`, - color: 'green' - } - const msgEmbed = messageEmbed(options) - - message.channel.send({ embeds: [msgEmbed]}); - message.channel.send({ - files: [responseFinal.images.fixed_height.url], - }); - }); - }).catch((error) => { - console.log(error); - - const options = { - description: `❌ Unable to ban ${member}`, - color: 'red' - } - const errorEmbed = messageEmbed(options) - message.channel.send({ embeds: [errorEmbed]}); - }); - } -} -else { - const warningEmbed = new Discord.MessageEmbed() - .setDescription('πŸ”’ Sorry, you do not have sufficient permissions to do this.') - .setColor('YELLOW'); - message.channel.send({ embeds: [warningEmbed]}); -} -} -exports.conf = { - aliases: ['b'], - permissions: ['SEND_MESSAGES', 'EMBED_LINKS'] -}; \ No newline at end of file diff --git a/commands/botinfo.js b/commands/misc/botinfo.js similarity index 92% rename from commands/botinfo.js rename to commands/misc/botinfo.js index adacde3..a388e26 100644 --- a/commands/botinfo.js +++ b/commands/misc/botinfo.js @@ -1,52 +1,52 @@ -const os = require('os'); -const { MessageEmbed } = require('discord.js'); -exports.run = async (client, message) => { - let delay = ms => new Promise(res => setTimeout(res, ms)); - - function cpuaverage() { - var totalIdle = 0, totalTick = 0; - var cpus = os.cpus(); - for (var i = 0, len = cpus.length; i < len; i++) { - var cpu = cpus[i]; - for (type in cpu.times) { - totalTick += cpu.times[type]; - } - totalIdle += cpu.times.idle; - } - return { idle: totalIdle / cpus.length, total: totalTick / cpus.length }; - } - - async function msg() { - var startMeasure = cpuaverage(); - await delay(100); - var endMeasure = cpuaverage(); - var percentagecpu = 100 - ~~(100 * (endMeasure.idle - startMeasure.idle) / (endMeasure.total - startMeasure.total)); - - let emb = new MessageEmbed() - .setTitle("Bot Info") - .setColor(client.color) - .setThumbnail(client.thumbnail) - .addField("Bot's memory usage [" + ((process.memoryUsage().heapUsed / os.totalmem()) * 100).toFixed(2) + "%]", (process.memoryUsage().heapUsed / 1024 / 1024).toFixed(2) + " MB / " + (((os.totalmem() / 1024) / 1024) / 1024).toFixed(2) + " GB", true) - .addField("Cpu usage [" + percentagecpu + "%]", (process.cpuUsage().user / 1024 / 1024).toFixed(2) + " MB | " + os.cpus().length + (os.cpus().length === 1 ? " Core" : " Cores"), true) - .addField("\u200b", "\u200b", true) - .addField("Mem usage [" + Math.floor(((os.totalmem() - os.freemem()) / os.totalmem()) * 100) + "%]", ((((os.totalmem() - os.freemem()) / 1024) / 1024) / 1024).toFixed(2) + " GB / " + (((os.totalmem() / 1024) / 1024) / 1024).toFixed(2) + " GB", true) - .addField("Node Js version", process.versions.node, true) - .addField("\u200b", "\u200b", true) - .addField("Platform", process.platform.replace(/win32/g, "Windows"), true) - .addField("Architecture", os.arch(), true) - .addField("\u200b", "\u200b", true) - .addField("Bot's Uptime", client.function.timeformat(client.uptime / 1000), false) - .setFooter(client.footer) - message.channel.send({ embeds: [emb] }); - } - - if (client.config.ownerid) - if (message.author.id === client.config.ownerid) msg(); - else message.channel.send('```css\nThis command is locked for owner```'); - else msg(); -}; - -exports.conf = { - aliases: ['binfo'], - permissions: ['SEND_MESSAGES', 'EMBED_LINKS'] +const os = require('os'); +const moment = require('moment'); +const { MessageEmbed } = require('discord.js'); +exports.run = async (client, message) => { + let delay = ms => new Promise(res => setTimeout(res, ms)); + + function cpuaverage() { + var totalIdle = 0, totalTick = 0; + var cpus = os.cpus(); + for (var i = 0, len = cpus.length; i < len; i++) { + var cpu = cpus[i]; + for (type in cpu.times) { + totalTick += cpu.times[type]; + } + totalIdle += cpu.times.idle; + } + return { idle: totalIdle / cpus.length, total: totalTick / cpus.length }; + } + + async function msg() { + var startMeasure = cpuaverage(); + await delay(100); + var endMeasure = cpuaverage(); + var percentagecpu = 100 - ~~(100 * (endMeasure.idle - startMeasure.idle) / (endMeasure.total - startMeasure.total)); + + let emb = new MessageEmbed() + .setTitle("Bot Information") + .setColor("#fffff") + .addField("Bot's memory usage [" + ((process.memoryUsage().heapUsed / os.totalmem()) * 100).toFixed(2) + "%]", (process.memoryUsage().heapUsed / 1024 / 1024).toFixed(2) + " MB / " + (((os.totalmem() / 1024) / 1024) / 1024).toFixed(2) + " GB", true) + .addField("Cpu usage [" + percentagecpu + "%]", (process.cpuUsage().user / 1024 / 1024).toFixed(2) + " MB | " + os.cpus().length + (os.cpus().length === 1 ? " Core" : " Cores"), true) + .addField("\u200b", "\u200b", true) + .addField("Mem usage [" + Math.floor(((os.totalmem() - os.freemem()) / os.totalmem()) * 100) + "%]", ((((os.totalmem() - os.freemem()) / 1024) / 1024) / 1024).toFixed(2) + " GB / " + (((os.totalmem() / 1024) / 1024) / 1024).toFixed(2) + " GB", true) + .addField("Node Js version", process.versions.node, true) + .addField("\u200b", "\u200b", true) + .addField("Platform", process.platform.replace(/win32/g, "Windows"), true) + .addField("Architecture", os.arch(), true) + .addField("\u200b", "\u200b", true) + .addField("Bot's Uptime", client.function.timeformat(client.uptime / 1000), false) + .setFooter(moment().format('MMMM Do YYYY, h:mm:ss a')) + message.channel.send({ embeds: [emb] }); + } + + if (client.config.ownerid) + if (message.author.id === client.config.ownerid) msg(); + else message.channel.send('```css\nThis command is locked for owner```'); + else msg(); +}; + +exports.conf = { + aliases: ['binfo'], + permissions: ['SEND_MESSAGES', 'EMBED_LINKS'] }; \ No newline at end of file diff --git a/commands/help.js b/commands/misc/help.js similarity index 98% rename from commands/help.js rename to commands/misc/help.js index de6526b..6dc849a 100644 --- a/commands/help.js +++ b/commands/misc/help.js @@ -1,51 +1,51 @@ -const { MessageEmbed } = require('discord.js'); -exports.run = async (client, message, args) => { - if (args[0] && !isNaN(args[0])) return message.channel.send("Command name cannot be a number"); - if (!args[0]) args[0] = 'none'; - - switch (args[0].toLowerCase()) { - case ('ban'): - message.channel.send("```css\n" + client.config.prefix + "ban \nAlias: " + client.config.prefix + "s```"); - break; - case ('serverinfo'): - message.channel.send("```css\n" + client.config.prefix + "serverinfo \nAlias: " + client.config.prefix + "sinfo```"); - break; - case ('kick'): - message.channel.send("```css\n" + client.config.prefix + "kick \nAlias: " + client.config.prefix + "p, " + client.config.prefix + "scoreboard```"); - break; - case ('mute'): - message.channel.send("```css\n" + client.config.prefix + "mute \nAlias: " + client.config.prefix + "f```"); - break; - case ('warn'): - message.channel.send("```css\n" + client.config.prefix + "warn \nAlias: none```"); - break; - case ('logs'): - message.channel.send("```css\n" + client.config.prefix + "logs\nMethod: Your id and password for " + client.config.webfronturl + " will be asked in DM```"); - break; - case ('invite'): - message.channel.send("```css\n" + client.config.prefix + "invite\nAlias: none```"); - break; - case ('profile'): - message.channel.send("```css\n" + client.config.prefix + "profile \nAlias: " + client.config.prefix + "e```"); - break; - case ('botinfo'): - message.channel.send("```css\n" + client.config.prefix + "botinfo\nAlias: " + client.config.prefix + "binfo```"); - break; - case ('ping'): - message.channel.send("```css\n" + client.config.prefix + "ping\nAlias: none```"); - break; - default: - const emc = new MessageEmbed() - .setTitle('Help') - .setColor(client.color) - .setThumbnail(client.thumbnail) - .setDescription("πŸ”Έ `" + client.config.prefix + "ban` - Shows all iw4m admin server's status\n" + "πŸ”Ή `" + client.config.prefix + "serverinfo` - Shows info about given server number\n" + "πŸ”Έ `" + client.config.prefix + "kick` - Shows player scoreboard for the given server\n" + "πŸ”Ή `" + client.config.prefix + "mute` - Shows name, iw4m client id and xuid of found clients\n" + "πŸ”Έ `" + client.config.prefix + "warn` - Shows all stats about the player\n" + "πŸ”Ή `" + client.config.prefix + "logs` - Asks you for login info in dm\n" + "πŸ”Έ `" + client.config.prefix + "invite` - Deletes your login and logs you out\n" + "πŸ”Ή `" + client.config.prefix + "profile` - profiles the command in the given server\n" + "πŸ”Ή `" + client.config.prefix + "botinfo` - Shows bot's overall status\n" + "πŸ”Έ `" + client.config.prefix + "ping` - Shows bot's latency to discord\n" + "```Use " + client.config.prefix + "help or " + client.config.prefix + "h to get more info about the command```") - .setFooter(client.footer); - message.channel.send({ embeds: [emc] }); - } -}; - -exports.conf = { - aliases: ['h'], - permissions: ['SEND_MESSAGES', 'EMBED_LINKS'] +const { MessageEmbed } = require('discord.js'); +exports.run = async (client, message, args) => { + if (args[0] && !isNaN(args[0])) return message.channel.send("Command name cannot be a number"); + if (!args[0]) args[0] = 'none'; + + switch (args[0].toLowerCase()) { + case ('ban'): + message.channel.send("```css\n" + client.config.prefix + "ban \nAlias: " + client.config.prefix + "s```"); + break; + case ('serverinfo'): + message.channel.send("```css\n" + client.config.prefix + "serverinfo \nAlias: " + client.config.prefix + "sinfo```"); + break; + case ('kick'): + message.channel.send("```css\n" + client.config.prefix + "kick \nAlias: " + client.config.prefix + "p, " + client.config.prefix + "scoreboard```"); + break; + case ('mute'): + message.channel.send("```css\n" + client.config.prefix + "mute \nAlias: " + client.config.prefix + "f```"); + break; + case ('warn'): + message.channel.send("```css\n" + client.config.prefix + "warn \nAlias: none```"); + break; + case ('logs'): + message.channel.send("```css\n" + client.config.prefix + "logs\nMethod: Your id and password for " + client.config.webfronturl + " will be asked in DM```"); + break; + case ('invite'): + message.channel.send("```css\n" + client.config.prefix + "invite\nAlias: none```"); + break; + case ('profile'): + message.channel.send("```css\n" + client.config.prefix + "profile \nAlias: " + client.config.prefix + "e```"); + break; + case ('botinfo'): + message.channel.send("```css\n" + client.config.prefix + "botinfo\nAlias: " + client.config.prefix + "binfo```"); + break; + case ('ping'): + message.channel.send("```css\n" + client.config.prefix + "ping\nAlias: none```"); + break; + default: + const emc = new MessageEmbed() + .setTitle('Help') + .setColor(client.color) + .setThumbnail(client.thumbnail) + .setDescription("πŸ”Έ `" + client.config.prefix + "ban` - Shows all iw4m admin server's status\n" + "πŸ”Ή `" + client.config.prefix + "serverinfo` - Shows info about given server number\n" + "πŸ”Έ `" + client.config.prefix + "kick` - Shows player scoreboard for the given server\n" + "πŸ”Ή `" + client.config.prefix + "mute` - Shows name, iw4m client id and xuid of found clients\n" + "πŸ”Έ `" + client.config.prefix + "warn` - Shows all stats about the player\n" + "πŸ”Ή `" + client.config.prefix + "logs` - Asks you for login info in dm\n" + "πŸ”Έ `" + client.config.prefix + "invite` - Deletes your login and logs you out\n" + "πŸ”Ή `" + client.config.prefix + "profile` - profiles the command in the given server\n" + "πŸ”Ή `" + client.config.prefix + "botinfo` - Shows bot's overall status\n" + "πŸ”Έ `" + client.config.prefix + "ping` - Shows bot's latency to discord\n" + "```Use " + client.config.prefix + "help or " + client.config.prefix + "h to get more info about the command```") + .setFooter(client.footer); + message.channel.send({ embeds: [emc] }); + } +}; + +exports.conf = { + aliases: ['h'], + permissions: ['SEND_MESSAGES', 'EMBED_LINKS'] }; \ No newline at end of file diff --git a/commands/ping.js b/commands/misc/ping.js similarity index 97% rename from commands/ping.js rename to commands/misc/ping.js index d9d0666..5b1d34b 100644 --- a/commands/ping.js +++ b/commands/misc/ping.js @@ -1,12 +1,12 @@ -const { MessageEmbed } = require('discord.js'); -exports.run = (client, message) => { - const embed = new MessageEmbed() - .setTitle('🌐 Your ping is: ' + Math.floor(client.ws.ping) + 'ms') - .setColor(client.color) - message.channel.send({ embeds: [embed] }); -}; - -exports.conf = { - aliases: [], - permissions: ['SEND_MESSAGES', 'EMBED_LINKS'] +const { MessageEmbed } = require('discord.js'); +exports.run = (client, message) => { + const embed = new MessageEmbed() + .setTitle('🌐 Your ping is: ' + Math.floor(client.ws.ping) + 'ms') + .setColor(client.color) + message.channel.send({ embeds: [embed] }); +}; + +exports.conf = { + aliases: [], + permissions: ['SEND_MESSAGES', 'EMBED_LINKS'] }; \ No newline at end of file diff --git a/commands/user.js b/commands/misc/user.js similarity index 63% rename from commands/user.js rename to commands/misc/user.js index 848ec2a..f6e0b7e 100644 --- a/commands/user.js +++ b/commands/misc/user.js @@ -1,128 +1,128 @@ -const moment = require('moment') -const { messageEmbed } = require('../helpers/messageEmbeds') - -exports.run = async (client, message, args) => { - - const member = message.mentions.members.first() || await message.guild.members.fetch(args[0]) - - if ( !args[0] ) { - - const options = { - - title: `**πŸ” Command: ${client.config.prefix}user**`, - fieldValue: 'Display some information from a user.', - field: `**πŸ›  Usage: **${client.config.prefix}user _[username/user_id]_ - \n**🧾 Aliases: **${client.config.prefix}search - \n**πŸ“ Examples: **\n ${client.config.prefix}user ${message.member}\n${client.config.prefix}search \`${message.member.id}\``, - color: 'random' - - } - const userEmbed = messageEmbed(options, true) - return message.channel.send({ embeds: [userEmbed]}); - - } else { - - let permissions = [] - let havePerms - let acknowledgements - - if(member.permissions.has("KICK_MEMBERS")){ - permissions.push("\`Kick Members\`"); - } - - if(member.permissions.has("BAN_MEMBERS")){ - permissions.push("\`Ban Members\`"); - } - - if(member.permissions.has("ADMINISTRATOR")){ - permissions.push("\`Administrator\`"); - } - - if(member.permissions.has("MANAGE_MESSAGES")){ - permissions.push("\`Manage Messages\`"); - } - - if(member.permissions.has("MANAGE_CHANNELS")){ - permissions.push("\`Manage Channels\`"); - } - - if(member.permissions.has("MENTION_EVERYONE")){ - permissions.push("\`Mention Everyone\`"); - } - - if(member.permissions.has("MANAGE_NICKNAMES")){ - permissions.push("\`Manage Nicknames\`"); - } - - if(member.permissions.has("MANAGE_ROLES")){ - permissions.push("\`Manage Roles\`"); - } - - if(member.permissions.has("MANAGE_WEBHOOKS")){ - permissions.push("\`Manage Webhooks\`"); - } - - if(member.permissions.has("MANAGE_EMOJIS_AND_STICKERS")){ - permissions.push("\`Manage Emojis\`"); - } - - if(!permissions.length == 0){ - havePerms = `\n**πŸ”“ Permissions:** \n${permissions.join(' ')}` - } - - const owner = await message.guild.fetchOwner() - if(member.user.id == owner.id || member.permissions.has("ADMINISTRATOR") || member.permissions.has("MANAGE_MESSAGES") ){ - if( member.permissions.has("ADMINISTRATOR") ){ - acknowledgements = 'Admin' - } - if( member.permissions.has("MANAGE_MESSAGES") && !acknowledgements ){ - acknowledgements = 'Mod' - } - if(member.user.id == owner.id) { - acknowledgements = 'Owner' - } - } - - let isAdmin - const roles = member.roles.cache.sort((a, b) => b.position - a.position).map(role => role.toString()).slice(0, -1); - if( acknowledgements ){ - - if( acknowledgements === 'Admin' ){ - isAdmin = `\n**❗ Acknowledgements:** __**βš” Server ADMINISTRATOR βš”**__` - } - if( acknowledgements === 'Mod' ){ - isAdmin = `\n**❗ Acknowledgements:** __**πŸ›‘ Server MODERATOR πŸ›‘**__` - } - if( acknowledgements === 'Owner' ) { - isAdmin = `\n**❗ Acknowledgements:** __**⭐ Server OWNER ⭐**__` - } - } - - const opt = { - thumbnail: member.user.displayAvatarURL({ dynamic: true }), - title: `${member.user.tag} Info:`, - description: `<@${member.user.id}>`, - fieldValue: `User ID: \`${member.user.id}\``, - field: `\n**🧬 Username:** ${member.user.username} - **πŸ” Nickname:** ${member.displayName} - \n**πŸ“… Join Date:** ${moment(member.joinedAt).format('MMMM D YYYY')} - **πŸ“† Created On:** ${moment(member.user.createdTimestamp).format('MMMM D YYYY')} - \n**πŸ“‘ Roles \`(${roles.length})\`:** \n${roles.length ? roles.join(', ') : 'No Roles'} - ${havePerms || ''} - ${isAdmin || ''} - `, - color: 'random', - footer: `Sent By: ${message.author.username}` - - } - const userEmbed = messageEmbed( opt, true ) - message.channel.send({ embeds: [userEmbed] }) - - } - -} - -exports.conf = { - aliases: ['search'], - permissions: ['SEND_MESSAGES', 'EMBED_LINKS'] +const moment = require('moment') +const { messageEmbed } = require('../../helpers/messageEmbeds'); +const functions = require("../../helpers/functions") + +exports.run = async (client, message, args) => { + + if (!args[0]) { + + const options = { + + title: `**πŸ” Command: ${client.config.prefix}user**`, + fieldValue: 'Display some information from a user.', + field: `**πŸ›  Usage: **${client.config.prefix}user _[username/user_id]_ + \n**🧾 Aliases: **${client.config.prefix}search + \n**πŸ“ Examples: **\n ${client.config.prefix}user ${message.member}\n${client.config.prefix}search \`${message.member.id}\``, + color: 'random' + + } + const userEmbed = messageEmbed(options, true) + return message.channel.send({ embeds: [userEmbed] }); + + } else { + + const member = functions.getMember(client, message, args) + + let permissions = [] + let havePerms + let acknowledgements + + if (member.permissions.has("KICK_MEMBERS")) { + permissions.push("\`Kick Members\`"); + } + + if (member.permissions.has("BAN_MEMBERS")) { + permissions.push("\`Ban Members\`"); + } + + if (member.permissions.has("ADMINISTRATOR")) { + permissions.push("\`Administrator\`"); + } + + if (member.permissions.has("MANAGE_MESSAGES")) { + permissions.push("\`Manage Messages\`"); + } + + if (member.permissions.has("MANAGE_CHANNELS")) { + permissions.push("\`Manage Channels\`"); + } + + if (member.permissions.has("MENTION_EVERYONE")) { + permissions.push("\`Mention Everyone\`"); + } + + if (member.permissions.has("MANAGE_NICKNAMES")) { + permissions.push("\`Manage Nicknames\`"); + } + + if (member.permissions.has("MANAGE_ROLES")) { + permissions.push("\`Manage Roles\`"); + } + + if (member.permissions.has("MANAGE_WEBHOOKS")) { + permissions.push("\`Manage Webhooks\`"); + } + + if (member.permissions.has("MANAGE_EMOJIS_AND_STICKERS")) { + permissions.push("\`Manage Emojis\`"); + } + + if (!permissions.length == 0) { + havePerms = `\n**πŸ”“ Permissions:** \n${permissions.join(' ')}` + } + + const owner = await message.guild.fetchOwner() + if (member.user.id == owner.id || member.permissions.has("ADMINISTRATOR") || member.permissions.has("MANAGE_MESSAGES")) { + if (member.permissions.has("ADMINISTRATOR")) { + acknowledgements = 'Admin' + } + if (member.permissions.has("MANAGE_MESSAGES") && !acknowledgements) { + acknowledgements = 'Mod' + } + if (member.user.id == owner.id) { + acknowledgements = 'Owner' + } + } + + let isAdmin + const roles = member.roles.cache.sort((a, b) => b.position - a.position).map(role => role.toString()).slice(0, -1); + if (acknowledgements) { + + if (acknowledgements === 'Admin') { + isAdmin = `\n**❗ Acknowledgements:** __**βš” Server ADMINISTRATOR βš”**__` + } + if (acknowledgements === 'Mod') { + isAdmin = `\n**❗ Acknowledgements:** __**πŸ›‘ Server MODERATOR πŸ›‘**__` + } + if (acknowledgements === 'Owner') { + isAdmin = `\n**❗ Acknowledgements:** __**⭐ Server OWNER ⭐**__` + } + } + + const opt = { + thumbnail: member.user.displayAvatarURL({ dynamic: true }), + title: `${member.user.tag} Info:`, + description: `<@${member.user.id}>`, + fieldValue: `User ID: \`${member.user.id}\``, + field: `\n**🧬 Username:** ${member.user.username} + **πŸ” Nickname:** ${member.displayName} + \n**πŸ“… Join Date:** ${moment(member.joinedAt).format('MMMM D YYYY')} + **πŸ“† Created On:** ${moment(member.user.createdTimestamp).format('MMMM D YYYY')} + \n**πŸ“‘ Roles \`(${roles.length})\`:** \n${roles.length ? roles.join(', ') : 'No Roles'} + ${havePerms || ''} + ${isAdmin || ''} + `, + color: 'random' + + } + const userEmbed = messageEmbed(opt, true).setFooter(`Sent By: ${message.author.username}`, client.user.displayAvatarURL()) + message.channel.send({ embeds: [userEmbed] }) + + } + +} + +exports.conf = { + aliases: ['search'], + permissions: ['SEND_MESSAGES', 'EMBED_LINKS'] } \ No newline at end of file diff --git a/commands/addrole.js b/commands/moderation/addrole.js similarity index 57% rename from commands/addrole.js rename to commands/moderation/addrole.js index ac75732..91d35ac 100644 --- a/commands/addrole.js +++ b/commands/moderation/addrole.js @@ -1,80 +1,82 @@ -const Discord = require('discord.js'); -const { messageEmbed } = require('../helpers/messageEmbeds'); - -exports.run = async(client, message, args) => { - - if( message.member.permissions.has('MANAGE_ROLES')){ - const member = message.mentions.members.first() || await message.guild.members.fetch(args[0]) - - if( !member ){ - const options = { - title: `**✏ Command: ${client.config.prefix}addrole**`, - fieldValue: `Adds the specified role to a member`, - field :`**πŸ›  Usage: **${client.config.prefix}addrole _[username/user-id]_ \`\` - \n**πŸ” Required permissions:** ***MANAGE ROLE*** - \n**πŸ“ Examples: **\n${client.config.prefix}addrole ${message.member} Mod\n${client.config.prefix}addrole \`${message.member.id}\` Some Role`, - color: 'RANDOM' - } - const addroleEmbed = messageEmbed( options, true ) - return message.channel.send( {embeds: [addroleEmbed]} ) - }else { - const role = message.guild.roles.cache.find(role => role.name == args.slice(1).join(' ') ) - - if( !args.slice(1).join(' ') ){ - - const options = { - description: '❌ No role was provided.', - color: 'RED' - } - const errorEmbed = messageEmbed( options ) - return message.channel.send( {embeds: [errorEmbed]} ) - } - - if( !role ){ - const options = { - description: `❌ The \`${args.slice(1).join(' ')}\` role was not found.`, - color: 'RED' - } - const errorEmbed = messageEmbed( options ) - return message.channel.send( {embeds: [errorEmbed]} ) - } - - if( member.roles.cache.has(role.id)){ - const options = { - description: `❌ ${member} already has the \`${role.name}\` role.`, - color: 'RED' - } - const errorEmbed = messageEmbed( options ) - return message.channel.send({ embeds: [errorEmbed] }); - } - else { - member.roles.add(role.id).then(() => { - const options = { - description: `βœ… ${member} was given the \`${role.name}\` role.`, - color: 'GREEN' - } - const msgEmbed = messageEmbed( options ) - message.channel.send({ embeds: [msgEmbed] }); - }).catch( error => { - console.log(error) - const options = { - description: `❌ Unable to add the \`${role.name}\` role to ${member}`, - color: 'RED' - } - const errorEmbed = messageEmbed( options ) - message.channel.send({ embeds: [errorEmbed] }); - } ) - } - } - }else { - const warningEmbed = new Discord.MessageEmbed() - .setDescription('πŸ”’ Sorry, you do not have sufficient permissions to do this.') - .setColor('YELLOW'); - message.channel.send({ embeds: [warningEmbed] }); - } -} - -exports.conf = { - aliases: ['ar'], - permissions: ['SEND_MESSAGES', 'EMBED_LINKS', 'MANAGE_ROLES'] +const Discord = require('discord.js'); +const { messageEmbed } = require('../../helpers/messageEmbeds'); +const { getMember } = require("../../helpers/functions") + +exports.run = async (client, message, args) => { + + if (message.member.permissions.has('MANAGE_ROLES')) { + + if (!args[0]) { + const options = { + title: `**✏ Command: ${client.config.prefix}addrole**`, + fieldValue: `Adds the specified role to a member`, + field: `**πŸ›  Usage: **${client.config.prefix}addrole _[username/user-id]_ \`\` + \n**πŸ” Required permissions:** ***MANAGE ROLE*** + \n**πŸ“ Examples: **\n${client.config.prefix}addrole ${message.member} Mod\n${client.config.prefix}addrole \`${message.member.id}\` Some Role`, + color: 'RANDOM' + } + const addroleEmbed = messageEmbed(options, true) + return message.channel.send({ embeds: [addroleEmbed] }) + } else { + const member = getMember(client, message, args) + + const role = message.guild.roles.cache.find(role => role.name == args.slice(1).join(' ')) + + if (!args.slice(1).join(' ')) { + + const options = { + description: '❌ No role was provided.', + color: 'RED' + } + const errorEmbed = messageEmbed(options) + return message.channel.send({ embeds: [errorEmbed] }) + } + + if (!role) { + const options = { + description: `❌ The \`${args.slice(1).join(' ')}\` role was not found.`, + color: 'RED' + } + const errorEmbed = messageEmbed(options) + return message.channel.send({ embeds: [errorEmbed] }) + } + + if (member.roles.cache.has(role.id)) { + const options = { + description: `❌ ${member} already has the \`${role.name}\` role.`, + color: 'RED' + } + const errorEmbed = messageEmbed(options) + return message.channel.send({ embeds: [errorEmbed] }); + } + else { + member.roles.add(role.id).then(() => { + const options = { + description: `βœ… ${member} was given the \`${role.name}\` role.`, + color: 'GREEN' + } + const msgEmbed = messageEmbed(options) + message.channel.send({ embeds: [msgEmbed] }); + }).catch(error => { + console.log(error) + const options = { + description: `❌ Unable to add the \`${role.name}\` role to ${member}`, + color: 'RED' + } + const errorEmbed = messageEmbed(options) + message.channel.send({ embeds: [errorEmbed] }); + }) + } + } + } else { + const warningEmbed = new Discord.MessageEmbed() + .setDescription('πŸ”’ Sorry, you do not have sufficient permissions to do this.') + .setColor('YELLOW'); + message.channel.send({ embeds: [warningEmbed] }); + } +} + +exports.conf = { + aliases: ['ar'], + permissions: ['SEND_MESSAGES', 'EMBED_LINKS', 'MANAGE_ROLES'] }; \ No newline at end of file diff --git a/commands/moderation/ban.js b/commands/moderation/ban.js new file mode 100644 index 0000000..0916142 --- /dev/null +++ b/commands/moderation/ban.js @@ -0,0 +1,97 @@ +const Discord = require('discord.js'); +const GphApiClient = require('giphy-js-sdk-core'); +const giphkey = require('../../config.json'); +const DB = require('../../helpers/db-functions') + +const { messageEmbed } = require('../../helpers/messageEmbeds'); +const { getMember } = require("../../helpers/functions") +const moment = require('moment'); + +const giphy = GphApiClient(giphkey.giphy); + +exports.run = async (client, message, args) => { + if (message.member.permissions.has('BAN_MEMBERS')) { + + if (!args[0]) { + + const options = { + + title: `**πŸ’£ Command: ${client.config.prefix}ban**`, + fieldValue: 'Bans a member from the current server.', + field: `**πŸ›  Usage: **${client.config.prefix}ban _[username/user_id]_ _[reason]_ + \n**🧾 Aliases: **${client.config.prefix}banish + \n**πŸ” Required permissions: **BAN_MEMBERS + \n**πŸ“ Examples: **\n ${client.config.prefix}ban ${message.member}\n${client.config.prefix}banish \`${message.member.id}\``, + color: 'random' + + } + const banEmbed = messageEmbed(options, true) + return message.channel.send({ embeds: [banEmbed] }); + } + + + else { + const member = getMember(client, message, args) + + let reason = args.slice(1).join(' ') + const db = new DB() + member.ban().then(async () => { + + await message.channel.bulkDelete(1) + + if (!reason) reason = "No reason" + const config = { + server_id: message.guild.id, + user_id: member.id, + reason: reason, + command: "ban", + date: moment().format('MMMM Do YYYY, h:mm:ss a') + } + await db.SaveDataSactions(config) + + config.made_by = message.author.username + config.user_name = member.user.username + await db.SaveLogData(config) + + giphy.search('gifs', { q: 'ban' }).then((response) => { + const totalResponses = response.data.length; + const responseIndex = + Math.floor(Math.random() * 10 + 1) % totalResponses; + const responseFinal = response.data[responseIndex]; + + const options = { + description: `βœ… ${member} was banned. + \n**πŸ“Reason:** _${reason}_`, + color: 'green' + } + const msgEmbed = messageEmbed(options) + + message.channel.send({ embeds: [msgEmbed] }); + message.channel.send({ + files: [responseFinal.images.fixed_height.url], + }); + }); + }).catch((error) => { + console.log(error); + + const options = { + description: `❌ Unable to ban ${member}`, + color: 'red' + } + const errorEmbed = messageEmbed(options) + message.channel.send({ embeds: [errorEmbed] }); + }); + + } + } + else { + const warningEmbed = new Discord.MessageEmbed() + .setDescription('πŸ”’ Sorry, you do not have sufficient permissions to do this.') + .setColor('YELLOW'); + message.channel.send({ embeds: [warningEmbed] }); + } +} +exports.conf = { + aliases: ['b'], + permissions: ['SEND_MESSAGES', 'EMBED_LINKS'] +}; \ No newline at end of file diff --git a/commands/kick.js b/commands/moderation/kick.js similarity index 61% rename from commands/kick.js rename to commands/moderation/kick.js index fb21bd7..8d8282f 100644 --- a/commands/kick.js +++ b/commands/moderation/kick.js @@ -1,67 +1,83 @@ -const Discord = require('discord.js'); -const GphApiClient = require('giphy-js-sdk-core'); -const giphkey = require('../config.json'); - -const { messageEmbed } = require('../helpers/messageEmbeds'); - -const giphy = GphApiClient(giphkey.giphy); - -exports.run = (client, message, args) => { - if( message.member.permissions.has('KICK_MEMBERS')) { - const member = message.mentions.members.first() || message.guild.members.cache.get(args[0]) - - const prefix = client.config.prefix - - if( !member ) { - const options = { - title: `**πŸšͺ Command: ${prefix}kick**`, - fieldValue: `Kicking a member off the server`, - field: `**Usage:** ${prefix}kick _[username_/user_id]_ - \n**πŸ” Required permissions:** ***KICK MEMBERS*** - \n**πŸ“ Examples: **\n${prefix}kick ${message.member}\n${prefix}kick \`${message.member.id}\` - `, - color: 'random' - } - const kickEmbed = messageEmbed(options, true) - message.channel.send({ embeds: [kickEmbed] }) - } else { - member.kick().then( () => { - giphy.search('gifs', { q: 'kick' }).then( res => { - const totalResponses = res.data.length - const responseIndex = Math.floor(Math.random() * 10 + 1) % totalResponses - const responseFinal = res.data[responseIndex] - - const options = { - description: `βœ… ${member} was kicked.`, - color: 'green' - } - const msgEmbed = messageEmbed( options ) - message.channel.send({ embeds: [msgEmbed] }) - message.channel.send({ - files: [responseFinal.images.fixed_height.url], - }) - }) - }).catch( (error) => { - console.log(error) - const options = { - description: `❌ Unable to kick ${member}`, - color: 'red' - } - const errorEmbed = messageEmbed(options) - message.channel.send({ embeds: [errorEmbed] }) - }) - } - } else { - const options = { - description: `πŸ”’ Sorry, you do not have sufficient permissions to do this.`, - color: 'yellow' - } - const warningEmbed = messageEmbed(options) - message.channel.send({ embeds: [warningEmbed] }) - } -} - -exports.conf = { - aliases: ['k'], - permissions: ['SEND_MESSAGES', 'EMBED_LINKS'] +const DB = require("../../helpers/db-functions") +const GphApiClient = require('giphy-js-sdk-core'); +const giphkey = require('../../config.json'); + +const { messageEmbed } = require('../../helpers/messageEmbeds'); +const { getMember } = require("../../helpers/functions") + +const giphy = GphApiClient(giphkey.giphy); + +exports.run = async (client, message, args) => { + if (message.member.permissions.has('KICK_MEMBERS')) { + const prefix = client.config.prefix + + if (!args[0]) { + const options = { + title: `**πŸšͺ Command: ${prefix}kick**`, + fieldValue: `Kicking a member off the server`, + field: `**Usage:** ${prefix}kick _[username_/user_id]_ + \n**πŸ” Required permissions:** ***KICK MEMBERS*** + \n**πŸ“ Examples: **\n${prefix}kick ${message.member}\n${prefix}kick \`${message.member.id}\` + `, + color: 'random' + } + const kickEmbed = messageEmbed(options, true) + message.channel.send({ embeds: [kickEmbed] }) + } else { + const db = new DB() + let reason = args.slice(1).join(" ") + if(!reason) reason = "No reason" + + const member = getMember(client, message, args) + const config = { + server_id: message.guild.id, + user_id: member.id, + mode_by: message.author.username, + user_name: member.user.username, + reason: reason, + sanction: "kick", + date: moment().format('MMMM Do YYYY, h:mm:ss a') + } + await db.SaveLogData( config ) + + member.kick().then(() => { + + giphy.search('gifs', { q: 'kick' }).then(res => { + const totalResponses = res.data.length + const responseIndex = Math.floor(Math.random() * 10 + 1) % totalResponses + const responseFinal = res.data[responseIndex] + + const options = { + description: `βœ… ${member} was kicked. \n**πŸ“ Reason:** __${reason}__`, + color: 'green' + } + const msgEmbed = messageEmbed(options) + message.channel.send({ embeds: [msgEmbed] }) + message.channel.send({ + files: [responseFinal.images.fixed_height.url], + }) + }) + }).catch((error) => { + console.log(error) + const options = { + description: `❌ Unable to kick ${member}`, + color: 'red' + } + const errorEmbed = messageEmbed(options) + message.channel.send({ embeds: [errorEmbed] }) + }) + } + } else { + const options = { + description: `πŸ”’ Sorry, you do not have sufficient permissions to do this.`, + color: 'yellow' + } + const warningEmbed = messageEmbed(options) + message.channel.send({ embeds: [warningEmbed] }) + } +} + +exports.conf = { + aliases: ['k'], + permissions: ['SEND_MESSAGES', 'EMBED_LINKS'] }; \ No newline at end of file diff --git a/commands/moderation/logs.js b/commands/moderation/logs.js new file mode 100644 index 0000000..c5ed380 --- /dev/null +++ b/commands/moderation/logs.js @@ -0,0 +1,105 @@ +const DB = require('../../helpers/db-functions') +const { MessageEmbed } = require('discord.js') + +const { messageEmbed } = require('../../helpers/messageEmbeds'); +const { getMember, Pages, paginationEmbed } = require("../../helpers/functions") + +const db = new DB() + +exports.run = async(client, message, args) => { + if( message.member.permissions.has('MANAGE_ROLES')) { + const logEmbedsWithPagination = async(data, member = null) => { + + if( data.length == 0 ){ + const opt = { + title: '❗ **No Logs found**', + description: `No server or user activity log found`, + color: 'red' + } + const embedError = messageEmbed( opt ) + return message.reply({ embeds: [embedError] }) + } + + let username; + if( member ) username = `πŸ—“ Last Logs of ${member.user.tag}` + + const MAX_FIELDS = 10 + + const fields = data.map( (n) => { + const { user_name, command, reason, made_by, date } = n + + return { + name: `\nπŸ“‹**User:** \`${user_name}\``, + value: `⚠**Command:** \`${command.toUpperCase()}\` πŸ”Ή πŸ“„**Reason:** \`${reason}\`\nβ€· **Made By:** \`${made_by}\` **Date:** \`${date}\`\n`, + } + }) + + if( data.length <= MAX_FIELDS ){ + const embed = new MessageEmbed() + .setTitle(username || `πŸ—“ Last ${MAX_FIELDS} Logs made`) + .setDescription(`The following list shows all the logs made on your server, if you have more than ${MAX_FIELDS} logs, buttons are displayed at the bottom`) + .setColor("RANDOM") + .setFooter(message.author.username, client.user.displayAvatarURL()) + .addFields(fields) + + if(member) embed.setThumbnail(member.user.displayAvatarURL({ dynamic: true })) + + return message.channel.send({ embeds: [embed] }) + + } + + const chunks = Pages(fields, MAX_FIELDS) + const pages = [] + + chunks.forEach((chunk) => { + + const embed = new MessageEmbed() + .setTitle(username || `πŸ—“ Logs History`) + .setColor('RANDOM') + .setDescription(`The following list shows all the logs made on your server, if you have more than ${MAX_FIELDS} logs, buttons are displayed at the bottom`) + .setFooter(message.author.username, client.user.displayAvatarURL()) + .addFields(chunk) + + if(member) embed.setThumbnail(member.user.displayAvatarURL({ dynamic: true })) + + pages.push(embed) + + }) + + paginationEmbed(message, pages); + + } + + if(!args[0]) { + + let querry = { server_id: message.guild.id } + let data = await db.GetLogData( querry ) + + logEmbedsWithPagination( data ) + + } else { + + const member = getMember(client, message, args) + + let querry = { server_id: message.guild.id, user_id: member.id } + let data = await db.GetLogData( querry ) + + logEmbedsWithPagination(data, member) + + } + + } else { + const options = { + description: 'πŸ”’ Sorry, you do not have sufficient permissions to do this.', + color: 'yellow' + } + const warningEmbed = messageEmbed(options) + message.channel.send({ embeds: [warningEmbed] }) + } + +} + +exports.conf = { + aliases: ['log'], + permissions: ['SEND_MESSAGES', 'EMBED_LINKS'] +} diff --git a/commands/moderation/mute.js b/commands/moderation/mute.js new file mode 100644 index 0000000..3b188e3 --- /dev/null +++ b/commands/moderation/mute.js @@ -0,0 +1,191 @@ +const DB = require('../../helpers/db-functions') + +const { messageEmbed } = require('../../helpers/messageEmbeds'); +const { getMember } = require("../../helpers/functions") + +const moment = require('moment'); + +exports.run = async (client, message, args) => { + const prefix = client.config.prefix + + if (message.member.permissions.has('MANAGE_ROLES')) { + + if (!args[0]) { + const options = { + title: `**πŸ”‡ Command: ${prefix}mute**`, + fieldValue: 'The user is not able to send messages or add reactions', + field: `**πŸ›  Usage: **${prefix}mute _[username/user-id]_ _[reason]_ + \n**πŸ” Required permissions:** ***MANAGE ROLES*** + \n**πŸ“ Examples:** \n${prefix}mute ${message.member} _Example reason_\n${prefix}mute \`${message.member.id}\` _Example reason_ + `, + color: 'random' + } + const muteEmbed = messageEmbed(options, true) + return message.channel.send({ embeds: [muteEmbed] }) + } else { + + const member = getMember(client, message, args) + + const db = new DB() + let reason = args.slice(1).join(" ") + let role + + const querry = { server_id: message.guild.id } + const roleMuted = await db.GetRoleMute(querry, 'role_id') + if (!roleMuted) { + const opt = { + title: `🟑 **Pleace SET or CREATE a Mute role first**`, + description: `You can automatically generate a Mute Role called Muted πŸ”‡, if you want just type YES, if not type NO or anything else`, + footer: 'To set one role use !setmuterole [role]', + color: "yellow" + } + const warningEmbed = messageEmbed(opt) + message.channel.send({ embeds: [warningEmbed] }) + + const msg_filter = (m) => m.author.id === message.author.id; + const collected = await message.channel.awaitMessages({ filter: msg_filter, max: 1 }); + if (collected.first().content.toLowerCase() === "yes") { + + role = message.guild.roles.create({ + name: 'Muted πŸ”‡', + color: 'DARK_GREEN', + permissions: ['READ_MESSAGE_HISTORY'] + }).then(async muteRole => { + const options = { + description: `βœ… Role ${muteRole.name} has been created \n\n***Try mute again with*** ${prefix}mute`, + color: 'green' + } + const msgEmbed = messageEmbed(options) + message.channel.send({ embeds: [msgEmbed] }) + + await db.SetNewMuteRole({ server_id: message.guild.id, role_id: muteRole.id }) + + const config = { + server_id: message.guild.id, + user_id: member.id, + made_by: message.author.username, + reason: "Auto Mute Role creation", + command: "muterole", + date: moment().format('MMMM Do YYYY, h:mm:ss a') + } + await db.SaveLogData(config) + + }).catch(error => { + console.log(error) + const options = { + description: `❌ Unable to mute ${member}.`, + color: 'red' + } + const errorEmbed = messageEmbed(options) + message.channel.send({ embeds: [errorEmbed] }) + }) + } else { + return message.reply('Operation canceled. To set a Mute Role use the command !setmuterole'); + } + + } else { + + let muteRole = message.guild.roles.cache.find(role => role.id === roleMuted) + + if (message.author.bot) return message.channel.send("**🦾 Cannot Mute Bots!**"); + + const userRoles = member.roles.cache + .filter(r => r.id !== message.guild.id) + .map(r => r.id) + + if (!message.guild.roles.cache.has(muteRole)) { + role = muteRole + } else { + role = message.guild.roles.cache.get(muteRole) + } + + + if (member.roles.cache.has(role.id)) { + const options = { + title: `❌ ${member} is alredy muted`, + color: 'red' + } + const errorEmbed = messageEmbed(options) + return message.channel.send({ embeds: [errorEmbed] }) + } + + if (member.permissions.has('ADMINISTRATOR')) { + const options = { + title: `❌ Unable to do that because ${member} is an **Admin**`, + color: 'red' + } + const errorEmbed = messageEmbed(options) + return message.channel.send({ embeds: [errorEmbed] }) + } + + if (!role) { + + console.log(error) + + } else { + + // db.set(`muteeid_${message.guild.id}_${member.id}`, userRoles) + if (!reason) reason = "No reason" + const config = { + server_id: message.guild.id, + user_id: member.id, + user_name: member.user.username, + roles: userRoles, + reason: reason, + command: "mute", + date: moment().format('MMMM Do YYYY, h:mm:ss a') + } + await db.SaveDataSactions(config) + + config.made_by = message.author.username + delete config.roles + await db.SaveLogData(config) + + try { + await member.roles.set([role.id]).then(async () => { + await message.channel.bulkDelete(1) + member.send(`πŸ”‡ **You have been muted in \`${message.guild.name}\` for the following reason:** __${reason || "(No reason provided)"}__`) + const options = { + description: `βœ… ${member} has been muted. + \n**πŸ“ Reason:** ${reason}`, + color: 'green' + } + const msgEmbed = messageEmbed(options).setFooter(message.author.username, client.user.displayAvatarURL()) + message.channel.send({ embeds: [msgEmbed] }) + + }).catch(error => { + console.log(error) + const options = { + description: `❌ Unable to mute ${member}.`, + color: 'red' + } + const errorEmbed = messageEmbed(options) + message.channel.send({ embeds: [errorEmbed] }) + }) + + } catch { + member.roles.set([role.id]) + } + + } + + message.channel.permissionOverwrites.edit(muteRole.id, { + SEND_MESSAGES: false, + ADD_REACTIONS: false, + }) + } + } + } else { + const options = { + description: 'πŸ”’ Sorry, you do not have sufficient permissions to do this.', + color: 'yellow' + } + const warningEmbed = messageEmbed(options) + message.channel.send({ embeds: [warningEmbed] }) + } +} + +exports.conf = { + aliases: ['m'], + permissions: ['SEND_MESSAGES', 'EMBED_LINKS'] +} \ No newline at end of file diff --git a/commands/removerole.js b/commands/moderation/removerole.js similarity index 69% rename from commands/removerole.js rename to commands/moderation/removerole.js index 3892796..0525351 100644 --- a/commands/removerole.js +++ b/commands/moderation/removerole.js @@ -1,72 +1,73 @@ -const Discord = require('discord.js'); -const { messageEmbed } = require('../helpers/messageEmbeds'); - -exports.run = (client, message, args) => { - if( message.member.permissions.has('MANAGE_ROLES')) { - const member = message.mentions.members.first() || message.guild.members.cache.get(args[0]) - - const prefix = client.config.prefix - - if( !member ) { - const opt = { - title: `**βœ‚ Command: ${prefix}removerole**`, - fieldValue: 'Removes a role from a member', - field: `**πŸ›  Usage:** ${prefix}removerole _[username/user-id]_ - \n**πŸ” Required permissions:** ***MANAGE ROLES*** - \n**πŸ“ Examples: \n${prefix}removerole ${message.member} **Role** \n${prefix}removerole \`${message.member.id}\` - `, - color: 'random' - } - const headerEmbed = messageEmbed( opt, true ) - message.channel.send({ embeds: [headerEmbed] }) - } else { - const role = message.guild.roles.cache.find( role => role.name == args.slice(1).join(' ') ) - - if( !args.slice(1).join(' ')) { - const opt = { - description: `❌ No role was provided.`, - color: 'red' - } - const errorEmbed = messageEmbed(opt) - return message.channel.send({ embeds: [errorEmbed] }) - } - - if( !role ){ - const opt = { - description: `❌ The \`${args.slice(1).join(' ')}\` role was not found.`, - color: 'red' - } - const errorEmbed = messageEmbed(opt) - message.channel.send({ embeds: [errorEmbed]}) - } else { - member.roles.remove(role.id).then( () => { - const opt = { - description: `βœ… The \`${role.name}\` role was removed from ${member}`, - color: 'red' - } - const msgEmbed = messageEmbed( opt ) - message.channel.send({ embeds: [msgEmbed] }) - }).catch( error => { - console.log(error) - const opt = { - description: `❌ Unable to remove the \`${role.name}\` role from ${member}.`, - color: 'red' - } - const errorEmbed = messageEmbed(opt) - message.channel.send({ embeds: [errorEmbed]}) - - }) - } - } - - } else { - const warningEmbed = new Discord.MessageEmbed() - .setDescription('πŸ”’ Sorry, you do not have sufficient permissions to do this.') - .setColor('YELLOW'); - message.channel.send({ embeds: [warningEmbed]}); - } -} -exports.conf = { - aliases: ['rr'], - permissions: ['SEND_MESSAGES', 'EMBED_LINKS'] +const Discord = require('discord.js'); +const { messageEmbed } = require('../../helpers/messageEmbeds'); +const { getMember } = require("../../helpers/functions") + +exports.run = (client, message, args) => { + if (message.member.permissions.has('MANAGE_ROLES')) { + const prefix = client.config.prefix + + if (!member) { + const opt = { + title: `**βœ‚ Command: ${prefix}removerole**`, + fieldValue: 'Removes a role from a member', + field: `**πŸ›  Usage:** ${prefix}removerole _[username/user-id]_ + \n**πŸ” Required permissions:** ***MANAGE ROLES*** + \n**πŸ“ Examples: \n${prefix}removerole ${message.member} **Role** \n${prefix}removerole \`${message.member.id}\` + `, + color: 'random' + } + const headerEmbed = messageEmbed(opt, true) + message.channel.send({ embeds: [headerEmbed] }) + } else { + const member = getMember(client, message, args) + + const role = message.guild.roles.cache.find(role => role.name == args.slice(1).join(' ')) + + if (!args.slice(1).join(' ')) { + const opt = { + description: `❌ No role was provided.`, + color: 'red' + } + const errorEmbed = messageEmbed(opt) + return message.channel.send({ embeds: [errorEmbed] }) + } + + if (!role) { + const opt = { + description: `❌ The \`${args.slice(1).join(' ')}\` role was not found.`, + color: 'red' + } + const errorEmbed = messageEmbed(opt) + message.channel.send({ embeds: [errorEmbed] }) + } else { + member.roles.remove(role.id).then(() => { + const opt = { + description: `βœ… The \`${role.name}\` role was removed from ${member}`, + color: 'red' + } + const msgEmbed = messageEmbed(opt) + message.channel.send({ embeds: [msgEmbed] }) + }).catch(error => { + console.log(error) + const opt = { + description: `❌ Unable to remove the \`${role.name}\` role from ${member}.`, + color: 'red' + } + const errorEmbed = messageEmbed(opt) + message.channel.send({ embeds: [errorEmbed] }) + + }) + } + } + + } else { + const warningEmbed = new Discord.MessageEmbed() + .setDescription('πŸ”’ Sorry, you do not have sufficient permissions to do this.') + .setColor('YELLOW'); + message.channel.send({ embeds: [warningEmbed] }); + } +} +exports.conf = { + aliases: ['rr'], + permissions: ['SEND_MESSAGES', 'EMBED_LINKS'] }; \ No newline at end of file diff --git a/commands/moderation/setmuterole.js b/commands/moderation/setmuterole.js new file mode 100644 index 0000000..94fe16c --- /dev/null +++ b/commands/moderation/setmuterole.js @@ -0,0 +1,67 @@ +const DB = require('../../helpers/db-functions') + +const { getMember } = require("../../helpers/functions") + +exports.run = async (bot, message, args) => { + if (!message.member.permissions.has("ADMINISTRATOR")) + return message.channel.send( + "**You Do Not Have The Required Permissions! - [ADMINISTRATOR]**" + ); + + const db = new DB() + + if (!args[0]) { + const querry = { server_id: message.guild.id } + const muteRole = await db.GetRoleMute(querry, 'role_id') + + let roleName = message.guild.roles.cache.get(muteRole); + + if (message.guild.roles.cache.has(muteRole)) { + return message.channel.send( + `**Muterole Set In This Server Is \`${roleName.name}\`!**` + ); + } else + return message.channel.send( + "**Please Enter A Role Name or ID To Set!**" + ); + } + + let role = + message.mentions.roles.first() || + bot.guilds.cache.get(message.guild.id).roles.cache.get(args[0]) || + message.guild.roles.cache.find( + c => c.name.toLowerCase() === args.join(" ").toLocaleLowerCase() + ); + + if (!role) + return message.channel.send("**Please Enter A Valid Role Name or ID!**"); + + try { + const querry = { channelId: message.guild.id } + const roleFound = await db.GetRoleMute(querry, 'role_id') + + if (role.id === roleFound) { + return message.channel.send( + "**This Role is Already Set As Muterole!**" + ); + } else { + + db.SetNewMuteRole({ server_id: message.guild.id, role_id: role.id }) + + message.channel.send( + `**\`${role.name}\` Has Been Set Successfully As Muterole!**` + ); + + } + } catch (e) { + return message.channel.send( + "**Error - `Missing Permissions or Role Doesn't Exist!`**", + `\n${e.message}` + ); + } +} + +exports.conf = { + aliases: ['setmute'], + permissions: ['SEND_MESSAGES', 'EMBED_LINKS'] +} \ No newline at end of file diff --git a/commands/unban.js b/commands/moderation/unban.js similarity index 63% rename from commands/unban.js rename to commands/moderation/unban.js index 7a21ab5..a44862a 100644 --- a/commands/unban.js +++ b/commands/moderation/unban.js @@ -1,71 +1,70 @@ - -const { messageEmbed } = require('../helpers/messageEmbeds') - -exports.run = async(client, message, args) => { - - if( message.member.permissions.has('BAN_MEMBERS')){ - - if ( !args[0] ) { - - const options = { - - title: `**πŸ’£ Command: ${client.config.prefix}unban**`, - fieldValue: 'Unbans a member from the current server.', - field: `**πŸ›  Usage: **${client.config.prefix}unban _[username/user_id]_ - \n**🧾 Aliases: **${client.config.prefix}ub - \n**πŸ” Required permissions: **BAN_MEMBERS - \n**πŸ“ Examples: **\n ${client.config.prefix}unban ${message.member}\n${client.config.prefix}ub \`${message.member.id}\``, - color: 'random' - - } - const banEmbed = messageEmbed(options, true) - return message.channel.send({ embeds: [banEmbed]}); - } else { - let bannedMemberAll = await message.guild.bans.fetch() - - let bannedMember = ( bannedMemberAll ).map( member => member.user.id ) - - if( !bannedMember.includes(args[0]) ) { - const opt = { - description: `**❌ Unvalid User or ID or the User is not Banned **`, - color: 'red' - } - const errEmbed = messageEmbed( opt ) - return message.channel.send({ embeds: [errEmbed] }) - } - - let reason = args.slice(1).join(' ') - - try { - - await message.guild.members.unban(args[0], {reason: reason}) - - const options = { - description: `βœ… ${args[0]} has been unbanned - \n**πŸ“ Reason:** ${reason || "No reason"} `, - color: 'green' - } - const msgEmbed = messageEmbed(options) - message.channel.send({ embeds: [msgEmbed] }) - - } catch (error) { - - console.log(error) - - } - } - - } else { - const options = { - description: 'πŸ”’ Sorry, you do not have sufficient permissions to do this.', - color: 'yellow' - } - const warningEmbed = messageEmbed(options) - message.channel.send({ embeds: [warningEmbed] }) - } -} - -exports.conf = { - aliases: ['ub'], - permissions: ['SEND_MESSAGES', 'EMBED_LINKS'] + +const { messageEmbed } = require('../../helpers/messageEmbeds'); + +exports.run = async (client, message, args) => { + + if (message.member.permissions.has('BAN_MEMBERS')) { + + if (!args[0]) { + + const options = { + + title: `**πŸ’£ Command: ${client.config.prefix}unban**`, + fieldValue: 'Unbans a member from the current server.', + field: `**πŸ›  Usage: **${client.config.prefix}unban _[username/user_id]_ + \n**🧾 Aliases: **${client.config.prefix}ub + \n**πŸ” Required permissions: **BAN_MEMBERS + \n**πŸ“ Examples: **\n ${client.config.prefix}unban ${message.member}\n${client.config.prefix}ub \`${message.member.id}\``, + color: 'random' + + } + const banEmbed = messageEmbed(options, true) + return message.channel.send({ embeds: [banEmbed] }); + } else { + let bannedMemberAll = await message.guild.bans.fetch() + + let bannedMember = (bannedMemberAll).map(member => member.user.id) + + if (!bannedMember.includes(args[0])) { + const opt = { + description: `**❌ Unvalid User or ID or the User is not Banned **`, + color: 'red' + } + const errEmbed = messageEmbed(opt) + return message.channel.send({ embeds: [errEmbed] }) + } + + try { + + await message.channel.bulkDelete(1) + + message.guild.members.unban(args[0]) + + const options = { + description: `βœ… ${args[0]} has been **UNBANNED**`, + color: 'green' + } + const msgEmbed = messageEmbed(options) + message.channel.send({ embeds: [msgEmbed] }) + + } catch (error) { + + console.log(error) + + } + } + + } else { + const options = { + description: 'πŸ”’ Sorry, you do not have sufficient permissions to do this.', + color: 'yellow' + } + const warningEmbed = messageEmbed(options) + message.channel.send({ embeds: [warningEmbed] }) + } +} + +exports.conf = { + aliases: ['ub'], + permissions: ['SEND_MESSAGES', 'EMBED_LINKS'] }; \ No newline at end of file diff --git a/commands/moderation/unmute.js b/commands/moderation/unmute.js new file mode 100644 index 0000000..72c1c5d --- /dev/null +++ b/commands/moderation/unmute.js @@ -0,0 +1,132 @@ +const DB = require('../../helpers/db-functions') + +const { messageEmbed } = require('../../helpers/messageEmbeds'); +const { getMember } = require("../../helpers/functions") + +const moment = require('moment') + +exports.run = async (client, message, args) => { + + if (message.member.permissions.has('MANAGE_ROLES')) { + const prefix = client.config.prefix + + if (!args[0]) { + const opt = { + title: `**πŸ”Š Command: ${prefix}unmute`, + fieldValue: 'Allows a memeber to send messages', + field: `**πŸ›  Usdage:** ${prefix}unmute _[username/user-id]_ + \n**πŸ” Required permissions:** ***MANAGE ROLES*** + \n**πŸ“ Examples:** \n${prefix}mute ${message.member}\n${prefix}mute \`${message.member.id}\` + `, + color: 'random' + } + const unmuteEmbed = messageEmbed(opt, true) + return message.channel.send({ embeds: [unmuteEmbed] }) + } + + const member = getMember(client, message, args) + await message.channel.bulkDelete(1) + + const db = new DB() + let querry = { server_id: message.guild.id } + let roleMuted = await db.GetRoleMute(querry, 'role_id'); + if(!roleMuted){ + let opt = { + title: `🟑 Your server has no Mute Role`, + description: `Add a new Mute Role or Autocreate one using ${prefix}setmuterole or ${prefix}mute`, + color: 'yellow' + } + const warningEmbed = messageEmbed( opt ) + message.channel.send({ embeds: [warningEmbed] }) + } + + let muteRole = message.guild.roles.cache.find(role => role.id === roleMuted) + + let role + if (!message.guild.roles.cache.has(muteRole)) { + role = muteRole + } else { + role = message.guild.roles.cache.get(muteRole) + } + + // let roleFetch = db.fetch(`muteeid_${message.guild.id}_${member.id}`) + querry = { server_id: message.guild.id, user_id: member.id } + let roleFetch = await db.GetMembersDataSanctions(querry, 'roles') + + if (!roleFetch) return; + + if (!role) return message.channel.send("**There Is No Mute Role To Remove!**") + + if (!member.roles.cache.has(role.id)) { + + const options = { + title: `❌ ${member} is alredy unmuted`, + color: 'red' + } + const errorEmbed = messageEmbed(options) + return message.channel.send({ embeds: [errorEmbed] }) + + } + + try { + querry.command = "mute" + let reason = await db.GetMembersDataSanctions(querry, 'reason') + + const config = { + server_id: message.guild.id, + user_id: member.id, + user_name: member.user.username, + reason: reason, + made_by: message.author.username, + command: "unmute", + date: moment().format('MMMM Do YYYY, h:mm:ss a') + } + await db.SaveDataSactions(config) + await db.SaveLogData(config) + + await member.roles.remove([role.id]).then(async () => { + + await message.channel.bulkDelete(1) + const opt = { + description: `βœ… ${member} has been unmuted! + \n**πŸ“ Previous Reason:** ${reason}`, + color: 'green' + } + const msgEmbed = messageEmbed(opt).setFooter(message.author.username, client.user.displayAvatarURL()) + message.channel.send({ embeds: [msgEmbed] }) + + let roleAdd = roleFetch + if (!roleAdd) return; + member.roles.add(roleAdd) + + }).catch((error) => { + console.log(error) + const options = { + description: `❌ Sorry, I'm unable to unmute ${member}`, + color: 'red' + } + const errorEmbed = messageEmbed(options) + message.channel.send({ embeds: [errorEmbed] }) + }) + + } catch(error) { + console.log(error) + let roleAddSecond = roleFetch + if (!roleAddSecond) return + member.roles.add(roleAddSecond) + } + + } else { + const options = { + description: 'πŸ”’ Sorry, you do not have sufficient permissions to do this.', + color: 'yellow' + } + const warningEmbed = messageEmbed(options) + message.channel.send({ embeds: [warningEmbed] }) + } +} + +exports.conf = { + aliases: ['um'], + permissions: ['SEND_MESSAGES', 'EMBED_LINKS'] +} \ No newline at end of file diff --git a/commands/moderation/warn.js b/commands/moderation/warn.js new file mode 100644 index 0000000..047c036 --- /dev/null +++ b/commands/moderation/warn.js @@ -0,0 +1,83 @@ +const DB = require('../../helpers/db-functions') + +const { messageEmbed } = require('../../helpers/messageEmbeds') +const { getMember } = require("../../helpers/functions") + +const moment = require('moment') + +exports.run = async (client, message, args) => { + + if (message.member.permissions.has('MANAGE_MESSAGES')) { + const prefix = client.config.prefix + + if (!args[0]) { + + let opt = { + title: `⚠ **Command: ${prefix}warn**`, + fieldValue: 'Make a warning for a user', + field: `**πŸ›  Usage: **${prefix}warn _[username/user-id]_ _[reason]_ + \n**πŸ” Required permissions:** ***MANAGE MESSAGES*** + \n**πŸ“ Examples:** \n${prefix}warn ${message.member} _Example reason_\n${prefix}warn \`${message.member.id}\` _Example reason_ + `, + color: 'random' + } + const warnEmbed = messageEmbed(opt, true) + return message.channel.send({ embeds: [warnEmbed] }) + } + + const db = new DB() + const member = getMember(client, message, args) + + let reason = args.slice(1).join(" ") + if(!reason) reason = "No reason" + + console.log(member.user.username) + const config = { + server_id: message.guild.id, + user_id: member.id, + user_name: member.user.username, + made_by: message.author.username, + reason: reason, + command: "warn", + date: moment().format('MMMM Do YYYY, h:mm:ss a') + } + await db.SaveLogData( config ) + + await message.channel.bulkDelete(1) + + let opt = { + title: `⚠ Warning`, + description: `**You have been warned in \`${message.guild.name}\` for the following reason:** __${reason}__`, + color: 'yellow' + } + const userEmbed = messageEmbed( opt ) + member.send({ embeds: [userEmbed] }) + .catch(error => message.channel.send(`Sorry <${message.author}> couldn't be warn because of: ${error}`)) + + opt = { + title: `***⚠ WARN REPORT ⚠***`, + description: `*<@${member.user.id}> has been warned*`, + fieldValue: '\u200b', + field: `**⁉ Reason:** \`${reason}\` + \n**Action:** \`Warn\``, + color: 'yellow' + } + const warnEmbed = messageEmbed(opt, true).setFooter(`Given by ${message.author.username}`, client.user.displayAvatarURL()) + message.channel.send({ embeds: [warnEmbed] }) + + + } else { + + const options = { + description: 'πŸ”’ Sorry, you do not have sufficient permissions to do this.', + color: 'yellow' + } + const warningEmbed = messageEmbed(options) + message.channel.send({ embeds: [warningEmbed] }) + } +} + +exports.conf = { + aliases: ['w'], + permissions: ['SEND_MESSAGES', 'EMBED_LINKS'] +} \ No newline at end of file diff --git a/commands/mute.js b/commands/mute.js deleted file mode 100644 index 3c937a3..0000000 --- a/commands/mute.js +++ /dev/null @@ -1,169 +0,0 @@ -const Discord = require('discord.js'); -const { messageEmbed } = require('../helpers/messageEmbeds'); -const DB = require('../helpers/db-functions') - -exports.run = async(client, message, args) => { - const prefix = client.config.prefix - - if( message.member.permissions.has('MANAGE_ROLES')) { - const db = new DB() - - const member = message.mentions.members.first() || await message.guild.members.fetch(args[0]) - - let reason = args.slice(1).join(" ") - - if( !args[0] ) { - const options = { - title: `**πŸ”‡ Command: ${prefix}mute**`, - fieldValue: 'The user is not able to send messages or add reactions', - field: `**πŸ›  Usage: **${prefix}mute _[username/user-id]_ _[reason]_ - \n**πŸ” Required permissions:** ***MANAGE ROLES*** - \n**πŸ“ Examples:** \n${prefix}mute ${message.member} _Example reason_\n${prefix}mute \`${message.member.id}\` _Example reason_ - `, - color: 'random' - } - const muteEmbed = messageEmbed( options, true) - return message.channel.send({ embeds: [muteEmbed] }) - } else { - - const querry = { channelId: message.guild.id } - const roleMuted = await db.GetRoleMute( querry, 'role_id' ) - let muteRole = message.guild.roles.cache.find( role => role.id === roleMuted ) - - if (message.author.bot) return message.channel.send("**🦾 Cannot Mute Bots!**"); - - const userRoles = member.roles.cache - .filter(r => r.id !== message.guild.id) - .map(r => r.id) - - let role - // let dbmute = await db.fetch(`muterole_${message.guild.id}`); - // const dbmute = await db.GetRoleMute( querry, 'role_id' ) - - if (!message.guild.roles.cache.has(muteRole)) { - role = muteRole - } else { - role = message.guild.roles.cache.get(muteRole) - } - - if( member.roles.cache.has(role.id) ) { - const options = { - title: `❌ ${member} is alredy muted`, - color: 'red' - } - const errorEmbed = messageEmbed(options) - return message.channel.send({ embeds: [errorEmbed] }) - } - - if( member.permissions.has('ADMINISTRATOR') ) { - const options = { - title: `❌ Unable to do that because ${member} is an **Admin**`, - color: 'red' - } - const errorEmbed = messageEmbed(options) - return message.channel.send({ embeds: [errorEmbed] }) - } - - if( !role ) { - - role = message.guild.roles.create({ - name: 'Muted πŸ”‡', - color: 'DARK_GREEN', - permissions: ['READ_MESSAGE_HISTORY'] - }).then( muteRole => { - member.roles.add(muteRole) - const options = { - description: `βœ… ${member} has been muted nad the role has been created \n***SET THE NEW ROLE WITH*** ${prefix}setmuterole `, - color: 'green' - } - const msgEmbed = messageEmbed(options) - message.channel.send({ embeds: [msgEmbed] }) - - db.SetNewMuteRole( { querry, role_id: muteRole.id }) - console.log(`Role ${muteRole.id} created in DB`) - - }).catch( error => { - console.log(error) - const options = { - description: `❌ Unable to mute ${member}.`, - color: 'red' - } - const errorEmbed = messageEmbed(options) - message.channel.send({ embeds: [errorEmbed] }) - }) - - } else { - - // db.set(`muteeid_${message.guild.id}_${member.id}`, userRoles) - const config = { - channelId: message.guild.id, - user_id: member.id, - roles: userRoles - } - await db.SaveData( config ) - - try { - await member.roles.set( [role.id] ).then( async() => { - const options = { - description: `βœ… ${member} has been muted. - \n**Reason:** ${reason || "No Reason"}`, - color: 'green' - } - const msgEmbed = messageEmbed(options) - message.channel.send({ embeds: [msgEmbed] }) - - }).catch( error => { - console.log(error) - const options = { - description: `❌ Unable to mute ${member}.`, - color: 'red' - } - const errorEmbed = messageEmbed(options) - message.channel.send({ embeds: [errorEmbed] }) - }) - - } catch { - member.roles.set([role.id]) - } - - // let channel = db.fetch(`modlog_${message.guild.id}`) - // if (!channel) return; - - // let embed = new Discord.MessageEmbed() - // .setColor('RED') - // .setThumbnail(member.user.displayAvatarURL({ dynamic: true })) - // .setAuthor(`${message.guild.name} Modlogs`, message.guild.iconURL()) - // .addField("**Moderation**", "mute") - // .addField("**Member**", member.user.username) - // .addField("**Moderator**", message.author.username) - // .addField("**Reason**", `${reason || "**No Reason**"}`) - // .addField("**Date**", message.createdAt.toLocaleString()) - // .setFooter(message.member.displayName, message.author.displayAvatarURL()) - // .setTimestamp() - - // let sChannel = message.guild.channels.cache.get(channel) - // if (!sChannel) return; - // sChannel.send({embeds: [embed]}) - - } - - message.channel.permissionOverwrites.edit( muteRole.id, { - SEND_MESSAGES: false, - ADD_REACTIONS: false, - }) - - } - } else { - const options = { - description: 'πŸ”’ Sorry, you do not have sufficient permissions to do this.', - color: 'yellow' - } - const warningEmbed = messageEmbed(options) - message.channel.send({ embeds: [warningEmbed] }) - } -} - -exports.conf = { - aliases: ['m'], - permissions: ['SEND_MESSAGES', 'EMBED_LINKS'] -} \ No newline at end of file diff --git a/commands/setmuterole.js b/commands/setmuterole.js deleted file mode 100644 index 8bc0dfa..0000000 --- a/commands/setmuterole.js +++ /dev/null @@ -1,65 +0,0 @@ -const DB = require('../helpers/db-functions') - -exports.run = async (bot, message, args) => { - if (!message.member.permissions.has("ADMINISTRATOR")) - return message.channel.send( - "**You Do Not Have The Required Permissions! - [ADMINISTRATOR]**" - ); - - const db = new DB() - - if (!args[0]) { - const querry = { channelId: message.guild.id } - const muteRole = await db.GetRoleMute( querry, 'role_id' ) - - let roleName = message.guild.roles.cache.get(muteRole); - - if (message.guild.roles.cache.has(muteRole)) { - return message.channel.send( - `**Muterole Set In This Server Is \`${roleName.name}\`!**` - ); - } else - return message.channel.send( - "**Please Enter A Role Name or ID To Set!**" - ); - } - - let role = - message.mentions.roles.first() || - bot.guilds.cache.get(message.guild.id).roles.cache.get(args[0]) || - message.guild.roles.cache.find( - c => c.name.toLowerCase() === args.join(" ").toLocaleLowerCase() - ); - - if (!role) - return message.channel.send("**Please Enter A Valid Role Name or ID!**"); - - try { - const querry = { channelId: message.guild.id } - const roleFound = await db.GetRoleMute( querry, 'role_id' ) - - if (role.id === roleFound ) { - return message.channel.send( - "**This Role is Already Set As Muterole!**" - ); - } else { - - db.SetNewMuteRole({ channelId: message.guild.id, role_id: role.id }) - - message.channel.send( - `**\`${role.name}\` Has Been Set Successfully As Muterole!**` - ); - - } - } catch (e) { - return message.channel.send( - "**Error - `Missing Permissions or Role Doesn't Exist!`**", - `\n${e.message}` - ); - } - } - -exports.conf = { - aliases: ['setmute'], - permissions: ['SEND_MESSAGES', 'EMBED_LINKS'] -} \ No newline at end of file diff --git a/commands/unmute.js b/commands/unmute.js deleted file mode 100644 index c037ce3..0000000 --- a/commands/unmute.js +++ /dev/null @@ -1,125 +0,0 @@ -const Discord = require('discord.js'); -const { messageEmbed } = require('../helpers/messageEmbeds'); -const DB = require('../helpers/db-functions') - -exports.run = async(client, message, args) => { - - if( message.member.permissions.has('MANAGE_ROLES')) { - const db = new DB() - - const member = message.mentions.members.first() || await message.guild.members.fetch(args[0]) - - let reason = args.slice(1).join(" "); - - const prefix = client.config.prefix - - if( !args[0] ) { - const opt = { - title: `**πŸ”Š Command: ${prefix}unmute`, - fieldValue: 'Allows a memeber to send messages', - field: `**πŸ›  Usdage:** ${prefix}unmute _[username/user-id]_ - \n**πŸ” Required permissions:** ***MANAGE ROLES*** - \n**πŸ“ Examples:** \n${prefix}mute ${message.member}\n${prefix}mute \`${message.member.id}\` - `, - color: 'random' - } - const unmuteEmbed = messageEmbed( opt, true ) - return message.channel.send({ embeds: [unmuteEmbed] }) - } - let querry = { channelId: message.guild.id } - let roleMuted = await db.GetRoleMute( querry, 'role_id' ); - - let muteRole = message.guild.roles.cache.find( role => role.id === roleMuted ) - - let role - if (!message.guild.roles.cache.has(muteRole)) { - role = muteRole - } else { - role = message.guild.roles.cache.get(muteRole) - } - - // let roleFetch = db.fetch(`muteeid_${message.guild.id}_${member.id}`) - querry = { channelId: message.guild.id, user_id: member.id } - let roleFetch = await db.GetMembersData( querry, 'roles' ) - - if (!roleFetch) return; - - if (!role) return message.channel.send("**There Is No Mute Role To Remove!**") - - if( !member.roles.cache.has(role.id) ) { - - const options = { - title: `❌ ${member} is alredy unmuted`, - color: 'red' - } - const errorEmbed = messageEmbed(options) - return message.channel.send({ embeds: [errorEmbed] }) - - } - - try { - console.log(role) - await member.roles.remove([role.id]).then((id) => { - - const opt = { - description: `βœ… ${member} has been unmuted! - \n**Previous Reason:** ${reason || "No Reason"}`, - color: 'green' - } - const msgEmbed = messageEmbed( opt ) - message.channel.send({ embeds: [msgEmbed] }) - - let roleAdd = roleFetch - if( !roleAdd ) return; - member.roles.add(roleAdd) - - }).catch( (error) => { - console.log(error) - const options = { - description: `❌ Sorry, I'm unable to unmute ${member}`, - color: 'red' - } - const errorEmbed = messageEmbed(options) - message.channel.send({ embeds: [errorEmbed] }) - }) - - } catch { - let roleAddSecond = roleFetch - if( !roleAddSecond ) return - member.roles.add(roleAddSecond) - } - - // let channel = db.fetch(`modlog_${message.guild.id}`) - // if (!channel) return; - - // let embed = new Discord.MessageEmbed() - // .setColor("RED") - // .setThumbnail(member.user.displayAvatarURL({ dynamic: true })) - // .setAuthor(`${message.guild.name} Modlogs`, message.guild.iconURL()) - // .addField("**Moderation**", "unmute") - // .addField("**Unmuted**", member.user.username) - // .addField("**Moderator**", message.author.username) - // .addField("**Reason**", `${reason || "**No Reason**"}`) - // .addField("**Date**", message.createdAt.toLocaleString()) - // .setFooter(message.member.displayName, message.author.displayAvatarURL()) - // .setTimestamp(); - - // var sChannel = message.guild.channels.cache.get(channel) - // if (!sChannel) return; - // sChannel.send({ embeds: [embed] }) - - - } else { - const options = { - description: 'πŸ”’ Sorry, you do not have sufficient permissions to do this.', - color: 'yellow' - } - const warningEmbed = messageEmbed(options) - message.channel.send({ embeds: [warningEmbed] }) - } -} - -exports.conf = { - aliases: ['um'], - permissions: ['SEND_MESSAGES', 'EMBED_LINKS'] -} \ No newline at end of file diff --git a/commands/warn.js b/commands/warn.js deleted file mode 100644 index dc285ce..0000000 --- a/commands/warn.js +++ /dev/null @@ -1,65 +0,0 @@ -const { messageEmbed } = require('../helpers/messageEmbeds') - -exports.run = async ( client, message, args ) => { - - if( message.member.permissions.has('MANAGE_MESSAGES')) { - - const member = message.mentions.members.first() || await message.guild.members.fetch(args[0]) - const prefix = client.config.prefix - - if( !args[0] ) { - - const opt = { - title: `⚠ **Command: ${prefix}warn**`, - fieldValue: 'Make a warning for a user', - field: `**πŸ›  Usage: **${prefix}warn _[username/user-id]_ _[reason]_ - \n**πŸ” Required permissions:** ***MANAGE MESSAGES*** - \n**πŸ“ Examples:** \n${prefix}warn ${message.member} _Example reason_\n${prefix}warn \`${message.member.id}\` _Example reason_ - `, - color: 'random' - } - const warnEmbed = messageEmbed( opt, true) - return message.channel.send({ embeds: [warnEmbed] }) - } - - if( !member ) { - - return message.reply("Enter a valid member of this server") - - } - - let reason = args.slice(1).join(" ") - if( !reason ) reason = "(No reason provided)" - - await message.channel.bulkDelete(1) - member.send(`⚠ **You have been warned by \`${message.author.username}\` for the following reason:** __${reason}__`) - .catch( error => message.channel.send(`Sorry <${message.author}> couldn't be warn because of: ${error}`)) - - const opt = { - title: `***⚠ WARN REPORT ⚠***`, - description: `*<@${member.user.id}> has been warned by <@${message.author.id}>*`, - fieldValue: '\u200b', - field: `**⁉ Reason:** \`${reason}\` - \n**Action:** \`Warn\``, - color: 'yellow', - footer: `Given by ${message.author.username}` - } - const warnEmbed = messageEmbed( opt, true) - message.channel.send({ embeds: [warnEmbed] }) - - } else { - - const options = { - description: 'πŸ”’ Sorry, you do not have sufficient permissions to do this.', - color: 'yellow' - } - const warningEmbed = messageEmbed(options) - message.channel.send({ embeds: [warningEmbed] }) - } - -} - -exports.conf = { - aliases: ['w'], - permissions: ['SEND_MESSAGES', 'EMBED_LINKS'] -} \ No newline at end of file diff --git a/config.json b/config.json index 610e72c..b5d034f 100644 --- a/config.json +++ b/config.json @@ -6,9 +6,6 @@ "custom_presence": "with {p}/{m} players across {s} servers", "status_channel_id": "861431289139429412", "statchan_update_interval": "300", - "color": "#fffff", - "thumbnail_image_url": "", - "footer": "Footer", "ownerid": "520023210494918667", "giphy": "l0WVQERPzfcQ0xdJ5AQlq4wyKF6xmHux", "mongoURI": "mongodb+srv://aplex-ds:Puccaa2723@cluster0.wslu5.mongodb.net/myFirstDatabase?retryWrites=true&w=majority" diff --git a/events/clickButton.js b/events/clickButton.js new file mode 100644 index 0000000..645282f --- /dev/null +++ b/events/clickButton.js @@ -0,0 +1,8 @@ +module.exports = async(button) => { + + if(button.id === 'button1'){ + button.channel.send("i like green") + } + + button.defer() +} \ No newline at end of file diff --git a/events/ready.js b/events/ready.js index 4de240c..d79e8da 100644 --- a/events/ready.js +++ b/events/ready.js @@ -1,7 +1,4 @@ -const fetch = require('node-fetch'); -const dbutils = require('../include/dbutils'); const mongoose = require('mongoose'); -const { MessageEmbed } = require('discord.js'); module.exports = async (client) => { @@ -17,84 +14,5 @@ module.exports = async (client) => { } - async function presence() { - let infos = await client.function.fetchinfo(client.config.admin_id); - if (infos) { - var totalplayers = infos[1].reduce((a, b) => a + b, 0); - var maxplayers = infos[2].reduce((a, b) => a + b, 0); - var servercount = infos[3].length; - client.user.setPresence({ activities: [{ name: client.config.custom_presence.replace(/{m}/g, maxplayers).replace(/{p}/g, totalplayers).replace(/{s}/g, servercount) }], status: 'online' }); - } - } - - presence(); - if (client.config.custom_presence.match(/\{[mps]\}/g)) setInterval(presence, 600000); - - let data = await fetch('https://api.github.com/repos/Sparker-99/Admin-bot/releases/latest') - .then((res) => res.json()) - .catch(() => { console.log('\x1b[31mUpdate check failed Github is not reachable\x1b[0m') }); - - if (data) { - if (require('../package.json').version.replace(/[^0-9]/g, '') >= data.tag_name.replace(/[^0-9]/g, '')) - console.log('\x1b[32mAdmin Bot is up to date\x1b[0m'); - else - console.log('\x1b[33mAdmin bot version ' + data.tag_name + ' update is avaiable\x1b[0m'); - } - - async function processids(infos, pages, chanfnd) { - let embld = []; - let embids = []; - let count = 0; - let embsl = Math.ceil(infos[2].length / pages); - - for (i = 0; i < embsl; i++) { - embld[i] = new MessageEmbed().setColor(client.color); - if (i == 0) embld[i].setTitle('Server Status').setThumbnail(client.thumbnail); - - for (g = 0; g < pages; g++) { - if (infos[0][count]) { - embld[i].addField(infos[0][count], client.function.getmap(infos[3][count], infos[8][count])[0] + ' - ' + infos[1][count] + '/' + infos[2][count], false); - count++; - } - } - try { - dar = await chanfnd.send({ embeds: [embld[i]] }); - embids.push(dar.id); - } catch {} - } - return embids; - } - - if (client.config.status_channel_id && client.config.statchan_update_interval) { - let init = setInterval(async function () { - let statchan = await client.channels.fetch(client.config.status_channel_id) - .catch(() => { - console.log('\x1b[31mWarning: Text channel with Id ' + client.config.status_channel_id + ' not found. Disabling autostatus\x1b[0m'); - clearInterval(init); - }); - - if (!statchan) return; - if (!statchan.guild.me.permissionsIn(statchan).has(['SEND_MESSAGES', 'EMBED_LINKS'])) { - console.log('\x1b[33mWarning: Send messages and embed links permissions are required in channel ' + statchan.name + '. Disabling autostatus\x1b[0m'); - return clearInterval(init); - } - - let srdata = await client.function.fetchinfo(client.config.admin_id); - if (!srdata) return; - - let fetchids = await dbutils.fetchData(statchan.id); - let msgids = await processids(srdata, client.config.results_perpage, statchan); - dbutils.appendData(statchan.id, msgids.join()); - - if (fetchids) { - let rearr = fetchids.msgids.split(','); - for (i = 0; i < rearr.length; i++) { - let fnd = await client.channels.cache.get(statchan.id).messages.fetch(rearr[i]).catch(() => { }); - if (fnd) fnd.delete(); - } - } - }, client.config.statchan_update_interval * 1000) - } - console.log('\nBot is online with id ' + client.user.id); }; \ No newline at end of file diff --git a/example_config.json b/example_config.json new file mode 100644 index 0000000..5985314 --- /dev/null +++ b/example_config.json @@ -0,0 +1,13 @@ +{ + "token": "", + "prefix": "q!", + "admin_id": "", + "results_perpage": "10", + "custom_presence": "with {p}/{m} players across {s} servers", + "status_channel_id": "", + "statchan_update_interval": "300", + "ownerid": "", + "giphy": "", + "mongoURI": "" + +} \ No newline at end of file diff --git a/helpers/commandHandler.js b/helpers/commandHandler.js new file mode 100644 index 0000000..ca0bf51 --- /dev/null +++ b/helpers/commandHandler.js @@ -0,0 +1,13 @@ +const { readdirSync } = require("fs") + +module.exports = (client) => { + const load = dirs => { + const commands = readdirSync(`./commands/${dirs}/`).filter(d => d.endsWith('.js')); + for (let file of commands) { + let pull = require(`../commands/${dirs}/${file}`); + let commandName = file.split(".")[0]; + client.commands.set(commandName, pull); + }; + }; + ["misc", "moderation"].forEach(x => load (x)) +} \ No newline at end of file diff --git a/helpers/db-functions.js b/helpers/db-functions.js index a5c15b8..abc2c8a 100644 --- a/helpers/db-functions.js +++ b/helpers/db-functions.js @@ -1,39 +1,38 @@ const saveData = require('../models/db-userData') const setRole = require('../models/db-roleData') +const saveLog = require("../models/db-logSanctions") class DB { - async GetRoleMute( querry, key ){ + async GetRoleMute(querry, key) { - let data = await setRole.find(querry, error => console.log(error)).clone().catch( error => console.log(error) ) - const roleFound = data.map( k => k[key] ) + let data = await setRole.find(querry).clone().catch(error => console.log(error)) + const roleFound = data.map(k => k[key]) return roleFound[0] } - async GetMembersData( querry, key ){ + async GetMembersDataSanctions(querry, key) { - let data = await saveData.find(querry, error => console.log(error)).clone().catch( error => console.log(error) ) - const rolesFound = data.map( k => k[key] ) + let data = await saveData.find(querry).clone().catch(error => console.log(error)) + const rolesFound = data.map(k => k[key]) return rolesFound[0] } - async SaveData( obj ){ + async SaveDataSactions(obj) { - const { user_id, channelId } = obj + const { user_id, server_id } = obj try { - const existData = await saveData.findOne( {user_id, channelId} ) - - console.log(existData) - - if( !existData ){ - const data = new saveData( obj ) - data.save() - }else { - await saveData.findOneAndReplace( {user_id, channelId}, obj, null, ( error ) => console.log(error) ).clone().catch( error => console.log(error) ) + const existData = await saveData.findOne({ user_id, server_id }) + + if (!existData) { + const data = new saveData(obj) + data.save() + } else { + await saveData.findOneAndReplace({ user_id, server_id }, obj, null, (error) => console.log(error)).clone().catch(error => console.log(error)) } } catch (error) { @@ -42,11 +41,35 @@ class DB { } - SetNewMuteRole( obj ) { + async SaveLogData( obj ) { + + try { + + let log = new saveLog( obj ) + log.save() + + } catch (error) { + console.log(error) + } + + } + + async GetLogDataLength() { + const dataLength = await saveLog.estimatedDocumentCount() + return dataLength + } + + async GetLogData( querry, skip = 0 ) { + + let data = await saveLog.find(querry, null, {sort: { '_id' : -1 }} ).clone().catch(error => console.log(error)) + return data + } + + SetNewMuteRole(obj) { try { - const data = new setRole( obj ) - data.save() + const data = new setRole(obj) + data.save() } catch (error) { console.log(error) } diff --git a/helpers/deleteUserMessage.js b/helpers/deleteUserMessage.js deleted file mode 100644 index e69de29..0000000 diff --git a/helpers/functions.js b/helpers/functions.js new file mode 100644 index 0000000..1798771 --- /dev/null +++ b/helpers/functions.js @@ -0,0 +1,70 @@ +const { messageEmbed } = require('../helpers/messageEmbeds'); + +const functions = { + + getMember: (client, message, args) => { + + const member = message.mentions.members.first() || message.guild.members.cache.get(args[0]) + if (!member) { + if (!member) { + const opt = { + description: `**❌ Unvalid User or ID or the User is not in the server **`, + color: 'red' + } + const errEmbed = messageEmbed(opt) + errEmbed.setFooter(message.author.username, client.user.displayAvatarURL()) + return message.channel.send({ embeds: [errEmbed] }) + } + } + + return member + + }, + + Pages: (arr, len) => { + let chunks = []; + let i = 0; + let n = arr.length; + + while (i < n) { + chunks.push(arr.slice(i, (i += len))); + } + + return chunks; + }, + + paginationEmbed: async (msg, pages, emojiList = ['βͺ', '⏩'], timeout = 120000) => { + if (!msg && !msg.channel) throw new Error('Channel is inaccessible.'); + if (!pages) throw new Error('Pages are not given.'); + if (emojiList.length !== 2) throw new Error('Need two emojis.'); + let page = 0; + const curPage = await msg.channel.send({ embeds: [pages[page].setFooter(`Page ${page + 1} / ${pages.length}`)]}); + for (const emoji of emojiList) await curPage.react(emoji); + const reactionCollector = curPage.createReactionCollector( + (reaction, user) => emojiList.includes(reaction.emoji.name) && !user.bot, + { time: timeout }, + ); + reactionCollector.on('collect', reaction => { + reaction.users.remove(msg.author); + switch (reaction.emoji.name) { + case emojiList[0]: + page = page > 0 ? --page : pages.length - 1; + break; + case emojiList[1]: + page = page + 1 < pages.length ? ++page : 0; + break; + default: + break; + } + curPage.edit({ embeds: [pages[page].setFooter(`Page ${page + 1} / ${pages.length}`)]}) + }); + reactionCollector.on('end', () => { + if (!curPage.deleted) { + curPage.reactions.removeAll() + } + }); + return curPage; + } +} + +module.exports = functions \ No newline at end of file diff --git a/include/core.js b/include/core.js index a42f608..06d58de 100644 --- a/include/core.js +++ b/include/core.js @@ -36,12 +36,6 @@ module.exports = { client.color = '#' + client.config.color.replace(/#/gi, ''); } else client.color = '#007acc'; - - if (client.config.thumbnail_image_url) { - client.thumbnail = client.config.thumbnail_image_url; - } else - client.thumbnail = 'https://i.gyazo.com/898c573e108fe755661265fc27ee7335.png'; - if (client.config.footer) { client.footer = client.config.footer; } else @@ -56,40 +50,6 @@ module.exports = { return (days > 0 ? days + " days, " : "") + (hours > 0 ? hours + " hours, " : "") + (minutes > 0 ? minutes + " minutes, " : "") + (seconds > 0 ? seconds + " seconds" : ""); }, - async fetchinfo(id) { - let response = await fetch('http://api.raidmax.org:5000/instance/' + id) - .then((res) => res.json()) - .catch(() => { console.log('\x1b[31mWarning: Masterserver not reachable\x1b[0m') }); - if (response && response.servers) { - let hostnames = []; - let players = []; - let maxplayers = []; - let gamemap = []; - let gametype = []; - let serid = []; - let serip = []; - let gameparser = []; - let gamename = []; - var total = response.servers.length; - for (i = 0; i < total; i++) { - if (response.servers[i]) { - hostnames[i] = (i + 1) + '. ' + response.servers[i].hostname.replace(/\^[0-9:;c]/g, ''); - players[i] = response.servers[i].clientnum; - maxplayers[i] = response.servers[i].maxclientnum; - gamemap[i] = response.servers[i].map; - gametype[i] = response.servers[i].gametype; - serid[i] = response.servers[i].id; - serip[i] = response.servers[i].ip + ':' + response.servers[i].port; - gameparser[i] = response.servers[i].version; - gamename[i] = response.servers[i].game - } - } - return [hostnames, players, maxplayers, gamemap, gametype, serid, serip, gameparser, gamename]; - } else { - return false; - } - }, - async execute(url, id, cookie, cmd) { let response = await fetch(url + '/api/server/' + id + '/execute', { method: 'POST', headers: { 'Content-Type': 'application/json', 'Cookie': cookie }, body: `{"command":"` + cmd + `"}` }) .catch(() => { console.log('\x1b[31mWarning: ' + url + ' not reachable\x1b[0m') }); diff --git a/include/dbutils.js b/include/dbutils.js deleted file mode 100644 index b33c594..0000000 --- a/include/dbutils.js +++ /dev/null @@ -1,44 +0,0 @@ -const { JsonDB } = require('node-json-db'); -const { Config } = require('node-json-db/dist/lib/JsonDBConfig'); -const db = new JsonDB(new Config("./database/db", false, false, '/')); -module.exports = { - insertData: function (userId, reason, type, active = true) { - db.push(`/${userId}`, { - reason: reason, - type: type, - active - }, true) - - db.save() - }, - - getData: function (userId) { - try { - return db.getData(`/${userId}`) - } catch (error) { - return null; - } - }, - - deleteData: function (userId) { - db.delete(`/${userId}`) - - db.save() - }, - - appendData: function (chan, ids) { - db.push(`/${chan}`, { - msgids: ids - }, true) - - db.save() - }, - - fetchData: function (chan) { - try { - return db.getData(`/${chan}`) - } catch (error) { - return null; - } - } -}; \ No newline at end of file diff --git a/json.sqlite b/json.sqlite deleted file mode 100644 index e69de29..0000000 diff --git a/models/db-logSanctions.js b/models/db-logSanctions.js new file mode 100644 index 0000000..3228922 --- /dev/null +++ b/models/db-logSanctions.js @@ -0,0 +1,42 @@ +const { model, Schema } = require('mongoose') +const moment = require("moment") + +const modelSchema = Schema({ + server_id: { + type: String, + required: [true, "The server id is required"] + }, + + user_id: { + type: String, + required: [true, "The uesr id is required"] + }, + + user_name: { + type: String, + default: "System" + }, + + command: { + type: String, + required: [true, "Command is required"] + }, + + reason: { + type: String, + default: "No reason" + }, + + made_by: { + type: String, + required: [true, "User who performed it required"] + }, + + date: { + type: String, + default: moment().format('MMMM Do YYYY, h:mm:ss a') + }, + +}) + +module.exports = model("Log", modelSchema) \ No newline at end of file diff --git a/models/db-roleData.js b/models/db-roleData.js index 21384a2..77a60a4 100644 --- a/models/db-roleData.js +++ b/models/db-roleData.js @@ -1,7 +1,7 @@ const { model, Schema } = require('mongoose') const modelSchema = Schema({ - channelId: { + server_id: { type: String, required: true, }, diff --git a/models/db-userData.js b/models/db-userData.js index 246f3fb..fa9eca4 100644 --- a/models/db-userData.js +++ b/models/db-userData.js @@ -1,10 +1,11 @@ const { model, Schema } = require('mongoose') +const moment = require('moment') const modelSchema = Schema({ - channelId: { + server_id: { type: String, - required: [true, 'The channelID is required'] + required: [true, 'The server ID is required'] }, user_id: { @@ -16,6 +17,22 @@ const modelSchema = Schema({ type: String }], + reason: { + type: String, + default: "No reason" + }, + + command: { + type: String, + required: [true, 'The command type is required'] + }, + + date: { + type: String, + default: moment().format('MMMM Do YYYY, h:mm:ss a') + }, + + }) -module.exports = model('Data', modelSchema, 'Data') \ No newline at end of file +module.exports = model('SanctionsData', modelSchema, 'SanctionsData') \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index aacd83f..81f50d7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,10 +10,10 @@ "license": "MIT", "dependencies": { "discord.js": "^13.3.1", + "discord.js-pagination": "^1.0.3", "giphy-js-sdk-core": "^1.0.6", "moment": "^2.29.1", "mongoose": "^6.1.2", - "node-json-db": "^1.4.1", "nodemon": "^2.0.15", "string-table": "^0.1.5" } @@ -654,6 +654,11 @@ "npm": ">=7.0.0" } }, + "node_modules/discord.js-pagination": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/discord.js-pagination/-/discord.js-pagination-1.0.3.tgz", + "integrity": "sha512-n6wuNo3CclZdwRfc5LMInjcrN23iKnKQTtlpX3VXGRtNofawBeQroYhl7xotSmpkIlL2Uqwo13T11+hHdNJ/bQ==" + }, "node_modules/dot-prop": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz", @@ -1177,17 +1182,6 @@ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" }, - "node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/moment": { "version": "2.29.1", "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz", @@ -1338,14 +1332,6 @@ "node": "4.x || >=6.0.0" } }, - "node_modules/node-json-db": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/node-json-db/-/node-json-db-1.4.1.tgz", - "integrity": "sha512-hyfnBtuN3kb88SMmDgVil53Frygx+yYkVi6t10VjpEsPseuMI8+gT+FF37DOcyGCr/1wq6qNIr5PnFimCDlzfA==", - "dependencies": { - "mkdirp": "~1.0.4" - } - }, "node_modules/nodemon": { "version": "2.0.15", "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.15.tgz", @@ -2454,6 +2440,11 @@ "ws": "^8.2.3" } }, + "discord.js-pagination": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/discord.js-pagination/-/discord.js-pagination-1.0.3.tgz", + "integrity": "sha512-n6wuNo3CclZdwRfc5LMInjcrN23iKnKQTtlpX3VXGRtNofawBeQroYhl7xotSmpkIlL2Uqwo13T11+hHdNJ/bQ==" + }, "dot-prop": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz", @@ -2844,11 +2835,6 @@ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" }, - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" - }, "moment": { "version": "2.29.1", "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz", @@ -2964,14 +2950,6 @@ "whatwg-url": "^5.0.0" } }, - "node-json-db": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/node-json-db/-/node-json-db-1.4.1.tgz", - "integrity": "sha512-hyfnBtuN3kb88SMmDgVil53Frygx+yYkVi6t10VjpEsPseuMI8+gT+FF37DOcyGCr/1wq6qNIr5PnFimCDlzfA==", - "requires": { - "mkdirp": "~1.0.4" - } - }, "nodemon": { "version": "2.0.15", "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.15.tgz", diff --git a/package.json b/package.json index 6f3787a..55c4c51 100644 --- a/package.json +++ b/package.json @@ -14,10 +14,10 @@ }, "dependencies": { "discord.js": "^13.3.1", + "discord.js-pagination": "^1.0.3", "giphy-js-sdk-core": "^1.0.6", "moment": "^2.29.1", "mongoose": "^6.1.2", - "node-json-db": "^1.4.1", "nodemon": "^2.0.15", "string-table": "^0.1.5" }