3
0
Fork 0
mirror of https://github.com/ZeppelinBot/Zeppelin.git synced 2025-05-25 10:25:01 +00:00
zeppelin/backend/src/plugins/InternalPoster/functions/getOrCreateWebhookForChannel.ts
2022-06-13 14:24:50 +01:00

50 lines
1.7 KiB
TypeScript

import { GuildPluginData } from "knub";
import { InternalPosterPluginType } from "../types";
import { GuildTextBasedChannel, Permissions, ThreadChannel } from "discord.js";
import { isDiscordAPIError } from "../../../utils";
type WebhookInfo = [id: string, token: string];
export async function getOrCreateWebhookForChannel(
pluginData: GuildPluginData<InternalPosterPluginType>,
channel: Exclude<GuildTextBasedChannel, ThreadChannel>,
): Promise<WebhookInfo | null> {
// tslint:disable-next-line:no-console FIXME: Here for debugging purposes
console.log(`getOrCreateWebhookForChannel(${channel.id})`);
// Database cache
const fromDb = await pluginData.state.webhooks.findByChannelId(channel.id);
if (fromDb) {
return [fromDb.id, fromDb.token];
}
if (pluginData.state.missingPermissions) {
return null;
}
// Create new webhook
const member = pluginData.client.user && pluginData.guild.members.cache.get(pluginData.client.user.id);
if (!member || member.permissions.has(Permissions.FLAGS.MANAGE_WEBHOOKS)) {
try {
const webhook = await channel.createWebhook(`Zephook ${channel.id}`);
await pluginData.state.webhooks.create({
id: webhook.id,
guild_id: pluginData.guild.id,
channel_id: channel.id,
token: webhook.token!,
});
return [webhook.id, webhook.token!];
} catch (err) {
// tslint:disable-next-line:no-console
console.warn(`Error when trying to create webhook for ${pluginData.guild.id}/${channel.id}: ${err.message}`);
if (isDiscordAPIError(err) && err.code === 50013) {
pluginData.state.missingPermissions = true;
}
return null;
}
}
return null;
}