thaldrin/src/events/message.ts

141 lines
6.4 KiB
TypeScript
Raw Normal View History

// @ts-nocheck
2021-04-09 13:17:41 +00:00
import { Client, Collection, Message, MessageEmbed } from "discord.js";
2021-04-05 00:18:27 +00:00
import Logger from "../utils/logger";
2021-04-04 15:17:46 +00:00
import supabase from "../utils/database";
2021-04-09 13:17:41 +00:00
import { Command, Server, Usage } from "../utils/types";
2021-04-06 01:11:05 +00:00
import config from "../../config";
2021-04-08 00:10:37 +00:00
import { Commands, Shortlink, SourceFinder } from "../utils/wrapper.features";
2021-04-08 18:31:30 +00:00
import lingua from "../utils/lingua";
2021-04-08 20:12:03 +00:00
import replace from "../utils/replace";
2021-04-21 00:28:07 +00:00
import chalk from "chalk";
2021-05-13 20:33:16 +00:00
import Prom from "../utils/init.prometheus";
2021-04-04 15:17:46 +00:00
export = {
name: "message",
run: async (client: Client, message: Message) => {
2021-05-13 20:33:16 +00:00
Prom.messagesSeen.inc()
2021-04-04 15:17:46 +00:00
if (message.author.bot) return
if (message.channel.type === "dm") return
2021-04-06 01:11:05 +00:00
// ! Messages seen
let { data: usage_data, error: usage_error } = await supabase.from<Usage>("usage").select().eq('name', "message")
if (usage_data?.length === 0) {
let { data: a, error: b } = await supabase.from<Usage>("usage").insert({ name: "message", type: "event" }).select()
usage_data = a
}
let { data: updated_usage_data, error } = await supabase.from<Usage>('usage').update({ amount: usage_data[0].amount + 1 }).select().eq("name", "message")
2021-04-06 01:11:05 +00:00
// ! Messages seen
// ? Check if Server exists in DB
let { data: check_data, error: check_error } = await supabase.from<Server>("servers").select().eq(`server_id`, message.guild.id).limit(1)
if (check_data?.length === 0) {
2021-04-06 01:11:05 +00:00
let { data: c, error: d } = await supabase.from<Server>('servers').insert({
server_id: message.guild?.id
})
}
// ? Get Server Config
let { data: server_data, error: server_error } = await supabase.from<Server>("servers").select().eq(`server_id`, message.guild.id).limit(1)
2021-04-06 01:11:05 +00:00
2021-04-08 00:10:37 +00:00
// ? Check if Message includes Shortlinks
2021-04-07 14:51:51 +00:00
await Shortlink(message, server_data[0].shortlinks)
2021-04-08 00:10:37 +00:00
// ? Check if Message includes E621 Image Links
2021-04-07 18:14:24 +00:00
await SourceFinder(message, server_data[0].sourcefinder)
2021-04-08 00:10:37 +00:00
// ? Check if Channel Topic allows Commands
if (await Commands(message)) return;
2021-04-07 14:51:51 +00:00
// ! Prefix
let PrefixArray: string[] = [...config.variables.prefix, [(server_data[0].prefix ? server_data[0].prefix : [])]].flat(Infinity)
2021-04-06 01:11:05 +00:00
2021-04-08 00:43:47 +00:00
let Prefix: string
let Exists: boolean
for (const p in PrefixArray) {
if (message.content.startsWith(PrefixArray[p])) {
Prefix = p
Exists = true
}
}
// ! If Prefix doesn't exist in Message Content, return
if (!Exists) return;
const args = message.content.slice(PrefixArray[Prefix].length).trim().split(/ +/g)
const command = args.shift()?.toLowerCase()
2021-04-09 13:17:41 +00:00
const cmd: Command = client.commands.find((c) => (c.name as string).toLowerCase() == command || (c.aliases && c.aliases.includes(command)))
2021-04-08 00:43:47 +00:00
if (!cmd) return;
if (!client.cooldowns.has(cmd.name)) {
client.cooldowns.set(cmd.name, new Collection())
}
const ctx = {
2021-04-08 20:12:03 +00:00
client,
2021-04-10 01:52:38 +00:00
args,
2021-04-08 20:12:03 +00:00
guild: message.guild,
message, channel: message.channel,
author: message.author,
member: message.member,
supabase,
2021-04-19 22:19:43 +00:00
settings: server_data[0],
2021-04-08 20:12:03 +00:00
config,
2021-04-10 01:52:38 +00:00
isDeveloper: config.variables.developers.find(dev => dev.id === message.author.id)
2021-04-08 00:43:47 +00:00
}
2021-04-08 20:12:03 +00:00
// ! Override Command Restrictions if Message Author is on list of Developers
// if (ctx.isDeveloper) cmd.AuthorPermissions = "NONE"
2021-04-04 15:17:46 +00:00
2021-04-08 20:12:03 +00:00
// ! If Command is NSFW and channel is not marked as such, return
if (cmd.nsfw && !ctx.channel.nsfw) return ctx.channel.send(
2021-04-22 01:33:31 +00:00
lingua[ctx.settings.locale].CHANNEL_NOT_NSFW
)
2021-04-08 18:31:30 +00:00
2021-04-22 01:33:31 +00:00
if (cmd.AuthorPermissions !== "NONE" && ctx.member?.permissions.has(cmd.AuthorPermissions)) return ctx.channel.send(replace(/PERMISSIONS/gm, cmd.AuthorPermissions.join(", "), lingua[ctx.settings.locale].INSUFFICIENT_PERMISSIONS))
2021-04-09 13:17:41 +00:00
const now = Date.now()
const timestamps = client.cooldowns.get(cmd.name)
const cooldown = (cmd.cooldown || 1) * 1000
if (timestamps.has(ctx.author.id)) {
const time = timestamps.get(ctx.author.id) + cooldown
if (now < time) {
let CooldownEmbed = new MessageEmbed()
const left = (time - now) / 1000
2021-04-22 01:33:31 +00:00
let title = replace(/COMMAND/g, cmd.name, lingua[ctx.settings.locale].ON_COOLDOWN)
let description = replace(/COMMAND/g, cmd.name, replace(/COOLDOWN/g, `${cmd.cooldown}s`, replace(/TIME/g, left, lingua[ctx.settings.locale].ON_COOLDOWN_DESCRIPTION)))
2021-04-09 13:17:41 +00:00
CooldownEmbed.setTitle(title)
.setDescription(description)
.setColor("ORANGE")
return ctx.channel.send(CooldownEmbed)
}
} else {
timestamps.set(ctx.author.id, now)
setTimeout(() => timestamps.delete(ctx.author.id), cooldown)
try {
await cmd.command(ctx)
2021-04-10 01:52:38 +00:00
// ? Check if Comnand exists in DB
let { data: usage_check_data, error: usage_check_error } = await supabase.from<Usage>("usage").select().eq(`name`, cmd.name).limit(1)
if (usage_check_data?.length == 0) {
let { data: c, error: d } = await supabase.from<Usage>('usage').insert({
name: cmd.name,
type: "command",
// amount: 1
})
}
let { data: command_usage_data, command_usage_error } = await supabase.from<Usage>('usage').update({ amount: (usage_check_data[0] || { amount: 0 }).amount + 1 }).select().eq("name", cmd.name)
Logger.info({
2021-04-21 00:28:07 +00:00
type: "command:executed",
2021-04-10 01:52:38 +00:00
command: cmd.name,
2021-04-21 00:28:07 +00:00
message: args.join(' ') || `${cmd.name} was executed in ${chalk.red('[')}${ctx.guild.name}${chalk.red(']')}(${ctx.guild?.id})`
2021-04-10 01:52:38 +00:00
})
2021-04-09 13:17:41 +00:00
} catch (error) {
2021-04-10 01:52:38 +00:00
// Logger.error(error)
console.log(error)
2021-04-22 01:33:31 +00:00
let ErrorEmbed = new MessageEmbed().setTitle(replace(/COMMAND/g, cmd.name, lingua[ctx.settings.locale].ON_ERROR)).setDescription(`\`${error.message}\`\n\n\`${error}\``).setColor("RED")
2021-04-09 13:17:41 +00:00
ctx.channel.send(ErrorEmbed)
}
}
2021-04-08 20:12:03 +00:00
2021-04-04 15:17:46 +00:00
}
}