import { discordBotRequest } from './bot.ts' import { inputRecord, pickString, requireLiveMutation, snowflake } from './validation.ts' function reactionEmoji(input: Record): string { const explicit = pickString(input.emoji, input.reaction) if (explicit) return explicit const name = pickString(input.emojiName, input.emoji_name, input.name) const id = pickString(input.emojiId, input.emoji_id, input.id) if (name && id) return name + ':' + id if (name) return name throw new Error('emoji or emojiName is required.') } /** * Add one bot reaction to a Discord message. * * Discord rate-limits this endpoint aggressively. Add multiple reactions * sequentially and retry HTTP 429 after `retry_after`. Pass `dryRun: true` to * preview, or `confirm: true` to send. * * @param params.secretName - Bot-token secret; default `discordBotToken`. */ export default async function addReaction(params: Record = {}) { const input = inputRecord(params) const channelId = snowflake(input, 'channelId', ['channel_id']) const messageId = snowflake(input, 'messageId', ['message_id']) const emoji = reactionEmoji(input) const path = '/channels/' + channelId + '/messages/' + messageId + '/reactions/' + encodeURIComponent(emoji) + '/@me' if (requireLiveMutation(input, 'add-reaction') === 'dryRun') { return { dryRun: true, channelId, messageId, emoji, path } } await discordBotRequest(path, input, { method: 'PUT' }) return { ok: true, channelId, messageId, emoji } }