import { DISCORD_EMOJI_SCHEMA, DISCORD_PROVIDER_EMOJI_SCHEMA, toDiscordEmoji, } from "@automate.ax/integration-contracts/discord" import * as z from "zod" import { defineAction } from "../../../automation/actions" import { getDiscordApi } from "../lib/api" interface EmojiWriteInput { emojiId?: string guildId: string imageDataUri?: string name?: string reason?: string roleIds?: null | string[] } /** Lists custom emojis in a Discord server. */ export const listDiscordEmojis = defineAction("List Discord emojis") .describe("Lists custom emoji definitions in one server.") .account("discord") .input(z.object({ guildId: z.string().regex(/^\d+$/) })) .output(DISCORD_EMOJI_SCHEMA.array()) .retry({ replaySafety: "safe" }) .handler(async ({ account, input }) => ( await getDiscordApi(account.secret).request( `guilds/${input.guildId}/emojis`, { responseSchema: DISCORD_PROVIDER_EMOJI_SCHEMA.array() }, ) ).map(toDiscordEmoji), ) /** Creates a custom emoji in a Discord server. */ export const createDiscordEmoji = defineAction("Create Discord emoji") .describe("Creates a custom emoji from a PNG, JPEG, GIF, or WebP data URI.") .account("discord") .input( z.object({ guildId: z.string().regex(/^\d+$/), imageDataUri: z.string().startsWith("data:image/"), name: z.string().trim().min(2).max(32).regex(/^\w+$/), reason: z.string().max(512).optional(), roleIds: z.string().regex(/^\d+$/).array().optional(), }), ) .output(DISCORD_EMOJI_SCHEMA) .retry({ replaySafety: "unsafe" }) .handler(async ({ account, input }) => emojiWrite(account.secret, input, "POST"), ) /** Updates a custom Discord emoji. */ export const updateDiscordEmoji = defineAction("Update Discord emoji") .describe("Changes a custom emoji name or its allowed roles.") .account("discord") .input( z.object({ emojiId: z.string().regex(/^\d+$/), guildId: z.string().regex(/^\d+$/), name: z.string().trim().min(2).max(32).regex(/^\w+$/).optional(), reason: z.string().max(512).optional(), roleIds: z.string().regex(/^\d+$/).array().nullable().optional(), }), ) .output(DISCORD_EMOJI_SCHEMA) .retry({ replaySafety: "safe" }) .handler(async ({ account, input }) => emojiWrite(account.secret, input, "PATCH"), ) /** Deletes a custom Discord emoji. */ export const deleteDiscordEmoji = defineAction("Delete Discord emoji") .describe("Deletes a custom emoji from a server.") .account("discord") .input( z.object({ emojiId: z.string().regex(/^\d+$/), guildId: z.string().regex(/^\d+$/), reason: z.string().max(512).optional(), }), ) .output(z.void()) .retry({ replaySafety: "safe" }) .handler(async ({ account, input }) => getDiscordApi(account.secret).request( `guilds/${input.guildId}/emojis/${input.emojiId}`, { method: "DELETE", reason: input.reason, responseSchema: z.void(), }, ), ) /** * Creates or updates a custom emoji. * * @param secret - Connected Discord account secret. * @param input - Normalized emoji fields. * @param method - Discord write method. */ async function emojiWrite( secret: Record, input: EmojiWriteInput, method: "PATCH" | "POST", ) { return toDiscordEmoji( await getDiscordApi(secret).request( `guilds/${input.guildId}/emojis${input.emojiId ? `/${input.emojiId}` : ""}`, { body: { image: input.imageDataUri, name: input.name, roles: input.roleIds, }, method, reason: input.reason, responseSchema: DISCORD_PROVIDER_EMOJI_SCHEMA, }, ), ) }