feat: add discord reaction tool

This commit is contained in:
Peter Steinberger
2026-01-02 00:29:32 +01:00
parent 9180cbe821
commit 7f3113b8d4
7 changed files with 94 additions and 4 deletions

View File

@@ -29,6 +29,11 @@ export type DiscordSendResult = {
channelId: string;
};
export type DiscordReactOpts = {
token?: string;
rest?: REST;
};
function resolveToken(explicit?: string) {
const cfgToken = loadConfig().discord?.token;
const token = normalizeDiscordToken(
@@ -42,6 +47,16 @@ function resolveToken(explicit?: string) {
return token;
}
function normalizeReactionEmoji(raw: string) {
const trimmed = raw.trim();
if (!trimmed) {
throw new Error("emoji required");
}
const customMatch = trimmed.match(/^<a?:([^:>]+):(\d+)>$/);
const identifier = customMatch ? `${customMatch[1]}:${customMatch[2]}` : trimmed;
return encodeURIComponent(identifier);
}
function parseRecipient(raw: string): DiscordRecipient {
const trimmed = raw.trim();
if (!trimmed) {
@@ -164,3 +179,16 @@ export async function sendMessageDiscord(
channelId: String(result.channel_id ?? channelId),
};
}
export async function reactMessageDiscord(
channelId: string,
messageId: string,
emoji: string,
opts: DiscordReactOpts = {},
) {
const token = resolveToken(opts.token);
const rest = opts.rest ?? new REST({ version: "10" }).setToken(token);
const encoded = normalizeReactionEmoji(emoji);
await rest.put(Routes.channelMessageReaction(channelId, messageId, encoded));
return { ok: true };
}