From d00ddbbbf5b72f13082bb33e1623d1e6fcc5e65b Mon Sep 17 00:00:00 2001 From: Supositware Date: Sun, 28 Aug 2022 17:04:31 +0200 Subject: [PATCH] Command from event message --- events/client/messageCreate.js | 392 +++++++++++++++++++++++++++++++++ 1 file changed, 392 insertions(+) create mode 100644 events/client/messageCreate.js diff --git a/events/client/messageCreate.js b/events/client/messageCreate.js new file mode 100644 index 0000000..6705848 --- /dev/null +++ b/events/client/messageCreate.js @@ -0,0 +1,392 @@ +/* TODO: + * Make this shit work. +*/ + +import { EmbedBuilder, PermissionFlagsBits } from 'discord.js'; +import db from '../../models/index.js'; +import { rand } from '../../utils/rand.js'; +const ratelimit = {}; + +import dotenv from 'dotenv'; +dotenv.config(); +const { ownerId, prefix } = process.env; +const prefixs = prefix.split(','); + +export default { + name: 'messageCreate', + async execute(message, client) { + if (message.partials) { + await message.fetch(); + } + + if (message.author.bot) return; + + /* Autoresponse feature & tag + * + * This section contains autoresponse and tag feature + * + */ + + // auto responses + if (message.guild) { + const autoresponseStat = await db.autoresponseStat.findOne({ where: { serverID: message.guild.id, stat: 'enable' } }); + if (autoresponseStat) { + // Infinite haha very yes + if (message.content.toLowerCase().startsWith('haha very') && message.content.toLowerCase().endsWith('yes')) { + let yes = message.content.toLowerCase().replace('haha', ''); + yes = yes.replace('yes', ''); + yes += 'very'; + return message.channel.send(`haha${yes} yes`); + } + else if (message.content.toLowerCase() == 'haha yes') { + return message.channel.send('haha very yes'); + } + + // Reply with images as attachement + const autoresponse = await db.autoresponse.findOne({ where: { trigger: message.content.toLowerCase() } }); + + if (autoresponse) { + db.autoresponse.findOne({ where: { trigger: message.content.toLowerCase() } }); + const trigger = autoresponse.get('trigger'); + const type = autoresponse.get('type'); + const content = autoresponse.get('response'); + + if (trigger == message.content.toLowerCase() && type == 'text') { + return message.channel.send(content); + } + else if (trigger == message.content.toLowerCase() && type == 'react') { + return message.react(content); + } + else if (trigger == message.content.toLowerCase() && type == 'image') { + return message.channel.send({ files: [content] }); + } + } + } + + // User autoresponse + const tag = await db.Tag.findOne({ where: { trigger: message.content.toLowerCase(), serverID: message.guild.id } }); + if (tag) { + db.Tag.findOne({ where: { trigger: message.content.toLowerCase(), serverID: message.guild.id } }); + let text = tag.get('response'); + if (text.includes('[ban]')) { + message.member.ban('Tag ban :^)'); + } + else if (text.includes('[kick]')) { + message.member.kick('Tag kick :^)'); + } + else if (text.includes('[delete]')) { + message.delete(); + } + + text = rand.random(text, message); + + let attach = ''; + + if (text.includes('[attach:')) { + attach = text.split(/(\[attach:.*?])/); + for (let i = 0, l = attach.length; i < l; i++) { + if (attach[i].includes('[attach:')) { + attach = attach[i].replace('[attach:', '').slice(0, -1); + i = attach.length; + } + } + text = text.replace(/(\[attach:.*?])/, ''); + } + + // THIS SECTION IS VERY VERY BAD MUST CHANGE + if (text.includes('[embed]')) { + text = text.replace(/\[embed\]/, ' '); + + let title = ''; + let desc = ''; + let image; + let thumbnail; + let footer = ''; + let color; + + if (text.includes('[embedImage:')) { + image = text.split(/(\[embedImage:.*?])/); + + for (let i = 0, l = image.length; i < l; i++) { + if (image[i].includes('[embedImage:')) { + image = image[i].replace('[embedImage:', '').slice(0, -1); + text = text.replace(/(\[embedimage:.*?])/g, ''); + i = image.length; + } + } + } + + if (text.includes('[embedThumbnail:')) { + thumbnail = text.split(/(\[embedThumbnail:.*?])/); + + for (let i = 0, l = thumbnail.length; i < l; i++) { + if (thumbnail[i].includes('[embedThumbnail:')) { + thumbnail = thumbnail[i].replace('[embedThumbnail:', '').slice(0, -1); + text = text.replace(/(\[embedThumbnail:.*?])/g, ''); + i = thumbnail.length; + } + } + } + + if (text.includes('[embedColor:')) { + color = text.split(/(\[embedColor:.*?])/); + for (let i = 0, l = color.length; i < l; i++) { + if (color[i].includes('[embedColor:')) { + color = color[i].replace('[embedColor:', '').slice(0, -1); + text = text.replace(/(\[embedColor:.*?])/g, ''); + i = color.length; + } + } + } + + + if (text.includes('[embedTitle:')) { + title = text.split(/(\[embedTitle:.*?])/); + for (let i = 0, l = title.length; i < l; i++) { + if (title[i].includes('[embedTitle:')) { + title = title[i].replace('[embedTitle:', '').slice(0, -1); + text = text.replace(/(\[embedTitle:.*?])/g, ''); + i = title.length; + } + } + } + + if (text.includes('[embedFooter:')) { + footer = text.split(/(\[embedFooter:.*?])/); + for (let i = 0, l = footer.length; i < l; i++) { + if (footer[i].includes('[embedFooter:')) { + footer = footer[i].replace('[embedFooter:', '').slice(0, -1); + text = text.replace(/(\[embedFooter:.*?])/g, ''); + i = footer.length; + } + } + } + + if (text.includes('[embedDesc:')) { + desc = text.split(/(\[embedDesc:.*?])/); + for (let i = 0, l = desc.length; i < l; i++) { + if (desc[i].includes('[embedDesc:')) { + desc = desc[i].replace('[embedDesc:', '').slice(0, -1); + i = desc.length; + } + } + } + + const embed = new EmbedBuilder() + .setColor(color) + .setTitle(title) + .setImage(image) + .setThumbnail(thumbnail) + .setDescription(desc) + .setFooter(footer) + .setTimestamp(); + + + if (attach) { + return message.channel.send(embed, { files: [attach] }); + } + else { + return message.channel.send(embed); + + } + + } + if (attach) { + return message.channel.send(text, { files: [attach] }); + } + else { + return message.channel.send(text); + } + + } + + /* Quotation feature + * + * This section will contain the code for the quotation feature, it will detect link for it and send it as embed + * + */ + const quotationstat = await db.quotationStat.findOne({ where: { serverID: message.guild.id, stat: 'enable' } }); + + if (quotationstat && (message.content.includes('discordapp.com/channels/') || message.content.includes('discord.com/channels/'))) { + const url = message.content.split('/'); + const guildID = url[4]; + const channelID = url[5]; + const messageID = url[6].split(' ')[0]; + + + // Verify if the guild, channel and message exist + const guild = client.guilds.resolve(guildID); + if (!guild) return; + const channel = client.channels.resolve(channelID); + if (!channel) return; + const quote = await channel.messages.fetch(messageID) + .catch(() => { + return; + }); + if (!quote) return; + + const Embed = new EmbedBuilder() + .setAuthor({ name: quote.author.username, iconURL: quote.author.displayAvatarURL() }) + .setColor(message.member ? message.member.displayHexColor : 'NAVY') + .addFields( + { name: 'Jump to', value: `[message](https://discordapp.com/channels/${message.guild.id}/${channelID}/${messageID})`, inline: true }, + { name: 'In channel', value: quote.channel.name.toString(), inline: true }, + { name: 'Quoted by', value: message.author.toString(), inline: true }, + ) + .setDescription(quote.content) + .setTimestamp(quote.createdTimestamp); + + if (quote.member) Embed.setAuthor({ name: `${quote.author.username}#${quote.author.discriminator}`, iconURL: quote.author.displayAvatarURL() }); + + if (quote.author.bot) Embed.setAuthor({ name: `${quote.author.username}#${quote.author.discriminator} (BOT)`, iconURL: quote.author.displayAvatarURL() }); + + if (guild.id != message.guild.id) Embed.addFields({ name: 'In guild', value: guild.name, inline: true }); + const Attachment = Array.from(message.attachments.values()); + if (Attachment[0]) Embed.setImage(Attachment[0].url); + + return message.channel.send({ embeds: [Embed] }); + } + } + + // Command handling from message + + let hasPrefix = false; + prefixs.forEach(p => { + if (message.content.toLowerCase().startsWith(p)) { + hasPrefix = true; + } + }); + + if (!hasPrefix) return; + + const messageArray = message.content.match(/"[^"]*"|\S+/g).map(m => m.slice(0, 1) === '"' ? m.slice(1, -1) : m); + const commandName = messageArray[1].toLowerCase(); + let messageArgs = messageArray.splice(2, messageArray.length); + + const globalBlacklist = await db.Blacklists.findOne({ where: { type:'global', uid:message.author.id } }); + const commandBlacklist = await db.Blacklists.findOne({ where: { type:commandName, uid:message.author.id } }); + + if (globalBlacklist) { + return message.reply({ content: `You are globally blacklisted for the following reason: \`${globalBlacklist.reason}\``, ephemeral: true }); + } + else if (commandBlacklist) { + return message.reply({ content: `You are blacklisted for the following reason: \`${commandBlacklist.reason}\``, ephemeral: true }); + } + + const userTag = message.author.tag; + const userID = message.author.id; + + const command = client.commands.get(commandName); + + if (!command) return; + + console.log(`\x1b[33m${userTag} (${userID})\x1b[0m launched command \x1b[33m${commandName}\x1b[0m`); + + // Owner only check + if (command.ownerOnly && message.author.id !== ownerId) { + return message.reply({ content: '❌ This command is reserved for the owner!', ephemeral: true }); + } + + // Check if the bot has the needed permissions + if (command.clientPermissions) { + const clientMember = await message.guild.members.fetch(client.user.id); + if (!clientMember.permissions.has(command.clientPermissions)) { + return message.reply({ content: `❌ I am missing one of the following permission(s): \`${new PermissionFlagsBits(command.clientPermissions).toArray()}\``, ephemeral: true }); + } + } + + // Check if the user has the needed permissions + if (command.userPermissions) { + if (!message.member.permissions.has(command.userPermissions)) { + return message.reply({ content: `❌ You are missing one of the following permission(s): \`${new PermissionFlagsBits(command.userPermissions).toArray()}\``, ephemeral: true }); + } + } + + try { + const date = new Date(); + if (ratelimit[userID]) { + if (ratelimit[userID].cooldown) { + if (commandName === ratelimit[userID].command && date > ratelimit[userID].cooldown) { + ratelimit[userID].limit = 0; + ratelimit[userID].cooldown = undefined; + } + } + + if (commandName === ratelimit[userID].command && command.ratelimit === ratelimit[userID].limit) { + return await message.reply({ content: `You are being rate limited. You can try again in ${Math.floor((ratelimit[userID].cooldown - date) / 1000)} seconds.`, ephemeral: true }); + + } + } + if (command.ratelimit) { + ratelimit[userID] = { command: commandName, limit: ratelimit[userID] ? ratelimit[userID].limit + 1 : 1 }; + if (command.ratelimit === ratelimit[userID].limit) { + date.setSeconds(date.getSeconds() + command.cooldown); + + ratelimit[userID] = { command: commandName, limit: ratelimit[userID].limit, cooldown: date }; + } + } + message.user = message.author; + message.isMessage = true; + + let waitingmsg; + const toDelete = []; + message.deferReply = async function() { + waitingmsg = await message.reply('The bot is thinking...'); + }; + message.followUp = async function(payload) { + if (payload.ephemeral) { + toDelete.push(await message.channel.send(payload)); + } + else { + await message.channel.send(payload); + } + }; + message.editReply = async function(payload) { + if (waitingmsg) { + await waitingmsg.delete(); + } + await message.channel.send(payload); + }; + message.deleteReply = async function() { + if (waitingmsg) { + await waitingmsg.delete() + .catch(() => { return; }); + } + }; + message.cleanUp = async function() { + toDelete.forEach(async msg => { + msg.delete(); + }); + }; + + if (command.data.options.length > 0) { + // if (command.data.options.length === 1 || command.data.options[command.data.options.length - 1].constructor.name.toLowerCase().includes('attachment')) { + if (command.data.options.length === 1) { + const test = messageArgs.join(' '); + messageArgs = []; + messageArgs.push(test); + } + + for (let i = 0; i < messageArgs.length; i++) { + const constructorName = command.data.options[i].constructor.name.toLowerCase(); + if (constructorName.includes('boolean')) { + messageArgs[i] = (messageArgs[i].toLowerCase() === 'true'); + } + + if (constructorName.includes('mentionable')) { + messageArgs[i] = message.mentions.members.first(); + } + } + if (message.attachments) { + messageArgs.push(Array.from(message.attachments.values())[0]); + } + } + + await command.execute(message, messageArgs, client); + } + catch (error) { + console.error(error); + await message.reply({ content: 'There was an error while executing this command!', ephemeral: true }); + } + }, +};