46 lines
1.5 KiB
TypeScript
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;
|
|
}
|
|
}
|