From 4209494ee4b8a35542c34f7d8f496acbf90c58bc Mon Sep 17 00:00:00 2001 From: Boeing_737 Date: Fri, 23 Sep 2022 14:27:45 -0600 Subject: [PATCH 01/70] Comments added --- Pogy.js | 20 ++++++++++---------- index.js | 12 ++++++------ src/events/ready.js | 9 +++++---- 3 files changed, 21 insertions(+), 20 deletions(-) diff --git a/Pogy.js b/Pogy.js index 129aa05..3cf3282 100644 --- a/Pogy.js +++ b/Pogy.js @@ -1,12 +1,12 @@ -const { Client, Collection } = require("discord.js"); -const Util = require("./src/structures/Util"); -const config = require("./config.json"); -const { status } = config; +const { Client, Collection } = require("discord.js"); // discord.js required for main functions +const Util = require("./src/structures/Util"); // Needed for utils, do not remove this important file or part of code. +const config = require("./config.json"); // config.json, create new file called this with template code or rename the file +const { status } = config; // used for activities to be shown module.exports = class PogyClient extends Client { constructor(options = {}) { super({ - partials: ["MESSAGE", "CHANNEL", "REACTION", "GUILD_MEMBER", "USER"], + partials: ["MESSAGE", "CHANNEL", "REACTION", "GUILD_MEMBER", "USER"], // partials for client, DO NOT EDIT. intents: [ "GUILDS", "GUILD_MEMBERS", @@ -15,22 +15,22 @@ module.exports = class PogyClient extends Client { "GUILD_MESSAGE_REACTIONS", "GUILD_VOICE_STATES", "GUILD_PRESENCES", - ], + ], // intents required for client, DO NOT EDIT THESE. allowedMentions: { parse: ["roles", "users", "everyone"], repliedUser: true, }, presence: { - status: "online", + status: "online", // can be "online", "dnd", "idle" activities: [ { - type: "WATCHING", - name: status, + type: "WATCHING", // can be "WATCHING", "STREAMING" (url required for stream status), "PLAYING", or "LISTENING" + name: status, // must be a string }, ], }, }); - + // main bot code, DO NOT EDIT. this.validate(options); this.botCommands = new Collection(); this.botEvents = new Collection(); diff --git a/index.js b/index.js index a1684b9..e38c688 100644 --- a/index.js +++ b/index.js @@ -1,23 +1,23 @@ require("dotenv").config(); -const PogyClient = require("./Pogy"); +const PogyClient = require("./Pogy"); // Required for initial bot connection const config = require("./config.json"); const logger = require("./src/utils/logger"); -const Pogy = new PogyClient(config); +const Pogy = new PogyClient(config); // Required for client login -const color = require("./src/data/colors"); +const color = require("./src/data/colors"); // colors Pogy.color = color; -const emoji = require("./src/data/emoji"); +const emoji = require("./src/data/emoji"); // emojis (make sure to add your custom emojis to this file) Pogy.emoji = emoji; let client = Pogy; -const jointocreate = require("./src/structures/jointocreate"); +const jointocreate = require("./src/structures/jointocreate"); // file required to make jointocreate jointocreate(client); Pogy.react = new Map(); Pogy.fetchforguild = new Map(); -Pogy.start(process.env.TOKEN); +Pogy.start(process.env.TOKEN); // NEEDED FOR BOT LOGIN, SHOULD NEVER BE REMOVED OR EDITED process.on("unhandledRejection", (reason, p) => { logger.info(`[unhandledRejection] ${reason.message}`, { label: "ERROR" }); diff --git a/src/events/ready.js b/src/events/ready.js index eb2f2bb..fc4dfa5 100644 --- a/src/events/ready.js +++ b/src/events/ready.js @@ -1,10 +1,11 @@ -const logger = require("../utils/logger"); -const Event = require("../structures/Event"); +const logger = require("../utils/logger"); // logger used for logs +const Event = require("../structures/Event"); /* Event file. This is used for the events +required for the bot to function correctly */ const Discord = require("discord.js"); const config = require("../../config.json"); const Guild = require("../database/schemas/Guild"); const { WebhookClient } = require("discord.js"); -const premiumrip = new WebhookClient({ url: config.webhooks.premium }); +const premiumrip = new WebhookClient({ url: config.webhooks.premium }); // make sure webhook link is correct!! const Message = require("../utils/other/message"); const { Handler } = require("discord-slash-command-handler"); module.exports = class extends Event { @@ -16,7 +17,7 @@ module.exports = class extends Event { commandType: "file", allSlash: true, handleSlash: true, - }); + }); // Slash command handler, your choice if you want to remove this, best if you dont. logger.info( `${this.client.user.tag} is ready to serve ${this.client.guilds.cache.size} guilds.`, From e795091dffb1569b185ed9258c1994550d11ba35 Mon Sep 17 00:00:00 2001 From: Boeing-737-800 Date: Mon, 3 Oct 2022 19:54:17 -0600 Subject: [PATCH 02/70] Added new command for Pogy --- src/commands/moderation/modnick.js | 85 ++++++++++++++++++++++++++++++ 1 file changed, 85 insertions(+) create mode 100644 src/commands/moderation/modnick.js diff --git a/src/commands/moderation/modnick.js b/src/commands/moderation/modnick.js new file mode 100644 index 0000000..898b884 --- /dev/null +++ b/src/commands/moderation/modnick.js @@ -0,0 +1,85 @@ +const Command = require("../../structures/Command"); +const { MessageEmbed } = require("discord.js"); +const darkpassword = require("generate-password"); +const Logging = require("../../database/schemas/logging"); + +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: "modnick", + aliases: ["mod", "modnickname"], + description: "Moderate a users nickname to make pinging possible", + category: "Moderation", + guildOnly: true, + botPermission: ["MANAGE_NICKNAMES"], + userPermission: ["MANAGE_NICKNAMES"], + usage: "<@user> [reason]", + examples: "modnick @Peter Please make sure your nickname have characters that are typeable on a standard QWERTY keyboard", + cooldown: 30, + }); + } + + async run(message, args) { + const client = message.client + const logging = await Logging.findOne({ guildId: message.guild.id }); + + const member = + message.mentions.members.last() || + message.guild.members.cache.get(args[0]); + + const reason = args.slice(1).join(" "); + + const impostorpassword = darkpassword.generate({ + length: 6, + numbers: true, + }); + + //LOGGING HERE + if (logging) { + if (logging.moderation.delete_after_executed === "true") { + message.delete().catch(() => {}); + } + } + + if(!args[0]) { + let validmention = new MessageEmbed() + .setColor("RED") + .setDescription(`${client.emoji.fail} | Please mention a valid member!`) + return message.channel.sendCustom({ embeds: [validmention] }) + } + + if(!member) { + let usernotfound = new MessageEmbed() + .setColor("RED") + .setDescription(`${client.emoji.fail} | I can't find that member`) + return message.channel.sendCustom({ embeds: [usernotfound] }) + } + + if(member.roles.highest.position >= message.member.roles.highest.position) { + let rolesmatch = new MessageEmbed() + .setColor("RED") + .setDescription(`${client.emoji.fail} | They have more power than you or have equal power as you do!`) + return message.channel.sendCustom({ embeds: [rolesmatch] }) + } + + if(member.id === message.author.id) { + let modnickerror = new MessageEmbed() + .setColor("RED") + .setDescription(`${client.emoji.fail} | You can't moderate your own nickname!`) + return message.channel.sendCustom({ embeds: [modnickerror] }) + } + + if(member) { + const oldNickname = member.nickname || "None"; + await member.setNickname(`Moderated Nickname ${impostorpassword}`) + let embed = new MessageEmbed() + .setColor("BLURPLE") + .setDescription(`${client.emoji.success} | Moderated <@${member.id}>'s nickname for \`${reason || "No Reason Provided"}\``) + + message.channel.sendCustom({ embeds: [embed] }) + } else { + return message.reply(`I can't moderate their nickname, make sure that my role is above theirs`) + } + return undefined + } +}; \ No newline at end of file From a37f1c9f2ea19832582963666862063871e8b5b5 Mon Sep 17 00:00:00 2001 From: Boeing-737-800 Date: Tue, 4 Oct 2022 17:40:49 -0600 Subject: [PATCH 03/70] Added Hack Command For Pogy (bugs fixed) --- src/commands/fun/hack.js | 103 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 103 insertions(+) create mode 100644 src/commands/fun/hack.js diff --git a/src/commands/fun/hack.js b/src/commands/fun/hack.js new file mode 100644 index 0000000..53bbe1f --- /dev/null +++ b/src/commands/fun/hack.js @@ -0,0 +1,103 @@ +const Command = require("../../structures/Command"); +const Guild = require("../../database/schemas/Guild"); +const darkrandom = require("random"); +const darkemail = require("random-email"); +const darkpassword = require("generate-password"); + +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: "hack", + description: "Hack someone! (fake)", + category: "Fun", + usage: "", + examples: [ "hack @Pogy" ], + cooldown: 3, + }); + } + + async run(message) { + + + const guildDB = await Guild.findOne({ + guildId: message.guild.id + }); + + const language = require(`../../data/language/${guildDB.language}.json`) + + + const impostorpassword = darkpassword.generate({ + length: 10, + numbers: true, + }); + + const user = message.mentions.users.first(); + if(!user) { + return message.channel.sendCustom(`${language.hack1}`); + } else { + if (user.bot) { + return message.channel.sendCustom(`${language.hackbot}`); + } + } + const member = message.mentions.members.last(); + const mostCommon = [`${language.hack2}`, `${language.hack3}`, `${language.hack3}`, `${language.hack4}`, `${language.hack5}`, `${language.hack6}`]; + const lastdm = [ + `${language.hack7}`, + `${language.hack8}`, + `${language.hack9}`, + `${language.hack10}`, + ]; + + + message.channel.send(`${language.hack11} "${member.user.username}" ${language.hack12}`) + .then(async (msg) => { + setTimeout(async function () { + await msg.edit(`[▘] ${language.hack13}`).catch(() => {}); + }, 1500); + setTimeout(async function () { + await msg.edit( + `[▝] Email: \`${darkemail({ + domain: "gmail.com", + })}\`\nPassword: \`${impostorpassword}\`` + ).catch(() => {}); + }, 3000); + setTimeout(async function () { + await msg.edit( + `[▖] Last DM: "${lastdm[Math.floor(Math.random() * lastdm.length)]}"` + ).catch(() => {}); + }, 4500); + setTimeout(async function () { + await msg.edit(`[▘] ${language.hack14}`).catch(() => {}); + }, 6000); + setTimeout(async function () { + await msg.edit( + `[▝] mostCommon = "${ + mostCommon[Math.floor(Math.random() * mostCommon.length)] + }"` + ).catch(() => {}); + }, 7500); + setTimeout(async function () { + await msg.edit(`[▗] Finding IP address...`).catch(() => {}); + }, 9000) + setTimeout(async function () { + await msg.edit( + `[▖] IP address: \`127.0.0.1:${darkrandom.int(100, 9999)}\`` + ).catch(() => {}); + }, 10500); + setTimeout(async function () { + await msg.edit(`[▘] ${language.hack15}`).catch(() => {}); + }, 12000); + setTimeout(async function () { + await msg.edit(`[▝] ${language.hack16}`).catch(() => {}); + }, 13500); + setTimeout(async function () { + await msg.edit(`${language.hack17} ${member.user.username}`).catch(() => {}); + }, 15000); + setTimeout(async function () { + await message.channel.send( + `${language.hack18}` + ).catch(() => {}); + }, 16500); + }); + +}} \ No newline at end of file From ca28247d23823b79a8bef2314affa8259faf7e01 Mon Sep 17 00:00:00 2001 From: Boeing-737-800 Date: Wed, 9 Nov 2022 18:10:11 -0700 Subject: [PATCH 04/70] Slash Command support --- Pogy.js | 22 +++++---- config.json.template | 1 + index.js | 41 +++++++++++++--- src/deployCommands.js | 23 +++++++++ src/slashCommands/mute.js | 97 +++++++++++++++++++++++++++++++++++++ src/slashCommands/unmute.js | 81 +++++++++++++++++++++++++++++++ 6 files changed, 249 insertions(+), 16 deletions(-) create mode 100644 src/deployCommands.js create mode 100644 src/slashCommands/mute.js create mode 100644 src/slashCommands/unmute.js diff --git a/Pogy.js b/Pogy.js index 3cf3282..35b92f6 100644 --- a/Pogy.js +++ b/Pogy.js @@ -1,12 +1,14 @@ -const { Client, Collection } = require("discord.js"); // discord.js required for main functions -const Util = require("./src/structures/Util"); // Needed for utils, do not remove this important file or part of code. -const config = require("./config.json"); // config.json, create new file called this with template code or rename the file -const { status } = config; // used for activities to be shown +const { Client, Collection } = require("discord.js"); +const Util = require("./src/structures/Util"); +const config = require("./config.json"); +const fs = require("node:fs"); +const path = require("node:path"); +const { status } = config; module.exports = class PogyClient extends Client { constructor(options = {}) { super({ - partials: ["MESSAGE", "CHANNEL", "REACTION", "GUILD_MEMBER", "USER"], // partials for client, DO NOT EDIT. + partials: ["MESSAGE", "CHANNEL", "REACTION", "GUILD_MEMBER", "USER"], intents: [ "GUILDS", "GUILD_MEMBERS", @@ -15,24 +17,24 @@ module.exports = class PogyClient extends Client { "GUILD_MESSAGE_REACTIONS", "GUILD_VOICE_STATES", "GUILD_PRESENCES", - ], // intents required for client, DO NOT EDIT THESE. + ], allowedMentions: { parse: ["roles", "users", "everyone"], repliedUser: true, }, presence: { - status: "online", // can be "online", "dnd", "idle" + status: "online", activities: [ { - type: "WATCHING", // can be "WATCHING", "STREAMING" (url required for stream status), "PLAYING", or "LISTENING" - name: status, // must be a string + type: "WATCHING", + name: status, }, ], }, }); - // main bot code, DO NOT EDIT. this.validate(options); this.botCommands = new Collection(); + this.slashCommands = new Collection(); this.botEvents = new Collection(); this.aliases = new Collection(); this.utils = require("./src/utils/utils.js"); diff --git a/config.json.template b/config.json.template index fc8331e..251d0ca 100644 --- a/config.json.template +++ b/config.json.template @@ -1,4 +1,5 @@ { + "clientId": "", "developers": [], "status": "p!help | pogy.xyz", "discord": "", diff --git a/index.js b/index.js index e38c688..a0f69a4 100644 --- a/index.js +++ b/index.js @@ -1,23 +1,52 @@ require("dotenv").config(); -const PogyClient = require("./Pogy"); // Required for initial bot connection +const PogyClient = require("./Pogy"); const config = require("./config.json"); +const fs = require("node:fs"); +const deploy = require("./src/deployCommands.js"); +const path = require("node:path"); +const { Collection } = require("discord.js"); const logger = require("./src/utils/logger"); -const Pogy = new PogyClient(config); // Required for client login +const Pogy = new PogyClient(config); -const color = require("./src/data/colors"); // colors +const color = require("./src/data/colors"); Pogy.color = color; -const emoji = require("./src/data/emoji"); // emojis (make sure to add your custom emojis to this file) +const emoji = require("./src/data/emoji"); Pogy.emoji = emoji; let client = Pogy; -const jointocreate = require("./src/structures/jointocreate"); // file required to make jointocreate +const jointocreate = require("./src/structures/jointocreate"); jointocreate(client); +client.slashCommands = new Collection(); +const commandsPath = path.join(__dirname, "src/slashCommands"); +const commandFiles = fs.readdirSync(commandsPath).filter(file => file.endsWith(".js")); + +for (const file of commandFiles) { + const filePath = path.join(commandsPath, file); + const slashCommand = require(filePath); + client.slashCommands.set(slashCommand.data.name, slashCommand); +} + +client.on('interactionCreate', async interaction => { + if(!interaction.isCommand()) return; + + const slashCommand = client.slashCommands.get(interaction.commandName); + + if (!slashCommand) return; + + try { + await slashCommand.execute(interaction); + } catch (error) { + console.error(error); + await interaction.reply({ content: 'There was an error while executing this command!', ephemeral: true }); + } +}); + Pogy.react = new Map(); Pogy.fetchforguild = new Map(); -Pogy.start(process.env.TOKEN); // NEEDED FOR BOT LOGIN, SHOULD NEVER BE REMOVED OR EDITED +Pogy.start(process.env.TOKEN); process.on("unhandledRejection", (reason, p) => { logger.info(`[unhandledRejection] ${reason.message}`, { label: "ERROR" }); diff --git a/src/deployCommands.js b/src/deployCommands.js new file mode 100644 index 0000000..df23aca --- /dev/null +++ b/src/deployCommands.js @@ -0,0 +1,23 @@ +const fs = require("node:fs"); +const path = require("node:path"); +const { REST } = require("@discordjs/rest"); +const { Routes } = require("discord-api-types/v9"); +const { clientId } = require("../config.json") + + +const commands = []; +const commandsPath = path.join(__dirname, 'slashCommands'); +const commandFiles = fs.readdirSync(commandsPath).filter(file => file.endsWith(".js")); + +for (const file of commandFiles) { + const filePath = path.join(commandsPath, file); + const command = require(filePath); + commands.push(command.data.toJSON()); +} + + +const rest = new REST({ version: '9' }).setToken(process.env.TOKEN); + +rest.put(Routes.applicationCommands(clientId), { body: commands }) +.then(() => console.log('Successfully registered application commands.')) +.catch(console.error); \ No newline at end of file diff --git a/src/slashCommands/mute.js b/src/slashCommands/mute.js new file mode 100644 index 0000000..8cf355e --- /dev/null +++ b/src/slashCommands/mute.js @@ -0,0 +1,97 @@ +const { SlashCommandBuilder } = require("@discordjs/builders"); +const { MessageEmbed } = require("discord.js"); +const ms = require("ms"); +const Logging = require("../database/schemas/logging"); + +module.exports = { + data: new SlashCommandBuilder() + .setName("mute") + .setDescription("Mute a person in the server!") + .addUserOption((option) => option.setName("member").setDescription("Person who you want to put in timeout.").setRequired(true)) + .addStringOption((option) => option.setName("time").setDescription("For how much time you want to timeout for").setRequired(true)) + .addStringOption((option) => option.setName("reason").setDescription("The reason of the timeout")), + async execute(interaction) { + const client = interaction.client + const logging = await Logging.findOne({ + guildId: interaction.guild.id + }); + if(!interaction.member.permissions.has("MODERATE_MEMBERS")) return interaction.followUp({ content: "You do not have permission to use this command." }); + + const member = interaction.options.getMember("member") + const reason = interaction.options.getString("reason") || "No reason provided" + const time = ms(interaction.options.getString("time")) + + if(!member) { + let usernotfound = new MessageEmbed() + .setColor("RED") + .setDescription(`${client.emoji.fail} | I can't find that member`) + return interaction.reply({ embeds: [usernotfound] }) + .then(async () => { + if (logging && logging.moderation.delete_reply === "true") { + setTimeout(() => { + interaction.deleteReply().catch(() => {}); + }, 5000); + } + }) + .catch(() => {}); + } + + if(member.roles.highest.position >= interaction.member.roles.highest.position) { + let rolesmatch = new MessageEmbed() + .setColor("RED") + .setDescription(`${client.emoji.fail} | They have more power than you or have equal power as you do!`) + return interaction.reply({ embeds: [rolesmatch] }) + .then(async () => { + if (logging && logging.moderation.delete_reply === "true") { + setTimeout(() => { + interaction.deleteReply().catch(() => {}); + }, 5000); + } + }) + .catch(() => {}); + } + + if(!time) { + let timevalid = new MessageEmbed() + .setColor("RED") + .setDescription(`${client.emoji.fail} | The time specified is not valid. It is necessary that you provide valid time.`) + + return interaction.reply({ embeds: [timevalid] }) + .then(async () => { + if (logging && logging.moderation.delete_reply === "true") { + setTimeout(() => { + interaction.deleteReply().catch(() => {}); + }, 5000); + } + }); + } + if(member) { + const response = await member.timeout(time, reason) + let timeoutsuccess = new MessageEmbed() + .setColor("GREEN") + .setDescription(`${client.emoji.success} | ${member} has been timed out for ${ms(time, { long: true })}`) + return interaction.reply({ embeds: [timeoutsuccess] }) + .then(async () => { + if (logging && logging.moderation.delete_reply === "true") { + setTimeout(() => { + interaction.deleteReply().catch(() => {}); + }, 5000); + } + }) + .catch(() => {}); + } + if(member) { + let dmEmbed = new MessageEmbed() + .setColor("RED") + .setDescription(`You have been muted in **${interaction.guild.name}**.\n\n__**Moderator:**__ ${interaction.author} **(${interaction.author.tag})**\n__**Reason:**__ ${reason || "No Reason Provided"}`) + .setTimestamp() + member.send({ embeds: [dmEmbed] }) + } else { + let failembed = new MessageEmbed() + .setColor(client.color.red) + .setDescription(`${client.emoji.fail} | I cannot time out that member. Make sure that my role is above their role or that I have sufficient perms to execute the command.`) + .setTimestamp() + return interaction.reply({ embeds: [failembed] }) + } + }, +}; \ No newline at end of file diff --git a/src/slashCommands/unmute.js b/src/slashCommands/unmute.js new file mode 100644 index 0000000..421b1ec --- /dev/null +++ b/src/slashCommands/unmute.js @@ -0,0 +1,81 @@ +const { SlashCommandBuilder } = require("@discordjs/builders"); +const { MessageEmbed } = require("discord.js"); +const ms = require("ms"); +const Logging = require("../database/schemas/logging"); + +module.exports = { + data: new SlashCommandBuilder() + .setName("unmute") + .setDescription("Unmute a person in the server!") + .addUserOption((option) => option.setName("member").setDescription("Person who you want to put in timeout.").setRequired(true)) + .addStringOption((option) => option.setName("reason").setDescription("The reason of the timeout")), + async execute(interaction) { + const client = interaction.client + const logging = await Logging.findOne({ + guildId: interaction.guild.id + }); + if(!interaction.member.permissions.has("MODERATE_MEMBERS")) return interaction.followUp({ content: "You do not have permission to use this command." }); + + const member = interaction.options.getMember("member") + const reason = interaction.options.getString("reason") || "No reason provided" + + if(!member) { + let usernotfound = new MessageEmbed() + .setColor("RED") + .setDescription(`${client.emoji.fail} | I can't find that member`) + return interaction.reply({ embeds: [usernotfound] }) + .then(async () => { + if (logging && logging.moderation.delete_reply === "true") { + setTimeout(() => { + interaction.deleteReply().catch(() => {}); + }, 5000); + } + }) + .catch(() => {}); + } + + if(member.roles.highest.position >= interaction.member.roles.highest.position) { + let rolesmatch = new MessageEmbed() + .setColor("RED") + .setDescription(`${client.emoji.fail} | They have more power than you or have equal power as you do!`) + return interaction.reply({ embeds: [rolesmatch] }) + .then(async () => { + if (logging && logging.moderation.delete_reply === "true") { + setTimeout(() => { + interaction.deleteReply().catch(() => {}); + }, 5000); + } + }) + .catch(() => {}); + } + + if(member) { + const response = await member.timeout(0 * 60 * 1000, reason) + let timeoutsuccess = new MessageEmbed() + .setColor("GREEN") + .setDescription(`${client.emoji.success} | ${member} has been unmuted.`) + return interaction.reply({ embeds: [timeoutsuccess] }) + .then(async () => { + if (logging && logging.moderation.delete_reply === "true") { + setTimeout(() => { + interaction.deleteReply().catch(() => {}); + }, 5000); + } + }) + .catch(() => {}); + } + if(member) { + let dmEmbed = new MessageEmbed() + .setColor("RED") + .setDescription(`You have been unmuted in **${interaction.guild.name}**.\n\n__**Moderator:**__ ${interaction.author} **(${interaction.author.tag})**\n__**Reason:**__ ${reason || "No Reason Provided"}`) + .setTimestamp() + member.send({ embeds: [dmEmbed] }) + } else { + let failembed = new MessageEmbed() + .setColor(client.color.red) + .setDescription(`${client.emoji.fail} | I cannot unmute that member. Make sure that my role is above their role or that I have sufficient perms to execute the command, OR they aren't muted.`) + .setTimestamp() + return interaction.reply({ embeds: [failembed] }) + } + }, +}; \ No newline at end of file From e9bb3df462fa3efb842eacfcb8aa97bd7b0647bf Mon Sep 17 00:00:00 2001 From: Boeing-737-800 Date: Wed, 9 Nov 2022 18:20:26 -0700 Subject: [PATCH 05/70] Slash Command Support for Pogy --- Pogy.js | 4 +- config.json.template | 1 + index.js | 29 +++++++++++ src/deployCommands.js | 23 +++++++++ src/slashCommands/mute.js | 97 +++++++++++++++++++++++++++++++++++++ src/slashCommands/unmute.js | 81 +++++++++++++++++++++++++++++++ 6 files changed, 234 insertions(+), 1 deletion(-) create mode 100644 src/deployCommands.js create mode 100644 src/slashCommands/mute.js create mode 100644 src/slashCommands/unmute.js diff --git a/Pogy.js b/Pogy.js index 129aa05..35b92f6 100644 --- a/Pogy.js +++ b/Pogy.js @@ -1,6 +1,8 @@ const { Client, Collection } = require("discord.js"); const Util = require("./src/structures/Util"); const config = require("./config.json"); +const fs = require("node:fs"); +const path = require("node:path"); const { status } = config; module.exports = class PogyClient extends Client { @@ -30,9 +32,9 @@ module.exports = class PogyClient extends Client { ], }, }); - this.validate(options); this.botCommands = new Collection(); + this.slashCommands = new Collection(); this.botEvents = new Collection(); this.aliases = new Collection(); this.utils = require("./src/utils/utils.js"); diff --git a/config.json.template b/config.json.template index fc8331e..251d0ca 100644 --- a/config.json.template +++ b/config.json.template @@ -1,4 +1,5 @@ { + "clientId": "", "developers": [], "status": "p!help | pogy.xyz", "discord": "", diff --git a/index.js b/index.js index a1684b9..a0f69a4 100644 --- a/index.js +++ b/index.js @@ -1,6 +1,10 @@ require("dotenv").config(); const PogyClient = require("./Pogy"); const config = require("./config.json"); +const fs = require("node:fs"); +const deploy = require("./src/deployCommands.js"); +const path = require("node:path"); +const { Collection } = require("discord.js"); const logger = require("./src/utils/logger"); const Pogy = new PogyClient(config); @@ -14,6 +18,31 @@ let client = Pogy; const jointocreate = require("./src/structures/jointocreate"); jointocreate(client); +client.slashCommands = new Collection(); +const commandsPath = path.join(__dirname, "src/slashCommands"); +const commandFiles = fs.readdirSync(commandsPath).filter(file => file.endsWith(".js")); + +for (const file of commandFiles) { + const filePath = path.join(commandsPath, file); + const slashCommand = require(filePath); + client.slashCommands.set(slashCommand.data.name, slashCommand); +} + +client.on('interactionCreate', async interaction => { + if(!interaction.isCommand()) return; + + const slashCommand = client.slashCommands.get(interaction.commandName); + + if (!slashCommand) return; + + try { + await slashCommand.execute(interaction); + } catch (error) { + console.error(error); + await interaction.reply({ content: 'There was an error while executing this command!', ephemeral: true }); + } +}); + Pogy.react = new Map(); Pogy.fetchforguild = new Map(); diff --git a/src/deployCommands.js b/src/deployCommands.js new file mode 100644 index 0000000..df23aca --- /dev/null +++ b/src/deployCommands.js @@ -0,0 +1,23 @@ +const fs = require("node:fs"); +const path = require("node:path"); +const { REST } = require("@discordjs/rest"); +const { Routes } = require("discord-api-types/v9"); +const { clientId } = require("../config.json") + + +const commands = []; +const commandsPath = path.join(__dirname, 'slashCommands'); +const commandFiles = fs.readdirSync(commandsPath).filter(file => file.endsWith(".js")); + +for (const file of commandFiles) { + const filePath = path.join(commandsPath, file); + const command = require(filePath); + commands.push(command.data.toJSON()); +} + + +const rest = new REST({ version: '9' }).setToken(process.env.TOKEN); + +rest.put(Routes.applicationCommands(clientId), { body: commands }) +.then(() => console.log('Successfully registered application commands.')) +.catch(console.error); \ No newline at end of file diff --git a/src/slashCommands/mute.js b/src/slashCommands/mute.js new file mode 100644 index 0000000..8cf355e --- /dev/null +++ b/src/slashCommands/mute.js @@ -0,0 +1,97 @@ +const { SlashCommandBuilder } = require("@discordjs/builders"); +const { MessageEmbed } = require("discord.js"); +const ms = require("ms"); +const Logging = require("../database/schemas/logging"); + +module.exports = { + data: new SlashCommandBuilder() + .setName("mute") + .setDescription("Mute a person in the server!") + .addUserOption((option) => option.setName("member").setDescription("Person who you want to put in timeout.").setRequired(true)) + .addStringOption((option) => option.setName("time").setDescription("For how much time you want to timeout for").setRequired(true)) + .addStringOption((option) => option.setName("reason").setDescription("The reason of the timeout")), + async execute(interaction) { + const client = interaction.client + const logging = await Logging.findOne({ + guildId: interaction.guild.id + }); + if(!interaction.member.permissions.has("MODERATE_MEMBERS")) return interaction.followUp({ content: "You do not have permission to use this command." }); + + const member = interaction.options.getMember("member") + const reason = interaction.options.getString("reason") || "No reason provided" + const time = ms(interaction.options.getString("time")) + + if(!member) { + let usernotfound = new MessageEmbed() + .setColor("RED") + .setDescription(`${client.emoji.fail} | I can't find that member`) + return interaction.reply({ embeds: [usernotfound] }) + .then(async () => { + if (logging && logging.moderation.delete_reply === "true") { + setTimeout(() => { + interaction.deleteReply().catch(() => {}); + }, 5000); + } + }) + .catch(() => {}); + } + + if(member.roles.highest.position >= interaction.member.roles.highest.position) { + let rolesmatch = new MessageEmbed() + .setColor("RED") + .setDescription(`${client.emoji.fail} | They have more power than you or have equal power as you do!`) + return interaction.reply({ embeds: [rolesmatch] }) + .then(async () => { + if (logging && logging.moderation.delete_reply === "true") { + setTimeout(() => { + interaction.deleteReply().catch(() => {}); + }, 5000); + } + }) + .catch(() => {}); + } + + if(!time) { + let timevalid = new MessageEmbed() + .setColor("RED") + .setDescription(`${client.emoji.fail} | The time specified is not valid. It is necessary that you provide valid time.`) + + return interaction.reply({ embeds: [timevalid] }) + .then(async () => { + if (logging && logging.moderation.delete_reply === "true") { + setTimeout(() => { + interaction.deleteReply().catch(() => {}); + }, 5000); + } + }); + } + if(member) { + const response = await member.timeout(time, reason) + let timeoutsuccess = new MessageEmbed() + .setColor("GREEN") + .setDescription(`${client.emoji.success} | ${member} has been timed out for ${ms(time, { long: true })}`) + return interaction.reply({ embeds: [timeoutsuccess] }) + .then(async () => { + if (logging && logging.moderation.delete_reply === "true") { + setTimeout(() => { + interaction.deleteReply().catch(() => {}); + }, 5000); + } + }) + .catch(() => {}); + } + if(member) { + let dmEmbed = new MessageEmbed() + .setColor("RED") + .setDescription(`You have been muted in **${interaction.guild.name}**.\n\n__**Moderator:**__ ${interaction.author} **(${interaction.author.tag})**\n__**Reason:**__ ${reason || "No Reason Provided"}`) + .setTimestamp() + member.send({ embeds: [dmEmbed] }) + } else { + let failembed = new MessageEmbed() + .setColor(client.color.red) + .setDescription(`${client.emoji.fail} | I cannot time out that member. Make sure that my role is above their role or that I have sufficient perms to execute the command.`) + .setTimestamp() + return interaction.reply({ embeds: [failembed] }) + } + }, +}; \ No newline at end of file diff --git a/src/slashCommands/unmute.js b/src/slashCommands/unmute.js new file mode 100644 index 0000000..421b1ec --- /dev/null +++ b/src/slashCommands/unmute.js @@ -0,0 +1,81 @@ +const { SlashCommandBuilder } = require("@discordjs/builders"); +const { MessageEmbed } = require("discord.js"); +const ms = require("ms"); +const Logging = require("../database/schemas/logging"); + +module.exports = { + data: new SlashCommandBuilder() + .setName("unmute") + .setDescription("Unmute a person in the server!") + .addUserOption((option) => option.setName("member").setDescription("Person who you want to put in timeout.").setRequired(true)) + .addStringOption((option) => option.setName("reason").setDescription("The reason of the timeout")), + async execute(interaction) { + const client = interaction.client + const logging = await Logging.findOne({ + guildId: interaction.guild.id + }); + if(!interaction.member.permissions.has("MODERATE_MEMBERS")) return interaction.followUp({ content: "You do not have permission to use this command." }); + + const member = interaction.options.getMember("member") + const reason = interaction.options.getString("reason") || "No reason provided" + + if(!member) { + let usernotfound = new MessageEmbed() + .setColor("RED") + .setDescription(`${client.emoji.fail} | I can't find that member`) + return interaction.reply({ embeds: [usernotfound] }) + .then(async () => { + if (logging && logging.moderation.delete_reply === "true") { + setTimeout(() => { + interaction.deleteReply().catch(() => {}); + }, 5000); + } + }) + .catch(() => {}); + } + + if(member.roles.highest.position >= interaction.member.roles.highest.position) { + let rolesmatch = new MessageEmbed() + .setColor("RED") + .setDescription(`${client.emoji.fail} | They have more power than you or have equal power as you do!`) + return interaction.reply({ embeds: [rolesmatch] }) + .then(async () => { + if (logging && logging.moderation.delete_reply === "true") { + setTimeout(() => { + interaction.deleteReply().catch(() => {}); + }, 5000); + } + }) + .catch(() => {}); + } + + if(member) { + const response = await member.timeout(0 * 60 * 1000, reason) + let timeoutsuccess = new MessageEmbed() + .setColor("GREEN") + .setDescription(`${client.emoji.success} | ${member} has been unmuted.`) + return interaction.reply({ embeds: [timeoutsuccess] }) + .then(async () => { + if (logging && logging.moderation.delete_reply === "true") { + setTimeout(() => { + interaction.deleteReply().catch(() => {}); + }, 5000); + } + }) + .catch(() => {}); + } + if(member) { + let dmEmbed = new MessageEmbed() + .setColor("RED") + .setDescription(`You have been unmuted in **${interaction.guild.name}**.\n\n__**Moderator:**__ ${interaction.author} **(${interaction.author.tag})**\n__**Reason:**__ ${reason || "No Reason Provided"}`) + .setTimestamp() + member.send({ embeds: [dmEmbed] }) + } else { + let failembed = new MessageEmbed() + .setColor(client.color.red) + .setDescription(`${client.emoji.fail} | I cannot unmute that member. Make sure that my role is above their role or that I have sufficient perms to execute the command, OR they aren't muted.`) + .setTimestamp() + return interaction.reply({ embeds: [failembed] }) + } + }, +}; \ No newline at end of file From 3fafc4b6a106915c6e4b04560bb6a5efe306baaf Mon Sep 17 00:00:00 2001 From: Boeing-737-800 Date: Wed, 9 Nov 2022 18:21:12 -0700 Subject: [PATCH 06/70] Merge branch 'main' of https://github.com/Boeing-737-800/Pogy-1 --- src/commands/moderation/modnick.js | 85 ++++++++++++++++++++++++++++++ src/events/ready.js | 9 ++-- 2 files changed, 90 insertions(+), 4 deletions(-) create mode 100644 src/commands/moderation/modnick.js diff --git a/src/commands/moderation/modnick.js b/src/commands/moderation/modnick.js new file mode 100644 index 0000000..898b884 --- /dev/null +++ b/src/commands/moderation/modnick.js @@ -0,0 +1,85 @@ +const Command = require("../../structures/Command"); +const { MessageEmbed } = require("discord.js"); +const darkpassword = require("generate-password"); +const Logging = require("../../database/schemas/logging"); + +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: "modnick", + aliases: ["mod", "modnickname"], + description: "Moderate a users nickname to make pinging possible", + category: "Moderation", + guildOnly: true, + botPermission: ["MANAGE_NICKNAMES"], + userPermission: ["MANAGE_NICKNAMES"], + usage: "<@user> [reason]", + examples: "modnick @Peter Please make sure your nickname have characters that are typeable on a standard QWERTY keyboard", + cooldown: 30, + }); + } + + async run(message, args) { + const client = message.client + const logging = await Logging.findOne({ guildId: message.guild.id }); + + const member = + message.mentions.members.last() || + message.guild.members.cache.get(args[0]); + + const reason = args.slice(1).join(" "); + + const impostorpassword = darkpassword.generate({ + length: 6, + numbers: true, + }); + + //LOGGING HERE + if (logging) { + if (logging.moderation.delete_after_executed === "true") { + message.delete().catch(() => {}); + } + } + + if(!args[0]) { + let validmention = new MessageEmbed() + .setColor("RED") + .setDescription(`${client.emoji.fail} | Please mention a valid member!`) + return message.channel.sendCustom({ embeds: [validmention] }) + } + + if(!member) { + let usernotfound = new MessageEmbed() + .setColor("RED") + .setDescription(`${client.emoji.fail} | I can't find that member`) + return message.channel.sendCustom({ embeds: [usernotfound] }) + } + + if(member.roles.highest.position >= message.member.roles.highest.position) { + let rolesmatch = new MessageEmbed() + .setColor("RED") + .setDescription(`${client.emoji.fail} | They have more power than you or have equal power as you do!`) + return message.channel.sendCustom({ embeds: [rolesmatch] }) + } + + if(member.id === message.author.id) { + let modnickerror = new MessageEmbed() + .setColor("RED") + .setDescription(`${client.emoji.fail} | You can't moderate your own nickname!`) + return message.channel.sendCustom({ embeds: [modnickerror] }) + } + + if(member) { + const oldNickname = member.nickname || "None"; + await member.setNickname(`Moderated Nickname ${impostorpassword}`) + let embed = new MessageEmbed() + .setColor("BLURPLE") + .setDescription(`${client.emoji.success} | Moderated <@${member.id}>'s nickname for \`${reason || "No Reason Provided"}\``) + + message.channel.sendCustom({ embeds: [embed] }) + } else { + return message.reply(`I can't moderate their nickname, make sure that my role is above theirs`) + } + return undefined + } +}; \ No newline at end of file diff --git a/src/events/ready.js b/src/events/ready.js index eb2f2bb..fc4dfa5 100644 --- a/src/events/ready.js +++ b/src/events/ready.js @@ -1,10 +1,11 @@ -const logger = require("../utils/logger"); -const Event = require("../structures/Event"); +const logger = require("../utils/logger"); // logger used for logs +const Event = require("../structures/Event"); /* Event file. This is used for the events +required for the bot to function correctly */ const Discord = require("discord.js"); const config = require("../../config.json"); const Guild = require("../database/schemas/Guild"); const { WebhookClient } = require("discord.js"); -const premiumrip = new WebhookClient({ url: config.webhooks.premium }); +const premiumrip = new WebhookClient({ url: config.webhooks.premium }); // make sure webhook link is correct!! const Message = require("../utils/other/message"); const { Handler } = require("discord-slash-command-handler"); module.exports = class extends Event { @@ -16,7 +17,7 @@ module.exports = class extends Event { commandType: "file", allSlash: true, handleSlash: true, - }); + }); // Slash command handler, your choice if you want to remove this, best if you dont. logger.info( `${this.client.user.tag} is ready to serve ${this.client.guilds.cache.size} guilds.`, From 6c17c2a38d9621e54334dcd586478d7067708ff4 Mon Sep 17 00:00:00 2001 From: Boeing-737-800 Date: Wed, 9 Nov 2022 18:29:17 -0700 Subject: [PATCH 07/70] Slash Commands For Pogy with Raw djs --- Pogy.js | 3 ++ config.json.template | 1 + index.js | 29 +++++++++++ src/deployCommands.js | 23 +++++++++ src/slashCommands/mute.js | 97 +++++++++++++++++++++++++++++++++++++ src/slashCommands/unmute.js | 81 +++++++++++++++++++++++++++++++ 6 files changed, 234 insertions(+) create mode 100644 src/deployCommands.js create mode 100644 src/slashCommands/mute.js create mode 100644 src/slashCommands/unmute.js diff --git a/Pogy.js b/Pogy.js index 129aa05..e29f8b5 100644 --- a/Pogy.js +++ b/Pogy.js @@ -1,6 +1,8 @@ const { Client, Collection } = require("discord.js"); const Util = require("./src/structures/Util"); const config = require("./config.json"); +const fs = require("node:fs"); +const path = require("node:path"); const { status } = config; module.exports = class PogyClient extends Client { @@ -33,6 +35,7 @@ module.exports = class PogyClient extends Client { this.validate(options); this.botCommands = new Collection(); + this.slashCommands = new Collection(); this.botEvents = new Collection(); this.aliases = new Collection(); this.utils = require("./src/utils/utils.js"); diff --git a/config.json.template b/config.json.template index fc8331e..251d0ca 100644 --- a/config.json.template +++ b/config.json.template @@ -1,4 +1,5 @@ { + "clientId": "", "developers": [], "status": "p!help | pogy.xyz", "discord": "", diff --git a/index.js b/index.js index a1684b9..e42eb0a 100644 --- a/index.js +++ b/index.js @@ -1,7 +1,11 @@ require("dotenv").config(); const PogyClient = require("./Pogy"); const config = require("./config.json"); +const { Collection } = require("discord.js"); +const deploy = require("./src/deployCommands.js"); const logger = require("./src/utils/logger"); +const fs = require("node:fs"); +const path = require("node:path"); const Pogy = new PogyClient(config); const color = require("./src/data/colors"); @@ -14,6 +18,31 @@ let client = Pogy; const jointocreate = require("./src/structures/jointocreate"); jointocreate(client); +client.slashCommands = new Collection(); +const commandsPath = path.join(__dirname, "src/slashCommands"); +const commandFiles = fs.readdirSync(commandsPath).filter(file => file.endsWith(".js")); + +for (const file of commandFiles) { + const filePath = path.join(commandsPath, file); + const slashCommand = require(filePath); + client.slashCommands.set(slashCommand.data.name, slashCommand); +} + +client.on('interactionCreate', async interaction => { + if(!interaction.isCommand()) return; + + const slashCommand = client.slashCommands.get(interaction.commandName); + + if (!slashCommand) return; + + try { + await slashCommand.execute(interaction); + } catch (error) { + console.error(error); + await interaction.reply({ content: 'There was an error while executing this command!', ephemeral: true }); + } +}); + Pogy.react = new Map(); Pogy.fetchforguild = new Map(); diff --git a/src/deployCommands.js b/src/deployCommands.js new file mode 100644 index 0000000..df23aca --- /dev/null +++ b/src/deployCommands.js @@ -0,0 +1,23 @@ +const fs = require("node:fs"); +const path = require("node:path"); +const { REST } = require("@discordjs/rest"); +const { Routes } = require("discord-api-types/v9"); +const { clientId } = require("../config.json") + + +const commands = []; +const commandsPath = path.join(__dirname, 'slashCommands'); +const commandFiles = fs.readdirSync(commandsPath).filter(file => file.endsWith(".js")); + +for (const file of commandFiles) { + const filePath = path.join(commandsPath, file); + const command = require(filePath); + commands.push(command.data.toJSON()); +} + + +const rest = new REST({ version: '9' }).setToken(process.env.TOKEN); + +rest.put(Routes.applicationCommands(clientId), { body: commands }) +.then(() => console.log('Successfully registered application commands.')) +.catch(console.error); \ No newline at end of file diff --git a/src/slashCommands/mute.js b/src/slashCommands/mute.js new file mode 100644 index 0000000..8cf355e --- /dev/null +++ b/src/slashCommands/mute.js @@ -0,0 +1,97 @@ +const { SlashCommandBuilder } = require("@discordjs/builders"); +const { MessageEmbed } = require("discord.js"); +const ms = require("ms"); +const Logging = require("../database/schemas/logging"); + +module.exports = { + data: new SlashCommandBuilder() + .setName("mute") + .setDescription("Mute a person in the server!") + .addUserOption((option) => option.setName("member").setDescription("Person who you want to put in timeout.").setRequired(true)) + .addStringOption((option) => option.setName("time").setDescription("For how much time you want to timeout for").setRequired(true)) + .addStringOption((option) => option.setName("reason").setDescription("The reason of the timeout")), + async execute(interaction) { + const client = interaction.client + const logging = await Logging.findOne({ + guildId: interaction.guild.id + }); + if(!interaction.member.permissions.has("MODERATE_MEMBERS")) return interaction.followUp({ content: "You do not have permission to use this command." }); + + const member = interaction.options.getMember("member") + const reason = interaction.options.getString("reason") || "No reason provided" + const time = ms(interaction.options.getString("time")) + + if(!member) { + let usernotfound = new MessageEmbed() + .setColor("RED") + .setDescription(`${client.emoji.fail} | I can't find that member`) + return interaction.reply({ embeds: [usernotfound] }) + .then(async () => { + if (logging && logging.moderation.delete_reply === "true") { + setTimeout(() => { + interaction.deleteReply().catch(() => {}); + }, 5000); + } + }) + .catch(() => {}); + } + + if(member.roles.highest.position >= interaction.member.roles.highest.position) { + let rolesmatch = new MessageEmbed() + .setColor("RED") + .setDescription(`${client.emoji.fail} | They have more power than you or have equal power as you do!`) + return interaction.reply({ embeds: [rolesmatch] }) + .then(async () => { + if (logging && logging.moderation.delete_reply === "true") { + setTimeout(() => { + interaction.deleteReply().catch(() => {}); + }, 5000); + } + }) + .catch(() => {}); + } + + if(!time) { + let timevalid = new MessageEmbed() + .setColor("RED") + .setDescription(`${client.emoji.fail} | The time specified is not valid. It is necessary that you provide valid time.`) + + return interaction.reply({ embeds: [timevalid] }) + .then(async () => { + if (logging && logging.moderation.delete_reply === "true") { + setTimeout(() => { + interaction.deleteReply().catch(() => {}); + }, 5000); + } + }); + } + if(member) { + const response = await member.timeout(time, reason) + let timeoutsuccess = new MessageEmbed() + .setColor("GREEN") + .setDescription(`${client.emoji.success} | ${member} has been timed out for ${ms(time, { long: true })}`) + return interaction.reply({ embeds: [timeoutsuccess] }) + .then(async () => { + if (logging && logging.moderation.delete_reply === "true") { + setTimeout(() => { + interaction.deleteReply().catch(() => {}); + }, 5000); + } + }) + .catch(() => {}); + } + if(member) { + let dmEmbed = new MessageEmbed() + .setColor("RED") + .setDescription(`You have been muted in **${interaction.guild.name}**.\n\n__**Moderator:**__ ${interaction.author} **(${interaction.author.tag})**\n__**Reason:**__ ${reason || "No Reason Provided"}`) + .setTimestamp() + member.send({ embeds: [dmEmbed] }) + } else { + let failembed = new MessageEmbed() + .setColor(client.color.red) + .setDescription(`${client.emoji.fail} | I cannot time out that member. Make sure that my role is above their role or that I have sufficient perms to execute the command.`) + .setTimestamp() + return interaction.reply({ embeds: [failembed] }) + } + }, +}; \ No newline at end of file diff --git a/src/slashCommands/unmute.js b/src/slashCommands/unmute.js new file mode 100644 index 0000000..421b1ec --- /dev/null +++ b/src/slashCommands/unmute.js @@ -0,0 +1,81 @@ +const { SlashCommandBuilder } = require("@discordjs/builders"); +const { MessageEmbed } = require("discord.js"); +const ms = require("ms"); +const Logging = require("../database/schemas/logging"); + +module.exports = { + data: new SlashCommandBuilder() + .setName("unmute") + .setDescription("Unmute a person in the server!") + .addUserOption((option) => option.setName("member").setDescription("Person who you want to put in timeout.").setRequired(true)) + .addStringOption((option) => option.setName("reason").setDescription("The reason of the timeout")), + async execute(interaction) { + const client = interaction.client + const logging = await Logging.findOne({ + guildId: interaction.guild.id + }); + if(!interaction.member.permissions.has("MODERATE_MEMBERS")) return interaction.followUp({ content: "You do not have permission to use this command." }); + + const member = interaction.options.getMember("member") + const reason = interaction.options.getString("reason") || "No reason provided" + + if(!member) { + let usernotfound = new MessageEmbed() + .setColor("RED") + .setDescription(`${client.emoji.fail} | I can't find that member`) + return interaction.reply({ embeds: [usernotfound] }) + .then(async () => { + if (logging && logging.moderation.delete_reply === "true") { + setTimeout(() => { + interaction.deleteReply().catch(() => {}); + }, 5000); + } + }) + .catch(() => {}); + } + + if(member.roles.highest.position >= interaction.member.roles.highest.position) { + let rolesmatch = new MessageEmbed() + .setColor("RED") + .setDescription(`${client.emoji.fail} | They have more power than you or have equal power as you do!`) + return interaction.reply({ embeds: [rolesmatch] }) + .then(async () => { + if (logging && logging.moderation.delete_reply === "true") { + setTimeout(() => { + interaction.deleteReply().catch(() => {}); + }, 5000); + } + }) + .catch(() => {}); + } + + if(member) { + const response = await member.timeout(0 * 60 * 1000, reason) + let timeoutsuccess = new MessageEmbed() + .setColor("GREEN") + .setDescription(`${client.emoji.success} | ${member} has been unmuted.`) + return interaction.reply({ embeds: [timeoutsuccess] }) + .then(async () => { + if (logging && logging.moderation.delete_reply === "true") { + setTimeout(() => { + interaction.deleteReply().catch(() => {}); + }, 5000); + } + }) + .catch(() => {}); + } + if(member) { + let dmEmbed = new MessageEmbed() + .setColor("RED") + .setDescription(`You have been unmuted in **${interaction.guild.name}**.\n\n__**Moderator:**__ ${interaction.author} **(${interaction.author.tag})**\n__**Reason:**__ ${reason || "No Reason Provided"}`) + .setTimestamp() + member.send({ embeds: [dmEmbed] }) + } else { + let failembed = new MessageEmbed() + .setColor(client.color.red) + .setDescription(`${client.emoji.fail} | I cannot unmute that member. Make sure that my role is above their role or that I have sufficient perms to execute the command, OR they aren't muted.`) + .setTimestamp() + return interaction.reply({ embeds: [failembed] }) + } + }, +}; \ No newline at end of file From 6305dd9923982c6415a4501f2e30ce7c683fc564 Mon Sep 17 00:00:00 2001 From: Boeing-737-800 Date: Wed, 16 Nov 2022 18:44:18 -0700 Subject: [PATCH 08/70] More slash commands for pogy (Plus new handler) --- index.js | 15 ++-- src/deployCommands.js | 15 ++-- src/slashCommands/information/ping.js | 52 ++++++++++++++ src/slashCommands/moderation/ban.js | 95 +++++++++++++++++++++++++ src/slashCommands/moderation/kick.js | 95 +++++++++++++++++++++++++ src/slashCommands/moderation/mute.js | 97 ++++++++++++++++++++++++++ src/slashCommands/moderation/unban.js | 47 +++++++++++++ src/slashCommands/moderation/unmute.js | 81 +++++++++++++++++++++ 8 files changed, 485 insertions(+), 12 deletions(-) create mode 100644 src/slashCommands/information/ping.js create mode 100644 src/slashCommands/moderation/ban.js create mode 100644 src/slashCommands/moderation/kick.js create mode 100644 src/slashCommands/moderation/mute.js create mode 100644 src/slashCommands/moderation/unban.js create mode 100644 src/slashCommands/moderation/unmute.js diff --git a/index.js b/index.js index a0f69a4..b395c89 100644 --- a/index.js +++ b/index.js @@ -19,13 +19,16 @@ const jointocreate = require("./src/structures/jointocreate"); jointocreate(client); client.slashCommands = new Collection(); -const commandsPath = path.join(__dirname, "src/slashCommands"); -const commandFiles = fs.readdirSync(commandsPath).filter(file => file.endsWith(".js")); +const commandsFolders = fs.readdirSync("/src/slashCommands"); -for (const file of commandFiles) { - const filePath = path.join(commandsPath, file); - const slashCommand = require(filePath); - client.slashCommands.set(slashCommand.data.name, slashCommand); +for (const folder of commandsFolders) { + const commandFiles = fs.readdirSync(`./src/slashCommands/${folder}`).filter((file) => file.endsWith(".js")); + + for(const file of commandFiles) { + const slashCommand = require(`./src/slashCommands/${folder}/${file}`); + client.slashCommands.set(slashCommand.data.name, slashCommand); + Promise.resolve(command); + } } client.on('interactionCreate', async interaction => { diff --git a/src/deployCommands.js b/src/deployCommands.js index df23aca..d11ede8 100644 --- a/src/deployCommands.js +++ b/src/deployCommands.js @@ -3,16 +3,19 @@ const path = require("node:path"); const { REST } = require("@discordjs/rest"); const { Routes } = require("discord-api-types/v9"); const { clientId } = require("../config.json") +const { green } = require("colors"); const commands = []; -const commandsPath = path.join(__dirname, 'slashCommands'); -const commandFiles = fs.readdirSync(commandsPath).filter(file => file.endsWith(".js")); +const commandFolders = fs.readdirSync("./src/slashCommands"); -for (const file of commandFiles) { - const filePath = path.join(commandsPath, file); - const command = require(filePath); - commands.push(command.data.toJSON()); +for(const folder of commandFolders) { + const commandFiles = fs.readdirSync(`./src/slashCommands/${folder}`).filter((file) => file.endsWith(".js")); + + for(const file of commandFiles) { + const command = require(`./slashCommands/${folder}/${file}`); + commands.push(command.data.toJSON()); + } } diff --git a/src/slashCommands/information/ping.js b/src/slashCommands/information/ping.js new file mode 100644 index 0000000..78110e5 --- /dev/null +++ b/src/slashCommands/information/ping.js @@ -0,0 +1,52 @@ +const { SlashCommandBuilder } = require("@discordjs/builders"); +const { MessageEmbed } = require("discord.js"); +const Logging = require("../../database/schemas/logging.js"); +const Guild = require("../../database/schemas/Guild"); +const { stripIndent } = require("common-tags"); + +module.exports = { + data: new SlashCommandBuilder() + .setName("ping") + .setDescription("Return the ping of the bot."), + async execute(interaction) { + const guildDB = await Guild.findOne({ + guildId: interaction.guild.id, + }); + const client = interaction.client + const language = require(`../../data/language/${guildDB.language}.json`) + const embed = new MessageEmbed() + .setDescription(`Pinging...`) + .setColor(client.color.red) + .setFooter({ text: `Powered by https://mee8.ml/` }); + + const msg = await interaction.reply({ embeds: [embed], fetchReply: true }); + + const vowel = [ + "a", + "e", + "i", + "u", + "u" + ]; + + const latency = msg.createdTimestamp - interaction.createdTimestamp; + + let koko = stripIndent` + **${language.timeTaken}** \`${latency}ms\` + **${language.discordAPI}** \`${Math.round(client.ws.ping)}ms\` + `; + + let color = interaction.guild.me.displayHexColor; + if (latency < 100) { + color = `#00ff00`; + } else if (latency > 100 && latency < 200) { + color = `#CCCC00` + } else if (latency > 200) { + color = interaction.client.color.red; + } else color = interaction.guild.me.displayHexColor; + + embed.setDescription(`P${vowel[Math.floor(Math.random() * vowel.length)]}ng\n${koko}`); + embed.setColor(color); + interaction.editReply({ embeds: [embed] }); + }, +}; \ No newline at end of file diff --git a/src/slashCommands/moderation/ban.js b/src/slashCommands/moderation/ban.js new file mode 100644 index 0000000..3a745bf --- /dev/null +++ b/src/slashCommands/moderation/ban.js @@ -0,0 +1,95 @@ +const { SlashCommandBuilder } = require("@discordjs/builders"); +const { MessageEmbed } = require("discord.js"); +const ms = require("ms"); +const Logging = require("../../database/schemas/logging.js"); + +module.exports = { + data: new SlashCommandBuilder() + .setName("ban") + .setDescription("Ban a person in the server!") + .addUserOption((option) => option.setName("member").setDescription("Person who you want to ban.").setRequired(true)) + .addStringOption((option) => option.setName("reason").setDescription("The reason of the ban")), + async execute(interaction) { + const client = interaction.client; + const logging = await Logging.findOne({ + guildId: interaction.guild.id, + }); + if(!interaction.member.permissions.has("MODERATE_MEMBERS")) return interaction.followUp({ content: "You do not have permission to use this command." }); + + const member = interaction.options.getMember("member") + const reason = interaction.options.getString("reason") || "No reason provided" + + if(!member) { + let usernotfound = new MessageEmbed() + .setColor("RED") + .setDescription(`${client.emoji.fail} | I can't find that member`) + return interaction.reply({ embeds: [usernotfound] }) + .then(async () => { + if (logging && logging.moderation.delete_reply === "true") { + setTimeout(() => { + interaction.deleteReply().catch(() => {}); + }, 5000); + } + }) + .catch(() => {}); + } + + if(member.roles.highest.position >= interaction.member.roles.highest.position) { + let rolesmatch = new MessageEmbed() + .setColor("RED") + .setDescription(`${client.emoji.fail} | They have more power than you or have equal power as you do!`) + return interaction.reply({ embeds: [rolesmatch] }) + .then(async () => { + if (logging && logging.moderation.delete_reply === "true") { + setTimeout(() => { + interaction.deleteReply().catch(() => {}); + }, 5000) + } + }) + .catch(() => {}); + } + if(member === interaction.author) { + let banerror = new MessageEmbed() + .setColor("RED") + .setDescription(`${client.emoji.fail} | You can't ban yourself!`) + return interaction.reply({ embeds: [banerror] }) + .then(async () => { + if (logging && logging.moderation.delete_reply === "true") { + setTimeout(() => { + interaction.deleteReply().catch(() => {}) + }, 5000) + } + }) + .catch(() => {}) + } + + if(member) { + const response = await member.ban({ reason }) + let bansuccess = new MessageEmbed() + .setColor("GREEN") + .setDescription(`${client.emoji.success} | ${member} has been banned. __**Reason:**__ ${reason || "No reason Provided"}`) + return interaction.reply({ embeds: [bansuccess] }) + .then(async () => { + if (logging && logging.moderation.delete_reply === "true") { + setTimeout(() => { + interaction.deleteReply().catch(() => {}) + }, 5000) + } + }) + .catch(() => {}) + } + if(member) { + let dmEmbed = new MessageEmbed() + .setColor("RED") + .setDescription(`You have been banned in **${interaction.guild.name}**.\n\n__**Moderator:**__ ${interaction.author} **(${interaction.author.tag})**\n__**Reason:**__ ${reason || "No Reason Provided"}`) + .setTimestamp() + member.send({ embeds: [dmEmbed] }) + } else { + let failembed = new MessageEmbed() + .setColor(client.color.red) + .setDescription(`${client.emoji.fail} | I cannot ban that member. Make sure my role is above their role or that I have sufficient perms to execute the command.`) + .setTimestamp() + return interaction.reply({ embeds: [failembed] }) + } + }, +}; \ No newline at end of file diff --git a/src/slashCommands/moderation/kick.js b/src/slashCommands/moderation/kick.js new file mode 100644 index 0000000..b1a02fd --- /dev/null +++ b/src/slashCommands/moderation/kick.js @@ -0,0 +1,95 @@ +const { SlashCommandBuilder } = require("@discordjs/builders"); +const { MessageEmbed } = require("discord.js"); +const ms = require("ms"); +const Logging = require("../../database/schemas/logging.js"); + +module.exports = { + data: new SlashCommandBuilder() + .setName("kick") + .setDescription("Kick a person in the server!") + .addUserOption((option) => option.setName("member").setDescription("Person who you want to kick.").setRequired(true)) + .addStringOption((option) => option.setName("reason").setDescription("The reason of the kick")), + async execute(interaction) { + const client = interaction.client; + const logging = await Logging.findOne({ + guildId: interaction.guild.id, + }); + if(!interaction.member.permissions.has("MODERATE_MEMBERS")) return interaction.followUp({ content: "You do not have permission to use this command." }); + + const member = interaction.options.getMember("member") + const reason = interaction.options.getString("reason") || "No reason provided" + + if(!member) { + let usernotfound = new MessageEmbed() + .setColor("RED") + .setDescription(`${client.emoji.fail} | I can't find that member`) + return interaction.reply({ embeds: [usernotfound] }) + .then(async () => { + if (logging && logging.moderation.delete_reply === "true") { + setTimeout(() => { + interaction.deleteReply().catch(() => {}); + }, 5000); + } + }) + .catch(() => {}); + } + + if(member.roles.highest.position >= interaction.member.roles.highest.position) { + let rolesmatch = new MessageEmbed() + .setColor("RED") + .setDescription(`${client.emoji.fail} | They have more power than you or have equal power as you do!`) + return interaction.reply({ embeds: [rolesmatch] }) + .then(async () => { + if (logging && logging.moderation.delete_reply === "true") { + setTimeout(() => { + interaction.deleteReply().catch(() => {}); + }, 5000) + } + }) + .catch(() => {}); + } + if(member === interaction.author) { + let kickerror = new MessageEmbed() + .setColor("RED") + .setDescription(`${client.emoji.fail} | You can't kick yourself!`) + return interaction.reply({ embeds: [kickerror] }) + .then(async () => { + if (logging && logging.moderation.delete_reply === "true") { + setTimeout(() => { + interaction.deleteReply().catch(() => {}) + }, 5000) + } + }) + .catch(() => {}) + } + + if(member) { + const response = await member.kick({ reason }) + let kicksuccess = new MessageEmbed() + .setColor("GREEN") + .setDescription(`${client.emoji.success} | ${member} has been kicked. __**Reason:**__ ${reason || "No reason Provided"}`) + return interaction.reply({ embeds: [kicksuccess] }) + .then(async () => { + if (logging && logging.moderation.delete_reply === "true") { + setTimeout(() => { + interaction.deleteReply().catch(() => {}) + }, 5000) + } + }) + .catch(() => {}) + } + if(member) { + let dmEmbed = new MessageEmbed() + .setColor("RED") + .setDescription(`You have been kicked in **${interaction.guild.name}**.\n\n__**Moderator:**__ ${interaction.author} **(${interaction.author.tag})**\n__**Reason:**__ ${reason || "No Reason Provided"}`) + .setTimestamp() + member.send({ embeds: [dmEmbed] }) + } else { + let failembed = new MessageEmbed() + .setColor(client.color.red) + .setDescription(`${client.emoji.fail} | I cannot kick that member. Make sure my role is above their role or that I have sufficient perms to execute the command.`) + .setTimestamp() + return interaction.reply({ embeds: [failembed] }) + } + }, +}; \ No newline at end of file diff --git a/src/slashCommands/moderation/mute.js b/src/slashCommands/moderation/mute.js new file mode 100644 index 0000000..4b80f24 --- /dev/null +++ b/src/slashCommands/moderation/mute.js @@ -0,0 +1,97 @@ +const { SlashCommandBuilder } = require("@discordjs/builders"); +const { MessageEmbed } = require("discord.js"); +const ms = require("ms"); +const Logging = require("../../database/schemas/logging"); + +module.exports = { + data: new SlashCommandBuilder() + .setName("mute") + .setDescription("Mute a person in the server!") + .addUserOption((option) => option.setName("member").setDescription("Person who you want to put in timeout.").setRequired(true)) + .addStringOption((option) => option.setName("time").setDescription("For how much time you want to timeout for").setRequired(true)) + .addStringOption((option) => option.setName("reason").setDescription("The reason of the timeout")), + async execute(interaction) { + const client = interaction.client + const logging = await Logging.findOne({ + guildId: interaction.guild.id + }); + if(!interaction.member.permissions.has("MODERATE_MEMBERS")) return interaction.followUp({ content: "You do not have permission to use this command." }); + + const member = interaction.options.getMember("member") + const reason = interaction.options.getString("reason") || "No reason provided" + const time = ms(interaction.options.getString("time")) + + if(!member) { + let usernotfound = new MessageEmbed() + .setColor("RED") + .setDescription(`${client.emoji.fail} | I can't find that member`) + return interaction.reply({ embeds: [usernotfound] }) + .then(async () => { + if (logging && logging.moderation.delete_reply === "true") { + setTimeout(() => { + interaction.deleteReply().catch(() => {}); + }, 5000); + } + }) + .catch(() => {}); + } + + if(member.roles.highest.position >= interaction.member.roles.highest.position) { + let rolesmatch = new MessageEmbed() + .setColor("RED") + .setDescription(`${client.emoji.fail} | They have more power than you or have equal power as you do!`) + return interaction.reply({ embeds: [rolesmatch] }) + .then(async () => { + if (logging && logging.moderation.delete_reply === "true") { + setTimeout(() => { + interaction.deleteReply().catch(() => {}); + }, 5000); + } + }) + .catch(() => {}); + } + + if(!time) { + let timevalid = new MessageEmbed() + .setColor("RED") + .setDescription(`${client.emoji.fail} | The time specified is not valid. It is necessary that you provide valid time.`) + + return interaction.reply({ embeds: [timevalid] }) + .then(async () => { + if (logging && logging.moderation.delete_reply === "true") { + setTimeout(() => { + interaction.deleteReply().catch(() => {}); + }, 5000); + } + }); + } + if(member) { + const response = await member.timeout(time, reason) + let timeoutsuccess = new MessageEmbed() + .setColor("GREEN") + .setDescription(`${client.emoji.success} | ${member} has been timed out for ${ms(time, { long: true })}`) + return interaction.reply({ embeds: [timeoutsuccess] }) + .then(async () => { + if (logging && logging.moderation.delete_reply === "true") { + setTimeout(() => { + interaction.deleteReply().catch(() => {}); + }, 5000); + } + }) + .catch(() => {}); + } + if(member) { + let dmEmbed = new MessageEmbed() + .setColor("RED") + .setDescription(`You have been muted in **${interaction.guild.name}**.\n\n__**Moderator:**__ ${interaction.author} **(${interaction.author.tag})**\n__**Reason:**__ ${reason || "No Reason Provided"}`) + .setTimestamp() + member.send({ embeds: [dmEmbed] }) + } else { + let failembed = new MessageEmbed() + .setColor(client.color.red) + .setDescription(`${client.emoji.fail} | I cannot time out that member. Make sure that my role is above their role or that I have sufficient perms to execute the command.`) + .setTimestamp() + return interaction.reply({ embeds: [failembed] }) + } + }, +}; \ No newline at end of file diff --git a/src/slashCommands/moderation/unban.js b/src/slashCommands/moderation/unban.js new file mode 100644 index 0000000..5517e97 --- /dev/null +++ b/src/slashCommands/moderation/unban.js @@ -0,0 +1,47 @@ +const { SlashCommandBuilder } = require("@discordjs/builders"); +const { MessageEmbed } = require("discord.js"); +const ms = require("ms"); +const Logging = require("../../database/schemas/logging"); +const { execute } = require("./kick"); + +module.exports = { + data: new SlashCommandBuilder() + .setName("unban") + .setDescription("Unban a person in the server!") + .addStringOption((option) => option.setName("member").setDescription("Person who you want to unban").setRequired(true)) + .addStringOption((option) => option.setName("reason").setDescription("The reason for the unban")), + async execute(interaction) { + const client = interaction.client + const logging = Logging.findOne({ + guildId: interaction.guild.id + }); + if(!interaction.member.permissions.has("MODERATE_MEMBERS")) return interaction.followUp({ content: "You do not have permission to use this command." }); + + const user = interaction.options.getString("member") + const reason = interaction.options.getString("reason") || "No reason provided" + + const totalbans = await interaction.guild.bans.fetch() + + const userToUnabn = totalbans.find(x => x.user.id || x.user.username || x.user.tag) + + await interaction.guild.bans.remove(userToUnabn.user.id).then(() => { + let unbansuccess = new MessageEmbed() + .setColor("GREEN") + .setDescription(`${client.emoji.success} | ${user} has been unbanned. __**Reason:**__ ${reason}`) + return interaction.reply({ embeds: [unbansuccess] }) + .then(async () => { + if (logging && logging.moderation.delete_reply === "true") { + setTimeout(() => { + interaction.deleteReply().catch(() => {}) + }, 5000); + } + }) + .catch(() => {}).then(() => { + let dmEmbed = new MessageEmbed() + .setColor("GREEN") + .setDescription(`You have unbanned in **${interaction.guild.name}**.\n\n__**Moderator:**__ ${interaction.author} **(${interaction.author.tag})**\n__**Reason:**__ ${reason}`) + user.send({ embeds: [dmEmbed] }); + }) + }) + }, +}; \ No newline at end of file diff --git a/src/slashCommands/moderation/unmute.js b/src/slashCommands/moderation/unmute.js new file mode 100644 index 0000000..c67b837 --- /dev/null +++ b/src/slashCommands/moderation/unmute.js @@ -0,0 +1,81 @@ +const { SlashCommandBuilder } = require("@discordjs/builders"); +const { MessageEmbed } = require("discord.js"); +const ms = require("ms"); +const Logging = require("../../database/schemas/logging"); + +module.exports = { + data: new SlashCommandBuilder() + .setName("unmute") + .setDescription("Unmute a person in the server!") + .addUserOption((option) => option.setName("member").setDescription("Person who you want to put in timeout.").setRequired(true)) + .addStringOption((option) => option.setName("reason").setDescription("The reason of the timeout")), + async execute(interaction) { + const client = interaction.client + const logging = await Logging.findOne({ + guildId: interaction.guild.id + }); + if(!interaction.member.permissions.has("MODERATE_MEMBERS")) return interaction.followUp({ content: "You do not have permission to use this command." }); + + const member = interaction.options.getMember("member") + const reason = interaction.options.getString("reason") || "No reason provided" + + if(!member) { + let usernotfound = new MessageEmbed() + .setColor("RED") + .setDescription(`${client.emoji.fail} | I can't find that member`) + return interaction.reply({ embeds: [usernotfound] }) + .then(async () => { + if (logging && logging.moderation.delete_reply === "true") { + setTimeout(() => { + interaction.deleteReply().catch(() => {}); + }, 5000); + } + }) + .catch(() => {}); + } + + if(member.roles.highest.position >= interaction.member.roles.highest.position) { + let rolesmatch = new MessageEmbed() + .setColor("RED") + .setDescription(`${client.emoji.fail} | They have more power than you or have equal power as you do!`) + return interaction.reply({ embeds: [rolesmatch] }) + .then(async () => { + if (logging && logging.moderation.delete_reply === "true") { + setTimeout(() => { + interaction.deleteReply().catch(() => {}); + }, 5000); + } + }) + .catch(() => {}); + } + + if(member) { + const response = await member.timeout(0 * 60 * 1000, reason) + let timeoutsuccess = new MessageEmbed() + .setColor("GREEN") + .setDescription(`${client.emoji.success} | ${member} has been unmuted.`) + return interaction.reply({ embeds: [timeoutsuccess] }) + .then(async () => { + if (logging && logging.moderation.delete_reply === "true") { + setTimeout(() => { + interaction.deleteReply().catch(() => {}); + }, 5000); + } + }) + .catch(() => {}); + } + if(member) { + let dmEmbed = new MessageEmbed() + .setColor("RED") + .setDescription(`You have been unmuted in **${interaction.guild.name}**.\n\n__**Moderator:**__ ${interaction.author} **(${interaction.author.tag})**\n__**Reason:**__ ${reason || "No Reason Provided"}`) + .setTimestamp() + member.send({ embeds: [dmEmbed] }) + } else { + let failembed = new MessageEmbed() + .setColor(client.color.red) + .setDescription(`${client.emoji.fail} | I cannot unmute that member. Make sure that my role is above their role or that I have sufficient perms to execute the command, OR they aren't muted.`) + .setTimestamp() + return interaction.reply({ embeds: [failembed] }) + } + }, +}; \ No newline at end of file From 2b8bede5e4d1982c8ec645ecedb4fc398420c9ab Mon Sep 17 00:00:00 2001 From: Boeing 737 <101909226+Boeing-737-800@users.noreply.github.com> Date: Fri, 18 Nov 2022 12:14:55 -0700 Subject: [PATCH 09/70] Delete mute.js This is an old file. the files were moved to folders --- src/slashCommands/mute.js | 97 --------------------------------------- 1 file changed, 97 deletions(-) delete mode 100644 src/slashCommands/mute.js diff --git a/src/slashCommands/mute.js b/src/slashCommands/mute.js deleted file mode 100644 index 8cf355e..0000000 --- a/src/slashCommands/mute.js +++ /dev/null @@ -1,97 +0,0 @@ -const { SlashCommandBuilder } = require("@discordjs/builders"); -const { MessageEmbed } = require("discord.js"); -const ms = require("ms"); -const Logging = require("../database/schemas/logging"); - -module.exports = { - data: new SlashCommandBuilder() - .setName("mute") - .setDescription("Mute a person in the server!") - .addUserOption((option) => option.setName("member").setDescription("Person who you want to put in timeout.").setRequired(true)) - .addStringOption((option) => option.setName("time").setDescription("For how much time you want to timeout for").setRequired(true)) - .addStringOption((option) => option.setName("reason").setDescription("The reason of the timeout")), - async execute(interaction) { - const client = interaction.client - const logging = await Logging.findOne({ - guildId: interaction.guild.id - }); - if(!interaction.member.permissions.has("MODERATE_MEMBERS")) return interaction.followUp({ content: "You do not have permission to use this command." }); - - const member = interaction.options.getMember("member") - const reason = interaction.options.getString("reason") || "No reason provided" - const time = ms(interaction.options.getString("time")) - - if(!member) { - let usernotfound = new MessageEmbed() - .setColor("RED") - .setDescription(`${client.emoji.fail} | I can't find that member`) - return interaction.reply({ embeds: [usernotfound] }) - .then(async () => { - if (logging && logging.moderation.delete_reply === "true") { - setTimeout(() => { - interaction.deleteReply().catch(() => {}); - }, 5000); - } - }) - .catch(() => {}); - } - - if(member.roles.highest.position >= interaction.member.roles.highest.position) { - let rolesmatch = new MessageEmbed() - .setColor("RED") - .setDescription(`${client.emoji.fail} | They have more power than you or have equal power as you do!`) - return interaction.reply({ embeds: [rolesmatch] }) - .then(async () => { - if (logging && logging.moderation.delete_reply === "true") { - setTimeout(() => { - interaction.deleteReply().catch(() => {}); - }, 5000); - } - }) - .catch(() => {}); - } - - if(!time) { - let timevalid = new MessageEmbed() - .setColor("RED") - .setDescription(`${client.emoji.fail} | The time specified is not valid. It is necessary that you provide valid time.`) - - return interaction.reply({ embeds: [timevalid] }) - .then(async () => { - if (logging && logging.moderation.delete_reply === "true") { - setTimeout(() => { - interaction.deleteReply().catch(() => {}); - }, 5000); - } - }); - } - if(member) { - const response = await member.timeout(time, reason) - let timeoutsuccess = new MessageEmbed() - .setColor("GREEN") - .setDescription(`${client.emoji.success} | ${member} has been timed out for ${ms(time, { long: true })}`) - return interaction.reply({ embeds: [timeoutsuccess] }) - .then(async () => { - if (logging && logging.moderation.delete_reply === "true") { - setTimeout(() => { - interaction.deleteReply().catch(() => {}); - }, 5000); - } - }) - .catch(() => {}); - } - if(member) { - let dmEmbed = new MessageEmbed() - .setColor("RED") - .setDescription(`You have been muted in **${interaction.guild.name}**.\n\n__**Moderator:**__ ${interaction.author} **(${interaction.author.tag})**\n__**Reason:**__ ${reason || "No Reason Provided"}`) - .setTimestamp() - member.send({ embeds: [dmEmbed] }) - } else { - let failembed = new MessageEmbed() - .setColor(client.color.red) - .setDescription(`${client.emoji.fail} | I cannot time out that member. Make sure that my role is above their role or that I have sufficient perms to execute the command.`) - .setTimestamp() - return interaction.reply({ embeds: [failembed] }) - } - }, -}; \ No newline at end of file From 0817ab92fe1fcf63807f6274dffa643d93c88fc8 Mon Sep 17 00:00:00 2001 From: Boeing 737 <101909226+Boeing-737-800@users.noreply.github.com> Date: Fri, 18 Nov 2022 12:17:00 -0700 Subject: [PATCH 10/70] Delete unmute.js --- src/slashCommands/unmute.js | 81 ------------------------------------- 1 file changed, 81 deletions(-) delete mode 100644 src/slashCommands/unmute.js diff --git a/src/slashCommands/unmute.js b/src/slashCommands/unmute.js deleted file mode 100644 index 421b1ec..0000000 --- a/src/slashCommands/unmute.js +++ /dev/null @@ -1,81 +0,0 @@ -const { SlashCommandBuilder } = require("@discordjs/builders"); -const { MessageEmbed } = require("discord.js"); -const ms = require("ms"); -const Logging = require("../database/schemas/logging"); - -module.exports = { - data: new SlashCommandBuilder() - .setName("unmute") - .setDescription("Unmute a person in the server!") - .addUserOption((option) => option.setName("member").setDescription("Person who you want to put in timeout.").setRequired(true)) - .addStringOption((option) => option.setName("reason").setDescription("The reason of the timeout")), - async execute(interaction) { - const client = interaction.client - const logging = await Logging.findOne({ - guildId: interaction.guild.id - }); - if(!interaction.member.permissions.has("MODERATE_MEMBERS")) return interaction.followUp({ content: "You do not have permission to use this command." }); - - const member = interaction.options.getMember("member") - const reason = interaction.options.getString("reason") || "No reason provided" - - if(!member) { - let usernotfound = new MessageEmbed() - .setColor("RED") - .setDescription(`${client.emoji.fail} | I can't find that member`) - return interaction.reply({ embeds: [usernotfound] }) - .then(async () => { - if (logging && logging.moderation.delete_reply === "true") { - setTimeout(() => { - interaction.deleteReply().catch(() => {}); - }, 5000); - } - }) - .catch(() => {}); - } - - if(member.roles.highest.position >= interaction.member.roles.highest.position) { - let rolesmatch = new MessageEmbed() - .setColor("RED") - .setDescription(`${client.emoji.fail} | They have more power than you or have equal power as you do!`) - return interaction.reply({ embeds: [rolesmatch] }) - .then(async () => { - if (logging && logging.moderation.delete_reply === "true") { - setTimeout(() => { - interaction.deleteReply().catch(() => {}); - }, 5000); - } - }) - .catch(() => {}); - } - - if(member) { - const response = await member.timeout(0 * 60 * 1000, reason) - let timeoutsuccess = new MessageEmbed() - .setColor("GREEN") - .setDescription(`${client.emoji.success} | ${member} has been unmuted.`) - return interaction.reply({ embeds: [timeoutsuccess] }) - .then(async () => { - if (logging && logging.moderation.delete_reply === "true") { - setTimeout(() => { - interaction.deleteReply().catch(() => {}); - }, 5000); - } - }) - .catch(() => {}); - } - if(member) { - let dmEmbed = new MessageEmbed() - .setColor("RED") - .setDescription(`You have been unmuted in **${interaction.guild.name}**.\n\n__**Moderator:**__ ${interaction.author} **(${interaction.author.tag})**\n__**Reason:**__ ${reason || "No Reason Provided"}`) - .setTimestamp() - member.send({ embeds: [dmEmbed] }) - } else { - let failembed = new MessageEmbed() - .setColor(client.color.red) - .setDescription(`${client.emoji.fail} | I cannot unmute that member. Make sure that my role is above their role or that I have sufficient perms to execute the command, OR they aren't muted.`) - .setTimestamp() - return interaction.reply({ embeds: [failembed] }) - } - }, -}; \ No newline at end of file From 27b3635a11f5509b54e6365c36e4bf1502bd8e5c Mon Sep 17 00:00:00 2001 From: Boeing 737 <101909226+Boeing-737-800@users.noreply.github.com> Date: Fri, 18 Nov 2022 12:21:56 -0700 Subject: [PATCH 11/70] New command for pogy --- src/commands/information/dashboard.js | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 src/commands/information/dashboard.js diff --git a/src/commands/information/dashboard.js b/src/commands/information/dashboard.js new file mode 100644 index 0000000..c670fe6 --- /dev/null +++ b/src/commands/information/dashboard.js @@ -0,0 +1,22 @@ +const Command = require("../../structures/Command"); +const { MessageEmbed } = require("discord.js"); + +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: "dashboard", + description: "Need a way to get the bot's dashboard link but don't know it? Use this to get it!", + category: "Information", + cooldown: 3, + }); + } + async run(message) { + const dashembed = new MessageEmbed() + .setTitle("Need the bot's dashboard link? Here you go!") + .setDescription("https://v2.pogy.xyz") + .setColor("RANDOM") + .setFooter({ text: `Requested by ${message.author.username}` }) + .setTimestamp(); + message.channel.sendCustom({ embeds: [dashembed] }); + } +} From efc8ec26b3126a833e3778dfa9d8bad7e14d6015 Mon Sep 17 00:00:00 2001 From: Boeing 737 <101909226+Boeing-737-800@users.noreply.github.com> Date: Fri, 18 Nov 2022 12:40:05 -0700 Subject: [PATCH 12/70] Why.. I am just going to say this rn, I can NOT download anything on my school computer rn as it's drive is being absolute fard rn --- src/slashCommands/moderation/modnick.js | 98 +++++++++++++++++++++++++ 1 file changed, 98 insertions(+) create mode 100644 src/slashCommands/moderation/modnick.js diff --git a/src/slashCommands/moderation/modnick.js b/src/slashCommands/moderation/modnick.js new file mode 100644 index 0000000..366d006 --- /dev/null +++ b/src/slashCommands/moderation/modnick.js @@ -0,0 +1,98 @@ +const { SlashCommandBuilder } = require("@discordjs/builders"); +const { MessageEmbed } = require("discord.js"); +const darkpassword = require("generate-password"); +const Logging = require("../../database/schemas/logging"); + +module.exports = { + data: new SlashCommandBuilder() + .setName("modnick") + .setDescription("Moderate a users nickname to make pinging possible") + .addUserOption((option) => option.setName("member").setDescription("The user to moderate their nickname").setRequired(true)) + .addStringOption((option) => option.setName("reason").setDescription("The reason for the nickname moderation")), + async execute(interaction) { + const client = interaction.client + const logging = await Logging.findOne({ guildId: interaction.guild.id }); + + const member = interaction.options.getMember("member") + const reason = interaction.options.getString("reason") || "No reason Provided"; + + const impostorpassword = Math.random().toString(36).substring(2, 5) + Math.random().toString(36).substring(2, 5) + + if(!interaction.member.permissions.has("MANAGE_NICKNAMES")) return interaction.followUp({ content: "You do not have permission to use this command." }); + + if(!member) { + let validmention = new MessageEmbed() + .setColor("RED") + .setDescription(`${client.emoji.fail} | Please mention a valid member!`) + return interaction.reply({ embeds: [validmention] }) + .then(async () => { + if (logging && logging.moderation.delete_reply === "true") { + setTimeout(() => { + interaction.deleteReply().catch(() => {}); + }, 5000) + } + }) + .catch(() => {}) + } + if(member === interaction.author) { + let modnickerror = new MessageEmbed() + .setColor("RED") + .setDescription(`${client.emoji.fail} | You can't moderate your own nickname!`) + return interaction.reply({ embeds: [modnickerror] }) + + .then(async () => { + if (logging && logging.moderation.delete_reply === "true") { + setTimeout(() => { + interaction.deleteReply().catch(() => {}) + }, 5000); + } + }) + .catch(() => {}); + } + + if(member.roles.highest.position >= interaction.member.roles.highest.position) { + let rolesmatch = new MessageEmbed() + .setColor("RED") + .setDescription(`${client.emoji.fail} | They have more power than you or have equal power as you do!`) + return interaction.reply({ embeds: [rolesmatch] }) + .then(async () => { + if (logging && logging.moderation.delete_reply === "true") { + setTimeout(() => { + interaction.deleteReply().catch(() => {}) + }, 5000); + } + }) + .catch(() => {}); + } + + if(member) { + const oldNickname = member.nickname || "None"; + await member.setNickname(`Moderated Nickname ${impostorpassword}`) + let embed = new MessageEmbed() + .setColor("BLURPLE") + .setDescription(`${client.emoji.success} | Moderated ${member}'s nickname for \`${reason}\``) + return interaction.reply({ embeds: [embed] }) + .then(async () => { + if (logging && logging.moderation.delete_reply === "true") { + setTimeout(() => { + interaction.deleteReply().catch(() => {}); + }, 5000); + } + }) + .catch(() => {}); + } + if(member) { + let dmEmbed = new MessageEmbed() + .setColor("RED") + .setDescription(`**Nickname Moderated**\nYour nickname was moderated in **${interaction.guild.name}**. If you would like to change your nickname to something else, please reach out to a staff member.\n**Possible Reasons**\n• Your name was not typeable on a standard English QWERTY keyboard.\n• Your name contained words that are not suitable for the server.\n• Your name was not mentionable.\n\n__**Moderator:**__ ${interaction.author} **(${interaction.author.tag})**\n__**Reason:**__ ${reason}`) + .setTimestamp() + member.send({ embeds: [dmEmbed] }) + } else { + let failembed = new MessageEmbed() + .setColor(client.color.red) + .setDescription(`${client.emoji.fail} | I can't moderate their nickname, make sure that my role is above their role or that I have sufficient permissions to run the command.`) + .setTimestamp() + return interaction.reply({ embeds: [failembed], ephemeral: true }) + } + } +}; From 749f04bb007b8a4a37fa009cf4b90b6519f923d5 Mon Sep 17 00:00:00 2001 From: Boeing 737 <101909226+Boeing-737-800@users.noreply.github.com> Date: Mon, 28 Nov 2022 10:12:11 -0700 Subject: [PATCH 13/70] Quick fix in warnings.js I'm just fixing some deprecation warnings on this command. Nothing major. --- src/commands/moderation/warnings.js | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/src/commands/moderation/warnings.js b/src/commands/moderation/warnings.js index 5de6d99..8c4f1f9 100644 --- a/src/commands/moderation/warnings.js +++ b/src/commands/moderation/warnings.js @@ -45,7 +45,10 @@ module.exports = class extends Command { return message.channel.sendCustom({ embeds: [ new discord.MessageEmbed() - .setAuthor(message.author.tag, message.author.avatarURL()) + .setAuthor({ + name: message.author.tag, + iconURL: message.author.displayAvatarURL({ dynamic: true }), + }) .setDescription( `${message.client.emoji.fail} | **${mentionedMember.user.tag}** ${language.warningsNoError}` ) @@ -70,10 +73,10 @@ module.exports = class extends Command { const count = warnDoc.warnings.length; const embed = new MessageEmbed() - .setAuthor( - mentionedMember.user.tag, - mentionedMember.user.displayAvatarURL({ dynamic: true }) - ) + .setAuthor({ + name: mentionedMember.user.tag, + iconURL: mentionedMember.user.displayAvatarURL({ dynamic: true }), + }) .setFooter({ text: message.member.displayName, iconURL: message.author.displayAvatarURL({ dynamic: true }), @@ -132,10 +135,10 @@ module.exports = class extends Command { else { let n = 0; const json = embed - .setFooter( - `${language.warnExpire}\n` + message.member.displayName, - message.author.displayAvatarURL({ dynamic: true }) - ) + .setFooter({ + text: `${language.warnExpire}\n` + message.member.displayName, + iconURL: message.author.displayAvatarURL({ dynamic: true }), + }) .toJSON(); const first = () => { From 5da539a85fb8f94a92cb57d82c94961f179d2688 Mon Sep 17 00:00:00 2001 From: Boeing 737 <101909226+Boeing-737-800@users.noreply.github.com> Date: Mon, 28 Nov 2022 10:52:55 -0700 Subject: [PATCH 14/70] Warn command converted to slash command Note: THIS particular command was troublesome to make it compatible with p!warns but this should work. --- src/slashCommands/moderation/warn.js | 149 +++++++++++++++++++++++++++ 1 file changed, 149 insertions(+) create mode 100644 src/slashCommands/moderation/warn.js diff --git a/src/slashCommands/moderation/warn.js b/src/slashCommands/moderation/warn.js new file mode 100644 index 0000000..70d2f17 --- /dev/null +++ b/src/slashCommands/moderation/warn.js @@ -0,0 +1,149 @@ +const { SlashCommandBuilder } = require("@discordjs/builders"); +const { MessageEmbed } = require("discord.js"); +const Guild = require("../../database/schemas/Guild.js"); +const warnModel = require("../../database/models/moderation.js"); +const discord = require("discord.js"); +const randoStrings = require("../../packages/randostrings.js"); +const random = new randoStrings(); +const Logging = require("../../database/schemas/logging"); + +module.exports = { + data: new SlashCommandBuilder() + .setName("warn") + .setDescription("Warn a user in a specific guild") + .addUserOption((option) => option.setName("member").setDescription("The member to warn").setRequired(true)) + .addStringOption((option) => option.setName("reason").setDescription("The reason for the warn")), + async execute(interaction) { + const client = interaction.client; + const logging = await Logging.findOne({ + guildId: interaction.guild.id + }); + const guildDB = await Guild.findOne({ + guildId: interaction.guild.id, + }); + let language = require(`../../data/language/${guildDB.language}.json`); + + const mentionedMember = interaction.options.getMember("member") + const reason = interaction.options.getString("reason") || "No Reason Provided" + + if(!mentionedMember) { + let validmention = new MessageEmbed() + .setColor(client.color.red) + .setDescription(`${client.emoji.fail} | ${language.warnMissingUser}`) + .setTimestamp() + return interaction.reply({ embeds: [validmention] }) + .then(async () => { + if (logging && logging.moderation.delete_reply === "true") { + setTimeout(() => { + interaction.deleteReply().catch(() => {}) + }, 5000) + } + }) + .catch(() => {}); + } + + if(mentionedMember.roles.highest.position >= interaction.member.roles.highest.position) { + let rolesmatch = new MessageEmbed() + .setColor(client.color.red) + .setDescription(`${client.emoji.fail} | ${language.warnHigherRole}`) + .setTimestamp() + return interaction.reply({ embeds: [rolesmatch] }) + .then(async () => { + if (logging && logging.moderation.delete_reply === "true") { + setTimeout(() => { + interaction.deleteReply().catch(() => {}) + }, 5000) + } + }) + .catch(() => {}) + } + let warnID = random.password({ + length: 18, + string: "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890", + }); + + let warnDoc = await warnModel + .findOne({ + guildID: interaction.guild.id, + memberID: mentionedMember.id, + }) + .catch((err) => console.log(err)); + + if (!warnDoc) { + warnDoc = new warnModel({ + guildID: interaction.guild.id, + memberID: mentionedMember.id, + modAction: [], + warnings: [], + warningsID: [], + moderator: [], + date: [], + }); + + await warnDoc.save().catch((err) => console.log(err)); + + warnDoc = await warnModel.findOne({ + guildID: interaction.guild.id, + memberID: mentionedMember.id, + }); + } + warnDoc.modType.push("warn"); + warnDoc.warnings.push(reason); + warnDoc.warningID.push(warnID); + warnDoc.moderator.push(interaction.user.id); + warnDoc.date.push(Date.now()); + + await warnDoc.save().catch((err) => console.log(err)); + let dmEmbed; + if ( + logging && + logging.moderation.warn_action && logging.moderation.waran_action !== "1" + ) { + if (logging.moderation.warn_action === "2") { + dmEmbed = `${interaction.client.emoji.fail} | You've been warned in **${interaction.guild.name}**`; + } else if (logging.moderation.warn_action === "3") { + dmEmbed = `${interaction.client.emoji.fail} | You've been warned in **${interaction.guild.name}**\n\n__**Reason:**__ ${reason}`; + } else if (logging.moderation.warn_action === "4") { + dmEmbed = `${interaction.client.emoji.fail} | You've been warned in **${interaction.guild.name}**.\n\n__**Moderator:**__ ${interaction.author} **(${interaction.author.tag})**\n__**Reason:**__ ${reason}`; + } + + mentionedMember.send({ embeds: [ + new MessageEmbed() + .setColor(interaction.client.color.red) + .setDescription(dmEmbed), + ], + }) + .catch(() => {}); + } + + if(mentionedMember) { + interaction.reply({ + embeds: [ + new MessageEmbed().setColor(client.color.green) + .setDescription(`${language.warnSuccessful + .replace("{emoji}", client.emoji.success) + .replace("{user}", `**${mentionedMember.user.tag}**`)} + ${ + logging && logging.moderation.include_reason === "true" + ? `\n\n**Reason:** ${reason}` + : `` + }`), + ], + }) + .then(async () => { + if (logging && logging.moderation.deleteReply === "true") { + setTimeout(() => { + interaction.deleteReply().catch(() => {}); + }, 5000) + } + }) + .catch(() => {}); + } else { + let failembed = new MessageEmbed() + .setColor(client.color.red) + .setDescription(`${client.emoji.fail} | I can't warn that member. Make sure that my role is above their role or that I have sufficient permissions to execute the command.`) + .setTimestamp() + return interaction.reply({ embeds: [failembed] }) + } + }, +}; From e0f241841761894494adf89f5fdd844223ccf73f Mon Sep 17 00:00:00 2001 From: Boeing 737 <101909226+Boeing-737-800@users.noreply.github.com> Date: Mon, 28 Nov 2022 10:58:24 -0700 Subject: [PATCH 15/70] Another command Sorry about this! It seems that I forgot to add this command while I was committing more XD --- src/slashCommands/information/dashboard.js | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 src/slashCommands/information/dashboard.js diff --git a/src/slashCommands/information/dashboard.js b/src/slashCommands/information/dashboard.js new file mode 100644 index 0000000..a6bed74 --- /dev/null +++ b/src/slashCommands/information/dashboard.js @@ -0,0 +1,17 @@ +const { SlashCommandBuilder } = require("@discordjs/builders"); +const { MessageEmbed } = require("discord.js"); + +module.exports = { + data: new SlashCommandBuilder() + .setName("dashboard") + .setDescription("Need help getting to the dashboard of Pogy? Use this command!"), + async execute(interaction) { + const dashembed = new MessageEmbed() + .setTitle("Need Pogy's dashboard link?") + .setDescription("Click [here](https://v2.pogy.xyz) to see Pogy's dashboard") + .setColor("RANDOM") + .setFooter({ text: `Requested by ${interaction.author}` }) + .setTimestamp(); + interaction.reply({ embeds: [dashembed], ephemeral: true }); + } +} From 06241002432bdd1d6ed75bd4e06544f69a5ffbee Mon Sep 17 00:00:00 2001 From: eYuM <101909226+eYuM-coder@users.noreply.github.com> Date: Wed, 15 Feb 2023 11:00:56 -0700 Subject: [PATCH 16/70] New category :D It's that time again... I went ahead with my way and used my time to make the economy category/plugin once again! Credits to [Monochromish](https://github.com/Monochromish) and this repository [Kalopsia-Bot](https://github.com/Monochromis/Kalopsia-Bot) for the base of the commands and [chxlls](https://github.com/chxlls) and his repository called [economybot](https://github.com/chxlls/economybot) for some of the other files. --- src/commands/economy/addmoney.js | 45 ++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 src/commands/economy/addmoney.js diff --git a/src/commands/economy/addmoney.js b/src/commands/economy/addmoney.js new file mode 100644 index 0000000..881514e --- /dev/null +++ b/src/commands/economy/addmoney.js @@ -0,0 +1,45 @@ +const Command = require("../../structures/Command"); +const { MessageEmbed } = require("discord.js"); +const Profile = require("../../database/models/economy/profile.js"); +const { createProfile } = require("../../utils/utils.js"); + +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: "addmoney", + aliases: ["add"], + description: "Add money to a users wallet!", + category: "Economy", + usage: " ", + examples: ["addmoney @Peter 400"], + cooldown: 3, + }) + } + async run(message, args) { + const user = message.mentions.members.first(); + const amount = args.slice(1).join(""); + const profile = await Profile.findOne({ userID: user.id, guildId: message.guild.id }); + if (!profile) { + await createProfile(user, message.guild); + await message.channel.sendCustom({ + embeds: [ + new MessageEmbed() + .setColor("BLURPLE") + .setDescription(`Creating profile.\nUse this command again to use it.`) + ] + }); + } else { + await Profile.updateOne({ + userID: message.author.id, guildId: message.guild.id + }, + { $inc: { wallet: amount} }); + await message.channel.sendCustom({ + embeds: [ + new MessageEmbed() + .setColor("BLURPLE") + .setDescription(`Added $${amount} to ${user}`) + ] + }); + } + } +}; From 98b246d7436ef289e1a1d1a019b4c1317559d7f7 Mon Sep 17 00:00:00 2001 From: eYuM <101909226+eYuM-coder@users.noreply.github.com> Date: Wed, 15 Feb 2023 11:01:37 -0700 Subject: [PATCH 17/70] Create balance.js --- src/commands/economy/balance.js | 47 +++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 src/commands/economy/balance.js diff --git a/src/commands/economy/balance.js b/src/commands/economy/balance.js new file mode 100644 index 0000000..ae8eb78 --- /dev/null +++ b/src/commands/economy/balance.js @@ -0,0 +1,47 @@ +const Command = require("../../structures/Command"); +const { MessageEmbed } = require("discord.js"); +const Profile = require("../../database/models/economy/profile.js"); +const { createProfile } = require("../../utils/utils.js"); + +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: "balance", + aliases: ["bal"], + description: "Check a user's balance", + category: "Economy", + usage: "[user]", + examples: ["balance", "balance @Peter"], + cooldown: 3, + }) + } + async run(message, args) { + const user = message.mentions.members.first() || message.author; + + const profile = await Profile.findOne({ + userID: user.id, + guildId: message.guild.id + }); + if (!profile) { + if(user.id !== message.author.id) return message.channel.sendCustom(`${user} doesn't have a profile!`); + + await createProfile(user, message.guild); + await message.channel.sendCustom({ + embeds: [ + new MessageEmbed() + .setColor("BLURPLE") + .setDescription(`Creating profile.\nUse this command again to check your balance.`) + ] + }); + } else { + await message.channel.sendCustom({ + embeds: [ + new MessageEmbed() + .setColor("BLURPLE") + .setTitle(`${user.username}'s Balance`) + .setDescription(`**Wallet:** $${profile.wallet}\n**Bank:** $${profile.bank}`) + ] + }); + } + } +}; From 7c1ff756c0f4861c4b8677caf8b2efb396a09eaa Mon Sep 17 00:00:00 2001 From: eYuM <101909226+eYuM-coder@users.noreply.github.com> Date: Wed, 15 Feb 2023 11:02:12 -0700 Subject: [PATCH 18/70] Create beg.js --- src/commands/economy/beg.js | 75 +++++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 src/commands/economy/beg.js diff --git a/src/commands/economy/beg.js b/src/commands/economy/beg.js new file mode 100644 index 0000000..0c8af28 --- /dev/null +++ b/src/commands/economy/beg.js @@ -0,0 +1,75 @@ +const Command = require("../../structures/Command"); +const { MessageEmbed } = require("discord.js"); +const Profile = require("../../database/models/economy/profile.js"); +const { createProfile } = require("../../utils/utils"); + +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: "beg", + description: "Beg for money", + category: "Economy", + cooldown: 3, + }) + } + async run(message) { + const amount = Math.floor(Math.random() * 2000); + const profile = await Profile.findOne({ userID: message.author.id, guildId: message.guild.id }); + if (!profile) { + await createProfile(message.author, message.guild); + await message.channel.sendCustom({ + embeds: [ + new MessageEmbed() + .setColor("BLURPLE") + .setDescription(`Creating profile.\nUse this command again to beg for money.`) + ] + }); + } else { + if (!profile.lastBeg) { + await Profile.updateOne( + { + userID: message.author.id, + guildId: message.guild.id + }, + { $set: { lastBeg: Date.now() } } + ); + await Profile.updateOne({ userID: message.author.id, guildId: message.guild.id }) + await message.channel.sendCustomn({ + embeds: [ + new MessageEmbed() + .setColor("BLURPLE") + .setTitle(`${message.author.username}'s Beg`) + .setDescription(`You have begged ($${amount}).\nCome back in 3 minutes to beg again.`) + ] + }); + } else if (Date.now() - profile.lastBeg > 180000) { + await Profile.updateOne( + { userID: message.author.id, guildId: message.guild.id }, + { $set: { lastBeg: Date.now() } } + ); + await Profile.updateOne({ userID: message.author.id, guildId: message.guild.id }, { $inc: { wallet: amount } }); + await message.channel.sendCustom({ + embeds: [ + new MessageEmbed() + .setColor("BLURPLE") + .setTitle(`${message.author.username}'s Beg`) + .setDescription(`You begged for a total of $${amount}.`) + ] + }); + } else { + const lastBeg = new Date(profile.lastBeg); + const timeLeft = Math.round((lastBeg.getTime() + 180000 - Date.now()) / 1000); + const minutes = Math.floor(timeLeft / 60); + const seconds = timeLeft - minutes * 60; + await message.channel.sendCustom({ + embeds: [ + new MessageEmbed() + .setColor("BLURPLE") + .setTitle(`${message.author.username}'s Beg`) + .setDescription(`You have to wait ${minutes}m ${seconds}s before you can beg again!`) + ] + }); + } + } + } +}; From f6fa81b6da2199c3e2ef95110d03a6f59b9b67b8 Mon Sep 17 00:00:00 2001 From: eYuM <101909226+eYuM-coder@users.noreply.github.com> Date: Wed, 15 Feb 2023 11:04:01 -0700 Subject: [PATCH 19/70] Deleted this. The reason why this was deleted, is because I'm going to upload the category instead of creating every single file. --- src/commands/economy/addmoney.js | 45 ------------------- src/commands/economy/balance.js | 47 -------------------- src/commands/economy/beg.js | 75 -------------------------------- 3 files changed, 167 deletions(-) delete mode 100644 src/commands/economy/addmoney.js delete mode 100644 src/commands/economy/balance.js delete mode 100644 src/commands/economy/beg.js diff --git a/src/commands/economy/addmoney.js b/src/commands/economy/addmoney.js deleted file mode 100644 index 881514e..0000000 --- a/src/commands/economy/addmoney.js +++ /dev/null @@ -1,45 +0,0 @@ -const Command = require("../../structures/Command"); -const { MessageEmbed } = require("discord.js"); -const Profile = require("../../database/models/economy/profile.js"); -const { createProfile } = require("../../utils/utils.js"); - -module.exports = class extends Command { - constructor(...args) { - super(...args, { - name: "addmoney", - aliases: ["add"], - description: "Add money to a users wallet!", - category: "Economy", - usage: " ", - examples: ["addmoney @Peter 400"], - cooldown: 3, - }) - } - async run(message, args) { - const user = message.mentions.members.first(); - const amount = args.slice(1).join(""); - const profile = await Profile.findOne({ userID: user.id, guildId: message.guild.id }); - if (!profile) { - await createProfile(user, message.guild); - await message.channel.sendCustom({ - embeds: [ - new MessageEmbed() - .setColor("BLURPLE") - .setDescription(`Creating profile.\nUse this command again to use it.`) - ] - }); - } else { - await Profile.updateOne({ - userID: message.author.id, guildId: message.guild.id - }, - { $inc: { wallet: amount} }); - await message.channel.sendCustom({ - embeds: [ - new MessageEmbed() - .setColor("BLURPLE") - .setDescription(`Added $${amount} to ${user}`) - ] - }); - } - } -}; diff --git a/src/commands/economy/balance.js b/src/commands/economy/balance.js deleted file mode 100644 index ae8eb78..0000000 --- a/src/commands/economy/balance.js +++ /dev/null @@ -1,47 +0,0 @@ -const Command = require("../../structures/Command"); -const { MessageEmbed } = require("discord.js"); -const Profile = require("../../database/models/economy/profile.js"); -const { createProfile } = require("../../utils/utils.js"); - -module.exports = class extends Command { - constructor(...args) { - super(...args, { - name: "balance", - aliases: ["bal"], - description: "Check a user's balance", - category: "Economy", - usage: "[user]", - examples: ["balance", "balance @Peter"], - cooldown: 3, - }) - } - async run(message, args) { - const user = message.mentions.members.first() || message.author; - - const profile = await Profile.findOne({ - userID: user.id, - guildId: message.guild.id - }); - if (!profile) { - if(user.id !== message.author.id) return message.channel.sendCustom(`${user} doesn't have a profile!`); - - await createProfile(user, message.guild); - await message.channel.sendCustom({ - embeds: [ - new MessageEmbed() - .setColor("BLURPLE") - .setDescription(`Creating profile.\nUse this command again to check your balance.`) - ] - }); - } else { - await message.channel.sendCustom({ - embeds: [ - new MessageEmbed() - .setColor("BLURPLE") - .setTitle(`${user.username}'s Balance`) - .setDescription(`**Wallet:** $${profile.wallet}\n**Bank:** $${profile.bank}`) - ] - }); - } - } -}; diff --git a/src/commands/economy/beg.js b/src/commands/economy/beg.js deleted file mode 100644 index 0c8af28..0000000 --- a/src/commands/economy/beg.js +++ /dev/null @@ -1,75 +0,0 @@ -const Command = require("../../structures/Command"); -const { MessageEmbed } = require("discord.js"); -const Profile = require("../../database/models/economy/profile.js"); -const { createProfile } = require("../../utils/utils"); - -module.exports = class extends Command { - constructor(...args) { - super(...args, { - name: "beg", - description: "Beg for money", - category: "Economy", - cooldown: 3, - }) - } - async run(message) { - const amount = Math.floor(Math.random() * 2000); - const profile = await Profile.findOne({ userID: message.author.id, guildId: message.guild.id }); - if (!profile) { - await createProfile(message.author, message.guild); - await message.channel.sendCustom({ - embeds: [ - new MessageEmbed() - .setColor("BLURPLE") - .setDescription(`Creating profile.\nUse this command again to beg for money.`) - ] - }); - } else { - if (!profile.lastBeg) { - await Profile.updateOne( - { - userID: message.author.id, - guildId: message.guild.id - }, - { $set: { lastBeg: Date.now() } } - ); - await Profile.updateOne({ userID: message.author.id, guildId: message.guild.id }) - await message.channel.sendCustomn({ - embeds: [ - new MessageEmbed() - .setColor("BLURPLE") - .setTitle(`${message.author.username}'s Beg`) - .setDescription(`You have begged ($${amount}).\nCome back in 3 minutes to beg again.`) - ] - }); - } else if (Date.now() - profile.lastBeg > 180000) { - await Profile.updateOne( - { userID: message.author.id, guildId: message.guild.id }, - { $set: { lastBeg: Date.now() } } - ); - await Profile.updateOne({ userID: message.author.id, guildId: message.guild.id }, { $inc: { wallet: amount } }); - await message.channel.sendCustom({ - embeds: [ - new MessageEmbed() - .setColor("BLURPLE") - .setTitle(`${message.author.username}'s Beg`) - .setDescription(`You begged for a total of $${amount}.`) - ] - }); - } else { - const lastBeg = new Date(profile.lastBeg); - const timeLeft = Math.round((lastBeg.getTime() + 180000 - Date.now()) / 1000); - const minutes = Math.floor(timeLeft / 60); - const seconds = timeLeft - minutes * 60; - await message.channel.sendCustom({ - embeds: [ - new MessageEmbed() - .setColor("BLURPLE") - .setTitle(`${message.author.username}'s Beg`) - .setDescription(`You have to wait ${minutes}m ${seconds}s before you can beg again!`) - ] - }); - } - } - } -}; From 83098c491c5fb2c1422c9d120fd323f9808b07d9 Mon Sep 17 00:00:00 2001 From: eYuM <101909226+eYuM-coder@users.noreply.github.com> Date: Wed, 15 Feb 2023 11:07:26 -0700 Subject: [PATCH 20/70] Create e --- src/commands/economy/e | 1 + 1 file changed, 1 insertion(+) create mode 100644 src/commands/economy/e diff --git a/src/commands/economy/e b/src/commands/economy/e new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/src/commands/economy/e @@ -0,0 +1 @@ + From f649917cbf1f30a265f326537e34559bb2407871 Mon Sep 17 00:00:00 2001 From: eYuM <101909226+eYuM-coder@users.noreply.github.com> Date: Wed, 15 Feb 2023 11:09:10 -0700 Subject: [PATCH 21/70] New category :D Yep, it's that time again... I went with my way using my time to remake the economy category/plugin, and successfully remade it! Hope you enjoy the new category Peter ^^ - eYuM --- src/commands/economy/addmoney.js | 45 +++++++++++++++++ src/commands/economy/balance.js | 47 ++++++++++++++++++ src/commands/economy/beg.js | 75 +++++++++++++++++++++++++++++ src/commands/economy/daily.js | 74 ++++++++++++++++++++++++++++ src/commands/economy/deposit.js | 54 +++++++++++++++++++++ src/commands/economy/monthly.js | 74 ++++++++++++++++++++++++++++ src/commands/economy/removemoney.js | 45 +++++++++++++++++ src/commands/economy/weekly.js | 75 +++++++++++++++++++++++++++++ src/commands/economy/withdraw.js | 54 +++++++++++++++++++++ 9 files changed, 543 insertions(+) create mode 100644 src/commands/economy/addmoney.js create mode 100644 src/commands/economy/balance.js create mode 100644 src/commands/economy/beg.js create mode 100644 src/commands/economy/daily.js create mode 100644 src/commands/economy/deposit.js create mode 100644 src/commands/economy/monthly.js create mode 100644 src/commands/economy/removemoney.js create mode 100644 src/commands/economy/weekly.js create mode 100644 src/commands/economy/withdraw.js diff --git a/src/commands/economy/addmoney.js b/src/commands/economy/addmoney.js new file mode 100644 index 0000000..08d8f23 --- /dev/null +++ b/src/commands/economy/addmoney.js @@ -0,0 +1,45 @@ +const Command = require("../../structures/Command"); +const { MessageEmbed } = require("discord.js"); +const Profile = require("../../database/models/economy/profile.js"); +const { createProfile } = require("../../utils/utils.js"); + +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: "addmoney", + aliases: ["add"], + description: "Add money to a users wallet!", + category: "Economy", + usage: " ", + examples: ["addmoney @Peter 400"], + cooldown: 3, + }) + } + async run(message, args) { + const user = message.mentions.members.first(); + const amount = args.slice(1).join(""); + const profile = await Profile.findOne({ userID: user.id, guildId: message.guild.id }); + if (!profile) { + await createProfile(user, message.guild); + await message.channel.sendCustom({ + embeds: [ + new MessageEmbed() + .setColor("BLURPLE") + .setDescription(`Creating profile.\nUse this command again to use it.`) + ] + }); + } else { + await Profile.updateOne({ + userID: message.author.id, guildId: message.guild.id + }, + { $inc: { wallet: amount} }); + await message.channel.sendCustom({ + embeds: [ + new MessageEmbed() + .setColor("BLURPLE") + .setDescription(`Added $${amount} to ${user}`) + ] + }); + } + } +}; \ No newline at end of file diff --git a/src/commands/economy/balance.js b/src/commands/economy/balance.js new file mode 100644 index 0000000..31824cb --- /dev/null +++ b/src/commands/economy/balance.js @@ -0,0 +1,47 @@ +const Command = require("../../structures/Command"); +const { MessageEmbed } = require("discord.js"); +const Profile = require("../../database/models/economy/profile.js"); +const { createProfile } = require("../../utils/utils.js"); + +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: "balance", + aliases: ["bal"], + description: "Check a user's balance", + category: "Economy", + usage: "[user]", + examples: ["balance", "balance @Peter"], + cooldown: 3, + }) + } + async run(message, args) { + const user = message.mentions.members.first() || message.author; + + const profile = await Profile.findOne({ + userID: user.id, + guildId: message.guild.id + }); + if (!profile) { + if(user.id !== message.author.id) return message.channel.sendCustom(`${user} doesn't have a profile!`); + + await createProfile(user, message.guild); + await message.channel.sendCustom({ + embeds: [ + new MessageEmbed() + .setColor("BLURPLE") + .setDescription(`Creating profile.\nUse this command again to check your balance.`) + ] + }); + } else { + await message.channel.sendCustom({ + embeds: [ + new MessageEmbed() + .setColor("BLURPLE") + .setTitle(`${user.username}'s Balance`) + .setDescription(`**Wallet:** $${profile.wallet}\n**Bank:** $${profile.bank}`) + ] + }); + } + } +}; \ No newline at end of file diff --git a/src/commands/economy/beg.js b/src/commands/economy/beg.js new file mode 100644 index 0000000..8cb9c5d --- /dev/null +++ b/src/commands/economy/beg.js @@ -0,0 +1,75 @@ +const Command = require("../../structures/Command"); +const { MessageEmbed } = require("discord.js"); +const Profile = require("../../database/models/economy/profile.js"); +const { createProfile } = require("../../utils/utils"); + +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: "beg", + description: "Beg for money", + category: "Economy", + cooldown: 3, + }) + } + async run(message) { + const amount = Math.floor(Math.random() * 2000); + const profile = await Profile.findOne({ userID: message.author.id, guildId: message.guild.id }); + if (!profile) { + await createProfile(message.author, message.guild); + await message.channel.sendCustom({ + embeds: [ + new MessageEmbed() + .setColor("BLURPLE") + .setDescription(`Creating profile.\nUse this command again to beg for money.`) + ] + }); + } else { + if (!profile.lastBeg) { + await Profile.updateOne( + { + userID: message.author.id, + guildId: message.guild.id + }, + { $set: { lastBeg: Date.now() } } + ); + await Profile.updateOne({ userID: message.author.id, guildId: message.guild.id }) + await message.channel.sendCustomn({ + embeds: [ + new MessageEmbed() + .setColor("BLURPLE") + .setTitle(`${message.author.username}'s Beg`) + .setDescription(`You have begged ($${amount}).\nCome back in 3 minutes to beg again.`) + ] + }); + } else if (Date.now() - profile.lastBeg > 180000) { + await Profile.updateOne( + { userID: message.author.id, guildId: message.guild.id }, + { $set: { lastBeg: Date.now() } } + ); + await Profile.updateOne({ userID: message.author.id, guildId: message.guild.id }, { $inc: { wallet: amount } }); + await message.channel.sendCustom({ + embeds: [ + new MessageEmbed() + .setColor("BLURPLE") + .setTitle(`${message.author.username}'s Beg`) + .setDescription(`You begged for a total of $${amount}.`) + ] + }); + } else { + const lastBeg = new Date(profile.lastBeg); + const timeLeft = Math.round((lastBeg.getTime() + 180000 - Date.now()) / 1000); + const minutes = Math.floor(timeLeft / 60); + const seconds = timeLeft - minutes * 60; + await message.channel.sendCustom({ + embeds: [ + new MessageEmbed() + .setColor("BLURPLE") + .setTitle(`${message.author.username}'s Beg`) + .setDescription(`You have to wait ${minutes}m ${seconds}s before you can beg again!`) + ] + }); + } + } + } +}; \ No newline at end of file diff --git a/src/commands/economy/daily.js b/src/commands/economy/daily.js new file mode 100644 index 0000000..eb6c3a4 --- /dev/null +++ b/src/commands/economy/daily.js @@ -0,0 +1,74 @@ +const Command = require("../../structures/Command"); +const { MessageEmbed } = require("discord.js"); +const Profile = require("../../database/models/economy/profile.js"); +const { createProfile } = require("../../utils/utils.js"); + +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: "daily", + description: "Collect daily earnings. 24hr cooldown.", + category: "Economy", + cooldown: 3, + }) + } + async run(message) { + const profile = await Profile.findOne({ guildId: message.guild.id, userID: message.author.id }); + if (!profile) { + await createProfile(message.author, message.guild); + await message.channel.sendCustom({ + embeds: [ + new MessageEmbed() + .setColor("BLURPLE") + .setDescription(`Creating profile.\nUse this command again to collect your daily earnings.`) + ] + }); + } else { + if (!profile.lastDaily) { + await Profile.updateOne( + { + userID: message.author.id, guildId: message.guild.id + }, + { $set: { lastDaily: Date.now() } } + ); + await Profile.updateOne({ userID: message.author.id, guildId: message.guild.id }) + await message.channel.sendCustom({ + embeds: [ + new MessageEmbed() + .setColor("BLURPLE") + .setTitle(`${message.author.username}'s Daily`) + .setDescription(`You have collected todays earnings ($50000).\nCome back tommorow to collect more.`) + ] + }); + } else if (Date.now() - profile.lastDaily > 86400000) { + await Profile.updateOne( + { userID: message.author.id, guildId: message.guild.id }, + { $set: { lastDaily: Date.now() } } + ); + await Profile.updateOne({ userID: message.author.id, guildId: message.guild.id }, { $inc: { wallet: 50000 } }); + await message.channel.sendCustom({ + embeds: [ + new MessageEmbed() + .setColor("BLURPLE") + .setTitle(`${message.author.username}'s Daily`) + .setDescription(`You have collected your daily earnings of $50000.`) + ] + }); + } else { + const lastDaily = new Date(profile.lastDaily); + const timeLeft = Math.round((lastDaily.getTime() + 86400000 - Date.now()) / 1000); + const hours = Math.floor(timeLeft / 3600); + const minutes = Math.floor((timeLeft - hours * 3600) / 60); + const seconds = timeLeft - hours * 3600 - minutes * 60; + await message.channel.sendCustom({ + embeds: [ + new MessageEmbed() + .setColor("BLURPLE") + .setTitle(`${message.author.username}'s Daily`) + .setDescription(`You have to wait ${hours}h ${minutes}m ${seconds}s before you can collect your daily earnings!`) + ] + }); + } + } + } +}; \ No newline at end of file diff --git a/src/commands/economy/deposit.js b/src/commands/economy/deposit.js new file mode 100644 index 0000000..54d1f89 --- /dev/null +++ b/src/commands/economy/deposit.js @@ -0,0 +1,54 @@ +const Command = require("../../structures/Command"); +const { MessageEmbed } = require("discord.js"); +const Profile = require("../../database/models/economy/profile.js"); +const { createProfile } = require("../../utils/utils.js"); + +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: "deposit", + aliases: ["dep"], + description: "Deposit your wallet money to the bank.", + category: "Economy", + usage: "", + examples: ["dep 400"], + cooldown: 3, + }) + } + async run(message, args) { + const profile = await Profile.findOne({ userID: message.author.id, guildId: message.guild.id }); + if (!profile) { + await createProfile(message.author, message.guild); + await message.channel.sendCustom({ + embeds: [ + new MessageEmbed() + .setColor("BLURPLE") + .setDescription(`Creating profile.\nUse this command again to deposit your money.`) + ] + }); + } else { + const amount = args[0]; + if (amount > profile.wallet) { + await message.channel.sendCustom({ + embeds: [ + new MessageEmbed() + .setColor("BLURPLE") + .setDescription(`You don't have enough money to deposit!`) + ] + }); + } else { + await Profile.updateOne({ + userID: message.author.id, guildId: message.guild.id + }, + { $inc: { wallet: -amount, bank: amount } }); + await message.channel.sendCustom({ + embeds: [ + new MessageEmbed() + .setColor("BLURPLE") + .setDescription(`Deposited $${amount} to the bank.`) + ] + }); + } + } + } +}; \ No newline at end of file diff --git a/src/commands/economy/monthly.js b/src/commands/economy/monthly.js new file mode 100644 index 0000000..34fc895 --- /dev/null +++ b/src/commands/economy/monthly.js @@ -0,0 +1,74 @@ +const Command = require("../../structures/Command"); +const { MessageEmbed } = require("discord.js"); +const Profile = require("../../database/models/economy/profile.js"); +const { createProfile } = require("../../utils/utils.js"); + +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: "monthly", + description: "Collect monthly coins. 30d cooldown.", + category: "Economy", + cooldown: 3, + }) + } + async run(message) { + const profile = await Profile.findOne({ + userID: message.author.id, + guildId: message.guild.id + }); + if (!profile) { + await createProfile(message.author, message.guild); + await message.channel.sendCustom({ + embeds: [ + new MessageEmbed() + .setColor("BLURPLE") + .setDescription(`Creating profile.\nUse this command again to collect your monthly earnings`) + ] + }); + } else { + if (!profile.lastMonthly) { + await Profile.updateOne( + { userID: message.author.id, guildId: message.guild.id }, { $set: { lastMonthly: Date.now() } } + ); + await Profile.updateOne({ userID: message.author.id, guildId: message.guild.id }, { $inc: { wallet: 2500000 } }); + await message.channel.sendCustom({ + embeds: [ + new MessageEmbed() + .setColor("BLURPLE") + .setTitle(`${message.author.username}'s Monthly`) + .setDescription(`You have collected this month's earnings ($2,500,000).\nCome back next month to collect more`) + ] + }); + } else if (Date.now() - profile.lastMonthly > 2592000000) { + await Profile.updateOne( + { userID: message.author.id, guildId: message.guild.id }, { $set: { lastMonthly: Date.now() } } + ); + await Profile.updateOne({ userID: message.author.id, guildId: message.guild.id }, { $inc: { wallet: 2500000 } }); + await message.channel.sendCustom({ + embeds: [ + new MessageEmbed() + .setColor("BLURPLE") + .setTitle(`${message.author.username}'s Monthly`) + .setDescription(`You have collected your monthly earnings of $2,500,000.`) + ] + }); + } else { + const lastMonthly = new Date(profile.lastMonthly); + const timeLeft = Math.round((lastMonthly.getTime() + 2592000000 - Date.now()) / 1000); + const days = Math.floor(timeLeft / 86400); + const hours = Math.floor((timeLeft - days * 86400) / 3600); + const minutes = Math.floor(((timeLeft - days * 86400) - hours * 3600) / 60); + const seconds = timeLeft - days * 86400 - hours * 3600 - minutes * 60; + await message.channel.sendCustom({ + embeds: [ + new MessageEmbed() + .setColor("BLURPLE") + .setTitle(`${message.author.username}'s Monthly`) + .setDescription(`You have to wait ${days}d ${hours}h ${minutes}m ${seconds}s before you can collect your monthly earnings!`) + ] + }) + } + } + } +}; \ No newline at end of file diff --git a/src/commands/economy/removemoney.js b/src/commands/economy/removemoney.js new file mode 100644 index 0000000..b551ff4 --- /dev/null +++ b/src/commands/economy/removemoney.js @@ -0,0 +1,45 @@ +const Command = require("../../structures/Command"); +const { MessageEmbed } = require("discord.js"); +const Profile = require("../../database/models/economy/profile.js"); +const { createProfile } = require("../../utils/utils.js"); + +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: "removemoney", + aliases: ["deletemoney"], + description: "Remove money from a users wallet!", + category: "Economy", + usage: " ", + examples: ["removemoney @Peter 400"], + cooldown: 3, + }) + } + async run(message, args) { + const user = message.mentions.members.first(); + const amount = args.slice(1).join(""); + const profile = await Profile.findOne({ userID: user.id, guildId: message.guild.id }); + if (!profile) { + await createProfile(user, message.guild); + await message.channel.sendCustom({ + embeds: [ + new MessageEmbed() + .setColor("BLURPLE") + .setDescription(`Creating profile.\nUse this command again to use it.`) + ] + }); + } else { + await Profile.updateOne({ + userID: message.author.id, guildId: message.guild.id + }, + { $inc: { wallet: -amount } }); + await message.channel.sendCustom({ + embeds: [ + new MessageEmbed() + .setColor("BLURPLE") + .setDescription(`Removed $${amount} from ${user}`) + ] + }); + } + } +}; \ No newline at end of file diff --git a/src/commands/economy/weekly.js b/src/commands/economy/weekly.js new file mode 100644 index 0000000..63f39a4 --- /dev/null +++ b/src/commands/economy/weekly.js @@ -0,0 +1,75 @@ +const Command = require("../../structures/Command"); +const { MessageEmbed } = require("discord.js"); +const Profile = require("../../database/models/economy/profile.js"); +const { createProfile } = require("../../utils/utils.js"); +const ms = require("ms"); + +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: "weekly", + description: "Collect weekly coins. 7d cooldown.", + category: "Economy", + cooldown: 3, + }) + } + async run(message) { + const profile = await Profile.findOne({ + userID: message.author.id, + guildId: message.guild.id + }); + if (!profile) { + await createProfile(message.author, message.guild); + await message.channel.sendCustom({ + embeds: [ + new MessageEmbed() + .setColor("BLURPLE") + .setDescription(`Creating profile.\nUse this command again to collect your weekly earnings`) + ] + }); + } else { + if (!profile.lastWeekly) { + await Profile.updateOne( + { userID: message.author.id, guildId: message.guild.id }, { $set: { lastWeekly: Date.now() } } + ); + await Profile.updateOne({ userID: message.author.id, guildId: message.guild.id }, { $inc: { wallet: 500000 } }); + await message.channel.sendCustom({ + embeds: [ + new MessageEmbed() + .setColor("BLURPLE") + .setTitle(`${message.author.username}'s Weekly`) + .setDescription(`You have collected this weeks earnings ($500,000).\nCome back next week to collect more`) + ] + }); + } else if (Date.now() - profile.lastWeekly > 604800000) { + await Profile.updateOne( + { userID: message.author.id, guildId: message.guild.id }, { $set: { lastWeekly: Date.now() } } + ); + await Profile.updateOne({ userID: message.author.id, guildId: message.guild.id }, { $inc: { wallet: 500000 } }); + await message.channel.sendCustom({ + embeds: [ + new MessageEmbed() + .setColor("BLURPLE") + .setTitle(`${message.author.username}'s Weekly`) + .setDescription(`You have collected your weekly earnings.`) + ] + }); + } else { + const lastWeekly = new Date(profile.lastWeekly); + const timeLeft = Math.round((lastWeekly.getTime() + 604800000 - Date.now()) / 1000); + const days = Math.floor(timeLeft / 86400); + const hours = Math.floor((timeLeft - days * 86400) / 3600); + const minutes = Math.floor(((timeLeft - days * 86400) - hours * 3600) / 60); + const seconds = timeLeft - days * 86400 - hours * 3600 - minutes * 60; + await message.channel.sendCustom({ + embeds: [ + new MessageEmbed() + .setColor("BLURPLE") + .setTitle(`${message.author.username}'s Weekly`) + .setDescription(`You have to wait ${days}d ${hours}h ${minutes}m ${seconds}s before you can collect your weekly earnings!`) + ] + }) + } + } + } +}; \ No newline at end of file diff --git a/src/commands/economy/withdraw.js b/src/commands/economy/withdraw.js new file mode 100644 index 0000000..ad9f9ad --- /dev/null +++ b/src/commands/economy/withdraw.js @@ -0,0 +1,54 @@ +const Command = require("../../structures/Command"); +const { MessageEmbed } = require("discord.js"); +const Profile = require("../../database/models/economy/profile.js"); +const { createProfile } = require("../../utils/utils.js"); + +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: "withdraw", + aliases: ["with"], + description: "Withdraw your bank money from the bank to your wallet.", + category: "Economy", + usage: "", + examples: ["withdraw 400"], + cooldown: 3, + }) + } + async run(message, args) { + const profile = await Profile.findOne({ userID: message.author.id, guildId: message.guild.id }); + if (!profile) { + await createProfile(message.author, message.guild); + await message.channel.sendCustom({ + embeds: [ + new MessageEmbed() + .setColor("BLURPLE") + .setDescription(`Creating profile.\nUse this command again to withdraw your money.`) + ] + }); + } else { + const amount = args[0]; + if (amount > profile.bank) { + await message.channel.sendCustom({ + embeds: [ + new MessageEmbed() + .setColor("BLURPLE") + .setDescription(`You don't have enough money to withdraw!`) + ] + }); + } else { + await Profile.updateOne({ + userID: message.author.id, guildId: message.guild.id + }, + { $inc: { wallet: amount, bank: -amount } }); + await message.channel.sendCustom({ + embeds: [ + new MessageEmbed() + .setColor("BLURPLE") + .setDescription(`Withdrawn $${amount} from the bank.`) + ] + }); + } + } + } +}; \ No newline at end of file From 06f17e32ce5c7249f1fbc67bb97a467b7e113c10 Mon Sep 17 00:00:00 2001 From: eYuM <101909226+eYuM-coder@users.noreply.github.com> Date: Wed, 15 Feb 2023 11:11:11 -0700 Subject: [PATCH 22/70] Delete e I created this file so I could actually create the economy folder. This file has been deleted to avoid confusion. --- src/commands/economy/e | 1 - 1 file changed, 1 deletion(-) delete mode 100644 src/commands/economy/e diff --git a/src/commands/economy/e b/src/commands/economy/e deleted file mode 100644 index 8b13789..0000000 --- a/src/commands/economy/e +++ /dev/null @@ -1 +0,0 @@ - From 9ae63fa3d3ad8b08df6c0e7a17c95628a03037fb Mon Sep 17 00:00:00 2001 From: eYuM <101909226+eYuM-coder@users.noreply.github.com> Date: Wed, 15 Feb 2023 11:16:06 -0700 Subject: [PATCH 23/70] Added profile.js This file is required for the economy plugin to function correctly. --- src/database/models/economy/profile.js | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 src/database/models/economy/profile.js diff --git a/src/database/models/economy/profile.js b/src/database/models/economy/profile.js new file mode 100644 index 0000000..402376f --- /dev/null +++ b/src/database/models/economy/profile.js @@ -0,0 +1,15 @@ +const mongoose = require("mongoose"); + +let profile = new mongoose.Schema({ + guildId: { type: String }, + userID: { type: String }, + wallet: { type: Number, default: 0 }, + bank: { type: Number, default: 0 }, + lastDaily: { type: Date }, + lastWeekly: { type: Date }, + lastMonthly: { type: Date }, + lastBeg: { type: Date }, + passiveUpdated: { type: Date } +}); + +module.exports = mongoose.model("profile", profile); \ No newline at end of file From 83813a9460c714b0d0bf722814817ad5a15e25a8 Mon Sep 17 00:00:00 2001 From: eYuM <101909226+eYuM-coder@users.noreply.github.com> Date: Wed, 15 Feb 2023 11:22:58 -0700 Subject: [PATCH 24/70] Update utils.js The changes here are needed for creating profiles for users when economy commands are ran. --- src/utils/utils.js | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/src/utils/utils.js b/src/utils/utils.js index d1d940b..c25ad0f 100644 --- a/src/utils/utils.js +++ b/src/utils/utils.js @@ -1,4 +1,4 @@ - +const Profile = require("../database/models/economy/profile.js"); /** * Capitalizes a string * @param {string} string @@ -120,6 +120,26 @@ function getStatus(...args) { return "enabled"; } +async function createProfile(user, guild) { + const profile = await Profile.findOne({ userID: user.id, guildId: guild.id }); + if (!profile) { + const newProfile = await new Profile({ + guildId: guild.id, + userID: user.id, + wallet: 0, + bank: 0, + lastDaily: new Date() - 86400000, + lastWeekly: new Date() - 604800000, + lastMonthly: new Date() - 2592000000, + lastBeg: new Date() - 180000, + passiveUpdated: new Date() + }) + newProfile.save().catch(() => {}); + return true; + } + return false; +} + module.exports = { capitalize, removeElement, @@ -129,4 +149,5 @@ module.exports = { getOrdinalNumeral, getCaseNumber, getStatus, + createProfile, }; From bc198ca9c5b48b11145023629e47616c01bf2ebb Mon Sep 17 00:00:00 2001 From: eYuM <101909226+eYuM-coder@users.noreply.github.com> Date: Mon, 6 Mar 2023 09:45:49 -0700 Subject: [PATCH 25/70] Finished information category --- src/slashCommands/information/avatar.js | 36 ++++ src/slashCommands/information/emojis.js | 60 ++++++ src/slashCommands/information/help.js | 211 +++++++++++++++++++ src/slashCommands/information/invite.js | 73 +++++++ src/slashCommands/information/members.js | 103 +++++++++ src/slashCommands/information/news.js | 33 +++ src/slashCommands/information/permissions.js | 34 +++ src/slashCommands/information/servericon.js | 17 ++ src/slashCommands/information/serverinfo.js | 41 ++++ src/slashCommands/information/stats.js | 94 +++++++++ src/slashCommands/information/uptime.js | 46 ++++ src/slashCommands/information/userinfo.js | 154 ++++++++++++++ 12 files changed, 902 insertions(+) create mode 100644 src/slashCommands/information/avatar.js create mode 100644 src/slashCommands/information/emojis.js create mode 100644 src/slashCommands/information/help.js create mode 100644 src/slashCommands/information/invite.js create mode 100644 src/slashCommands/information/members.js create mode 100644 src/slashCommands/information/news.js create mode 100644 src/slashCommands/information/permissions.js create mode 100644 src/slashCommands/information/servericon.js create mode 100644 src/slashCommands/information/serverinfo.js create mode 100644 src/slashCommands/information/stats.js create mode 100644 src/slashCommands/information/uptime.js create mode 100644 src/slashCommands/information/userinfo.js diff --git a/src/slashCommands/information/avatar.js b/src/slashCommands/information/avatar.js new file mode 100644 index 0000000..c7599fa --- /dev/null +++ b/src/slashCommands/information/avatar.js @@ -0,0 +1,36 @@ +const { SlashCommandBuilder } = require("@discordjs/builders"); +const Guild = require("../../database/schemas/Guild"); +const { MessageEmbed } = require("discord.js"); + +module.exports = { + data: new SlashCommandBuilder() + .setName("avatar") + .setDescription("Displays a users avatar") + .addUserOption((option) => option.setName("member").setDescription("The user to get the avatar of").setRequired(true)), + async execute(interaction) { + const guildDB = await Guild.findOne({ + guildId: interaction.guild.id, + }); + + const language = require(`../../data/language/${guildDB.language}.json`); + + const member = interaction.options.getMember("member"); + + if (!member) member = interaction.member; + + const embed = new MessageEmbed() + .setAuthor( + `${language.pfpAvatar.replace("{user}", `${member.user.tag}`)}`, + member.user.displayAvatarURL({ dynamic: true, size: 512 }), + member.user.displayAvatarURL({ dynamic: true, size: 512 }) + ) + .setImage(member.user.displayAvatarURL({ dynamic: true, size: 512, format: "png" })) + .setFooter({ + text: interaction.member.displayName, + iconURL: interaction.user.displayAvatarURL({ dynamic: true }), + }) + .setTimestamp() + .setColor(member.displayHexColor); + return interaction.reply({ embeds: [embed] }); + } +} \ No newline at end of file diff --git a/src/slashCommands/information/emojis.js b/src/slashCommands/information/emojis.js new file mode 100644 index 0000000..76e7f01 --- /dev/null +++ b/src/slashCommands/information/emojis.js @@ -0,0 +1,60 @@ +const { SlashCommandBuilder } = require("@discordjs/builders"); +const { MessageEmbed } = require("discord.js"); +const Guild = require("../../database/schemas/Guild"); +const ReactionMenu = require("../../data/ReactionMenu.js"); + +module.exports = { + data: new SlashCommandBuilder() + .setName("emojis") + .setDescription("Check the current emojis of a guild"), + async execute(interaction) { + const guildDB = await Guild.findOne({ + guildId: interaction.guild.id, + }); + + const language = require(`../../data/language/${guildDB.language}.json`); + + const emojis = []; + interaction.guild.emojis.cache.forEach((e) => emojis.push(`\u0009 ${e} **-** \`:${e.name}:\``)); + + const embed = new MessageEmbed() + .setAuthor(`${interaction.guild.name}'s Emojis`, interaction.guild.iconURL({ dynamic: true })) + .setTitle(`${language.emoji1}`) + .setFooter({ + text: interaction.user.tag, + iconURL: interaction.user.displayAvatarURL({ dynamic: true }), + }) + .setTimestamp() + .setColor(interaction.guild.me.displayHexColor); + + const interval = 25; + if (emojis.length === 0) + interaction.reply({ + embeds: [ + embed.setDescription(`${language.emoji2}`) + ] + }); + else if (emojis.length <= interval) { + const range = emojis.length == 1 ? "[1]" : `[1 - ${emojis.length}]`; + interaction.reply({ content: `This guild has ${emojis.length} emojis.`, ephemeral: true, embeds: [embed.setAuthor(`${interaction.guild.name}'s Emojis`, interaction.guild.iconURL({ dynamic: true })).setTitle(`${language.emoji1} ${range}`).setDescription(emojis.join("\n"))]}); + } else { + interaction.reply({ content: `This guild has ${emojis.length} emojis.` }) + .then(async () => { + setTimeout(() => { + interaction.deleteReply().catch(() => {}) + }, 10000) + }); + embed.setAuthor({ name: `${language.emoji1}`, iconURL: interaction.guild.iconURL({ dynamic: true }) }) + .setFooter({ text: interaction.user.tag, iconURL: interaction.user.displayAvatarURL({ dynamic: true }) }); + + new ReactionMenu( + interaction.client, + interaction.channel, + interaction.member, + embed, + emojis, + interval + ); + } + } +}; \ No newline at end of file diff --git a/src/slashCommands/information/help.js b/src/slashCommands/information/help.js new file mode 100644 index 0000000..9694103 --- /dev/null +++ b/src/slashCommands/information/help.js @@ -0,0 +1,211 @@ +const { SlashCommandBuilder } = require("@discordjs/builders"); +const { MessageEmbed, MessageActionRow, MessageButton, MessageSelectMenu } = require("discord.js"); +const emojis = require("../../assets/emojis.json"); +const fs = require("fs"); + +module.exports = { + data: new SlashCommandBuilder() + .setName("help") + .setDescription("Shows every command the bot has"), + async execute(interaction) { + const emoji = { + information: `${emojis.information}`, + moderation: `${emojis.moderation}`, + fun: `${emojis.fun}`, + owner: `${emojis.owner}`, + config: `${emojis.config}`, + }; + const client = interaction.client; + const row = new MessageActionRow().addComponents( + new MessageSelectMenu() + .setCustomId("select") + .setPlaceholder("Select your option") + .addOptions([ + { + label: `Config`, + description: "Click to see config commands", + value: "first", + }, + { + label: `Fun`, + description: "Click to see fun commands", + value: "second", + }, + + { + label: `Information`, + description: "Click to see information commands", + value: "third", + }, + + { + label: `Moderation`, + description: "Click this to see fun commands", + value: "fourth", + }, + + { + label: `Owner`, + description: "Click this to view owner commands (OWNER ONLY)", + value: "fifth", + }, + + { + label: `Utility`, + description: "Click this to view utility commands", + value: "sixth" + }, + + { + label: `Home`, + description: "Click this to go back to the home page", + value: "seventh" + }, + ]) + ); + + let embed = new MessageEmbed() + .setTitle(`MEE8's slash commands`) + .setDescription(`Choose a category from the list below`) + .addFields( + { name: `${emojis.config} Config`, value: "Config Category", inline: true }, + { name: `${emojis.fun} Fun`, value: "Fun Category", inline: true }, + { name: `${emojis.information} Information`, value: "Information Category", inline: true }, + { name: `${emojis.moderation} Moderation`, value: "Moderation Category", inline: true }, + { name: `${emojis.owner} Owner`, value: "Owner Category", inline: true }, + { name: `${emojis.utility} Utility`, value: "Utility Category", inline: true }, + { name: "\u200b", value: "**[Invite](https://invite.mee8.ml) | " + "[Support Server](https://mee8.ml/support) | " + "[Dashboard](https://mee8.ml/dashboard)**" } + ) + .setColor("GREEN") + .setFooter({ text: `Requested by ${interaction.user.tag}`, iconURL: interaction.user.displayAvatarURL({ dynamic: true }) }) + .setTimestamp(); + + let editEmbed = new MessageEmbed() + .addFields( + { name: "\u200b", value: "**[Invite](https://invite.mee8.ml) | " + "[Support Server](https://mee8.ml/support) | " + "[Dashboard](https://mee8.ml/dashboard)**" } + ) + .setTimestamp(); + + let sendmsg = await interaction.reply({ + content: " ", + embeds: [embed], + ephemeral: true, + components: [row], + }); + + const collector = interaction.channel.createMessageComponentCollector({ + componentType: "SELECT_MENU", + time: 60000, + idle: 60000/2, + }); + collector.on("end", async () => { + await interaction.editReply({ components: [] }) + }) + + collector.on("collect", async (collected) => { + if(!collected.deffered) await collected.deferUpdate() + const value = collected.values[0]; + if (value === "first") { + let _commands = ''; + const commandFiles = fs.readdirSync(`./src/slashCommands/config`).filter((file) => file.endsWith(".js")); + + for(const file of commandFiles) { + const command = require(`../config/${file}`); + _commands += `- \`${command.data.name}\` - ${command.data.description} \n` + } + + editEmbed.setDescription(_commands) + .setColor("GREEN") + .setTitle(`${emojis.config} Config Commands`) + .setFooter({ text: `Requested by ${interaction.user.tag} | Total Config commands: ${commandFiles.length}`, iconURL: interaction.user.displayAvatarURL({ dynamic: true }) }) + return await interaction.editReply({ embeds: [editEmbed] }); + } + + if (value === "second") { + let _commands = ''; + const commandFiles = fs.readdirSync(`./src/slashCommands/fun`).filter((file) => file.endsWith(".js")); + + for(const file of commandFiles) { + const command = require(`../fun/${file}`); + _commands += `- \`${command.data.name}\` - ${command.data.description} \n` + } + editEmbed.setDescription(_commands) + .setColor("GREEN") + .setTitle(`${emojis.fun} Fun Commands`) + .setFooter({ text: `Requested by ${interaction.user.tag} | Total Fun Commands: ${commandFiles.length}`, iconURL: interaction.user.displayAvatarURL({ dynamic: true}) }); + return await interaction.editReply({ embeds: [editEmbed] }); + } + + if (value === "third") { + let _commands = ''; + const commandFiles = fs.readdirSync(`./src/slashCommands/information`).filter((file) => file.endsWith(".js")); + + for(const file of commandFiles) { + const command = require(`./${file}`); + _commands += `- \`${command.data.name}\` - ${command.data.description} \n` + } + editEmbed.setColor(client.color.green) + .setDescription(_commands) + .setTitle(`${emojis.information} Information Commands`) + .setFooter({ text: `Requested by ${interaction.user.tag} | Total Information Commands: ${commandFiles.length}`, iconURL: interaction.user.displayAvatarURL({ dynamic: true }) }); + return await interaction.editReply({ embeds: [editEmbed] }); + } + + if (value === "fourth") { + let _commands = ''; + const commandFiles = fs.readdirSync(`./src/slashCommands/moderation`).filter((file) => file.endsWith(".js")); + + for(const file of commandFiles) { + const command = require(`../moderation/${file}`); + _commands += `- \`${command.data.name}\` - ${command.data.description} \n` + } + editEmbed.setColor(client.color.green) + .setDescription(_commands) + .setTitle(`${emojis.moderation} Moderation Commands`) + .setFooter({ text: `Requested by ${interaction.user.tag} | Total Moderation Commands: ${commandFiles.length}`, iconURL: interaction.user.displayAvatarURL({ dynamic: true }) }); + return await interaction.editReply({ embeds: [editEmbed] }); + } + + if (value === "fifth") { + if(!client.config.developers.includes(interaction.member.id)) { + editEmbed.setColor(client.color.red) + .setDescription(`${client.emoji.fail} | You are not allowed to view this category.`) + .setTitle(`You are not owner >:(`); + return await interaction.editReply({ embeds: [editEmbed] }) + } else { + let _commands = ''; + const commandFiles = fs.readdirSync(`./src/slashCommands/owner`).filter((file) => file.endsWith(".js")); + + for(const file of commandFiles) { + const command = require(`../owner/${file}`); + _commands += `- \`${command.data.name}\` - ${command.data.description} \n` + } + editEmbed.setColor(client.color.green) + .setDescription(_commands) + .setTitle(`${emojis.owner} Owner Commands`) + .setFooter({ text: `Requested by ${interaction.user.tag} | Total Owner Commands: ${commandFiles.length}`, iconURL: interaction.user.displayAvatarURL({ dynamic: true }) }); + return await interaction.editReply({ embeds: [editEmbed] }); + } + } + + if (value === "sixth") { + let _commands = ''; + const commandFiles = fs.readdirSync(`./src/slashCommands/utility`).filter((file) => file.endsWith(".js")); + + for(const file of commandFiles) { + const command = require(`../utility/${file}`); + _commands += `- \`${command.data.name}\` - ${command.data.description} \n` + } + editEmbed.setColor(client.color.green) + .setDescription(_commands) + .setTitle(`${emojis.utility} Utility Commands`) + .setFooter({ text: `Requested by ${interaction.user.tag} | Total Utility Commands: ${commandFiles.length}`, iconURL: interaction.user.displayAvatarURL({ dynamic: true }) }); + return await interaction.editReply({ embeds: [editEmbed] }) + } + + if (value === "seventh") { + interaction.editReply({ embeds: [embed] }); + } + }); + } +} \ No newline at end of file diff --git a/src/slashCommands/information/invite.js b/src/slashCommands/information/invite.js new file mode 100644 index 0000000..a827c11 --- /dev/null +++ b/src/slashCommands/information/invite.js @@ -0,0 +1,73 @@ +const { SlashCommandBuilder } = require("@discordjs/builders"); +const { MessageEmbed, MessageActionRow, MessageButton, MessageSelectMenu } = require("discord.js"); +const Guild = require("../../database/schemas/Guild"); + +module.exports = { + data: new SlashCommandBuilder() + .setName("invite") + .setDescription("Sends you the invite to MEE8's support server or the bots invite"), + async execute(interaction) { + const guildDB = await Guild.findOne({ + guildId: interaction.guild.id, + }); + + const language = require(`../../data/language/${guildDB.language}.json`); + const client = interaction.client; + const row = new MessageActionRow().addComponents( + new MessageSelectMenu() + .setCustomId("select") + .setPlaceholder("Select your option") + .addOptions([ + { + label: "Support Server Invite", + description: "Click to get invited to the support server", + value: "first" + }, + { + label: "Bot Invite", + description: "Click to invite the official bot", + value: "second" + }, + ]) + ); + + let embed = new MessageEmbed() + .setDescription("Select the option below to view the different invite links") + .setColor("RANDOM"); + + let editEmbed = new MessageEmbed(); + + let sendmsg = await interaction.reply({ + content: " ", + embeds: [embed], + ephemeral: true, + components: [row], + }); + + const collector = interaction.channel.createMessageComponentCollector({ + componentType: "SELECT_MENU", + time: 60000, + idle: 60000/2, + }); + collector.on("end", async () => { + await interaction.editReply({ components: [] }) + }) + + collector.on("collect", async (collected) => { + if(!collected.deffered) await collected.deferUpdate() + const value = collected.values[0]; + + if (value === "first") { + editEmbed.setDescription("Click [here](https://discord.gg/gGCTeCx2TS) to join the support server") + .setColor(client.color.green) + return await interaction.editReply({ embeds: [editEmbed] }); + } + + if (value === "second") { + editEmbed.setDescription(`${language.invite}(https://discord.com/api/oauth2/authorize?client_id=1001140963818864750&permissions=4398046511103&scope=bot%20applications.commands) ${client.emoji.success}`) + .setColor(client.color.green) + return await interaction.editReply({ embeds: [editEmbed] }); + } + }); + } +} \ No newline at end of file diff --git a/src/slashCommands/information/members.js b/src/slashCommands/information/members.js new file mode 100644 index 0000000..41a8cfe --- /dev/null +++ b/src/slashCommands/information/members.js @@ -0,0 +1,103 @@ +const { SlashCommandBuilder } = require("@discordjs/builders"); +const { MessageEmbed } = require("discord.js"); +const Guild = require("../../database/schemas/Guild"); +const ReactionMenu = require("../../data/ReactionMenu.js"); + +module.exports = { + data: new SlashCommandBuilder() + .setName("members") + .setDescription("Check members of a certain role or every member") + .addRoleOption((option) => option.setName("role").setDescription("The role to check").setRequired(true)), + async execute(interaction) { + const guildDB = await Guild.findOne({ + guildId: interaction.guild.id, + }); + + const language = require(`../../data/language/${guildDB.language}.json`); + + let prefix = "/"; + + let role = interaction.options.getRole("role") + + let embedValid = new MessageEmbed() + .setAuthor({ + name: interaction.user.tag, + iconURL: interaction.user.displayAvatarURL({ dynamic: true }) + }) + .setDescription(`${language.members2.replace(/{prefix}/g, `${prefix}`)}`) + .setFooter({ text: "https://mee8.ml/" }) + .setColor(interaction.guild.me.displayHexColor); + + if(!role) return interaction.reply({ embeds: [embedValid] }); + + const memberRole = role; + + const members = interaction.guild.members.cache.filter((m) => { + if (m.roles.cache.find((r) => r === memberRole)) return true; + }) + .sort((a, b) => (a.joinedAt > b.joinedAt ? 1 : -1)) + .map((m) => `${m.user.tag} - ${m.joinedAt.toLocaleString("en-US", { + year: "numeric", + month: "long", + day: "numeric", + hour: "2-digit", + minute: "2-digit", + second: "2-digit", + })}`); + + const embed = new MessageEmbed() + .setTitle(`${capitalize(role.name)} ${language.list} [${members.length}]`) + .setFooter({ + text: interaction.user.tag, + iconURL: interaction.user.displayAvatarURL({ dynamic: true }) + }) + .setTimestamp() + .setColor(interaction.guild.me.displayHexColor); + + const interval = 25; + if (members.length === 0) + interaction.reply({ + embeds: [ + embed.setDescription( + `${language.members1.replace( + "{cap}", + `${capitalize(role.name)}` + )}` + ) + ] + }); + else if (members.length <= interval) { + const range = members.length == 1 ? "[1]" : `[1 - ${members.length}]`; + interaction.reply({ + embeds: [ + embed.setTitle(`${capitalize(role.name)} ${language.list} ${range}`) + .setDescription(members.join("\n")) + ] + }); + + // Reaction Menu + } else { + embed.setTitle(`${capitalize(role.name)} ${language.list}`) + .setThumbnail(interaction.guild.iconURL({ dynamic: true })) + .setFooter({ + text: interaction.user.tag, + iconURL: interaction.user.displayAvatarURL({ dynamic: true }) + }); + + interaction.reply({ content: `The message has been sent below.`, ephemeral: true }) + + new ReactionMenu( + interaction.client, + interaction.channel, + interaction.member, + embed, + members, + interval + ); + } + } +}; + +function capitalize(string) { + return string.charAt(0).toUpperCase() + string.slice(1); +} \ No newline at end of file diff --git a/src/slashCommands/information/news.js b/src/slashCommands/information/news.js new file mode 100644 index 0000000..adf5bd7 --- /dev/null +++ b/src/slashCommands/information/news.js @@ -0,0 +1,33 @@ +const { SlashCommandBuilder } = require("@discordjs/builders"); +const Guild = require("../../database/schemas/MEE8"); +const Guildd = require("../../database/schemas/Guild"); +const { MessageEmbed } = require("discord.js"); +const moment = require("moment"); +moment.suppressDeprecationWarnings = true; + +module.exports = { + data: new SlashCommandBuilder() + .setName("news") + .setDescription("Shows MEE8's latest news"), + async execute(interaction) { + const guildDB = await Guild.findOne({}); + + const guildDB2 = await Guildd.findOne({ + guildId: interaction.guild.id, + }); + + const language = require(`../../data/language/${guildDB2.language}.json`); + + if (!guildDB) return interaction.reply({ content: `${language.noNews}`, ephemeral: true }); + + let embed = new MessageEmbed() + .setColor(interaction.guild.me.displayHexColor) + .setTitle(`MEE8 News`) + .setDescription(`***__${language.datePublished}__ ${moment(guildDB.time).format("dddd, MMMM Do YYYY")}*** *__[\`(${moment(guildDB.time).fromNow()})\`] (https://mee8.ml)__*\n\n${guildDB.news}`) + .setFooter({ text: "https://mee8.ml" }) + .setTimestamp(); + interaction.reply({ embeds: [embed] }).catch(() => { + interaction.reply({ content: `${language.noNews}`, ephemeral: true }); + }); + } +}; \ No newline at end of file diff --git a/src/slashCommands/information/permissions.js b/src/slashCommands/information/permissions.js new file mode 100644 index 0000000..6a43d58 --- /dev/null +++ b/src/slashCommands/information/permissions.js @@ -0,0 +1,34 @@ +const { SlashCommandBuilder } = require("@discordjs/builders"); +const { MessageEmbed } = require("discord.js"); +const moment = require("moment"); +const permissions = require("../../assets/json/permissions.json"); +moment.suppressDeprecationWarnings = true; + +module.exports = { + data: new SlashCommandBuilder() + .setName("permissions") + .setDescription("Get the permissions of a user.") + .addUserOption((option) => option.setName("user").setDescription("The user to get the permissions of.").setRequired(true)), + async execute(interaction) { + const member = interaction.options.getMember("user"); + + const memberPermissions = member.permissions.toArray(); + const finalPermissions = []; + for (const permission in permissions) { + if (memberPermissions.includes(permission)) + finalPermissions.push(`+ ${permissions[permission]}`); + else finalPermissions.push(`- ${permissions[permission]}`); + } + + const embed = new MessageEmbed() + .setTitle(`${member.displayName}'s permissions`) + .setDescription(`\`\`\`diff\n${finalPermissions.join("\n")}\n\`\`\``) + .setFooter({ + text: interaction.user.tag, + iconURL: interaction.user.displayAvatarURL({ dynamic: true }), + }) + .setTimestamp() + .setColor(interaction.guild.me.displayHexColor); + interaction.reply({ embeds: [embed], ephemeral: true }); + } +}; \ No newline at end of file diff --git a/src/slashCommands/information/servericon.js b/src/slashCommands/information/servericon.js new file mode 100644 index 0000000..20bd3b0 --- /dev/null +++ b/src/slashCommands/information/servericon.js @@ -0,0 +1,17 @@ +const { SlashCommandBuilder } = require("@discordjs/builders"); +const { MessageEmbed } = require("discord.js"); + +module.exports = { + data: new SlashCommandBuilder() + .setName("servericon") + .setDescription("Display's the icon of the current server"), + async execute(interaction) { + const embed = new MessageEmbed() + .setAuthor(`${interaction.guild.name}'s Server Icon`, interaction.guild.iconURL({ dynamic: true, size: 512 })) + .setImage(interaction.guild.iconURL({ dynamic: true, size: 512 })) + .setFooter({ text: interaction.user.tag, iconURL: interaction.user.displayAvatarURL({ dynamic: true }) }) + .setTimestamp() + .setColor(interaction.guild.me.displayHexColor) + interaction.reply({ embeds: [embed] }); + } +}; \ No newline at end of file diff --git a/src/slashCommands/information/serverinfo.js b/src/slashCommands/information/serverinfo.js new file mode 100644 index 0000000..4a19838 --- /dev/null +++ b/src/slashCommands/information/serverinfo.js @@ -0,0 +1,41 @@ +const { SlashCommandBuilder } = require("@discordjs/builders"); +const { MessageEmbed } = require("discord.js"); +const Guild = require("../../database/schemas/Guild"); + +function checkDays(date) { + let now = new Date(); + let diff = now.getTime() - date.getTime(); + let days = Math.floor(diff / 86400000); + return days + (days == 1 ? " day" : " days") + " ago"; +} + +module.exports = { + data: new SlashCommandBuilder() + .setName("serverinfo") + .setDescription("Displays information about the current server."), + async execute(interaction) { + const guildDB = await Guild.findOne({ + guildId: interaction.guild.id + }); + + const language = require(`../../data/language/${guildDB.language}.json`); + + const embed = new MessageEmbed() + .setAuthor({ + name: interaction.guild.name, + iconURL: interaction.guild.iconURL + }) + .addFields( + { name: `${language.nameS}`, value: `${interaction.guild.name}`, inline: true }, + { name: "ID", value: `${interaction.guild.id}`, inline: true }, + { name: `${language.sercerInfo1}`, value: `${interaction.guild.members.cache.size} | ${interaction.guild.members.cache.filter((member) => !member.user.bot).size} | ${interaction.guild.members.cache.filter((member) => member.user.bot).size}`, inline: true }, + { name: `${language.verificationLevel}`, value: `${interaction.guild.verificationLevel}`, inline: true }, + { name: `${language.channels}`, value: `${interaction.guild.channels.cache.size}`, inline: true }, + { name: `${language.roleCount}`, value: `${interaction.guild.roles.cache.size}`, inline: true }, + { name: `Created At`, value: `${interaction.channel.guild.createdAt.toUTCString().substr(0, 16)} **(${checkDays(interaction.channel.guild.createdAt)})**`, inline: true }, + ) + .setThumbnail(interaction.guild.iconURL()) + .setColor(interaction.guild.me.displayHexColor); + interaction.reply({ embeds: [embed] }); + } +}; \ No newline at end of file diff --git a/src/slashCommands/information/stats.js b/src/slashCommands/information/stats.js new file mode 100644 index 0000000..43e8b90 --- /dev/null +++ b/src/slashCommands/information/stats.js @@ -0,0 +1,94 @@ +const { SlashCommandBuilder } = require("@discordjs/builders"); +const { MessageEmbed } = require("discord.js"); +const { mem, cpu, os } = require("node-os-utils"); +const { stripIndent } = require("common-tags"); + +const Guild = require("../../database/schemas/Guild"); + +module.exports = { + data: new SlashCommandBuilder() + .setName("stats") + .setDescription("Shows the bots statistics"), + async execute(interaction) { + const guildDB = await Guild.findOne({ + guildId: interaction.guild.id, + }); + const language = require(`../../data/language/${guildDB.language}.json`); + let uptime = interaction.client.uptime; + let seconds = uptime / 1000; + let weeks = parseInt(seconds / 604800); + seconds = seconds % 604800; + let days = parseInt(seconds / 86400); + seconds = seconds % 86400; + let hours = parseInt(seconds / 3600); + seconds = seconds % 3600; + let minutes = parseInt(seconds / 60); + seconds = parseInt(seconds % 60); + uptime = `${seconds}s`; + if (weeks) { + uptime = `${weeks}w ${hours}h ${minutes}m ${seconds}s`; + } else if (days) { + uptime = `${days}d ${hours}h ${minutes}m ${seconds}s`; + } else if (hours) { + uptime = `${hours}h ${minutes}m ${seconds}s`; + } else if (minutes) { + uptime = `${minutes}m ${seconds}s`; + } + + let rss = process.memoryUsage().rss; + if (rss instanceof Array) { + rss = rss.reduce((sum, val) => sum + val, 0); + } + let heapUsed = process.memoryUsage().heapUsed; + if (heapUsed instanceof Array) { + heapUsed = heapUsed.reduce((sum, val) => sum + val, 0); + } + const { totalMemMb } = await mem.info(); + const serverStats = stripIndent` + OS -- ${await os.oos()} + CPU -- ${cpu.model()} + Cores -- ${cpu.count()} + CPU Usage -- ${await cpu.usage()}% + RAM -- ${totalMemMb}MB + RAM Usage -- ${(heapUsed / 1024 / 1024).toFixed(2)}MB + `; + const tech = stripIndent` + Ping -- ${Math.round(interaction.client.ws.ping)}ms + Uptime -- ${uptime} + ${language.pogyVersion} -- 2.5 + Library -- Discord.js v13.6.0 + Evironment -- Node.js v16.9.0 + Servers -- ${interaction.client.guilds.cache.size} + ${language.users} -- ${interaction.client.guilds.cache.reduce((a, b) => a + b.memberCount, 0)} + ${language.channels} -- ${interaction.client.channels.cache.size} + ${language.pogyCommands} -- ${interaction.client.slashCommands.size} + `; + const devs = stripIndent` + ------- + ${language.pogyOwners} + • eYuM#7506 + ${language.pogyDevelopers} + • Peter_#4444 + • Jano#6969 + • eYuM#7506 + and + pogy.xyz/team + ------- + `; + const embed = new MessageEmbed() + .setAuthor({ + name: interaction.member.displayName, + iconURL: interaction.member.displayAvatarURL({ dynamic: true }) + }) + .setTitle(`${language.pogyInfo}`) + .addFields( + { name: `${language.pogyGeneral}`, value: `\`\`\`css\n${tech}\`\`\``, inline: true }, + { name: `${language.pogyTeam}`, value: `\`\`\`css\n${devs}\`\`\``, inline: true }, + { name: `${language.pogyStats}`, value: `\`\`\`css\n${serverStats}\`\`\``} + ) + .setFooter({ text: `https://mee8.ml` }) + .setTimestamp() + .setColor(interaction.guild.me.displayHexColor); + interaction.reply({ embeds: [embed] }); + } +}; \ No newline at end of file diff --git a/src/slashCommands/information/uptime.js b/src/slashCommands/information/uptime.js new file mode 100644 index 0000000..5de3fd3 --- /dev/null +++ b/src/slashCommands/information/uptime.js @@ -0,0 +1,46 @@ +const { SlashCommandBuilder } = require("@discordjs/builders"); +const { MessageEmbed } = require("discord.js"); +const Guild = require("../../database/schemas/Guild"); + +module.exports = { + data: new SlashCommandBuilder() + .setName("uptime") + .setDescription("Sends MEE8's uptime!"), + async execute(interaction) { + const guildDB = await Guild.findOne({ + guildId: interaction.guild.id, + }); + const language = require(`../../data/language/${guildDB.language}.json`); + let uptime = interaction.client.uptime; + if (uptime instanceof Array) { + uptime = uptime.reduce((max, cur) => Math.max(max, cur), - Infinity); + } + let seconds = uptime / 1000; + let weeks = parseInt(seconds / 604800); + seconds = seconds % 604800; + let days = parseInt(seconds / 86400); + seconds = seconds % 86400; + let hours = parseInt(seconds / 3600); + seconds = seconds % 3600; + let minutes = parseInt(seconds / 60); + seconds = parseInt(seconds % 60); + uptime = `${seconds}s`; + if (weeks) { + uptime = `${weeks} weeks, ${hours} hours, ${minutes} minutes, ${seconds} seconds`; + } else if (days) { + uptime = `${days} days, ${hours} hours, ${minutes} minutes, ${seconds} seconds`; + } else if (hours) { + uptime = `${hours} hours, ${minutes} minutes, ${seconds} seconds`; + } else if (minutes) { + uptime = `${minutes} minutes, ${seconds} seconds`; + } else if (seconds) { + uptime = `${seconds} seconds`; + } + // const date = moment().subtract(days, 'ms').format('dddd, MMMM Do YYYY'); + const embed = new MessageEmbed() + .setDescription(`${language.uptime1} \`${uptime}\`.`) + .setFooter({ text: `https://mee8.ml` }) + .setColor(interaction.guild.me.displayHexColor); + interaction.reply({ embeds: [embed] }); + } +}; \ No newline at end of file diff --git a/src/slashCommands/information/userinfo.js b/src/slashCommands/information/userinfo.js new file mode 100644 index 0000000..a6be574 --- /dev/null +++ b/src/slashCommands/information/userinfo.js @@ -0,0 +1,154 @@ +const { SlashCommandBuilder } = require("@discordjs/builders"); +const { MessageEmbed } = require("discord.js"); +const Guild = require("../../database/schemas/Guild"); +const User = require("../../database/schemas/User"); +const Nickname = require("../../database/schemas/nicknames"); +const Usernames = require("../../database/schemas/usernames"); +const moment = require("moment"); +const emojis = require("../../assets/emojis.json"); + +const flags = { + DISCORD_EMPLOYEE: `${emojis.discord_employee} \`Discord Employee\``, + DISCORD_PARTNER: `${emojis.discord_partner} \`Partnered Server Owner\``, + BUGHUNTER_LEVEL_1: `${emojis.bughunter_level_1} \`Bug Hunter (Level 1)\``, + BUGHUNTER_LEVEL_2: `${emojis.bughunter_level_2} \`Bug Hunter (Level 2)\``, + HYPESQUAD_EVENTS: `${emojis.hypesquad_events} \`HypeSquad Events\``, + HOUSE_BRAVERY: `${emojis.house_bravery} \`House of Bravery\``, + HOUSE_BRILLIANCE: `${emojis.house_brilliance} \`House of Brilliance\``, + HOUSE_BALANCE: `${emojis.house_balance} \`House of Balance\``, + EARLY_SUPPORTER: `${emojis.early_supporter} \`Early Supporter\``, + TEAM_USER: "Team User", + SYSTEM: "System", + VERIFIED_BOT: `${emojis.verified_bot} \`Verified Bot\``, + VERIFIED_DEVELOPER: `${emojis.verified_developer} \`Early Verified Bot Developer\``, + ACTIVE_DEVELOPER: `${emojis.active_developer} \`Active Developer\``, +}; + +module.exports = { + data: new SlashCommandBuilder() + .setName("userinfo") + .setDescription("View the info of a user") + .addUserOption((option) => option.setName("member").setDescription("The member")), + async execute(interaction) { + const guildDB = await Guild.findOne({ + guildId: interaction.guild.id, + }); + + const language = require(`../../data/language/${guildDB.language}.json`); + + let member = interaction.options.getMember("member") || interaction.member; + + if(!member) { + try { + member = await interaction.guild.members.fetch(member); + } catch { + member = interaction.member; + } + } + + /* if(!member.user) return interaction.reply(language.userinfo.no_user); */ + + let userFind = await User.findOne({ + discordId: member.id, + }); + + if (!userFind) { + const newUser = new User({ + discordId: member.id, + }); + + newUser.save(); + userFind = await User.findOne({ + discordId: member.id, + }); + } + let badge; + if (userFind && userFind.badges) { + badge = userFind.badges.join(" "); + if (!badge || !badge.length) badge = `\`None\``; + } else { + badge = `\`None\``; + } + + let usernames = []; + + // user tags + let userName = await Usernames.findOne({ + discordId: member.id, + }); + if (!userName) { + const newUser = new Usernames({ + discordId: member.id, + }); + + newUser.save(); + + usernames = `No Tags Tracked`; + } else { + usernames = userName.usernames.join(" - "); + if (!userName.usernames.length) usernames = `No Tags Tracked`; + } + + let nickname = []; + + // user nicknames + const nicknames = await Nickname.findOne({ + discordId: member.id, + guildId: interaction.guild.id, + }); + if (!nicknames) { + const newUser = new Nickname({ + discordId: member.id, + guildId: interaction.guild.id, + }); + + newUser.save(); + + nickname = `No Nicknames Tracked`; + } else { + nickname = nicknames.nicknames.join(" - "); + if (!nicknames.nicknames.length) nickname = `No Nicknames Tracked`; + } + + const userFlags = (await member.user.fetchFlags()).toArray(); + + // Trim roles + let rolesNoob; + let roles = member.roles.cache + .sort((a, b) => b.position - a.position) + .map((role) => role.toString()) + .slice(0, -1); + + rolesNoob = roles.join(" "); + if (member.roles.cache.size < 1) rolesNoob = "No Roles"; + + if (!member.roles.cache.size || member.roles.cache.size - 1 < 1) + roles = `\`None\``; + const embed = new MessageEmbed() + .setAuthor({ + name: `${member.user.tag}`, + iconURL: member.user.displayAvatarURL({ dynamic: true }) + }) + .setThumbnail(member.user.displayAvatarURL({ dynamic: true })) + .setFooter({ text: `ID: ${member.id}` }) + .setTimestamp() + .setColor(member.displayHexColor) + .setDescription( + `**• ${language.userh}** \`${member.user.username}\` | \`#${ + member.user.discriminator + }\`\n** • ID:** \`${member.id}\`\n**• ${ + language.joinedDiscord + }** \`${moment(member.user.createdAt).format("MMMM Do YYYY, h:mm:ss a")}\`\n**• ${language.joinedServer}** \`${moment(member.joinedAt).format("MMMM Do YYYY, h:mm:ss a")}\`\n**• Roles [${roles.length || "0"}]: ** ${ + rolesNoob || `\`${language.noRoles}\`` + }\n\n**• ${language.badgeslmao}** ${userFlags.map((flag) => flags[flag]).join("\n") || `\`${language.noBadge}\``}\n**• ${language.botBadges}** ${ + badge || `\`None\`` + }\n**• Last 5 Nicknames:**\n\`\`\`${ + nickname || `No Nicknames Tracked` + }\`\`\`**• Last 5 Tags:**\n\`\`\`${ + usernames || `No Tags Tracked` + }\`\`\` ` + ); + + interaction.reply({ embeds: [embed] }); + } +}; \ No newline at end of file From fe4d39c0ee7ec9d79721801c8229ff994ca9d900 Mon Sep 17 00:00:00 2001 From: eYuM <101909226+eYuM-coder@users.noreply.github.com> Date: Mon, 6 Mar 2023 09:48:18 -0700 Subject: [PATCH 26/70] finished moderation category --- src/slashCommands/moderation/addrole.js | 142 +++++++++++++++ src/slashCommands/moderation/clear.js | 114 ++++++++++++ src/slashCommands/moderation/lock.js | 68 +++++++ src/slashCommands/moderation/removerole.js | 142 +++++++++++++++ src/slashCommands/moderation/removewarn.js | 190 ++++++++++++++++++++ src/slashCommands/moderation/setnickname.js | 141 +++++++++++++++ src/slashCommands/moderation/slowmode.js | 134 ++++++++++++++ src/slashCommands/moderation/softban.js | 97 ++++++++++ src/slashCommands/moderation/unlock.js | 68 +++++++ src/slashCommands/moderation/warnings.js | 170 ++++++++++++++++++ src/slashCommands/moderation/warnpurge.js | 179 ++++++++++++++++++ 11 files changed, 1445 insertions(+) create mode 100644 src/slashCommands/moderation/addrole.js create mode 100644 src/slashCommands/moderation/clear.js create mode 100644 src/slashCommands/moderation/lock.js create mode 100644 src/slashCommands/moderation/removerole.js create mode 100644 src/slashCommands/moderation/removewarn.js create mode 100644 src/slashCommands/moderation/setnickname.js create mode 100644 src/slashCommands/moderation/slowmode.js create mode 100644 src/slashCommands/moderation/softban.js create mode 100644 src/slashCommands/moderation/unlock.js create mode 100644 src/slashCommands/moderation/warnings.js create mode 100644 src/slashCommands/moderation/warnpurge.js diff --git a/src/slashCommands/moderation/addrole.js b/src/slashCommands/moderation/addrole.js new file mode 100644 index 0000000..77ab3f0 --- /dev/null +++ b/src/slashCommands/moderation/addrole.js @@ -0,0 +1,142 @@ +const { SlashCommandBuilder } = require("@discordjs/builders"); +const { MessageEmbed } = require("discord.js"); +const Logging = require("../../database/schemas/logging.js"); + +module.exports = { + data: new SlashCommandBuilder() + .setName("addrole") + .setDescription("Adds a role to a user.") + .addUserOption((option) => option.setName("member").setDescription("The member to add the role to").setRequired(true)) + .addRoleOption((option) => option.setName("role").setDescription("The role to give").setRequired(true)), + async execute(interaction) { + if(!interaction.member.permissions.has("MANAGE_ROLES")) { + return interaction.reply({ content: `You do not have permission to use this command.`, ephemeral: true }); + }; + const client = interaction.client; + const fail = client.emoji.fail; + const success = client.emoji.success; + const logging = await Logging.findOne({ guildId: interaction.guild.id }); + + let member = interaction.options.getMember("member"); + + if(!member) { + let usernotfound = new MessageEmbed() + .setAuthor({ + name: `${interaction.user.tag}`, + iconURL: interaction.user.displayAvatarURL({ dynamic: true }) + }) + .setDescription(`${fail} | Please mention a valid user`) + .setTimestamp() + .setFooter({ text: "https://mee8.ml/" }) + .setColor(interaction.client.color.red) + return interaction.reply({ embeds: [usernotfound] }) + .then(async () => { + if (logging && logging.moderation.delete_reply === "true") { + setTimeout(() => { + interaction.deleteReply().catch(() => {}); + }, 5000); + } + }) + .catch(() => {}); + } + + if (member.roles.highest.position >= interaction.member.roles.highest.position) { + let rolesmatch = new MessageEmbed() + .setAuthor({ + name: `${interaction.user.tag}`, + iconURL: interaction.user.displayAvatarURL({ dynamic: true }) + }) + .setDescription(`${fail} | The Provided user has an equal or higher role than you.`) + .setTimestamp() + .setFooter({ text: "https://mee8.ml/" }) + .setColor(interaction.client.color.red) + return interaction.reply({ embeds: [rolesmatch] }) + .then(async () => { + if (logging && logging.moderation.delete_reply === "true") { + setTimeout(() => { + interaction.deleteReply().catch(() => {}) + }, 5000) + } + }) + .catch(() => {}) + } + + const role = interaction.options.getRole("role") || interaction.guild.roles.cache.get(role) || interaction.guild.roles.cache.find((rl) => rl.name.toLowerCase() === role.slice(1).join(" ").toLowerCase()); + + let reason = `The current feature doesn't need a reason.`; + if (!reason) reason = `No Reason Provided`; + if (reason.length > 1024) reason = reason.slice(0, 1021) + "..."; + + if (!role) { + let rolenotfound = new MessageEmbed() + .setAuthor({ + name: `${interaction.user.tag}`, + iconURL: interaction.user.displayAvatarURL({ dynamic: true }) + }) + .setDescription(`${fail} | Please provide a valid role!`) + .setTimestamp() + .setFooter({ text: "https://mee8.ml" }) + .setColor(interaction.client.color.red) + return interaction.reply({ embeds: [rolenotfound] }) + .then(async () => { + if (logging && logging.moderation.delete_reply === "true") { + setTimeout(() => { + interaction.deleteReply().catch(() => {}); + }, 5000) + } + }) + .catch(() => {}); + } else if (member.roles.cache.has(role.id)) { + let userhasrole = new MessageEmbed() + .setAuthor({ + name: `${interaction.user.tag}`, + iconURL: interaction.user.displayAvatarURL({ dynamic: true }) + }) + .setDescription(`${fail} | The user already has that role!`) + .setTimestamp() + .setFooter({ text: "https://mee8.ml/" }) + .setColor(interaction.client.color.red) + return interaction.reply({ embeds: [userhasrole] }) + .then(async () => { + if (logging && logging.moderation.delete_reply === "true") { + setTimeout(() => { + interaction.deleteReply().catch(() => {}); + }, 5000) + } + }) + .catch(() => {}) + } else { + try { + await member.roles.add(role, [ + `Role Add / Responsible User: ${interaction.user.tag}`, + ]); + const embed = new MessageEmbed() + .setDescription(`${success} | Added **${role.name}** to **${member.user.tag}**`) + .setColor(interaction.client.color.green) + interaction.reply({ embeds: [embed] }) + .then(async () => { + if (logging && logging.moderation.delete_reply === "true") { + setTimeout(() => { + interaction.deleteReply().catch(() => {}); + }, 5000) + } + }) + .catch(() => {}) + } catch (err) { + interaction.reply({ + embeds: [ + new MessageEmbed() + .setAuthor({ + name: `${interaction.user.tag}`, + iconURL: interaction.user.displayAvatarURL({ dynamic: true }) + }) + .setDescription(`${fail} | Unable to remove the role to the user.`) + .setTimestamp() + .setFooter({ text: "https://mee8.ml/" }) + .setColor(interaction.guild.me.displayHexColor), + ], + }); + } + } + } +}; \ No newline at end of file diff --git a/src/slashCommands/moderation/clear.js b/src/slashCommands/moderation/clear.js new file mode 100644 index 0000000..75207b7 --- /dev/null +++ b/src/slashCommands/moderation/clear.js @@ -0,0 +1,114 @@ +const { SlashCommandBuilder } = require("@discordjs/builders"); +const { MessageEmbed } = require("discord.js"); +const Logging = require("../../database/schemas/logging.js"); + +module.exports = { + data: new SlashCommandBuilder() + .setName("clear") + .setDescription("Purges a channels messages") + .addStringOption((option) => option.setName("amount").setDescription("Amount of messages to clear").setRequired(true)) + .addUserOption((option) => option.setName("member").setDescription("The member")) + .addChannelOption((option) => option.setName("channel").setDescription("The channel")), + async execute(interaction) { + try { + const logging = await Logging.findOne({ guildId: interaction.guild.id }); + + const client = interaction.client; + const fail = client.emoji.fail; + const success = client.emoji.success; + + const amount = interaction.options.getString("amount") + const member = interaction.options.getMember("member") + const channel = interaction.options.getChannel("channel") || interaction.guild.channels.cache.get(interaction.channel.id); + + if(amount < 0 || amount > 100) { + let invalidamount = new MessageEmbed() + .setAuthor({ + name: `${interaction.user.tag}`, + iconURL: interaction.member.displayAvatarURL({ dynamic: true }) + }) + .setTitle(`${fail} | Purge Error`) + .setDescription( + `Please Provide a message count between 1 - 100!` + ) + .setTimestamp() + .setFooter({ + text: "https://mee8.ml/" + }) + .setColor(client.color.red) + return interaction.reply({ embeds: [invalidamount] }) + .then(async () => { + if (logging && logging.moderation.delete_reply === "true") { + setTimeout(() => { + interaction.deleteReply().catch(() => {}); + }, 5000) + } + }) + .catch(() => {}); + } + + let messages; + if (member) { + messages = (await channel.messages.fetch({ limit: amount })).filter( + (m) => m.member.id === member.id + ); + } else messages = amount; + + if (messages.size === 0) { + interaction.reply({ embeds: [ + new MessageEmbed() + .setDescription( + ` + ${fail} | Unable to find any messages from ${member}. + ` + ) + .setColor(interaction.client.color.red) + ] + }) + .then(async () => { + setTimeout(() => { + interaction.deleteReply(); + }, 10000); + }) + .catch(() => {}); + } else { + channel.bulkDelete(messages, true).then((messages) => { + const embed = new MessageEmbed() + + .setDescription( + `${success} | Successfully deleted **${messages.size}** message(s)` + ) + + .setColor(interaction.client.color.green); + + if (member) { + embed + .spliceFields(1, 1, { + name: "Found Messages", + value: `\`${messages.size}\``, + inline: true, + }) + .spliceFields(1, 0, { + name: "Member", + value: `${member}`, + inline: true, + }); + } + + interaction + .reply({ embeds: [embed] }) + .then(async () => { + if (logging && logging.moderation.delete_reply === "true") { + setTimeout(() => { + interaction.deleteReply().catch(() => {}); + }, 5000); + } + }) + .catch(() => {}); + }); + } + } catch (err) { + console.error(err) + } + } +} \ No newline at end of file diff --git a/src/slashCommands/moderation/lock.js b/src/slashCommands/moderation/lock.js new file mode 100644 index 0000000..456ec2f --- /dev/null +++ b/src/slashCommands/moderation/lock.js @@ -0,0 +1,68 @@ +const { SlashCommandBuilder } = require("@discordjs/builders"); +const { MessageEmbed } = require("discord.js"); +const Guild = require("../../database/schemas/Guild.js"); +const Logging = require("../../database/schemas/logging.js"); + +module.exports = { + data: new SlashCommandBuilder() + .setName("lock") + .setDescription("Locks a channel in the server") + .addChannelOption((option) => option.setName("channel").setDescription("The channel to lock").setRequired(true)) + .addStringOption((option) => option.setName("reason").setDescription("The reason to lock the channel")), + async execute(interaction) { + const client = interaction.client; + const fail = interaction.client.emoji.fail; + const success = interaction.client.emoji.success; + + const logging = await Logging.findOne({ guildId: interaction.guild.id }); + const guildDB = await Guild.findOne({ guildId: interaction.guild.id }); + const language = require(`../../data/language/${guildDB.language}.json`); + let channel = interaction.options.getChannel("channel"); + let reason = interaction.options.getString("reason"); + + let member = interaction.guild.roles.cache.find((r) => r.name.toLowerCase() === "member"); + let memberr = interaction.guild.roles.cache.find((r) => r.name.toLowerCase() === "members"); + let verified = interaction.guild.roles.cache.find((r) => r.name.toLowerCase() === "verified"); + if(channel) { + reason = reason || "`none`"; + } else channel = interaction.channel; + + if(channel.permissionsFor(interaction.guild.id).has("SEND_MESSAGES") === false) { + const lockchannelError2 = new MessageEmbed() + .setDescription(`${fail} | ${channel} is already locked`) + .setColor(client.color.red) + return interaction.reply({ embeds: [lockchannelError2], ephemeral: true }); + } + + channel.permissionOverwrites.edit(interaction.guild.me, { SEND_MESSAGES: true }).catch(() => {}); + + channel.permissionOverwrites.edit(interaction.guild.id, { SEND_MESSAGES: false }).catch(() => {}); + + channel.permissionOverwrites.edit(interaction.member.id, { SEND_MESSAGES: true }).catch(() => {}); + + if (member) { + channel.permissionOverwrites.edit(member, { SEND_MESSAGES: false }).catch(() => {}); + } + + if (memberr) { + channel.permissionOverwrites.edit(memberr, { SEND_MESSAGES: false }).catch(() => {}); + } + + if (verified) { + channel.permissionOverwrites.edit(verified, { SEND_MESSAGES: false }).catch(() => {}); + } + + const embed = new MessageEmbed() + .setDescription(`${success} | Successfully locked **${channel}** ${logging && logging.moderation.include_reason === "true" ? `\n\n**Reason:** ${reason}` : ``}`) + .setColor(client.color.green) + interaction.reply({ embeds: [embed] }) + .then(() => { + if (logging && logging.moderation.delete_reply === "true") { + setTimeout(() => { + interaction.deleteReply().catch(() => {}); + }, 5000); + } + }) + .catch(() => {}); + } +}; \ No newline at end of file diff --git a/src/slashCommands/moderation/removerole.js b/src/slashCommands/moderation/removerole.js new file mode 100644 index 0000000..5978c54 --- /dev/null +++ b/src/slashCommands/moderation/removerole.js @@ -0,0 +1,142 @@ +const { SlashCommandBuilder } = require("@discordjs/builders"); +const { MessageEmbed } = require("discord.js"); +const Logging = require("../../database/schemas/logging.js"); + +module.exports = { + data: new SlashCommandBuilder() + .setName("removerole") + .setDescription("Removes a role from a user.") + .addUserOption((option) => option.setName("member").setDescription("The member to remove the role from").setRequired(true)) + .addRoleOption((option) => option.setName("role").setDescription("The role to remove").setRequired(true)), + async execute(interaction) { + if(!interaction.member.permissions.has("MANAGE_ROLES")) { + return interaction.reply({ content: `You do not have permission to use this command.`, ephemeral: true }); + }; + const client = interaction.client; + const fail = client.emoji.fail; + const success = client.emoji.success; + const logging = await Logging.findOne({ guildId: interaction.guild.id }); + + let member = interaction.options.getMember("member"); + + if(!member) { + let usernotfound = new MessageEmbed() + .setAuthor({ + name: `${interaction.user.tag}`, + iconURL: interaction.user.displayAvatarURL({ dynamic: true }) + }) + .setDescription(`${fail} | Please mention a valid user`) + .setTimestamp() + .setFooter({ text: "https://mee8.ml/" }) + .setColor(interaction.guild.me.displayHexColor) + return interaction.reply({ embeds: [usernotfound] }) + .then(async () => { + if (logging && logging.moderation.delete_reply === "true") { + setTimeout(() => { + interaction.deleteReply().catch(() => {}); + }, 5000); + } + }) + .catch(() => {}); + } + + if (member.roles.highest.position >= interaction.member.roles.highest.position) { + let rolesmatch = new MessageEmbed() + .setAuthor({ + name: `${interaction.user.tag}`, + iconURL: interaction.user.displayAvatarURL({ dynamic: true }) + }) + .setDescription(`${fail} | The Provided user has an equal or higher role than you.`) + .setTimestamp() + .setFooter({ text: "https://mee8.ml/" }) + .setColor(interaction.guild.me.displayHexColor) + return interaction.reply({ embeds: [rolesmatch] }) + .then(async () => { + if (logging && logging.moderation.delete_reply === "true") { + setTimeout(() => { + interaction.deleteReply().catch(() => {}) + }, 5000) + } + }) + .catch(() => {}) + } + + const role = interaction.options.getRole("role") || interaction.guild.roles.cache.get(role) || interaction.guild.roles.cache.find((rl) => rl.name.toLowerCase() === role.slice(1).join(" ").toLowerCase()); + + let reason = `The current feature doesn't need a reason.`; + if (!reason) reason = `No Reason Provided`; + if (reason.length > 1024) reason = reason.slice(0, 1021) + "..."; + + if (!role) { + let rolenotfound = new MessageEmbed() + .setAuthor({ + name: `${interaction.user.tag}`, + iconURL: interaction.user.displayAvatarURL({ dynamic: true }) + }) + .setDescription(`${fail} | Please provide a valid role!`) + .setTimestamp() + .setFooter({ text: "https://mee8.ml" }) + .setColor(interaction.guild.me.displayHexColor) + return interaction.reply({ embeds: [rolenotfound] }) + .then(async () => { + if (logging && logging.moderation.delete_reply === "true") { + setTimeout(() => { + interaction.deleteReply().catch(() => {}); + }, 5000) + } + }) + .catch(() => {}); + } else if (!member.roles.cache.has(role.id)) { + let userhasrole = new MessageEmbed() + .setAuthor({ + name: `${interaction.user.tag}`, + iconURL: interaction.user.displayAvatarURL({ dynamic: true }) + }) + .setDescription(`${fail} | The user doesn't have that role!`) + .setTimestamp() + .setFooter({ text: "https://mee8.ml/" }) + .setColor(interaction.guild.me.displayHexColor) + return interaction.reply({ embeds: [userhasrole] }) + .then(async () => { + if (logging && logging.moderation.delete_reply === "true") { + setTimeout(() => { + interaction.deleteReply().catch(() => {}); + }, 5000) + } + }) + .catch(() => {}) + } else { + try { + await member.roles.remove(role, [ + `Role Remove / Responsible User: ${interaction.user.tag}` + ]); + const embed = new MessageEmbed() + .setDescription(`${success} | Removed **${role.name}** from **${member.user.tag}**`) + .setColor(interaction.client.color.green) + interaction.reply({ embeds: [embed] }) + .then(async () => { + if (logging && logging.moderation.delete_reply === "true") { + setTimeout(() => { + interaction.deleteReply().catch(() => {}); + }, 5000) + } + }) + .catch(() => {}) + } catch (err) { + interaction.reply({ + embeds: [ + new MessageEmbed() + .setAuthor({ + name: `${interaction.user.tag}`, + iconURL: interaction.user.displayAvatarURL({ dynamic: true }) + }) + .setDescription(`${fail} | Unable to remove the role from the user.`) + .setTimestamp() + .setFooter({ text: "https://mee8.ml/" }) + .setColor(interaction.guild.me.displayHexColor), + ], + }); + } + } + } +}; \ No newline at end of file diff --git a/src/slashCommands/moderation/removewarn.js b/src/slashCommands/moderation/removewarn.js new file mode 100644 index 0000000..64afb61 --- /dev/null +++ b/src/slashCommands/moderation/removewarn.js @@ -0,0 +1,190 @@ +const { SlashCommandBuilder } = require("@discordjs/builders"); +const { MessageEmbed } = require("discord.js"); +const warnModel = require("../../database/models/moderation"); +const Logging = require("../../database/schemas/logging.js"); +const Guild = require("../../database/schemas/Guild.js"); + +module.exports = { + data: new SlashCommandBuilder() + .setName("removewarn") + .setDescription("Removes a warning from a user") + .addUserOption((option) => option.setName("member").setDescription("The member").setRequired(true)) + .addStringOption((option) => option.setName("warning").setDescription("The warn ID").setRequired(true)), + async execute(interaction) { + const client = interaction.client; + const logging = await Logging.findOne({ + guildId: interaction.guild.id + }); + const guildDB = await Guild.findOne({ + guildId: interaction.guild.id, + }); + let language = require(`../../data/language/${guildDB.language}.json`); + + if(!interaction.member.permissions.has("MODERATE_MEMBERS")) return interaction.reply({ content: "You do not have permission to use this command.", ephemeral: true }); + + const mentionedMember = interaction.options.getMember("member") + const warnID = interaction.options.getString("warning") + + if(!mentionedMember) { + let usernotfound = new MessageEmbed() + .setAuthor({ + name: `${interaction.user.tag}`, + iconURL: interaction.member.displayAvatarURL({ dynamic: true }) + }) + .setDescription(`${client.emoji.fail} | I couldn't find that member!`) + .setTimestamp() + .setColor(client.color.red) + return interaction.reply({ embeds: [usernotfound] }) + .then(async () => { + if (logging && logging.moderation.delete_reply === "true") { + setTimeout(() => { + interaction.deleteReply().catch(() => {}) + }, 5000) + } + }) + .catch(() => {}) + } + + const mentionedPosition = mentionedMember.roles.highest.position; + const memberPosition = interaction.member.roles.highest.position; + + if (mentionedMember.roles.highest.position >= interaction.member.roles.highest.position) { + let rolesmatch = new MessageEmbed() + .setAuthor({ + name: `${interaction.user.tag}`, + iconURL: interaction.member.displayAvatarURL({ dynamic: true }) + }) + .setDescription(`${client.emoji.fail} | They have more power than you or have the same power as you do!`) + .setTimestamp() + .setColor(client.color.red) + return interaction.reply({ embeds: [rolesmatch] }) + .then(async () => { + if (logging && logging.moderation.delete_reply === "true") { + setTimeout(() => { + interaction.deleteReply().catch(() => {}) + }, 5000) + } + }) + .catch(() => {}) + } + + const warnDoc = await warnModel.findOne({ + guildID: interaction.guild.id, + memberID: mentionedMember.id, + }) + .catch((err) => console.log(err)); + + if(!warnDoc || !warnDoc.warnings.length) { + let nowarnerror = new MessageEmbed() + .setAuthor({ + name: `${interaction.user.tag}`, + iconURL: interaction.member.displayAvatarURL({ dynamic: true }) + }) + .setDescription(`${client.emoji.fail} | No warnings found for ${mentionedMember}`) + .setTimestamp() + .setColor(client.color.red) + return interaction.reply({ embeds: [nowarnerror] }) + .then(async () => { + if (logging && logging.moderation.delete_reply === "true") { + setTimeout(() => { + interaction.deleteReply().catch(() => {}) + }, 5000) + } + }) + .catch(() => {}) + } + + if(!warnID) { + let warnIDinvalid = new MessageEmbed() + .setAuthor({ + name: `${interaction.user.tag}`, + iconURL: interaction.member.displayAvatarURL({ dynamic: true }) + }) + .setDescription(`${client.emoji.fail} | ${language.rmWarnInvalid}`) + .setTimestamp() + .setColor(client.color.red) + return interaction.reply({ embeds: [warnIDinvalid] }) + .then(async () => { + if (logging && logging.moderation.delete_reply === "true") { + setTimeout(() => { + interaction.deleteReply().catch(() => {}) + }, 5000) + } + }) + .catch(() => {}) + } + + let check = warnDoc.warningID.filter((word) => warnID === word); + + if(!warnDoc.warningID.includes(warnID)) { + let warnremoveerror = new MessageEmbed() + .setAuthor({ + name: `${interaction.user.tag}`, + iconURL: interaction.member.displayAvatarURL({ dynamic: true }) + }) + .setDescription(`${client.emoji.fail} | ${language.rmWarnInvalid}`) + .setTimestamp() + .setColor(client.color.red) + return interaction.reply({ embeds: [warnremoveerror] }) + .then(async () => { + if (logging && logging.moderation.delete_reply === "true") { + setTimeout(() => { + interaction.deleteReply().catch(() => {}) + }, 5000) + } + }) + .catch(() => {}) + } + + if(!check) { + let no = new MessageEmbed() + .setAuthor({ + name: `${interaction.user.tag}`, + conURL: interaction.member.displayAvatarURL({ dynamic: true }) + }) + .setDescription(`${client.emoji.fail} | ${language.rmWarnInvalid}`) + .setTimestamp() + .setColor(client.color.red) + return interaction.reply({ embeds: [no] }) + .then(async () => { + if (logging && logging.moderation.delete_reply === "true") { + setTimeout(() => { + interaction.deleteReply().catch(() => {}) + }, 5000) + } + }) + .catch(() => {}) + } + + let toReset = warnDoc.warningID.length; + + //warnDoc.memberID.splice(toReset - 1, toReset !== 1 ? toReset - 1 : 1) + //warnDoc.guildID.splice(toReset - 1, toReset !== 1 ? toReset - 1 : 1) + warnDoc.warnings.splice(toReset - 1, toReset !== 1 ? toReset - 1 : 1); + warnDoc.warningID.splice(toReset - 1, toReset !== 1 ? toReset - 1 : 1); + warnDoc.modType.splice(toReset - 1, toReset !== 1 ? toReset - 1 : 1); + warnDoc.moderator.splice(toReset - 1, toReset !== 1 ? toReset - 1 : 1); + warnDoc.date.splice(toReset - 1, toReset !== 1 ? toReset - 1 : 1); + + await warnDoc.save().catch((err) => console.log(err)); + + const removeembed = new MessageEmbed() + .setDescription( + `${ + interaction.client.emoji.success + } | Cleared Warn **#${warnID}** from **${ + mentionedMember.user.tag + }**` + ) + .setColor(interaction.client.color.green); + interaction.reply({ embeds: [removeembed] }) + .then(async () => { + if (logging && logging.moderation.delete_reply === "true") { + setTimeout(() => { + interaction.deleteReply().catch(() => {}) + }, 5000) + } + }) + .catch(() => {}) + } +} \ No newline at end of file diff --git a/src/slashCommands/moderation/setnickname.js b/src/slashCommands/moderation/setnickname.js new file mode 100644 index 0000000..c6fa8c4 --- /dev/null +++ b/src/slashCommands/moderation/setnickname.js @@ -0,0 +1,141 @@ +const { SlashCommandBuilder } = require("@discordjs/builders"); +const { MessageEmbed } = require("discord.js"); +const Logging = require("../../database/schemas/logging"); + +module.exports = { + data: new SlashCommandBuilder() + .setName("setnickname") + .setDescription("Changes the nickname of a provided user") + .addUserOption((option) => option.setName("member").setDescription("The member to change the nickname of").setRequired(true)) + .addStringOption((option) => option.setName("nickname").setDescription("The nickname")), + async execute(interaction) { + const client = interaction.client; + const fail = client.emoji.fail; + const success = client.emoji.success; + const logging = await Logging.findOne({ guildId: interaction.guild.id }); + + const member = interaction.options.getMember("member") + const nickname = interaction.options.getString("nickname") + + if(!interaction.member.permissions.has("MANAGE_NICKNAMES")) return interaction.reply({ content: "You do not have permission to use this command.", ephemeral: true }) + + if (!member) { + const usernotfound = new MessageEmbed() + .setAuthor({ + name: `${interaction.user.tag}`, + iconURL: interaction.user.displayAvatarURL({ dynamic: true }) + }) + .setTitle(`${fail} Set Nickname Error`) + .setDescription("Please provide a valid user") + .setTimestamp() + .setFooter({ text: "https://mee8.ml" }) + .setColor(client.color.red) + return interaction.reply({ embeds: [usernotfound] }) + .then(async () => { + if (logging && logging.moderation.delete_reply === "true") { + setTimeout(() => { + interaction.deleteReply().catch(() => {}); + }, 5000); + } + }) + .catch(() => {}); + } + + if (member.id === interaction.member.id) { + const setnickerror = new MessageEmbed() + .setAuthor({ + name: `${interaction.user.tag}`, + iconURL: interaction.user.displayAvatarURL({ dynamic: true }) + }) + .setTitle(`${fail} Set Nickname Error`) + .setDescription("You can't change your own nickname!") + .setTimestamp() + .setFooter({ text: "https://mee8.ml" }) + .setColor(client.color.red) + return interaction.reply({ embeds: [setnickerror] }) + .then(async () => { + if (logging && logging.moderation.delete_reply === "true") { + setTimeout(() => { + interaction.deleteReply().catch(() => {}); + }, 5000); + } + }) + .catch(() => {}) + } + + if (member.roles.highest.position >= interaction.member.roles.highest.position) { + const rolesmatch = new MessageEmbed() + .setAuthor({ + name: `${interaction.user.tag}`, + iconURL: interaction.user.displayAvatarURL({ dynamic: true }) + }) + .setTitle(`${fail} Set Nickname Error`) + .setDescription("The provided user has either an equal or higher role.") + .setTimestamp() + .setFooter({ text: "https://mee8.ml" }) + .setColor(client.color.red) + return interaction.reply({ embeds: [rolesmatch] }) + .then(async () => { + if (logging && logging.moderation.delete_reply === "true") { + setTimeout(() => { + interaction.deleteReply().catch(() => {}); + }, 5000); + } + }) + .catch(() => {}) + } + + if (!nickname) { + const oldNickname = member.nickname; + await member.setNickname(''); + const embed = new MessageEmbed() + .setDescription(`${success} | Nickname for ${member} was reset.`) + .setColor(client.color.green) + interaction.reply({ embeds: [embed] }) + .then(async () => { + if (logging && logging.moderation.delete_reply === "true") { + setTimeout(() => { + interaction.deleteReply().catch(() => {}); + }, 5000); + } + }) + .catch(() => {}); + } + + let nick = nickname; + if (nickname) { + try { + const oldNickname = member.nickname || "None"; + await member.setNickname(nick); + const embed = new MessageEmbed() + .setDescription(`${success} | **${oldNickname}**'s nickname was set to **${nick}**`) + .setColor(client.color.green); + interaction.reply({ embeds: [embed] }) + .then(async () => { + if (logging && logging.moderation.delete_reply === "true") { + setTimeout(() => { + interaction.deleteReply().catch(() => {}); + }, 5000); + } + }) + .catch(() => {}); + } catch (err) { + interaction.client.logger.error(err.stack); + interaction.reply({ + embeds: [ + new MessageEmbed() + .setAuthor({ + name: `${interaction.user.tag}`, + iconURL: interaction.user.displayAvatarURL({ dynamic: true }) + }) + .setTitle(`${fail} Set Nickname Error`) + .setDescription(`Please ensure my role is above the provided user's role.`) + .setTimestamp() + .setFooter({ text: "https://mee8.ml/" }) + .setColor(client.color.red), + ], + }); + } + } + } +}; \ No newline at end of file diff --git a/src/slashCommands/moderation/slowmode.js b/src/slashCommands/moderation/slowmode.js new file mode 100644 index 0000000..d2371b5 --- /dev/null +++ b/src/slashCommands/moderation/slowmode.js @@ -0,0 +1,134 @@ +const { SlashCommandBuilder } = require("@discordjs/builders"); +const { MessageEmbed } = require("discord.js"); +const Guild = require("../../database/schemas/Guild"); +const Logging = require("../../database/schemas/logging.js"); + +module.exports = { + data: new SlashCommandBuilder() + .setName("slowmode") + .setDescription("Enables slowmode in a channel with the specified rate") + .addStringOption((option) => option.setName("rate").setDescription("The rate of messages/second").setRequired(true)) + .addChannelOption((option) => option.setName("channel").setDescription("The channel")), + async execute(interaction) { + if(!interaction.member.permissions.has("MANAGE_CHANNELS")) { + return interaction.reply({ content: "You do not have permission to use this command.", ephemeral: true }); + } + const client = interaction.client; + const fail = client.emoji.fail; + const success = client.emoji.success; + + const logging = await Logging.findOne({ guildId: interaction.guild.id }); + const guildDB = await Guild.findOne({ + guildId: interaction.guild.id + }); + const language = require(`../../data/language/${guildDB.language}.json`); + + let index = 1; + let channel = interaction.options.getChannel("channel"); + if (!channel) { + channel = interaction.channel; + index--; + } + + if (channel.type != "GUILD_TEXT" || !channel.viewable) { + let channelerror = new MessageEmbed() + .setAuthor({ + name: `${interaction.user.tag}`, + iconURL: interaction.user.displayAvatarURL({ dynamic: true }) + }) + .setDescription(`${fail} | I can't view the provided channel!`) + .setTimestamp() + .setFooter({ text: "https://mee8.ml/" }) + .setColor(interaction.guild.me.displayHexColor) + return interaction.reply({ embeds: [channelerror] }) + .then(async () => { + if (logging && logging.moderation.delete_reply === "true") { + setTimeout(() => { + interaction.deleteReply().catch(() => {}); + }, 5000); + } + }) + .catch(() => {}) + } + + const rate = interaction.options.getString("rate"); + if (!rate || rate < 0 || rate > 59) { + let embed = new MessageEmbed() + .setAuthor({ + name: `${interaction.user.tag}`, + iconURL: interaction.user.displayAvatarURL({ dynamic: true }) + }) + .setDescription(`${fail} | Please provide a rate limit between 0 and 59 seconds`) + .setTimestamp() + .setFooter({ text: "https://mee8.ml/" }) + .setColor(interaction.guild.me.displayHexColor) + return interaction.reply({ embeds: [embed] }) + .then(async () => { + if (logging && logging.moderation.delete_reply === "true") { + setTimeout(() => { + interaction.deleteReply().catch(() => {}) + }, 5000) + } + }) + .catch(() => {}) + } + + const number = parseInt(rate); + if (isNaN(number)) { + let embed = new MessageEmbed() + .setAuthor({ + name: `${interaction.user.tag}`, + iconURL: interaction.user.displayAvatarURL({ dynamic: true }) + }) + .setDescription(`${fail} | Please provide a rate limit between 0 and 59 seconds`) + .setTimestamp() + .setFooter({ text: "https://mee8.ml/" }) + .setColor(interaction.guild.me.displayHexColor) + return interaction.reply({ embeds: [embed] }) + .then(async () => { + if (logging && logging.moderation.delete_reply === "true") { + setTimeout(() => { + interaction.deleteReply().catch(() => {}); + }, 5000) + } + }) + .catch(() => {}) + } + + await channel.setRateLimitPerUser(rate); + + if (rate === "0") { + return interaction.reply({ + embeds: [ + new MessageEmbed() + .setDescription(`${success} | Slow Mode has been disabled, good luck!`) + .setColor(interaction.guild.me.displayHexColor), + ], + }) + .then(async () => { + if (logging && logging.moderation.delete_reply === "true") { + setTimeout(() => { + interaction.deleteReply().catch(() => {}); + }, 5000); + } + }) + .catch(() => {}); + } else { + interaction.reply({ + embeds: [ + new MessageEmbed() + .setDescription(`${success} | Slow Mode was successfully set to **1 msg/${rate}s**`) + .setColor(interaction.guild.me.displayHexColor), + ], + }) + .then(async () => { + if (logging && logging.moderation.delete_reply === "true") { + setTimeout(() => { + interaction.deleteReply().catch(() => {}); + }, 5000); + } + }) + .catch(() => {}); + } + } +}; \ No newline at end of file diff --git a/src/slashCommands/moderation/softban.js b/src/slashCommands/moderation/softban.js new file mode 100644 index 0000000..b14a3b1 --- /dev/null +++ b/src/slashCommands/moderation/softban.js @@ -0,0 +1,97 @@ +const { SlashCommandBuilder } = require("@discordjs/builders"); +const { MessageEmbed } = require("discord.js"); +const Guild = require("../../database/schemas/Guild.js"); +const Logging = require("../../database/schemas/logging.js"); + +module.exports = { + data: new SlashCommandBuilder() + .setName("softban") + .setDescription("Softbans a user") + .addUserOption((option) => option.setName("member").setDescription("The member to softban").setRequired(true)) + .addStringOption((option) => option.setName("reason").setDescription("The reason")), + async execute(interaction) { + let client = interaction.client; + + const logging = await Logging.findOne({ guildId: interaction.guild.id }); + + const guildDB = await Guild.findOne({ + guildId: interaction.guild.id + }); + const language = require(`../../data/language/${guildDB.language}.json`); + + const member = interaction.options.getMember("member"); + const reason = interaction.options.getString("reason") || "No Reason Provided"; + + if(!interaction.member.permissions.has("BAN_MEMBERS")) return interaction.reply({ content: "You do not have permission to use this command.", ephemeral: true }); + + if (!member) { + let embed = new MessageEmbed() + .setDescription(`${client.emoji.fail} | ${language.softbanNoUser}`) + .setColor(client.color.red) + return interaction.reply({ embeds: [embed] }) + .then(async () => { + if (logging && logging.moderation.delete_reply === "true") { + setTimeout(() => { + interaction.deleteReply().catch(() => {}); + }, 5000); + } + }) + .catch(() => {}); + } + + if (member === interaction.member) { + let embed = new MessageEmbed() + .setDescription(`${client.emoji.fail} | ${language.softbanSelfUser}`) + .setColor(client.color.red) + return interaction.reply({ embeds: [embed] }) + .then(async () => { + if (logging && logging.moderation.delete_reply === "true") { + setTimeout(() => { + interaction.deleteReply().catch(() => {}) + }, 5000) + } + }) + .catch(() => {}) + } + + if (member.roles.highest.position >= interaction.member.roles.highest.position) { + let rolesmatch = new MessageEmbed() + .setDescription(`${client.emoji.fail} | ${language.softbanEqualRole}`) + .setColor(client.color.red) + return interaction.reply({ embeds: [rolesmatch] }) + .then(async () => { + if (logging && logging.moderation.delete_reply === "true") { + setTimeout(() => { + interaction.deleteReply().catch(() => {}) + }, 5000) + } + }) + .catch(() => {}) + } + + if(reason.length > 1024) reason = reason.slice(0, 1021) + "..."; + if(member) { + await member.ban({ + reason: `${reason} / ${language.softbanResponsible}: ${interaction.user.tag}`, + days: 7, + }); + await interaction.guild.members.unban( + member.user, + `${reason} / ${language.softbanResponsible}: ${interaction.user.tag}` + ); + + const embed = new MessageEmbed() + .setDescription(`${client.emoji.success} | ${language.softbanSuccess} **${member.user.tag}** ${logging && logging.moderation.include_reason === "true" ? `\n\n**Reason:** ${reason}` : ``}`) + .setColor(client.color.green); + interaction.reply({ embeds: [embed] }) + .then(async () => { + if (logging && logging.moderation.delete_reply === "true") { + setTimeout(() => { + interaction.deleteReply().catch(() => {}) + }, 5000) + } + }) + .catch(() => {}) + } + } +}; \ No newline at end of file diff --git a/src/slashCommands/moderation/unlock.js b/src/slashCommands/moderation/unlock.js new file mode 100644 index 0000000..84cfbf1 --- /dev/null +++ b/src/slashCommands/moderation/unlock.js @@ -0,0 +1,68 @@ +const { SlashCommandBuilder } = require("@discordjs/builders"); +const { MessageEmbed } = require("discord.js"); +const Guild = require("../../database/schemas/Guild.js"); +const Logging = require("../../database/schemas/logging.js"); + +module.exports = { + data: new SlashCommandBuilder() + .setName("unlock") + .setDescription("Unlocks a channel in the server") + .addChannelOption((option) => option.setName("channel").setDescription("The channel to unlock").setRequired(true)) + .addStringOption((option) => option.setName("reason").setDescription("The reason to unlock the channel")), + async execute(interaction) { + const client = interaction.client; + const fail = interaction.client.emoji.fail; + const success = interaction.client.emoji.success; + + const logging = await Logging.findOne({ guildId: interaction.guild.id }); + const guildDB = await Guild.findOne({ guildId: interaction.guild.id }); + const language = require(`../../data/language/${guildDB.language}.json`); + let channel = interaction.options.getChannel("channel"); + let reason = interaction.options.getString("reason"); + + let member = interaction.guild.roles.cache.find((r) => r.name.toLowerCase() === "member"); + let memberr = interaction.guild.roles.cache.find((r) => r.name.toLowerCase() === "members"); + let verified = interaction.guild.roles.cache.find((r) => r.name.toLowerCase() === "verified"); + if(channel) { + reason = reason || "`none`"; + } else channel = interaction.channel; + + if(channel.permissionsFor(interaction.guild.id).has("SEND_MESSAGES") === true) { + const lockchannelError2 = new MessageEmbed() + .setDescription(`${fail} | ${channel} is already unlocked`) + .setColor(client.color.red) + return interaction.reply({ embeds: [lockchannelError2], ephemeral: true }); + } + + channel.permissionOverwrites.edit(interaction.guild.me, { SEND_MESSAGES: true }).catch(() => {}); + + channel.permissionOverwrites.edit(interaction.guild.id, { SEND_MESSAGES: true }).catch(() => {}); + + channel.permissionOverwrites.edit(interaction.member.id, { SEND_MESSAGES: true }).catch(() => {}); + + if (member) { + channel.permissionOverwrites.edit(member, { SEND_MESSAGES: true }).catch(() => {}); + } + + if (memberr) { + channel.permissionOverwrites.edit(memberr, { SEND_MESSAGES: true }).catch(() => {}); + } + + if (verified) { + channel.permissionOverwrites.edit(verified, { SEND_MESSAGES: true }).catch(() => {}); + } + + const embed = new MessageEmbed() + .setDescription(`${success} | Successfully unlocked **${channel}** ${logging && logging.moderation.include_reason === "true" ? `\n\n**Reason:** ${reason}` : ``}`) + .setColor(client.color.green) + interaction.reply({ embeds: [embed] }) + .then(() => { + if (logging && logging.moderation.delete_reply === "true") { + setTimeout(() => { + interaction.deleteReply().catch(() => {}); + }, 5000); + } + }) + .catch(() => {}); + } +}; \ No newline at end of file diff --git a/src/slashCommands/moderation/warnings.js b/src/slashCommands/moderation/warnings.js new file mode 100644 index 0000000..5c33243 --- /dev/null +++ b/src/slashCommands/moderation/warnings.js @@ -0,0 +1,170 @@ +const { SlashCommandBuilder } = require("@discordjs/builders"); +const { MessageEmbed } = require("discord.js"); +const moment = require("moment"); +const Guild = require("../../database/schemas/Guild.js"); +const warnModel = require("../../database/models/moderation.js"); +const ReactionMenu = require("../../data/ReactionMenu.js"); + +module.exports = { + data: new SlashCommandBuilder() + .setName("warnings") + .setDescription("Shows the warnings for a user") + .addUserOption((option) => option.setName("member").setDescription("The member").setRequired(true)), + async execute(interaction) { + let client = interaction.client; + + const guildDB = await Guild.findOne({ + guildId: interaction.guild.id, + }); + let language = require(`../../data/language/${guildDB.language}.json`); + + if(!interaction.member.permissions.has("MODERATE_MEMBERS")) return interaction.reply({ content: "You do not have permission to use this command.", ephemeral: true }); + + const mentionedMember = interaction.options.getMember("member") + + const warnDoc = await warnModel + .findOne({ + guildID: interaction.guild.id, + memberID: mentionedMember.id, + }) + .catch((err) => console.log(err)); + + if (!warnDoc || !warnDoc.warnings.length) { + return interaction.reply({ embeds: [ + new MessageEmbed() + .setDescription( + `${interaction.client.emoji.fail} | **${mentionedMember.user.tag}** ${language.warningsNoError}` + ) + .setTimestamp() + .setColor(client.color.red), + ], + }); + } + + const data = []; + + for (let i = 0; warnDoc.warnings.length > i; i++) { + data.push( + `**Moderator:** ${await interaction.client.users.fetch( + warnDoc.moderator[i] + )}\n**Reason:** ${warnDoc.warnings[i]}\n**Date:** ${moment( + warnDoc.date[i] + ).format("dddd, MMMM do YYYY")}\n**Warning ID:** ${i + 1}\n` + ); + } + + const count = warnDoc.warnings.length; + + const embed = new MessageEmbed() + .setTimestamp() + .setColor(client.color.blue); + + const buildEmbed = (current, embed) => { + const max = count > current + 4 ? current + 4 : count; + let amount = 0; + for (let i = current; i < max; i++) { + if (warnDoc.warnings[i].length > 1000) + warnDoc.warnings[i] = warnDoc.warnings[i].slice(0, 1000) + "..."; + embed + .addField( + "\u200b", + `**${language.warnName || "unknown"} \`#${i + 1}\`**` + ) + .addField( + `${language.warnModerator || "unknown"}`, + `${interaction.guild.members.cache.get(warnDoc.moderator[i])}`, + true + ) + + .addField( + `${language.warnAction || "unknown"}`, + `${warnDoc.modType[i]}`, + true + ) + + .addField( + `${language.warnReason || "unknown"}`, + `${warnDoc.warnings[i]}`, + true + ) + .addField( + `${language.warnID || "unknown"}`, + `${warnDoc.warningID[i]}`, + true + ) + .addField( + `${language.warnDateIssued || "unknown"}`, + `${moment(warnDoc.date[i]).format("dddd, MMMM Do YYYY")}` + ); + amount += 1; + }; + + return embed + .setTitle(`${language.warnList} [${current} - ${max}]`) + .setDescription( + `Showing \`${amount}\` of ${mentionedMember}'s \`${count}\` total warns.` + ); + }; + + if (count < 4) interaction.reply({ embeds: [buildEmbed(0, embed)] }); + else { + let n = 0; + const json = embed + .setFooter({ + text: `${language.warnExpire}\n` + interaction.member.displayName, + iconURL: interaction.member.displayAvatarURL({ dynamic: true }) + }) + .toJSON(); + + const first = () => { + if (n === 0) return; + n = 0; + return buildEmbed(n, new MessageEmbed(json)); + }; + + const previous = () => { + if (n === 0) return; + n -= 4; + if (n < 0) n = 0; + return buildEmbed(n, new MessageEmbed(json)); + }; + + const next = () => { + const cap = count - (count % 4); + if (n === cap || n + 4 === count) return; + n += 4; + if (n >= count) n = cap; + return buildEmbed(n, new MessageEmbed(json)); + }; + + const last = () => { + const cap = count - (count % 4); + if (n === cap || n + 4 === count) return; + n = cap; + if (n === count) n -= 4; + return buildEmbed(n, new MessageEmbed(json)); + }; + + const reactions = { + "⏪": first, + "◀️": previous, + "⏹️": null, + "▶️": next, + "⏩": last, + }; + + const menu = new ReactionMenu( + interaction.client, + interaction.channel, + interaction.member, + buildEmbed(n, new MessageEmbed(json)), + null, + null, + reactions, + 180000 + ); + + menu.reactions["⏹️"] = menu.stop.bind(menu); + } + }, +}; \ No newline at end of file diff --git a/src/slashCommands/moderation/warnpurge.js b/src/slashCommands/moderation/warnpurge.js new file mode 100644 index 0000000..9b533ea --- /dev/null +++ b/src/slashCommands/moderation/warnpurge.js @@ -0,0 +1,179 @@ +const { SlashCommandBuilder } = require("@discordjs/builders"); +const { MessageEmbed } = require("discord.js"); +const Guild = require("../../database/schemas/Guild.js"); +const warnModel = require("../../database/models/moderation.js"); +const randoStrings = require("../../packages/randostrings.js"); +const random = new randoStrings(); +const Logging = require("../../database/schemas/logging.js"); + +module.exports = { + data: new SlashCommandBuilder() + .setName("warnpurge") + .setDescription("Warns a user and removes their messages") + .addUserOption((option) => option.setName("member").setDescription("The member to warn").setRequired(true)) + .addNumberOption((option) => option.setName("amount").setDescription("The amount of messages to purge").setRequired(true)) + .addStringOption((option) => option.setName("reason").setDescription("The reason to warn the user")), + + async execute(interaction) { + const client = interaction.client; + + const logging = await Logging.findOne({ + guildId: interaction.guild.id + }); + const guildDB = await Guild.findOne({ + guildId: interaction.guild.id, + }); + let language = require(`../../data/language/${guildDB.language}.json`); + + if(!interaction.member.permissions.has("MODERATE_MEMBERS")) return interaction.reply({ content: "You do not have permission to use this command.", ephemeral: true }); + + const fail = client.emoji.fail; + const success = client.emoji.success; + const mentionedMember = interaction.options.getMember("member") + const amount = interaction.options.getNumber("amount") + const reason = interaction.options.getString("reason") || "No Reason Provided"; + + if(!mentionedMember) { + let usernotfound = new MessageEmbed() + .setColor(client.color.red) + .setDescription(`${client.emoji.fail} | ${language.warnMissingUser}`) + .setTimestamp() + return interaction.reply({ embeds: [usernotfound] }) + .then(async () => { + if (logging && logging.moderation.delete_reply === "true") { + setTimeout(() => { + interaction.deleteReply().catch(() => {}); + }, 5000) + } + }) + .catch(() => {}) + } + + if(mentionedMember.roles.highest.position >= interaction.member.roles.highest.position) { + let rolesmatch = new MessageEmbed() + .setColor(client.color.red) + .setDescrirption(`${client.emoji.fail} | ${language.warnHigherRole}`) + .setTimestamp() + return interaction.reply({ embeds: [rolesmatch] }) + .then(async () => { + if (logging && logging.moderation.delete_reply === "true") { + setTimeout(() => { + interaction.deleteReply().catch(() => {}); + }, 5000) + } + }) + .catch(() => {}) + } + + if(amount < 0 || amount > 100) { + let invalidamount = new MessageEmbed() + new MessageEmbed() + .setAuthor({ + name: `${interaction.user.tag}`, + iconURL: interaction.member.displayAvatarURL({ dynamic: true }) + }) + .setTitle(`${fail} | Warn Purge Error`) + .setDescription( + `Please Provide a message count between 1 - 100!` + ) + .setTimestamp() + .setFooter({ + text: "https://mee8.ml/" + }) + .setColor(client.color.red) + return interaction.reply({ embeds: [invalidamount] }) + .then(async () => { + if (logging && logging.moderation.delete_reply === "true") { + setTimeout(() => { + interaction.deleteReply().catch(() => {}); + }, 5000) + } + }) + .catch(() => {}); + } + + let warnID = random.password({ + length: 18, + string: "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890", + }); + + let warnDoc = await warnModel + .findOne({ + guildID: interaction.guild.id, + memberID: mentionedMember.id, + }) + .catch((err) => console.log(err)); + + if (!warnDoc) { + warnDoc = new warnModel({ + guildID: interaction.guild.id, + memberID: mentionedMember.id, + modAction: [], + warnings: [], + warningID: [], + moderator: [], + date: [], + }); + + await warnDoc.save().catch((err) => console.log(err)); + + warnDoc = await warnModel.findOne({ + guildID: interaction.guild.id, + memberID: mentionedMember.id, + }); + } + warnDoc.modType.push("warn purge"); + warnDoc.warnings.push(reason); + warnDoc.warningID.push(warnID); + warnDoc.moderator.push(interaction.member.id); + warnDoc.date.push(Date.now()); + + await warnDoc.save().catch((err) => console.log(err)); + let dmEmbed; + if ( + logging && + logging.moderation.warn_action && logging.moderation.warn_action !== "1" + ) { + if (logging.moderation.warn_action === "2") { + dmEmbed = `${interaction.client.emoji.fail} | You've been warned in **${interaction.guild.name}**.`; + } else if (logging.moderation.warn_action === "3") { + dmEmbed = `${interaction.client.emoji.fail} | You've been warned in **${interaction.guild.name}**.\n\n__**Reason:**__ ${reason}`; + } else if (logging.moderation.warn_action === "4") { + dmEmbed = `${interaction.client.emoji.fail} | You've been warned in **${interaction.guild.name}**.\n\n__**Moderator:**__ ${interaction.author} **(${interaction.user.tag})**\n__**Reason:**__ ${reason}`; + } + + mentionedMember.send({ + embeds: [ + new MessageEmbed() + .setColor(interaction.client.color.red) + .setDescription(dmEmbed), + ], + }) + .catch(() => {}); + } + + // Purge + const messages = ( + await interaction.channel.messages.fetch({ limit: amount }) + ).filter((m) => m.member.id === mentionedMember.id); + if (messages.size > 0) await interaction.channel.bulkDelete(messages, true); + + if (mentionedMember) { + const embed = new MessageEmbed() + .setDescription(`${success} | **${mentionedMember.user.tag}** has been warned, with **${ + messages.size + }** messages purged.\n\n__**Reason:**__ ${reason}`) + .setColor(client.color.green) + .setTimestamp() + interaction.reply({ embeds: [embed] }) + .then(async () => { + if (logging && logging.moderation.delete_reply === "true") { + setTimeout(() => { + interaction.deleteReply().catch(() => {}); + }, 5000); + } + }) + .catch(() => {}); + } + } +} \ No newline at end of file From b8b7ec243f1b1581cb6e27424d937b647b69e3ce Mon Sep 17 00:00:00 2001 From: eYuM <101909226+eYuM-coder@users.noreply.github.com> Date: Mon, 6 Mar 2023 09:50:27 -0700 Subject: [PATCH 27/70] Create autoresponselist.js --- src/slashCommands/config/autoresponselist.js | 41 ++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 src/slashCommands/config/autoresponselist.js diff --git a/src/slashCommands/config/autoresponselist.js b/src/slashCommands/config/autoresponselist.js new file mode 100644 index 0000000..f8c504b --- /dev/null +++ b/src/slashCommands/config/autoresponselist.js @@ -0,0 +1,41 @@ +const { SlashCommandBuilder } = require("@discordjs/builders"); +const { MessageEmbed } = require("discord.js"); +const autoResponse = require("../../database/schemas/autoResponse.js"); +const Guild = require("../../database/schemas/Guild"); + +module.exports = { + data: new SlashCommandBuilder() + .setName("autoresponselist") + .setDescription("Show's a list of auto responses"), + async execute(interaction) { + const guildDB = await Guild.findOne({ + guildId: interaction.guild.id + }); + + const language = require(`../../data/language/${guildDB.language}.json`); + + await autoResponse.find( + { + guildId: interaction.guild.id, + }, + (err, data) => { + if (!data && !data.name) return interaction.reply({ content: `${interaction.client.emoji.fail} | ${language.cc5}` }); + let array = []; + data.map((d) => array.push(d.name)); + + let embed = new MessageEmbed() + .setColor("PURPLE") + .setTitle(`${language.cc6}`) + .setFooter({ text: interaction.guild.name }); + + if (!Array.isArray(array) || !array.length) { + embed.setDescription(`${language.cc5}`); + } else { + embed.setDescription(array.join(" - ")); + } + + interaction.reply({ embeds: [embed] }); + } + ); + } +}; From e1de5e8ed9783f247f024a7dc55b7ba508c97186 Mon Sep 17 00:00:00 2001 From: eYuM <101909226+eYuM-coder@users.noreply.github.com> Date: Mon, 6 Mar 2023 09:51:13 -0700 Subject: [PATCH 28/70] finished config category --- src/slashCommands/config/afk.js | 47 ++ src/slashCommands/config/anti-invites.js | 123 ++++++ src/slashCommands/config/anti-links.js | 79 ++++ src/slashCommands/config/autoresponse.js | 118 +++++ src/slashCommands/config/config.js | 35 ++ src/slashCommands/config/customcommand.js | 103 +++++ src/slashCommands/config/customcommandlist.js | 41 ++ src/slashCommands/config/deletecommand.js | 65 +++ src/slashCommands/config/deleteresponse.js | 66 +++ src/slashCommands/config/prefix.js | 61 +++ src/slashCommands/config/setlanguage.js | 52 +++ src/slashCommands/config/suggestions.js | 413 ++++++++++++++++++ src/slashCommands/config/tempvc.js | 314 +++++++++++++ 13 files changed, 1517 insertions(+) create mode 100644 src/slashCommands/config/afk.js create mode 100644 src/slashCommands/config/anti-invites.js create mode 100644 src/slashCommands/config/anti-links.js create mode 100644 src/slashCommands/config/autoresponse.js create mode 100644 src/slashCommands/config/config.js create mode 100644 src/slashCommands/config/customcommand.js create mode 100644 src/slashCommands/config/customcommandlist.js create mode 100644 src/slashCommands/config/deletecommand.js create mode 100644 src/slashCommands/config/deleteresponse.js create mode 100644 src/slashCommands/config/prefix.js create mode 100644 src/slashCommands/config/setlanguage.js create mode 100644 src/slashCommands/config/suggestions.js create mode 100644 src/slashCommands/config/tempvc.js diff --git a/src/slashCommands/config/afk.js b/src/slashCommands/config/afk.js new file mode 100644 index 0000000..2e4897a --- /dev/null +++ b/src/slashCommands/config/afk.js @@ -0,0 +1,47 @@ +const { SlashCommandBuilder } = require("@discordjs/builders"); +const Guild = require("../../database/schemas/Guild"); +const afk = require("../../database/models/afk.js"); +const discord = require("discord.js"); + +module.exports = { + data: new SlashCommandBuilder() + .setName("afk") + .setDescription("Set an AFK message!") + .addStringOption((option) => option.setName("reason").setDescription("The reason to go AFK (if this is blank then the message will be 'AFK')")), + async execute(interaction) { + const guildDB = await Guild.findOne({ + guildId: interaction.guild.id, + }); + + const language = require(`../../data/language/${guildDB.language}.json`); + const reason = interaction.options.getString("reason") || "AFK" + + const oldNickname = interaction.member.nickname || interaction.user.username; + const nickname = `[AFK] ${oldNickname}`; + + const afklist = await afk.findOne({ + userID: interaction.user.id + }); + if(!afklist) { + const newafk = new afk({ + serverID: interaction.guild.id, + userID: interaction.user.id, + reason: reason, + oldNickname: oldNickname, + time: Date.now() + }); + + await interaction.member.setNickname(nickname).catch(() => {}); + + const embed = new discord.MessageEmbed() + .setDescription(`${language.afk5} ${reason}`) + .setColor(interaction.client.color.blurple) + .setAuthor({ + name: `${interaction.user.tag}`, + iconURL: interaction.user.displayAvatarURL({ dynamic: true }) + }); + interaction.reply({ embeds: [embed] }); + newafk.save().catch((err) => console.error(err)); + } + } +}; \ No newline at end of file diff --git a/src/slashCommands/config/anti-invites.js b/src/slashCommands/config/anti-invites.js new file mode 100644 index 0000000..c5fedb0 --- /dev/null +++ b/src/slashCommands/config/anti-invites.js @@ -0,0 +1,123 @@ +const { SlashCommandBuilder } = require("@discordjs/builders"); +const Guild = require("../../database/schemas/Guild"); +const { MessageEmbed } = require("discord.js"); +const Logging = require("../../database/schemas/logging"); + +module.exports = { + data: new SlashCommandBuilder() + .setName("anti-invites") + .setDescription("Block invites from the current server!") + .addStringOption((option) => option.setName("toggle").setDescription("Enable or Disable").setRequired(true)), + async execute(interaction) { + const guildDB = await Guild.findOne({ + guildId: interaction.guild.id, + }); + + const language = require(`../../data/language/${guildDB.language}.json`); + + const logging = await Logging.findOne({ guildId: interaction.guild.id }); + + const toggle = interaction.options.getString("toggle"); + + if (!toggle === "enable" || !toggle === "disable") { + let embed = new MessageEmbed() + .setColor(interaction.client.color.red) + .setDescription(`${interaction.client.emoji.fail} | ${language.antiinvites1}`) + return interaction.reply({ embeds: [embed] }) + .then(async () => { + if (logging && logging.moderation.delete_reply === "true") { + setTimeout(() => { + interaction.deleteReply().catch(() => {}); + }, 5000) + } + }) + .catch(() => {}) + } + + if (toggle.toLowerCase() === "disable") { + if (guildDB.antiInvites === false) { + let embed = new MessageEmbed() + .setColor(interaction.client.color.red) + .setDescription(`${interaction.client.emoji.fail} | ${language.moduleDisabled}`) + return interaction.reply({ embeds: [embed] }) + .then(async () => { + if (logging && logging.moderation.delete_reply === "true") { + setTimeout(() => { + interaction.deleteReply().catch(() => {}); + }, 5000); + } + }) + .catch(() => {}) + } + + await Guild.findOne( + { + guildId: interaction.guild.id, + }, + async (err, guild) => { + guild.updateOne({ + antiInvites: false, + }) + .catch((err) => console.error(err)); + + let embed = new MessageEmbed() + .setColor(interaction.client.color.green) + .setDescription(`${interaction.client.emoji.success} | ${language.antiinvites3}`) + return interaction.reply({ embeds: [embed] }) + .then(async () => { + if (logging && logging.moderation.delete_reply === "true") { + setTimeout(() => { + interaction.deleteReply().catch(() => {}) + }, 5000); + } + }) + .catch(() => {}) + } + ); + return; + } + + if (toggle.toLowerCase() === "enable") { + if (guildDB.antiInvites === true) { + let embed = new MessageEmbed() + .setColor(interaction.client.color.red) + .setDescription(`${interaction.client.emoji.fail} | ${language.moduleEnabled}`) + return interaction.reply({ embeds: [embed] }) + .then(async () => { + if (logging && logging.moderation.delete_reply === "true") { + setTimeout(() => { + interaction.deleteReply().catch(() => {}); + }, 5000); + } + }) + .catch(() => {}) + } + + await Guild.findOne( + { + guildId: interaction.guild.id, + }, + async (err, guild) => { + guild.updateOne({ + antiInvites: true, + }) + .catch((err) => console.error(err)); + + let embed = new MessageEmbed() + .setColor(interaction.client.color.green) + .setDescription(`${interaction.client.emoji.success} | ${language.antiinvites4}`) + return interaction.reply({ embeds: [embed] }) + .then(async () => { + if (logging && logging.moderation.delete_reply === "true") { + setTimeout(() => { + interaction.deleteReply().catch(() => {}); + }, 5000); + } + }) + .catch(() => {}) + } + ); + return; + } + } +}; \ No newline at end of file diff --git a/src/slashCommands/config/anti-links.js b/src/slashCommands/config/anti-links.js new file mode 100644 index 0000000..14f64d3 --- /dev/null +++ b/src/slashCommands/config/anti-links.js @@ -0,0 +1,79 @@ +const { SlashCommandBuilder } = require("@discordjs/builders"); +const Guild = require("../../database/schemas/Guild"); +const Logging = require("../../database/schemas/logging"); +const { MessageEmbed } = require("discord.js"); + +module.exports = { + data: new SlashCommandBuilder() + .setName("anit-links") + .setDescription("Sets anti-links if the message contains a link") + .addStringOption((option) => option.setName("toggle").setDescription("Toggle between enable/disable").setRequired(true)), + async execute(interaction) { + const guildDB = await Guild.findOne({ + guildId: interaction.guild.id, + }); + + const language = require(`../../data/language/${guildDB.language}.json`); + + const logging = await Logging.findOne({ guildId: interaction.guild.id }); + + const toggle = interaction.options.getString("toggle"); + + if(!toggle === "enable" || !toggle === "disable") { + let embed = new MessageEmbed() + .setColor(interaction.client.color.red) + .setDescription(`${interaction.client.emoji.fail} | ${language.antiinvites1}`) + return interaction.reply({ embeds: [embed] }) + .then(async () => { + if (logging && logging.moderation.delete_reply === "true") { + setTimeout(() => { + interaction.deleteReply().catch(() => {}); + }, 5000); + } + }) + .catch(() => {}) + } + + if (toggle.toLowerCase() === "disable") { + if (guildDB.antiLinks === false) { + let embed = new MessageEmbed() + .setColor(interaction.client.color.red) + .setDescription(`${interaction.client.emoji.fail} | ${language.moduleDisabled}`) + return interaction.reply({ embeds: [embed] }) + .then(async () => { + if (logging && logging.moderation.delete_reply === "true") { + setTimeout(() => { + interaction.deleteReply().catch(() => {}); + }, 5000); + } + }) + .catch(() => {}) + }; + + await Guild.findOne( + { + guildId: interaction.guild.id, + }, + async (err, guild) => { + guild.updateOne({ + antiLinks: false, + }) + .catch((err) => console.error(err)); + + let embed = new MessageEmbed() + .setColor(interaction.client.color.green) + .setDescription(`${interaction.client.emoji.success} | ${language.antilinks3}`) + return interaction.reply({ embeds: [embed] }) + .then(async () => { + if (logging && logging.moderation.delete_reply === "true") { + setTimeout(() => { + interaction.deleteReply().catch(() => {}) + }, 5000) + } + }) + .catch(() => {}) + } + ) + } + } +} \ No newline at end of file diff --git a/src/slashCommands/config/autoresponse.js b/src/slashCommands/config/autoresponse.js new file mode 100644 index 0000000..d58dae3 --- /dev/null +++ b/src/slashCommands/config/autoresponse.js @@ -0,0 +1,118 @@ +const { SlashCommandBuilder } = require("@discordjs/builders"); +const { MessageEmbed } = require("discord.js"); +const autoResponse = require("../../database/schemas/autoResponse.js"); +const Guild = require("../../database/schemas/Guild"); +const Logging = require("../../database/schemas/logging"); + +module.exports = { + data: new SlashCommandBuilder() + .setName("autoresponse") + .setDescription("Create a auto response which is triggered without prefix!") + .addStringOption((option) => option.setName("command").setDescription("The name of the command").setRequired(true)) + .addStringOption((option) => option.setName("reply").setDescription("The reply when the command is triggered").setRequired(true)), + async execute(interaction) { + const guildDB = await Guild.findOne({ + guildId: interaction.guild.id, + }); + + const prefix = guildDB.prefix; + + const language = require(`../../data/language/${guildDB.language}.json`); + + const logging = await Logging.findOne({ guildId: interaction.guild.id }); + + const namee = interaction.options.getString("command"); + + if (!namee) { + let embed = new MessageEmbed() + .setAuthor({ + name: `${interaction.user.tag}`, + iconURL: interaction.user.displayAvatarURL({ dynamic: true }) + }) + .setDescription(`${language.properusage} \`${prefix}autoresponse \`\n\n${language.example} \`${prefix}autoresponse ping pong\``) + .setTimestamp() + .setFooter({ text: "https://mee8.ml/" }) + .setColor(interaction.guild.me.displayHexColor) + return interaction.reply({ embeds: [embed] }) + .then(async () => { + if (logging && logging.moderation.delete_reply === "true") { + setTimeout(() => { + interaction.deleteReply().catch(() => {}); + }, 5000); + } + }) + .catch(() => {}); + } + + let name = namee.toLowerCase(); + const content = interaction.options.getString("reply"); + if (!content) { + let embed = new MessageEmbed() + .setAuthor({ + name: `${interaction.user.tag}`, + iconURL: interaction.user.displayAvatarURL({ dynamic: true }) + }) + .setDescription(`${language.properusage} \`${prefix}autoresponse \`\n\n${language.example} \`${prefix}autoresponse ping pong\``) + .setTimestamp() + .setFooter({ text: "https://mee8.ml/" }) + .setColor(interaction.guild.me.displayHexColor) + return interaction.reply({ embeds: [embed] }) + .then(async () => { + if (logging && logging.moderation.delete_reply === "true") { + setTimeout(() => { + interaction.deleteReply().catch(() => {}); + }, 5000); + } + }) + .catch(() => {}); + } + + if (namee.length > 60) return interaction.reply({ content: `${interaction.client.emoji.fail} | ${language.cc1}`, ephemeral: true }); + if (content.length > 2000) return interaction.reply({ content: `${interaction.client.emoji.fail} | ${language.cc2}`, ephemeral: true }); + + if (guildDB.isPremium === "false") { + const conditional = { + guildId: interaction.guild.id, + }; + const results = await autoResponse.find(conditional); + + if (results.length >= 10) { + interaction.reply({ + embeds: [ + new MessageEmbed() + .setColor(interaction.guild.me.displayHexColor) + .setDescription(`${interaction.client.emoji.fail} | Auto Response Limit Reached **(10)**\n\n[Upgrade to Premium here for unlimited commands](https://mee8.ml/premium)`) + ], ephemeral: true + }); + + return; + } + } + + autoResponse.findOne( + { + guildId: interaction.guild.id, name, + }, + async (err, data) => { + if (!data) { + autoResponse.create({ guildId: interaction.guild.id, name, content }); + interaction.reply({ + embeds: [ + new MessageEmbed() + .setAuthor({ + name: `${interaction.user.tag}`, + iconURL: interaction.user.displayAvatarURL({ dynamic: true }) + }) + .setDescription(`**${language.cc3}** ${name}\n\nDelete the following auto response using \`${prefix}deleteresponse \``) + .setTimestamp() + .setFooter({ text: "https://mee8.ml" }) + .setColor(interaction.guild.me.displayHexColor), + ], ephemeral: true + }); + } else { + return interaction.reply({ content: `${interaction.client.emoji.fail} | ${language.cc4}` }); + } + } + ); + } +}; \ No newline at end of file diff --git a/src/slashCommands/config/config.js b/src/slashCommands/config/config.js new file mode 100644 index 0000000..c9598e5 --- /dev/null +++ b/src/slashCommands/config/config.js @@ -0,0 +1,35 @@ +const { SlashCommandBuilder } = require("@discordjs/builders"); +const Guild = require("../../database/schemas/Guild"); +const { MessageEmbed } = require("discord.js"); + +module.exports = { + data: new SlashCommandBuilder() + .setName("settings") + .setDescription("Show's the current settings for this guild"), + async execute(interaction) { + const guildDB = await Guild.findOne({ + guildId: interaction.guild.id, + }); + + const language = require(`../../data/language/${guildDB.language}.json`); + await interaction.reply({ + embeds: [ + new MessageEmbed() + .setColor(interaction.guild.me.displayHexColor) + .setTitle(`${language.serversettings1}`) + .addFields( + { name: `Main Settings`, value: `[\`Click here\`](https://mee8.ml/dashboard/${interaction.guild.id})`, inline: true }, + { name: `Welcome & Leave`, value: `[\`Click here\`](https://mee8.ml/dashboard/${interaction.guild.id}/welcome)`, inline: true }, + { name: `Logging`, value: `[\`Click here\`](https://mee8.ml/dashboard/${interaction.guild.id}/logging)`, inline: true }, + { name: `Autorole`, value: `[\`Click here\`](https://mee8.ml/dashboard/${interaction.guild.id}/autorole)`, inline: true }, + { name: `Alt Detector`, value: `[\`Click here\`](https://mee8.ml/dashboard/${interaction.guild.id}/altdetector)`, inline: true }, + { name: `Tickets`, value: `[\`Click here\`](https://mee8.ml/dashboard/${interaction.guild.id}/tickets)`, inline: true }, + { name: `Suggestions`, value: `[\`Click here\`](https://mee8.ml/dashboard/${interaction.guild.id}/suggestions)`, inline: true }, + { name: `Server Reports`, value: `[\`Click here\`](https://mee8.ml/dashboard/${interaction.guild.id}/reports)`, inline: true }, + { name: `Automod`, value: `[\`Click here\`](https://mee8.ml/dashboard/${interaction.guild.id}/automod)`, inline: true } + ) + .setFooter({ text: `${interaction.guild.name}` }), + ], + }); + } +}; \ No newline at end of file diff --git a/src/slashCommands/config/customcommand.js b/src/slashCommands/config/customcommand.js new file mode 100644 index 0000000..4542dc5 --- /dev/null +++ b/src/slashCommands/config/customcommand.js @@ -0,0 +1,103 @@ +const { SlashCommandBuilder } = require("@discordjs/builders"); +const { MessageEmbed } = require("discord.js"); +const customCommand = require("../../database/schemas/customCommand.js"); +const Guild = require("../../database/schemas/Guild"); + +module.exports = { + data: new SlashCommandBuilder() + .setName("createcommand") + .setDescription("Create a custom command") + .addStringOption((option) => option.setName("command").setDescription("The command name").setRequired(true)) + .addStringOption((option) => option.setName("reply").setDescription("The reply").setRequired(true)), + async execute(interaction) { + const guildDB = await Guild.findOne({ + guildId: interaction.guild.id + }); + + let prefix = guildDB.prefix; + + const language = require(`../../data/language/${guildDB.language}.json`); + const namee = interaction.options.getString("command"); + + if (!namee) return interaction.reply({ + embeds: [ + new MessageEmbed() + .setAuthor({ + name: `${interaction.user.tag}`, + iconURL: interaction.user.displayAvatarURL({ dynamic: true }) + }) + .setDescription(`${language.properusage} \`${prefix}customcommand \`\n\n${language.example} \`${prefix}customcommand ping pong\``) + .setTimestamp() + .setFooter({ text: "https://mee8.ml/" }) + .setColor(interaction.guild.me.displayHexColor), + ], + }); + + let name = namee.toLowerCase(); + const content = interaction.options.getString("reply"); + if (!content) return interaction.reply({ + embeds: [ + new MessageEmbed() + .setAuthor({ + name: `${interaction.user.tag}`, + iconURL: interaction.user.displayAvatarURL({ dynamic: true }) + }) + .setDescription(`${language.properusage} \`${prefix}customcommand \`\n\n${language.example} \`${prefix}customcommand ping pong\``) + .setTimestamp() + .setFooter({ text: "https://mee8.ml" }) + .setColor(interaction.guild.me.displayHexColor), + ], + }); + + if (namee.length > 30) return interaction.reply({ content: `${interaction.client.emoji.fail} | ${language.cc1}` }); + + if (content.length > 2000) return interaction.reply({ content: `${interaction.client.emoji.fail} | ${language.cc2}` }); + + if (interaction.client.botCommands.get(namee) || interaction.client.aliases.get(namee)) return interaction.reply({ content: `That command is already an existing bot command!` }); + + if (guildDB.isPremium === "false") { + const conditional = { + guildId: interaction.guild.id + }; + const results = await customCommand.find(conditional); + + if (results.length >= 10) { + interaction.reply({ + embeds: [ + new MessageEmbed() + .setColor(interaction.guild.me.displayHexColor) + .setDescription(`${interaction.client.emoji.fail} | Custom Command Limit Reached **(10)**\n\n[Upgrade to Premium Here for unlimited commands](https://mee8.ml/premium)`), + ], + }); + + return; + } + } + + customCommand.findOne( + { + guildId: interaction.guild.id, name + }, + async (err, data) => { + if (!data) { + customCommand.create({ guildId: interaction.guild.id, name, content }); + interaction.reply({ + embeds: [ + new MessageEmbed() + .setAuthor({ + name: `${interaction.user.tag}`, + iconURL: interaction.user.displayAvatarURL({ dynamic: true }) + }) + .setDescription(`**${language.cc3}** ${name}\n\nDelete the following command using \`${prefix}deletecommand \``) + .setTimestamp() + .setFooter({ text: "https://mee8.ml" }) + .setColor(interaction.guild.me.displayHexColor), + ], + }); + } else { + return interaction.reply({ content: `${interaction.client.emoji.fail} | ${language.cc4}` }); + } + } + ); + } +}; \ No newline at end of file diff --git a/src/slashCommands/config/customcommandlist.js b/src/slashCommands/config/customcommandlist.js new file mode 100644 index 0000000..83b69e3 --- /dev/null +++ b/src/slashCommands/config/customcommandlist.js @@ -0,0 +1,41 @@ +const { SlashCommandBuilder } = require("@discordjs/builders"); +const { MessageEmbed } = require("discord.js"); +const customCommand = require("../../database/schemas/customCommand.js"); +const Guild = require("../../database/schemas/Guild"); + +module.exports = { + data: new SlashCommandBuilder() + .setName("customcommandlist") + .setDescription("Show's a list of custom commands"), + async execute(interaction) { + const guildDB = await Guild.findOne({ + guildId: interaction.guild.id + }); + + const language = require(`../../data/language/${guildDB.language}.json`); + + await customCommand.find( + { + guildId: interaction.guild.id, + }, + (err, data) => { + if (!data && !data.name) return interaction.reply({ content: `${interaction.client.emoji.fail} | ${language.cc5}` }); + let array = []; + data.map((d) => array.push(d.name)); + + let embed = new MessageEmbed() + .setColor("PURPLE") + .setTitle(`${language.cc6}`) + .setFooter({ text: interaction.guild.name }); + + if (!Array.isArray(array) || !array.length) { + embed.setDescription(`${language.cc5}`); + } else { + embed.setDescription(array.join(" - ")); + } + + interaction.reply({ embeds: [embed] }); + } + ); + } +}; \ No newline at end of file diff --git a/src/slashCommands/config/deletecommand.js b/src/slashCommands/config/deletecommand.js new file mode 100644 index 0000000..1176e59 --- /dev/null +++ b/src/slashCommands/config/deletecommand.js @@ -0,0 +1,65 @@ +const { SlashCommandBuilder } = require("@discordjs/builders"); +const { MessageEmbed } = require("discord.js"); +const customCommand = require("../../database/schemas/customCommand.js"); +const Guild = require("../../database/schemas/Guild"); + +module.exports = { + data: new SlashCommandBuilder() + .setName("deletecommand") + .setDescription("Deletes a custom command") + .addStringOption((option) => option.setName("command").setDescription("The command to delete").setRequired(true)), + async execute(interaction) { + const guildDB = await Guild.findOne({ + guildId: interaction.guild.id, + }); + + let prefix = guildDB.prefix; + + const language = require(`../../data/language/${guildDB.language}.json`); + + const name = interaction.options.getString("command"); + + if (!name) return interaction.reply({ + embeds: [ + new MessageEmbed() + .setAuthor({ + name: `${interaction.user.tag}`, + iconURL: interaction.user.displayAvatarURL({ dynamic: true }) + }) + .setDescription(`${language.properusage} \`${prefix}deletecommand \`\n\n${language.example} \`${prefix}deletecommand pog\``) + .setTimestamp() + .setFooter({ text: "https://mee8.ml" }), + ], + }) + .setColor(interaction.guild.me.displayHexColor); + + if (name.length > 30) return interaction.reply({ content: `${interaction.client.emoji.fail} | ${language.cc1}` }); + + customCommand.findOne( + { + guildId: interaction.guild.id, name + }, + async (err, data) => { + if (data) { + data.delete({ guildId: interaction.guild.id, name }); + interaction.reply({ + embeds: [ + new MessageEmbed() + .setColor(interaction.guild.me.displayHexColor) + .setAuthor({ + name: `${interaction.user.tag}`, + iconURL: interaction.user.displayAvatarURL({ dynamic: true }) + }) + .setTitle(`${interaction.client.emoji.success} Delete Command`) + .setDescription(`${language.deletecmd1} **${name}**`) + .setTimestamp() + .setFooter({ text: "https://mee8.ml" }), + ], + }); + } else { + interaction.reply({ content: `${interaction.client.emoji.fail} | ${language.deletecmd2}` }); + } + } + ); + } +}; \ No newline at end of file diff --git a/src/slashCommands/config/deleteresponse.js b/src/slashCommands/config/deleteresponse.js new file mode 100644 index 0000000..ff74d89 --- /dev/null +++ b/src/slashCommands/config/deleteresponse.js @@ -0,0 +1,66 @@ +const { SlashCommandBuilder } = require("@discordjs/builders"); +const autoResponse = require("../../database/schemas/autoResponse.js"); +const Guild = require("../../database/schemas/Guild"); + +module.exports = { + data: new SlashCommandBuilder() + .setName("deleteresponse") + .setDescription("Deletes an auto response") + .addStringOption((option) => option.setName("command").setDescription("The command to delete").setRequired(true)), + async execute(interaction) { + const guildDB = await Guild.findOne({ + guildId: interaction.guild.id, + }); + + let prefix = guildDB.prefix; + + const language = require(`../../data/language/${guildDB.language}.json`); + + const name = interaction.options.getString("command"); + + if (!name) { + return interaction.reply({ + embeds: [ + new MessageEmbed() + .setAuthor({ + name: `${interaction.user.tag}`, + iconURL: interaction.user.displayAvatarURL({ dynamic: true }) + }) + .setDescription(`${language.properusage} \`${prefix}deleteresponse \`\n\n${language.example}\`${prefix}deleteresponse pog\``) + .setTimestamp() + .setFooter({ text: "https://mee8.ml" }), + ], + }) + .setColor(interaction.guild.me.displayHexColor); + + if (name.length > 30) return interaction.reply({ content: `${interaction.client.emoji.fail} | ${language.cc1}` }); + + autoResponse.findOne( + { + guildId: interaction.guild.id, name, + }, + async (err, data) => { + if (data) { + data.delete({ guildId: interaction.guild.id, name }); + interaction.reply({ + embeds: [ + new MessageEmbed() + .setColor(interaction.guild.me.displayHexColor) + .setAuthor({ + name: `${interaction.user.tag}`, + iconURL: interaction.user.displayAvatarURL({ dynamic: true }) + }) + .setTitle(`${interaction.client.emoji.success} Delete Auto Response`) + .setDescription(`${language.deletecmd1} **${name}**`) + .setTimestamp() + .setFooter({ text: "https://mee8.ml" }), + ], + }); + } else { + interaction.reply({ content: `${interaction.client.emoji.fail} | ${language.deletecmd2}` }); + } + } + ); + } + } +}; \ No newline at end of file diff --git a/src/slashCommands/config/prefix.js b/src/slashCommands/config/prefix.js new file mode 100644 index 0000000..98b661f --- /dev/null +++ b/src/slashCommands/config/prefix.js @@ -0,0 +1,61 @@ +const { SlashCommandBuilder } = require("@discordjs/builders"); +const Guild = require("../../database/schemas/Guild"); +const { MessageEmbed } = require("discord.js"); + +module.exports = { + data: new SlashCommandBuilder() + .setName("setprefix") + .setDescription("Set's the new prefix") + .addStringOption((option) => option.setName("prefix").setDescription("The new prefix to set").setRequired(true)), + async execute(interaction) { + const settings = await Guild.findOne( + { + guildId: interaction.guild.id, + }, + (err) => { + if (err) console.log(err); + } + ); + + const guildDB = await Guild.findOne({ + guildId: interaction.guild.id, + }); + + const language = require(`../../data/language/${guildDB.language}.json`); + + const pre = interaction.options.getString("prefix"); + + if(!pre[0]) { + return interaction.reply({ + embeds: [ + new MessageEmbed() + .setColor(interaction.client.color.red) + .setDescription(`${interaction.client.emoji.fail} ${language.setPrefixMissingArgument}`), + ], + }); + } + + if (pre[0].length > 5) { + return interaction.reply({ + embeds: [ + new MessageEmbed() + .setColor(interaction.client.color.red) + .setDescription(`${interaction.client.emoji.fail} | ${language.setPrefixLongLength}`), + ], + }); + } + + interaction.reply({ + embeds: [ + new MessageEmbed() + .setColor(interaction.client.color.green) + .setDescription(`${interaction.client.emoji.success} ${language.setPrefixChange.replace( + "{prefix}", pre + )}`), + ], + }); + await settings.updateOne({ + prefix: pre, + }); + } +}; \ No newline at end of file diff --git a/src/slashCommands/config/setlanguage.js b/src/slashCommands/config/setlanguage.js new file mode 100644 index 0000000..811253c --- /dev/null +++ b/src/slashCommands/config/setlanguage.js @@ -0,0 +1,52 @@ +const { SlashCommandBuilder } = require("@discordjs/builders"); +const Guild = require("../../database/schemas/Guild"); +const { MessageEmbed } = require("discord.js"); + +module.exports = { + data: new SlashCommandBuilder() + .setName("setlanguage") + .setDescription("Set a guild language") + .addStringOption((option) => option.setName("language").setDescription("The language to set").setRequired(true)), + async execute(interaction) { + const guildDB = await Guild.findOne({ + guildId: interaction.guild.id, + }); + + const language = require(`../../data/language/${guildDB.language}.json`); + + let languages = ["english", "french", "spanish", "arabic", "polish"]; + + const e = interaction.options.getString("language"); + + if (!e) { + return interaction.reply({ + embeds: [ + new MessageEmbed() + .setColor(interaction.client.color.red) + .setDescription(`${interaction.client.emoji.fail} | ${language.setLangMissingArgument}`), + ], + }); + } + + let setLangInvalidOption = language.setLangInvalidOption.replace("{languages}", languages.join(", ")); + if (!languages.includes(e.toLowerCase())) + return interaction.reply({ + embeds: [ + new MessageEmbed() + .setColor(interaction.client.color.red) + .setDescription(`${interaction.client.emoji.fail} | ${setLangInvalidOption}`), + ], + }); + + let setLangChange = language.setLangChange.replace("{language}", e.toLowerCase()); + interaction.reply({ + embeds: [ + new MessageEmbed() + .setColor(interaction.client.color.green) + .setDescription(`${interaction.client.emoji.success} | ${setLangChange}`), + ], + }); + + await guildDB.updateOne({ language: e.toLowerCase() }); + } +}; \ No newline at end of file diff --git a/src/slashCommands/config/suggestions.js b/src/slashCommands/config/suggestions.js new file mode 100644 index 0000000..d12d4c6 --- /dev/null +++ b/src/slashCommands/config/suggestions.js @@ -0,0 +1,413 @@ +const { SlashCommandBuilder } = require("@discordjs/builders"); +const Guild = require("../../database/schemas/Guild"); +const { MessageEmbed } = require("discord.js"); + +module.exports = { + data: new SlashCommandBuilder() + .setName("suggestions") + .setDescription("Enable or disable suggestions") + .addStringOption((option) => option.setName("option").setDescription("You can toggle suggestions and approve or decline them with this option.").setRequired(true)) + .addStringOption((option) => option.setName("message").setDescription("The message ID")) + .addChannelOption((option) => option.setName("channel").setDescription("Optional channel.")) + .addStringOption((option) => option.setName("reason").setDescription("The reason..")), + async execute(interaction) { + const guildDB = await Guild.findOne({ + guildId: interaction.guild.id, + }); + + const language = require(`../../data/language/${guildDB.language}.json`); + + const option = interaction.options.getString("option"); + + let prefix = guildDB.prefix; + let fail = interaction.client.emoji.fail; + let properUsage = new MessageEmbed() + .setColor(interaction.client.color.red) + .setDescription(`${language.suggesting7.replace(/{prefix}/g, `${prefix}`)}`) + .setFooter({ text: "https://mee8.ml" }); + + if (option.length < 1) { + return interaction.reply({ embeds: [properUsage] }); + } + + if (option.includes("disable")) { + if (guildDB.suggestion.suggestionChannelID === null) + return interaction.reply({ + embeds: [ + new MessageEmbed() + .setColor(interaction.client.color.red) + .setDescription(`${interaction.client.emoji.fail} | ${language.suggesting8}`) + .setFooter({ text: "https://mee8.ml" }), + ], ephemeral: true + }); + await Guild.findOne( + { + guildId: interaction.guild.id, + }, + async (err, guild) => { + guild.suggestion.suggestionChannelID = null; + await guild.save().catch(() => {}); + + return interaction.reply({ + embeds: [ + new MessageEmbed() + .setColor(interaction.client.color.green) + .setDescription(`${interaction.client.emoji.success} | ${language.suggesting9}`) + .setFooter({ text: "https://mee8.ml" }), + ], ephemeral: true + }); + } + ); + return; + } else if (option.includes("enable")) { + const channel = interaction.options.getChannel("channel"); + + if(!channel) return interaction.reply({ embeds: [properUsage], ephemeral: true }); + if (guildDB.suggestion.suggestionChannelID === channel.id) + return interaction.reply({ + embeds: [ + new MessageEmbed() + .setColor(interaction.client.color.red) + .setDescription(`${fail} | ${channel} ${language.suggesting10}`) + .setFooter({ text: "https://mee8.ml" }), + ], ephemeral: true + }); + await Guild.findOne( + { + guildId: interaction.guild.id, + }, + async (err, guild) => { + guild.suggestion.suggestionChannelID = channel.id; + await guild.save().catch(() => {}); + + return interaction.reply({ + embeds: [ + new MessageEmbed() + .setColor(interaction.client.color.green) + .setDescription(`${interaction.client.emoji.success} | ${language.suggesting11} ${channel}`), + ], ephemeral: true + }); + } + ); + } else if (option.includes("approve") || option.includes("accept")) { + if (guildDB.suggestion.decline == "false") { + return interaction.reply({ + embeds: [ + new MessageEmbed() + .setAuthor({ + name: `${interaction.user.tag}`, + iconURL: interaction.user.displayAvatarURL({ format: "png" }) + }) + .setDescription(`${fail} Staff can't approve or decline suggestions in this guild.`) + .setFooter({ text: "https://mee8.ml" }) + .setTimestamp() + .setColor("RED"), + ], + }); + } + if (!guildDB.suggestion.suggestionChannelID || !guildDB.suggestion.suggestionChannelID === null) + return interaction.reply({ + embeds: [ + new MessageEmbed() + .setAuthor({ + name: `${interaction.user.tag}`, + iconURL: interaction.user.displayAvatarURL({ format: "png" }) + }) + .setDescription(`${fail} | ${language.suggesting1}`) + .setFooter({ text: "https://mee8.ml" }) + .setTimestamp() + .setColor("RED"), + ], ephemeral: true + }); + + let suggestion = guildDB.suggestion.suggestionChannelID; + let channel = interaction.guild.channels.cache.get(suggestion); + if(!channel) + return interaction.reply({ + embeds: [ + new MessageEmbed() + .setAuthor({ + name: `${interaction.user.tag}`, + iconURL: interaction.user.displayAvatarURL({ format: "png" }) + }) + .setDescription(`${fail} | ${language.suggesting12}`) + .setFooter({ text: "https://mee8.ml" }) + .setTimestamp() + .setColor("RED"), + ], + }); + + let message = interaction.options.getString("message"); + if (!message) + return interaction.reply({ + embeds: [ + new MessageEmbed() + .setAuthor({ + name: `${interaction.user.tag}`, + iconURL: interaction.user.displayAvatarURL({ format: "png" }) + }) + .setDescription(`${fail} | ${language.suggesting12}`) + .setFooter({ text: "https://mee8.ml" }) + .setTimestamp() + .setColor("RED"), + ], ephemeral: true + }); + + try { + var suggestionMsg = await channel.messages.fetch(message); + } catch (e) { + interaction.reply({ + embeds: [ + new MessageEmbed() + .setAuthor({ + name: `${interaction.user.tag}`, + iconURL: interaction.user.displayAvatarURL({ format: "png" }) + }) + .setDescription(`${fail} | ${language.suggesting13}`) + .setFooter({ text: "https://mee8.ml" }) + .setTimestamp() + .setColor("RED"), + ], ephemeral: true + }); + return; + } + + let description = suggestionMsg.embeds[0].description; + + if (suggestionMsg.embeds[0].title !== `${language.suggesting3}`) { + if (suggestionMsg.embeds[0].title === `${language.suggesting14}`) { + interaction.reply({ + embeds: [ + new MessageEmbed() + .setAuthor({ + name: `${interaction.user.tag}`, + iconURL: interaction.user.displayAvatarURL({ format: "png" }) + }) + .setDescription(`${fail} | ${language.suggesting15}`) + .setFooter({ text: "https://mee8.ml" }) + .setTimestamp() + .setColor("RED"), + ], ephemeral: true + }); + } else { + interaction.reply({ + embeds: [ + new MessageEmbed() + .setAuthor({ + name: `${interaction.user.tag}`, + iconURL: interaction.user.displayAvatarURL({ format: "png" }) + }) + .setDescription(`${fail} | ${language.suggesting16}`) + .setFooter({ text: "https://mee8.ml" }) + .setTimestamp() + .setColor("RED"), + ], ephemeral: true + }); + } + + return; + } + let reason = interaction.options.getString("reason") || `${language.noReasonProvided}`; + var acceptReason = reason; + if (!acceptReason) acceptReason = `${language.noReasonProvided}`; + if (reason.length > 600) + return interaction.reply({ + embeds: [ + new MessageEmbed() + .setAuthor({ + name: `${interaction.user.tag}`, + iconURL: interaction.user.displayAvatarURL({ format: "png" }) + }) + .setDescription(`${fail} | ${language.suggesting17}`) + .setFooter({ text: "https://mee8.ml" }) + .setTimestamp() + .setColor("RED"), + ], + }); + + const editedEmbed = new MessageEmbed() + .setColor("#2bff80") + .setTitle(`${language.suggesting14}`) + .setDescription(`${description}\n\n**${language.suggesting18}**\n__**${language.reason}**__ ${acceptReason}\n__**${language.suggesting19}*__ ${interaction.user}`); + + suggestionMsg.edit({ embeds: [editedEmbed] }); + suggestionMsg.reactions.removeAll(); + interaction.reply({ + embeds: [ + new MessageEmbed() + .setAuthor({ + name: `${interaction.user.tag}`, + iconURL: interaction.user.displayAvatarURL({ format: "png" }) + }) + .setDescription(`${interaction.client.emoji.success} | ${language.suggesting20} ${channel}\n\n__**${language.reason}**__ ${acceptReason}`) + .setFooter({ text: "https://mee8.ml" }) + .setTimestamp() + .setColor("GREEN"), + ], + }) + .then(() => { + setTimeout(() => { + interaction.deleteReply().catch(() => {}) + }, 10000); + }); + } else if (option.includes("decline") || option.includes("deny")) { + if (guildDB.suggestion.decline == "false") { + return interaction.reply({ + embeds: [ + new MessageEmbed() + .setAuthor({ + name: `${interaction.user.tag}`, + iconURL: interaction.user.displayAvatarURL({ format: "png" }) + }) + .setDescription(`${fail} | Staff con't approve or decline suggestions in this guild.`) + .setFooter({ text: "https://mee8.ml" }) + .setTimestamp() + .setColor("RED"), + ], + }); + } + if (!guildDB.suggestion.suggestionChannelID || !guildDB.suggestion.suggestChannelID === null) + return interaction.reply({ + embeds: [ + new MessageEmbed() + .setAuthor({ + name: `${interaction.user.tag}`, + iconURL: interaction.user.displayAvatarURL({ format: "png" }) + }) + .setDescription(`${fail} | ${language.suggesting1}`) + .setFooter({ text: "https://mee8.ml" }) + .setTimestamp() + .setColor("RED"), + ], + }); + + let suggestion = guildDB.suggestion.suggestionChannelID; + let channel = interaction.guild.channels.cache.get(suggestion); + if (!channel) + return interaction.reply({ + embeds: [ + new MessageEmbed() + .setAuthor({ + name: `${interaction.user.tag}`, + iconURL: interaction.user.displayAvatarURL({ format: "png" }) + }) + .setDescription(`${fail} | ${language.suggesting2}`) + .setFooter({ text: "https://mee8.ml" }) + .setTimestamp() + .setColor("RED"), + ], + }); + + let message = interaction.options.getString("message"); + if (!message) + return interaction.reply({ + embeds: [ + new MessageEmbed() + .setAuthor({ + name: `${interaction.user.tag}`, + iconURL: interaction.user.displayAvatarURL({ format: "png" }) + }) + .setDescription(`${fail} | ${language.suggesting12}`) + .setFooter({ text: "https://mee8.ml" }) + .setTimestamp() + .setColor("RED"), + ], + }); + + try { + suggestionMsg = await channel.messages.fetch(message); + } catch (e) { + interaction.reply({ + embeds: [ + new MessageEmbed() + .setAuthor({ + name: `${interaction.user.tag}`, + iconURL: interaction.user.displayAvatarURL({ format: "png" }) + }) + .setDescription(`${fail} | ${language.suggesting13}`) + .setFooter({ text: "https://mee8.ml" }) + .setTimestamp() + .setColor("RED"), + ], + }); + return; + } + + if (suggestionMsg.embeds[0].title !== `${language.suggesting3}`) { + if (suggestionMsg.embeds[0].title === `${language.suggesting14}`) { + interaction.reply({ + embeds: [ + new MessageEmbed() + .setAuthor({ + name: `${interaction.user.tag}`, + iconURL: interaction.user.displayAvatarURL({ format: "png" }) + }) + .setDescription(`${fail} | ${language.suggesting15}`) + .setFooter({ text: "https://mee8.ml" }) + .setTimestamp() + .setColor("RED"), + ], + }); + } else { + interaction.reply({ + embeds: [ + new MessageEmbed() + .setAuthor({ + name: `${interaction.user.tag}`, + iconURL: interaction.user.displayAvatarURL({ format: "png" }) + }) + .setDescription(`${fail} | ${language.suggesting16}`) + .setFooter({ text: "https://mee8.ml" }) + .setTimestamp() + .setColor("RED"), + ], + }); + } + + return; + } + let reason = interaction.options.getString("reason") || `${language.noReasonProvided}`; + acceptReason = reason; + if (!acceptReason) acceptReason = `${language.noReasonProvided}`; + + if (reason.length > 600) + return interaction.reply({ + embeds: [ + new MessageEmbed() + .setAuthor({ + name: `${interaction.user.tag}`, + iconURL: interaction.user.displayAvatarURL({ format: "png" }) + }) + .setDescription(`${fail} | ${language.suggesting17}`) + .setFooter({ text: "https://mee8.ml" }) + .setTimestamp() + .setColor("RED"), + ], + }); + + suggestionMsg.reactions.removeAll(); + interaction.reply({ + embeds: [ + new MessageEmbed() + .setAuthor({ + name: `${interaction.user.tag}`, + iconURL: interaction.user.displayAvatarURL({ format: "png" }) + }) + .setDescription(`${interaction.client.emoji.success} | ${language.suggesting24} ${channel}\n\n__**${language.reason}**__ ${acceptReason}`) + .setFooter({ text: "https://mee8.ml" }) + .setTimestamp() + .setColor("GREEN"), + ], + }) + .then(() => { + setTimeout(() => { + interaction.deleteReply().catch(() => {}); + }, 10000); + }); + } else if (option) { + interaction.reply({ embeds: [properUsage] }); + } else { + interaction.reply({ embeds: [properUsage] }); + } + } +}; \ No newline at end of file diff --git a/src/slashCommands/config/tempvc.js b/src/slashCommands/config/tempvc.js new file mode 100644 index 0000000..57038b1 --- /dev/null +++ b/src/slashCommands/config/tempvc.js @@ -0,0 +1,314 @@ +const { SlashCommandBuilder } = require("@discordjs/builders"); +const Guild = require("../../database/schemas/Guild"); +const Vc = require("../../database/schemas/tempvc"); +const { MessageEmbed } = require("discord.js"); +const mongoose = require("mongoose"); + +module.exports = { + data: new SlashCommandBuilder() + .setName("tempvc") + .setDescription(" Enable/disable tempvc") + .addStringOption((option) => option.setName("toggle").setDescription("Enable or disable tempvc").setRequired(true)), + async execute(interaction) { + const guildDB = await Guild.findOne({ + guildId: interaction.guild.id, + }); + + const vcDB = await Vc.findOne( + { + guildId: interaction.guild.id, + }, + (err, guild) => { + if (err) console.error(err); + if (!guild) { + const newGuild = new Vc({ + _id: mongoose.Types.ObjectId(), + guildId: interaction.guild.id, + channelId: null, + categoryID: null, + }); + + newGuild.save().catch((err) => console.error(err)); + + return; + } + } + ); + + const language = require(`../../data/language/${guildDB.language}.json`); + + const toggle = interaction.options.getString("toggle"); + + let prefix = guildDB.prefix; + let fail = interaction.client.emoji.fail; + + let properUsage = new MessageEmbed() + .setColor(interaction.guild.me.displayHexColor) + .setDescription(`${language.tempvc1.replace(/{prefix}/g, `${prefix}`)}`) + .setFooter({ text: "https://mee8.ml" }); + + if (toggle.length < 1) { + return interaction.reply({ embeds: [properUsage] }); + } + + if (toggle.includes("disable") || toggle.includes("off")) { + if (!interaction.member.permissions.has("MANAGE_CHANNELS")) return interaction.reply({ + embeds: [ + new MessageEmbed() + .setAuthor({ + name: `${interaction.user.tag}`, + iconURL: interaction.user.displayAvatarURL({ dynamic: true }) + }) + .setTitle(`${fail} | ${language.missingUser}`) + .setDescription(`${language.tempvc2}`) + .setTimestamp() + .setFooter({ text: "https://mee8.ml" }), + ], + }) + .setColor(interaction.guild.me.displayHexColor); + + if (!vcDB.channelId || !vcDB.categoryID || !vcDB.guildId || !vcDB.channelId === null) return interaction.reply({ + embeds: [ + new MessageEmbed() + .setColor(interaction.client.color.red) + .setDescription(`${interaction.client.emoji.fail} | ${language.tempvc3}`) + .setFooter({ text: "https://mee8.ml" }), + ], + }); + await Vc.findOne( + { + guildId: interaction.guild.id, + }, + async (err, guild) => { + let voiceID = guild.channelId; + let categoryID = guild.categoryID; + + let voice = interaction.client.channels.cache.get(voiceID); + if (voice) voice.delete().catch(() => {}); + + let category = interaction.client.channels.cache.get(categoryID); + if (category) category.delete().catch(() => {}); + + if (!guild) { + Vc.create({ + guildId: interaction.guild.id, + channelId: null, + categoryID: null, + }); + + return; + } else { + guild.updateOne({ + channelId: null, + categoryID: null, + }) + .catch((err) => console.error(err)); + } + + return interaction.reply({ + embeds: [ + new MessageEmbed() + .setColor(interaction.client.color.green) + .setDescription(`${interaction.client.emoji.success} | ${language.tempvc4}`) + .setFooter({ text: "https://mee8.ml" }), + ], ephemeral: true + }); + } + ); + return; + } else if (toggle.includes("enable") || toggle.includes("on")) { + if (!interaction.member.permissions.has("MANAGE_CHANNELS")) return interaction.reply({ + embeds: [ + new MessageEmbed() + .setAuthor({ + name: `${interaction.user.tag}`, + iconURL: interaction.user.displayAvatarURL({ dynamic: true }) + }) + .setTitle(`${fail} ${language.missingUser}`) + .setDescription(`${language.tempvc2}`) + .setTimestamp() + .setFooter({ text: "https://mee8.ml" }), + ], ephemeral: true + }) + .setColor(interaction.guild.me.displayHexColor); + + try { + const embed = new MessageEmbed() + .setAuthor({ + name: `${language.tempvc5}`, + iconURL: `https://www.creeda.co.in/Images/loader.gif` + }) + .setDescription(`\`${language.tempvc6}\``) + .setColor(interaction.guild.me.displayHexColor); + const msg = await interaction.reply({ embeds: [embed] }); + + let category = interaction.guild.channels.cache.find((c) => c.name.toLowerCase() == "join to create" && c.type == "GUILD_CATEGORY"); + setTimeout(async () => { + if (!category) { + await embed.setDescription(`**${language.tempvc7}**`) + .setFooter({ text: `MEE8 v2.5` }) + .setTimestamp(); + interaction.editReply({ embeds: [embed] }) + interaction.guild.channels.create(`Join to Create`, { + type: "GUILD_CATEGORY", + permissionOverwrites: [ + { + id: interaction.guild.id, + allow: ["VIEW_CHANNEL"], + }, + { + id: interaction.user.id, + allow: ["VIEW_CHANNEL"], + }, + ], + }); + return; + } else { + embed.setDescription(`**${language.tempvc8}**\n\nID: ${category.id}`) + .setFooter({ text: `MEE8 v2.5` }) + .setTimestamp(); + interaction.editReply({ embeds: [embed] }); + } + }, 2000); + + let voice = interaction.guild.channels.cache.find((c) => c.name.toLowerCase() == "join to create" && c.type == "GUILD_VOICE"); + + setTimeout(async () => { + if (!voice) { + await embed.setDescription(`**${language.tempvc9}**`) + .setFooter({ text: `MEE8 v2.5` }) + .setTimestamp(); + interaction.editReply({ embeds: [embed] }) + interaction.guild.channels.create("Join to create", { + type: "GUILD_VOICE", + permissionOverwrites: [ + { + id: interaction.guild.id, + allow: ["VIEW_CHANNEL"], + }, + { + id: interaction.user.id, + allow: ["VIEW_CHANNEL"], + }, + ], + }) + .then(() => { + if (!category) return; + interaction.setParent(category.id).catch(() => {}); + }); + + return; + } else { + embed.setDescription(`**${language.tempvc10}**\n\nID: ${voice.id}`) + .setFooter({ text: `MEE8 v2.5` }) + .setTimestamp(); + interaction.editReply({ embeds: [embed] }) + } + }, 2000); + + setTimeout(async () => { + if (!voice || !category) { + embed.setAuthor(`Setup Fail`) + .setDescription(`${language.tempvc11.replace(/{prefix}/g, `${prefix}`)}`) + .setFooter({ text: `MEE8 v2.5` }) + .setTimestamp(); + interaction.editReply({ embeds: [embed] }); + await Vc.findOne( + { + guildId: interaction.guild.id, + }, + async (err, guild) => { + if (!guild) { + Vc.create({ + guildId: interaction.guild.id, + channelId: null, + categoryID: null, + }); + + return; + } else { + guild.updateOne({ + channelId: null, + categoryID: null, + }) + .catch((err) => console.error(err)); + } + } + ); + + return; + } else { + let channelVoice = interaction.client.channels.cache.get(voice.id); + let channelInv = await channelVoice.createInvite({ + maxAge: 0, + maxUses: 0, + }) + .catch(() => {}); + voice.setParent(category.id); + embed.setAuthor(`${language.tempvc12}`, `https://mee8.ml/logo.png`, `${channelInv}`) + .setDescription(`**${language.tempvc13}** ${category.name}\n**${language.tempvc13} ID:** ${category.id}\n\n**${language.tempvc14}** ${voice.name}\n**${language.tempvc14} ID:** ${voice.id}\n\n${language.tempvc15} \`${prefix}tempvc off\``) + .setFooter({ text: `MEE8 v2.5` }) + .setTimestamp(); + interaction.editReply({ embeds: [embed] }); + if (channelInv && channelVoice) + interaction.followUp({ content: `${channelInv}` }); + await Vc.findOne( + { + guildId: interaction.guild.id, + }, + async (err, guild) => { + if (!guild) { + Vc.create({ + guildId: interaction.guild.id, + channelId: voice.id, + categoryID: category.id, + }); + + return; + } else { + guild.updateOne({ + channelId: voice.id, + categoryID: category.id, + }) + .catch((err) => console.error(err)); + } + } + ); + } + }, 2000); + } catch { + interaction.reply({ + embeds: [ + new MessageEmbed() + .setDescription(`${language.tempvc16}`) + .setColor(`RED`), + ], + }); + await Vc.findOne( + { + guildId: interaction.guild.id, + }, + async (err, guild) => { + if (!guild) { + Vc.create({ + guildId: interaction.guild.id, + channelId: null, + categoryID: null, + }); + + return; + } else { + guild.updateOne({ + channelId: null, + categoryID: null, + }) + .catch((err) => console.error(err)); + } + } + ); + } + } else if (toggle[0]) { + interaction.reply({ embeds: [properUsage] }) + } else { + interaction.reply({ embeds: [properUsage] }) + } + } +}; \ No newline at end of file From effd7e0a3e8953bdabbe8c9274cb718d23b972ce Mon Sep 17 00:00:00 2001 From: eYuM <101909226+eYuM-coder@users.noreply.github.com> Date: Mon, 6 Mar 2023 09:52:18 -0700 Subject: [PATCH 29/70] Create quote.js --- src/slashCommands/fun/quote.js | 35 ++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 src/slashCommands/fun/quote.js diff --git a/src/slashCommands/fun/quote.js b/src/slashCommands/fun/quote.js new file mode 100644 index 0000000..e01747d --- /dev/null +++ b/src/slashCommands/fun/quote.js @@ -0,0 +1,35 @@ +const { SlashCommandBuilder } = require("@discordjs/builders"); +const Guild = require("../../database/schemas/Guild"); + +module.exports = { + data: new SlashCommandBuilder() + .setName("quote") + .setDescription("Make a quoted text!") + .addStringOption((option) => option.setName("text").setDescription("The text to quote").setRequired(true)) + .addChannelOption((option) => option.setName("channel").setDescription("This is optional")), + async execute(interaction) { + const guildDB = await Guild.findOne({ + guildId: interaction.guild.id, + }); + + const language = require(`../../data/language/${guildDB.language}.json`); + + if(!interaction.member.permissions.has("MANAGE_MESSAGES")) return interaction.reply({ content: `${language.managemessages}` }); + + let channel = interaction.options.getChannel("channel") || interaction.channel; + + if (channel.type != "GUILD_TEXT" || !channel.viewable) return interaction.reply({ content: `${language.notaccessible}` }); + + const text = interaction.options.getString("text"); + + if (!text) return interaction.reply({ content: `${language.whatdoIsay}` }); + + if (!channel.permissionsFor(interaction.guild.me).has(["SEND_MESSAGES"])) return interaction.reply({ content: `${language.sendmessages}` }); + + if (!channel.permissionsFor(interaction.member).has(["SEND_MESSAGES"]))return interaction.reply({ content: `${language.userSendMessages}` }); + + interaction.reply({ content: `Your message has been quoted.`, ephemeral: true }); + + channel.send(`>>> ${text}`, { disableMentions: "everyone" }).catch(() => {}); + } +}; From b435373e4165881dd54543b1f009cb1e51625e40 Mon Sep 17 00:00:00 2001 From: eYuM <101909226+eYuM-coder@users.noreply.github.com> Date: Mon, 6 Mar 2023 09:53:43 -0700 Subject: [PATCH 30/70] finishing this later I am almost done with this category, just got to convert the "rate" command and then this will be complete. --- src/slashCommands/fun/asciify.js | 28 + src/slashCommands/fun/bean.js | 77 + src/slashCommands/fun/birdfact.js | 27 + src/slashCommands/fun/catfact.js | 20 + src/slashCommands/fun/coinflip.js | 33 + src/slashCommands/fun/dicksize.js | 25 + src/slashCommands/fun/dm.js | 71 + src/slashCommands/fun/dogfact.js | 21 + src/slashCommands/fun/emojify.js | 58 + src/slashCommands/fun/explode.js | 16 + src/slashCommands/fun/f.js | 42 + src/slashCommands/fun/gayrate.js | 38 + src/slashCommands/fun/hack.js | 83 + src/slashCommands/fun/helo.js | 17 + src/slashCommands/fun/joke.js | 28 + src/slashCommands/fun/kaomoji.js | 3413 +++++++++++++++++++++++++++ src/slashCommands/fun/kill.js | 57 + src/slashCommands/fun/m.js | 10 + src/slashCommands/fun/nuke.js | 11 + src/slashCommands/fun/pickupline.js | 59 + src/slashCommands/fun/reverse.js | 27 + src/slashCommands/fun/say.js | 26 + src/slashCommands/fun/vaporwave.js | 36 + 23 files changed, 4223 insertions(+) create mode 100644 src/slashCommands/fun/asciify.js create mode 100644 src/slashCommands/fun/bean.js create mode 100644 src/slashCommands/fun/birdfact.js create mode 100644 src/slashCommands/fun/catfact.js create mode 100644 src/slashCommands/fun/coinflip.js create mode 100644 src/slashCommands/fun/dicksize.js create mode 100644 src/slashCommands/fun/dm.js create mode 100644 src/slashCommands/fun/dogfact.js create mode 100644 src/slashCommands/fun/emojify.js create mode 100644 src/slashCommands/fun/explode.js create mode 100644 src/slashCommands/fun/f.js create mode 100644 src/slashCommands/fun/gayrate.js create mode 100644 src/slashCommands/fun/hack.js create mode 100644 src/slashCommands/fun/helo.js create mode 100644 src/slashCommands/fun/joke.js create mode 100644 src/slashCommands/fun/kaomoji.js create mode 100644 src/slashCommands/fun/kill.js create mode 100644 src/slashCommands/fun/m.js create mode 100644 src/slashCommands/fun/nuke.js create mode 100644 src/slashCommands/fun/pickupline.js create mode 100644 src/slashCommands/fun/reverse.js create mode 100644 src/slashCommands/fun/say.js create mode 100644 src/slashCommands/fun/vaporwave.js diff --git a/src/slashCommands/fun/asciify.js b/src/slashCommands/fun/asciify.js new file mode 100644 index 0000000..9b055b1 --- /dev/null +++ b/src/slashCommands/fun/asciify.js @@ -0,0 +1,28 @@ +const { SlashCommandBuilder } = require("@discordjs/builders"); +const figlet = require("util").promisify(require("figlet")); +const Guild = require("../../database/schemas/Guild"); + +module.exports = { + data: new SlashCommandBuilder() + .setName("asciify") + .setDescription("Asciify a text") + .addStringOption((option) => option.setName("text").setDescription("The text to asciify").setRequired(true)), + async execute(interaction) { + const guildDB = await Guild.findOne({ + guildId: interaction.guild.id + }); + + const language = require(`../../data/language/${guildDB.language}.json`); + + const text = interaction.options.getString("text"); + + if (text.length < 1) { + return interaction.reply({ content: `${interaction.client.emoji.fail} ${language.changeErrorValid}` }); + } + + return interaction.reply(await figlet(text), { code: true }) + .catch(() => { + interaction.reply(`${language.bigError}`) + }); + } +}; \ No newline at end of file diff --git a/src/slashCommands/fun/bean.js b/src/slashCommands/fun/bean.js new file mode 100644 index 0000000..b6def99 --- /dev/null +++ b/src/slashCommands/fun/bean.js @@ -0,0 +1,77 @@ +const { SlashCommandBuilder } = require("@discordjs/builders"); +const { MessageEmbed } = require("discord.js"); +const Logging = require("../../database/schemas/logging.js"); + +module.exports = { + data: new SlashCommandBuilder() + .setName("bean") + .setDescription("Beans a user") + .addUserOption((option) => option.setName("member").setDescription("The member to bean").setRequired(true)) + .addStringOption((option) => option.setName("reason").setDescription("The reason to bean")), + async execute(interaction) { + const logging = await Logging.findOne({ + guildId: interaction.guild.id + }); + const client = interaction.client; + const member = interaction.options.getMember("member") + const reason = interaction.options.getString("reason") + + if(!member) { + let usernotfound = new MessageEmbed() + .setColor(client.color.red) + .setDescription(`${client.emoji.fail} | I couldn't find that user.`) + .setTimestamp() + return interaction.reply({ embeds: [usernotfound] }) + .then(async () => { + if (logging && logging.moderation.delete_reply === "true") { + setTimeout(() => { + interaction.deleteReply().catch(() => {}); + }, 5000); + } + }) + .catch(() => {}); + } + + if(member.id === interaction.member.id) { + let beanselferror = new MessageEmbed() + .setColor(client.color.red) + .setDescription(`${client.emoji.fail} | <@${interaction.member.id}>, You can't bean yourself.`) + return interaction.reply({ embeds: [beanselferror] }) + .then(async () => { + if (logging && logging.moderation.delete_reply === "true") { + setTimeout(() => { + interaction.deleteReply().catch(() => {}); + }, 5000) + } + }) + .catch(() => {}); + } + + if(member.roles.highest.position >= interaction.member.roles.highest.position) { + let rolesmatch = new MessageEmbed() + .setColor(client.color.red) + .setDescription(`${client.emoji.fail} | They have more power than you or have equal power as you do!`) + .setTimestamp() + return interaction.reply({ embeds: [rolesmatch] }) + .then(async () => { + if (logging && logging.moderation.delete_reply === "true") { + setTimeout(() => { + interaction.deleteReply().catch(() => {}); + }, 5000) + } + }) + .catch(() => {}); + } + + if(member) { + let embed = new MessageEmbed() + .setColor("BLURPLE") + .setDescription(`${client.emoji.success} | <@${member.id}> has been **beaned** | \`${reason || `You have been beaned by ${interaction.user.tag}`}\``) + .setTimestamp() + return interaction.reply({ embeds: [embed] }) + } else { + return interaction.reply(`I can't bean them, make sure that my role is above their role.`) + } + return undefined + } +}; \ No newline at end of file diff --git a/src/slashCommands/fun/birdfact.js b/src/slashCommands/fun/birdfact.js new file mode 100644 index 0000000..cd0f3d7 --- /dev/null +++ b/src/slashCommands/fun/birdfact.js @@ -0,0 +1,27 @@ +const { SlashCommandBuilder } = require("@discordjs/builders"); +const fetch = require("node-fetch"); +const axios = require("axios"); +const { MessageEmbed } = require("discord.js"); + +module.exports = { + data: new SlashCommandBuilder() + .setName("birdfact") + .setDescription("Generate random bird facts"), + async execute(interaction) { + const res = await fetch("https://some-random-api.ml/facts/bird").catch(() => {}); + + const fact = (await res.json()).fact; + + if (!res) { + return interaction.reply({ content: `The API is currectly down, come back later!`, ephemeral: true }); + } + interaction.reply({ + embeds: [ + new MessageEmbed() + .setColor(interaction.client.color.blue) + .setDescription(`${fact}`) + .setFooter({ text: "/some-random-api/bird" }), + ], + }); + } +}; \ No newline at end of file diff --git a/src/slashCommands/fun/catfact.js b/src/slashCommands/fun/catfact.js new file mode 100644 index 0000000..7f228f4 --- /dev/null +++ b/src/slashCommands/fun/catfact.js @@ -0,0 +1,20 @@ +const { SlashCommandBuilder } = require("@discordjs/builders"); +const fetch = require("node-fetch"); +const axios = require("axios"); +const { MessageEmbed } = require("discord.js"); + +module.exports = { + data: new SlashCommandBuilder() + .setName("catfact") + .setDescription("Generate random cat facts"), + async execute(interaction) { + const res = await fetch("https://catfact.ninja/fact").catch(() => {}) + const fact = (await res.json()).fact; + const embed = new MessageEmbed() + .setDescription(`${fact}`) + .setFooter({ text: `/catfact.ninja/fact` }) + .setTimestamp() + .setColor(interaction.client.color.blue); + interaction.reply({ embeds: [embed] }).catch(() => {}); + } +}; \ No newline at end of file diff --git a/src/slashCommands/fun/coinflip.js b/src/slashCommands/fun/coinflip.js new file mode 100644 index 0000000..448fa8f --- /dev/null +++ b/src/slashCommands/fun/coinflip.js @@ -0,0 +1,33 @@ +const { SlashCommandBuilder } = require("@discordjs/builders"); +const { MessageEmbed } = require("discord.js"); +const Guild = require("../../database/schemas/Guild"); + +module.exports = { + data: new SlashCommandBuilder() + .setName("coinflip") + .setDescription("Flip a coin"), + async execute(interaction) { + const client = interaction.client; + const guildDB = await Guild.findOne({ + guildId: interaction.guild.id, + }); + + const language = require(`../../data/language/${guildDB.language}.json`); + + const n = Math.floor(Math.random() * 2); + let result; + if (n === 1) result = "heads"; + else result = "tails"; + + const embed = new MessageEmbed() + .setDescription(`\`${language.flippingCoin}\``) + .setColor(interaction.guild.me.displayHexColor); + + const msg = await interaction.reply({ embeds: [embed] }); + + const embe2 = new MessageEmbed() + .setDescription(`${language.coiniflippedacoinfor} ${interaction.member}, ${language.coinitwas} **${result}**`) + .setColor(client.color.blue); + interaction.editReply({ embeds: [embe2] }).catch(() => {}); + } +}; \ No newline at end of file diff --git a/src/slashCommands/fun/dicksize.js b/src/slashCommands/fun/dicksize.js new file mode 100644 index 0000000..1bd6a66 --- /dev/null +++ b/src/slashCommands/fun/dicksize.js @@ -0,0 +1,25 @@ +const { SlashCommandBuilder } = require("@discordjs/builders"); +const { MessageEmbed } = require("discord.js"); + +module.exports = { + data: new SlashCommandBuilder() + .setName("dicksize") + .setDescription("Shows your pp size") + .addUserOption((option) => option.setName("member").setDescription("This is optional.")), + async execute(interaction) { + let user = interaction.options.getMember("member") + + if (!user) { + user = interaction.member; + } + const size = (user.id.slice(-3) % 20) + 1; + const sizee = size / 2.54; + await interaction.reply({ + embeds: [ + new MessageEmbed() + .setColor("BLURPLE") + .setDescription(`${sizee.toFixed(2)} inch(s)\n8${"=".repeat(size)}D`) + ] + }) + } +} \ No newline at end of file diff --git a/src/slashCommands/fun/dm.js b/src/slashCommands/fun/dm.js new file mode 100644 index 0000000..50e73c7 --- /dev/null +++ b/src/slashCommands/fun/dm.js @@ -0,0 +1,71 @@ +const { SlashCommandBuilder } = require("@discordjs/builders"); +const Logging = require("../../database/schemas/logging"); +const { MessageEmbed } = require("discord.js"); + +module.exports = { + data: new SlashCommandBuilder() + .setName("dm") + .setDescription("DMs a user") + .addUserOption((option) => option.setName("member").setDescription("The user to dm").setRequired(true)) + .addStringOption((option) => option.setName("message").setDescription("The message to send to the user.").setRequired(true)), + async execute(interaction) { + const client = interaction.client; + const logging = await Logging.findOne({ guildId: interaction.guild.id }) + + const member = interaction.options.getMember("member") + const message = interaction.options.getString("message") + + if(!member) { + const embed = new MessageEmbed() + .setDescription(`${client.emoji.fail} | Please provide a valid member!`) + .setColor(client.color.red) + return interaction.reply({ embeds: [embed] }) + .then(async () => { + if (logging && logging.moderation.delete_reply === "true") { + setTimeout(() => { + interaction.deleteReply().catch(() => {}) + }, 5000) + } + }) + .catch(() => {}) + } + + if (member.id === interaction.member.id) { + const embed = new MessageEmbed() + .setDescription(`${client.emoji.success} | That was kind of... Ok..? But why would you dm yourself?`) + .setColor(client.color.green) + interaction.reply({ embeds: [embed] }) + .then(async () => { + if (logging && logging.moderation.delete_reply === "true") { + setTimeout(() => { + interaction.deleteReply().catch(() => {}); + }, 5000) + } + }) + .catch(() => {}); + const dmEmbed = new MessageEmbed() + .setTitle(`Why are you DMing yourself?`) + .setDescription(`${message}`) + .setColor("RANDOM") + member.send({ embeds: [dmEmbed] }); + } else { + const embed = new MessageEmbed() + .setDescription(`${client.emoji.success} | I have successfully sent the message to ${member}!`) + .setColor(client.color.green) + interaction.reply({ embeds: [embed] }) + .then(async () => { + if (logging && logging.moderation.delete_reply === "true") { + setTimeout(() => { + interaction.deleteReply().catch(() => {}); + }, 5000) + } + }) + .catch(() => {}); + const dmEmbed = new MessageEmbed() + .setTitle(`New Message from ${interaction.user.tag}`) + .setDescription(`${message}`) + .setColor("RANDOM") + member.send({ embeds: [dmEmbed] }) + } + } +}; \ No newline at end of file diff --git a/src/slashCommands/fun/dogfact.js b/src/slashCommands/fun/dogfact.js new file mode 100644 index 0000000..142bed0 --- /dev/null +++ b/src/slashCommands/fun/dogfact.js @@ -0,0 +1,21 @@ +const { SlashCommandBuilder } = require("@discordjs/builders"); +const fetch = require("node-fetch"); +const axios = require("axios"); +const { MessageEmbed } = require("discord.js"); + +module.exports = { + data: new SlashCommandBuilder() + .setName("dogfact") + .setDescription("Generate a random dog fact"), + async execute(interaction) { + const res = await fetch("https://dogapi.dog/api/facts"); + const fact = (await res.json()).facts[0]; + + const embed = new MessageEmbed() + .setDescription(`${fact}`) + .setFooter({ text: `/dog-api.kinduff/api/fact` }) + .setTimestamp() + .setColor(interaction.client.color.blue); + interaction.reply({ embeds: [embed] }).catch(() => {}); + } +}; \ No newline at end of file diff --git a/src/slashCommands/fun/emojify.js b/src/slashCommands/fun/emojify.js new file mode 100644 index 0000000..5b4276e --- /dev/null +++ b/src/slashCommands/fun/emojify.js @@ -0,0 +1,58 @@ +const { SlashCommandBuilder } = require("@discordjs/builders"); +const Guild = require("../../database/schemas/Guild"); +const specialCodes = { + 0: ":zero:", + 1: ":one:", + 2: ":two:", + 3: ":three:", + 4: ":four:", + 5: ":five:", + 6: ":six:", + 7: ":seven:", + 8: ":eight:", + 9: ":nine:", + "#": ":hash:", + "*": ":asterisk:", + "?": ":grey_question:", + "!": ":grey_exclamation:", + " ": " ", +}; + +module.exports = { + data: new SlashCommandBuilder() + .setName("emojify") + .setDescription("Emojify a text") + .addStringOption((option) => option.setName("message").setDescription("The message to make big").setRequired(true)), + async execute(interaction) { + const guildDB = await Guild.findOne({ + guildId: interaction.guild.id, + }); + + const language = require(`../../data/language/${guildDB.language}.json`); + + let text = interaction.options.getString("message") + + if(!text) { + return interaction.reply({ content: `${language.emojify}` }); + } + + const emojified = text + .toString() + .toLowerCase() + .split("") + .map((letter) => { + if (/[a-z]/g.test(letter)) { + return `:regional_indicator_${letter}:`; + } else if (specialCodes[letter]) { + return `${specialCodes[letter]}`; + } + return letter; + }) + .join("") + .replace(/,/g, " "); + + interaction.reply({ content: emojified }).catch(() => { + interaction.reply({ content: `${language.emojifyError}` }).catch(() => {}); + }); + } +}; \ No newline at end of file diff --git a/src/slashCommands/fun/explode.js b/src/slashCommands/fun/explode.js new file mode 100644 index 0000000..2601840 --- /dev/null +++ b/src/slashCommands/fun/explode.js @@ -0,0 +1,16 @@ +const { SlashCommandBuilder } = require("@discordjs/builders"); +const { MessageEmbed } = require("discord.js"); + +module.exports = { + data: new SlashCommandBuilder() + .setName("explode") + .setDescription("Says WTF boom"), + async execute(interaction) { + let embed = new MessageEmbed() + .setDescription(`WHAT THE FU- *explosion*`) + .setColor("RANDOM") + .setFooter({ text: `Requested by ${interaction.user.tag}` }) + .setTimestamp() + interaction.reply({ embeds: [embed] }) + } +} \ No newline at end of file diff --git a/src/slashCommands/fun/f.js b/src/slashCommands/fun/f.js new file mode 100644 index 0000000..dd13ab2 --- /dev/null +++ b/src/slashCommands/fun/f.js @@ -0,0 +1,42 @@ +const { SlashCommandBuilder } = require("@discordjs/builders"); +const Guild = require("../../database/schemas/Guild"); +const { MessageEmbed } = require("discord.js"); + +module.exports = { + data: new SlashCommandBuilder() + .setName("f") + .setDescription("Pay your respects.") + .addUserOption((option) => option.setName("member").setDescription("The member (this is optional)")), + async execute(interaction) { + const guildDB = await Guild.findOne({ + guildId: interaction.guild.id, + }); + + const language = require(`../../data/language/${guildDB.language}.json`); + + const target = interaction.options.getMember("member") + + if(!target) { + const embed = new MessageEmbed() + .setAuthor({ + name: `${interaction.user.tag} has paid their respects.`, + iconURL: interaction.member.displayAvatarURL({ format: "png" }) + }) + .setColor("PURPLE") + .setFooter({ text: `${language.f3}` }); + const message = await interaction.reply({ content: ' ', embeds: [embed], fetchReply: true }); + message.react("🇫") + } else { + const embed = new MessageEmbed() + .setAuthor({ + name: `${interaction.user.tag} has paid their respects.`, + iconURL: interaction.member.displayAvatarURL({ format: "png" }) + }) + .setColor("PURPLE") + .setDescription(`${interaction.user.tag} ${language.f2} ${target}`) + .setFooter({ text: `${language.f3}` }); + const message = await interaction.reply({ content: ' ', embeds: [embed], fetchReply: true }); + message.react("🇫") + } + } +}; diff --git a/src/slashCommands/fun/gayrate.js b/src/slashCommands/fun/gayrate.js new file mode 100644 index 0000000..33849d7 --- /dev/null +++ b/src/slashCommands/fun/gayrate.js @@ -0,0 +1,38 @@ +const { SlashCommandBuilder } = require("@discordjs/builders"); +const Guild = require("../../database/schemas/Guild"); +const { MessageEmbed } = require("discord.js"); + +module.exports = { + data: new SlashCommandBuilder() + .setName("gayrate") + .setDescription("See how gay you are") + .addUserOption((option) => option.setName("member").setDescription("Optional")), + async execute(interaction) { + const guildDB = await Guild.findOne({ + guildId: interaction.guild.id, + }); + + const language = require(`../../data/language/${guildDB.language}.json`); + + function randomInteger(min, max) { + min = Math.ceil(min); + max = Math.floor(max); + return Math.floor(Math.random() * (max - min + 1)) + min; + } + const target = interaction.options.getMember("member"); + + let amount = randomInteger(1, 100); + + let embedd = new MessageEmbed() + .setColor("GREEN") + .setTitle(`${language.simpmachinee}`) + .setDescription(`${language.simpyouare} **${amount}%** gay`); + + let targett = target.username; + let embed = new MessageEmbed() + .setColor("GREEN") + .setTitle(`${language.simpmachinee}`) + .setDescription(`${targett} ${langauge.simpIs} **${amount}%** gay`); + interaction.reply({ embeds: [embed]}) + } +} \ No newline at end of file diff --git a/src/slashCommands/fun/hack.js b/src/slashCommands/fun/hack.js new file mode 100644 index 0000000..f6ddffa --- /dev/null +++ b/src/slashCommands/fun/hack.js @@ -0,0 +1,83 @@ +const { SlashCommandBuilder } = require("@discordjs/builders"); +const Guild = require("../../database/schemas/Guild"); +const darkrandom = require("random"); +const darkemail = require("random-email"); +const darkpassword = require("generate-password"); + +module.exports = { + data: new SlashCommandBuilder() + .setName("hack") + .setDescription("Hack someone! (fake)") + .addUserOption((option) => option.setName("user").setDescription("The user to hack").setRequired(true)), + async execute(interaction) { + const guildDB = await Guild.findOne({ + guildId: interaction.guild.id + }); + + const language = require(`../../data/language/${guildDB.language}.json`); + + const impostorpassword = darkpassword.generate({ + length: 10, + numbers: true, + }); + + const user = interaction.options.getMember("user"); + + if (!user) { + return interaction.reply({ content: `${language.hack1}`, ephemeral: true }); + } else { + if (user.bot) { + return interaction.reply({ content: `${language.hackbot}`, ephemeral: true }); + } + } + const member = user; + const mostCommon = [`${language.hack2}`, `${language.hack3}`, `${language.hack3}`, `${language.hack4}`, `${language.hack5}`, `${language.hack6}`]; + const lastdm = [ + `${language.hack7}`, + `${language.hack8}`, + `${language.hack9}`, + `${language.hack10}` + ]; + + interaction.reply({ content: `${language.hack11} "${member.user.username}" ${language.hack12}` }) + .then(async (msg) => { + setTimeout(async function () { + await interaction.editReply({ content: `[▘] ${language.hack13}` }).catch(() => {}); + }, 1500); + setTimeout(async function () { + await interaction.editReply({ content: `[▝] Email: \`${darkemail({ + domain: "gmail.com", + })}\`\nPassword: \`${impostorpassword}\`` }).catch(() => {}); + }, 3000); + setTimeout(async function () { + await interaction.editReply({ content: `[▖] Last DM: "${lastdm[Math.floor(Math.random() * lastdm.length)]}"` }).catch(() => {}); + }, 4500); + setTimeout(async function () { + await interaction.editReply({ content: `[▘] ${language.hack14}` }).catch(() => {}); + }, 6000); + setTimeout(async function () { + await interaction.editReply({ content: `[▝] mostCommon = "${mostCommon[Math.floor(Math.random() * mostCommon.length)]}"` }).catch(() => {}); + }, 7500); + setTimeout(async function () { + await interaction.editReply({ content: `[▗] Finding IP address...` }).catch(() => {}); + }, 9000) + setTimeout(async function () { + await interaction.editReply({ content: + `[▖] IP address: \`127.0.0.1:${darkrandom.int(100, 9999)}\`` + }).catch(() => {}); + }, 10500); + setTimeout(async function () { + await interaction.editReply({ content: `[▘] ${language.hack15}` }).catch(() => {}); + }, 12000); + setTimeout(async function () { + await interaction.editReply({ content: `[▝] ${language.hack16}` }).catch(() => {}); + }, 13500); + setTimeout(async function () { + await interaction.editReply({ content: `${language.hack17} ${member.user.username}` }).catch(() => {}); + }, 15000); + setTimeout(async function () { + await interaction.followUp({ content: `${language.hack18}` }) + }, 16500); + }); + } +}; \ No newline at end of file diff --git a/src/slashCommands/fun/helo.js b/src/slashCommands/fun/helo.js new file mode 100644 index 0000000..2d98423 --- /dev/null +++ b/src/slashCommands/fun/helo.js @@ -0,0 +1,17 @@ +const { SlashCommandBuilder } = require("@discordjs/builders"); +const { MessageEmbed } = require("discord.js"); + +module.exports = { + data: new SlashCommandBuilder() + .setName("helo") + .setDescription("Says hello to eYuM"), + async execute(interaction) { + interaction.reply({ + embeds: [ + new MessageEmbed() + .setDescription(`helo <@690288007638548522> <:TrollHappy:1058938513946591292>`) + .setColor("BLURPLE") + ], + }); + } +}; \ No newline at end of file diff --git a/src/slashCommands/fun/joke.js b/src/slashCommands/fun/joke.js new file mode 100644 index 0000000..1613562 --- /dev/null +++ b/src/slashCommands/fun/joke.js @@ -0,0 +1,28 @@ +const { SlashCommandBuilder } = require("@discordjs/builders"); +const fetch = require("node-fetch"); +const { MessageEmbed } = require("discord.js"); + +module.exports = { + data: new SlashCommandBuilder() + .setName("joke") + .setDescription("Generate a random joke from jokeAPI"), + async execute(interaction) { + const data = await fetch( + `https://sv443.net/jokeapi/v2/joke/Programming,Miscellaneous?blacklistFlags=nsfw,religious,political,racist,sexist` + ).then((res) => res.json()); + + if (!data) + return interaction.reply({ content: `Sorry, seems like I can't connect to JokeAPI.`, ephemeral: true }); + + const { type, category, joke, setup, delivery } = data; + + interaction.reply({ + embeds: [ + new MessageEmbed() + .setColor("BLURPLE") + .setTitle(`${category} joke`) + .setDescription(`${type === "twopart" ? `${setup}\n\n||${delivery}||` : joke}`), + ], + }); + } +}; \ No newline at end of file diff --git a/src/slashCommands/fun/kaomoji.js b/src/slashCommands/fun/kaomoji.js new file mode 100644 index 0000000..a7e22d9 --- /dev/null +++ b/src/slashCommands/fun/kaomoji.js @@ -0,0 +1,3413 @@ +const { SlashCommandBuilder } = require("@discordjs/builders"); +const rightThere = [ + "凸(`0´)凸", + "凸ಠ益ಠ)凸", + "凸(⊙▂⊙ )", + "┌П┐(►˛◄’!)", + "凸(-0-メ)", + "凸(`⌒´メ)凸", + "凸(`△´+)", + "( ︶︿︶)_╭∩╮", + "凸(`ι _´メ)", + "凸(>皿<)凸", + "凸(^▼ェ▼メ^)", + "t(=n=)", + "t(- n -)t", + "凸(¬‿¬)", + "┌∩┐(◣_◢)┌∩┐", + "┌∩┐(ಠ_ಠ)┌∩┐", + "╭∩╮(︶︿︶)╭∩╮", + "╭∩╮(-_-)╭∩╮", + "ᕕ༼ ͠ຈ Ĺ̯ ͠ຈ ༽┌∩┐", + "( ≧Д≦)", + "(; ̄Д ̄)", + "(;¬_¬)", + "(;¬_¬)", + "(。+・`ω・´)", + "。゜(`Д´)゜。", + "( ゚Д゚)<!!", + "(‡▼益▼)", + "(,,#゚Д゚)", + "(҂⌣̀_⌣́)", + "(;¬д¬)", + "(;≧皿≦)", + "(╬゚◥益◤゚)", + "(╬⓪益⓪)", + "[○・`Д´・○]", + "૮( ᵒ̌▱๋ᵒ̌ )ა", + "(⁎˃ᆺ˂)", + "(°᷄д°᷅)", + "((╬●∀●)", + "(╬ Ò ‸ Ó)", + "( >д<)", + "(*`益´*)", + "(☞◣д◢)☞", + "<(`^´)>", + "(;`O´)o", + "( ಠ皿ಠ )", + "(`Δ´)!", + "(*`Ω´*)", + "(╬ಠ益ಠ)", + "(╬゚◥益◤゚) ╬゚", + "(╬⓪益⓪)", + "(╬ಠ益ಠ)", + "(●o≧д≦)o", + "=͟͟͞͞( •̀д•́)))", + "(๑・`▱´・๑)", + "༼ つ ͠° ͟ ͟ʖ ͡° ༽つ", + "(ฺ◣д◢)ฺ", + "(#`皿´)", + "(`Д´)", + "(メ゚皿゚)", + "(o`゚皿゚)", + "( ╬◣ 益◢)", + "(╬ಠ益ಠ)", + "(♯▼皿▼)", + "( ╬◣ 益◢)y━・~", + "(○`O´○)", + "(; ・`д・´)", + "|。`>Д<|", + "(; ・`д・´)​", + "( •̀ω•́ )σ", + "o(-`д´- 。)", + "(´・益・`*)", + "(´Д`)", + "(¬д¬。)", + "(≧▼≦;)", + "(ᇂ∀ᇂ╬)", + "(ू˃̣̣̣̣̣̣︿˂̣̣̣̣̣̣ ू)", + "(ू˃̣̣̣̣̣̣o˂̣̣̣̣̣̣ ू)⁼³₌₃", + "(▼へ▼メ)", + "「(#Φ益 Φo)∩", + "s(・`ヘ´・;)", + "s(・`ヘ´・;)ゞ", + "Σ(-`Д´-ノ;)ノ", + "Σ(▼□▼メ)", + "๛∙᷅῞ॄ∙᷄", + "(°ㅂ° ╬)", + "( ー̀εー́ )", + "(눈_눈)", + "(´◣д◢`+)", + "(ʘ言ʘ╬)", + "(Ò 皿 Ó ╬)", + "(-̀◞८̯◟-́)", + "( ͒˃⌂˂ ͒)", + "┌(▀Ĺ̯ ▀-͠ )┐", + "Σ(゚д´;ノ)ノ", + "(-̀◞▥◟-́)", + "☜(`o´)", + "(◎益◎;)", + "(@益@ .:;)", + "ꉂ `o´ )", + "ಠ_ರೃ", + "(*`へ´*)", + "-`д´-", + "(*≧m≦*)", + "(* ̄m ̄)", + "(>人<)", + "(¬_¬)", + "(#ಠQಠ#)", + "(¬、¬)", + "( ಠ ಠ )", + "(¬▂¬)", + "(⋋▂⋌)", + "(>_<)", + "(>д<)", + "(≧σ≦)", + "(◣_◢)", + "(ಠ⌣ಠ)", + "(ಥ⌣ಥ)", + "ŎUŎ", + "ಠ_ಠ", + "ಠ▃ಠ", + "ಥ⌣ಥ", + "눈_눈", + "(ᗒᗣᗕ)՞", + "૮( ᵒ̌ૢཪᵒ̌ૢ )ა", + "(,,Ծ‸Ծ,, )", + "(๑•ૅㅁ•๑)", + "╬•᷅д•᷄╬꒱", + "(╬•᷅д•᷄╬)", + "(๑‾᷆д‾᷇๑)", + "〴⋋_⋌〵", + "ఠ ͟ಠ", + "(ఠ్ఠ ˓̭ ఠ్ఠ)", + "(*´罒`*)", + "(๑•॒̀ ູ॒•́๑)", + "(。ì _ í。)", + "(๑ò︵ò๑)", + "(⑉・̆⌓・̆⑉)", + "₍₍ ◝(•̀ㅂ•́)◟ ⁾⁾", + "૮( ᵒ̌皿ᵒ̌ )ა", + "(╬ ‾᷅皿‾᷄ ╬)", + "(。☉︵ ಠ╬)", + "( ‾᷅‾᷄ )", + "(`◕‸◕´+)", + "(*`д´*)", + "˃ʍ˂", + "ʕ •̀ o •́ ʔ", + "⋋_⋌", + "(o・`Д´・o)", + "( ▀ 益 ▀ )", + "(▽д▽)", + "╭(๑¯д¯๑)╮", + "(ಠ ∩ಠ)", + "⋌༼ •̀ ⌂ •́ ༽⋋", + "(」゜ロ゜)」", + "(/゚Д゚)/", + "\(`0´)/", + "ヽ(`⌒´メ)ノ", + "ヽ(●-`Д´-)ノ", + "ヽ༼ ಠ益ಠ ༽ノ", + "(((p(>o<)q)))", + "(ノ≧┏Д┓≦)ノ", + "(ノಠ益ಠ)ノ", + "{{|└(>o< )┘|}}", + "\(・`(ェ)・)/", + "(ノಠ益ಠ)ノ", + "{{|└(>o< )┘|}}", + "\(・`(ェ)・)/", + "\(〇O〇)/", + "\(@O@)/", + "\(`O´θ/", + "\( `.∀´)/", + "\(>o<)ノ", + "ヾ( ・`⌓´・)ノ゙", + "ヾ(。◣∀◢。)ノ", + "ヽ(≧Д≦)ノ", + "ヽ(#`Д´)ノ", + "ヽ(o`皿′o)ノ", + "┗|`O´|┛", + "ヾ(。`Д´。)ノ彡☆", + "ヽ(`◇´)/", + "ヽ(´益`)ノ", + "ヽ( ̄д ̄;)ノ", + "┗(`皿´)┛", + "ヽ(`δ´)ノ", + "└(○`ε´○)┘", + "ヾ(`◇´)ノ彡", + "ヾ( ˃̶⺫˂̶。)ノ", + "─(。ìдí。)─", + "0<)”・ –>", + "_<)}} –>", + "レ(◣益◢#)ヘ", + "ヽ(`⌒´)ノ", + "(’益’)", + "((ヾ(≧皿≦;)ノ_))", + "\`•̀益•́´/", + "ヾ(`⌒´メ)ノ″", + "ヽ(`○´)/", + "б(*`・´)∂", + "╰༼=ಠਊಠ=༽╯", + "。゚゚(」。≧□≦)」", + "(ノ`Д´)ノ", + "ヽ(♯`Д´)ノ", + "ヽ(`Д´#)ノ", + "ヽ(`Д´)ノ", + "ヾ(*`ェ´*)ノ", + "ヾ(o`ェ´)ノ", + "ヾ(。`Д´。)ノ", + "ヾ(メ`・д・´)ノ゙", + "ヽ(o`Д´o)ノ", + "┗曲━(`益´)━曲┛", + "┗(`Д゚┗(`゚Д゚´)┛゚Д´)┛", + "٩(╬ʘ益ʘ╬)۶", + "٩(๑`ȏ´๑)۶", + "o( ><)o", + "o(>< )o", + "ᕙ(⇀‸↼‶)ᕗ", + "ᕦ(ò_óˇ)ᕤ", + "٩(╬ఠ༬ఠ)و", + "٩(๑`^´๑)۶", + "٩(//̀Д/́/)۶", + "٩(╬ʘ益ʘ╬)۶", + "p( Ò ‸ Ó)q ", + "\\٩(๑`ȏ´๑)۶//", + "\\\\٩(๑`^´๑)۶////", + "୧ʕ ⇀ ⌂ ↼ ʔ୨", + "୧༼ಠ益ಠ༽୨", + "o(`Д´*)o", + "୧▒ •̀ o •́ ▒୨", + "!! o(*≧д≦)o))", + "o(-`д´- o)", + "୧(๑•̀ᗝ•́)૭", + "ೕ(Ò⺫ Ó )೨", + "o(`□´)○", + "ฅ(๑*д*๑)ฅ!!", + "(#`д´)ノ", + "(・`ェ´・)つ", + "(; `ェ´ ;)b三b", + "θ\(;¬_¬)", + "(ꈨຶꎁꈨຶ)۶”", + "┗(•̀へ •́ ╮ )", + "(ヾノ•᷅ ༬•᷄ )", + "( ⓞ⃘ ⺫ ⓞ⃘۶)۶ ੭ྀ", + "(ര̀⍨ര́)و ̑̑༉", + "(*☆OДo)9 。+゚", + "(益t)", + "v(`皿´)ノ~", + "໒( ᓀ ‸ ᓂ )७", + "ヽ(*`Д´*||", + "||*`Д´*)ノ", + "o(o・`з・´o)ノ", + "໒( ⇀ ‸ ↼ )७", + "(๑•̀ㅁ•́ฅ)", + "┗(`ム´)=З", + "ι(`ロ´)ノ", + "(`∧´メ)ρ))", + "໒( : ͡° д °͡ : )७", + "щ(ºДºщ)", + "щ(ಠ益ಠщ)", + "щ(ಥДಥщ)", + "ლ (#`ロ^;)>", + "ლ(ಠ_ಠლ)", + "ლ(ಠ益ಠ)ლ", + "ლ(ಠ益ಠლ", + "ლಠ益ಠ)ლ", + "ლ(ಠ益ಠ)ლી", + "(y゚ 益゚;)y", + "Щ(◣д◢)Щ", + "Щ(ಠ益ಠЩ)", + "(ノಠ ∩ಠ)ノ彡( o°o)", + "(╯°□°)╯︵ ┻━┻", + "(╯°Д°)╯︵/(.□ . )", + "(ノಠ益ಠ)ノ彡┻━┻", + "(۶ૈ ۜ ᵒ̌▱๋ᵒ̌ )۶ૈ=͟͟͞͞ ", + "(۶ૈ ᵒ̌ Дᵒ̌)۶ૈ=͟͟͞͞ ", + "(ノꐦ ◎曲◎)ノ=͟͟͞͞ ", + "‎(ノಥ益ಥ)ノ ┻━┻", + "(ノಥДಥ)ノ︵┻━┻・/", + "/( .□.) ︵╰(゜益゜)╯︵ /(.□. /)", + "( #`⌂´)/┌┛", + "ヽ(#゚Д゚)ノ┌┛", + "(((๑‾᷅༬‾᷄๑)̂—̳͟͞͞o", + "( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃", + "(૭ ఠ༬ఠ)૭", + "(૭ ◉༬◉)૭⁾⁾⁾⁾", + "ᕙ( ︡’︡益’︠)ง", + "( #`⌂´)/┌┛", + "ヽ(#゚Д゚)ノ┌┛", + "‾͟͟͞(((ꎤ ✧曲✧)̂—̳͟͞͞o", + "(((ꎤ๑‾᷅༬‾᷄๑)̂—̳͟͞͞o", + "( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃", + "(૭ ఠ༬ఠ)૭", + "~‾͟͟͞(((ꎤ >ㅿ<)̂—̳͟͞͞o", + "‾͟͟͞(((ꎤ >口<)̂ꎤ⁾⁾⁾⁾", + "(૭ ◉༬◉)૭⁾⁾⁾⁾", + "ᕙ( ︡’︡益’︠)ง", + "ヽ(#゚Д゚)ノ┌┛Σ(ノ´Д`)ノ", + "⁽͑˙˚̀⚐˚́˙⁾̉", + "⁽͑˙˚̀བ̇˚́˙⁾̉", + "ˁ⁽͑˙˚̀ˆ̇˚́˙⁾̉ˀ", + "⁽͑ʺ˚̀˙̪̺˚́ʺ⁾̉ ˃͐", + "ი⁽͑˙˚̀༡̇˚́˙⁾̉ჟ ˒˒⁼³", + "ˁ⁽͑ ˚̀˙̭˚́ ⁾̉ˀ ⁼³", + "ฅ⁽͑ ˚̀ ˙̭ ˚́ ⁾̉ฅ", + "((╬ಠิ﹏ಠิ))", + "(◞≼◉≽◟ ;益;◞≼◉≽◟)", + "☜(:♛;益;♛;)☞", + "(⁎⚈೧⚈ै⁎ૢ)", + "໒(•නන•)७", + "⁽ƈ ͡ (ुŏ̥̥̥̥םŏ̥̥̥̥) ु", + "(๑•ิཬ•ั๑)", + "( ๑॔˃̶◡ ˂̶๑॓)", + "( *`ω´)ु", + "(╬ಠิ益ಠิ)", + "⸌ ͔〠 ̖⸍⌕⁔͡⸌ ̗〠 ͕⸍⌕", + "⁽⁽(੭ꐦ •̀Д•́ )੭*⁾⁾ ᑦᵒᔿᵉ ᵒᐢᵎᵎ", + "Ƒ ư ɕ ƙ (╬゚◥益◤゚) ╬゚", + "o͡͡͡͡͡͡╮(ꐦ ꈨຶ皿ꈨຶ)╭o͡͡͡͡͡͡", + "o͡͡͡͡͡͡╮(。>口<。)╭o͡͡͡͡͡͡ ᵑ৹!", + "(・_・ヾ", + "「(゚ペ)", + "(・・。)ゞ", + "(`_´)ゞ", + "(´−`) ンー", + "。(*^▽^*)ゞ", + "(^^ゞ", + "(^~^;)ゞ", + "( ̄(エ) ̄)ゞ", + "(-_-)ゞ゛", + "(#⌒∇⌒#)ゞ", + "(⌒▽⌒)ゞ", + "(●´ω`●)ゞ", + "〈(゜。゜)", + "「(°ヘ°)", + "く(^_・)ゝ", + "σ(´し_`〃)ゞ", + "δ(´д`; )", + "↷( ó╻ò)", + "(≖ლ≖๑ )フ", + "(;^◇^;)ゝ", + "(・∧‐)ゞ", + "ଽ (৺ੋ ௦ ৺ੋ )৴", + "( ;-(エ)-)ゞ", + "(;´д`)ゞ", + "(≧д≦ヾ)", + "「(゚<゚)゙??", + "∑(⌒◇⌒;)", + "Σ(๛д๛)", + "Σ(`‐ェ‐´)", + "Σ(´д ` メ)", + "∑(O_O;)", + "Σ(‘◉⌓◉’)", + "Σ(-᷅_-᷄๑)", + "Σ(・Д・)!?", + "Σ( ̄ロ ̄lll)", + "∑(゚台゚lll", + "Σ( ̄□ ̄lll)", + "Σ( ̄□ ̄;)", + "Σ(+_@)!?", + "Σ(゚ロ、゚;)", + "∑(´゚ω゚`*)", + "Σ(; ・`д・´)", + "Σ(;・益・;;;)!!!", + "∑(´△`○)", + "Σ(´△`Ⅲ)", + "Σ(•’╻’• ۶)۶", + "(?・・)σ", + "(´・_・`)", + "(‘◇’)?", + "(゜-゜)", + "( ・◇・)?", + "(゜。゜)", + "(◎_◎;)", + "(◎-◎;)", + "(●__●)", + "(☉_☉)", + "(゚ー゚;)", + "【・_・?】", + "【・ヘ・?】", + "c( O.O )ɔ", + "ఠ_ఠ", + "(๑ ́ᄇ`๑)", + "੨੨(´・・`)", + "(メ・ん・)?", + "(o*。_。)o", + "(・・?)", + "(o゜ー゜o)??", + "(゚ペ)?", + "(・∩・)?", + "??r(・x・。)???", + ": ◉ ∧ ◉ : ╏", + "σ(゜◆゜;)", + "(;゜◆゜)σ", + "( ゜Д゜;)!?", + "(。・ω・。)?", + "(`◎△◎)!?", + "(゚▽゚`*)?", + "(*`〇Д〇)?", + "(*OчO*)", + "(*・∧・*)?", + "(*。0 – 0。*)?", + "(●´・×・`●)?", + "?(ο´・д・)??", + "(⊙_⊙’)", + "٩(͡๏̯͡๏)۶", + "(」・ω・)」", + "(」゜ロ゜)」", + "(」゚ペ)」", + "(」゚ロ゚)」", + "(❀」╹□╹)」*・", + "(」๏้๏้)」", + "ι(´Д`ι)", + "( 」。╹o╹。)」", + "ƪ(•̃͡•̃͡ ƪ", + "(」。≧□≦)」", + "(」゚Д゚)」", + "(」°ロ°)」", + "ʅฺ(・ω・。)ʃฺ??", + "(。「´-ω・)ン?", + "(*「・ω・)ン?", + "(屮゜Д゜)屮", + "щ(ºДºщ)", + "щ(゜ロ゜щ)", + "ლ(ಠ_ಠლ)", + "(ლಠ益ಠ)ლ", + "ლ(ٱ٥ٱლ)", + "щ(゚д゚щ)", + "ლ(。-﹏-。 ლ)", + "ლ(∘◕‵ƹ′◕ლ)", + "꜡( ˃ ﹆̬ ˂꜡)", + "ლ(;; ิ益 ิ;‘ლ)", + "Щ(º̩̩́Дº̩̩̀щ)", + "ლ(́⚈人⚈‵ლ)", + "щ(▼ロ▼щ)", + "щ(´Д`щ)", + "щ(`D´#щ)", + "щ(゚ロ゚щ)", + "Щ(◣д◢)艸", + "ლ(ಠ_ಠ ლ)", + "ლ(´Д`ლ)", + "ლ(ಥ Д ಥ )ლ", + "щ(ಥдಥщ)", + "ಠ_ರೃ", + "( •᷄ὤ•᷅)?", + "(⊙_◎)", + "(⊙_☉)", + "(⊙.☉)7", + "⁀⊙﹏☉⁀", + "●.◉", + "(。☉︵ ಠ╬)", + "(๑•̌.•̑๑)ˀ̣ˀ̣", + "ʕ•ૅૄ•ʔ", + "(๑•ૅૄ•๑)", + "| ͠° ▃ °͠ |", + "( -_・)?", + "▐ ˵ ͠° (oo) °͠ ˵ ▐", + "(。ヘ°)", + "(´`;) ?", + "( ?´_ゝ`)", + "ヾ(´・ ・`。)ノ”", + "ヽ(゜Q。)ノ?", + "?(*´・д・)ノ", + "(,,゚Д゚)∩", + "((´‐公‐`))", + "<|^□^#|/", + "( ̄■ ̄;)!?", + "(>囗<?)", + "( ⌡ ຶम⌡ ຶ )", + "(๑ಕ̴ _̆ ಕ̴) ン?", + "(゚Д゚?)", + "?(°Д°≡°Д°)?", + "(♠_♦)", + "(C_C)", + "¿(❦﹏❦)?", + "(;´@へ@`)", + "( ⧉ ⦣ ⧉ )", + "( ؕؔʘ̥̥̥̥ ه ؔؕʘ̥̥̥̥ )?", + "﴾͡๏̯͡๏﴿", + "`(๑ △ ๑)`*", + "٩(̾●̮̮̃̾•̃̾)۶", + "( ؔ⚈͟ ◡ ؔ⚈͟ ๑)…ン?", + "(⸝⸝⸝՞̐ˀ̝՞̐ू)˖̛̠͉", + "(◕▿◕)??", + "ɿ(。・ɜ・)ɾⓌⓗⓨ?", + "ɿ(。・ɜ・)ɾⓌⓗⓐⓣ?", + "(「๑•₃•)「 ʷʱʸ?", + "(ㆀ˘・з・˘)ωҺat?", + "Ⓦⓗⓐⓣ(☉൧ ಠ ꐦ)", + "(ㆀ˘・з・˘)ωҺa ƭ?", + "Σ(‘Д’⁕)ահɑԵ’Տ up !?", + "(」゚ロ゚)」NOOOooooo━", + "【=◈︿◈=】", + "*^^)/。 ・:*:・゜ ★,。 ・:*:・゜☆オメデト", + "オメデタ・スター( ^_^)/☆.。.:*・°☆.。.:*・°☆.。.:*・°☆", + "( ^^)//(  ( )\\(^^ )ドンドン♪", + '(^-^)//"" パチパチ', + 'オメデト☆"8(^-^8 )Ξ( 8^-^)8"☆オメデト', + "( ^。)iiiiiiおめでとう (~ 3 )iiiiiふー", + "( -。-) スゥー ( °口°) オメデトーー!", + "オメデト☆彡(^_^)∠※ PAN!", + '才×〒"├¬♪ (。・_・)ノ☆・°:*:°', + "(/@^。)/お☆め☆で☆と☆う\(。^@\)", + "(*^ ^)/。・:*:・°'★,。・:*:・°'☆ Congratulations", + "(\.Y/. )(\.Y/. )おめでとうだっちゅうの♪", + "^(ノ゜ー゜)ノ☆パチパチ", + "( ^o^)ノ◇ ザブトン1マイダネ", + "(^ ○ ^)お!(^ □ ^)め!(^ ◇ ^)で!(^ ▽ ^)と!(^ ・ ^)う!", + "( *゜▽゜)/°・:*【祝】*:・°\(゜▽゜* )", + "(* ‘∇‘)/°・:*【祝】*:・°\(‘∇‘ *)", + "(* ̄(エ) ̄)/°・:*【祝】*:・°\( ̄(エ) ̄*)", + "(ノ_・。)/°・:*【祝】*:・°\(;_\)", + "(*^◇^)/°・:*【祝】*:・°\(^◇^*)", + "(*^ー^)/°・:*【祝】*:・°\(^ー^*)", + "オメデトウ ( ^ _ ^)∠☆PAN!", + "オメデト(・Θ・)ピヨピヨ♪", + "オメデトウジャクシ♪ (' - ' *)~~", + "。・:*:・°'★( ^Θ^ )オメデトピヨピヨ♪★'°・:*:・。", + "★祝福の大砲!☆(ノ^o^)♂ドド-ン ", + "オメデッポウ!(/^o^)♂♂ ・・・[オメデトウ]", + "(*^o^*)オ (*^。^*)メ (*^-^*)デ (*^o^*)トー", + "お( ̄○ ̄)め( ̄◇ ̄)で( ̄△ ̄)と( ̄0 ̄)う( ̄ー ̄)", + "お( ̄○ ̄;)め( ̄◇ ̄;)で( ̄△ ̄;)と( ̄0 ̄;)う( ̄ー ̄;)", + "オ(・ 。 ・)メ(・ ◇ ・)デ(・ △ ・)ト(・ 0 ・)ウ(・ ー ・)", + "おめでと~☆ シャンシャン゛8(^∇^゛8)(゛8^∇^)8゛シャンシャン", + "~( ^▽^)∠※☆ おめでとうでチュ~", + "(σ_σ)_∠※PAN!:・'°☆。.:*:・'°★°", + "( ^。^)オメデト∠※ポン!。・:*:・°'★,。・:*:♪・°'☆ミ", + "( ^-^)ノ∠※PON!。.:*:・'°☆。.:*:・'°★°'・:*オメデトウ", + "☆・。・。★・°・。・°☆ミ( ・_・ )ノ彡☆°・。・°★・。・。☆", + "☆・。・。★・°・。・°☆ミ(=^_^=)ノ彡☆°・。・°★・。・。☆", + "キラリーン(@ ^ ^)/。・:*:・°'★,。・:*:・°'☆ Congratulations!・:*:・°", + "オメ*《 ※ ☆( ★\(^0^)/★ )☆ ※ 》*デトウ", + "オメデタ (*'J '*) パオ~ン", + "( ^o)-o<パッパラッパ│~~~♪お♪め♪で♪と♪ー♪", + "ヤッタネ!(b^ー°) オメデト♪", + "オメメー\(^O^)/(*^_^*)\(^O^)/オメメー", + "お (o|o)┘め└(o|o) で (o|o) と└(o|o) う└(o|o)┘", + "オメデト肉まん (ノ^o^)ノ‥‥‥…━━━━(^○^ ) ハムハム", + "\(∇⌒\)☆オ☆メ☆デ☆ト☆ウ☆(/⌒∇)/", + "♪オメデト★*☆ヽ( ^-^)/★*☆オメデト♪", + "(*^ー^)/°・:*:・。オメデトウ。・:*:・°\(^ー^*)", + "オメデトウ(^-^)ノ~~・:*。・:*:・°'☆", + "★⌒☆⌒★〓☆ 祝 ☆〓★⌒☆⌒★", + "(* ̄ー ̄)ノ彡☆゜・。・゜★・。・。☆", + "(* ^^)/。・:*:・°'★,。・:*:・°'☆[Congratulations]", + "(  ̄(エ) ̄)ノ∠※PAN!。.:*:・'°☆。.:*:・'°★°'・:*オメデト", + "☆彡(ノ^ ^)ノ Congratulations ヘ(^ ^ヘ)☆彡", + "☆彡(ノ^^)ノ☆彡ヘ(^^ヘ)☆彡(ノ^^)ノ☆彡 Congratulations!!", + "\(^o^)≪★祝☆CONGRATULATIONS☆祝★≫(^o^)/", + "★☆オメデト☆★ヘ(^^ヘ)(ノ^^)ノ★☆オメデト☆★", + "=お( ^ O ^ )め( ^ 。 ^ )で( ^ O ^ )と( ^ o ^ )う( ^ 。 ^ )=", + " o<^・O・^>oオo<^・o・^>oメo<^・_・^>oデo<^・o・^>oトo<^・O・^>o", + "オメデト! ^-^)ノ ---==ΞΞΞ☆ 幸運の星", + "(ノ' 0 ')ノ~♪祝福 v(^ O ^)v の宴♪~ヘ(' 0 'ヘ)", + "o( ^ - ^ )m(- ^ )e(^   )d(   )e(   ^)t(  ^-)o( ^ - ^ )", + "オメットタイソウ1,2 ヽ(^_^))((^。^)ノ 3,4", + "ヽ(^-^ヽ)♪オメ♪ヾ(^‐^)ゞ♪オメ♪(/ ^-^)/", + "(=^ェ^=) おめでとにゃーん♪", + "┌(★o☆)┘♪└(★o★)┐♪┌(☆o★)┘オメピカ♪", + "☆;:*:;☆;:*:;☆“Congratulations”☆;:*:;☆;:*:;☆", + "オメデトカタツムリ .........@ノ”", + "オメデトコーラス ( °o°)( °o °)(°o° ) ドゥーワ~♪", + 'なんて凄いんだ! ( /|_|)/:・;^・;・*.";.*::*.;".*・;・^;・: おめでとう!', + "⊂((〃'⊥'〃))⊃♂オ(⊂((・⊥・))⊃)♀メ", + ".....(((((((((((((。・_・。)ノ オメレト", + "ヾ(°ρ°) オメデター", + "(/~ー~)/‥∵:*:☆*゜★。::*☆ オメデトウ", + "オメットモンキー ⊂((〃'⊥'〃))⊃ / 。 ・:*:・゜ ★", + "(°Д°;)オッ!(°口°;)メッ! ( >з<)=3 デトーーークション!", + "ギリギリ ( ・_・)ノ~~~~~~>゜(((オメデトウ))彡", + ":*:((( ¨)/。.:*:・'☆オメデトウ☆", + "\_(^◇^)_/\(*^^*)/ 優勝オメデトウ!", + "(*^^)//。・:*:・°'★,。・:*:♪・°'☆パチパチ", + "(*^^)/。・:*:・°★,。・:*:・°☆オメデト!!", + '(^-^)//""パチパチ', + "(^ ^)//゛゛゛パチパチ", + "(^^)// ハクシユー", + "ヘ(。□°)ヘ", + "(☉ε ⊙ノ)ノ", + "\(●o○;)ノ", + "\(☆o◎)/", + "⁀⊙﹏☉⁀", + "~(๑ñ﹏ ⊙☆)ノ", + "ヾ (✿>﹏ ⊙〃)ノ", + "ヽ(。_°)ノ", + "ヽ(。ゝω・。)ノ", + "ヾ(。ꏿ﹏ꏿ)ノ゙", + "ヽ(‘ ∇‘ )ノ", + "ヾ(@゜∇゜@)ノ", + "ヾ(@°▽°@)ノ", + "ヽ(゜Q。)ノ", + "Σ(♡@﹏ @☆)ノ”", + "щ (*ㅇ△ Φ☆)ノ", + "へ(゜∇、°)へ", + "ヘ(゜◇、゜)ノ", + "ヘ(゜Д、゜)ノ", + "ヘ(°◇、°)ノ", + "ミ●﹏☉ミ", + "⁽⁽◝(ˊʂ˴⁎)◞՞", + "ヽ(°▽、°)ノ", + "(ლ ۞ิ ჴ ۞ิ)ლ", + "(/●◔∀◐●)/", + "ヾ|`・、●・|ノ", + "(ノ)ʘ﹃ʘ(ヾ)", + "\(´◓Д◔`)/", + "◝₍ᴑ̑ДO͝₎◞", + "(╯⊙ ⊱⊙╰ )", + "੧| ⊗ ▾ ⊗ |୨", + "⊂(©෴©)つ", + "ゞ(ↂ ω ↂ)ゞ", + "ヘ(゚∇゚ヘ)", + "(⑅ 「O_o)「", + "(⑅∫°ਊ°)∫", + "ヽ(๏∀◕ )ノ", + "へ[ ᴼ ▃ ᴼ ]_/¯", + "(。□゚ノ)ノ", + "┌(。°з ┐ )┘三└( ┌ ε°。)┐┘", + "(。☉౪ ⊙。)", + "(๑∀๑)", + "(⊙﹏⊙✿)", + "(⊙_◎)", + "(♠_♦)", + "(ּơ̑ළּơ̑)", + "(ʺʘੂ๔̈ੁʘੂ)", + "⊙_ʘ", + "◴_◶", + "◖|◔◡◉|◗", + "˛˛(๑ּగ˞ּగ๑) ̉ ̉", + "ಠ ּ͜೦", + "⊆◍益◍⊇", + "(*☉౪ ⊙。)", + "∑(*☼_☉*)", + "(╬☉д⊙)⊰⊹ฺ", + "~(-◎ω◎)", + "~(-◎y◎)", + "(◎ω◎*)", + "( ◎✦⃟◎ )", + "(◦△☆)~~!!!", + "(°͜ʖ͡°)", + "✦⍜✧", + "v(〄_〄)v", + "(。ヘ°)", + "(゜▼゜*)", + "(゜▽゜;)", + "`(๑ △ ๑)`*", + "(*゚∀゚*)", + "(*°∀°)", + "ъ川゚д^川", + "(o≧▽゚)o", + "Σ(・A゜)", + "┏( .-. ┏ ) ┓", + "( ┐΄✹ਊ✹)┐", + "σ(●゚┏∀┛。●)ノ", + ".(⁎ꈍ﹃ก⁎)๛", + "ര.༵ര", + "(((o(*゚▽゚*)o)))", + "o((*^▽^*))o", + "O(≧▽≦)O", + "o(〃^▽^〃)o", + "o(^▽^)o", + "O(≧∇≦)O", + "o(≧∇≦o)", + "σ(≧ε≦o)", + "o(*^▽^*)o", + "⌒°(❛ᴗ❛)°⌒", + "o(^∀^*)o", + "o(^◇^)o", + "《《o(≧◇≦)o》》", + "o(*≧□≦)o", + "o(*>ω<*)o", + "(ノ・ェ・)ノ", + "(/^▽^)/", + "(ノ´ヮ´)ノ*:・゚✧", + "(ノ≧∀≦)ノ", + "(ノ^ヮ^)ノ*:・゚✧", + "(/ ‘з’)/", + "(/ ‘з’)/ʸᵉᵃʰᵎ", + "⁽(◍˃̵͈̑ᴗ˂̵͈̑)⁽", + "(╯✧∇✧)╯", + "Σ(ノ°▽°)ノ", + "( ƅ°ਉ°)ƅ", + "ヽ( ・∀・)ノ", + "˭̡̞(◞⁎˃ᆺ˂)◞*✰", + "(p^-^)p", + "(ノ^∇^)ノ゚", + "ヽ(〃・ω・)ノ", + "(۶* ‘ꆚ’)۶”", + "(ノ・д・)ノ", + ".+:。(ノ・ω・)ノ゙", + "Σ(*ノ´>ω<。`)ノ", + "ヾ(〃^∇^)ノ♪", + ".゚☆(ノё∀ё)ノ☆゚.", + "⌒゚(❀>◞౪◟<)゚⌒", + "⤴︎ ε=ε=(ง ˃̶͈̀ᗨ˂̶͈́)۶ ⤴︎", + "୧༼✿ ͡◕ д ◕͡ ༽୨", + "ヽ(;^o^ヽ)", + "╰(✧∇✧╰)", + "٩(•౪•٩)三", + "₍•͟ ͜ • ₎", + "q(^-^q)", + "\(・c_・●)ゞ", + "۹⌤_⌤۹", + "ヾ(0∀0*★)゚*・.。", + "ヾ│・ェ・ヾ│", + "╰(・∇・╰)", + "。(>ω<。)", + "ヾ(・ω・。)シ", + "ヾ(・д・ヾ)", + "ヽ(´∀`ヽ)", + "ヽ(´ω`○)ノ.+゚*。:゚+", + "ヾ(≧∇≦*)ゝ", + "\(@ ̄∇ ̄@)/", + "\(^▽^@)ノ", + "ヾ(@^▽^@)ノ", + "(((\(@v@)/)))", + "\(*T▽T*)/", + "\(^▽^)/", + "\(T∇T)/", + "ヽ( ★ω★)ノ", + "ヽ(;▽;)ノ", + "ヾ(@† ▽ †@)ノ", + "ヾ(@^∇^@)ノ", + "ヾ(@^▽^@)ノ", + "ヾ(@^▽^@)ノ", + "ヾ(@゜▽゜@)ノ", + "ヾ(@°▽°@)ノ", + "ヾ(@°▽°@)ノ", + "ヽ(*≧ω≦)ノ", + "ヽ(*⌒∇⌒*)ノ", + "ヽ(^。^)丿", + "ヽ(^Д^)ノ", + "ヽ(=^・ω・^=)丿", + "⸂⸂⸜(രᴗര๑)⸝⸃⸃", + "⸜(ّᶿധّᶿ)⸝", + "ヽ(。・ω・。)ノ", + "⸂⸂⸜(രᴗര๑)⸝⸃⸃", + "⸜(ّᶿധّᶿ)⸝", + "ヽ(。・ω・。)ノ", + "╰(‘ω’ )╯", + "╰(°ㅂ°)╯", + "┗(^∀^)┛", + "ヾ(๑’౪`๑)ノ゙", + "ヾ(*Őฺ∀Őฺ*)ノ", + "╰(✧∇✧)╯", + "✯⸜(ّᶿ̷ധّᶿ̷)⸝✯", + "╰(◉ᾥ◉)╯", + "⌒°(ᴖ◡ᴖ)°⌒", + "ヾ(´∀`○)ノ", + "。゚✶ฺ.ヽ(*´∀`*)ノ.✶゚ฺ。", + "\(;゚∇゚)/", + "ヽ(*´∀`)ノ゙", + "⸂⸂⸜(ೆ௰ೆ๑)⸝⸃⸃", + "✧⁺⸜(●′▾‵●)⸝⁺✧", + "ヾ(`ω` )/", + "ヾ(。^ω^。)ノ", + "⸜(ّᶿॕധّᶿॕ)⸝", + "⸜(ؔᶿധؔᶿ)⸝", + "╰( ・ ᗜ ・ )╯", + "┏○ \(゚ 0゚ ;)/┓", + "ヽ(^◇^*)/", + "ヾ(≧∇≦)ゞ", + "*。ヾ(。>v<。)ノ゙*。", + "☆*~゚⌒(‘-‘*)⌒゚~*☆", + "ヽ(゚∀゚)ノ", + "ヾ(o≧∀≦o)ノ゙", + ".。゚+.ヽ| ゝ∀・*|ノ。+.゚", + "(゚<|\(・ω・)/|>゚)", + "╰| ° ◞౪◟ ° |╯", + "ヽ༼>ل͜<༽ノ", + "ヽ[ヘ ل͟ ヘ]╯", + "\(・ω・)/", + "ヽ(゜ω゜○)ノ", + "☆~~ヾ(>▽<)ノ。・☆", + "\(*´・∀・`*)/", + "\(゜э゜)/", + "ヾ( ̄◇ ̄)ノ", + "ヾ【*≧д≦】ノ", + "ヽ(^O^)ノ", + "ヾ(´▽`*)ノ☆", + "ヾ(・∀・`*)ノ☆", + "☆ヾ(*´▽`)ノ", + "☆ヾ(*´・∀・)ノ", + "ヾ(*・ω・)ノ", + "ヾ(・ω・*)ノ", + "ヽ( ´¬`)ノ", + "ヾ(≧∪≦*)ノ〃", + "ヾ(*ゝω・*)ノ", + "\(○^ω^○)/", + "╰(*´︶`*)╯", + "ヽ( ´ー`)ノ", + "┝\( ‘∇^*)^☆/┥", + "ヽ(^o^)丿", + "┗|⌒O⌒|┛", + "┗|・o・|┛", + "ヾ(●・◇・●)ノ", + "ヽ( ‘ω’ )ノ", + "((ヾ(* ´∀`)ノ))", + "ヽ(´∇`)ノ", + "ヽ(^□^。)ノ", + "ヾ(o✪‿✪o)シ", + "\(*゚∀゚*)/", + "\(*^¬^*)/", + "Ψ(≧ω≦)Ψ", + "ヽ(*≧л≦)ノ", + "୧☉□☉୨", + "(* >ω<)", + "(*≧▽≦)", + "(๑>ᴗ<๑)", + "( ˃̶ω˂̶ ૃ)", + "(٭°̧̧̧ω°̧̧̧٭)", + "⸍̥ꇴ̥⸌", + "(⊙ꇴ⊙)", + "(*≧∀≦*)", + "(≧∇≦*)", + "(๑✧∀✧๑)", + "(★^O^★)", + "(ᗒᗨᗕ)", + "(≧∀≦)", + "₊·*◟(˶╹̆ꇴ╹̆˵)◜‧*・", + "(ᗒᏬᗕ) ˡ̵˖✮⃛", + "(ؑ⸍⸍ᵕؑ̇⸍⸍)◞✧", + "✮⃛( ◞´•௰•`)✮⃛", + "(ؑᵒᵕؑ̇ᵒ)◞✧", + "₍₍ ◝(●˙꒳˙●)◜ ₎₎", + "(´。✪ω✪。`)", + "。;+*(★`∪´☆)*+;。", + "(๑˃̶͈̀o˂̶͈́๑)", + "≧ω≦", + "٩(^ᴗ^)۶", + "٩(●˙▿˙●)۶…⋆ฺ", + "٩(๑ơలơ)۶♡", + "٩(ó。ò۶ ♡)))♬", + "ε٩( ºωº )۶з", + "٩(๑òωó๑)۶", + "٩( ๑^ ꇴ^)۶", + "٩(๑˃́ꇴ˂̀๑)۶", + "٩(๑∂▿∂๑)۶♡", + "٩(♡ε♡ )۶", + "۹(ÒہÓ)۶", + "٩(ȏ)۶", + "٩(✿∂‿∂✿)۶", + "୧⍢⃝୨", + "⁽⁽٩(๑˃̶͈̀ ᗨ ˂̶͈́)۶⁾⁾", + "٩(;ʘ¿ʘ;)۶", + "=。:.゚٩(๑>ω<๑)۶:.。+゚", + "٩(˘◊˘)۶", + "٩(*ゝڡゝ๑)۶♥", + "٩(。θᗨθ。)۶", + "٩(ᴗ)۶", + "୧(˃◡ु˂)୨", + "۹(˒௰˓)۶", + "٩(●ᴗ●)۶", + "♡〜٩( ˃́▿˂̀ )۶〜♡", + "٩(º౪º๑)۶", + "=。:.゚٩(๑>◊<๑)۶:.。+゚", + "٩(๑❛ᴗ❛๑)۶", + "୧| ͡ᵔ ﹏ ͡ᵔ |୨", + "୧〳 ” ʘ̆ ᗜ ʘ̆ ” 〵୨", + "٩(๑❛ʚ❛๑)۶", + "٩(இ ⌓ இ๑)۶", + "୧| ” •̀ ل͜ •́ ” |୨", + "୧( , ^ ^ , )୨", + "٩| ര ‿ ര |╯", + "୧〳 ^ ౪ ^ 〵୨", + "୧( ˵ ° ~ ° ˵ )୨", + "୧། ☉ ౪ ☉ །୨", + "୧༼ ヘ ᗜ ヘ ༽୨", + "࿌ིྀ྇°˚࿅୧( ॑ധ ॑)୨࿅˳०࿌ིྀ྇", + "٩(◦`꒳´◦)۶", + "٩(๑˃̌ۿ˂̌๑)۶", + "٩(θ‿θ)۶", + "␟␏(ɲ˃ ˈ̫̮ ˂ɳ)␟␏ෆ", + "₊*ˈ˚·(๑˃̶̡̢̥ ॣಐ ॣ˂̶̡̢̥๑)·˚ˈ*₊", + "✩⃛∗·⁽⁽◞(˃◟̵◞̵˂⁎=͟͟͞͞ ⁎˃◟̵◞̵˂)◟⁾⁾·∗✩⃛", + "o(^O^*=*^O^)o", + "✧(๑✪д✪)۶ㅂ٩(✪д✪๑)✧", + "ヾ(゚∀゚○)ツ三ヾ(●゚∀゚)ノ", + "✧*.◟(ˊᗨˋ)◞.*✧ᗯ੨~ɪ̊♪ْ˖⋆", + "ෆු(*˃ர்˂*)ෆු", + "(ٛɲ˃ ˑ̣̮ ˂ٛɳ)", + "( ˃̆ૢ௰˂̆ૢഃ )", + "ლ(*꒪ヮ꒪*)ლ", + "૮(ᶿ̴͈᷇ॢ௰ᶿ̴͈᷆ॢ)ა✧", + "∗˚(* ˃̤൬˂̤ *)˚∗", + "б(>ε<)∂", + "∩|*`・ρ・´|∩", + "(gΦ皿Φ)g〃", + "(༶ૢ˃̵̑◡˂̵̑༶ૢ)", + "о(ж>▽<)y ☆", + "*\( *ω*)┓", + "โ๏∀๏ใ", + "癶(癶✺౪✺ )癶", + "⊂((〃≧▽≦〃))⊃", + "~(≧◇≦)/゙゙゙゙", + "6((((≧▽≦))))9", + "☆*・゜゚・*(^O^)/*・゜゚・*☆", + "☆*:.。. o(≧▽≦)o .。.:*☆", + "*✲゚*。✧٩(・ิᴗ・ิ๑)۶*✲゚*。✧", + "。.゚+:((ヾ(。・ω・)シ)).:゚+。", + "\( ● ⌒ ∇ ⌒ ● )/", + "゚・✿ヾ╲(。◕‿◕。)╱✿・゚", + "\\(゜ロ\\)Ξ(//ロ゜)//", + "o͡͡͡͡͡͡͡͡͡͡͡͡͡͡╮(^ ਊ ^)╭o͡͡͡͡͡͡͡͡͡͡͡͡͡͡", + "\(○^ω^○)/", + "゜+。:..:。+゜ (o´∀`o)──力ゎレlレl──(o´∀`o) ゜+。:..:。+゜", + "d(^^*)", + "♪d(´▽`)b♪オールオッケィ♪", + "♪(゚▽^*)ノ⌒☆", + "σ(゚ー^*)", + "(≧∇≦)キャー♪", + "ヾ(≧∇≦)ゞ チガウゥ", + "(o≧▽゚)oニパッ", + "(o゚▽゚)oニパッ", + "ヽ(*’-^*)。", + "ヾ(´▽`*;)ゝ", + "( ´∀`)ケラケラ", + "(´ω`*)ネー", + "゚+.(・∀・).+゚.。oO(    )", + "(人´∀`).☆.。.:*・", + "(ノ≧∀≦)ノ・‥…━━━★ ピキューン!", + "(;≧∇≦) =3 ホッ", + "にゃる~(σ^▽^)σ", + "o(≧∇≦o)(o≧∇≦)o", + "(゜ー゜*)ネッ!", + "(´ェ`*)ネー", + "^ω^", + "▼ω▼", + "(*^-^)", + "o(^-^)o", + "o(^▽^)o", + "σ(^○^)", + "(=^_^=)", + "(∩_∩)", + "o(^◇^)o", + "(゚∇^*)", + "(o^∀^)", + "(`▽´)", + "(☆▽☆)", + "(*´ー`)", + "(o^-^o)", + "(o^∇^o)", + "(○゚ε^○)", + "かわ.゚+.(´∀`*).+゚.ぃぃ", + "(*´∀`*)ゞ", + "(*・∀-)☆", + "゚+。:.゚ヽ(*´∀`)ノ゚.:。+゚", + "(★ ̄∀ ̄★)", + "{*≧∀≦}", + "°+(*´∀`)b°+°", + "(o゚▽゚)o゚▽゚)o゚▽゚)o ニパッ ニパッ ニパッ", + "0(^▽^*三*^▽^)0", + "y(^ヮ^)y", + "(●^U^●)", + "o(^∀^*)o", + "(○●^▽^●○)./", + "(o*∩3<*)☆", + "米^-^米", + "☆^(o≧∀≦)oニパッ", + "(´∀`)", + "(●>v<●)", + "(○^▽^○)", + "d(・∀<)ナイスッ*。*。”。*", + "(●^皿^●)にまー・・・", + "(●>ω<●)", + "(>Ц<●)", + "(◎>∀<◎)", + "・.。*・.。*(〃´∀`)・.。*・.。*ポワワァン…", + "(^■^*)", + "(*・∀<*)", + "(*´▽`*)", + "(●´I`●)", + "(o^^o)", + "カオ(o´∀`o)可愛いよ!", + "(◎>U<◎)", + "*:゜☆ヽ(*’∀’*)/☆゜:。*。", + "ヽ(= ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄∇ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄=)ノ", + "(*・▽・*)", + "(´w`*)", + "ニコ(*^_^*)ニコ", + "\(^○^)人(^○^)/アハハハハ♪", + "(。→∀←。)キャハ♡", + "゜+・(о´▽`о)゜+・", + "(*ノ∀`*)ノ", + "(*ロ′∀`b)・゜☆$,", + "((●≧艸≦)プププッ", + ".゚+.(´∀`*).+゚.", + "(*´∀`)アハハン♪", + "(^▽^●)", + "(●^□^●)", + "(*#′∀`艸)", + "+.゚(●´I`)b゚+.゚", + "(^∀^)", + "(^-^)ニコッ", + "ヾ(*Ő౪Ő*)", + "人-∀Q`圉)+°。", + "(v`▽´)v", + "(◕ฺー≦)ノ", + "(*●艸∀<$)◆◇", + "・+゜・。(*´∀`*)・゜+。+・", + "【●´∀`●】アヒャアヒャ*", + "((@^ェ^@))", + "\( ● ⌒ ∇ ⌒ ● )/", + "。.:*.゜☆(●´∀`●)ニコ.゜☆.。.:*.゜", + "♬♩♫♪☻(●´∀`●)☺♪♫♩♬", + "*^ヮ^)♪.,#,.♪sumairu♪.,#,.♪(+´∀`+)", + "( ͡° ͜ʖ ͡°)", + "∠( ᐛ 」∠)_", + "(゚⊿゚)", + "ᕕ( ᐛ )ᕗ", + "_へ__(‾◡◝ )>", + "( ᐛ )و", + "( ◞・౪・)", + "( ´ ▽ ` )ノ", + "(*^▽^*)", + "(´∇ノ`*)ノ", + "(ノ^∇^)", + "⊂((・▽・))⊃", + "( ^∇^)", + "( ゚▽゚)/", + "(‐^▽^‐)", + "(“⌒∇⌒”)", + "(*´▽`*)", + "(*^▽^)/", + "(*^▽^*)", + "(*~▽~)", + "(*≧▽≦)", + "(*⌒∇⌒*)", + "(*⌒▽⌒*)θ~♪", + "(/^▽^)/", + "(^∇^)", + "(^▽^)", + "( ̄▽ ̄)ノ", + "( ̄▽+ ̄*)", + "(゜▽゜;)", + "(=´∇`=)", + "(=⌒▽⌒=)", + "(≡^∇^≡)", + "(≧∇≦)/", + "(⌒▽⌒)", + "(⌒▽⌒)☆", + "(⌒▽⌒ゞ", + "(●⌒∇⌒●)", + "(❁´▽`❁)*✲゚*", + "(ノ*゜▽゜*)", + "°˖✧◝(⁰▿⁰)◜✧˖°", + "~ヾ(^∇^)", + "∩(︶▽︶)∩", + "≧(´▽`)≦", + "ー( ´ ▽ ` )ノ", + "ヾ(´▽`;)ゝ", + "ヾ(^∇^)", + "d=(´▽`)=b", + "o(〃^▽^〃)o", + "o(^▽^)o", + "O(≧∇≦)O", + "o(≧∇≦o)", + "(≧∇≦*)", + "(=^▽^=)", + "o(*^▽^*)o", + "೭੧(❛▿❛✿)੭೨", + "☜(⌒▽⌒)☞", + "☜(˚▽˚)☞", + "ɾ⚈▿⚈ɹ", + "ヘ(= ̄∇ ̄)ノ", + "φ(*⌒▽⌒)ノ", + "(*・▽・*)", + "(☆▽☆)", + "≡(*′▽`)っ", + "」( ̄▽ ̄」)", + "(〃⌒∇⌒)", + "〔´∇`〕", + "(゜▼゜*)", + "໒( ͡ᵔ ▾ ͡ᵔ )७", + "(。´∀`)ノ", + "( ´∀`)", + "(・∀・)", + "(´∀`)", + "(°∀°)b", + "(●´∀`●)", + "(゚∀゚)☞", + "*(*´∀`*)☆", + "( ´ ∀ ` )", + "ヽ(・∀・)ノ", + "(。≖ˇ∀ˇ≖。)", + "((o(´∀`)o))", + "o(´∀`*)", + "(゚∀゚ )", + "(*≧∀≦*)", + "(*゚∀゚*)", + "ヾ(*´∀`*)ノ", + "(o^∀^o)", + "ヾ(^ิ∀^ิ)", + "o(`・∀・´)○", + "(ᗒᗊᗕ)", + "(ノ・∀・)ノ", + "o((◕ฺ∀ ◕✿))o", + "(´・∀・`)", + "∩(´∀`∩)", + "(ノ `・∀・)ノ゙", + "( ゚∀ ゚)", + "Ψ(゚∀゚ )Ψ", + "Ψ( ゚∀゚)Ψ", + "Ψ(゚∀゚)Ψ", + "d┃・∀・┃b", + "(*´・∀・)", + "(・∀・○)", + "【°∀°】", + "(★ ̄∀ ̄★)", + "(m*´∀`)m", + "=͟͟͞͞( °∀° )☛", + "∩(´∀`∩)", + "∩( ´∀` )∩", + "(∩´∀`)∩", + "⊂( ・ ̫・)⊃", + "(*′☉.̫☉)", + "((ඏ.̫ඏ*))", + "⁽͑˙ˆ˙̫ˆ˙⁾̉", + "(๑★ .̫ ★๑)", + "‧⁺◟( ᵒ̴̶̷̥́ ·̫ ᵒ̴̶̷̣̥̀ )", + "(^~^)", + "( ‾ʖ̫‾)", + "(̂ ˃̥̥̥ ˑ̫ ˂̥̥̥ )̂", + "⁽ˇ́˙̫ˇ̀˵⁾", + "( ᵕ̤ ‧̫̮ ᵕ̤ )", + "⁽͑΅ ˙̫ ῭⁾̉", + "(⋆ʾ ˙̫̮ ʿ⋆)", + "੭व(๑• .̫ •๑) ✧", + "(*′☉.̫☉)", + "⁽͑˙՞˙̫՞˙⁾̉", + "(´•.̫ • ⋈)", + "( ❝̆ ·̫̮ ❝̆ )✧", + "((⚆·̫⚆‧̣̥̇ ))", + "(Θ̎Ͻ̫̥Θ̎)", + "ᗧʻ̑ ˙̫ ʻ̑ᗤ", + "( •́ .̫ •̀ )", + "(*´・v・)", + "(*^v^*)", + "(^v^)", + "(▰˘v˘▰)", + "(n˘v˘•)¬", + "(´。・v・。`)", + "♡✧( ु•⌄• )", + "( •⌄• ू )✧", + "῍̩̞(∗ɞ⌄ɞ∗)◞", + "(′ʘ⌄ʘ‵)", + "( ^_^)/", + "(^ _ ^)/", + "(^_^)", + "(^-^*)/", + "( ̄ー ̄)", + "(∩_∩)", + "(∩▂∩)", + "(☆^ー^☆)", + "(v^_^)v", + "p(*^-^*)q", + "(^・ω・^ )", + "(=^-ω-^=)", + "(=^・ω・^)y=", + "( ノ^ω^)ノ゚", + "(_´ω`)", + "(。・ω・。)", + "(︶ω︶)", + "(`・ω・´)”", + "(´ω`★)", + "(^ω^)", + "(◐ω◑ )", + "∩( ・ω・)∩", + "ヾ(。・ω・。)", + "୧( ॑ധ ॑)୨", + "d(=^・ω・^=)b", + "o(U・ω・)⊃", + "V(=^・ω・^=)v", + "川´・ω・`川", + "(*´꒳`*)", + "(*^ω^*)", + "(❁´ω`❁)", + "(´-ω-`)", + "ଘ(੭ˊ꒳ˋ)੭✧", + "(´へωへ`*)", + "( ^ω^)", + "( ^ω^)", + "(’ω’)", + "(‘ω’)", + "(‘ω’)", + "٩(ↁωↁ❀)", + "˚✧₊⁎( ˘ω˘ )⁎⁺˳✧༚", + "(◜௰◝)", + "✾(〜 ☌ω☌)〜✾", + "(´∩ω∩`)", + "(¬‿¬)", + "( ⋂‿⋂’)", + "(-‿◦)", + "(*‿*✿)", + "(•‿•)", + "(•̀ᴗ•́)و ̑̑", + "(─‿─)", + "(◍•ᴗ•◍)", + "(◑‿◐)", + "(✿´‿`)", + "(❀◦‿◦)", + "(❁´‿`❁)*✲゚*", + "(ᅌᴗᅌ* )", + "(•ˇ‿ˇ•)-→", + "♫꒰・‿・๑꒱", + "o (^‿^✿)", + "(◑‿◐✿)", + "(◡‿◡✿)", + "(✿◠‿◠)", + "(◕‿◕✿)", + "(๑>ᴗ<๑)", + "(๑✧◡✧๑)", + "(๑>◡<๑)", + "♪(๑ᴖ◡ᴖ๑)♪", + "(。◝‿◜。)", + "(๑^ں^๑)", + "(ෆ ͒•∘̬• ͒)◞", + "(•৺•)", + "(ට˓˳̮ට๑)", + "(๑•͈ᴗ•͈)", + "₍՞◌′ᵕ‵ू◌₎♡", + "三⊂( っ⌒◡|", + "(ؑᵒᵕؑ̇ᵒ)◞✧", + "꒰•́ॢ৺•̀ॢ๑͒꒱", + "⁽(◍˃̵͈̑ᴗ˂̵͈̑)", + "(人 •͈ᴗ•͈)", + "(*˙︶˙*)☆*°", + "(୨୧ ❛ᴗ❛)✧", + "(*◕ᴗ◕*)", + "( ¨̮ )", + "(*´╰╯`๓)♬", + "(∗❛ัᴗ❛ั∗)", + "⊂(◉‿◉)つ", + "(人 •͈ᴗ•͈✿ฺ)", + "( ・ᴗ・̥̥̥ )", + "(≖ ‿ ≖)", + "(๑˃͈꒵˂͈๑)", + "(>̯-̮<̯)", + "(-‿-)", + "(๑→‿ฺ←๑)", + "(∗ᵕ̴᷄◡ᵕ̴᷅∗)՞", + "( •॒◞ ͜◟•॒ )", + "(ㆁᴗㆁ✿)", + "(๑’◡͐’๑)", + "(⌒⃝৺⌒⃝)", + "{´◕ ◡ ◕`}", + "(ට ̥̆ ට)", + "⁽͑˙˚̀ᵕ˚́˙⁾̉", + "(*☌ᴗ☌)。*゚", + "( ´◡‿ゝ◡`)", + "( ◠ ◡ ◠ )", + "ల(*´= ◡ =`*)", + "( ́⋅⃘ˬ̇⋅⃘ ̀ˋ)", + "( ᵘ ᵕ ᵘ ⁎)", + "(๑`・ᴗ・´๑)", + "❀.(*´◡`*)❀.", + "◟(๑•͈ᴗ•͈)◞", + "₍ఠ ͜ఠ₎", + "(•‾̑⌣‾̑•)", + "(⋈・◡・)✰", + "(⁝̥ꑦᴗꑦ)", + "(︶.̮︶✽)", + "(❍❛‿❛❍❋)", + "₍•͈ᴗ•͈₎", + "(ͼ ̥̆ ͽ)", + "(≖ᴗ≖๑)", + "( °̥̥̥̥̥̥̥̥◡͐°̥̥̥̥̥̥̥̥)", + "( ´͈ ◡ `͈ )", + "( ๑॔•◡ુ•๑॓)", + "(๑・`◡´・๑)", + ",、’`(((;ŏᴗŏ))),、’`’`,、", + "৵( °͜ °৵)", + "(✿◕ ‿◕)ノ))。₀: *゜", + "☆(❁‿❁)☆", + "◃┆◉◡◉┆▷", + "q(❂‿❂)p", + "☆(◒‿◒)☆", + "⊂◉‿◉つ", + "(。✿‿✿。)", + "໒( ﹒ ͜ر ﹒ )७", + "( ‾̮‿͂‾̮ ꐦ)", + "(˘・ᴗ・˘)", + "(ό‿ὸ)ノ", + "ヾ|๑ ╹ ◡ ╹ ๑|ノ", + "(((;◔ᴗ◔;)))", + "໒( ” ¤ ‿ ¤ ” )७", + "✩*॰ ( ¨̮ ) ॰*✩", + "(✧≖‿ゝ≖)", + "( ◠‿◠ )", + "(*´◡`​*)", + "(๑◔‿◔๑)", + "(◕‿‿◕。)", + "(✿╹◡╹)", + "(◞‿◟)", + "(o˘◡˘o)", + "( ˆᴗˆ )", + "₊·(ϱ॔⌄ᵕ๑॓)‧*", + "-(๑☆‿ ☆#)ᕗ", + "╭ (oㅇ‿ o#)ᕗ", + "/人◕ ‿‿ ◕人\", + "(o◞ิ‿◟ิo)", + "(•_ ͜_•)", + "(´>‸⚲͜<)", + "(๑❝᷀ົཽ ⁐̵ ❝᷀ົཽ)✧", + "(• ̥̆ •)", + "(o^^)o", + "ヾ(^ ^ゞ", + "o(^^o)", + "(o^^o)♪", + "(o⌒.⌒o)", + "(=^・^=)", + "。(⌒.⌒。)", + "( ノ^.^)ノ゚", + "(“⌒.⌒”)", + "(≧.≦*)", + "(*^^*)", + "( ´͈ ᗨ `͈ )", + "(・ัᗜ・ั)و", + "(➲ ᗜ ➲)", + "(˵¯̴͒ꇴ¯̴͒˵)", + "(ᗒᗨᗕ)", + "(๑’ᗢ’๑)ฅ", + "┌༼ ˵ ° ᗜ ° ˵ ༽┐", + "ˉ̶̡̭̭ ( ´͈ ᗨ `͈ ) ˉ̶̡̭̭", + "(□ᗜ□)", + "(:D)┼─┤", + "ヽ〳 ՞ ᗜ ՞ 〵ง", + "(-^〇^-)", + "(.=^・ェ・^=)", + "(・◇・)", + "(*^ワ^*)", + "(*¬*)", + "(´ヮ`)", + "(^(I)^)", + "(^(エ)^)", + "(^⊆^)", + "(๑^っ^๑)", + "(>y<)", + "(⊙ヮ⊙)", + "(☆^O^☆)", + "°˖ ✧◝(○ ヮ ○)◜✧˖ °", + "⊂(^(工)^)⊃", + "ヾ(*⌒ヮ⌒*)ゞ", + "(ⓥꇳⓥ*)", + "(๑❛ꆚ❛๑)", + "(^ワ^=)", + "(*´ч ` *)", + "(。◑ヮ◑。)", + "(ꉺ౪ꉺ)", + "( ◑ٹ◐)", + "(´ёٹё)", + "(*^ิ益^ิ*)", + "(´◉◞౪◟◉)", + "(*^。^*)", + "(๑*౪*๑)", + "(^凹^)", + ",、’`<(❛ヮ❛✿)>,、’`’`,、", + "ೖ(σ̑˽σ̑)ೖ", + "(●⌃ٹ⌃)", + "(*꒩̐﹀꒩̐*)", + "(^◇^;)", + "(✿ ◜◒◝ )", + "(´◉◞౪◟◉`)", + "(థฺˇ౪ˇథ)", + "( •˓◞•̀ )", + "(*ꄱͦ︺ꄱͦ*)", + "( ՞ٹ՞)", + "( ´•౪•`)", + "(*´∪`)", + "(◍ȋ ₎໐͜₍ ȋ◍)", + "♪~♪ d(⌒o⌒)b♪~♪", + "♪♪v(⌒o⌒)v♪♪", + "∩`・◇・)", + "థ౪థ", + "₍‧ꀈ˙⁾՜", + "( θོثθོ )", + "ʿʿ˅⁽ˆ⁰ˆ˺ ⁾˺", + "♪~♪ d(⌒o⌒)b♪~♪", + "♪♪v(⌒o⌒)v♪♪", + "(◍ȋ ₎໐͜₍ ȋ◍)", + "(*´∪`)", + "( ´•౪•`)", + "( ՞ٹ՞)", + "∩`・◇・)", + "థ౪థ", + "₍‧ꀈ˙⁾՜", + "( θོثθོ )", + "ʿʿ˅⁽ˆ⁰ˆ˺ ⁾˺", + "(★^O^★)", + "(((o(*゚▽゚*)o)))", + "\(@ ̄∇ ̄@)/", + "ヽ(;▽;)ノ", + "ヾ(@^▽^@)ノ", + "o((*^▽^*))o", + "O(≧▽≦)O", + "– =͟͟͞͞ ( ꒪౪꒪)ฅ✧", + "“ヽ(´▽`)ノ”", + "(((\(@v@)/)))", + "(ノ´ヮ´)ノ*:・゚✧", + "(ノ^_^)ノ", + "(ノ>▽<。)ノ", + "(ノ゚▽゚)ノ", + "〈( ^.^)ノ", + "\(*T▽T*)/", + "\(^▽^)/", + "\(^ω^\)", + "\(T∇T)/", + "☆*:.。. o(≧▽≦)o .。.:*☆", + "ヽ(;^o^ヽ)", + "ヽ(;▽;)ノ", + "ヽ(‘ ∇‘ )ノ", + "ヾ(@† ▽ †@)ノ", + "ヾ(@^∇^@)ノ", + "ヾ(@^▽^@)ノ", + "ヾ(@^▽^@)ノ", + "ヾ(@゜∇゜@)ノ", + "ヾ(@゜▽゜@)ノ", + "ヾ(@°▽°@)ノ", + "ヾ(@⌒ー⌒@)ノ", + "ヽ(*≧ω≦)ノ", + "ヽ(*・ω・)ノ", + "ヽ(*⌒∇⌒*)ノ", + "ヾ(^-^)ノ", + "ヽ(^。^)丿", + "ヽ(^Д^)ノ", + "ヽ(=^・ω・^=)丿", + "٩(^ᴗ^)۶", + "о(ж>▽<)y ☆", + "ヘ(^_^ヘ)", + "ヘ(^o^ヘ)", + "へ(゜∇、°)へ", + "(/・ω・)/", + "୧(﹒︠ᴗ﹒︡)୨", + "( ՞ਊ ՞)", + "⸂⸂⸜(രᴗര๑)⸝⸃⸃", + "˛˛ƪ(⌾⃝ ౪ ⌾⃝ ๑)و ̉ ̉", + "ヾ(๑╹ヮ╹๑)ノ”", + "ヾ(๑╹ꇴ◠๑)ノ”", + "ヾ(๑ㆁᗜㆁ๑)ノ”", + "ヾ(Ő∀Ő๑)ノ", + "(੭ु。╹▿╹。)੭ु⁾⁾", + "₍₍ (ง Ŏ౪Ŏ)ว ⁾⁾", + "(ง •ૅ౪•᷄)ว", + "₍₍⁽⁽(ી(^‿ゝ^)ʃ)₎₎⁾⁾", + "(ノ^_^)ノ", + "⌒°(ᴖ◡ᴖ)°⌒", + "⌒(o^▽^o)ノ゚", + "。:.゚ヽ(´∀`。)ノ゚.:。+゚", + "゚+。:.゚ヽ(*´∀`)ノ゚.:。+゚", + "ヾ(○・ω・)ノ☆", + "୧( “̮ )୨✧", + "(๑˃̶͈̀◡˂̶͈́๑)", + "✩◝(◍⌣̎◍)◜✩", + "∕∕∕ ∕ ∕∕˛₍˴◅ˋ)੭✧∕∕∕ ∕∕", + "(◜▿‾ ≡‾▿◝)", + "୧[ ˵ ͡ᵔ ͜ʟ ͡ᵔ ˵ ]୨", + "ヾ( ~▽~)ツ", + "(ノ*´▽)ノ", + "ヽ(^◇^*)/", + "ヾ( ❀◕◡◕ฺฺ )ノ", + "ヽ(◕◡◕❀ฺ )ノ", + "ヾ(^▽^ヾ)", + "୧〳 ^ ౪ ^ 〵୨", + "=͟͟͞͞٩(๑☉ᴗ☉)੭ु⁾⁾", + "ლ(⌒▽⌒ლ)", + "(ღ˘⌣˘ღ)", + "(ღ˘⌣˘ღ) ♫・*:.。. .。.:*・", + "(ॢ˘⌣˘ ॢ⑅)", + "꒰ღ˘‿˘ற꒱⃛", + "ლ(́◉◞౪◟◉‵ლ)", + "ლ(๏‿๏ ◝ლ)", + "῍̻̩✧(´͈ ૢᐜ `͈ૢ)˖῍̻̩", + "( ᵕ́ૢ‧̮ᵕ̀ૢ)‧̊·*", + "(•́ ॣ·̫ ॣ•̀,)՞", + "(*๓´╰╯`๓)", + "(ू• ౪•ू )", + "ლ(╹◡╹ლ)", + "ლ(o◡oლ)", + "(ღ′◡‵)", + "(*ฅ́˘ฅ̀*)", + "*(Ü*ૢ)*", + "ღවꇳවღ", + "ಞ(ల˙◡˙ల)ಞ", + "( ღ’ᴗ’ღ )", + "(ლ◖◡◗ ლ)", + "ლↂ‿‿ↂლ", + "ლ(- ◡ -ლ)", + "ლ(❛◡❛✿)ლ", + "ლ(・ิω・ิლ)", + "ლ(^ω^ლ)", + "ლ(・∀・ )ლ", + "ლ(´∀`ლ)", + "(∩❛ڡ❛∩)", + "(っ˘ڡ˘ς)", + "(⁎⁍̴ڡ⁍̴⁎)", + "(≧ڡ≦*)", + "(*^ڡ^*)", + "(∩ڡ∩)", + "(〜^ڡ^)〜", + "o((*^ڡ^*))o", + "(・ڡ・)", + "( ^ڡ^)", + "(*⌒ڡ⌒*)", + "∩(︶ڡ︶)∩", + "〜(^∇^〜)", + "〜( ̄▽ ̄〜)", + "。(⌒∇⌒。)", + "(〜^∇^)〜", + "(〜 ̄▽ ̄)〜", + "(。⌒∇⌒)。", + "((┌|o^▽^o|┘))♪", + "(~‾⌣‾)~", + "(~ ̄▽ ̄)~", + "(~˘▾˘)~", + "~(⁰▿⁰)~", + "~(‾⌣‾~)", + "~(˘▾˘)~", + "~(˘▾˘~)", + "┌(˘⌣˘)ʃ", + "ƪ(˘⌣˘)ʃ", + "ƪ(˘⌣˘)┐", + "♪((└|o^▽^o|┐))", + "。^‿^。", + "。◕‿◕。", + "´・ᴗ・`", + "^ ͜• ^", + "~ヾ ^∇^", + "≖‿≖", + "⊙▽⊙", + "⊙ω⊙", + "▽・ω・▽", + "◕ ‿ ◕", + "ʘ‿ʘ", + "ಥ‿ಥ", + "ȏ.̮ȏ", + "✾꒡ .̮ ꒡✾", + "∩˙▿˙∩", + "´͈ ᵕ `͈", + "´͈ ᵕ `͈ ♡°◌̊", + "ヽミ ´∀`ミノ", + "◉‿◉", + "˙ ͜ʟ˙", + "ෆ╹ .̮ ╹ෆ", + "أ‿أ", + "ರ ౪ ರ", + "˙ᘧ ͜ ˙", + "❝᷀ົ৺❝᷀ົ", + "ɷ◡ɷ", + "⋆•̵̑◡͐•̵̑⋆", + "⁙ὸ‿ό⁙", + "ᴑ͝ᴗᴑ͝", + "〤◕‿◕〤", + "⋆ᘟ◡ुᘟ⋆", + "⚆ꆚ⚆", + "◙‿◙", + "Ü", + "❀◕ ‿ ◕❀", + "<【】‿【】>", + "◉ ˙̫̮ ◉", + "⁞ ᵕ ‿ ᵕ ⁞", + "米^-^米", + "റ്ധ ੭ റ്ധ", + "(◕‿◕✿)", + "(≖(‿)≖)", + "(´^ิ益^ิ` )", + "˚ஐ₊✧(ؔ❝ ⍢ ؔ❝ೢ⁎)⁺˳ஐ༚", + "(ؔ♝ཻ༨ཻ)✩⃛", + "(•ؔʶ̷ ˡ̲̮ ؔʶ̷)✧", + "ॱ॰⋆(˶ॢ‾᷄﹃‾᷅˵ॢ)ӵᵘᵐᵐᵞ♡♡♡", + "( ´͈ ॢꇴ  `͈)੭ु⁾⁾·°˖ᔆᵘᵗᵉᵏⁱ✧˖°", + "Ⓗⓐⓟⓟⓨヾ(◍’౪`◍)ノ゙", + "(^▽^)/ ʸᵉᔆᵎ", + "(•ᵕᴗᵕ•)⁾⁾ᵖᵉᵏᵒ", + "⦅❛◡❛ॣॣ⦆*.・。╟╢ᎯƤƤᎽ*.・。", + "ପ(๑•̀ुᴗ•̀ु)* ॣ৳৸ᵃᵑᵏ Ꮍ৹੫ᵎ *ॣ", + "▒▒▓█▇▅▂∩( ✧Д✧)∩▂▅▇█▓▒▒", + "☆⌒Y⌒Y⌒Y⌒Y⌒ヾ(●´U`●)ノ", + "☆*・゜゚・*(^O^)/*・゜゚・*☆", + "☆*✲゚*。(((´♡‿♡`+)))。*゚✲*☆", + "“:♡.•♬✧⁽⁽ଘ( ˊᵕˋ )ଓ⁾⁾*+:•*∴", + "☆゚・*:。.:(゚∀゚)゚・*:..:☆", + "( ❀⃙⃕⃠⃝⃘⃚౪❀⃙⃕⃠⃝⃘⃚ )", + "o͡͡͡͡͡͡͡͡͡͡͡͡͡͡╮(。❛ᴗ❛。)╭o͡͡͡͡͡͡͡͡͡͡͡͡͡͡", + "v(۝)v", + "( ´◔ ۝ゝ◔`)", + "(◉۝◉)", + "╭〳 . ˘ ۝ ˘ . 〵╮", + "ू꒰΄ ิ̤۝ ิ ̤꒱ु", + "༼∗ღ۝ღ∗༽", + "໒( ˵ ° ۝ ° ˵ )७", + "(✧۝✧)/", + "| ᴼ ۝ ᴼ |", + "༼ ˘ ۝ ˘ ༽", + "╰།  ̄ ۝  ̄ །╯", + "໒( ́ ۝ ́ )७", + "╭། ” • ۝ • ” །╮", + "┌[ ʘ̆ ۝ ʘ̆ ]┐", + "╏ *  ̄ ۝  ̄ * ╏", + "(⸌۝⸍)", + "╰(⊹◕۝◕ )╯", + "⊱(*⁍ ڡ ⁍*)⊰", + "(๑′ڡ‵๑)۶४४yϋᵐᵐӵ♡॰⋆̥", + "٩(*ゝڡ◕๑)۶♥", + "ꉨڡꉨ", + "(*´ڡ`●)", + "ʕ ∗ •́ ڡ •̀ ∗ ʔ", + "╰། ❛ ڡ ❛ །╯", + "ヽ(๑╹ڡ╹๑)ノ", + "(ノ≧ڡ≦)", + "(ˆ ڡ ˆ)", + "ʕっ˘ڡ˘ςʔ", + "(๑╹ڡ╹๑)", + "ᕙ། – ڡ – །ᕗ", + "(∩❛ڡ❛∩)", + "(っ˘ڡ˘ς)", + "ლ(´ڡ`ლ)", + "(⁎⁍̴ڡ⁍̴⁎)", + "(රڡර人)", + "(ॢ◕ัڡ ◕ั ॢ)", + "(≧ڡ≦*)", + "ԅ[ ˵ ڡ ˵ ]凸", + "୧〳 ” • ڡ • ” 〵୨", + "ᕕ[ ˵ ڡ ˵ ]┐", + "(๑╹ڡ╹)", + "໒( = ▀ ڡ ▀ = )७", + "| ⊘ ڡ ⊘ |", + "ʕ ▀ ڡ ▀ ʔ", + "ʕ ି ڡ ି ʔ", + "╭〳 ° ڡ ° 〵╮", + "ᕙ▐ ” ° ڡ ° ” ▐ᕗ", + "ʕ ڡ ʔ", + " ᕦ〳 ⊙ ڡ ⊙ 〵ᕤ", + " ԅ| . ͡° ڡ ͡° . |ᕤ", + "ᕕ[ ᓀ ڡ ᓂ ]ㄏ", + " 〳 : ⊘ ڡ ⊘ : 〵", + "(๑ゝڡ◕๑)", + "(๑´ڡ`๑三๑´ڡ`๑)", + "໒( ᓀ ڡ ᓂ )७", + "[ ☉ ڡ ☉ ]", + "( ๑ ❛ ڡ ❛ ๑ )", + " (๑´ڤ`๑)", + " ( ՞ ڡ ՞ )", + "ԅ|.͡° ڡ ͡°.|ᕤ", + "ʅ ﴾סּ ؂ סּ ʅ ﴿", + "ತ ൧͑ ತ", + "(๑ ˭̴̵̶᷄൧̑ ˭̴̵̶᷅๑)", + "(ර൧ර☆)", + "(ತ ൧ ತ)", + "໒( ᓀ ൧ ᓂ )७", + "[ ☉ ൧ ☉ ]", + "ԅ|.͡° ൧ ͡°.|ᕤ", + "ʕっ˘൧˘ςʔ", + "╰། ❛ ൧ ❛ །╯", + "(っ˘൧˘ς)", + "(๑╹൧╹๑)", + "ʕ ∗ •́ ൧ •̀ ∗ ʔ", + "_:(´ཀ`」 ∠):_", + " (´ q ` ” )", + "v(❆ڼ❆)v", + "(  ิ౪ ิ )っ─∈", + "ᕕ[ ᓀ ڡ ᓂ ]ㄏ─∈", + " ( ՞ ڡ ՞ )─∈", + "໒( ́ ۝ ́ )७─∈", + "(っ˘ڡ˘)っ─∈", + "╭〳 ° ڡ ° 〵─∈", + "ʕ ∗ •́ ڡ •̀ ∗ ʔ─∈", + "ᕙ། – ڡ – །─∈", + "╰། ❛ ڡ ❛ །─∈", + "ʕっ˘ڡ˘ʔっ─∈", + "ψ(・ω´・,,ψ", + "ヘ(。□°)ヘ", + "(。_+)\", + "((((*。_。)_", + "(xLx)ヾ", + "「(=>o≦=)ノ", + "/(*ι*)ヾ", + "/(x~x)\", + "~(>_<~)", + "┗( ●-﹏ `。)づ", + "☆ ̄(>。☆)", + "☆⌒(>。≪)", + "(‘﹏*๑)", + ".( ̵˃﹏˂̵ )", + "ლ(。-﹏-。 ლ)", + "(˃̶᷄︿๏)", + "(っ- ‸ – ς)", + "(ᗒᗩᗕ)՞", + "● ﹏☉", + "໒(⁄›˅̭‹∖)७", + "⁎×﹏×⁎՞༘", + "☆( -o-)~~", + "(x_x☆", + "◟̽◞̽ ༘*", + "(≥_<)", + "(⇀⼼_↼)*✲゚*", + "(*>_<*)", + "(*о*)≡☆", + "╰[Ĺ̯ಠ]╯", + "―(T_T)→", + "✧*。ヾ(。>﹏<。)ノ゙✧*。", + "(。_°☆\(- – )", + "(☆_@;)☆ \(`-´メ)", + "(._+ )☆\(-.-メ)", + "!!( *д*):・’.::・(ーー; )", + "(ノ>ノ)", + "◎☆(♯××)┘", + "(o_ _)o", + "(o_□_)o", + "(ヘ_ _)ヘ", + "* ・・(o_ _)o", + "ヽ(_ _ヽ)", + "ヽ(_ _ヽ)彡", + "(ノ_ _)ノ", + "εミ(ο_ _)ο", + "ο(_ _ο)彡3", + "ミ(ノ_ _)ノ", + "εミ(ο_ _)ο", + "ο(_ _ο)彡3", + "ミ(ノ_ _)ノ", + "ヘ(_ _ヘ)", + "ヘ(。。ヘ)☆", + "┏|*_ _|┓", + "( っ_ _)っ))", + "⊂⌒~⊃。Д。)⊃", + "((( ⊂⌒~⊃。Д。)⊃", + "(o_ _)ノ彡☆", + "☆ヽ(o_ _)o", + "⊂´⌒∠;゚Д゚)ゝつ", + "(。´>д<)っ彡☆", + "(o_ _)o))", + "!☆〓(ノ_ _)ノ", + "┌(。Д。)┐", + "(o_ _)ノ彡☆", + "☆^(o≧∀≦)o", + "=D—(o_ _)o", + "ミ(ノ_ _)ノ=3", + "☆ミ(+ωゞ)☆彡", + "ミ☆(*._.)", + "ヘ(>_<ヘ)", + "(;; ̄Д ̄)ノヾ((((;゜д゜))__", + "[ ± _ ± ]", + "(๑-﹏-๑)", + "(˘̭⺫˘̭ ;)", + "(-﹏-。)", + "(☍﹏⁰)。", + "( ⁺⌓⁺;)՞", + "ෆ(˃͈᷇◟̵◞̵˂͈᷆ ფ", + "◝(๑⁺᷄д⁺᷅๑)◞՞", + "ಸ , ໖", + "ಸ_ಸ", + "(°﹏。υ)", + "༼ ಥ﹏لಥ ༽ ᵘgᵍʰ", + "⊂((° x。))⊃", + "。.*:・’゚:。'(((+_+)))。.*:゚・’゚゚:。’・゚", + "(゚×゚lll)", + "( •́ •̀)", + "(´ж`;)", + "(●’x`*)⌒%", + "(ノ’x`。ヽ)", + "‧∘˳°∗˚(⁎›ˍູ‹) ∗.∘˚˳°", + "(;・ж;・;)", + "( ╹╹)", + "(*;゚;艸;゚;)", + "(;゚;┏艸┓;゚;)", + "_| ̄|○、;’.・", + ";`;:゙;`(;゚;ж;゚; )", + "˓˓( ₎˔̈₍ )˒˒", + "(。・艸・)", + "(*U艸U*)", + "((゜乂゜))", + "⋆* ⁑⋆* (๑•﹏•)⋆* ⁑⋆*", + "(#´Ⅹ`#)", + "┗┐(;;*;:´;艸;`:;*;;)┌┛", + "ε≡ ε≡ ε≡ ε= (#・ж・)", + "。゜+.(:.;゜;艸;゜;.:)゜+.゜", + "ε-(≖д≖﹆)", + "ε-(>.<;;", + "ε=o(´ロ`||)", + "((( +д+)o=3=3", + "ε-(>o<)", + "(;≧∇≦) =3", + "(●`□´)=з", + "人人人ヾ( ;×o×)〃 人人人", + "︵‿︵‿︵‿︵‿︵‿︵‿︵‿︵‿︵‿ヽ(゜□゜ )ノ︵‿︵‿︵‿︵‿︵‿", + "⁽⁽ƈ ͡ (ु ˲̥̥̥́ ˱̥̥̥̀) ु⁾⁾", + "₊·(ϱ॔﹏ᵕ๑॓)‧*", + "ₒ˛˚̣ (˃ᾓ˂⁎)₎₎", + "₍₍ (˚͈ⅈ∘͈⁎৲ु₎₎՞", + "(ˊ⌄˴⁎৲ु", + "(●♡∀♡)", + "(。♥‿♥。)", + "(♥ω♥ ) ~♪", + "(♥ω♥*)", + "(✿ ♥‿♥)", + "✿♥‿♥✿", + "乂♥‿♥乂", + "٩(♡ε♡ )۶", + "ლζ*♡ε♡*ζლ", + "⊂(♡⌂♡)⊃", + "(๑♡3♡๑)", + "(๑♡⌓♡๑)", + "♱♡‿♡♰", + "⊆♥_㇁♥⊇", + "(●♡∀♡))ヾ☆*。", + "໒( ♥ ◡ ♥ )७", + "༼♥ل͜♥༽", + "(灬♥ω♥灬)", + "(‘∀’●)♡", + "(´∀`)♡", + "(*´▽`*)", + "(´・` )♡", + "(´ω`♡%)", + "♥(ˆ⌣ˆԅ)", + "ლ(́◉◞౪◟◉‵ლ)", + "₍՞◌′ᵕ‵ू◌₎♡", + "♡ฅ(ᐤˊฅˋᐤ♪)", + "ʚ♡⃛ɞ(ू•ᴗ•ू❁)", + "♡(ŐωŐ人)", + "⃛ヾ(๑❛ ▿ ◠๑ )", + "(*’∀’人)♥", + "(°◡°♡).:。", + "ʸ(➜◡ु⚈)♡⃛", + "ˉ̞̭(′͈∨‵͈♡)˄̻ ̊", + "φ(゚ ω゚//)♡", + "ʸ(ᴖ́◡ु⚈)♡⃛", + "(′̤ॢ∀ ू‵̤๑))ˉ̞̭♡", + "♡♡+.゚(→ε←*)゚+.゚", + "(●´□`)♡", + "(。・ω・。)ノ♡", + "(。’▽’。)♡", + "(●´∀`)ノ♡", + "₍₍ ( ๑॔˃̶◡ ˂̶๑॓)◞♡", + "(๑・ω-)~♥”", + "(๑°꒵°๑)・*♡", + "~(^з^)-♡", + "(ෆ ͒•∘̬• ͒)◞", + "♡(㋭ ਊ ㋲)♡", + "(●’ᴗ’σ)σணღ*", + "(•‾⌣‾•)و ̑̑♡", + "( ෆຶдෆຶ)", + "(⁎⁍̴̛͂▿⁍̴̛͂⁎)*✲゚*。⋆", + "(*´o`*)ʖˋʖˋʖˋ~♡", + "ღゝ◡╹)ノ♡", + "♡✧( •⌄• )", + "(●මᴗමσ)σணღ*", + "(๑╹ڡ╹)╭ ~ ♡", + "(๑ Ỡ ◡͐ Ỡ๑)ノ♡", + "(♡ ὅ ◡ ὅ )ʃ♡", + "(⁎⁍̴̀﹃ ⁍̴́⁎)♡", + "(⋈◍>◡<◍)。✧♡", + "ε=(。♡ˇд ˇ♡。)", + "(◍•ᴗ•◍)", + "(∩˃o˂∩)♡", + "♡(.◜ω◝.)♡", + "♡〜٩(^▿^)۶〜♡", + "♡´・ᴗ・`♡", + "♡^▽^♡", + "♥╣[-_-]╠♥", + "♡ლ(-༗‿༗-)ლ♡", + "(。・‧̫・。).**♡", + "(◍•ڡ•◍)", + "-ω(´•ω•`)♡", + "(ෆˊ͈ ु꒳ ूˋ͈ෆ)", + "(♡´౪`♡)", + "ෆ╹ .̮ ╹ෆ", + "( ◜◒◝ )♡", + "♡〜ლ(๑癶ᴗ癶๑)ლ〜♡", + "(♡´❍`♡)*✧ ✰ 。*", + "(´∩。• ᵕ •。∩`) ♡", + "( ˊᵕˋ )♡.°⑅", + "(♡ >ω< ♡)", + "( ๑ ❛ ڡ ❛ ๑ )", + "(♥→o←♥)", + "(◍•ᴗ•◍)♡ ✧*。", + "(〃・ω・〃)", + "(*°∀°)=3", + "♥(ノ´∀`)", + "(♡´艸`)", + "(´,,•ω•,,)♡", + "♥╰(⸝⸝⸝´꒳`⸝⸝⸝)╯", + "(⸝⸝⍢⸝⸝) ෆ", + "(๑´ლ`๑)フフ♡", + "(灬ºωº灬)♡", + "ヽ(o♡o)/", + "٩(๑ơలơ)۶♡", + "٩(*❛⊰❛)ʓਡ~", + "٩(ó。ò۶ ♡)))♬", + "(੭ु ›ω‹ )੭ु⁾⁾♡", + "٩(๑∂▿∂๑)۶♡", + "♡✧。 (⋈◍>◡<◍)。✧♡", + "♡٩(๑ö⊿ö๑)۶♡", + "٩(*ゝڡ◕๑)۶♥", + "♡〜٩( ╹▿╹ )۶〜♡", + "╰(✿´⌣`✿)╯♡", + "(´ ▽`).。o♡", + "( ´͈ ॢꇴ `͈ॢ)・*♡", + "(/∇\*)。o○♡", + "(´▽`ʃƪ)♡", + "(◞ꈍ∇ꈍ)◞⋆**✚⃞", + "(ღ˘⌣˘ღ)", + "(人´∀`*)", + "♡o。.(✿ฺ。 ✿ฺ)", + "♥~(‘▽^人)", + "꒰⑅ᵕ༚ᵕ꒱˖♡", + "♡˖꒰ᵕ༚ᵕ⑅꒱", + "(人 •͈ᴗ•͈)", + "(*´ ˘ `*).。oO ( ♡ )", + "´͈ ᵕ `͈ ♡°◌̊", + "(*˘︶˘*).。.:*♡", + "ღ˘◡˘ற♡.。oO", + "( ˘͈ ᵕ ˘͈♡)˚๐*˟ ♡", + "( ∩ˇωˇ∩)♡", + "˞♡ฅ(ᐤˊฅˋᐤ♪)", + "(o´`o)♡*✲゚*。", + "OwO", + "(人*´∀`)+゚:。*゚+", + "(人´ω`*)♡", + "(人´∀`)", + "(人*´∀`)", + "ლ(´◉❥◉`ლ)", + "( ˘ ³˘)♥", + "( ˘ ³˘)", + "(。ˇ ⊖ˇ)♡", + "(*^3^)/~♡", + "(。・//ε//・。)", + "(´ε` )♡", + "(ʃƪ ˘ ³˘)", + "(ʃƪ˘ﻬ˘)", + "(づ ̄ ³ ̄)づ", + "♡(˃͈ દ ˂͈ ༶ )", + "٩꒰ ˘ ³˘꒱۶~♡", + "ƪ(♥ﻬ♥)ʃ", + "ლ(|||⌒εー|||)ლ", + "♡ლζ(♛ε♛*ζლ♡", + "†=”Ⴛ̸ ♡(˃͈ દ ˂͈ ༶ )", + "(๑ơ ₃ ơ)♥", + "ฅ(♡ơ ₃ơ)ฅ", + "৲( ᵒ ૩ᵕ )৴♡*৹", + "( *¯ ³¯*)♡", + " (●❛3❛●)", + "˖◛⁺⑅♡", + "˅ɞ♡⃛ʚ˅", + "ฅ ̳͒•ˑ̫• ̳͒ฅ♡", + "ʕ•̫͡•ʔʕ•̫͡•ʔ", + "(•ө•)♡", + "(人・㉨・)♡", + "♡₍⸍⸌̣ʷ̣̫⸍̣⸌₎", + "ʕ͙•̫͑͡•ʔͦʕͮ•̫ͤ͡•ʔ͙", + "(≚ᄌ≚)ℒℴѵℯ", + "♡ඩ⌔ඩ♡", + "(ฅ’ω’ฅ)​♥", + "(⁎⁍̴̛͂▿⁍̴̛͂⁎)*✲゚*。⋆♡", + "(΄◞ิ౪◟ิ‵)ʃ♥", + "(ෆ❛ัᵌ❛ัෆ)°", + "( ^◡^)っ", + "(∿°○°)∿ ︵ ǝʌol", + "♡╰(*゚x゚​*)╯♡", + "( ゚∀゚)ノ【LOVE】", + "( ゚∀゚)ノ     ~【LOVE】", + "Σ(;゚∀゚)ノ            三【LOVE:;*.’:|", + "(⑅ ॣ•͈ᴗ•͈ ॣ)∟ᵒᵛᵉ૫૦∪", + "(๑′ᴗ‵๑)I Lᵒᵛᵉᵧₒᵤ♥", + "Lᵒᵛᵉᵧₒᵤ", + "♡+* Ɗɑɫë*+♡", + "ॱ॰⋆(˶‾᷄﹃‾᷅˵)ӵᵘᵐᵐᵞ♡♡♡", + "♡+:。.。LロVЁ。.。:+♡", + "(୨୧•͈ᴗ•͈)◞ᵗʱᵃᵑᵏઽ*♡", + "(ෆ`´ෆ) ˡºᵛᵉ⃛", + "(๑′ڡ‵๑)۶४४yϋᵐᵐӵ♡॰⋆̥", + "ⓛⓞⓥⓔ♡", + "ɨ ʂ ʂ Ⓨσư (◡ε◡ฺ)", + "ʚ♡⃛ɞLᵒᵛᵉᵧₒᵤʚ♡⃛ɞ(ू•ᴗ•ू❁)", + "(ღˇ◡ˇ)♥ℒᵒᵛᵉᵧₒᵤ♥", + "ᎥᏝᵒᵛᵉϋෆ*", + "ℓ ϚϦοςӧԼձϮϵ⃛", + "(๑′ᴗ‵๑)I Lᵒᵛᵉᵧₒᵤ♡", + "L(*OεV*)E", + "ℒℴѵℯℒᎥѵℯ", + "(人-ω-)。o.゚。*・♡Good Night♡・*。゚o。(-ω-人)", + "Gооd Йight(´ε`*)ιον∈ Υου", + "✿*゚¨゚✎・ ✿.。.:* *.:。✿*゚¨゚✎・✿.。.:* ♡LOVE♡LOVE♡ ✿*゚¨゚✎・ ✿.。.:*", + "I £ονё Υου…..φ┃*・ω・*┃", + "Ƭ ɧ ձ ƞ Ƙ ʂ (◦˘ З(◦’ںˉ◦) Ȼ ɧ ư ♡", + "☆*✲゚*。(((´♡‿♡`+)))。*゚✲*☆", + "(๑•з•)))⋆*♡*⋆=͟͟͞͞=͟͟͞͞", + "♡*˖•. ·͙*̩̩͙˚̩̥̩̥*̩̩̥͙·̩̩̥͙*̩̩̥͙˚̩̥̩̥*̩̩͙‧͙ .•˖*♡", + "◌⃝●♡⋆♡⃝ ˻˳˯ₑ♡⃝⋆●♡⃝◌", + "(◦′ᆺ‵◦) ♬° ✧❥✧¸.•*¨*✧♡✧ ℒℴѵℯ ✧♡✧*¨*•.❥", + "♡⃛◟( ˊ̱˂˃ˋ̱ )◞⸜₍ ˍ́˱˲ˍ̀ ₎⸝◟( ˊ̱˂˃ˋ̱ )◞♡⃛", + "♡。゚.(*♡´◡` 人´◡` ♡*)゚♡ °・", + "( ≧Д≦)", + "((´д`))", + "(∩︵∩)", + "(▰˘︹˘▰)", + "(╭╮)", + "(‘A`)", + "(︶︹︺)", + "(@´_`@)", + "(´_`)", + "(⊙︿⊙✿)", + "(⌣_⌣”)", + "(▰︶︹︺▰)", + "~(。☉︵ ಠ@)>", + "⊙︿⊙", + "ヽ(●゚´Д`゚●)ノ゚", + "(Θ︹Θ)ს", + "~(。☉︵ ಠ@)>", + "(Θ︹Θ)ს", + "(.﹒︿﹒.)", + "(๑◕︵◕๑)", + "˓˓(ᑊᘩᑊ⁎)", + ":: ˓(ᑊᘩᑊ⁎) ::", + "(´°ω°`)", + "(。•́︿•̀。)", + "( .. )", + "(˃̶᷄ ﹏ ˂̶᷄)゚", + "๑˃͈˂͈๑ノ*゙̥", + "੨( ・᷄ ︵・᷅ )シ", + "⊛ठ̯⊛", + "(๑′°︿°๑)", + "(っ- ‸ – ς)", + "(o︵o)", + "ಠ╭╮ಠ", + "(⋅⃘˕̭⋅⃘)", + "ᵟຶᴖ ᵟຶ", + "ಗಾ ﹏ ಗಾ", + "(.﹒︠₋﹒︡.)", + "( ⁍᷄⌢̻⁍᷅ )", + "ōۃō", + "ै", + "( ´_ノ` )", + "(˵¯͒⌢͗¯͒˵)", + "ʕ ಡ ﹏ ಡ ʔ", + "(◕︿◕✿)", + "●︿●", + "ʕ ಡ ﹏ ಡ ʔ", + "໒( •́ ∧ •̀ )७", + "༶ඬ༝ඬ༶", + "ਉ_ਉ", + "▐ ﹒︣ Ĺ̯ ﹒︣ ▐", + "┏༼ ◉ ╭╮ ◉༽┓", + "へ[ •́ ‸ •̀ ]ʋ", + "( ˃̶͈ ̯ ̜ ˂̶͈ˊ ) ︠³", + "((●´∧`●))", + "(。-人-。)", + "(๑´╹‸╹`๑)", + "(⌯˃̶᷄ ﹏ ˂̶᷄⌯)", + "、ヽ`(~д~*)、ヽ`", + "(;*△*;)", + "( ; ; )", + "(っ˘̩╭╮˘̩)っ", + "(个_个)", + "(;へ:)", + "(*´;ェ;`*)", + "o(;△;)o", + "ͼ(ݓ_ݓ)ͽ", + "((o(;△;)o))", + "(´;Д;`)", + "(´;д;`)", + "(´;ω;`)", + "(iДi)", + "(٭°̧̧̧꒳°̧̧̧٭)", + "(๑′̥̥̥▵‵̥̥̥ ૂ๑)", + "( ˃̣̣̥ω˂̣̣̥ )", + "( ᵒ̴̶̷̥́ _ᵒ̴̶̷̣̥̀ )", + "( ´•̥ו̥` )", + "( ɵ̥̥ ˑ̫ ɵ̥̥)", + "(੭ ˃̣̣̥ ㅂ˂̣̣̥)੭ु", + "꒰๑•̥﹏•̥๑꒱", + "(ˊ̥̥̥̥̥ ³ ˋ̥̥̥̥̥)", + "(๑ १д१)", + "(⌯͒⁍̩̩᷄ ɪ ⁍̩̩᷄ฅ͒)", + "(˃̥̥ω˂̥̥̥)", + "(;﹏;)", + "⁝(˚͈͈͈͈̥̆₍₎˚͈͈͈͈̥̆⁎)⁝", + "(˃̥̥ω˂̥̥̥)", + "(;﹏;)", + "(˃̩̩̥ɷ˂̩̩̥)", + "(ᵕ̣̣̣̣̣̣﹏ᵕ̣̣̣̣̣̣)", + "( ͒˃̩̩⌂˂̩̩ ͒)", + "( ب_ب )", + "(﹡ᵗ ᵔ ᵗ ﹡)", + "( -̩̩̩͡˛ -̩̩̩͡ )", + "(´;ω;`)", + "( Ĭ ^ Ĭ )", + "(;•͈́༚•͈̀)", + "\(@;◇;@)/", + "(ू̯⋆̧ ͕⋆᷅ू̯ ) ༘˟", + "⁽⁽ƈ ͡ (ु ˲̥̥̥́ ˱̥̥̥̀) ु⁾⁾", + "₊·(ϱ॔﹏ᵕ๑॓)‧*", + "ₒ˛˚̣ (˃ᾓ˂⁎)₎₎", + "(﹡﹏﹡)", + "(ˊ⌄˴⁎৲ु", + "ε≡ ε≡ ε≡ ε= (#・ж・)", + "。゜+.(:.;゜;艸;゜;.:)゜+.゜", + "ε-(≖д≖﹆)", + "ε-(>.<;;", + "ε=o(´ロ`||)", + "((( +д+)o=3=3", + "ε-(>o<)", + "(;≧∇≦) =3", + "(●`□´)=з", + "o( _ _ )o ショボーン", + "(゜ーÅ) ホロリ", + "(;´д` ) トホホ", + '"(ノ_・、)" グスングスン', + "ρ(。 。、 ) イイモンイイモン", + "フフッ (ノへ^) うそ泣き", + "(>へ<) ←涙を堪える", + "σ(TεT;)ナイチャウヨ・・・", + "(・_・、) グスン", + "ε~(;@_@) ガクン", + "ヘ(´o`)ヘ とほほ・・・・", + "ρ(・・、)イジイジ", + "(ノ_・。)クスン", + "(・・,) グスン", + "(ノ_σ)クスン", + "(ノ∇・、)クスン", + "(’_’、)ホロリ", + "(;へ:)ナカナイモン", + "(;_・) グスリ", + "(/_・)", + "(>_<)", + "(+_ q ))グスン", + "|ヽ(~~。) オチコミー", + "(хх) エーン", + "(Ω_Ω)クスン", + "へ(><#)ノ カナシイヨ", + "(;_;)クスン", + "(・_;)", + "(;_・)", + "(。>。<。)ウッー", + "(~^T) ジーン", + "(†〇†) ジーーン", + "(x_x;)シュン", + "(。;_;。) シュン", + "( ■ ;) そんな・・・", + "(++)", + "(;_q))クスン", + "(*_*) シュン", + "_|+_+|_ ガクン", + "〃´_`〃", + ";.;", + "(O.;)ガクン", + "(八、)~~~==3  ヒドイ・・・", + "ノヘ;)/\(;_;)/\(x_x)/ 悲しい衆だ~ん", + "(O.;) シュン・・・", + "[壁]ノ_・。) クスン", + "|ヽ(~゜。)シクシク", + "( ´△`) アァ-", + "ウゥ (-_\)(/_-)ウゥ", + "(ρ°∩°) ウウッ", + "0(>_<)0 ウー", + "o(´^`)o ウー", + "__(_ _;) ウゥ", + "(TεT) イイサ・・・", + "ρ(。。)イジイジ", + "ρ(-ε- ) イジイジ", + "。。。ρ(-ω- ) イジイジ", + "(°°)(。。)(。°)(°。) イジイジ", + "(。。 )(。。 )( 。。)( 。。)イジイジ", + "ガクーン ( ¨)( ‥)( ..)( __)", + "(~、~)(~、~)イジイジ", + "(~,~)イヂ(~,~)イヂ(~,~)イヂ", + "イシ゛イシ゛・・( ..)( __)イシ゛イシ゛・・", + "(((+ ;) イジイジッ", + "(・o+)", + "ゞ(+ヘ+)`` ナクモノカ・・", + ".....(;__)/| ずぅぅぅぅん", + "[壁]。。;) イジイジ", + "( >_;)/~ カナシイケド・・", + "(@´_`@)フエーン", + "(゜_、゜;)どよどよどよ~ん", + "(~~。) シクシク", + "(;´_ヘ;)ホロリ", + "ウウッ -_\)", + "/_-)ウウッ", + "(×_×;) シユン", + "(×_×#", + "(+o+)", + "(#+_+)", + "(+_+)", + "...((( *-*)", + "◑.◑", + "( ⚆ _ ⚆ )", + "━(◯Δ◯∥)━ン", + "( 〇□〇)", + "(((φ(◎ロ◎;)φ)))", + "ゞ◎Д◎ヾ", + "(`〇Д〇)", + "(ΟΔΟ;;)", + "(O∆O)", + "( (≪●≫) )Д( (≪●≫) )", + "ヽ(゚Д゚)ノ", + "(((╹д╹;)))", + "(╬⁽⁽ ⁰ ⁾⁾ Д ⁽⁽ ⁰ ⁾⁾)", + "ヾ( •́д•̀ ;)ノ", + "ヽ ( ꒪д꒪ )ノ", + "ヾ( ๑´д`๑)ツ", + "џ(ºДºџ)", + "( ⁰д⁰)", + "-(゜Д゜;)-ン!", + "(゚Д゚;)", + "(゚д゚;)", + "∠(゚Д゚)/", + "σ(oдolll)", + "(゚Д゚?)", + "ヾ(´゚Д゚`;)ゝ", + "(#`゚д´)ノ", + "(╬☉д⊙)", + "゛(●ノ´・Д・`)ノ", + "╰། ᵒ̌ д ᵒ̌ །╯", + "ヽ(○´Д`)ノ", + "(゜Д゜*)", + "⊃゜Д゜)⊃", + "⊂(゜Д゜⊂", + "┗|*´゚Д゚`|┛", + "(シ;゚Д゚)シ", + "ヾ(゚Д゚;ヾ)", + "(ΩДΩ)", + "ヽ(#゚Д゚)ノ", + "!!(ノ*゚Д゚)ノ", + ",、’`( ꒪Д꒪),、’`’`,、", + "◝(๑⁺д⁺๑)◞՞", + "(-@Д@)", + "(「⊙Д⊙)「", + "<|๑⊙Д⊙|/", + "ლ|’Д’ლ|", + "(┛〃° Д°)┛", + "ヽ〔゚Д゚〕丿", + ")Д⊙`)", + "ฺ(☼Д☼)", + "工エエェェ(;╹⌓╹)ェェエエ工", + "エエェェェ(●’Д’●)ェェェエエ", + "エエェェェェ(/×\)ェェエエエエ", + "ε=ε=(っ*´□`)っ", + "ε=ε=(怒゚Д゚)ノ", + "=͟͟͞͞ =͟͟͞͞ ヘ( ´Д`)ノ", + "ヽ( ̄д ̄;)ノ=3=3=3", + "٩(´Д` ;)۶:.*", + "(´×д×`三꒪д꒪ ;)", + "– =͟͟͞͞ =͟͟͞͞ ヘ( ´Д`)ノ", + "ε=ε=ε=(((((ノ`・Д・)ノ", + "(◞º❒º)◞₎₎(◟º❑º)◟⁾⁾➟➠➨", + "ε=٩(●❛ö❛)۶", + "Σ(゚Д゚;≡;゚д゚)", + "(c=(c=(c=(c=(゚ロ゚;c=", + "⊂(゚Д゚;⊂⌒`つ", + "..・ヾ(。 ̄□ ̄)ツ", + "≡≡≡=(ノTдT)ノ", + "ε=ε=(⊃≧□≦)⊃", + "!!Σ(゚Д゚;≡≡≡≡≡ヾ(;゚д゚)/", + "┃ ु ⠁⃘ ⠁⃘ू┃⁼³₌₃", + "༻(〃ຶ⌂〃ຶ)", + "ਭ३౽=͟͟͞͞(((ഽʻ⁸ʻ)ഽ", + "ε=ε=ε=(ノ≧∀)ノ", + "(❛ӧ❛三❛ӧ❛)", + "Σ(°Д°;≡;°д°)", + "ε=ε=ε=(ノTдT)ノ", + "~ε~ε~┌(|||´Д`)ノ", + "゛(ノ~o~)ノ", + "ε=ε=ε=┏(゚ロ゚;)┛", + "ε==ε==(ノ゜д゜)ツ", + "ヽ(д`ヽ)。。", + "。。(ノ´д)ノ", + "ヽ(´Д`;≡;´Д`)丿", + "((ヽ(´Д`;ゞ=ヾ;´Д`)ノ))", + "ヽ(ω;`ヽ))…((ノ´;ω)ノ", + "ヽ(д`ヽ彡ノ´д)ノ", + "ε=ε=ε=(((怒゚Д゚)ノノ", + "ε=ε=ε=(*ノ´Д`)ノ゚", + "ヾ(*゜、ω゜*)ノ゚", + "!!((((((っ;゚∀゚)っ", + "(´□`;)=З=З=З=З=З=З", + "へ(~Д~*へ))))… …((((ノ*~З~)ノ", + "★⌒Y⌒Y⌒Y⌒Y⌒ ヾ(o゚Д゚)ノ", + "(˵¯͒ བ¯͒˵)", + "(●゜□゜)人(゜□゜○)", + "ヽ(≡ω≡;ヽ)", + "ヽ(;゚;∀;゚; )ノ", + "(ノ´ロ`)ノ", + "(ノ ゜口゜)ノ", + "!!!!!!(゚ロ゚屮)屮", + "§;゚ロ゚§", + "ヾ(´囗`。)ノ", + "(/;◇;)/", + "ヘ(;´o`)ヘ", + "(°□°)⊅", + "Σ(°□°)⊃", + "…(゚Ⅹ゚)…。", + "(@O@;)", + "〣( ºΔº )〣", + "˓⁽͑ʺˀ́˙̻ˁ̀ʺ⁾̉ʾʾ ᵏᵞᵅ˞ᵎ", + "t(ツ)_/¯", + "乁[ᓀ˵▾˵ᓂ]ㄏ", + "へ‿(ツ)‿ㄏ", + "\(;´□`)/", + "\(〇_o)/", + "\⍩⃝/", + "\|  ̄ヘ ̄|/", + "┐(‘~`;)┌", + "┐( ̄ー ̄)┌", + "┐( ̄ヮ ̄)┌", + "┐(´-`)┌", + "┐( ˘_˘)┌", + "┐( ∵ )┌", + "┐( ̄ヘ ̄)┌", + "┐(´∀`)┌", + "┐(´∇`)┌", + "┐(´д`)┌", + "┐(‘д’)┌", + "┐(゚~゚)┌", + "┐(~ー~;)┌", + "┐(;Ծ⌓Ծ;)┌", + "┐(・ิL_・ิ)┌", + "(┐◎_◎┌)", + "┐(´(エ)`)┌", + "┐(´・c_・` ;)┌", + "┐(●’v’)┌", + "┐(´ー)┌", + "┐(´Д`┌", + "┐(゚⊇゚)┌", + "┐(‘~`;)┌", + "┐| ̄ρ ̄✿|┌", + "┐(;´・Д・`)┌", + "┐(´ー`)┌", + "(「ఠωఠ)「", + "┐(‘~`;)┌", + "┐( ̄ー ̄)┌", + "┐( ̄ヮ ̄)┌", + "┐(´-`)┌", + "┐( ˘_˘)┌", + "┐( ∵ )┌", + "┐( ̄ヘ ̄)┌", + "┐(´∀`)┌", + "┐(´∇`)┌", + "┐(´д`)┌", + "┐(‘д’)┌", + "┐(゚~゚)┌", + "┐(~ー~;)┌", + "┐(;Ծ⌓Ծ;)┌", + "┐(・ิL_・ิ)┌", + "(┐◎_◎┌)", + "┐(´(エ)`)┌", + "┐(´・c_・` ;)┌", + "┐(●’v’)┌", + "┐(´ー)┌", + "┐(´Д`┌", + "┐(゚⊇゚)┌", + "┐(‘~`;)┌", + "┐| ̄ρ ̄✿|┌", + "┐(;´・Д・`)┌", + "┐(´ー`)┌", + "(「ఠωఠ)「", + "┗(・ω・;)┛", + "┗┃・ ■ ・┃┛", + "┗┐ヽ(′Д、`*)ノ┌┛", + "└(・-・)┘", + "└(・。・)┘", + "≡└( ‘o’)┘≡", + "╚(•⌂•)╝", + "(┛゚Θ゚)┛", + "┗(;´Д`)┛", + "╚༼ ຈل͜ຈ༽╝", + "┗|*´Д`|┛", + "└[ ◕ 〜 ◕ ]┘", + "╚═[ ˵ •̀ ﹏ •́ ˵ ]═╝", + "└(◉◞౪◟◉)┘", + "┗[~▿~]┛", + "┗[•͡˘◞౪◟•͡˘]┛", + "L(´▽`L )", + "└((´э`))┘", + "└( ͡° ︿ °͡ )┘", + "(」*´∇`)」", + "└། ๑ _ ๑ །┘", + "L(゚皿゚メ)」", + "└(゚∀゚└))", + "((┘゚∀゚)┘", + "┗|´Д`*|┛", + "┗┐(*´Д`*)┌┛", + "【┛゚,_ゝ゚】┛", + "L(゚益゚L)", + "└|゚益゚└|", + "┗(´ι_,`*;)┛", + "└(°ᴥ°)┘", + "└། : ᓀ ل͜ ᓂ : །┘", + "└╏ ʘ ▾ ʘ ╏┘", + "╚ |░▤﹏▤░|╝", + "└║ ՞ ౪ ՞ ║┘", + "└། – 〜 – །┘", + "└(՞▃՞ └)", + "└༼ •́ ͜ʖ •̀ ༽┘", + "└( * ᴼ ں ᴼ * )┘", + "└[ ☉ ل͟ ☉ ]┘", + "┗|´Д`*||*´Д`|┛", + "┗|`O´|┛", + "┗(・o・)┛", + "└(o゚∀゚o)┘", + "(」*´ェ`)」", + "┗(`皿´)┛", + "└(○`ε´○)┘", + "└( ՞ ~ ՞ )┘", + "┗| ຶӫ ຶ|┛", + "╮ (. ❛ ᴗ ❛.) ╭", + "╮(^▽^)╭", + "╮(─▽─)╭", + "╮(•˘︿ ˘•)╭", + "╮(╯▽╰)╭", + "╮(╯-╰”)╭", + "╮(ਊ◞‸◟ਊ|||)╭", + "╮( ꒪౪꒪)╭", + "╮(╯ل͜╰)╭", + "╮(゚ェ゚*)╭", + "╮(▰´△`)╭", + "╰( ´◔ ω ◔ `)╯", + "╰། ﹒ _ ﹒ །╯", + "╰╏ ◉ 〜 ◉ ╏╯", + "╰( ͡’◟◯ ͡’)╯", + "╰▐ ◑ ‸ ◑ ▐╯", + "╰| ⊡ _ ⊡ |╯", + "ヽ( ´¬`)ノ", + "ヽ(  ̄д ̄;)ノ", + "ヽ(・_・;)ノ", + "ヽ(。_°)ノ", + "ヽ(‘ー`)ノ", + "ヾ(*´ー`)ノ", + "ヽ(*ω。)ノ", + "ヾ(´¬`)ノ", + "ヽ(´ー`)ノ", + "ヾ(´A`)ノ゚", + "ヽ(ー_ー )ノ", + "ヾ(o・ω・)ノ", + "ヽ(。・c_,・。)ノ゙", + "ヽ(´ー`)ノ", + "乁( ◔ ౪◔)ㄏ", + "乁༼ ͒ ╭͜ʖ╮ ͒ ༽ㄏ", + "乁▐ ˘ o ˘ ▐ㄏ", + "ㄟ( θ﹏θ)厂", + "乁║ ͡° ౪ °͡ ║ㄏ", + "乁༼‿✿༽ㄏ", + "乁( •_• )ㄏ", + "乁▐ * ◖ ‸ ◗ * ▐ㄏ", + "乁⁞ ි _ʖ ි ⁞ㄏ", + "乁⁞ ◑ ͜ر ◑ ⁞ㄏ", + "乁༼ ◯ ༽ㄏ", + "乁[ ୖ ୖ ]ㄏ", + "乁( . ര ʖ̯ ര . )ㄏ", + "乁░ ‾́ ‾́ ░ㄏ", + "乁║ ˙ 益 ˙ ║ㄏ", + "乁[ ◕ ᴥ ◕ ]ㄏ", + "乁╏ ಠ ┏ل͜┓ ಠ ╏ㄏ", + "乁( ⁰͡ Ĺ̯ ⁰͡ ) ㄏ", + "乁༼ Ɵ͆ ل͜ Ɵ͆ ༽ㄏ", + "乁| ・ ・ |ㄏ", + "ƪ(Ơ̴̴̴̴̴̴͡.̮Ơ̴̴͡)ʃ", + "ƪ(‾ε‾“)ʃ", + "ʅ(。◔‸◔。)ʃ", + "ʅ(。Ő౪Ő。)ʃ", + "ƪ(•̃͡ε•̃͡)∫ʃ", + "ヾ(❛ε❛“)ʃ", + "ƪ(“╰ _ ╯ )ʃ", + "ʅ(´՞ਊ ՞ )ʃ", + "ʅ(´⊙◞⊱◟⊙`)ʃ", + "ƪ(‾(••)‾”)ʃ", + "ʅ(‾◡◝)ʃ", + "ʅ(‾‸◝)ʃ", + "ƪ(~ε~“)ʃ", + "ʅ( ‾⊖◝)ʃ", + "ʅʕ•ᴥ•ʔʃ", + "ʅ(´◔౪◔)ʃ", + "三三三ʅ(;◔౪◔)ʃ", + "ʅ( ‾⊖◝)ʃ", + "ʅ(‾◡◝)ʃ", + "ʅ(◔౪◔ ) ʃ", + "ƪƪ(•̃͡ε•̃͡)(•̃͡ε•̃͡)∫ʃ", + "ʅฺ(・ω・。)ʃฺ", + "ʅ(⑅*´◡`)ʃ", + "ʅ(´-ω-`)ʃ", + "ʅ(*´◡`)ʃ", + "ƪ(΄◉◉‵;)))ʃ", + "ʅ( ◜‸‾)ʅ(‾‸◝)ʃ(‾‸◝ )ʃ", + "ɿ(。・ɜ・)ɾⓌⓗⓨ?", + "ɿ(。・ɜ・)ɾⓌⓗⓐⓣ?", + "(「๑•₃•)「 ʷʱʸ?", + "o͡͡͡͡͡͡╮꒰♡∇♡*꒱╭o͡͡͡͡͡͡", + "o͡͡͡͡͡͡͡͡͡͡͡͡͡͡╮(๑θωθ๑)╭o͡͡͡͡͡͡͡͡͡͡͡͡͡͡", + "ʅ(◔.̸̸̸̸̸̸̸̸̸̸̸̸̸̸̸̸̸̸̸̸̸̸̸̸̨̨̨̨̨̨̨̨̨̨̨̨.̸̸̨̨◔)ʃ", + "(v^_^)v", + "╮ (☆-_ ⊙;)ゞ", + "ヽ(´ー`)┌", + "ヽ(´~`;)", + "J( ‘ー`)し", + "⎦◜◦¬◦◝⎣", + "ɿ (•᷄દ•᷅)", + "щ(´^`щ)", + "|´U`●)r”", + "(^~^)", + "⋋〳 ᵕ _ʖ ᵕ 〵⋌", + " ̄(=^ー^=) ̄", + "( ᵌ ⍨ ᵌ )", + "⋋〳 ᵕ _ʖ ᵕ 〵⋌", + "⋋| ◉ ͟ʖ ◉ |⋌", + "⋋|།’͡ᴼ╭͜ʖ╮͡ᴼ’།|⋌", + "(n˘v˘•)¬", + "₍₍ (ง Ŏ౪Ŏ)ว ⁾⁾", + "(ง ´͈౪`͈)ว", + "ᕕ╏ ͡ ▾ ͡ ╏┐", + "(ペ◇゚)」", + "ᕕ[ ́ ل͜ ́ ]੭", + "₍₍ (ง ˙ω˙)ว ⁾⁾", + "(*´_ゝ`)", + "(*´∀`*)", + "(*´ェ`*)", + "。(*^▽^*)ゞ", + "(‘-’*)", + "(*´∀`*)", + "(*^^*)", + "(*゚ー゚)ゞ", + "(ノ*゜▽゜*)", + "ฅ(*°ω°*ฅ)", + "(*゚∀゚*)", + "(*´ω`*)", + "(´ω`*)", + "(⁎❝᷀ົ ˙̫ ❝᷀ົ⁎)", + "ε=ε=ε=ε=ε” “(/*’-‘*)/", + "ヽ(*>∇<)ノ", + "(*´-`*)", + "( *’ω’* )", + "( *∵* )", + "*:゚*。⋆ฺ(*´◡`)", + "(#^.^#)", + "(#`ε´# )ゞ", + "(#⌒∇⌒#)ゞ", + "(#゚ロ゚#)", + "#’ω`#੭", + "(#^^#)ゞ", + "(๑•́ ω •̀๑)", + "(๑•́ ₃ •̀๑)", + "(๑ˊ▵ˋ̥๑)", + "(๑´ㅂ`๑)", + "(๑ゝω╹๑)", + "(´๑•_•๑)", + "(๑•́ω•̀๑)", + "(◞ ๑௰)", + "(๑´ω`๑)", + "(๑癶ω癶๑)", + "(´•ω•`๑)", + "(๑´•ω • `๑)", + "(_๑˘ㅂ˘๑)", + "(๑´⍢`๑)", + "(๑′°︿°๑)", + "(๑́•∀•๑̀)ฅ", + "(๑ּగ⌄ּగ๑)", + "(⁶ੌ௰⁶ੌ๑)", + "(๑-๑)", + "(๑⁍᷄౪⁍᷅๑)", + "(๑→‿←๑)", + "(๑•́‧̫•̀๑)", + "(๑・▱・๑)", + "(〃 ̄ω ̄〃)ゞ", + "(。・//ε//・。)", + "(//・_・//)", + "(〃・ω・〃)", + "(〃▽〃)", + "(///Σ///)", + "(//∇//)", + "(灬ºωº灬)", + "(´,,•ω•,,)", + "(⁄ ⁄•⁄ω⁄•⁄ ⁄)⁄", + "(灬º 艸º灬)", + "(✿ꈍ。 ꈍ✿)", + "(⁄ ⁄^⁄ᗨ⁄^⁄ ⁄)", + "(⸝⸝⸝ ≧ㅿ\⸝⸝⸝)/", + "⁽⁽ ◟(灬 ˊωˋ 灬)◞ ⁾⁾", + "╰(⸝⸝⸝´꒳`⸝⸝⸝)╯", + "(ؑ‷ᵕؑ̇‷)◞✧", + "{•̴͈ ˔̇ •̴͈}", + "ლ(///´◜⊜`//////ლ)", + "(⸝⸝⍢⸝⸝) ෆ", + "⁄(⁄ ⁄ˊૢ⁄ ⌑ ⁄ˋૢ⁄ ⁄)⁄", + "˚✧₊⁎˓˓⁽̨̡ ˚͈́꒳​˚͈̀*⁾̧̢˒˒⁎⁺˳✧༚", + "(⺣◡⺣)♡*", + "( ̧⸝⸝⍢⸝⸝)ི", + "꒰ •͈́ ̫ •͈̀ ꒱ˉ̞̭", + "(*ꈍ꒳ꈍ*)", + "(*ꈍ꒙ꈍ*)", + "ค{•̴͈ ˳̇ •̴͈}ค✧", + "⁄(⁄ ⁄•⁄-⁄•⁄ ⁄)⁄", + "(∗∕ ∕•̥̥̥̥∕ω∕•̥̥̥̥∕)", + "(⸝⸝•́દ•̀⸝⸝)", + "ꈍ .̮ ꈍ", + "・:*(〃・ェ・〃人)*:・", + "⁄(⁄ ⁄•⁄ω⁄•⁄ ⁄)⁄", + "(ृ°͈꒳​°͈ ृ)ु", + "⁽͑ʺˊ˙̫ˋʺ⁾̉", + "(˵¯͒⌄¯͒˵)", + "⊂((〃’⊥’〃))⊃", + "(灬╹ω╹灬)", + "(〃ω〃)", + "(〃´Å`〃)", + "ヾ( 〃ω〃)ッ", + "(・ω・`〃)", + "ヾ(〃ω〃ヾ))", + "((ノ〃ω〃)ノ゙", + "ヽ(〃v〃)ノ", + "(〃´ノω`〃)", + "<(〃´∀`〃)>", + "・:*(〃∇〃人)*:・", + "(〃・ω・〃)ノ~☆", + "୧( ˵ ° ~ ° ˵ )୨", + "(˶′◡‵˶)", + "o(〃’▽’〃)o", + "(〃´∀`)", + "(∥ ̄■ ̄∥)", + "ヾ(〃゚ー゚〃)ノ", + "( 〃..)", + "(´,,•ω•,,`)", + "⁽˚̌ʷ˚̌ʺ⁾", + "ー(°◇°〃)", + "(●///▽///●)", + "б(//x//)", + "(灬ºωº灬)♡", + "ο(‘・’〃)ο″", + "(。-_-。)", + "(。・・。)", + "(o・・o)/", + "(●ฅ́дฅ̀●)", + "( 。•_• 。)", + "(●˙꒳˙●)", + "(●°u°●)​ 」", + "(。uωu。)", + "ღღ•̥̑ .̮ •̥̑)", + "(o´∪`o)", + "|´∀`●)", + "(@´_`@)", + "(。≖ˇ∀ˇ≖。)", + "(∗ᵕ̴᷄◡ᵕ̴᷅∗)՞", + "ల(*´= ◡ =`*)", + "(⊙﹏⊙✿)", + "⸜(ᶿ᷇ധᶿ᷆)⸝", + "( ͒•·̫|", + "(w´ω`w)", + "((≡ຶ◡≡ຶ))", + "( ´•௰•`)", + "(´°ω°`)", + "*⁂((✪⥎✪))⁂*", + "( ͒ ́ඉ .̫ ඉ ̀ ͒)", + "(◍´ಲ`◍)", + "(◍ ´꒳` ◍)b", + "(ˊˡ·̫ˡˋ)", + "(´ . .̫ . `)", + "˄̩̞(˒௰˓)", + "ԅ[ •́ ﹏ •̀ ]و", + "ԅ[ •́ ﹏├┬┴┬┴", + "(⌒_⌒;)", + "(;゙°´ω°´)", + "(^_^;)", + "(^^;)", + "(;^ω^)", + "(^◇^;)", + "(ヾ; ̄▽ ̄)ヾ", + "(*/∇\*)", + "(*/ω\*)", + "(*ノ▽ノ)", + "(*ノωノ)", + "(/。\)", + "(/(エ)\)", + "(/□\*)・゜", + "(/ω\)", + "(#/。\#)", + "(╯_╰)", + "(╯ಊ╰)", + "(つω⊂* )", + "(ノ)´∀`(ヾ)", + "(ʃᵕ̩̩ ᵕ̩̩⑅)", + "(♡´艸`)", + "(´つヮ⊂)", + "(Ŏ艸Ŏ)", + "(/▽ ̄)/", + "(/≧ω\)", + "(*/∇\*)", + "ʕ*ノᴥノʔ", + "( *´ノェ`)", + "(ノ∀`●)⊃", + "⊂((〃/⊥\〃))⊃", + "(/へ\*)", + "(ノ∇≦*)", + "(〃ノωノ)", + "(〃ノ∀`〃)", + "(ノ∀\*)", + "(*ノωヾ*)", + "(*ノзノ*)", + "♡(。→ˇ艸←)", + "(*ノ∀`*)ノ", + "(ノ∀ ̄〃)", + "(*/▽\*)", + "(*´ノ∀`)", + ".゚:;。+。ε(ノ∀≦*)з。+.。゚:", + "(´•͈ुω•͈ू`)", + "( ੭⌯᷄௰⌯᷅ ू’l|)", + "( • • )", + "(*,,ºัωºั,,)", + "‹(⁽˙́ʷ˙̀⁾ )∨( ⁽˙́ʷ˙̀⁾)›", + "(v〃∇〃)ハ(〃∇〃v)", + "(v〃ω〃)八(〃ω〃v)", + "(v〃∇〃)ハ(〃∇〃v)", + "(  ̄з(〃´▽`〃)ε ̄ )", + "◌⑅⃝*॰ॱᒄᵒᵏⁱ(꜆˘͈ෆ˘͈꜀)ᒄᵒᵏⁱ◌⑅⃝*॰ॱ", + "⁽͑ˀˉ˙̫ˉˁ⁾̉ ᵐᵘⁿⁱ", + "£ονё Υου…..φ(〃∇〃 ))", + "(⑅ᵒ̴̶̷᷄ωᵒ̴̶̷᷅⊞ོॢ)fෆr yෆu⋆*⋆✩", + "", + "( ;`ヘ´)", + "((( ̄へ ̄井)", + "(`へ´*)ノ", + "( ̄へ ̄)", + "(。-`へ´-。)", + "ε-(‘ヘ´○)┓", + "(≧ヘ≦ )", + "ρ( ̄ヘ ̄ メ)", + "(*`・へ・´*)", + "(((0へ0)", + "(*`へ´*) 彡3", + "(`へ′)", + "(’へ’)", + "(*´ω`)o", + "( ̄ω ̄)", + "( ̄ω ̄;)", + "(✿´ ꒳ ` )", + "✩꒳✩", + "(´꒳`∗)", + "(´꒳`)", + "(∗´꒳`)", + "(^~^)", + "( ̄~ ̄;)", + "( ̄~ ̄)", + "ー( ̄~ ̄)ξ", + "೭੧(❛〜❛✿)੭೨", + "(*´~`*)", + "੧| ‾́ 〜 ‾́ |੭", + "(*・~・*)", + "|  ̄~ ̄|o", + "(^~^;)", + "(⁰ ◕〜◕ ⁰)", + "(; ̄ェ ̄)", + "( ̄ェ ̄;)", + "(*´ェ`)o", + "o(´ェ`*)", + "(´ェ`*)", + "(*´ェ`*)", + "੧| ‾́ェ ‾́ |੭", + "( ̄ー ̄)", + "(*´ー`)", + "( `ー´)", + "<( ̄ー ̄)>", + "(; ̄ー ̄)", + "੧| ‾́ー ‾́ |੭", + "<( ̄︶ ̄)>", + "(。◝‿◜。)", + "§ԾᴗԾ§", + "੧| ‾́︶ ‾́ |੭", + "(; ̄︶ ̄)", + "( ̄︶ ̄;)", + "(*´︶`*)", + "[●´︶`●]", + "|  ̄︶ ̄|o", + "[●´Å`●]", + "(´Å`)", + "(●´Å`)", + "(; ̄Å ̄)", + "(*´Å`)o", + "(*´Å`*)", + "┏| ̄Å ̄* |┛", + "o(´Å`)o", + "( ̄Å ̄)", + "(#´Å`)", + "|  ̄Å ̄|o", + "〳 ᓀÅᓂ)", + "o(´^`)o", + "(`^´)ノ", + "( ̄^ ̄)", + "( ̄^ ̄)", + "(⌤⌗)", + "!( ̄^^ ̄)", + "┏| ̄^ ̄* |┛", + "( ̄^ ̄メ)\(_ _ ;)", + "(#´^`)", + "(*`Λ´*)」", + "|  ̄^ ̄|o", + "<( ̄^ ̄)>", + "(((o(`・∧・´)o)))", + "(。•ˇ‸ˇ•。)", + "(•̀⌄•́)", + "•̀.̫•́✧", + "(˵¯͒¯͒˵)", + "(๑ˇ ῁̫ ˇ)˒˒", + "(`ڼ´)", + "(o^皿^)", + "|  ̄∀ ̄ |", + "⚈ ̫ ⚈", + "╭⚈¬⚈╮", + "((o(●´皿`●;)o))", + "〳 ᓀ ﹏ ᓂ 〵", + "<(  ̄ ≧ ̄)>", + "( ̄´-` ̄)", + "(^⌒^*)", + "(*´⌒`*)", + "₍₍ ( ‾᷄꒫‾᷅ ) ₎₎", + "(-、-)", + "( ̄个 ̄)", + "┌( ‘o’)┐", + "╭〻◕`w´◕〻╮", + "┌(┌ 廿-廿)┐", + "(꒡ꜙ꒡)", + "( ྃ亽 ྃ)", + "(≧*≦)", + "( ๑‾̀◡‾́)σ»", + "⁎❝᷀ົཽ˴˷̮❝᷀ົཽ⁎", + "SMUG ANIME FACE", + "(*•̀ᴗ•́*)و ̑̑", + "╭( ・ㅂ・)و ̑̑", + "(๑˃̵ᴗ˂̵)و", + "(๑•̀ㅂ•́)و", + "╭(♡・ㅂ・)و ̑̑", + "◝( ′ㅂ`)و ̑̑", + "╭( ・ㅂ・)و ̑̑ "", + "╭( ・ㅂ・)و )))", + "╭(๑ ॔ㅂ ਂ ॓)و ̑̑", + "( ⁼̴̤̆ ළ̉ ⁼̴̤̆)و ̑̑", + "(๑˃̵ᴗ˂̵)و", + "(๑•̀ㅂ•́)و✧", + "๑͒•̀ु•و ̑̑", + "ଘ ๑ ˃̶ ᴗ ᵒ̴̶̷๑و ̑̑", + "(ฅ⁍̴̀◊⁍̴́)و ̑̑", + "╭( ・ㅂ・)و ̑̑ ˂ᵒ͜͡ᵏᵎ⁾✩", + "(•́⌄•́๑)૭✧", + "(•̀ᴗ•́)൬༉", + "!(•̀ᴗ•́)و ̑̑", + "(•̀o•́)ง", + "٩(•̤̀ᵕ•̤́๑)ᵒᵏ!!!!", + "ೕ(`・୰・´)", + "ೕ(・ㅂ・ )", + "ೕ(•̀ᴗ•́)", + "ೕ(˃̵ᴗ˂̵ ๑)", + "ೕ(•̀ㅂ•́ )", + "✧٩(•́⌄•́๑)", + "ೕ(⁍̴̀◊⁍̴́ฅ)", + "٩(。•ω•。)و", + "٩(⸝⸝⸝◕௰ ◕ั⸝⸝⸝ )و", + "٩(✪ꀾ⍟༶)و", + "୧( ⁼̴̶̤̀ω⁼̴̶̤́ )૭", + "٩(˃̶͈̀௰˂̶͈́)و", + "٩( ‘ω’ )و", + "٩(。•ㅅ•。)و", + "٩( ´・ш・)و", + "٩(•̤̀ᵕ•̤́๑)૭✧", + "٩(๑❛ワ❛๑)و", + "(۶•̀ᴗ•́)۶", + "٩( ᐛ )و", + "✧٩(•́⌄•́๑)و ✧", + "ೕ(`・୰・´)و ̑̑", + "٩(๑•̀ㅂ•́)و", + "٩(๑˃̵ᴗ˂̵)و", + "(((( ・ㅂ・)و )))", + "٩( ′ㅂ`)و ̑̑", + "٩(ˊᗜˋ*)و", + "(و ˃̵ᴗ˂̵)و", + "(ง ͡ʘ ͜ʖ ͡ʘ)ง", + "(ง ͠ ͠° ل͜ °)ง", + "٩(╬ŏ3ŏ)و", + "✧٩(ˊωˋ*)و✧", + "٩̋(ˊ•͈ ꇴ •͈ˋ)و", + "٩( ᐛ )و", + "\\\\୧( ⁼̴̶̤̀ω⁼̴̶̤́ )૭ ////", + "\\\\٩(˃̶͈̀௰˂̶͈́)و ////", + "✧*。٩(ˊᗜˋ*)و✧*。", + "¡¡¡( •̀ ᴗ •́ )و!!!", + "\\\\ ⱶ˝୧(๑ ⁼̴̀ᐜ⁼̴́๑)૭兯 ////", + "(・□・;)", + "(」゜ロ゜)」", + "(*゚ロ゚)", + "Σ(゜ロ゜;)", + "щ(゜ロ゜щ)", + "∑(゚ロ゚〃)", + "┌╏ º □ º ╏┐", + "Σ(・口・)", + "(○□○)", + "(*〇□〇)……!", + "((((;゜Д゜)))", + "( ꒪Д꒪)ノ", + "(((( ;°Д°))))", + "((((;゜Д゜)))", + "(屮゜Д゜)屮", + "∑(;°Д°)", + "━Σ(゚Д゚|||)━", + "(╬⁽⁽ ⁰ ⁾⁾ Д ⁽⁽ ⁰ ⁾⁾)", + "Σ (  Д )ﻌﻌﻌﻌ⊙ ⊙", + "!!(⊃ Д)⊃≡゚ ゚", + "w(@。@;)w", + "˓˓ ⍥⃝⃝ ˒˒", + "◟(◔₀◔ )◞ ༘♡", + "(ට˓˳̮ට๑)", + "(✿☉。☉)", + "(മ ̥̆ മ)", + "(ల◕ั˘๐◕ల)", + "(⋆⁰ ̥̮⁽⁰)(⁰⁾ ̥̮⁰⋆)", + "[ □ ₒ □ ]", + "(๑°o°๑)", + "(*´・o・)", + "(。・o・。)", + "(◔o◔ฺ)", + "(;゜○゜)", + "(・о・)", + "(∗❛௦❛ั∗)", + "L(・o・)」", + "( •͈૦•͈ ॣ)", + "(°o°;)", + "(○o○)", + "(◐ o ◑ )", + "\(>o<)ノ", + "w(°o°)w", + "(;꒪ö꒪)", + "(´ ˙○˙ `)", + "༼⁰o⁰;༽", + "(´⊙o⊙`;)", + "(〇o〇;) !!", + "|o゜)", + "(°o°:)", + "(° o°)!", + "oh!((゚o゚#", + "(゚o゚)", + "٩(●ö●)۶", + "(ू′o‵ ू)*✲゚", + "( 」。╹o╹。)」", + "(⑉⊙ȏ⊙)", + "Σ(꒪ȏ꒪)", + "( ゚o゚)", + "⑉ႣỏႣ⑉", + "(இ௦இ)", + "(•̪ o •̪)", + "(三・o・)", + "॥ँऀ ଠି ॥ँऀ", + "༼ つ ◕o◕ ༽つ", + "Σ(・o・;)", + "(〇o〇;)", + "(●’o’●)", + "╚═། . ◯ o ◯ . །═╝", + "@(。・0・)@", + "(ノ゚ο゚)ノ", + "(ノ*0*)ノ", + "(((;ꏿöꏿ;)))", + "੧[ ⁰ o ⁰ ]ʋ", + "༼ . ° o ° . ༽", + "⋋░ ✿ ⁰ o ⁰ ✿ ░⋌", + "(>0<;;;)", + "∑(‘0‘@)", + "(ФоФ)", + "(゚o゚〃)", + "(๑•́o•̀๑)", + "ლ(^o^ლ)", + "∩(。・o・。)∩", + "(゚ο゚人))", + "(⸝⸝⸝ª̷̛იॢª̷̛⸝⸝⸝)ᵒʰ┈", + "(◎0◎)", + "(ノ゚0゚)ノ~", + "(*0*)/", + "(・0・。(・-・。(・0・。(・-・。)", + "(#´O`)", + "(!!´◯`)∑", + "⊙0⊙", + "(⁎❛ ꒩ુ ❛⁎)", + "(*゚O゚*)", + "☉̥̆ Ô☉̥̆", + "(´〇`)", + "‧˚₊*̥(* ⁰̷̴͈꒨⁰̷̴͈)‧˚₊*̥", + "‧˚₊*̥(∗*⁰͈꒨⁰͈)‧˚₊*̥", + "(。☬0☬。)", + "‧˚₊*̥•̤ॢ•̤‧˚₊*̥", + "b(’0’)d", + "(*゚◯゚*)", + "ヾ(*’O’*)イ", + "ԅ║ . º ◯ º . ║ノ", + "(○`・」0・´)」", + "☉̥̆ Ô☉̥̆", + "╰║ ❛ ◯ ❛ ║╯", + "░ ⊚ ◯ ⊚ ░", + "║ ” ◕ ◯ ◕ ” ║", + "░ ි ◯ ි ░", + "(@・0・)ノ", + "╰། ◉ ◯ ◉ །╯", + "ے( Ö )ص", + "(´⊙ω⊙`)!", + "(゜◇゜)", + "⊙▂⊙", + "Σ(゜゜)", + "Σ(ಠิωಠิ|||)", + "〣( ºΔº )〣", + "Σ░(꒪◊꒪ ))))", + "(∗॔꒪⺫ॢ꒪)", + "ლ(╹◊╹)ლ", + "‷̗ↂ凸ↂ‴̖ i", + "◎ܫ◎", + "(ʘᗩʘ’)", + "(○A○)", + "=͟͟͞͞(  ω )=͟͟͞͞ ³ ³", + "w(゚△゚)w", + "(‘◇’`)", + "o(゚◇゚o)", + "(゜◇゜ ))", + "(( ゜◇゜)", + "(ؔᓒ⍥⃘ؔᓒ)", + "(๑o̴̶̷̥᷅﹏o̴̶̷̥᷅๑)ᵒᵐᵍ!!!", + "(´⊙ω⊙`)ᵒᵐᵍᵎᵎᵎ", + "║ ” ◕ ◯ ◕ ” ║ᵒᵐᵍᵎᵎᵎ", + "ԅ║ . º ◯ º . ║ノᵒᵐᵍᵎᵎᵎ", + "(◎0◎)ᵒᵐᵍᵎᵎᵎ", + "༼⁰o⁰;༽ᵒᵐᵍᵎᵎᵎ", + "┌╏ º □ º ╏┐ᵒᵐᵍᵎᵎᵎ", + "w(°o°)w ᵒᵐᵍᵎᵎᵎ", + "(;゜○゜)ᵒᵐᵍᵎᵎᵎ", + "∑(;°Д°)ᵒᵐᵍᵎᵎᵎ", + "(ᵒ̤̑ ₀̑ ᵒ̤̑)wow!*✰", + "!(ᵒ̤̑ ◁ ᵒ̤̑)wow!৹ᵍᵎᵎ", + "(´・艸・`)", + "(゚艸゚;)", + "∴(O艸O★)", + "|✿´・ლ・`|", + "║ . º 艸 º . ║", + "(#´艸`)", + "(๑°艸°๑)", + "あ( ̄○ ̄)り( ̄◇ ̄)が( ̄△ ̄)と( ̄0 ̄)う( ̄ー ̄)", + "アリガタビーム!!(ノ・_・)ノ‥‥━━━━━☆ピーー", + "どもども( ^-^)∠※.。・:*:・°`☆、。・:*:・°`★", + "°・:,。★\(^-^ )♪ありがとう♪( ^-^)/★,。・:・°", + "(*^^)/。・:*:・°★,。・:*:・°☆アリガトー!", + "Thanks ☆☆** v(o^▽^o)v**☆☆ Thanks", + "☆⌒(*^-°)v Thanks!!", + "ドモ~♪ヽ(^-^ )", + "アリガトタッキュウヽ(^o^)ρ┳━┻━┳°σ(^o^)/", + "アリガトネ\(^^\)三(/ ^^)/アリガトネ", + "ありがとさん (*^ - ^*)ゞ ポリポリ", + "♪♪♪ d(⌒O⌒)b♪♪♪サンキュ", + "ありがとちょっぷ!(°<___/(°o°)//いたいよ ", + "サンクスファイヤー( ・_・)r鹵~<火火炎炎炎゛【・ロ・】゛ヤケルヤケル", + "どうもです (' - ' *)ゞカキカキ", + "★あ(^ - ^) り(- ^ ) が(   ) と( ^ -) う\(^ 0 ^)/★", + "゛v(^_^ v)=アリガトウ=(v ^_^)v゛", + "アリガトランクス 凹凹凹凹凹凹凹 \(▽⌒\)", + "アリガト エヘ♪(*^・^)ノ ⌒☆(*^_^*)ポッ", + "アリガトヨーヨー ( ^o^)/-----((Thanks))゜o゜) ~☆グエッ", + "▽ありがとう▽ ヽ(#^ー゜#)v", + "ドモヽ(∇⌒ヽ)三(ノ⌒∇)ノドモ", + "o(*^▽^*)oどうもねぇ~", + "~アリガトネ~ (* '-^) ⌒☆パチン", + "アリガト ウフッ♪(*~ё~)ノ ⌒☆(。。lll)オエッ", + "アリガトビーム!!(ノ・_・)━━━━━━\☆(・_\)白刃取り", + '"(*^^)/。・:*:・゜★,。・:*:・゜☆アリガトー!', + "m(._.)mアリガト", + "アリガトー!\(=^O^=)/'`*:;。・★'`*:;。・☆", + "ブンブン ヾヾ(^-^) ありがとぉ♪", + "アリガトシュリケン! ( ^o^)/---=≡卍)´o゜;) サクッ", + "アリガト\(^^\)(/^^)/アリガト", + "アリガトスケベイス!  ‥‥~凹凹凹凹 \(⌒▽⌒\)", + "\(∇⌒\)☆ア☆リ☆ガ☆ト☆ウ☆(/⌒∇)/", + "アリ\(*^▽^*)/ガトゥ", + "v(^_^v)♪ありがと♪(v^_^)v", + "m(_ _)m アリガトォ~★", + "蟻が十 ..........", + "☆⌒(*^∇゜)v ありがとう!", + "アリガト♪(*'-^)‐☆パチン キラキラ~~~コツン゛☆(°_° )~°ポケー", + "あ(^○^)り(^。^)が(^∇^)と(^O^)う(^ー^)ノ", + "クルクル(・_・)(_・ )(  )( ・_)(*°∇^V)⌒☆アリガトウ!", + "アリガチョーク ( -ω-)ノ-=≡≡≡☆-(>。<) イタイ", + "アリガタビーム (( o|o) ピ~》》》 (V)。。(V)フォッ", + "アリガトキッーク \(`O´)―θ☆(x x)", + "アリガタマキビシ ( -.-)ノ・・・-=≡≡≡*********", + "( ´△`)", + "ฅ(๑’Δ’๑)", + "(❁°͈▵°͈)", + "ฅ=͟͟͞͞((꒪∆꒪;)ฅ", + "(๑ʘ∆ʘ๑)", + "(๑ˊ▵ॢˋ̥๑)", + "(๑ ˊ͈ ᐞ ˋ͈ )ƅ̋", + "ల(`°Δ°)", + "(,,꒪꒫꒪,,)", + "((((爾△爾))))", + "(●´・△・`)", + "Σ(,,oΔo,,*)", + "(⊙△⊙✿)", + "⊙△⊙", + "〝〇〟⊂(`・Δ・´)⊃〝〇〟", + "( ゚д゚)", + "(๏д๏)", + "( ;´Д`)", + "(;´Д`)", + "(((( ;°Д°))))", + "((*゜Д゜)ゞ”", + "(@ ̄Д ̄@;)", + "(´;Д;`)", + "(´Д` )", + "(ι´Д`)ノ", + "《゚Д゚》", + "∑(;°Д°)", + "(;๏д๏)", + "Σ(゚д゚lll)", + "(((╹д╹;)))", + "(๑⁺᷄д⁺᷅๑)◞՞", + "(╬⁽⁽ ⁰ ⁾⁾ Д ⁽⁽ ⁰ ⁾⁾)", + "( ᵒ̴̶̷᷄ д ᵒ̴̶̷᷅ )", + "(●ฅ́дฅ̀●)", + "(๑ŐдŐ)b", + "(・:゚д゚:・)", + "(๑´•д • `๑)", + "(´◑д◐`)", + "(◐д◑´,,)", + "d(ŐдŐ๑)", + "(°᷄д°᷅)", + "(*´゚д)(д゚`*)", + "(*´・Д・)", + "(υ´Д`)", + "(´Д`υ)", + "(・д・`o)", + "(:.;゚;Д;゚;.:)", + "( ;゚д゚)", + "Σ(゚д゚;)", + "(ノ゚д゚(; ̄Д ̄)", + "Σ【*゚д゚*】", + "๑ΘдΘ๑", + "(⌇ຶД⌇ຶ)", + "(๑Ő д Ő๑)", + "(・д・)", + "⊂(⊙д⊙)つ", + "(||゚Д゚)", + "(゚Д゚||)", + "⊂((メ´Д`))⊃", + "( ゚д゚)", + "(σ・Д・)σ", + "(*σ´Д`*)", + "Σ(っ゚Д゚;)っ", + "ヽ(;゚;Д;゚;; )", + "(´д`ι)", + "o┤*´Д`*├o", + "(;´゚Д゚)ゞ", + "(;゚;Д;゚;;)", + "w(´゚Д゚`)w", + "(# ゚Д゚)", + "ヾ(゚д゚)ノ゙", + "m(*´Д`)m", + "(;´・Д・)", + "|*´・Д・)r))゚", + "Σ(゚Д゚;≡`゚д゚)", + "(σ ´゜д゜)σ", + "( ゚д゚ )", + "((*`゚д゚)ゞ", + "σ(°Д°*)", + "┌┤´д`├┐", + "ミ(゜д゜○)", + "(゚д゚)", + "(。´・д・)o", + "o(゚Д゚)っ", + "Σ๑•ॢд •ॢ๑", + "(。´д`。)", + "Σ(`・Д・ノ)ノ", + "(οдО;)", + "◍´Д‵◍", + "o|๑⊙Д⊙๑|ツ", + "(✽ ゚д゚ ✽)", + "(´д`、)", + "(,,゚Д゚)", + "o(*´д`*)o", + "(´・Д・lll)ゞ", + "o(・´д・`o)))三(((o´・д`・)o", + "o(゚Д゚ = ゚Д゚)o ", + "o(゚Д゚ = ゚Д゚)o ", + "(´・(´・(´・(´・(´・(´・д・`) ・`)・`)・`)・`)・`)", + "(╯•﹏•╰)", + "(☍﹏⁰)", + "(◍•﹏•)", + "(๑•﹏•)", + "(‘﹏*๑)", + "(ó﹏ò。)", + "(。ŏ﹏ŏ)", + "( ・ั﹏・ั)", + "(´-﹏-`;)", + "•(◐﹏◐)•", + "(.`・﹏・´.)", + "c໒( ◐ ﹏ ◐ )७੭", + "ԅ[ •́ ﹏├┬┴┬┴", + " 。७﹏७ 。", + "(¤﹏¤)", + "●﹏●", + "へ[ : ⊚ ﹏ ⊚ : ]ง", + "╏ ˵ ✪ ﹏ ✪ ˵ ╏", + "▐ ” ⊗ ﹏ ⊗ ”▐", + "⊙﹏⊙", + "ミ●﹏☉ミ", + "ヾ(。﹏。)ノ゙", + "〳 •́ ﹏ •̀ 〵", + "╰[ ⁰﹏⁰ ]╯", + "(๑ó⌓ò๑)", + "(●´⌓`●)", + "( •᷄⌓•᷅ )", + "(´๑・⌓・`)", + "( ³⌓³)", + "(๑°⌓°๑)", + "(;ↀ⌓ↀ)", + "(◕⌓◕;)", + "Σ(‘◉⌓◉’)", + "(ὀ⌓ὀ⑅)", + "˛˛૧(˵¯͒▱¯͒˵)", + "˛૧(˵¯͒▱¯͒˵)", + "૮( ‘▱๋’ )ა", + "૮( ´⁰▱๋⁰` )ა", + "ଽ ૮( ⁰▱๋⁰ )ა", + "˚▱˚", + "(ⅈ▱ⅈ)", + "/( ̄ロ ̄;)\", + "( ̄□ ̄)", + "Σ੧(❛□❛✿)", + "[ ∗ ◕ □ ◕ ∗ ]", + "(o゚□゚)o", + "(oミ゚ロ゚ミ)o", + "(๑º ロ º๑)", + "(๑⊙ロ⊙๑)", + "∩( ̄□ ̄#)∩", + "(˚☐˚! )/", + "o(*・ロ・*)o", + "⁞ ✪ ⌂ ✪ ⁞", + "(✱°⌂°✱)", + "╏ ⁰ ⌂ ⁰ ╏", + "ヽ[ ಡ ⌂ ಡ ]⊃", + "₍₍ (̨̡ ‾᷄⌂‾᷅)̧̢ ₎₎", + "⚆ᗝ⚆", + "\(°o°;)", + "~~旦_(・o・;)", + "(;´・`)>", + "(; ̄ェ ̄)", + "(;° ロ°)", + "(;☉_☉)", + "( ̄□ ̄;)", + "( ̄□ ̄;)!!", + "( ̄◇ ̄;)", + "(°◇°;)", + "(°o°;)", + "(~_~;)", + "(−_−;)", + "(ーー;)", + "(o。o;)", + "(-。-;", + "༼⁰o⁰;༽", + "(´⊙o⊙`;)", + "・(•́⍛•̀; ≡ •́⍛•̀;)", + "(◞‸◟;)", + "( ´;゚;ё;゚;)", + ":;(∩´﹏`∩);:", + "(゚A゚;)", + "( ゚Å゚;)", + "٩̋(•᷄◟̵◞̵•᷅‧̣̥̇)’`~✧", + "(φ╻φ;)", + "(≖╻≖;)", + "(;ꏿ︿ꏿ)", + "༼ : ౦ ‸ ౦ : ༽", + "(´エ`;)", + "(-∀-`; )", + "(・∀・;)", + "(*;´□`)ゞ", + "[ : • 益 • : ]", + "ʕ・_・ ;ʔ≡ʕ; ・_・ʔ", + "( ̄ー ̄;)", + "((´∀`;))", + "(( ´∀`;))", + "。(>_<;=;>_<)。", + "(;○□○)", + "(*゚Å゚;*)", + "((((。(´°Α°`)。))))", + "f(^_^;", + "(°m°;)", + "(-∧-;)", + "。:゚*+;(●´・д・`●);+*゚:。", + "(:.;゚;益;゚;益;゚;益;゚;益;゚;益;゚;益;゚;.)", + "(」゜ロ゜)」", + "\(●o○;)ノ", + "┗┐ヽ(′Д、`*)ノ┌┛", + "ヽ(・_・;)ノ", + "ヾ(´・ ・`。)ノ”", + "ヽ( ̄д ̄;)ノ", + "ヽ(゜ロ゜;)ノ", + "ヾ(=゚・゚=)ノ", + "Σ(゚ロ゚」)」", + "ლ(´﹏`ლ)", + "╭(°A°`)╮", + "┌┤´゚Д゚`├┐", + "ヾ( •́д•̀ ;)ノ", + "ヽ(*´Д`*)ノ", + "ヽ(゚Д゚)ノ", + "ヾ(◎o◎,,;)ノ", + "ヾ( ๑´д`๑)ツ", + "ヾ(*ㅿ*๑)ツ", + "ヾ(๑ ³ㅿ³)ノ", + "ヾ(((;ꈡ▱ꈡ;)))ノ", + "ʿʿ⁽⁽((⁰ⅈ⁰))⁾⁾ʾʾ", + "ヾ(゚д゚;)", + "ヽ(;´Д`)ノ", + "ヾ(o´0ω0o)ノ", + "ヾ(o´0Д0o)ノ", + "<(´・д・`)ノ", + "ɭ ɿ (•᷄દ•᷅)", + "(ι´ Д`)ノ", + "ヽ༼﹏༽ノ", + "੧║ ” ◔ Ĺ̯ ◔ ” ║و", + "ゞ( ͡°⍛ ͡°)ゞ", + "ヽ༼⊙_⊙༽ノ", + "ヾ(*’□’*)ー", + "ヾ(・ω・`;))ノ", + "<(ll゚◇゚ll)>", + "ヾ((;´・ω・)ノ", + "ヾ(・ω・`;)ノ", + "ヽ(*´□`)ノ゙", + "ヾ(;゚;Д;゚;)ノ゙", + "(*ノ´□`)ノ~", + "╰໒(⸝⸝⸝⚆Ĺ̯⚆⸝⸝⸝)७ノ", + "ヽ(‘ºل͟º)ノ", + "へ( ̿̿ o ̿̿ )╮", + "ԅ། , ◔ ﹏ ◔ , །ᓄ", + "ヽ(◕﹏◕)ノ", + "(○´・д・)ノ", + "(*′口`)ノ", + "ヽ(*´□`*)ッ", + "ヽ(´・д・`)ノ", + "ヽ(・д・`。)ノ", + "ヽ(。´・д・)ノ", + "ヾ(゜д゜)ノ", + "(┓゜A゜)┓", + "ლ(゚д゚ლ)", + "ヽ(*゜∀゜*)ノ", + "ヾ(◕д◕❀)ツ", + "ヾ(❀◕д◕)ノ", + "(゜」∀」゜)", + "o|✿´・ェ・`|o", + "ヽ(▣﹏▣\*≡*/▣﹏▣)ノ", + "/~\o=(;゚ロ゚)=o/~\", + ".+:。ヽU゚Д゚Uノ゚.+:。", + "ヘ(゚∀゚ヘ)ヘ(゚∀゚ヘ)ヘ(゚∀゚ヘ)", + "ଵ˛̼ଵ", + "⁎ۜ′̛˷˒′̛⌕", + "⋆ᶿ̵᷄ ˒̼ ᶿ̵᷅⋆", + "๑•́ㅿ•̀๑) ᔆᵒʳʳᵞ", + "(๑o̴̶̷̥᷅﹏o̴̶̷̥᷅๑)ᵒᵐᵍᵎᵎᵎ", + "(・_-。 )", + "(’-’*)", + "(´ ˙○˙ `)", + "((유∀유|||))", + "Σ(´゚ω゚` )", + "(╯•ω•╰)", + "(๑ŏ _ ŏ๑)", + "~( ´•︵•` )~", + "(ૢ•᷄⊱•᷅ ╬)", + "(ʘᗩʘ’)", + "[・Å・` ○]", + "(๑´•ω • `๑)", + "‷̗ↂ凸ↂ‴̖", + "(*´・Å・`)", + "(๑•́ω•̀)", + "[・A・` ○]", + "ჴ˘ര‸രჴ", + "(੭ु⍨)੭ु⁾⁾", + "/・_・ヾ\", + "(⁎·́ˍູˑ·̀)", + "┌╏ •́ – •̀ ╏┐", + "( ´゚,_」゚)", + "o(°ω°メ)O))", + "(*´○∧○`*)", + "░ ര Ĺ̯ ര ░", + "~( ~´・_・`)~", + "[*っ´・Å・]", + "(  ゚々゚)", + "ε=(゚∀゜´)", + "(´σωσ*)", + "(´・⊥・`)", + "(⊙…⊙ )", + "(-’๏_๏’-)", + "(⊙︿⊙✿)", + "◑.◑", + "( ˵ ◐ ︿ ◐ ˵ )", + "( ° ^ ° )", + "໒(•න꒶̼න•)७", + "╏ ” ⊚ ͟ʖ ⊚ ” ╏", + "(✿˵•́ ‸ •̀˵)", + "“(´≖ ‸ ≖`)”", + ".,.,.,∵゜⊂-o(´・ω・`o)三(o´・ω・`)o-⊃゜∵.,.,.,", + "Y⌒Y⌒Y⌒Y⌒Y⌒Y⌒(。A。)!!!", + "(•᷊᷄ṏ̮•᷊᷅)", + "(‖ⁱ꒪♖꒪)", + "₊·(ϱ॔﹏ᵕ๑॓)‧*", + "(❛ॕ⌓ ̣̣̥❛ॕ•ॢ)", + "“(゚c_,゚`。)プ", + "“(#゚,_ゝ゚)”", + "o͡͡͡╮〳 ~ ☉ ₒ ☉ ~ 〵╭o͡͡͡", + "૮( ᵒ̌ัૢ▱ᵒ̌ัૢ )ა", + "(⌓⍢⌓〣)", + "⁝ʺ̢͈̗̋ •᷊᷄ṏ̮•᷊᷅ ˵̡̖̎̏⁝", + "( ͒๑㉾ܫ㉾๑ ͒)", +]; + +module.exports = { + data: new SlashCommandBuilder() + .setName("kaomoji") + .setDescription("Send a kaomoji text!"), + async execute(interaction) { + interaction.reply({ content: `${rightThere[Math.round(Math.random() * (rightThere.length - 1))]}`}) + .catch(() => {}); + } +}; \ No newline at end of file diff --git a/src/slashCommands/fun/kill.js b/src/slashCommands/fun/kill.js new file mode 100644 index 0000000..da514b8 --- /dev/null +++ b/src/slashCommands/fun/kill.js @@ -0,0 +1,57 @@ +const { SlashCommandBuilder } = require("@discordjs/builders"); +const Guild = require("../../database/schemas/Guild"); + +module.exports = { + data: new SlashCommandBuilder() + .setName("kill") + .setDescription("Kill someone! (fake)") + .addUserOption((option) => option.setName("member").setDescription("The member to (fake) kill").setRequired(true)), + async execute(interaction) { + const guildDB = await Guild.findOne({ + guildId: interaction.guild.id, + }) + + const language = require(`../../data/language/${guildDB.language}.json`); + const member = interaction.options.getMember("member"); + + if (!member) return interaction.reply({ content: `${language.kill1}` }).catch(() => { + interaction.reply({ content: `${language.kill1}` }); + }); + + let user = member.user.username; + + const answers = [ + `${interaction.user.username} ${language.kill3} ${user}${language.kill4}`, + `${user} ${language.kill5}`, + `${user} ${language.kill6}`, + `${user} ${language.kill7}`, + `..Noo, ${interaction.user.username} ${language.kill8} ${user} ${language.kill9}`, + `${user} ${language.kill10} ${interaction.user.username}${language.kill11} `, + `${user} ${language.kill12}`, + `${user} ${language.kill13} ${interaction.user.username} ${language.kill14}`, + `${user} ${language.kill15}`, + `${interaction.user.username} ${language.kill16} ${user}${language.kill17}`, + `${user} ${language.kill18}`, + `${user} ${language.kill19}`, + `${user} ${language.kill20}`, + `${interaction.user.username} ${language.kill21} ${user} ${language.kill22}`, + `${interaction.user.username} ${language.kill23} ${user}.. rip`, + `${user} ${language.kill24}`, + `${language.kill25} ${user}${language.kill26}`, + `${language.kill27} ${user}.. rip }`, + `${interaction.user.username} crushes ${user} ${language.kill28}`, + `${user} ${language.kill29}`, + `${language.kill31} ${interaction.user.username}, ${user} ${language.kill30}`, + `${user} ${language.kill32} `, + `${user} ${language.kill33} `, + ]; + + if (member.id === interaction.member.id) return interaction.reply({ content: `${language.kill2}` }).catch(() => { + interaction.reply({ content: `${language.kill1}` }); + }); + + interaction.reply({ content: `${answers[Math.floor(Math.random() * answers.length)]}` }).catch(() => { + interaction.reply({ content: `${language.kill1}` }); + }); + } +}; \ No newline at end of file diff --git a/src/slashCommands/fun/m.js b/src/slashCommands/fun/m.js new file mode 100644 index 0000000..f26adea --- /dev/null +++ b/src/slashCommands/fun/m.js @@ -0,0 +1,10 @@ +const { SlashCommandBuilder } = require("@discordjs/builders"); + +module.exports = { + data: new SlashCommandBuilder() + .setName("m") + .setDescription("Sends the letter m"), + async execute(interaction) { + interaction.reply({ content: "m." }); + } +}; \ No newline at end of file diff --git a/src/slashCommands/fun/nuke.js b/src/slashCommands/fun/nuke.js new file mode 100644 index 0000000..e72f80d --- /dev/null +++ b/src/slashCommands/fun/nuke.js @@ -0,0 +1,11 @@ +const { SlashCommandBuilder } = require("@discordjs/builders"); + +module.exports = { + data: new SlashCommandBuilder() + .setName("nuke") + .setDescription("Nukes a server (FAKE)"), + async execute(interaction) { + interaction.reply({ content: `https://tenor.com/view/explosion-mushroom-cloud-atomic-bomb-bomb-gif-4464831` }) + .catch(() => {}); + } +} \ No newline at end of file diff --git a/src/slashCommands/fun/pickupline.js b/src/slashCommands/fun/pickupline.js new file mode 100644 index 0000000..e6bd997 --- /dev/null +++ b/src/slashCommands/fun/pickupline.js @@ -0,0 +1,59 @@ +const { SlashCommandBuilder } = require("@discordjs/builders"); + +const line = [ + "Are you Node.js? Because I'd always give you a callback. I promise", + "I hope you know CPR because you took my breath away!", + "You've made me so nervous that I've totally forgotten my standard pick-up line.", + "Are you a trap card? Because I've fallen for you.", + "Roses are red, violets are blue, omae wa mo shindeiru", + "Baby, come with me and you'll be Going Merry.", + "I think I need a paralyze heal! Because you're stunning!", + "You must be a mahou shoujo, you've got me under your spell!", + "Do you have a Death Note? Because every time you smile, I feel like I'm having a heart attack!", + "Are you Saitama? Because you've got me down in one move!", + "I don't need 99 souls, all I need is yours!", + "You must be better than Kuuhaku. Because when I first saw you, you already won my heart!", + "I'd take the Hunter Exam just for you!", + "Do you believe in fate? How about you stay the night? (Fate/Night; this one wasn't too apparant..)", + "Just say yes and I'll give you more than seven Eurekas!", + "You're like the 3D Maneuver gear. I won't stand a chance in this world without you!", + "You remind me of Menma. Because even when I can't see you, I still feel you inside my heart!", + "If I just had a Goose, I'd command you to be mine!", + "Extra cursed student or not, I wont even think of ignoring you! (From anime *another*; not too apparant..rip)", + "I don't need a Sharingan to see how beautiful you are!", + "Are you Kikyo? Because I think you shot an arrow through my heart!", + "Even if it means risking my existence, I'll cross different world lines just to find you! (Steins;Gate)", + "Hey! Are you the railgun? Because I can feel a spark! (Toaru Kagaku no Railgun)", + "Are you from the Bath House? Because you take my spirit away. (Spirited Away)", + "Omae wa mo shindeiru! NANI?", + "You must be Kira, because you just gave me a heart attack!", + "You're cooler than Grey's ice shell!", + "You're more delicious than Ciel's soul!", + "Our love is like Grell, it never seems to die!", + "We were born to make history!!", + "If you were a potato, you would be a good potato.", + "I don't need a Death Note, your beauty is killer!", + "I love you as much as Ryuk loves apples!", + "I'll buy you ice cream, just be careful not to drop it ...🍦", + "Call me All Might, because I’m just looking to Texas Smash!", + "...Full Homo...", + "I don't need pickup lines, because they don't work on corpses.", + "Kanye feel the love?", + "You can take me to flavour town!!", + "Hey, you're pretty good!!", + "I'd go full homo for you!", + "I wish they'd all die, except for you!", +]; +const { MessageEmbed } = require("discord.js"); + +module.exports = { + data: new SlashCommandBuilder() + .setName("pickupline") + .setDescription("Send a funny pickup line"), + async execute(interaction) { + const embed = new MessageEmbed() + .setDescription(`${line[Math.round(Math.random() * (line.length - 1))]}`) + .setColor(interaction.client.color.pink); + return interaction.reply({ embeds: [embed] }).catch(() => {}); + } +}; \ No newline at end of file diff --git a/src/slashCommands/fun/reverse.js b/src/slashCommands/fun/reverse.js new file mode 100644 index 0000000..86f9cc8 --- /dev/null +++ b/src/slashCommands/fun/reverse.js @@ -0,0 +1,27 @@ +const { SlashCommandBuilder } = require("@discordjs/builders"); +const { MessageEmbed } = require("discord.js"); +const Guild = require("../../database/schemas/Guild"); + +module.exports = { + data: new SlashCommandBuilder() + .setName("reverse") + .setDescription("Reverses a message") + .addStringOption((option) => option.setName("message").setDescription("The message to reverse").setRequired(true)), + async execute(interaction) { + const guildDB = await Guild.findOne({ + guildId: interaction.guild.id, + }); + + const language = require(`../../data/language/${guildDB.language}.json`); + + const text = interaction.options.getString("message") + const converted = text.split("").reverse().join(""); + interaction.reply({ embeds: [ + new MessageEmbed() + .setDescription(`\u180E${converted}`) + .setColor(interaction.client.color.blue) + ] + }) + .catch(() => {}); + } +}; \ No newline at end of file diff --git a/src/slashCommands/fun/say.js b/src/slashCommands/fun/say.js new file mode 100644 index 0000000..47139ea --- /dev/null +++ b/src/slashCommands/fun/say.js @@ -0,0 +1,26 @@ +const { SlashCommandBuilder } = require("@discordjs/builders"); +const Guild = require("../../database/schemas/Guild"); +const send = require(`../../packages/logs/index.js`); + +module.exports = { + data: new SlashCommandBuilder() + .setName("say") + .setDescription("Make the bot say something") + .addStringOption((option) => option.setName("message").setDescription("The message to say").setRequired(true)), + async execute(interaction) { + const guildDB = await Guild.findOne({ + guildId: interaction.guild.id, + }); + + const language = require(`../../data/language/${guildDB.language}.json`); + + const text = interaction.options.getString("message") + + if(!text) { + return interaction.reply({ content: `${language.whatdoIsay}` }); + } + + interaction.reply({ content: text }) + .catch(() => {}) + } +} \ No newline at end of file diff --git a/src/slashCommands/fun/vaporwave.js b/src/slashCommands/fun/vaporwave.js new file mode 100644 index 0000000..3f912f5 --- /dev/null +++ b/src/slashCommands/fun/vaporwave.js @@ -0,0 +1,36 @@ +const { SlashCommandBuilder } = require("@discordjs/builders"); +const Guild = require("../../database/schemas/Guild"); +const { MessageEmbed } = require("discord.js"); + +module.exports = { + data: new SlashCommandBuilder() + .setName("vaporwave") + .setDescription("Vaporwave a text") + .addStringOption((option) => option.setName("message").setDescription("The message").setRequired(true)), + async execute(interaction) { + const guildDB = await Guild.findOne({ + guildId: interaction.guild.id, + }); + + const language = require(`../../data/language/${guildDB.language}.json`); + + const vaporwave = interaction.options.getString("message") + + const vaporwavefield = vaporwave.toString().split("").map((char) => { + const code = char.charCodeAt(0); + return code >= 33 && code <= 126 + ? String.fromCharCode(code - 33 + 65281) + : + char; + }) + .join("") + .replace(/, /g, " "); + interaction.reply({ + embeds: [ + new MessageEmbed() + .setDescription(vaporwavefield) + .setColor(interaction.client.color.blue), + ], + }); + } +}; From 7fe5c22699e4f20942106ae79943dcc999b66aa7 Mon Sep 17 00:00:00 2001 From: eYuM <101909226+eYuM-coder@users.noreply.github.com> Date: Mon, 6 Mar 2023 09:54:17 -0700 Subject: [PATCH 31/70] Create addbadge.js --- src/slashCommands/owner/addbadge.js | 41 +++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 src/slashCommands/owner/addbadge.js diff --git a/src/slashCommands/owner/addbadge.js b/src/slashCommands/owner/addbadge.js new file mode 100644 index 0000000..2b9e43c --- /dev/null +++ b/src/slashCommands/owner/addbadge.js @@ -0,0 +1,41 @@ +const { SlashCommandBuilder } = require("@discordjs/builders"); +const User = require("../../database/schemas/User"); + +module.exports = { + data: new SlashCommandBuilder() + .setName("addbadge") + .setDescription("Add a badge to a user") + .addStringOption((option) => option.setName("badge").setDescription("The badge to add").setRequired(true)) + .addUserOption((option) => option.setName("member").setDescription("The member to give the badge to")), + async execute(interaction) { + const client = interaction.client; + + let user = interaction.options.getMember("member") || interaction.member; + + if (!user) return interaction.reply({ content: "Provide me with a user.", ephemeral: true }); + + const badge = interaction.options.getString("badge"); + if (!badge) return interaction.reply({ content: "Provide me with a badge", ephemeral: true }); + + let userFind = await User.findOne({ + discordId: user.id, + }); + + if (!userFind) { + const newUser = new User({ + discordId: interaction.member.id, + }); + + newUser.save(); + userFind = await User.findOne({ + discordId: user.id, + }); + } + + if (userFind.badges && userFind.badges.includes(badge)) return interaction.reply({ content: `They already have that badge`, ephemeral: true }); + + userFind.badges.push(badge); + await userFind.save().catch(() => {}); + interaction.reply({ content: `Added the "${badge}" badge to the user!`, ephemeral: true }); + } +}; From bc560bf334c650b7071627d03652a09f3699006e Mon Sep 17 00:00:00 2001 From: eYuM <101909226+eYuM-coder@users.noreply.github.com> Date: Mon, 6 Mar 2023 09:54:49 -0700 Subject: [PATCH 32/70] unfinished --- src/slashCommands/owner/eval.js | 44 +++++++++++++++++++++ src/slashCommands/owner/exec.js | 33 ++++++++++++++++ src/slashCommands/owner/fetchinvite.js | 40 +++++++++++++++++++ src/slashCommands/owner/leaveguild.js | 38 ++++++++++++++++++ src/slashCommands/owner/restart.js | 23 +++++++++++ src/slashCommands/owner/server.js | 55 ++++++++++++++++++++++++++ src/slashCommands/owner/servers.js | 48 ++++++++++++++++++++++ src/slashCommands/owner/setNews.js | 41 +++++++++++++++++++ 8 files changed, 322 insertions(+) create mode 100644 src/slashCommands/owner/eval.js create mode 100644 src/slashCommands/owner/exec.js create mode 100644 src/slashCommands/owner/fetchinvite.js create mode 100644 src/slashCommands/owner/leaveguild.js create mode 100644 src/slashCommands/owner/restart.js create mode 100644 src/slashCommands/owner/server.js create mode 100644 src/slashCommands/owner/servers.js create mode 100644 src/slashCommands/owner/setNews.js diff --git a/src/slashCommands/owner/eval.js b/src/slashCommands/owner/eval.js new file mode 100644 index 0000000..8f0cb12 --- /dev/null +++ b/src/slashCommands/owner/eval.js @@ -0,0 +1,44 @@ +const { SlashCommandBuilder } = require("@discordjs/builders"); + +module.exports = { + data: new SlashCommandBuilder() + .setName("eval") + .setDescription("This is for the developers.") + .addStringOption((option) => option.setName("thing-to-eval").setDescription("Thing to eval").setRequired(true)), + async execute(interaction) { + const input = interaction.options.getString("thing-to-eval") + + if(!interaction.client.config.developers.includes(interaction.member.id)) { + return interaction.reply({ + embeds: [ + new MessageEmbed() + .setColor(interaction.client.color.red) + .setDescription(`${interaction.client.emoji.fail} | You are not the developer of this bot.`) + ], ephemeral: true + }) + } + + if(!input) return interaction.reply(`What do I evaluate?`); + if(!input.toLowerCase().includes("token")) { + let embed = ``; + + try { + let output = eval(input); + if (typeof output !== "string") + output = require("util").inspect(output, { depth: 0 }); + + embed = `\`\`\`js\n${ + output.length > 1024 ? "Too large to display." : output + }\`\`\``; + } catch (err) { + embed = `\`\`\`js\n${ + err.length > 1024 ? "Too large to display." : err + }\`\`\``; + } + + interaction.reply(embed); + } else { + interaction.reply("Bruh you tryina steal my token huh?"); + } + } +}; \ No newline at end of file diff --git a/src/slashCommands/owner/exec.js b/src/slashCommands/owner/exec.js new file mode 100644 index 0000000..09f5067 --- /dev/null +++ b/src/slashCommands/owner/exec.js @@ -0,0 +1,33 @@ +const { SlashCommandBuilder } = require("@discordjs/builders"); +const { exec } = require("child_process"); + +module.exports = { + data: new SlashCommandBuilder() + .setName("exec") + .setDescription("This is for the developers") + .addStringOption((option) => option.setName("thing-to-exec").setDescription("The thing to execute").setRequired(true)), + async execute(interaction) { + const thing = interaction.options.getString("thing-to-exec") + + if(!interaction.client.config.developers.includes(interaction.member.id)) { + return interaction.reply({ + embeds: [ + new MessageEmbed() + .setColor(interaction.client.color.red) + .setDescription(`${interaction.client.emoji.fail} | You are not the developer of this bot.`) + ], ephemeral: true + }) + } + + if (thing.toLowerCase().includes("config.json")) return interaction.reply({ content: "Due to privacy reasons, we can't show the config.json file." }) + + if(thing.length < 1) return interaction.reply({ content: "You have to give me some text to execute!" }) + + interaction.reply({ content: `Please wait while the command is being processed... This may take a while.`, fetchReply: true, ephemeral: true }); + + exec(thing, (error, stdout) => { + const response = stdout || error; + interaction.editReply({ content: `${response}`, ephemeral: true }) + }) + } +} \ No newline at end of file diff --git a/src/slashCommands/owner/fetchinvite.js b/src/slashCommands/owner/fetchinvite.js new file mode 100644 index 0000000..ee1a96d --- /dev/null +++ b/src/slashCommands/owner/fetchinvite.js @@ -0,0 +1,40 @@ +const { SlashCommandBuilder } = require("@discordjs/builders"); + +module.exports = { + data: new SlashCommandBuilder() + .setName("fetchinvite") + .setDescription("Fetch an invite!") + .addStringOption((option) => option.setName("guild").setDescription("The guild ID").setRequired(true)), + async execute(interaction) { + const guildId = interaction.options.getString("guild"); + const guild = interaction.client.guilds.cache.get(guildId); + + if (!guild) return interaction.reply({ content: `Invalid Guild ID` }); + + if(!interaction.client.config.developers.includes(interaction.member.id)) { + return interaction.reply({ + embeds: [ + new MessageEmbed() + .setColor(interaction.client.color.red) + .setDescription(`${interaction.client.emoji.fail} | You are not a developer of this bot.`) + ], ephemeral: true + }) + } + + var textChats = guild.channels.cache.find((ch) => ch.type === "GUILD_TEXT" && ch.permissionsFor(guild.me).has("CREATE_INSTANT_INVITE")); + + if (!textChats) return interaction.reply({ content: `No channel` }); + + await textChats.createInvite({ + maxAge: 0, + maxUses: 0, + }) + .then((inv) => { + console.log(`${guild.name} | ${inv.url}`); + interaction.reply({ content: `${guild.name} | ${inv.url}` }); + }) + .catch(() => { + interaction.reply({ content: "I do not have permission to do that!", ephemeral: true }); + }); + } +}; \ No newline at end of file diff --git a/src/slashCommands/owner/leaveguild.js b/src/slashCommands/owner/leaveguild.js new file mode 100644 index 0000000..3ea49bc --- /dev/null +++ b/src/slashCommands/owner/leaveguild.js @@ -0,0 +1,38 @@ +const { SlashCommandBuilder } = require("@discordjs/builders"); +const { MessageEmbed } = require("discord.js"); + +module.exports = { + data: new SlashCommandBuilder() + .setName("leaveguild") + .setDescription("Make the bot leave a guild") + .addStringOption((option) => option.setName("guild").setDescription("The guild ID").setRequired(true)), + async execute(interaction) { + const guildId = interaction.options.getString("guild") + const guild = interaction.client.guilds.cache.get(guildId); + if(!guild) return interaction.reply({ content: `Invalid Guild ID`, ephemeral: true }); + + await interaction.deferReply({ ephemeral: true }); + + if(!interaction.client.config.developers.includes(interaction.member.id)) { + return interaction.editReply({ + embeds: [ + new MessageEmbed() + .setColor(interaction.client.color.red) + .setDescription(`${interaction.client.emoji.fail} | You are not a developer of this bot.`) + ], ephemeral: true + }) + } + + await guild.leave(); + const embed = new MessageEmbed() + .setTitle("Leave Guild") + .setDescription(`I have successfully left **${guild.name}**.`) + .setFooter({ + text: interaction.member.displayName, + iconURL: interaction.member.displayAvatarURL({ dynamic: true }), + }) + .setTimestamp() + .setColor(interaction.guild.me.displayHexColor) + interaction.editReply({ embeds: [embed], ephemeral: true }); + } +}; \ No newline at end of file diff --git a/src/slashCommands/owner/restart.js b/src/slashCommands/owner/restart.js new file mode 100644 index 0000000..512230c --- /dev/null +++ b/src/slashCommands/owner/restart.js @@ -0,0 +1,23 @@ +const { SlashCommandBuilder } = require("@discordjs/builders"); +const { MessageEmbed } = require("discord.js"); + +module.exports = { + data: new SlashCommandBuilder() + .setName("restart") + .setDescription("Restarts the bot."), + async execute(interaction) { + if(!interaction.client.config.developers.includes(interaction.member.id)) { + return interaction.reply({ + embeds: [ + new MessageEmbed() + .setColor(interaction.client.color.red) + .setDescription(`${interaction.client.emoji.fail} | You are not the developer of this bot.`) + ], + ephemeral: true + }) + } + await interaction.reply({ content: "Restarting!" }) + .catch((err) => this.client.console.error(err)); + process.exit(1); + } +}; \ No newline at end of file diff --git a/src/slashCommands/owner/server.js b/src/slashCommands/owner/server.js new file mode 100644 index 0000000..8da1c26 --- /dev/null +++ b/src/slashCommands/owner/server.js @@ -0,0 +1,55 @@ +const { SlashCommandBuilder } = require("@discordjs/builders"); +const { MessageEmbed } = require("discord.js"); +const moment = require("moment"); + +module.exports = { + data: new SlashCommandBuilder() + .setName("server") + .setDescription("Information of a server") + .addStringOption((option) => option.setName("guild").setDescription("The guild ID").setRequired(true)), + async execute(interaction) { + function checkDays(date) { + let now = new Date(); + let diff = now.getTime() - date.getTime(); + let days = Math.floor(diff / 86400000); + return days + (days == 1 ? " day" : " days") + " ago"; + } + const client = interaction.client; + const guildId = interaction.options.getString("guild") + const guild = interaction.client.guilds.cache.get(guildId); + if (!guild) return interaction.reply({ content: `Invalid guild ID` }); + + if(!interaction.client.config.developers.includes(interaction.member.id)) { + return interaction.reply({ + embeds: [ + new MessageEmbed() + .setColor(interaction.client.color.red) + .setDescription(`${interaction.client.emoji.fail} | You are not a developer of this bot.`) + ], ephemeral: true + }) + } + + const embed = new MessageEmbed() + .setAuthor({ name: guild.name, iconURL: guild.iconURL() }) + .addField("Server ID", `${guild.id}`, true) + .addField( + "Total | Humans | Bots", + `${guild.members.cache.size} | ${guild.members.cache.filter((member) => !member.user.bot).size} | ${guild.members.cache.filter((member) => member.user.bot).size}`, true + ) + .addField("Verification Level", `${guild.verificationLevel}`, true) + .addField("Channels", `${guild.channels.cache.size}`, true) + .addField("Roles", `${guild.roles.cache.size}`, true) + .addField( + "Creation Date", + `${guild.createdAt.toUTCString().substr(0, 16)} (${checkDays( + guild.createdAt + )})`, + true + ) + .setThumbnail(guild.iconURL()) + .setColor(interaction.guild.me.displayHexColor); + interaction.reply({ embeds: [embed] }).catch((error) => { + interaction.reply({ content: `Error: ${error}`}) + }); + } +}; \ No newline at end of file diff --git a/src/slashCommands/owner/servers.js b/src/slashCommands/owner/servers.js new file mode 100644 index 0000000..580d4b9 --- /dev/null +++ b/src/slashCommands/owner/servers.js @@ -0,0 +1,48 @@ +const { SlashCommandBuilder } = require("@discordjs/builders"); +const ReactionMenu = require("../../data/ReactionMenu.js"); +const { MessageEmbed } = require("discord.js"); + +module.exports = { + data: new SlashCommandBuilder() + .setName("servers") + .setDescription("View every server the bot is in"), + async execute(interaction) { + const servers = interaction.client.guilds.cache.map((guild) => { + return `\`${guild.id}\` - ${guild.name} - \`${guild.memberCount}\` members`; + }); + + if(!interaction.client.config.developers.includes(interaction.member.id)) { + return interaction.reply({ + embeds: [ + new MessageEmbed() + .setColor(interaction.client.color.red) + .setDescription(`${interaction.client.emoji.fail} | You are not a developer of this bot.`) + ], ephemeral: true + }) + } + + const embed = new MessageEmbed() + .setTitle("Server List") + .setFooter({ + text: interaction.member.displayName, + iconURL: interaction.member.displayAvatarURL({ dynamic: true }) + }) + .setTimestamp() + .setColor(interaction.guild.me.displayHexColor) + + if (servers.length <= 50) { + const range = servers.length == 1 ? "[1]" : `[1 - ${servers.length}]`; + embed.setTitle(`Server List ${range}`).setDescription(servers.join("\n")) + interaction.reply({ embeds: [embed], ephemeral: true }); + } else { + interaction.reply({ content: `I am currently in ${servers.length} servers.` }) + new ReactionMenu( + interaction.client, + interaction.channel, + interaction.member, + embed, + servers + ); + } + } +}; \ No newline at end of file diff --git a/src/slashCommands/owner/setNews.js b/src/slashCommands/owner/setNews.js new file mode 100644 index 0000000..d8b40f5 --- /dev/null +++ b/src/slashCommands/owner/setNews.js @@ -0,0 +1,41 @@ +const { SlashCommandBuilder } = require("@discordjs/builders"); +const config = require("../../../config.json"); +const { MessageEmbed } = require("discord.js"); +const NewsSchema = require("../../database/schemas/MEE8"); + +module.exports = { + data: new SlashCommandBuilder() + .setName("setnews") + .setDescription("This is for the developer.") + .addStringOption((option) => option.setName("text").setDescription("The text you want to set").setRequired(true)), + async execute(interaction) { + let news = interaction.options.getString("text") + const newsDB = await NewsSchema.findOne({}); + if (!newsDB) { + await NewsSchema.create({ + news: news, + time: new Date(), + }); + + return interaction.reply({ content: "News set.", ephemeral: true }); + } + + if(!interaction.client.config.developers.includes(interaction.member.id)) { + return interaction.reply({ + embeds: [ + new MessageEmbed() + .setColor(interaction.client.color.red) + .setDescription(`${interaction.client.emoji.fail} | You are not a developer of this bot.`) + ], ephemeral: true + }) + } + + await NewsSchema.findOneAndUpdate( + {}, + { + news: news, + time: new Date(), + } + ); + } +}; \ No newline at end of file From fb8a6d0ea6d85d1c325c1807c9ce57723c81d592 Mon Sep 17 00:00:00 2001 From: eYuM <101909226+eYuM-coder@users.noreply.github.com> Date: Mon, 6 Mar 2023 09:55:55 -0700 Subject: [PATCH 33/70] Create vote.js --- src/slashCommands/utility/vote.js | 44 +++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 src/slashCommands/utility/vote.js diff --git a/src/slashCommands/utility/vote.js b/src/slashCommands/utility/vote.js new file mode 100644 index 0000000..835b8ef --- /dev/null +++ b/src/slashCommands/utility/vote.js @@ -0,0 +1,44 @@ +const { SlashCommandBuilder } = require("@discordjs/builders"); +const { MessageEmbed } = require("discord.js"); +const User = require("../../database/schemas/User"); +const ms = require("ms"); + +module.exports = { + data: new SlashCommandBuilder() + .setName("vote") + .setDescription("MEE8s vote page"), + async execute(interaction) { + let user = await User.findOne({ + discordId: interaction.user.id + }); + + if (!user) { + const newUser = new User({ + discordId: interaction.user.id + }); + + await newUser.save().catch(() => {}); + user = await User.findOne({ + discordId: interaction.user.id + }); + } + + let DBL_INTERVAL = 43200000; + let lastVoted = user && user.lastVoted ? user.lastVoted : 0; + let checkDBLVote = Date.now() - lastVoted < DBL_INTERVAL; + + await interaction.reply({ + embeds: [ + new MessageEmbed() +.setDescription(`__**discordbotlist.com**__\n${checkDBLVote ? `\`In ${ms(user.lastVoted - Date.now() + DBL_INTERVAL, { long: true })}\`` : "[`Available Now!`](https://discordbotlist.com/bots/mee8-3175)"}\n\n__**Rewards:**__\n`) + .setAuthor({ + name: `${interaction.user.tag}`, + iconURL: interaction.user.displayAvatarURL({ dynamic: true }) + }) + .setColor(interaction.guild.me.displayHexColor) + .setFooter({ text: "https://mee8.ml" }) + .setTimestamp(), + ], + }); + } +}; From 9e3259ad92f1d69b1bd160856818b2f27a6c1611 Mon Sep 17 00:00:00 2001 From: eYuM <101909226+eYuM-coder@users.noreply.github.com> Date: Mon, 6 Mar 2023 09:56:24 -0700 Subject: [PATCH 34/70] Unfinished (still have a lot to convert here) --- src/slashCommands/utility/bug.js | 102 ++++++++++++++++++++++++++++ src/slashCommands/utility/verify.js | 60 ++++++++++++++++ 2 files changed, 162 insertions(+) create mode 100644 src/slashCommands/utility/bug.js create mode 100644 src/slashCommands/utility/verify.js diff --git a/src/slashCommands/utility/bug.js b/src/slashCommands/utility/bug.js new file mode 100644 index 0000000..67b43b2 --- /dev/null +++ b/src/slashCommands/utility/bug.js @@ -0,0 +1,102 @@ +const { SlashCommandBuilder } = require("@discordjs/builders"); +const { MessageEmbed } = require("discord.js"); +const Discord = require("discord.js"); +const config = require("../../../config.json"); +const Logging = require("../../database/schemas/logging"); +const webhookClient = new Discord.WebhookClient({ url: config.webhooks.bugs }); +const Guild = require("../../database/schemas/Guild"); +const crypto = require("crypto"); + +module.exports = { + data: new SlashCommandBuilder() + .setName("reportbug") + .setDescription("Report bugs to MEE8!") + .addStringOption((option) => option.setName("text").setDescription("The text").setRequired(true)), + async execute(interaction) { + const guildDB = await Guild.findOne({ + guildId: interaction.guild.id, + }); + + const logging = await Logging.findOne({ guildId: interaction.guild.id }); + + const language = require(`../../data/language/${guildDB.language}.json`); + + var id = crypto.randomBytes(4).toString("hex"); + + const text = interaction.options.getString("text"); + if(text.length < 1) { + return interaction.reply({ + embeds: [ + new MessageEmbed() + .setColor(interaction.client.color.red) + .setDescription(`${interaction.client.emoji.fail} | ${language.report1}`) + ] + }) + .then(async () => { + if (logging && logging.moderation.delete_reply === "true") { + setTimeout(() => { + interaction.deleteReply().catch(() => {}); + }, 5000); + } + }) + .catch(() => {}); + } + + if (text.length < 3) { + return interaction.reply({ + embeds: [ + new MessageEmbed() + .setColor(interaction.client.color.red) + .setDescription(`${interaction.client.emoji.fail} | ${language.report2}`) + ] + }) + .then(async () => { + if (logging && logging.moderation.delete_reply === "true") { + setTimeout(() => { + interaction.deleteReply().catch(() => {}); + }, 5000); + } + }) + .catch(() => {}); + } + + let invite = await interaction.channel.createInvite({ + maxAge: 0, maxUses: 0, + }) + .catch(() => {}); + + let report = text; + const embed = new MessageEmbed() + .setTitle("Bug Report") + .setThumbnail(interaction.user.displayAvatarURL({ dynamic: true })) + .setDescription(`${report}`) + .addField("User", `${interaction.member}`, true) + .addField("User username", `${interaction.member.user.username}`, true) + .addField("User ID", `${interaction.member.id}`, true) + .addField("User Tag", `${interaction.user.tag}`, true) + .addField("Server", `[${interaction.guild.name}](${invite || "none"})`, true) + .addField("Bug Report ID:", `#${id}`, true) + .setFooter({ text: interaction.member.displayName, iconURL: interaction.user.displayAvatarURL({ dynamic: true }) }) + .setTimestamp() + .setColor("GREEN"); + + const confirmation = new MessageEmbed() + .setTitle("Bug Report") + .setThumbnail(interaction.user.displayAvatarURL({ dynamic: true })) + .setDescription(`${language.report3} Support [**Server**](${config.discord})`) + .addField("Member", `${interaction.member}`, true) + .addField("Message", `${report}`, true) + .addField("Bug Report ID:", `#${id}`, true) + .setFooter({ text: "https://mee8.ml" }) + .setTimestamp() + .setColor("GREEN"); + + webhookClient.sendCustom({ + username: "MEE8 Bug Report", + avatarURL: `https://mee8.ml/logo.png`, + embeds: [embed], + }); + + interaction.reply({ embeds: [confirmation] }) + } +} \ No newline at end of file diff --git a/src/slashCommands/utility/verify.js b/src/slashCommands/utility/verify.js new file mode 100644 index 0000000..42f3c71 --- /dev/null +++ b/src/slashCommands/utility/verify.js @@ -0,0 +1,60 @@ +const { SlashCommandBuilder } = require("@discordjs/builders"); +const { MessageEmbed } = require("discord.js"); +const Logging = require("../../database/schemas/logging"); + +module.exports = { + data: new SlashCommandBuilder() + .setName("verify") + .setDescription("Verify a user yourself.") + .addUserOption((option) => option.setName("member").setDescription("The user to verify").setRequired(true)), + async execute(interaction) { + const client = interaction.client; + const fail = client.emoji.fail; + const success = client.emoji.success; + const member = interaction.options.getMember("member"); + const logging = await Logging.findOne({ guildId: interaction.guild.id }); + const memberrole = interaction.guild.roles.cache.find((r) => r.name.toLowerCase() === "member"); + let memberr = interaction.guild.roles.cache.find((r) => r.name.toLowerCase() === "members"); + let verified = interaction.guild.roles.cache.find((r) => r.name.toLowerCase() === "verified"); + + if(!member) { + let embed = new MessageEmbed() + .setDescription(`${fail} | Please provide a valid user mention!`) + .setColor(client.color.red) + return interaction.reply({ embeds: [embed] }) + .then(async () => { + if (logging && logging.moderation.delete_reply === "true") { + setTimeout(() => { + interaction.deleteReply().catch(() => {}); + }, 5000); + } + }) + .catch(() => {}) + } + + if(member) { + if(memberrole) { + member.roles.add(memberrole) + } + if (memberr) { + member.roles.add(memberr) + } + if (verified) { + member.roles.add(verified) + } + + let embed = new MessageEmbed() + .setDescription(`${success} | ${member} has been verified.`) + .setColor(client.color.green) + interaction.reply({ embeds: [embed] }) + .then(async () => { + if (logging && logging.moderation.delete_reply === "true") { + setTimeout(() => { + interaction.deleteReply().catch(() => {}) + }, 5000); + } + }) + .catch(() => {}) + } + } +}; \ No newline at end of file From 4c9061d8a458792d088b23152c1555124d7be00e Mon Sep 17 00:00:00 2001 From: eYuM <101909226+eYuM-coder@users.noreply.github.com> Date: Thu, 9 Mar 2023 10:22:09 -0700 Subject: [PATCH 35/70] Changed url to hcaptcha api Remember, hcaptcha needs ONE captcha verified to register your site functional. --- src/dashboard/templates/appealMain.ejs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/dashboard/templates/appealMain.ejs b/src/dashboard/templates/appealMain.ejs index ff5321e..5af8de2 100644 --- a/src/dashboard/templates/appealMain.ejs +++ b/src/dashboard/templates/appealMain.ejs @@ -99,7 +99,7 @@ body.done .contact-form-title::after { }; - @@ -129,4 +129,4 @@ document.getElementById("form").submit(); - \ No newline at end of file + From af83ab2ff39e362624d1a9287309f6c270029e58 Mon Sep 17 00:00:00 2001 From: eYuM <101909226+eYuM-coder@users.noreply.github.com> Date: Fri, 10 Mar 2023 11:03:03 -0700 Subject: [PATCH 36/70] Update clear.js This is the first slash command for Pogy that uses `interaction.channel.send` instead of `interaction.reply` --- src/slashCommands/moderation/clear.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/slashCommands/moderation/clear.js b/src/slashCommands/moderation/clear.js index 75207b7..c2ceab3 100644 --- a/src/slashCommands/moderation/clear.js +++ b/src/slashCommands/moderation/clear.js @@ -72,6 +72,7 @@ module.exports = { }) .catch(() => {}); } else { + interaction.reply({ content: "Complete.", ephemeral: true }) channel.bulkDelete(messages, true).then((messages) => { const embed = new MessageEmbed() @@ -96,7 +97,7 @@ module.exports = { } interaction - .reply({ embeds: [embed] }) + .channel.send({ embeds: [embed] }) .then(async () => { if (logging && logging.moderation.delete_reply === "true") { setTimeout(() => { @@ -111,4 +112,4 @@ module.exports = { console.error(err) } } -} \ No newline at end of file +} From 6fe459baffc72491a46eec9a7976a950eb82fb27 Mon Sep 17 00:00:00 2001 From: hotsu0p Date: Sat, 23 Dec 2023 18:53:15 -0600 Subject: [PATCH 37/70] added say slash command! --- src/slash/say.js | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 src/slash/say.js diff --git a/src/slash/say.js b/src/slash/say.js new file mode 100644 index 0000000..63b3f89 --- /dev/null +++ b/src/slash/say.js @@ -0,0 +1,38 @@ +module.exports = { + name: "say", + description: "Make the bot say something!", + category: "general", + slash: true, + global: true, + options: [ + { + name: "message", + description: "Enter the message you want the bot to say.", + type: "STRING", + required: true, + }, + ], + error: async (data, error) => { + console.error(error); + await data.interaction.reply({ + content: "There was an error while processing your command.", + ephemeral: true, + }); + }, + run: async (data) => { + try { + + const userMessage = data.interaction.options.getString("message"); + + await data.interaction.followUp({ content: userMessage }); + } catch (error) { + console.error(error); + + await data.interaction.followUp({ + content: "Failed to execute the command.", + ephemeral: true, + }); + } + }, + }; + \ No newline at end of file From fff4773e26e87e53e221428e8c0c0ba012451a17 Mon Sep 17 00:00:00 2001 From: hotsu0p Date: Sat, 23 Dec 2023 18:53:24 -0600 Subject: [PATCH 38/70] yea ig --- .env.template | 14 -------------- config.json.template | 34 ---------------------------------- 2 files changed, 48 deletions(-) delete mode 100644 .env.template delete mode 100644 config.json.template diff --git a/.env.template b/.env.template deleted file mode 100644 index bb001ce..0000000 --- a/.env.template +++ /dev/null @@ -1,14 +0,0 @@ -TOKEN= -MONGO= -SESSION_SECRET= -AUTH_DOMAIN= -MAIN_CLIENT_ID= -AUTH_CLIENT_ID= -AUTH_CLIENT_SECRET= -PORT= -ANALYTICS= -GOOGLE_SITE_VERIFICATION= -DATADOG_API_KEY= -DATADOG_API_HOST= -DATADOG_API_PREFIX= -DBL_AUTH= \ No newline at end of file diff --git a/config.json.template b/config.json.template deleted file mode 100644 index fc8331e..0000000 --- a/config.json.template +++ /dev/null @@ -1,34 +0,0 @@ -{ - "developers": [], - "status": "p!help | pogy.xyz", - "discord": "", - "dashboard": "true", - "server": "", - "prefix": "p!", - "webhooks": { - "logs": "", - "maintenance_logs": "", - "ratelimit_logs": "", - "blacklist": "", - "report": "", - "contact": "", - "bugs": "", - "premium": "", - "suggestions": "", - "votes": "", - "errors": "", - "auth": "", - "joinsPublic": "", - "joinsPrivate": "", - "leavesPublic": "", - "leavesPrivate": "" - }, - "maintenance": "true", - "maintenance_threshold": "3", - "invite_link": "", - "seo": { - "enabled": "false", - "title": "", - "description": "" - } -} From 8e516b10b4a1b6cde6cfc1492443a026eb87fc80 Mon Sep 17 00:00:00 2001 From: Hotsuop <130086894+hotsu0p@users.noreply.github.com> Date: Sun, 24 Dec 2023 08:28:54 -0600 Subject: [PATCH 39/70] added users --- src/data/users.json | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 src/data/users.json diff --git a/src/data/users.json b/src/data/users.json new file mode 100644 index 0000000..bc3dfea --- /dev/null +++ b/src/data/users.json @@ -0,0 +1,4 @@ +{ + "users": {} + } + \ No newline at end of file From 861ac97dfaa53da11f137c209370ada7025a05ee Mon Sep 17 00:00:00 2001 From: Hotsuop <130086894+hotsu0p@users.noreply.github.com> Date: Sun, 24 Dec 2023 08:29:21 -0600 Subject: [PATCH 40/70] added fule --- .gitignore | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index cd2e011..89dbfd2 100644 --- a/.gitignore +++ b/.gitignore @@ -3,4 +3,5 @@ src/assets/logs/Pogy.log config.json node_modules .env -package-lock.json \ No newline at end of file +package-lock.json +src/data/users.json \ No newline at end of file From 269d22a7bcafae9bc2d1b09983d5a8636280a5ad Mon Sep 17 00:00:00 2001 From: Hotsuop <130086894+hotsu0p@users.noreply.github.com> Date: Sun, 31 Dec 2023 13:16:04 -0600 Subject: [PATCH 41/70] =?UTF-8?q?=E2=9C=A8commands=20page?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/dashboard/dashboard.js | 4 +- src/dashboard/templates/commands.ejs | 107 +++++++++++++++++++++++++++ 2 files changed, 109 insertions(+), 2 deletions(-) create mode 100644 src/dashboard/templates/commands.ejs diff --git a/src/dashboard/dashboard.js b/src/dashboard/dashboard.js index 72fdde9..7820e8e 100644 --- a/src/dashboard/dashboard.js +++ b/src/dashboard/dashboard.js @@ -282,9 +282,9 @@ module.exports = async (client) => { } ); - // Features list redirect endpoint. + // commands app.get("/commands", (req, res) => { - res.send("This feature is not yet available."); + renderTemplate(res, req, "commands.ejs"); // made comamnds page work }); app.get("/color", (req, res) => { diff --git a/src/dashboard/templates/commands.ejs b/src/dashboard/templates/commands.ejs new file mode 100644 index 0000000..fa53b92 --- /dev/null +++ b/src/dashboard/templates/commands.ejs @@ -0,0 +1,107 @@ +<%- include("partials/head", { bot, user, path, title: "Pogy - Commands" }) %> + +
+

List of Commands

+ + +
+
+
p!help
+
Display list of available commands
+
+
+
p!kick @user
+
Kick a user from the server
+
+
+
p!ban @user
+
Ban a user from the server
+
+ +
+ + +
+

Select a Server to Go to the Dashboard

+
+ <% user.guilds.forEach(guild => { %> + <% if (!bot.guilds.cache.get(guild.id)) { return } %> + <% if (guild.icon) { + iconurl = "https://cdn.discordapp.com/icons/" + guild.id + "/" + guild.icon + ".png??size=512"; + } else { + iconurl = "https://cdn.glitch.com/82fe990a-7942-42e3-9790-39807ccdb9f6%2Ficon-404-dark.png?v=1602427904949"; + } %> + + <%= guild.name %> +

<%= guild.name %>

+
+ <% }); %> +
+
+ + <%- include("partials/footer") %> +
+ + +/*Page coded by hotsuop + +please leave credit*/ \ No newline at end of file From eb632e5fc0d420626db6548939672fd5b6131d74 Mon Sep 17 00:00:00 2001 From: Hotsuop <130086894+hotsu0p@users.noreply.github.com> Date: Sun, 31 Dec 2023 16:56:30 -0600 Subject: [PATCH 42/70] removed somethings --- src/dashboard/templates/commands.ejs | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/src/dashboard/templates/commands.ejs b/src/dashboard/templates/commands.ejs index fa53b92..13d8fef 100644 --- a/src/dashboard/templates/commands.ejs +++ b/src/dashboard/templates/commands.ejs @@ -99,9 +99,4 @@ <%- include("partials/footer") %> - - - -/*Page coded by hotsuop - -please leave credit*/ \ No newline at end of file + \ No newline at end of file From 21a2247c3db66f15dbef7d71b6cd3a4f6f840ea5 Mon Sep 17 00:00:00 2001 From: hotsu0p Date: Sun, 24 Dec 2023 12:33:29 -0600 Subject: [PATCH 43/70] few things sad --- .gitignore | 6 +- index.js | 30 ++++++ package-lock.json | 110 +++++++++++++------- package.json | 1 + src/assets/images/poggy.png | Bin 0 -> 1259 bytes src/assets/images/poggyavatar.png | Bin 0 -> 799 bytes src/commands/images/say.js | 59 +++++++++++ src/commands/utility/rank.js | 75 +++++++++++++ src/dashboard/templates/new/mainmembers.ejs | 2 +- src/slash/help.js | 2 +- src/slash/kick.js | 64 ++++++++++++ 11 files changed, 311 insertions(+), 38 deletions(-) create mode 100755 src/assets/images/poggy.png create mode 100755 src/assets/images/poggyavatar.png create mode 100644 src/commands/images/say.js create mode 100644 src/commands/utility/rank.js create mode 100644 src/slash/kick.js diff --git a/.gitignore b/.gitignore index 89dbfd2..8354caa 100644 --- a/.gitignore +++ b/.gitignore @@ -4,4 +4,8 @@ config.json node_modules .env package-lock.json -src/data/users.json \ No newline at end of file +<<<<<<< HEAD +src/data/users.json +======= +src/data/users.json +>>>>>>> 085f538 (few things) diff --git a/index.js b/index.js index a1684b9..d3912c5 100644 --- a/index.js +++ b/index.js @@ -13,7 +13,37 @@ Pogy.emoji = emoji; let client = Pogy; const jointocreate = require("./src/structures/jointocreate"); jointocreate(client); +const fs = require('fs'); +// Load user data from the JSON file +let userData = require('./src/data/users.json'); + +client.on('messageCreate', message => { + if (message.author.bot) return; + + const userId = message.author.id; + if (!userData.users[userId]) { + userData.users[userId] = { + xp: 0, + level: 1 + }; + } + + // Increment XP for the user + userData.users[userId].xp += 1; + + // Check for level-up logic + const xpNeededForNextLevel = userData.users[userId].level * 75; + if (userData.users[userId].xp >= xpNeededForNextLevel) { + userData.users[userId].level += 1; + message.channel.send(`${message.author.username} has leveled up to level ${userData.users[userId].level}!`); + } + + // Save updated data back to the JSON file + fs.writeFile('./src/data/users.json', JSON.stringify(userData, null, 2), err => { + if (err) console.error('Error writing file:', err); + }); +}); Pogy.react = new Map(); Pogy.fetchforguild = new Map(); diff --git a/package-lock.json b/package-lock.json index 5532898..5d0e087 100644 --- a/package-lock.json +++ b/package-lock.json @@ -19,6 +19,7 @@ "crypto": "^1.0.1", "datadog-metrics": "^0.8.2", "date-and-time": "^0.14.2", + "discord-canvas": "^1.5.2", "discord-slash-command-handler": "^3.2.3", "discord.js": "^13.6.0", "dotenv": "^16.0.1", @@ -992,22 +993,14 @@ "url": "https://paypal.me/devsnowflake" } }, - "node_modules/canvacord/node_modules/moment": { - "version": "2.29.1", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz", - "integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==", - "engines": { - "node": "*" - } - }, "node_modules/canvas": { - "version": "2.9.3", - "resolved": "https://registry.npmjs.org/canvas/-/canvas-2.9.3.tgz", - "integrity": "sha512-WOUM7ghii5TV2rbhaZkh1youv/vW1/Canev6Yx6BG2W+1S07w8jKZqKkPnbiPpQEDsnJdN8ouDd7OvQEGXDcUw==", + "version": "2.11.2", + "resolved": "https://registry.npmjs.org/canvas/-/canvas-2.11.2.tgz", + "integrity": "sha512-ItanGBMrmRV7Py2Z+Xhs7cT+FNt5K0vPL4p9EZ/UX/Mu7hFbkxSjKF2KVtPwX7UYWp7dRKnrTvReflgrItJbdw==", "hasInstallScript": true, "dependencies": { "@mapbox/node-pre-gyp": "^1.0.0", - "nan": "^2.15.0", + "nan": "^2.17.0", "simple-get": "^3.0.3" }, "engines": { @@ -1642,6 +1635,17 @@ "node": ">=12" } }, + "node_modules/discord-canvas": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/discord-canvas/-/discord-canvas-1.5.2.tgz", + "integrity": "sha512-P3uRPOAMbLUv8717f0Zo8QLnNsg18p5xmTGlbQk9rhtQuoB4OFvoH37zjyIgOLMbj8qvaxFhpmEHK+O9swGApA==", + "dependencies": { + "canvas": "^2.10.1", + "fortnite": "^4.3.2", + "fortnite-9812": "^1.0.4", + "moment": "^2.29.4" + } + }, "node_modules/discord-slash-command-handler": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/discord-slash-command-handler/-/discord-slash-command-handler-3.2.3.tgz", @@ -2430,6 +2434,22 @@ "url": "https://ko-fi.com/tunnckoCore/commissions" } }, + "node_modules/fortnite": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/fortnite/-/fortnite-4.3.2.tgz", + "integrity": "sha512-6BReElBAwP/3Gq6zEBn9gdQzrzWpMlumY9IF0suZgDshbzsS8dCDuV8JszDl1l1PVJwtzm2uexfUo9YtUqUV6Q==", + "dependencies": { + "node-fetch": "^2.3.0" + } + }, + "node_modules/fortnite-9812": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/fortnite-9812/-/fortnite-9812-1.0.4.tgz", + "integrity": "sha512-TkdbPT1oTQ/GncnC5Sf4dVo6CLo4NJAtiU17rOUetcZ59nLAgNhceNkSqgMCYdYx6gCEB1A/9pYzm/JKOmgRcA==", + "dependencies": { + "node-fetch": "^2.3.0" + } + }, "node_modules/forwarded": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", @@ -3611,9 +3631,9 @@ } }, "node_modules/moment": { - "version": "2.27.0", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.27.0.tgz", - "integrity": "sha512-al0MUK7cpIcglMv3YF13qSgdAIqxHTO7brRtaz3DlSULbqfazqkc5kEjNrLDOM7fsjshoFIihnU8snrP7zUvhQ==", + "version": "2.29.4", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", + "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==", "engines": { "node": "*" } @@ -3792,9 +3812,9 @@ "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==" }, "node_modules/nan": { - "version": "2.16.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.16.0.tgz", - "integrity": "sha512-UdAqHyFngu7TfQKsCBgAA6pWDkT8MAO7d0jyOecVhN5354xbLqdn8mV9Tat9gepAupm0bt2DbeaSC8vS52MuFA==" + "version": "2.18.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.18.0.tgz", + "integrity": "sha512-W7tfG7vMOGtD30sHoZSSc/JVYiyDPEyQVso/Zz+/uQd0B0L46gtC+pHha5FFMRpil6fm/AoEcRWyOVi4+E/f8w==" }, "node_modules/natural-compare": { "version": "1.4.0", @@ -7043,22 +7063,15 @@ "moment": "^2.29.0", "moment-duration-format": "^2.3.2", "node-canvas-with-twemoji-and-discord-emoji": "^1.1.4" - }, - "dependencies": { - "moment": { - "version": "2.29.1", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz", - "integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==" - } } }, "canvas": { - "version": "2.9.3", - "resolved": "https://registry.npmjs.org/canvas/-/canvas-2.9.3.tgz", - "integrity": "sha512-WOUM7ghii5TV2rbhaZkh1youv/vW1/Canev6Yx6BG2W+1S07w8jKZqKkPnbiPpQEDsnJdN8ouDd7OvQEGXDcUw==", + "version": "2.11.2", + "resolved": "https://registry.npmjs.org/canvas/-/canvas-2.11.2.tgz", + "integrity": "sha512-ItanGBMrmRV7Py2Z+Xhs7cT+FNt5K0vPL4p9EZ/UX/Mu7hFbkxSjKF2KVtPwX7UYWp7dRKnrTvReflgrItJbdw==", "requires": { "@mapbox/node-pre-gyp": "^1.0.0", - "nan": "^2.15.0", + "nan": "^2.17.0", "simple-get": "^3.0.3" } }, @@ -7562,6 +7575,17 @@ "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.26.1.tgz", "integrity": "sha512-T5PdMQ+Y1MEECYMV5wmyi9VEYPagEDEi4S0amgsszpWY0VB9JJ/hEvM6BgLhbdnKky4gfmZEXtEEtojN8ZKJQQ==" }, + "discord-canvas": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/discord-canvas/-/discord-canvas-1.5.2.tgz", + "integrity": "sha512-P3uRPOAMbLUv8717f0Zo8QLnNsg18p5xmTGlbQk9rhtQuoB4OFvoH37zjyIgOLMbj8qvaxFhpmEHK+O9swGApA==", + "requires": { + "canvas": "^2.10.1", + "fortnite": "^4.3.2", + "fortnite-9812": "^1.0.4", + "moment": "^2.29.4" + } + }, "discord-slash-command-handler": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/discord-slash-command-handler/-/discord-slash-command-handler-3.2.3.tgz", @@ -8180,6 +8204,22 @@ "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.2.tgz", "integrity": "sha512-V8gLm+41I/8kguQ4/o1D3RIHRmhYFG4pnNyonvua+40rqcEmT4+V71yaZ3B457xbbgCsCfjSPi65u/W6vK1U5Q==" }, + "fortnite": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/fortnite/-/fortnite-4.3.2.tgz", + "integrity": "sha512-6BReElBAwP/3Gq6zEBn9gdQzrzWpMlumY9IF0suZgDshbzsS8dCDuV8JszDl1l1PVJwtzm2uexfUo9YtUqUV6Q==", + "requires": { + "node-fetch": "^2.3.0" + } + }, + "fortnite-9812": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/fortnite-9812/-/fortnite-9812-1.0.4.tgz", + "integrity": "sha512-TkdbPT1oTQ/GncnC5Sf4dVo6CLo4NJAtiU17rOUetcZ59nLAgNhceNkSqgMCYdYx6gCEB1A/9pYzm/JKOmgRcA==", + "requires": { + "node-fetch": "^2.3.0" + } + }, "forwarded": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", @@ -9093,9 +9133,9 @@ } }, "moment": { - "version": "2.27.0", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.27.0.tgz", - "integrity": "sha512-al0MUK7cpIcglMv3YF13qSgdAIqxHTO7brRtaz3DlSULbqfazqkc5kEjNrLDOM7fsjshoFIihnU8snrP7zUvhQ==" + "version": "2.29.4", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", + "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==" }, "moment-duration-format": { "version": "2.3.2", @@ -9226,9 +9266,9 @@ "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==" }, "nan": { - "version": "2.16.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.16.0.tgz", - "integrity": "sha512-UdAqHyFngu7TfQKsCBgAA6pWDkT8MAO7d0jyOecVhN5354xbLqdn8mV9Tat9gepAupm0bt2DbeaSC8vS52MuFA==" + "version": "2.18.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.18.0.tgz", + "integrity": "sha512-W7tfG7vMOGtD30sHoZSSc/JVYiyDPEyQVso/Zz+/uQd0B0L46gtC+pHha5FFMRpil6fm/AoEcRWyOVi4+E/f8w==" }, "natural-compare": { "version": "1.4.0", diff --git a/package.json b/package.json index bac2702..4b3849d 100644 --- a/package.json +++ b/package.json @@ -20,6 +20,7 @@ "crypto": "^1.0.1", "datadog-metrics": "^0.8.2", "date-and-time": "^0.14.2", + "discord-canvas": "^1.5.2", "discord-slash-command-handler": "^3.2.3", "discord.js": "^13.6.0", "dotenv": "^16.0.1", diff --git a/src/assets/images/poggy.png b/src/assets/images/poggy.png new file mode 100755 index 0000000000000000000000000000000000000000..2b999c54a70d87f673ecce4e63fdc919618dcea1 GIT binary patch literal 1259 zcmeAS@N?(olHy`uVBq!ia0y~yV4MJCpWt8yk{?gIUjPcQ2Ka=ynrfJuXqcF&o0zJb zTB%sO%DeeX21JQOo2i-EE7^O=dIgJz#tOz~a%bmoJL?!X3WOL=( zDcO0*cm_*^WbkBKs9HM9yZB1`g^NTc@+X_Ao7pPay32Y5Nd(6T#isG5TdG+)DLDH| z`Gt!{B=RR^ap%~o*t*HO2S@})3&*DNrdz04I4U^$Nc)6}g~tmd+9=z&%eehl+*83ntpA*tp8MrSPShtC>3}I);dc#tSB7aA#SmSh>i%`bz~w z0v*YhVy0ncr)=*b>lq{-Y_4kVBkda|8lEVS6e$v&%$J(ZlbIlpRK{c<#lXN^;pyTS zQZeW4?bPBs1|qGA&I=~waA_9bnj#tGVX0~S@BjQuU&XdR-m3EZm6!JZ^G}lPGTup6 zt~Cyu#s~~mN`ON`qP1=tPdX&!p zeA(x0_$%AM*xG#kmTB{}+xk}=i|^Kr-kuvDA;XiYyK?=hSEbtu<8|KN*qQzP(*yIh ztzQGa7GM0sU;XV}^bLE7?Q?)=uqt&I}GRTulV_@^sQyTLyKrz@x2wIZ}#YN967U7R7D`aXYGU8+uz??|K~oJ zPzU?8wF?ddl|{X}2jod4YyU|6`gr+yyX~xve^hR933-@5TC32wCB0&P?scF7>-9jM zh2i!lXLqQtLHYMe-wrcnW1grrG8=f-Q zbH41Kh8C08gNy6ptPOiJb3r!U zbeg_;(#s38%8Yl1eTaUMm>DqZhs(XI7ZOl8>I3x!As!NBevYJz3K8t<_gs;yaL)ayI?lD$zf3RlR$S47=j$L_`~R z>141nOZ7K}8SJo+^Z_f{(o}fTEQ59Nq}DiwV}c$j94baELXu3KJdG}G4oc1n6BQ?% z5b#K;WAHrX%=$EUW-c%b$(FcAlmzFem6RtIr7}3=l;$NCBxdH7=ojRr>n7)?q$YoL RmXrhKHBVPRmvv4FO#s%S>8k($ literal 0 HcmV?d00001 diff --git a/src/assets/images/poggyavatar.png b/src/assets/images/poggyavatar.png new file mode 100755 index 0000000000000000000000000000000000000000..2abfc7873b396d6dac528478192e791bbda365f1 GIT binary patch literal 799 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GXl47-Ir_LR^8|GOr({9zV-Gzn8iH zDD(VT;tArG`+Tdn{|{u8xPJ!<0%c1*e$?0hFAVut3g(u1{3vvLXQo)BCLR!Jz9-A^ zzO_n?tMA7QqNyNEh=K(K=YZI*b{Be*wGg*job_>_RGIrvH=QZ+!j2^#UwjP~3v#O}h&Y=l<`=rXmlm|J zQ*Q>U2{u`u?exe_y~RwasKn!IrsF+(jkXeyM}S@c`2y$+3*|B~UOiD>T@haGVB_^A zp1(wSwME!DoF$|^q-0}FR{$MZ?*9F-tKUiYfGzG-<(}VwCY1UC{rKHWZ;mjJ1|uWm zZYS@3?rHNpmRERwDf9RV3>KiS0@t@yo*&A8%l{hPbBn`QX93X%)lML#5bV3`zm&radN>*I$HpL@VB!V$pGbYQ^)fq54U z*w_^1gd`IiNxYPgg&ebxsLQ0L9j9ApigX literal 0 HcmV?d00001 diff --git a/src/commands/images/say.js b/src/commands/images/say.js new file mode 100644 index 0000000..3b8348f --- /dev/null +++ b/src/commands/images/say.js @@ -0,0 +1,59 @@ +const Command = require("../../structures/Command"); +const { createCanvas, loadImage } = require('canvas'); +const discord = require("discord.js"); + +module.exports = class extends Command { + constructor(...args) { + super(...args, { + name: "say", + description: "Generate an image with the provided text.", + category: "Images", + usage: "", + cooldown: 5, + guildOnly: true, + }); + } + + async run(message, args) { + const client = message.client; + + try { + const text = args.join(" ").trim(); + if (!text) { + return message.channel.send({ + embeds: [ + new discord.MessageEmbed() + .setColor(client.color.red) + .setDescription(`${client.emoji.fail} Please provide some text.`), + ], + }); + } + + // Create canvas + const canvas = createCanvas(400, 200); + const ctx = canvas.getContext('2d'); + + // Set a background color + ctx.fillStyle = '#808080'; // Gray + ctx.fillRect(0, 0, canvas.width, canvas.height); + + // Set text properties + ctx.font = '20px Arial'; + ctx.fillStyle = 'white'; + ctx.textAlign = 'center'; + ctx.textBaseline = 'middle'; + + // Position the text in the center + ctx.fillText(text, canvas.width / 2, canvas.height / 2); + + // Convert the canvas + const attachment = new discord.MessageAttachment(canvas.toBuffer(), 'said_text.png'); + + // Send the generated image + message.channel.send({ files: [attachment] }); + } catch (error) { + console.error("Error occurred:", error); + this.client.emit("apiError", error, message); + } + } +}; diff --git a/src/commands/utility/rank.js b/src/commands/utility/rank.js new file mode 100644 index 0000000..5f2903a --- /dev/null +++ b/src/commands/utility/rank.js @@ -0,0 +1,75 @@ +const Command = require("../../structures/Command"); +const { createCanvas, loadImage } = require('canvas'); +const Discord = require("discord.js"); + +// Calculate the required XP +function calculateRequiredXP(level) { + const baseXP = 100; + const increment = 150; + return baseXP + (level - 1) * increment; +} + +module.exports = class RankCommand extends Command { + constructor(...args) { + super(...args, { + name: "rank", + description: "Display your rank card.", + category: "Images", + cooldown: 5, + guildOnly: true + }); + } + + async run(message, args) { + try { + const userData = require('Path to your data file'); // Load user data + const targetUser = message.mentions.users.first() || message.author; + const user = userData.users[targetUser.id]; + + if (!user) { + return message.reply('User not found.'); + } + + // create canvas + const canvas = createCanvas(900, 250); + const ctx = canvas.getContext('2d'); + + // Background + ctx.fillStyle = '#041526'; + ctx.fillRect(0, 0, canvas.width, canvas.height); + + // Username + ctx.fillStyle = '#FFFFFF'; + ctx.font = 'bold 30px Arial'; + ctx.textAlign = "left"; + ctx.fillText(targetUser.username, 260, 50); + + // Level + ctx.font = 'bold 40px Arial'; + const levelText = `Level ${user.level}`; + const levelTextWidth = ctx.measureText(levelText).width; + ctx.fillText(levelText, canvas.width - levelTextWidth - 220, 50); + + //avatar + const avatar = await loadImage(targetUser.displayAvatarURL({ format: 'png', size: 128 })); + ctx.drawImage(avatar, 50, 50, 150, 150); + + // Progress bar + const requiredXPForCurrentLevel = calculateRequiredXP(user.level); + const requiredXPForNextLevel = calculateRequiredXP(user.level + 1); + const progressBarWidth = 600; + const progressWidth = ((user.xp - requiredXPForCurrentLevel) / (requiredXPForNextLevel - requiredXPForCurrentLevel)) * progressBarWidth; + ctx.fillStyle = "#00FF00"; + ctx.fillRect(260, 220, progressWidth, 15); + + // Save the canvas + const attachment = new Discord.MessageAttachment(canvas.toBuffer(), 'rank.png'); + + // send the image + message.channel.send({ files: [attachment] }); + } catch (error) { + console.error("Error occurred:", error); + message.reply('An error occurred while generating the rank card.'); + } + } +}; diff --git a/src/dashboard/templates/new/mainmembers.ejs b/src/dashboard/templates/new/mainmembers.ejs index ef197ff..87341b8 100644 --- a/src/dashboard/templates/new/mainmembers.ejs +++ b/src/dashboard/templates/new/mainmembers.ejs @@ -79,7 +79,7 @@
diff --git a/src/slash/help.js b/src/slash/help.js index ab69812..a50efaf 100644 --- a/src/slash/help.js +++ b/src/slash/help.js @@ -7,7 +7,7 @@ module.exports = { error: async () => {}, run: async (data) => { data.interaction.editReply({ - content: `We are still working on our slash commands, come back later!!`, + content: `We are still working on our slash commands, come back later!!\n said peter 16 months ago`, }); }, }; diff --git a/src/slash/kick.js b/src/slash/kick.js new file mode 100644 index 0000000..9359b19 --- /dev/null +++ b/src/slash/kick.js @@ -0,0 +1,64 @@ +module.exports = { + name: "kick", + description: "Kick a user from the server.", + category: "moderation", + slash: true, + global: true, // Change to true if this is a global slash command + usage: "/kick [user] [reason]", + permissions: ["KICK_MEMBERS"], // Add required permissions here + options: [ + { + name: "user", + description: "Select the user to kick.", + type: "USER", + required: true, + }, + { + name: "reason", + description: "Reason for the kick (optional)", + type: "STRING", + required: false, + }, + ], + + run: async (data) => { + try { + // Check if the user has permission to use this command + if (!data.member.permissions.has("KICK_MEMBERS")) { + return await data.interaction.reply({ + content: "You don't have permission to use this command.", + ephemeral: true, + }); + } + + const user = data.options.getMember("user"); + const reason = data.options.getString("reason") || "No reason provided"; + + // Check if a user was mentioned + if (!user) { + return await data.interaction.reply({ + content: "Please select a user to kick.", + ephemeral: true, + }); + } + + // Kick the mentioned user + await user.kick(reason); + + // Check if the interaction is already replied or deferred + if (data.interaction.deferred || data.interaction.replied) { + console.log("Interaction has already been replied to."); + } else { + await data.interaction.reply({ + content: `Successfully kicked ${user.user.tag} for ${reason}.`, + }); + } + } catch (error) { + console.error(error); + await data.interaction.reply({ + content: "An error occurred while processing the command.", + ephemeral: true, + }); + } + }, +}; From 967766f558437a1496ae7308324fb87fe8a4d641 Mon Sep 17 00:00:00 2001 From: hotsu0p Date: Sun, 31 Dec 2023 11:44:19 -0600 Subject: [PATCH 44/70] Addded new page and yea --- src/commands/utility/rank.js | 4 +- src/dashboard/templates/commands.ejs | 112 ++++++++++++++++++++++++++- src/data/config.js | 2 +- 3 files changed, 114 insertions(+), 4 deletions(-) diff --git a/src/commands/utility/rank.js b/src/commands/utility/rank.js index 5f2903a..c64a06d 100644 --- a/src/commands/utility/rank.js +++ b/src/commands/utility/rank.js @@ -22,7 +22,7 @@ module.exports = class RankCommand extends Command { async run(message, args) { try { - const userData = require('Path to your data file'); // Load user data + const userData = require('replace with real users.json file'); // Load user data const targetUser = message.mentions.users.first() || message.author; const user = userData.users[targetUser.id]; @@ -42,7 +42,7 @@ module.exports = class RankCommand extends Command { ctx.fillStyle = '#FFFFFF'; ctx.font = 'bold 30px Arial'; ctx.textAlign = "left"; - ctx.fillText(targetUser.username, 260, 50); + ctx.fillText(targetUser.username, 260, 100); // Level ctx.font = 'bold 40px Arial'; diff --git a/src/dashboard/templates/commands.ejs b/src/dashboard/templates/commands.ejs index 13d8fef..635c495 100644 --- a/src/dashboard/templates/commands.ejs +++ b/src/dashboard/templates/commands.ejs @@ -1,3 +1,4 @@ +<<<<<<< HEAD <%- include("partials/head", { bot, user, path, title: "Pogy - Commands" }) %> +
+

List of Commands

+ + +
+
+
p!help
+
Display list of available commands
+
+
+
p!kick @user
+
Kick a user from the server
+
+
+
p!ban @user
+
Ban a user from the server
+
+ +
+ + +
+

Select a Server to Go to the Dashboard

+
+ <% user.guilds.forEach(guild => { %> + <% if (!bot.guilds.cache.get(guild.id)) { return } %> + <% if (guild.icon) { + iconurl = "https://cdn.discordapp.com/icons/" + guild.id + "/" + guild.icon + ".png??size=512"; + } else { + iconurl = "https://cdn.glitch.com/82fe990a-7942-42e3-9790-39807ccdb9f6%2Ficon-404-dark.png?v=1602427904949"; + } %> + + <%= guild.name %> +

<%= guild.name %>

+
+ <% }); %> +
+
+ + <%- include("partials/footer") %> +
+ + +// Page coded by hotsuop. + +// please leave credit. +>>>>>>> 96d0b84 (Addded new page and yea) diff --git a/src/data/config.js b/src/data/config.js index 1a2d5f1..db38f07 100644 --- a/src/data/config.js +++ b/src/data/config.js @@ -1,4 +1,4 @@ module.exports = { prefix: "!", - owners: ["402490971041824768"], + owners: ["969655699154042940"], }; From 6f9a28a63a91296f3e062e6ebce10241724208d6 Mon Sep 17 00:00:00 2001 From: Replit user <> Date: Wed, 3 Jan 2024 02:46:38 +0000 Subject: [PATCH 45/70] minor update --- .replit | 7 +- config.json.template | 35 -- index.js | 5 +- package-lock.json | 490 +++++++++++++++++++--- package.json | 20 +- replit.nix | 8 + src/commands/information/news.js | 2 +- src/commands/owner/setNews.js | 2 +- src/data/emoji.js | 4 +- src/database/schemas/{Pogy.js => MEE8.js} | 0 src/deployCommands.js | 10 +- src/events/ready.js | 9 +- src/slash/help.js | 13 - src/slash/ping.js | 15 - src/slashCommands/moderation/addrole.js | 177 +++----- src/slashCommands/moderation/clear.js | 19 +- src/slashCommands/moderation/warnpurge.js | 2 +- src/utils/utils.js | 16 + 18 files changed, 559 insertions(+), 275 deletions(-) delete mode 100644 config.json.template create mode 100644 replit.nix rename src/database/schemas/{Pogy.js => MEE8.js} (100%) delete mode 100644 src/slash/help.js delete mode 100644 src/slash/ping.js diff --git a/.replit b/.replit index d409ef8..df21e34 100644 --- a/.replit +++ b/.replit @@ -1,2 +1,7 @@ language = "nodejs" -run = "npm start" \ No newline at end of file +run = "npm start" + +hidden = [".config", "package-lock.json"] + +[nix] +channel = "stable-22_11" \ No newline at end of file diff --git a/config.json.template b/config.json.template deleted file mode 100644 index 251d0ca..0000000 --- a/config.json.template +++ /dev/null @@ -1,35 +0,0 @@ -{ - "clientId": "", - "developers": [], - "status": "p!help | pogy.xyz", - "discord": "", - "dashboard": "true", - "server": "", - "prefix": "p!", - "webhooks": { - "logs": "", - "maintenance_logs": "", - "ratelimit_logs": "", - "blacklist": "", - "report": "", - "contact": "", - "bugs": "", - "premium": "", - "suggestions": "", - "votes": "", - "errors": "", - "auth": "", - "joinsPublic": "", - "joinsPrivate": "", - "leavesPublic": "", - "leavesPrivate": "" - }, - "maintenance": "true", - "maintenance_threshold": "3", - "invite_link": "", - "seo": { - "enabled": "false", - "title": "", - "description": "" - } -} diff --git a/index.js b/index.js index 9c1bb1a..2a15367 100644 --- a/index.js +++ b/index.js @@ -6,7 +6,6 @@ const path = require("node:path"); const { Collection } = require("discord.js"); const logger = require("./src/utils/logger"); const fs = require("node:fs"); -const path = require("node:path"); const Pogy = new PogyClient(config); const color = require("./src/data/colors"); @@ -20,7 +19,7 @@ const jointocreate = require("./src/structures/jointocreate"); jointocreate(client); client.slashCommands = new Collection(); -const commandsFolders = fs.readdirSync("/src/slashCommands"); +const commandsFolders = fs.readdirSync("./src/slashCommands"); for (const folder of commandsFolders) { const commandFiles = fs.readdirSync(`./src/slashCommands/${folder}`).filter((file) => file.endsWith(".js")); @@ -28,7 +27,7 @@ for (const folder of commandsFolders) { for(const file of commandFiles) { const slashCommand = require(`./src/slashCommands/${folder}/${file}`); client.slashCommands.set(slashCommand.data.name, slashCommand); - Promise.resolve(command); + Promise.resolve(slashCommand); } } diff --git a/package-lock.json b/package-lock.json index 5532898..acc52e6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,16 +9,21 @@ "version": "1.0.0", "license": "ISC", "dependencies": { + "@discordjs/builders": "^0.3.0", + "@discordjs/rest": "^0.3.0", "@top-gg/sdk": "^3.0.8", + "axios": "^1.5.0", "body-parser": "^1.19.0", "canvacord": "^5.0.8", - "canvas": "^2.9.3", + "canvas": "^2.11.2", "chalk": "^4.1.0", + "colors": "^1.4.0", "common-tags": "^1.8.0", "connect-mongo": "^4.4.1", "crypto": "^1.0.1", "datadog-metrics": "^0.8.2", "date-and-time": "^0.14.2", + "discord-api-types": "^0.37.11", "discord-slash-command-handler": "^3.2.3", "discord.js": "^13.6.0", "dotenv": "^16.0.1", @@ -58,7 +63,8 @@ }, "devDependencies": { "eslint": "^7.6.0", - "eslint-config-tesseract": "^0.0.3" + "eslint-config-tesseract": "^0.0.3", + "node": "^16.9.0" } }, "node_modules/@babel/code-frame": { @@ -117,22 +123,124 @@ } }, "node_modules/@discordjs/builders": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-0.11.0.tgz", - "integrity": "sha512-ZTB8yJdJKrKlq44dpWkNUrAtEJEq0gqpb7ASdv4vmq6/mZal5kOv312hQ56I/vxwMre+VIkoHquNUAfnTbiYtg==", + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-0.3.0.tgz", + "integrity": "sha512-yFBPqohVAtCWoDTQCYk5ubgmkiRbGpbiR4RfYGHCmV5S2YZc7j8WzfKVksjuy2o5IWRfXFsW6G2Lr+KpW41pEA==", "deprecated": "no longer supported", "dependencies": { - "@sindresorhus/is": "^4.2.0", - "discord-api-types": "^0.26.0", - "ts-mixer": "^6.0.0", - "tslib": "^2.3.1", - "zod": "^3.11.6" + "@sindresorhus/is": "^4.0.1", + "discord-api-types": "^0.22.0", + "ow": "^0.26.0", + "ts-mixer": "^5.4.1", + "tslib": "^2.3.0" + }, + "engines": { + "node": ">=14.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/@discordjs/builders/node_modules/discord-api-types": { + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.22.0.tgz", + "integrity": "sha512-l8yD/2zRbZItUQpy7ZxBJwaLX/Bs2TGaCthRppk8Sw24LOIWg12t9JEreezPoYD0SQcC2htNNo27kYEpYW/Srg==", + "deprecated": "No longer supported. Install the latest release!", + "engines": { + "node": ">=12" + } + }, + "node_modules/@discordjs/builders/node_modules/dot-prop": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz", + "integrity": "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==", + "dependencies": { + "is-obj": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@discordjs/builders/node_modules/ow": { + "version": "0.26.0", + "resolved": "https://registry.npmjs.org/ow/-/ow-0.26.0.tgz", + "integrity": "sha512-22YUQW9d6oUSCpIQuBV25djtC1uMtpWqmtUYnuh2UHWeNMpppCFCvq3eSBIWWMDbe2UVq26kWYvBHDzOIu5NYg==", + "dependencies": { + "@sindresorhus/is": "^4.0.1", + "callsites": "^3.1.0", + "dot-prop": "^6.0.1", + "lodash.isequal": "^4.5.0", + "type-fest": "^1.2.1", + "vali-date": "^1.0.0" }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@discordjs/builders/node_modules/type-fest": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", + "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@discordjs/collection": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-0.4.0.tgz", + "integrity": "sha512-zmjq+l/rV35kE6zRrwe8BHqV78JvIh2ybJeZavBi5NySjWXqN3hmmAKg7kYMMXSeiWtSsMoZ/+MQi0DiQWy2lw==", + "deprecated": "no longer supported", "engines": { "node": ">=16.0.0", "npm": ">=7.0.0" } }, + "node_modules/@discordjs/rest": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@discordjs/rest/-/rest-0.3.0.tgz", + "integrity": "sha512-F9aeP3odlAlllM1ciBZLdd+adiAyBj4VaZBejj4UMj4afE2wfCkNTGvYYiRxrXUE9fN7e/BuDP2ePl0tVA2m7Q==", + "deprecated": "no longer supported", + "dependencies": { + "@discordjs/collection": "^0.4.0", + "@sapphire/async-queue": "^1.1.9", + "@sapphire/snowflake": "^3.0.1", + "discord-api-types": "^0.26.1", + "form-data": "^4.0.0", + "node-fetch": "^2.6.5", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=16.9.0" + } + }, + "node_modules/@discordjs/rest/node_modules/discord-api-types": { + "version": "0.26.1", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.26.1.tgz", + "integrity": "sha512-T5PdMQ+Y1MEECYMV5wmyi9VEYPagEDEi4S0amgsszpWY0VB9JJ/hEvM6BgLhbdnKky4gfmZEXtEEtojN8ZKJQQ==", + "engines": { + "node": ">=12" + } + }, + "node_modules/@discordjs/rest/node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/@mapbox/node-pre-gyp": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.9.tgz", @@ -189,6 +297,15 @@ "npm": ">=7.0.0" } }, + "node_modules/@sapphire/snowflake": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/@sapphire/snowflake/-/snowflake-3.5.1.tgz", + "integrity": "sha512-BxcYGzgEsdlG0dKAyOm0ehLGm2CafIrfQTZGWgkfKYbj+pNNsorZ7EotuZukc2MT70E0UbppVbtpBrqpzVzjNA==", + "engines": { + "node": ">=v14.0.0", + "npm": ">=7.0.0" + } + }, "node_modules/@sindresorhus/is": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", @@ -609,6 +726,29 @@ "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.10.0.tgz", "integrity": "sha512-3YDiu347mtVtjpyV3u5kVqQLP242c06zwDOgpeRnybmXlYYsLbtTrUBUm8i8srONt+FWobl5aibnU1030PeeuA==" }, + "node_modules/axios": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.5.0.tgz", + "integrity": "sha512-D4DdjDo5CY50Qms0qGQTTw6Q44jl7zRwY7bthds06pUGfChBCTcQs+N743eFWGEd6pRTMd6A+I87aWyFV5wiZQ==", + "dependencies": { + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/axios/node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/babel-runtime": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", @@ -962,7 +1102,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, "engines": { "node": ">=6" } @@ -1001,13 +1140,13 @@ } }, "node_modules/canvas": { - "version": "2.9.3", - "resolved": "https://registry.npmjs.org/canvas/-/canvas-2.9.3.tgz", - "integrity": "sha512-WOUM7ghii5TV2rbhaZkh1youv/vW1/Canev6Yx6BG2W+1S07w8jKZqKkPnbiPpQEDsnJdN8ouDd7OvQEGXDcUw==", + "version": "2.11.2", + "resolved": "https://registry.npmjs.org/canvas/-/canvas-2.11.2.tgz", + "integrity": "sha512-ItanGBMrmRV7Py2Z+Xhs7cT+FNt5K0vPL4p9EZ/UX/Mu7hFbkxSjKF2KVtPwX7UYWp7dRKnrTvReflgrItJbdw==", "hasInstallScript": true, "dependencies": { "@mapbox/node-pre-gyp": "^1.0.0", - "nan": "^2.15.0", + "nan": "^2.17.0", "simple-get": "^3.0.3" }, "engines": { @@ -1635,12 +1774,9 @@ } }, "node_modules/discord-api-types": { - "version": "0.26.1", - "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.26.1.tgz", - "integrity": "sha512-T5PdMQ+Y1MEECYMV5wmyi9VEYPagEDEi4S0amgsszpWY0VB9JJ/hEvM6BgLhbdnKky4gfmZEXtEEtojN8ZKJQQ==", - "engines": { - "node": ">=12" - } + "version": "0.37.11", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.37.11.tgz", + "integrity": "sha512-cUNXrCdD4hEj5iJ9SligTNur64rNnLX5s6CbvmatRpWKMZtrLTOlyLhuXmVbjfDXeXH7os8Qb71Wa7IEhC27Sw==" }, "node_modules/discord-slash-command-handler": { "version": "3.2.3", @@ -1764,16 +1900,31 @@ "npm": ">=7.0.0" } }, - "node_modules/discord.js/node_modules/@discordjs/collection": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-0.4.0.tgz", - "integrity": "sha512-zmjq+l/rV35kE6zRrwe8BHqV78JvIh2ybJeZavBi5NySjWXqN3hmmAKg7kYMMXSeiWtSsMoZ/+MQi0DiQWy2lw==", + "node_modules/discord.js/node_modules/@discordjs/builders": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-0.11.0.tgz", + "integrity": "sha512-ZTB8yJdJKrKlq44dpWkNUrAtEJEq0gqpb7ASdv4vmq6/mZal5kOv312hQ56I/vxwMre+VIkoHquNUAfnTbiYtg==", "deprecated": "no longer supported", + "dependencies": { + "@sindresorhus/is": "^4.2.0", + "discord-api-types": "^0.26.0", + "ts-mixer": "^6.0.0", + "tslib": "^2.3.1", + "zod": "^3.11.6" + }, "engines": { "node": ">=16.0.0", "npm": ">=7.0.0" } }, + "node_modules/discord.js/node_modules/discord-api-types": { + "version": "0.26.1", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.26.1.tgz", + "integrity": "sha512-T5PdMQ+Y1MEECYMV5wmyi9VEYPagEDEi4S0amgsszpWY0VB9JJ/hEvM6BgLhbdnKky4gfmZEXtEEtojN8ZKJQQ==", + "engines": { + "node": ">=12" + } + }, "node_modules/discord.js/node_modules/form-data": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", @@ -1787,6 +1938,11 @@ "node": ">= 6" } }, + "node_modules/discord.js/node_modules/ts-mixer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/ts-mixer/-/ts-mixer-6.0.3.tgz", + "integrity": "sha512-k43M7uCG1AkTyxgnmI5MPwKoUvS/bRvLvUb7+Pgpdlmok8AoqmUaZxUUw8zKM5B1lqZrt41GjYgnvAi0fppqgQ==" + }, "node_modules/discord.js/node_modules/ws": { "version": "8.8.1", "resolved": "https://registry.npmjs.org/ws/-/ws-8.8.1.tgz", @@ -2400,6 +2556,25 @@ "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==" }, + "node_modules/follow-redirects": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, "node_modules/forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", @@ -3342,6 +3517,11 @@ "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=" }, + "node_modules/lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==" + }, "node_modules/lodash.isplainobject": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", @@ -3792,9 +3972,9 @@ "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==" }, "node_modules/nan": { - "version": "2.16.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.16.0.tgz", - "integrity": "sha512-UdAqHyFngu7TfQKsCBgAA6pWDkT8MAO7d0jyOecVhN5354xbLqdn8mV9Tat9gepAupm0bt2DbeaSC8vS52MuFA==" + "version": "2.17.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.17.0.tgz", + "integrity": "sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==" }, "node_modules/natural-compare": { "version": "1.4.0", @@ -3810,6 +3990,28 @@ "node": ">= 0.6" } }, + "node_modules/node": { + "version": "16.9.0", + "resolved": "https://registry.npmjs.org/node/-/node-16.9.0.tgz", + "integrity": "sha512-a7+cnQtCKnb7d/OfEF1x6OmwDkrueCIPVootf/waqVmIbYzpcIGgFriXHfaRlKRYS2ueZQurG4KQyitbDerEfA==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "node-bin-setup": "^1.0.0" + }, + "bin": { + "node": "bin/node" + }, + "engines": { + "npm": ">=5.0.0" + } + }, + "node_modules/node-bin-setup": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/node-bin-setup/-/node-bin-setup-1.1.3.tgz", + "integrity": "sha512-opgw9iSCAzT2+6wJOETCpeRYAQxSopqQ2z+N6BXwIMsQQ7Zj5M8MaafQY8JMlolRR6R1UXg2WmhKp0p9lSOivg==", + "dev": true + }, "node_modules/node-canvas-with-twemoji-and-discord-emoji": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/node-canvas-with-twemoji-and-discord-emoji/-/node-canvas-with-twemoji-and-discord-emoji-1.1.4.tgz", @@ -4473,6 +4675,11 @@ "node": ">= 0.10" } }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, "node_modules/pseudomap": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", @@ -5689,9 +5896,9 @@ "integrity": "sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw==" }, "node_modules/ts-mixer": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ts-mixer/-/ts-mixer-6.0.1.tgz", - "integrity": "sha512-hvE+ZYXuINrx6Ei6D6hz+PTim0Uf++dYbK9FFifLNwQj+RwKquhQpn868yZsCtJYiclZF1u8l6WZxxKi+vv7Rg==" + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ts-mixer/-/ts-mixer-5.4.1.tgz", + "integrity": "sha512-Zo9HgPCtNouDgJ+LGtrzVOjSg8+7WGQktIKLwAfaNrlOK1mWGlz1ejsAF/YqUEqAGjUTeB5fEg8gH9Aui6w9xA==" }, "node_modules/tslib": { "version": "2.4.0", @@ -5952,6 +6159,14 @@ "integrity": "sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ==", "dev": true }, + "node_modules/vali-date": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/vali-date/-/vali-date-1.0.0.tgz", + "integrity": "sha512-sgECfZthyaCKW10N0fm27cg8HYTFK5qMWgypqkXMQ4Wbl/zZKx7xZICgcoxIIE+WFAP/MBL2EFwC/YvLxw3Zeg==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", @@ -6284,9 +6499,9 @@ } }, "node_modules/zod": { - "version": "3.18.0", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.18.0.tgz", - "integrity": "sha512-gwTm8RfUCe8l9rDwN5r2A17DkAa8Ez4Yl4yXqc5VqeGaXaJahzYYXbTwvhroZi0SNBqTwh/bKm2N0mpCzuw4bA==", + "version": "3.22.2", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.22.2.tgz", + "integrity": "sha512-wvWkphh5WQsJbVk1tbx1l1Ly4yg+XecD+Mq280uBGt9wa5BKSWf4Mhp6GmrkPixhMxmabYY7RbzlwVP32pbGCg==", "funding": { "url": "https://github.com/sponsors/colinhacks" } @@ -6348,15 +6563,84 @@ } }, "@discordjs/builders": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-0.11.0.tgz", - "integrity": "sha512-ZTB8yJdJKrKlq44dpWkNUrAtEJEq0gqpb7ASdv4vmq6/mZal5kOv312hQ56I/vxwMre+VIkoHquNUAfnTbiYtg==", + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-0.3.0.tgz", + "integrity": "sha512-yFBPqohVAtCWoDTQCYk5ubgmkiRbGpbiR4RfYGHCmV5S2YZc7j8WzfKVksjuy2o5IWRfXFsW6G2Lr+KpW41pEA==", "requires": { - "@sindresorhus/is": "^4.2.0", - "discord-api-types": "^0.26.0", - "ts-mixer": "^6.0.0", - "tslib": "^2.3.1", - "zod": "^3.11.6" + "@sindresorhus/is": "^4.0.1", + "discord-api-types": "^0.22.0", + "ow": "^0.26.0", + "ts-mixer": "^5.4.1", + "tslib": "^2.3.0" + }, + "dependencies": { + "discord-api-types": { + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.22.0.tgz", + "integrity": "sha512-l8yD/2zRbZItUQpy7ZxBJwaLX/Bs2TGaCthRppk8Sw24LOIWg12t9JEreezPoYD0SQcC2htNNo27kYEpYW/Srg==" + }, + "dot-prop": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz", + "integrity": "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==", + "requires": { + "is-obj": "^2.0.0" + } + }, + "ow": { + "version": "0.26.0", + "resolved": "https://registry.npmjs.org/ow/-/ow-0.26.0.tgz", + "integrity": "sha512-22YUQW9d6oUSCpIQuBV25djtC1uMtpWqmtUYnuh2UHWeNMpppCFCvq3eSBIWWMDbe2UVq26kWYvBHDzOIu5NYg==", + "requires": { + "@sindresorhus/is": "^4.0.1", + "callsites": "^3.1.0", + "dot-prop": "^6.0.1", + "lodash.isequal": "^4.5.0", + "type-fest": "^1.2.1", + "vali-date": "^1.0.0" + } + }, + "type-fest": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", + "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==" + } + } + }, + "@discordjs/collection": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-0.4.0.tgz", + "integrity": "sha512-zmjq+l/rV35kE6zRrwe8BHqV78JvIh2ybJeZavBi5NySjWXqN3hmmAKg7kYMMXSeiWtSsMoZ/+MQi0DiQWy2lw==" + }, + "@discordjs/rest": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@discordjs/rest/-/rest-0.3.0.tgz", + "integrity": "sha512-F9aeP3odlAlllM1ciBZLdd+adiAyBj4VaZBejj4UMj4afE2wfCkNTGvYYiRxrXUE9fN7e/BuDP2ePl0tVA2m7Q==", + "requires": { + "@discordjs/collection": "^0.4.0", + "@sapphire/async-queue": "^1.1.9", + "@sapphire/snowflake": "^3.0.1", + "discord-api-types": "^0.26.1", + "form-data": "^4.0.0", + "node-fetch": "^2.6.5", + "tslib": "^2.3.1" + }, + "dependencies": { + "discord-api-types": { + "version": "0.26.1", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.26.1.tgz", + "integrity": "sha512-T5PdMQ+Y1MEECYMV5wmyi9VEYPagEDEi4S0amgsszpWY0VB9JJ/hEvM6BgLhbdnKky4gfmZEXtEEtojN8ZKJQQ==" + }, + "form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + } } }, "@mapbox/node-pre-gyp": { @@ -6398,6 +6682,11 @@ "resolved": "https://registry.npmjs.org/@sapphire/async-queue/-/async-queue-1.4.0.tgz", "integrity": "sha512-1npoLO1YPPXCsWCfuonsSdtHbPUo6dvjWUJtmUHiK8yDTmy00LbkpRkdV/UycA1fh+QsxwOPhgx2zu64Z+19ww==" }, + "@sapphire/snowflake": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/@sapphire/snowflake/-/snowflake-3.5.1.tgz", + "integrity": "sha512-BxcYGzgEsdlG0dKAyOm0ehLGm2CafIrfQTZGWgkfKYbj+pNNsorZ7EotuZukc2MT70E0UbppVbtpBrqpzVzjNA==" + }, "@sindresorhus/is": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", @@ -6760,6 +7049,28 @@ "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.10.0.tgz", "integrity": "sha512-3YDiu347mtVtjpyV3u5kVqQLP242c06zwDOgpeRnybmXlYYsLbtTrUBUm8i8srONt+FWobl5aibnU1030PeeuA==" }, + "axios": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.5.0.tgz", + "integrity": "sha512-D4DdjDo5CY50Qms0qGQTTw6Q44jl7zRwY7bthds06pUGfChBCTcQs+N743eFWGEd6pRTMd6A+I87aWyFV5wiZQ==", + "requires": { + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + }, + "dependencies": { + "form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + } + } + }, "babel-runtime": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", @@ -7024,8 +7335,7 @@ "callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" }, "camelcase": { "version": "5.3.1", @@ -7053,12 +7363,12 @@ } }, "canvas": { - "version": "2.9.3", - "resolved": "https://registry.npmjs.org/canvas/-/canvas-2.9.3.tgz", - "integrity": "sha512-WOUM7ghii5TV2rbhaZkh1youv/vW1/Canev6Yx6BG2W+1S07w8jKZqKkPnbiPpQEDsnJdN8ouDd7OvQEGXDcUw==", + "version": "2.11.2", + "resolved": "https://registry.npmjs.org/canvas/-/canvas-2.11.2.tgz", + "integrity": "sha512-ItanGBMrmRV7Py2Z+Xhs7cT+FNt5K0vPL4p9EZ/UX/Mu7hFbkxSjKF2KVtPwX7UYWp7dRKnrTvReflgrItJbdw==", "requires": { "@mapbox/node-pre-gyp": "^1.0.0", - "nan": "^2.15.0", + "nan": "^2.17.0", "simple-get": "^3.0.3" } }, @@ -7558,9 +7868,9 @@ "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==" }, "discord-api-types": { - "version": "0.26.1", - "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.26.1.tgz", - "integrity": "sha512-T5PdMQ+Y1MEECYMV5wmyi9VEYPagEDEi4S0amgsszpWY0VB9JJ/hEvM6BgLhbdnKky4gfmZEXtEEtojN8ZKJQQ==" + "version": "0.37.11", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.37.11.tgz", + "integrity": "sha512-cUNXrCdD4hEj5iJ9SligTNur64rNnLX5s6CbvmatRpWKMZtrLTOlyLhuXmVbjfDXeXH7os8Qb71Wa7IEhC27Sw==" }, "discord-slash-command-handler": { "version": "3.2.3", @@ -7657,10 +7967,22 @@ "ws": "^8.4.0" }, "dependencies": { - "@discordjs/collection": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-0.4.0.tgz", - "integrity": "sha512-zmjq+l/rV35kE6zRrwe8BHqV78JvIh2ybJeZavBi5NySjWXqN3hmmAKg7kYMMXSeiWtSsMoZ/+MQi0DiQWy2lw==" + "@discordjs/builders": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-0.11.0.tgz", + "integrity": "sha512-ZTB8yJdJKrKlq44dpWkNUrAtEJEq0gqpb7ASdv4vmq6/mZal5kOv312hQ56I/vxwMre+VIkoHquNUAfnTbiYtg==", + "requires": { + "@sindresorhus/is": "^4.2.0", + "discord-api-types": "^0.26.0", + "ts-mixer": "^6.0.0", + "tslib": "^2.3.1", + "zod": "^3.11.6" + } + }, + "discord-api-types": { + "version": "0.26.1", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.26.1.tgz", + "integrity": "sha512-T5PdMQ+Y1MEECYMV5wmyi9VEYPagEDEi4S0amgsszpWY0VB9JJ/hEvM6BgLhbdnKky4gfmZEXtEEtojN8ZKJQQ==" }, "form-data": { "version": "4.0.0", @@ -7672,6 +7994,11 @@ "mime-types": "^2.1.12" } }, + "ts-mixer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/ts-mixer/-/ts-mixer-6.0.3.tgz", + "integrity": "sha512-k43M7uCG1AkTyxgnmI5MPwKoUvS/bRvLvUb7+Pgpdlmok8AoqmUaZxUUw8zKM5B1lqZrt41GjYgnvAi0fppqgQ==" + }, "ws": { "version": "8.8.1", "resolved": "https://registry.npmjs.org/ws/-/ws-8.8.1.tgz", @@ -8160,6 +8487,11 @@ "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==" }, + "follow-redirects": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==" + }, "forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", @@ -8886,6 +9218,11 @@ "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=" }, + "lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==" + }, "lodash.isplainobject": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", @@ -9226,9 +9563,9 @@ "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==" }, "nan": { - "version": "2.16.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.16.0.tgz", - "integrity": "sha512-UdAqHyFngu7TfQKsCBgAA6pWDkT8MAO7d0jyOecVhN5354xbLqdn8mV9Tat9gepAupm0bt2DbeaSC8vS52MuFA==" + "version": "2.17.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.17.0.tgz", + "integrity": "sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==" }, "natural-compare": { "version": "1.4.0", @@ -9241,6 +9578,21 @@ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" }, + "node": { + "version": "16.9.0", + "resolved": "https://registry.npmjs.org/node/-/node-16.9.0.tgz", + "integrity": "sha512-a7+cnQtCKnb7d/OfEF1x6OmwDkrueCIPVootf/waqVmIbYzpcIGgFriXHfaRlKRYS2ueZQurG4KQyitbDerEfA==", + "dev": true, + "requires": { + "node-bin-setup": "^1.0.0" + } + }, + "node-bin-setup": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/node-bin-setup/-/node-bin-setup-1.1.3.tgz", + "integrity": "sha512-opgw9iSCAzT2+6wJOETCpeRYAQxSopqQ2z+N6BXwIMsQQ7Zj5M8MaafQY8JMlolRR6R1UXg2WmhKp0p9lSOivg==", + "dev": true + }, "node-canvas-with-twemoji-and-discord-emoji": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/node-canvas-with-twemoji-and-discord-emoji/-/node-canvas-with-twemoji-and-discord-emoji-1.1.4.tgz", @@ -9723,6 +10075,11 @@ "ipaddr.js": "1.9.1" } }, + "proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, "pseudomap": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", @@ -10695,9 +11052,9 @@ "integrity": "sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw==" }, "ts-mixer": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ts-mixer/-/ts-mixer-6.0.1.tgz", - "integrity": "sha512-hvE+ZYXuINrx6Ei6D6hz+PTim0Uf++dYbK9FFifLNwQj+RwKquhQpn868yZsCtJYiclZF1u8l6WZxxKi+vv7Rg==" + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ts-mixer/-/ts-mixer-5.4.1.tgz", + "integrity": "sha512-Zo9HgPCtNouDgJ+LGtrzVOjSg8+7WGQktIKLwAfaNrlOK1mWGlz1ejsAF/YqUEqAGjUTeB5fEg8gH9Aui6w9xA==" }, "tslib": { "version": "2.4.0", @@ -10908,6 +11265,11 @@ "integrity": "sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ==", "dev": true }, + "vali-date": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/vali-date/-/vali-date-1.0.0.tgz", + "integrity": "sha512-sgECfZthyaCKW10N0fm27cg8HYTFK5qMWgypqkXMQ4Wbl/zZKx7xZICgcoxIIE+WFAP/MBL2EFwC/YvLxw3Zeg==" + }, "vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", @@ -11184,9 +11546,9 @@ } }, "zod": { - "version": "3.18.0", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.18.0.tgz", - "integrity": "sha512-gwTm8RfUCe8l9rDwN5r2A17DkAa8Ez4Yl4yXqc5VqeGaXaJahzYYXbTwvhroZi0SNBqTwh/bKm2N0mpCzuw4bA==" + "version": "3.22.2", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.22.2.tgz", + "integrity": "sha512-wvWkphh5WQsJbVk1tbx1l1Ly4yg+XecD+Mq280uBGt9wa5BKSWf4Mhp6GmrkPixhMxmabYY7RbzlwVP32pbGCg==" } } } diff --git a/package.json b/package.json index bac2702..340dfb6 100644 --- a/package.json +++ b/package.json @@ -7,19 +7,25 @@ }, "devDependencies": { "eslint": "^7.6.0", - "eslint-config-tesseract": "^0.0.3" + "eslint-config-tesseract": "^0.0.3", + "node": "^16.9.0" }, "dependencies": { + "@discordjs/builders": "^0.3.0", + "@discordjs/rest": "^0.3.0", "@top-gg/sdk": "^3.0.8", + "axios": "^1.5.0", "body-parser": "^1.19.0", "canvacord": "^5.0.8", - "canvas": "^2.9.3", + "canvas": "^2.11.2", "chalk": "^4.1.0", + "colors": "^1.4.0", "common-tags": "^1.8.0", "connect-mongo": "^4.4.1", "crypto": "^1.0.1", "datadog-metrics": "^0.8.2", "date-and-time": "^0.14.2", + "discord-api-types": "^0.37.11", "discord-slash-command-handler": "^3.2.3", "discord.js": "^13.6.0", "dotenv": "^16.0.1", @@ -62,5 +68,13 @@ "author": "", "license": "ISC", "keywords": [], - "description": "" + "description": "



Pogy the Discord Bot [DJS V13]

", + "repository": { + "type": "git", + "url": "git+https://github.com/eYuM-coder/MEE8.git" + }, + "bugs": { + "url": "https://github.com/eYuM-coder/MEE8/issues" + }, + "homepage": "https://github.com/eYuM-coder/MEE8#readme" } diff --git a/replit.nix b/replit.nix new file mode 100644 index 0000000..bf2d6d9 --- /dev/null +++ b/replit.nix @@ -0,0 +1,8 @@ +{ pkgs }: { + deps = [ + pkgs.nodejs-18_x + pkgs.nodePackages.typescript-language-server + pkgs.yarn + pkgs.replitPackages.jest + ]; +} \ No newline at end of file diff --git a/src/commands/information/news.js b/src/commands/information/news.js index 6d0c8af..f2ddd99 100644 --- a/src/commands/information/news.js +++ b/src/commands/information/news.js @@ -1,5 +1,5 @@ const Command = require("../../structures/Command"); -const Guild = require("../../database/schemas/Pogy"); +const Guild = require("../../database/schemas/MEE8"); const Guildd = require("../../database/schemas/Guild"); const { MessageEmbed } = require("discord.js"); const moment = require("moment"); diff --git a/src/commands/owner/setNews.js b/src/commands/owner/setNews.js index a351026..7a50d1e 100644 --- a/src/commands/owner/setNews.js +++ b/src/commands/owner/setNews.js @@ -1,5 +1,5 @@ const Command = require("../../structures/Command"); -const NewsSchema = require("../../database/schemas/Pogy"); +const NewsSchema = require("../../database/schemas/MEE8"); module.exports = class extends Command { constructor(...args) { diff --git a/src/data/emoji.js b/src/data/emoji.js index f979bd6..782187f 100644 --- a/src/data/emoji.js +++ b/src/data/emoji.js @@ -1,7 +1,7 @@ module.exports = { x: "<:wrong:822379358453891123>", fail: "<:wrong:822379358453891123> ", - check: "<:check:822377045236514816> ", - success: "<:check:822377045236514816> ", + check: "<:success:1159255004817932398> ", + success: "<:success:1159255004817932398> ", cash: "$", }; diff --git a/src/database/schemas/Pogy.js b/src/database/schemas/MEE8.js similarity index 100% rename from src/database/schemas/Pogy.js rename to src/database/schemas/MEE8.js diff --git a/src/deployCommands.js b/src/deployCommands.js index d11ede8..0692a77 100644 --- a/src/deployCommands.js +++ b/src/deployCommands.js @@ -2,7 +2,8 @@ const fs = require("node:fs"); const path = require("node:path"); const { REST } = require("@discordjs/rest"); const { Routes } = require("discord-api-types/v9"); -const { clientId } = require("../config.json") +const { clientId } = require("../config.json"); +const { getAllFiles } = require("./utils/utils.js"); const { green } = require("colors"); @@ -20,7 +21,10 @@ for(const folder of commandFolders) { const rest = new REST({ version: '9' }).setToken(process.env.TOKEN); + console.log(green("Started refreshing application (/) commands.")); rest.put(Routes.applicationCommands(clientId), { body: commands }) -.then(() => console.log('Successfully registered application commands.')) -.catch(console.error); \ No newline at end of file +.then((c) => { + console.log(green("Successfully registered application commands.")); + return Promise.resolve(commands); +}); \ No newline at end of file diff --git a/src/events/ready.js b/src/events/ready.js index fc4dfa5..bbe3006 100644 --- a/src/events/ready.js +++ b/src/events/ready.js @@ -12,15 +12,8 @@ module.exports = class extends Event { async run() { Message(this.client); - new Handler(this.client, { - commandFolder: "./src/slash", - commandType: "file", - allSlash: true, - handleSlash: true, - }); // Slash command handler, your choice if you want to remove this, best if you dont. - logger.info( - `${this.client.user.tag} is ready to serve ${this.client.guilds.cache.size} guilds.`, + `${this.client.user.tag} is ready to serve ${this.client.guilds.cache.size} guilds with ${this.client.guilds.cache.reduce((a, g) => a + g.memberCount, 0)} members.`, { label: "Ready" } ); diff --git a/src/slash/help.js b/src/slash/help.js deleted file mode 100644 index ab69812..0000000 --- a/src/slash/help.js +++ /dev/null @@ -1,13 +0,0 @@ -module.exports = { - name: "help", - description: "Display the bot commands!", - category: "general", - slash: "true", - global: true, - error: async () => {}, - run: async (data) => { - data.interaction.editReply({ - content: `We are still working on our slash commands, come back later!!`, - }); - }, -}; diff --git a/src/slash/ping.js b/src/slash/ping.js deleted file mode 100644 index ea62b1d..0000000 --- a/src/slash/ping.js +++ /dev/null @@ -1,15 +0,0 @@ -module.exports = { - name: "ping", - description: "Get the bot's api ping!", - category: "general", - slash: "true", - global: true, - error: async () => {}, - run: async (data) => { - data.interaction.editReply({ - content: `Api Ping: \`${Math.floor( - data.interaction.client.ws.ping - )} ms\``, - }); - }, -}; diff --git a/src/slashCommands/moderation/addrole.js b/src/slashCommands/moderation/addrole.js index 77ab3f0..2fe2e73 100644 --- a/src/slashCommands/moderation/addrole.js +++ b/src/slashCommands/moderation/addrole.js @@ -6,8 +6,9 @@ module.exports = { data: new SlashCommandBuilder() .setName("addrole") .setDescription("Adds a role to a user.") - .addUserOption((option) => option.setName("member").setDescription("The member to add the role to").setRequired(true)) - .addRoleOption((option) => option.setName("role").setDescription("The role to give").setRequired(true)), + .addSubCommand((subcommand) => subcommand.setName("all").setDescription("Adds a role to a user.") + .addRoleOption((option) => option.setName("role").setDescription("The role to add to the user.").setRequired(true)) + .addBooleanOption((option) => option.setName("remove").setDescription("Remove role or not"))), async execute(interaction) { if(!interaction.member.permissions.has("MANAGE_ROLES")) { return interaction.reply({ content: `You do not have permission to use this command.`, ephemeral: true }); @@ -16,104 +17,28 @@ module.exports = { const fail = client.emoji.fail; const success = client.emoji.success; const logging = await Logging.findOne({ guildId: interaction.guild.id }); - - let member = interaction.options.getMember("member"); - - if(!member) { - let usernotfound = new MessageEmbed() - .setAuthor({ - name: `${interaction.user.tag}`, - iconURL: interaction.user.displayAvatarURL({ dynamic: true }) - }) - .setDescription(`${fail} | Please mention a valid user`) - .setTimestamp() - .setFooter({ text: "https://mee8.ml/" }) - .setColor(interaction.client.color.red) - return interaction.reply({ embeds: [usernotfound] }) - .then(async () => { - if (logging && logging.moderation.delete_reply === "true") { - setTimeout(() => { - interaction.deleteReply().catch(() => {}); - }, 5000); - } - }) - .catch(() => {}); - } - - if (member.roles.highest.position >= interaction.member.roles.highest.position) { - let rolesmatch = new MessageEmbed() - .setAuthor({ - name: `${interaction.user.tag}`, - iconURL: interaction.user.displayAvatarURL({ dynamic: true }) - }) - .setDescription(`${fail} | The Provided user has an equal or higher role than you.`) - .setTimestamp() - .setFooter({ text: "https://mee8.ml/" }) - .setColor(interaction.client.color.red) - return interaction.reply({ embeds: [rolesmatch] }) - .then(async () => { - if (logging && logging.moderation.delete_reply === "true") { - setTimeout(() => { - interaction.deleteReply().catch(() => {}) - }, 5000) - } - }) - .catch(() => {}) - } - - const role = interaction.options.getRole("role") || interaction.guild.roles.cache.get(role) || interaction.guild.roles.cache.find((rl) => rl.name.toLowerCase() === role.slice(1).join(" ").toLowerCase()); - - let reason = `The current feature doesn't need a reason.`; - if (!reason) reason = `No Reason Provided`; - if (reason.length > 1024) reason = reason.slice(0, 1021) + "..."; - - if (!role) { - let rolenotfound = new MessageEmbed() - .setAuthor({ - name: `${interaction.user.tag}`, - iconURL: interaction.user.displayAvatarURL({ dynamic: true }) - }) - .setDescription(`${fail} | Please provide a valid role!`) - .setTimestamp() - .setFooter({ text: "https://mee8.ml" }) - .setColor(interaction.client.color.red) - return interaction.reply({ embeds: [rolenotfound] }) - .then(async () => { - if (logging && logging.moderation.delete_reply === "true") { - setTimeout(() => { - interaction.deleteReply().catch(() => {}); - }, 5000) - } - }) - .catch(() => {}); - } else if (member.roles.cache.has(role.id)) { - let userhasrole = new MessageEmbed() - .setAuthor({ - name: `${interaction.user.tag}`, - iconURL: interaction.user.displayAvatarURL({ dynamic: true }) - }) - .setDescription(`${fail} | The user already has that role!`) - .setTimestamp() - .setFooter({ text: "https://mee8.ml/" }) - .setColor(interaction.client.color.red) - return interaction.reply({ embeds: [userhasrole] }) - .then(async () => { - if (logging && logging.moderation.delete_reply === "true") { - setTimeout(() => { - interaction.deleteReply().catch(() => {}); - }, 5000) - } - }) - .catch(() => {}) - } else { - try { - await member.roles.add(role, [ - `Role Add / Responsible User: ${interaction.user.tag}`, - ]); - const embed = new MessageEmbed() - .setDescription(`${success} | Added **${role.name}** to **${member.user.tag}**`) - .setColor(interaction.client.color.green) - interaction.reply({ embeds: [embed] }) + + if(interaction.options.getSubcommand() === "all") { + const role = interaction.options.getRole("role") || interaction.guild.roles.cache.get(role) || interaction.guild.roles.cache.find((rl) => rl.name.toLowerCase() === role.slice(1).join(" ").toLowerCase()); + const removerole = interaction.options.getBoolean("remove") || false; + + let reason = `The current feature doesn't need a reason.`; + if (!reason) { + reason = `No Reason Provided` + }; + if (reason.length > 1024) reason = reason.slice(0, 1021) + "..."; + + if (!role) { + let rolenotfound = new MessageEmbed() + .setAuthor({ + name: `${interaction.user.tag}`, + iconURL: interaction.user.displayAvatarURL({ dynamic: true }) + }) + .setDescription(`${fail} | Please provide a valid role!`) + .setTimestamp() + .setFooter({ text: "https://mee8.ml" }) + .setColor(interaction.client.color.red) + return interaction.reply({ embeds: [rolenotfound], ephmeral: true }) .then(async () => { if (logging && logging.moderation.delete_reply === "true") { setTimeout(() => { @@ -121,21 +46,45 @@ module.exports = { }, 5000) } }) - .catch(() => {}) - } catch (err) { - interaction.reply({ - embeds: [ - new MessageEmbed() - .setAuthor({ - name: `${interaction.user.tag}`, - iconURL: interaction.user.displayAvatarURL({ dynamic: true }) + .catch(() => {}); + } else { + if(removerole === false) { + interaction.channel.send({ content: `${success} | Adding ${role.name} to ${fetchedMembers.size} members. This may take a while!` }).then(() => { + interaction.guild.members.cache.forEach((member) => member.roles.add(role, [ + `Role Add / Responsible User: ${interaction.user.tag}`, + ])); + const embed = new MessageEmbed() + .setDescription(`${success} | Added **${role.name}** to **${interaction.guild.members.cache.size.size}** members.`) + .setColor(interaction.client.color.green) + interaction.channel.send({ embeds: [embed] }) + .then(async () => { + if (logging && logging.moderation.delete_reply === "true") { + setTimeout(() => { + interaction.deleteReply().catch(() => {}); + }, 5000) + } + }) + .catch(() => {}) + }); + } else { + interaction.channel.send({ content: `${success} | Removing ${role.name} from ${interaction.guild.members.cache.size} members. This may take a while!` }).then(() => { + interaction.guild.members.cache.forEach((member) => member.roles.remove(role, [ + `Role Remove / Responsible User: ${interaction.user.tag}`, + ])); + const embed = new MessageEmbed() + .setDescription(`${success} | Removed **${role.name}** from **${fetchedMembers.size}** members.`) + .setColor(interaction.client.color.green) + interaction.channel.send({ embeds: [embed] }) + .then(async () => { + if (logging && logging.moderation.delete_reply === "true") { + setTimeout(() => { + interaction.deleteReply().catch(() => {}); + }, 5000) + } }) - .setDescription(`${fail} | Unable to remove the role to the user.`) - .setTimestamp() - .setFooter({ text: "https://mee8.ml/" }) - .setColor(interaction.guild.me.displayHexColor), - ], - }); + .catch(() => {}) + }); + }; } } } diff --git a/src/slashCommands/moderation/clear.js b/src/slashCommands/moderation/clear.js index c2ceab3..dcff0b8 100644 --- a/src/slashCommands/moderation/clear.js +++ b/src/slashCommands/moderation/clear.js @@ -1,6 +1,7 @@ const { SlashCommandBuilder } = require("@discordjs/builders"); const { MessageEmbed } = require("discord.js"); const Logging = require("../../database/schemas/logging.js"); +let messageDisplay = "messages"; module.exports = { data: new SlashCommandBuilder() @@ -72,12 +73,16 @@ module.exports = { }) .catch(() => {}); } else { - interaction.reply({ content: "Complete.", ephemeral: true }) + if(messages == 1) { + messageDisplay = "message"; + } else { + messageDisplay = "messages"; + } channel.bulkDelete(messages, true).then((messages) => { const embed = new MessageEmbed() .setDescription( - `${success} | Successfully deleted **${messages.size}** message(s)` + `${success} | Successfully deleted **${messages.size}** ${messageDisplay}` ) .setColor(interaction.client.color.green); @@ -97,15 +102,7 @@ module.exports = { } interaction - .channel.send({ embeds: [embed] }) - .then(async () => { - if (logging && logging.moderation.delete_reply === "true") { - setTimeout(() => { - interaction.deleteReply().catch(() => {}); - }, 5000); - } - }) - .catch(() => {}); + .reply({ embeds: [embed], ephemeral: true }); }); } } catch (err) { diff --git a/src/slashCommands/moderation/warnpurge.js b/src/slashCommands/moderation/warnpurge.js index 9b533ea..0dd54eb 100644 --- a/src/slashCommands/moderation/warnpurge.js +++ b/src/slashCommands/moderation/warnpurge.js @@ -11,7 +11,7 @@ module.exports = { .setName("warnpurge") .setDescription("Warns a user and removes their messages") .addUserOption((option) => option.setName("member").setDescription("The member to warn").setRequired(true)) - .addNumberOption((option) => option.setName("amount").setDescription("The amount of messages to purge").setRequired(true)) + .addIntegerOption((option) => option.setName("amount").setDescription("The amount of messages to purge").setRequired(true)) .addStringOption((option) => option.setName("reason").setDescription("The reason to warn the user")), async execute(interaction) { diff --git a/src/utils/utils.js b/src/utils/utils.js index c25ad0f..dab42d1 100644 --- a/src/utils/utils.js +++ b/src/utils/utils.js @@ -1,3 +1,5 @@ +const fs = require("node:fs"); +const path = require("node:path"); const Profile = require("../database/models/economy/profile.js"); /** * Capitalizes a string @@ -34,6 +36,20 @@ function trimArray(arr, maxLen = 10) { return arr; } +module.exports.getAllFiles = function getAllFiles(dirPath, arrayOfFiles) + { + const files = fs.readdirSync(dirPath); + + arrayOfFiles = arrayOfFiles || []; + files.forEach(function (file) { + if (fs.statSync(dirPath + "/" + file).isDirectory()) + arrayOfFiles = getAllFiles(dirPath + "/" + file, arrayOfFiles); + else arrayOfFiles.push(path.join(dirPath, "/", file)); + }); + + return arrayOfFiles; + }; + /** * Trims joined array to specified size * @param {Array} arr From 4d77daa50431bbd899b1f5a5bcb8968e88bcd945 Mon Sep 17 00:00:00 2001 From: eYuM <101909226+eYuM-coder@users.noreply.github.com> Date: Tue, 2 Jan 2024 19:52:38 -0700 Subject: [PATCH 46/70] Create config.json --- config.json | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 config.json diff --git a/config.json b/config.json new file mode 100644 index 0000000..ae647c8 --- /dev/null +++ b/config.json @@ -0,0 +1,35 @@ +{ + "clientId": "1135714988493910136", + "developers": ["1067137336674107453"], + "status": "!help | website here", + "discord": "https://discord.gg/", + "dashboard": "true", + "server": "", + "prefix": "!", + "webhooks": { + "logs": "https://discord.com/api/webhooks/1191872792031932416/H2PmMiAF4ANN9XbGukEXQqHPBPFwIdCCiKGte3YCZeE0QO_My-8cbkvcw0Zw1_JNWn3T", + "maintenance_logs": "https://discord.com/api/webhooks/1191873962796392500/rB7t4OXNc4YAoRQBlBCPdtV1hRmr0wOmBVJb-4Q8b1oTyZpausXqACLDWsSFRXSNGi3B", + "ratelimit_logs": "https://discord.com/api/webhooks/1191874767704297593/AcMwK-t1kzEk6RFU-SmkQ7uIwf9dfHPu8JbuPJCkdQHAi17f7vZUB_iSc0XvnCQ1tN9r", + "blacklist": "https://discord.com/api/webhooks/1191875214368329809/5hkt3OXKkQuElqJEIQ6Tq-rxBDNz1MkGUKs7xTVkzJcAg53WvuO2jjQWcvLGSRKHYra6", + "report": "https://discord.com/api/webhooks/1191875430219776062/Kd_wqFD2I911e5fRew21E1_bNoFZAO29eJ6tdVSs0e0OnJMyK5EU-oeLpXJ50pYVhZPC", + "contact": "https://discord.com/api/webhooks/1191875563737067581/3Uib7OOD_y1MwVDlOUVu7B6DayFySZ5UAOUIhSxlBMNjWdSIdygWR-_Gs6-KdpzgvYoy", + "bugs": "https://discord.com/api/webhooks/1191875015319228456/q0Y8MCmtC6WCUzu3-Nk9ltc3By4oGSFnl8j-x4A8rtoVw4kjRyRHYLfH_oReFNOAp41n", + "premium": "https://discord.com/api/webhooks/1191874623776768142/7NW5AV84rIz4yC92aaZYYl0frdVQmJfNqzvRY3QglzBL_AkakjhhHf6KR-NTdhb-Jz7h", + "suggestions": "https://discord.com/api/webhooks/1191875689067061308/Aqt67syItFzuYR7XZqaRUMZlqumTfHz6Tyjg1P_hkYACgckq0JqvBRAWNJqu5uc9cPg2", + "votes": "https://discord.com/api/webhooks/1191875845271343144/vQ2TheQMXCT2aqR_hkoZKZZnrPRCQt640tI7zHYSJb3HDpyGZJKsOn44e9F42pgrHZ6B", + "errors": "https://discord.com/api/webhooks/1191876024607199403/t3MW9tGu4zliCbPSUY-ItHJVejPaNWjDD13afUnMbqSMrZtsOiMt4AoSY4bTH27dyM4v", + "auth": "https://discord.com/api/webhooks/1191876187421675701/1RiQKyKvR4Ise6d6J8suAf4piFSY0HkgDjVrr4x--chvnYFh0fYjwUPlzAhjhHFmOLOR", + "joinsPublic": "https://discord.com/api/webhooks/1191876306393108551/2tdtejyuGdfgZyA22wDsK-vG_bCcY6WBOReriE4DTCb5fAHbNLprwUs3r4DOOiWSn5jo", + "joinsPrivate": "https://discord.com/api/webhooks/1191876306393108551/2tdtejyuGdfgZyA22wDsK-vG_bCcY6WBOReriE4DTCb5fAHbNLprwUs3r4DOOiWSn5jo", + "leavesPublic": "https://discord.com/api/webhooks/1191876447091052655/7G1samQc5pPXnKy72MWX6ZFBc0dctsSsrlPFpP8pNx-ciXFmy81MZUxNqH4VBK09mrtm", + "leavesPrivate": "https://discord.com/api/webhooks/1191876447091052655/7G1samQc5pPXnKy72MWX6ZFBc0dctsSsrlPFpP8pNx-ciXFmy81MZUxNqH4VBK09mrtm" + }, + "maintenance": "false", + "maintenance_threshold": "5", + "invite_link": "https://discord.com/api/oauth2/authorize?client_id=1135714988493910136&permissions=70368744177663&scope=bot+applications.commands", + "seo": { + "enabled": "false", + "title": "Bot Name", + "description": "Bot description" + } +} From 9ceab9f6ad05d2a6f8fa4a54c8bc7870b5bc6ad0 Mon Sep 17 00:00:00 2001 From: Replit user <> Date: Wed, 3 Jan 2024 04:21:35 +0000 Subject: [PATCH 47/70] update --- .replit | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/.replit b/.replit index df21e34..e2ee07c 100644 --- a/.replit +++ b/.replit @@ -2,6 +2,16 @@ language = "nodejs" run = "npm start" hidden = [".config", "package-lock.json"] +entrypoint = "index.js" +modules = ["nodejs-20:v8-20230920-bd784b9"] [nix] -channel = "stable-22_11" \ No newline at end of file +channel = "stable-22_11" + +[unitTest] +language = "nodejs" + +[deployment] +run = ["node", "index.js"] +deploymentTarget = "cloudrun" +ignorePorts = false From 61dfde2fcb1e3afb2319caceaa76f17e13d3c02a Mon Sep 17 00:00:00 2001 From: Replit user <> Date: Wed, 3 Jan 2024 04:28:40 +0000 Subject: [PATCH 48/70] a --- src/slashCommands/moderation/addrole.js | 77 ++++++++++++++++++++++++- 1 file changed, 75 insertions(+), 2 deletions(-) diff --git a/src/slashCommands/moderation/addrole.js b/src/slashCommands/moderation/addrole.js index 2fe2e73..f131d69 100644 --- a/src/slashCommands/moderation/addrole.js +++ b/src/slashCommands/moderation/addrole.js @@ -6,8 +6,11 @@ module.exports = { data: new SlashCommandBuilder() .setName("addrole") .setDescription("Adds a role to a user.") - .addSubCommand((subcommand) => subcommand.setName("all").setDescription("Adds a role to a user.") - .addRoleOption((option) => option.setName("role").setDescription("The role to add to the user.").setRequired(true)) + .addSubCommand((subcommand) => subcommand.setName("all").setDescription("Adds a role to all users.") + .addRoleOption((option) => option.setName("role").setDescription("The role to add to the users.").setRequired(true)) + .addBooleanOption((option) => option.setName("remove").setDescription("Remove role or not"))) + .addSubCommand((subcommand) => subcommand.setName("bots").setDescription("Adds a role to all bots.") + .addRoleOption((option) => option.setName("role").setDescription("The role to add to the bots.").setRequired(true)) .addBooleanOption((option) => option.setName("remove").setDescription("Remove role or not"))), async execute(interaction) { if(!interaction.member.permissions.has("MANAGE_ROLES")) { @@ -86,6 +89,76 @@ module.exports = { }); }; } + } else if (interaction.options.getSubcommand() === "bots") { + const role = interaction.options.getRole("role") || interaction.guild.roles.cache.get(role) || interaction.guild.roles.cache.find((rl) => rl.name.toLowerCase() === role.slice(1).join(" ").toLowerCase()); + const removerole = interaction.options.getBoolean("remove") || false; + + let reason = `The current feature doesn't need a reason.`; + if (!reason) { + reason = `No Reason Provided` + } + if(reason.length > 1024) { + reason = reason.slice(0, 1021) + "..."; + } + + if(!role) { + let rolenotfound = new MessageEmbed() + .setAuthor({ + name: `${interaction.user.tag}`, + iconURL: interaction.user.displayAvatarURL({ dynamic: true }) + }) + .setDescription(`${fail} | Please provide a valid role!`) + .setTimestamp() + .setFooter({ text: "https://mee8.ml" }) + .setColor(interaction.client.color.red) + return interaction.reply({ embeds: [rolenotfound], ephmeral: true }) + .then(async () => { + if (logging && logging.moderation.delete_reply === "true") { + setTimeout(() => { + interaction.deleteReply().catch(() => {}); + }, 5000) + } + }) + .catch(() => {}); + } else { + if(removerole === false) { + interaction.channel.send({ content: `${success} | Adding ${role.name} to ${interaction.guild.members.cache.filter((m) => m.user.bot).size} bots. This may take a while!` }).then(() => { + interaction.guild.members.cache.filter((m) => m.user.bot).forEach((member) => member.roles.add(role, [ + `Role Add / Responsible User: ${interaction.user.tag}`, + ])); + const embed = new MessageEmbed() + .setDescription(`${success} | Added **${role.name}** to **${interaction.guild.members.cache.filter((m) => m.user.bot).size}** bots.`) + .setColor(interaction.client.color.green) + interaction.channel.send({ embeds: [embed] }) + .then(async () => { + if (logging && logging.moderation.delete_reply === "true") { + setTimeout(() => { + interaction.deleteReply().catch(() => {}); + }, 5000) + } + }) + .catch(() => {}) + }); + } else { + interaction.channel.send({ content: `${success} | Removing ${role.name} from ${interaction.guild.members.cache.filter((m) => m.user.bot).size} bots. This may take a while!` }).then(() => { + interaction.guild.members.cache.filter((m) => m.user.bot).forEach((member) => member.roles.remove(role, [ + `Role Remove / Responsible User: ${interaction.user.tag}`, + ])); + const embed = new MessageEmbed() + .setDescription(`${success} | Removed **${role.name}** from **${interaction.guild.members.cache.filter((m) => m.user.bot).size}** bots.`) + .setColor(interaction.client.color.green) + interaction.channel.send({ embeds: [embed] }) + .then(async () => { + if (logging && logging.moderation.delete_reply === "true") { + setTimeout(() => { + interaction.deleteReply().catch(() => {}); + }, 5000) + } + }) + .catch(() => {}) + }); + } + } } } }; \ No newline at end of file From 49d12f4eb5696e487bb25297c5fae7cc16d2549d Mon Sep 17 00:00:00 2001 From: Replit user <> Date: Wed, 3 Jan 2024 05:51:01 +0000 Subject: [PATCH 49/70] Slash Commands Update --- src/dashboard/templates/404.ejs | 2 +- src/dashboard/templates/appeal.ejs | 2 +- src/dashboard/templates/appealMain.ejs | 2 +- src/dashboard/templates/contact.ejs | 2 +- src/dashboard/templates/dashboard.ejs | 4 +- src/dashboard/templates/embeds.ejs | 2 +- src/dashboard/templates/faq.ejs | 6 +- src/dashboard/templates/index.ejs | 18 +- src/dashboard/templates/maintenance.ejs | 4 +- .../templates/partials/mainfooter.ejs | 12 +- src/dashboard/templates/paste.ejs | 8 +- src/dashboard/templates/policy.ejs | 8 +- src/dashboard/templates/premium.ejs | 4 +- src/dashboard/templates/redeem.ejs | 2 +- src/dashboard/templates/redeemguild.ejs | 2 +- src/dashboard/templates/report.ejs | 4 +- src/dashboard/templates/stats.ejs | 2 +- src/dashboard/templates/team.ejs | 2 +- src/dashboard/templates/thanks.ejs | 4 +- src/dashboard/templates/url.ejs | 6 +- src/dashboard/templates/variables.ejs | 6 +- src/data/language/arabic.json | 12 +- src/data/language/english.json | 14 +- src/data/language/french.json | 14 +- src/data/language/polish.json | 14 +- src/data/language/spanish.json | 14 +- src/slashCommands/moderation/addrole.js | 164 --------- src/slashCommands/moderation/clear.js | 24 +- src/slashCommands/moderation/removerole.js | 142 -------- src/slashCommands/moderation/role.js | 326 ++++++++++++++++++ 30 files changed, 417 insertions(+), 409 deletions(-) delete mode 100644 src/slashCommands/moderation/addrole.js delete mode 100644 src/slashCommands/moderation/removerole.js create mode 100644 src/slashCommands/moderation/role.js diff --git a/src/dashboard/templates/404.ejs b/src/dashboard/templates/404.ejs index f7fc2f2..0e2ec19 100644 --- a/src/dashboard/templates/404.ejs +++ b/src/dashboard/templates/404.ejs @@ -64,7 +64,7 @@ -Pogy - 404 +MEE8 - 404 diff --git a/src/dashboard/templates/appeal.ejs b/src/dashboard/templates/appeal.ejs index 5870516..fec79b7 100644 --- a/src/dashboard/templates/appeal.ejs +++ b/src/dashboard/templates/appeal.ejs @@ -1,4 +1,4 @@ -<%- include("partials/head", {bot, user, path, title: "Pogy - Appeal" }) %> +<%- include("partials/head", {bot, user, path, title: "MEE8 - Appeal" }) %>

Select a server to Apply to

diff --git a/src/dashboard/templates/appealMain.ejs b/src/dashboard/templates/appealMain.ejs index 5af8de2..ab9c669 100644 --- a/src/dashboard/templates/appealMain.ejs +++ b/src/dashboard/templates/appealMain.ejs @@ -1,4 +1,4 @@ -<%- include("partials/head", {bot, user, path, description, title: "Pogy - Apply"}) %> +<%- include("partials/head", {bot, user, path, description, title: "MEE8 - Apply"}) %> diff --git a/src/dashboard/templates/contact.ejs b/src/dashboard/templates/contact.ejs index a57ab52..cec6afe 100644 --- a/src/dashboard/templates/contact.ejs +++ b/src/dashboard/templates/contact.ejs @@ -1,4 +1,4 @@ -<%- include("partials/head", {bot, user, path, description, title: "Pogy - Contact"}) %> +<%- include("partials/head", {bot, user, path, description, title: "MEE8 - Contact"}) %> diff --git a/src/dashboard/templates/dashboard.ejs b/src/dashboard/templates/dashboard.ejs index 772e166..a0b1c32 100644 --- a/src/dashboard/templates/dashboard.ejs +++ b/src/dashboard/templates/dashboard.ejs @@ -1,4 +1,4 @@ -<%- include("partials/head", {bot, user, path, title: "Pogy - Dashboard" }) %> +<%- include("partials/head", {bot, user, path, title: "MEE8 - Dashboard" }) %>

SELECT A SERVER

@@ -30,7 +30,7 @@ color: #555; " > - Looks like you aren't in Pogy's Support Server. + Looks like you aren't in MEE8's Support Server. Join Here!

diff --git a/src/dashboard/templates/embeds.ejs b/src/dashboard/templates/embeds.ejs index 7a0fabf..5cab92a 100644 --- a/src/dashboard/templates/embeds.ejs +++ b/src/dashboard/templates/embeds.ejs @@ -1,4 +1,4 @@ -<%- include("partials/head", {bot, user, path, description, title: "Pogy - Embed Builder", url, image }) %> +<%- include("partials/head", {bot, user, path, description, title: "MEE8 - Embed Builder", url, image }) %>

Embed - FAQ diff --git a/src/dashboard/templates/faq.ejs b/src/dashboard/templates/faq.ejs index 5d60d09..db3d970 100644 --- a/src/dashboard/templates/faq.ejs +++ b/src/dashboard/templates/faq.ejs @@ -1,4 +1,4 @@ -<%- include("partials/head", { bot, user, path, description, title: "Pogy - FAQ", url, image }) %> +<%- include("partials/head", { bot, user, path, description, title: "MEE8 - FAQ", url, image }) %>

Frequently Asked Questions @@ -43,7 +43,7 @@

- You can change Pogy's default Prefix with + You can change MEE8's default Prefix with p!setPrefix <new Prefix> or by heading to the dashboard's main settings page.

@@ -51,7 +51,7 @@
- How do I invite Pogy to my Server? + How do I invite MEE8 to my Server? +<%- include("partials/head", {bot, user, path, description, title: "MEE8 - Home" , url, image }) %>

Advanced Logging

-

With pogy you can fully customize logging. Pogy lets you set your own log settings from member logging to command and voice logging!

+

With pogy you can fully customize logging. MEE8 lets you set your own log settings from member logging to command and voice logging!

Design Embeds

-

Pogy Allows you to make, and send embeds to any channel. You can even send it as your own webhook or save it as a Custom Command!

+

MEE8 Allows you to make, and send embeds to any channel. You can even send it as your own webhook or save it as a Custom Command!

@@ -90,14 +90,14 @@

Create Applications

-

Manage your server applications with Pogy!

+

Manage your server applications with MEE8!

Reaction Roles

-

Create your own reaction roles directly from Pogy's Dashboard!

+

Create your own reaction roles directly from MEE8's Dashboard!

@@ -184,14 +184,14 @@

Advanced Logging

-

With pogy you can fully customize logging. Pogy lets you set your own log settings from member logging to command and voice logging!

+

With pogy you can fully customize logging. MEE8 lets you set your own log settings from member logging to command and voice logging!

Design Embeds

-

Pogy Allows you to make, and send embeds to any channel. You can even send it as your own webhook or save it as a Custom Command!

+

MEE8 Allows you to make, and send embeds to any channel. You can even send it as your own webhook or save it as a Custom Command!

@@ -199,14 +199,14 @@

Create Applications

-

Manage your server applications with Pogy!

+

Manage your server applications with MEE8!

Reaction Roles

-

Create your own reaction roles directly from Pogy's Dashboard!

+

Create your own reaction roles directly from MEE8's Dashboard!

diff --git a/src/dashboard/templates/maintenance.ejs b/src/dashboard/templates/maintenance.ejs index ec48ebd..9a7f652 100644 --- a/src/dashboard/templates/maintenance.ejs +++ b/src/dashboard/templates/maintenance.ejs @@ -2,7 +2,7 @@ -Maintenance +MEE8 - Maintenance @@ -14,7 +14,7 @@

Under maintenance

-

Pogy is undergoing maintenance. Please check back Later!

+

MEE8 is undergoing maintenance. Please check back Later!

Maintenance mode is enabled which means you won't able to access the dashboard

diff --git a/src/dashboard/templates/partials/mainfooter.ejs b/src/dashboard/templates/partials/mainfooter.ejs index c4b2b97..7735193 100644 --- a/src/dashboard/templates/partials/mainfooter.ejs +++ b/src/dashboard/templates/partials/mainfooter.ejs @@ -19,10 +19,10 @@