scythe/src/events/members.ts

73 lines
2.0 KiB
TypeScript

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",
});
}
}
}