From 3cd9efcbcbcdeae38b469c5fd87e936098bea7a8 Mon Sep 17 00:00:00 2001 From: shni Date: Sat, 4 Oct 2025 00:33:39 -0500 Subject: [PATCH] feat: add send-embed command to send saved DisplayComponents blocks --- src/commands/messages/alliaces/sendEmbed.ts | 62 +++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 src/commands/messages/alliaces/sendEmbed.ts diff --git a/src/commands/messages/alliaces/sendEmbed.ts b/src/commands/messages/alliaces/sendEmbed.ts new file mode 100644 index 0000000..8127abc --- /dev/null +++ b/src/commands/messages/alliaces/sendEmbed.ts @@ -0,0 +1,62 @@ +import { CommandMessage } from "../../../core/types/commands"; +import { MessageFlags } from "discord.js"; +import { DisplayComponentUtils } from "../../../core/types/displayComponentEditor"; +import { sendComponentsV2Message } from "../../../core/api/discordAPI"; +import logger from "../../../core/lib/logger"; + +export const command: CommandMessage = { + name: "send-embed", + type: "message", + aliases: ["sendembed", "sendblock", "sendblockv2"], + cooldown: 5, + description: "Envía un bloque DisplayComponents guardado por nombre.", + category: "Alianzas", + usage: "send-embed ", + run: async (message, args, client) => { + // Requiere administrador para evitar abuso mientras se prueba + if (!message.member?.permissions.has("Administrator")) { + await message.reply("❌ No tienes permisos de Administrador."); + return; + } + + const blockName = (args[0] || "").trim(); + if (!blockName) { + await message.reply("Debes proporcionar un nombre. Uso: `!send-embed `"); + return; + } + + try { + const existingBlock = await client.prisma.blockV2Config.findFirst({ + where: { guildId: message.guild!.id, name: blockName } + }); + + if (!existingBlock) { + await message.reply(`❌ No encontré un bloque con el nombre \`${blockName}\`.`); + return; + } + + // Renderizamos usando la misma utilidad del editor (fuente: node_modules/discord.js APIs via repo util DisplayComponentUtils) + const container = await DisplayComponentUtils.renderPreview( + // @ts-ignore - guardamos BlockState como config + existingBlock.config, + message.member!, + message.guild! + ); + + // Enviamos como Components v2 (fuente: repositorio local sendComponentsV2Message) + await sendComponentsV2Message(message.channel.id, { + components: [container as any], + replyToMessageId: message.id + }); + } catch (error) { + logger.error({ err: error }, "❌ Error enviando bloque con Components v2"); + try { + await message.reply({ + content: "❌ Ocurrió un error al enviar el bloque.", + flags: MessageFlags.SuppressEmbeds + }); + } catch {} + } + } +}; +