import type { TextChannel } from "discord.js"; import { Client, Discord, On, type ArgsOf } from "discordx"; import db from "../db"; import { byeTable, colonTable, greetsTable } from "../db/schema"; import { eq } from "drizzle-orm"; @Discord() export class MemberEvents { @On({ event: "guildMemberAdd" }) async memberAdd([member]: ArgsOf<"guildMemberAdd">, client: Client) { const greetRes = await db .select() .from(greetsTable) .where(eq(greetsTable.guild, member.guild.id)); if (greetRes.length > 0) { const channel = client.channels.cache.get( greetRes[0].channel, ) as TextChannel; await channel.send( greetRes[0].message.replace("{user}", `<@${member.user.id}>`), ); } if (member.user.bot) { const botRole = member.guild.roles.cache.get(Bun.env.BOT_ROLE!); if (botRole) { await member.roles.add(botRole); } } else { if(Date.now() - member.user.createdAt.getTime() < 1000 * 60 * 60 * 24 * 7) { try { await member.send("to protect against raids, bots, and other disturbances, accounts under a week old are kicked upon joining. please wait for your account to mature before rejoining.") } catch(_) {} await member.kick("account less than week old") return; } await db.insert(colonTable).values({ user: member.id, amount: 0, messages_count: 0, }); } } @On({ event: "guildMemberRemove" }) async memberRemove([member]: ArgsOf<"guildMemberRemove">, client: Client) { const byeRes = await db .select() .from(byeTable) .where(eq(byeTable.guild, member.guild.id)); if (byeRes.length > 0) { const channel = client.channels.cache.get( byeRes[0].channel, ) as TextChannel; await channel.send( byeRes[0].message.replace("{user}", `${member.user.username}`), ); } await db.delete(colonTable).where(eq(colonTable.user, member.id)); } @On({ event: "guildMemberUpdate" }) async memberUpdate([_, newM]: ArgsOf<"guildMemberUpdate">) { if (newM.roles.cache.get(Bun.env.BAD_ROLE!)) { await newM.ban({ reason: "youngin", }); } } }