Skip to content

Built for people who want to own their automations. Join the waitlist for an invite.

Package listing

@kody/discord

src/edit-message.ts

49 lines · 1.7 KB · TypeScript
import { discordBotRequest } from './bot.ts'
import { inputRecord, requireLiveMutation, snowflake } from './validation.ts'

type EditedMessage = {
	id?: string
	channel_id?: string
	content?: string
	edited_timestamp?: string | null
}

/**
 * Edit a bot-authored Discord message in place.
 *
 * Only messages posted by the same bot can be edited. Pass `dryRun: true` to
 * preview, or `confirm: true` to send the PATCH.
 *
 * @param params.secretName - Bot-token secret; default `discordBotToken`.
 */
export default async function editMessage(params: Record<string, unknown> = {}) {
	const input = inputRecord(params)
	const channelId = snowflake(input, 'channelId', ['channel_id'])
	const messageId = snowflake(input, 'messageId', ['message_id'])
	const content = typeof input.content === 'string' ? input.content : null
	const embeds = Array.isArray(input.embeds) ? (input.embeds as unknown[]).slice(0, 10) : null
	if (content == null && embeds == null) {
		throw new Error('content or embeds is required.')
	}

	const body: Record<string, unknown> = { allowed_mentions: { replied_user: false } }
	if (content != null) body.content = content
	if (embeds != null) body.embeds = embeds
	const path = '/channels/' + channelId + '/messages/' + messageId

	if (requireLiveMutation(input, 'edit-message') === 'dryRun') {
		return { dryRun: true, channelId, messageId, path, body }
	}

	const response = (await discordBotRequest(path, input, {
		method: 'PATCH',
		body: JSON.stringify(body),
	})) as EditedMessage

	return {
		id: response.id ?? messageId,
		channelId: response.channel_id || channelId,
		content: response.content ?? content,
		editedTimestamp: response.edited_timestamp ?? null,
	}
}