zappyzep/backend/src/plugins/Automod/triggers/matchInvites.ts
2024-11-02 14:55:29 +02:00

79 lines
3 KiB
TypeScript

import z from "zod";
import { getInviteCodesInString, GuildInvite, isGuildInvite, resolveInvite, zSnowflake } from "../../../utils";
import { getTextMatchPartialSummary } from "../functions/getTextMatchPartialSummary";
import { MatchableTextType, matchMultipleTextTypesOnMessage } from "../functions/matchMultipleTextTypesOnMessage";
import { automodTrigger } from "../helpers";
interface MatchResultType {
type: MatchableTextType;
code: string;
invite?: GuildInvite;
}
const configSchema = z.strictObject({
include_guilds: z.array(zSnowflake).max(255).optional(),
exclude_guilds: z.array(zSnowflake).max(255).optional(),
include_invite_codes: z.array(z.string().max(32)).max(255).optional(),
exclude_invite_codes: z.array(z.string().max(32)).max(255).optional(),
allow_group_dm_invites: z.boolean().default(false),
match_messages: z.boolean().default(true),
match_embeds: z.boolean().default(false),
match_visible_names: z.boolean().default(false),
match_usernames: z.boolean().default(false),
match_nicknames: z.boolean().default(false),
match_custom_status: z.boolean().default(false),
});
export const MatchInvitesTrigger = automodTrigger<MatchResultType>()({
configSchema,
async match({ pluginData, context, triggerConfig: trigger }) {
if (!context.message) {
return;
}
for await (const [type, str] of matchMultipleTextTypesOnMessage(pluginData, trigger, context.message)) {
const inviteCodes = getInviteCodesInString(str);
if (inviteCodes.length === 0) continue;
const uniqueInviteCodes = Array.from(new Set(inviteCodes));
for (const code of uniqueInviteCodes) {
if (trigger.include_invite_codes && trigger.include_invite_codes.includes(code)) {
return { extra: { type, code } };
}
if (trigger.exclude_invite_codes && !trigger.exclude_invite_codes.includes(code)) {
return { extra: { type, code } };
}
}
for (const code of uniqueInviteCodes) {
const invite = await resolveInvite(pluginData.client, code);
if (!invite || !isGuildInvite(invite)) return { extra: { type, code } };
if (trigger.include_guilds && trigger.include_guilds.includes(await zSnowflake.parseAsync(invite.guild.id))) {
return { extra: { type, code, invite } };
}
if (trigger.exclude_guilds && !trigger.exclude_guilds.includes(await zSnowflake.parseAsync(invite.guild.id))) {
return { extra: { type, code, invite } };
}
}
}
return null;
},
renderMatchInformation({ pluginData, contexts, matchResult }) {
let matchedText;
if (matchResult.extra.invite) {
const invite = matchResult.extra.invite as GuildInvite;
matchedText = `invite code \`${matchResult.extra.code}\` (**${invite.guild.name}**, \`${invite.guild.id}\`)`;
} else {
matchedText = `invite code \`${matchResult.extra.code}\``;
}
const partialSummary = getTextMatchPartialSummary(pluginData, matchResult.extra.type, contexts[0]);
return `Matched ${matchedText} in ${partialSummary}`;
},
});