zappyzep/backend/src/plugins/ModActions/functions/isBanned.ts
2024-11-02 14:55:29 +02:00

46 lines
1.5 KiB
TypeScript

import { PermissionsBitField, Snowflake } from "discord.js";
import { GuildPluginData } from "knub";
import { isDiscordAPIError, isDiscordHTTPError, SECONDS, sleep } from "../../../utils";
import { hasDiscordPermissions } from "../../../utils/hasDiscordPermissions";
import { LogsPlugin } from "../../Logs/LogsPlugin";
import { ModActionsPluginType } from "../types";
export async function isBanned(
pluginData: GuildPluginData<ModActionsPluginType>,
userId: string,
timeout: number = 5 * SECONDS,
): Promise<boolean> {
const botMember = pluginData.guild.members.cache.get(pluginData.client.user!.id);
if (botMember && !hasDiscordPermissions(botMember.permissions, PermissionsBitField.Flags.BanMembers)) {
pluginData.getPlugin(LogsPlugin).logBotAlert({
body: `Missing "Ban Members" permission to check for existing bans`,
});
return false;
}
try {
const potentialBan = await Promise.race([
pluginData.guild.bans.fetch({ user: userId as Snowflake }).catch(() => null),
sleep(timeout),
]);
return potentialBan != null;
} catch (e) {
if (isDiscordAPIError(e) && e.code === 10026) {
// [10026]: Unknown Ban
return false;
}
if (isDiscordHTTPError(e) && e.code === 500) {
// Internal server error, ignore
return false;
}
if (isDiscordAPIError(e) && e.code === 50013) {
pluginData.getPlugin(LogsPlugin).logBotAlert({
body: `Missing "Ban Members" permission to check for existing bans`,
});
}
throw e;
}
}