DISCORD_SEND_EMBED - Enviar Mensagem Embed Formatada no Discord
O que é este Node?
O DISCORD_SEND_EMBED é o node responsável por enviar mensagens com formatação rica no Discord usando embeds, que são blocos de conteúdo visualmente estruturados com títulos, descrições, campos, cores, imagens e muito mais.
Por que este Node existe?
Embeds permitem criar mensagens profissionais, organizadas e visualmente atrativas no Discord. O DISCORD_SEND_EMBED existe para:
- Apresentação Profissional: Criar mensagens com aparência polida e estruturada
- Organização de Informações: Apresentar dados em campos separados e hierarquizados
- Identidade Visual: Usar cores, logos e imagens para branding
- Conteúdo Rico: Incluir thumbnails, imagens, footers, timestamps e links
Como funciona internamente?
Quando o DISCORD_SEND_EMBED é executado, o sistema:
- Valida Autenticação: Verifica webhook URL ou bot token
- Valida Embed: Garante que pelo menos o título do embed está presente
- Constrói Embed: Monta objeto embed com title, description, color, fields, author, footer, images
- Prepara Payload: Cria JSON com array de embeds e content opcional
- Envia Requisição: POST para webhook URL ou API do Discord
- Processa Resposta: Retorna dados da mensagem incluindo embed renderizado
- Trata Erros: Lida com erros de validação, autenticação e rate limits
Código interno (discord-executor.service.ts:302-328):
private async sendEmbed(data: DiscordNodeData): Promise<any> {
const payload: any = {
embeds: [this.buildEmbed(data.embed!)],
content: data.content || null
};
if (data.authType === 'webhook') {
if (data.username) payload.username = data.username;
if (data.avatarUrl) payload.avatar_url = data.avatarUrl;
if (data.threadId) payload.thread_id = data.threadId;
const response: AxiosResponse = await axios.post(data.webhookUrl!, payload);
return response.data;
} else {
const response: AxiosResponse = await axios.post(
`${this.DISCORD_API_BASE}/channels/${data.channelId}/messages`,
payload,
{
headers: {
'Authorization': `Bot ${data.botToken}`,
'Content-Type': 'application/json'
}
}
);
return response.data;
}
}
Construtor de Embed (discord-executor.service.ts:420-458):
private buildEmbed(embedData: NonNullable<DiscordNodeData['embed']>): any {
const embed: any = {};
if (embedData.title) embed.title = embedData.title;
if (embedData.description) embed.description = embedData.description;
if (embedData.color !== undefined) embed.color = embedData.color;
if (embedData.timestamp) embed.timestamp = embedData.timestamp;
if (embedData.author) {
embed.author = {};
if (embedData.author.name) embed.author.name = embedData.author.name;
if (embedData.author.url) embed.author.url = embedData.author.url;
if (embedData.author.iconUrl) embed.author.icon_url = embedData.author.iconUrl;
}
if (embedData.footer) {
embed.footer = {};
if (embedData.footer.text) embed.footer.text = embedData.footer.text;
if (embedData.footer.iconUrl) embed.footer.icon_url = embedData.footer.iconUrl;
}
if (embedData.fields && embedData.fields.length > 0) {
embed.fields = embedData.fields.map(field => ({
name: field.name,
value: field.value,
inline: field.inline || false
}));
}
if (embedData.image?.url) {
embed.image = { url: embedData.image.url };
}
if (embedData.thumbnail?.url) {
embed.thumbnail = { url: embedData.thumbnail.url };
}
return embed;
}
Quando você DEVE usar este Node?
Use DISCORD_SEND_EMBED sempre que precisar de mensagens com formatação rica e estruturada:
Casos de uso
- Notificações de Status: "Exibir status de deploy com cor verde/vermelho e campos de versão, autor, timestamp"
- Dashboards: "Criar card com métricas diárias: vendas, usuários ativos, receita"
- Perfis de Usuário: "Mostrar informações de usuário com avatar, nome, cargo, data de entrada"
- Tickets de Suporte: "Criar embed com detalhes do ticket: ID, categoria, prioridade, status"
- Anúncios: "Publicar anúncio com título grande, descrição, imagem de banner e footer"
Quando NÃO usar DISCORD_SEND_EMBED
- Mensagens Simples: Use
DISCORD_SEND_MESSAGEpara texto simples sem formatação - Envio de Arquivos: Use
DISCORD_SEND_FILEquando precisar anexar documentos - Editar Embeds: Use
DISCORD_EDIT_MESSAGEpara modificar embed existente - Múltiplos Embeds: Limite de 10 embeds por mensagem (considere dividir)
Parâmetros Detalhados
operation (string, obrigatório)
O que é: Define a operação como envio de embed.
Valor: "send_embed"
Flow completo para testar:
{
"name": "Teste Discord - Send Embed",
"nodes": [
{
"id": "start_1",
"type": "start",
"position": { "x": 100, "y": 100 },
"data": { "label": "Início" }
},
{
"id": "discord_1",
"type": "discord",
"position": { "x": 300, "y": 100 },
"data": {
"label": "Enviar Embed",
"parameters": {
"operation": "send_embed",
"authType": "webhook",
"webhookUrl": "https://discord.com/api/webhooks/SEU_WEBHOOK",
"embed": {
"title": "Meu Primeiro Embed",
"description": "Este é um embed de teste!",
"color": 5814783
}
}
}
},
{
"id": "message_1",
"type": "message",
"position": { "x": 500, "y": 100 },
"data": {
"label": "Confirmar",
"parameters": {
"message": "Embed enviado com sucesso!"
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 700, "y": 100 },
"data": { "label": "Fim" }
}
],
"edges": [
{ "source": "start_1", "target": "discord_1" },
{ "source": "discord_1", "target": "message_1" },
{ "source": "message_1", "target": "end_1" }
]
}
Teste: Execute o flow e verifique o embed colorido no Discord.
embed.title (string, obrigatório)
O que é: Título principal do embed, exibido em negrito no topo.
Limite: 256 caracteres
Flow completo para testar:
{
"name": "Teste Discord - Embed Title",
"nodes": [
{
"id": "start_1",
"type": "start",
"position": { "x": 100, "y": 100 },
"data": { "label": "Início" }
},
{
"id": "input_1",
"type": "input",
"position": { "x": 300, "y": 100 },
"data": {
"label": "Digite o Título",
"parameters": {
"message": "Qual será o título do embed?",
"variableName": "embedTitle"
}
}
},
{
"id": "discord_1",
"type": "discord",
"position": { "x": 500, "y": 100 },
"data": {
"label": "Criar Embed",
"parameters": {
"operation": "send_embed",
"authType": "webhook",
"webhookUrl": "https://discord.com/api/webhooks/SEU_WEBHOOK",
"embed": {
"title": "{{embedTitle}}",
"description": "Título personalizado definido pelo usuário",
"color": 3447003
}
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 700, "y": 100 },
"data": { "label": "Fim" }
}
],
"edges": [
{ "source": "start_1", "target": "input_1" },
{ "source": "input_1", "target": "discord_1" },
{ "source": "discord_1", "target": "end_1" }
]
}
Teste: Digite um título quando solicitado. O embed no Discord exibirá seu título em destaque.
embed.description (string, opcional)
O que é: Texto descritivo abaixo do título. Suporta markdown.
Limite: 4096 caracteres
Flow completo para testar:
{
"name": "Teste Discord - Embed Description",
"nodes": [
{
"id": "start_1",
"type": "start",
"position": { "x": 100, "y": 100 },
"data": { "label": "Início" }
},
{
"id": "discord_1",
"type": "discord",
"position": { "x": 300, "y": 100 },
"data": {
"label": "Embed com Descrição",
"parameters": {
"operation": "send_embed",
"authType": "webhook",
"webhookUrl": "https://discord.com/api/webhooks/SEU_WEBHOOK",
"embed": {
"title": "Relatório de Vendas",
"description": "**Período:** Janeiro 2025\n\n📊 Análise detalhada das vendas:\n\n• Total de vendas: **152**\n• Receita: **R$ 45.890,00**\n• Ticket médio: **R$ 301,90**\n\n*Dados atualizados automaticamente*",
"color": 5763719
}
}
}
},
{
"id": "message_1",
"type": "message",
"position": { "x": 500, "y": 100 },
"data": {
"label": "Confirmar",
"parameters": {
"message": "Relatório enviado!"
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 700, "y": 100 },
"data": { "label": "Fim" }
}
],
"edges": [
{ "source": "start_1", "target": "discord_1" },
{ "source": "discord_1", "target": "message_1" },
{ "source": "message_1", "target": "end_1" }
]
}
Teste: O embed mostrará descrição formatada com negrito, itálico e quebras de linha.
embed.color (number, opcional)
O que é: Cor da barra lateral do embed em formato decimal (converter hex para decimal).
Formato: Número decimal (ex: 5814783 = #58A5FF azul)
Cores comuns: - Verde: 5763719 (#57F287) - Vermelho: 15548997 (#ED4245) - Azul: 5793266 (#5865F2) - Amarelo: 16776960 (#FFFF00) - Roxo: 10181046 (#9B59B6)
Flow completo para testar:
{
"name": "Teste Discord - Embed Color",
"nodes": [
{
"id": "start_1",
"type": "start",
"position": { "x": 100, "y": 100 },
"data": { "label": "Início" }
},
{
"id": "discord_1",
"type": "discord",
"position": { "x": 300, "y": 50 },
"data": {
"label": "Sucesso (Verde)",
"parameters": {
"operation": "send_embed",
"authType": "webhook",
"webhookUrl": "https://discord.com/api/webhooks/SEU_WEBHOOK",
"embed": {
"title": "✅ Operação Bem-Sucedida",
"description": "Todos os processos foram concluídos com sucesso!",
"color": 5763719
}
}
}
},
{
"id": "discord_2",
"type": "discord",
"position": { "x": 300, "y": 150 },
"data": {
"label": "Erro (Vermelho)",
"parameters": {
"operation": "send_embed",
"authType": "webhook",
"webhookUrl": "https://discord.com/api/webhooks/SEU_WEBHOOK",
"embed": {
"title": "❌ Erro Crítico",
"description": "Falha na conexão com o banco de dados.",
"color": 15548997
}
}
}
},
{
"id": "discord_3",
"type": "discord",
"position": { "x": 300, "y": 250 },
"data": {
"label": "Info (Azul)",
"parameters": {
"operation": "send_embed",
"authType": "webhook",
"webhookUrl": "https://discord.com/api/webhooks/SEU_WEBHOOK",
"embed": {
"title": "ℹ️ Informação",
"description": "Nova atualização disponível.",
"color": 5793266
}
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 500, "y": 150 },
"data": { "label": "Fim" }
}
],
"edges": [
{ "source": "start_1", "target": "discord_1" },
{ "source": "discord_1", "target": "discord_2" },
{ "source": "discord_2", "target": "discord_3" },
{ "source": "discord_3", "target": "end_1" }
]
}
Teste: Três embeds com cores diferentes (verde, vermelho, azul) serão enviados.
embed.fields (array, opcional)
O que é: Array de campos estruturados com nome e valor. Campos podem ser inline (lado a lado).
Limite: 25 campos por embed
Estrutura:
{
"name": "Nome do Campo",
"value": "Valor do campo",
"inline": true
}
Flow completo para testar:
{
"name": "Teste Discord - Embed Fields",
"nodes": [
{
"id": "start_1",
"type": "start",
"position": { "x": 100, "y": 100 },
"data": { "label": "Início" }
},
{
"id": "discord_1",
"type": "discord",
"position": { "x": 300, "y": 100 },
"data": {
"label": "Status do Sistema",
"parameters": {
"operation": "send_embed",
"authType": "webhook",
"webhookUrl": "https://discord.com/api/webhooks/SEU_WEBHOOK",
"embed": {
"title": "🖥️ Status dos Servidores",
"description": "Monitoramento em tempo real",
"color": 5763719,
"fields": [
{
"name": "🌐 Web Server",
"value": "✅ Online",
"inline": true
},
{
"name": "📦 Database",
"value": "✅ Online",
"inline": true
},
{
"name": "📧 Mail Server",
"value": "⚠️ Degradado",
"inline": true
},
{
"name": "💾 Disk Usage",
"value": "45% (450GB / 1TB)",
"inline": false
},
{
"name": "🔄 Uptime",
"value": "99.98% (30 dias)",
"inline": false
}
]
}
}
}
},
{
"id": "message_1",
"type": "message",
"position": { "x": 500, "y": 100 },
"data": {
"label": "Confirmar",
"parameters": {
"message": "Status enviado com campos estruturados!"
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 700, "y": 100 },
"data": { "label": "Fim" }
}
],
"edges": [
{ "source": "start_1", "target": "discord_1" },
{ "source": "discord_1", "target": "message_1" },
{ "source": "message_1", "target": "end_1" }
]
}
Teste: Embed mostrará campos inline (lado a lado) e campos full-width.
embed.author (object, opcional)
O que é: Informações do autor exibidas acima do título com nome, ícone e link.
Estrutura:
{
"name": "Nome do Autor",
"url": "https://link.com",
"iconUrl": "https://imagem.com/icon.png"
}
Flow completo para testar:
{
"name": "Teste Discord - Embed Author",
"nodes": [
{
"id": "start_1",
"type": "start",
"position": { "x": 100, "y": 100 },
"data": { "label": "Início" }
},
{
"id": "discord_1",
"type": "discord",
"position": { "x": 300, "y": 100 },
"data": {
"label": "Embed com Autor",
"parameters": {
"operation": "send_embed",
"authType": "webhook",
"webhookUrl": "https://discord.com/api/webhooks/SEU_WEBHOOK",
"embed": {
"title": "Nova funcionalidade lançada!",
"description": "Implementamos suporte completo ao Discord no Flow Builder.",
"color": 5793266,
"author": {
"name": "Lumina Flow Builder",
"url": "https://lumina.app.br",
"iconUrl": "https://i.imgur.com/lumina-icon.png"
}
}
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 500, "y": 100 },
"data": { "label": "Fim" }
}
],
"edges": [
{ "source": "start_1", "target": "discord_1" },
{ "source": "discord_1", "target": "end_1" }
]
}
Teste: O embed mostrará autor com ícone clicável acima do título.
embed.footer (object, opcional)
O que é: Rodapé do embed com texto e ícone pequeno.
Estrutura:
{
"text": "Texto do rodapé",
"iconUrl": "https://imagem.com/icon.png"
}
Limite: 2048 caracteres no text
Flow completo para testar:
{
"name": "Teste Discord - Embed Footer",
"nodes": [
{
"id": "start_1",
"type": "start",
"position": { "x": 100, "y": 100 },
"data": { "label": "Início" }
},
{
"id": "discord_1",
"type": "discord",
"position": { "x": 300, "y": 100 },
"data": {
"label": "Embed com Footer",
"parameters": {
"operation": "send_embed",
"authType": "webhook",
"webhookUrl": "https://discord.com/api/webhooks/SEU_WEBHOOK",
"embed": {
"title": "Relatório Diário",
"description": "Resumo das atividades do dia.",
"color": 5763719,
"footer": {
"text": "Lumina Flow Builder • Gerado automaticamente",
"iconUrl": "https://i.imgur.com/footer-icon.png"
},
"timestamp": "2025-01-15T14:30:00.000Z"
}
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 500, "y": 100 },
"data": { "label": "Fim" }
}
],
"edges": [
{ "source": "start_1", "target": "discord_1" },
{ "source": "discord_1", "target": "end_1" }
]
}
Teste: Rodapé aparecerá na parte inferior do embed com ícone e timestamp.
embed.image (object, opcional)
O que é: Imagem grande exibida no corpo do embed.
Estrutura:
{
"url": "https://imagem.com/banner.png"
}
Flow completo para testar:
{
"name": "Teste Discord - Embed Image",
"nodes": [
{
"id": "start_1",
"type": "start",
"position": { "x": 100, "y": 100 },
"data": { "label": "Início" }
},
{
"id": "discord_1",
"type": "discord",
"position": { "x": 300, "y": 100 },
"data": {
"label": "Anúncio com Banner",
"parameters": {
"operation": "send_embed",
"authType": "webhook",
"webhookUrl": "https://discord.com/api/webhooks/SEU_WEBHOOK",
"embed": {
"title": "🎉 Grande Promoção!",
"description": "50% de desconto em todos os planos até sexta-feira!",
"color": 16776960,
"image": {
"url": "https://i.imgur.com/promo-banner.png"
}
}
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 500, "y": 100 },
"data": { "label": "Fim" }
}
],
"edges": [
{ "source": "start_1", "target": "discord_1" },
{ "source": "discord_1", "target": "end_1" }
]
}
Teste: Banner grande aparecerá no embed abaixo da descrição.
embed.thumbnail (object, opcional)
O que é: Imagem pequena exibida no canto superior direito do embed.
Estrutura:
{
"url": "https://imagem.com/thumb.png"
}
Flow completo para testar:
{
"name": "Teste Discord - Embed Thumbnail",
"nodes": [
{
"id": "start_1",
"type": "start",
"position": { "x": 100, "y": 100 },
"data": { "label": "Início" }
},
{
"id": "input_1",
"type": "input",
"position": { "x": 300, "y": 100 },
"data": {
"label": "Nome do Usuário",
"parameters": {
"message": "Digite seu nome:",
"variableName": "userName"
}
}
},
{
"id": "discord_1",
"type": "discord",
"position": { "x": 500, "y": 100 },
"data": {
"label": "Perfil do Usuário",
"parameters": {
"operation": "send_embed",
"authType": "webhook",
"webhookUrl": "https://discord.com/api/webhooks/SEU_WEBHOOK",
"embed": {
"title": "👤 Perfil de {{userName}}",
"description": "Membro ativo desde Janeiro 2025",
"color": 10181046,
"thumbnail": {
"url": "https://i.imgur.com/user-avatar.png"
},
"fields": [
{
"name": "📊 Mensagens",
"value": "1,234",
"inline": true
},
{
"name": "⭐ Pontos",
"value": "5,678",
"inline": true
}
]
}
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 700, "y": 100 },
"data": { "label": "Fim" }
}
],
"edges": [
{ "source": "start_1", "target": "input_1" },
{ "source": "input_1", "target": "discord_1" },
{ "source": "discord_1", "target": "end_1" }
]
}
Teste: Avatar aparecerá no canto superior direito do embed.
embed.timestamp (string, opcional)
O que é: Timestamp ISO 8601 exibido no footer do embed.
Formato: "2025-01-15T14:30:00.000Z"
Flow completo para testar:
{
"name": "Teste Discord - Embed Timestamp",
"nodes": [
{
"id": "start_1",
"type": "start",
"position": { "x": 100, "y": 100 },
"data": { "label": "Início" }
},
{
"id": "discord_1",
"type": "discord",
"position": { "x": 300, "y": 100 },
"data": {
"label": "Log com Timestamp",
"parameters": {
"operation": "send_embed",
"authType": "webhook",
"webhookUrl": "https://discord.com/api/webhooks/SEU_WEBHOOK",
"embed": {
"title": "📝 Evento Registrado",
"description": "Usuário realizou login no sistema.",
"color": 5793266,
"timestamp": "2025-01-15T14:30:00.000Z",
"footer": {
"text": "Sistema de Logs"
}
}
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 500, "y": 100 },
"data": { "label": "Fim" }
}
],
"edges": [
{ "source": "start_1", "target": "discord_1" },
{ "source": "discord_1", "target": "end_1" }
]
}
Teste: Data e hora aparecerão formatadas no rodapé do embed.
Parâmetros
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
| operation | string | Sim | Deve ser "send_embed" |
| authType | string | Sim | "webhook" ou "bot" |
| webhookUrl | string | Sim (webhook) | URL do webhook Discord |
| botToken | string | Sim (bot) | Token do bot Discord |
| channelId | string | Sim (bot) | ID do canal Discord |
| content | string | Não | Texto adicional fora do embed |
| embed.title | string | Sim | Título do embed (máx. 256 chars) |
| embed.description | string | Não | Descrição do embed (máx. 4096 chars) |
| embed.color | number | Não | Cor em decimal (ex: 5763719) |
| embed.fields | array | Não | Array de campos (máx. 25) |
| embed.author | object | Não | Autor com name, url, iconUrl |
| embed.footer | object | Não | Rodapé com text, iconUrl |
| embed.image | object | Não | Imagem grande com url |
| embed.thumbnail | object | Não | Miniatura com url |
| embed.timestamp | string | Não | ISO 8601 timestamp |
| username | string | Não | Nome customizado (webhook only) |
| avatarUrl | string | Não | Avatar URL (webhook only) |
| threadId | string | Não | ID da thread (webhook only) |
Exemplo 1: Dashboard de Métricas
Objetivo: Enviar dashboard diário com métricas de negócio formatadas em embed.
JSON para Importar
{
"name": "Discord - Dashboard de Métricas",
"nodes": [
{
"id": "start_1",
"type": "start",
"position": { "x": 100, "y": 100 },
"data": { "label": "Início" }
},
{
"id": "variable_1",
"type": "variable",
"position": { "x": 300, "y": 100 },
"data": {
"label": "Vendas",
"parameters": {
"name": "vendas",
"value": "47"
}
}
},
{
"id": "variable_2",
"type": "variable",
"position": { "x": 300, "y": 200 },
"data": {
"label": "Receita",
"parameters": {
"name": "receita",
"value": "R$ 12.580,00"
}
}
},
{
"id": "variable_3",
"type": "variable",
"position": { "x": 300, "y": 300 },
"data": {
"label": "Novos Usuários",
"parameters": {
"name": "usuarios",
"value": "23"
}
}
},
{
"id": "discord_1",
"type": "discord",
"position": { "x": 500, "y": 200 },
"data": {
"label": "Enviar Dashboard",
"parameters": {
"operation": "send_embed",
"authType": "webhook",
"webhookUrl": "https://discord.com/api/webhooks/SEU_WEBHOOK",
"embed": {
"title": "📊 Dashboard Diário",
"description": "Resumo das atividades de hoje",
"color": 5763719,
"fields": [
{
"name": "💰 Vendas",
"value": "{{vendas}} pedidos",
"inline": true
},
{
"name": "💵 Receita",
"value": "{{receita}}",
"inline": true
},
{
"name": "👥 Novos Usuários",
"value": "{{usuarios}} cadastros",
"inline": true
},
{
"name": "📈 Crescimento",
"value": "+15% vs. ontem",
"inline": false
}
],
"thumbnail": {
"url": "https://i.imgur.com/chart-icon.png"
},
"footer": {
"text": "Atualizado automaticamente"
},
"timestamp": "2025-01-15T14:30:00.000Z"
},
"username": "Dashboard Bot"
}
}
},
{
"id": "message_1",
"type": "message",
"position": { "x": 700, "y": 200 },
"data": {
"label": "Confirmar",
"parameters": {
"message": "Dashboard enviado com {{vendas}} vendas!"
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 900, "y": 200 },
"data": { "label": "Fim" }
}
],
"edges": [
{ "source": "start_1", "target": "variable_1" },
{ "source": "variable_1", "target": "variable_2" },
{ "source": "variable_2", "target": "variable_3" },
{ "source": "variable_3", "target": "discord_1" },
{ "source": "discord_1", "target": "message_1" },
{ "source": "message_1", "target": "end_1" }
]
}
Saída esperada no Discord:
[Embed com cor verde]
📊 Dashboard Diário
Resumo das atividades de hoje
💰 Vendas 💵 Receita 👥 Novos Usuários
47 pedidos R$ 12.580,00 23 cadastros
📈 Crescimento
+15% vs. ontem
[Thumbnail: ícone de gráfico]
[Footer: Atualizado automaticamente • 15 de janeiro de 2025 às 14:30]
Exemplo 2: Notificação de Deploy
Objetivo: Notificar equipe sobre status de deploy com informações técnicas.
JSON para Importar
{
"name": "Discord - Notificação de Deploy",
"nodes": [
{
"id": "start_1",
"type": "start",
"position": { "x": 100, "y": 100 },
"data": { "label": "Início" }
},
{
"id": "variable_1",
"type": "variable",
"position": { "x": 300, "y": 100 },
"data": {
"label": "Versão",
"parameters": {
"name": "version",
"value": "v2.5.0"
}
}
},
{
"id": "variable_2",
"type": "variable",
"position": { "x": 300, "y": 200 },
"data": {
"label": "Ambiente",
"parameters": {
"name": "environment",
"value": "Production"
}
}
},
{
"id": "variable_3",
"type": "variable",
"position": { "x": 300, "y": 300 },
"data": {
"label": "Status",
"parameters": {
"name": "status",
"value": "success"
}
}
},
{
"id": "condition_1",
"type": "condition",
"position": { "x": 500, "y": 200 },
"data": {
"label": "Deploy OK?",
"parameters": {
"condition": "{{status}} == 'success'"
}
}
},
{
"id": "discord_1",
"type": "discord",
"position": { "x": 700, "y": 100 },
"data": {
"label": "Deploy Sucesso",
"parameters": {
"operation": "send_embed",
"authType": "bot",
"botToken": "SEU_BOT_TOKEN",
"channelId": "SEU_CHANNEL_ID",
"embed": {
"title": "✅ Deploy Realizado com Sucesso",
"description": "A nova versão está no ar!",
"color": 5763719,
"fields": [
{
"name": "📦 Versão",
"value": "{{version}}",
"inline": true
},
{
"name": "🌍 Ambiente",
"value": "{{environment}}",
"inline": true
},
{
"name": "⏱️ Duração",
"value": "2m 34s",
"inline": true
},
{
"name": "🔧 Mudanças",
"value": "• Novo sistema de Discord\n• Fix: Bug de autenticação\n• Performance: 25% mais rápido",
"inline": false
}
],
"author": {
"name": "CI/CD Pipeline",
"iconUrl": "https://i.imgur.com/github-icon.png"
},
"footer": {
"text": "GitHub Actions"
},
"timestamp": "2025-01-15T14:30:00.000Z"
}
}
}
},
{
"id": "discord_2",
"type": "discord",
"position": { "x": 700, "y": 300 },
"data": {
"label": "Deploy Falhou",
"parameters": {
"operation": "send_embed",
"authType": "bot",
"botToken": "SEU_BOT_TOKEN",
"channelId": "SEU_CHANNEL_ID",
"embed": {
"title": "❌ Deploy Falhou",
"description": "Erro durante o processo de deploy",
"color": 15548997,
"fields": [
{
"name": "📦 Versão",
"value": "{{version}}",
"inline": true
},
{
"name": "🌍 Ambiente",
"value": "{{environment}}",
"inline": true
},
{
"name": "❗ Erro",
"value": "Database migration failed",
"inline": false
}
],
"timestamp": "2025-01-15T14:30:00.000Z"
}
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 900, "y": 200 },
"data": { "label": "Fim" }
}
],
"edges": [
{ "source": "start_1", "target": "variable_1" },
{ "source": "variable_1", "target": "variable_2" },
{ "source": "variable_2", "target": "variable_3" },
{ "source": "variable_3", "target": "condition_1" },
{ "source": "condition_1", "target": "discord_1", "label": "true" },
{ "source": "condition_1", "target": "discord_2", "label": "false" },
{ "source": "discord_1", "target": "end_1" },
{ "source": "discord_2", "target": "end_1" }
]
}
Saída esperada no Discord (sucesso):
[Embed com cor verde, autor "CI/CD Pipeline"]
✅ Deploy Realizado com Sucesso
A nova versão está no ar!
📦 Versão 🌍 Ambiente ⏱️ Duração
v2.5.0 Production 2m 34s
🔧 Mudanças
• Novo sistema de Discord
• Fix: Bug de autenticação
• Performance: 25% mais rápido
[Footer: GitHub Actions • 15 de janeiro de 2025 às 14:30]
Resposta do Node
{
"id": "1234567890123456789",
"channel_id": "987654321098765432",
"author": {
"username": "Dashboard Bot",
"avatar": "abc123"
},
"content": "",
"embeds": [
{
"title": "📊 Dashboard Diário",
"description": "Resumo das atividades de hoje",
"color": 5763719,
"fields": [
{
"name": "💰 Vendas",
"value": "47 pedidos",
"inline": true
}
],
"footer": {
"text": "Atualizado automaticamente"
},
"timestamp": "2025-01-15T14:30:00.000Z"
}
],
"timestamp": "2025-01-15T14:30:00.000Z"
}
Boas Práticas
✅ SIM:
- Use cores para indicar status (verde = sucesso, vermelho = erro, azul = info)
- Organize informações em fields para melhor legibilidade
- Adicione timestamps para contexto temporal
- Use inline:true para agrupar campos relacionados (máx 3 por linha)
- Inclua thumbnail ou author para identidade visual
- Limite fields a informações essenciais (evite sobrecarga)
- Use footer para créditos e metadata
- Adicione emojis nos títulos e fields para visual atrativo
- Teste cores com conversor hex-to-decimal online
- Mantenha descrição concisa (use fields para detalhes)
❌ NÃO:
- Não exceda limites (256 chars título, 4096 description, 25 fields)
- Não use imagens muito grandes (cause lag)
- Não abuse de fields inline (perde legibilidade)
- Não misture muitas cores no mesmo embed
- Não coloque texto crítico apenas em imagens
- Não esqueça de adicionar timestamp em logs
- Não use URLs inválidas em images/thumbnails
- Não crie embeds sem título (obrigatório)
- Não replique informações entre description e fields
- Não use mais de 10 embeds por mensagem
Dicas
💡 Dica 1: Para converter hex para decimal: parseInt("58A5FF", 16) = 5814783. Use SpyColor para facilitar.
💡 Dica 2: Campos inline são agrupados de 3 em 3. Se tiver 2 campos inline, o terceiro espaço fica vazio. Use isso para layout.
💡 Dica 3: Combine content (texto fora do embed) com embed para mencionar usuários antes do embed: content: "<@userId>".
💡 Dica 4: Use Unicode timestamps: <t:1705329000:F> no Discord para timestamp dinâmico que se adapta ao fuso do usuário.
💡 Dica 5: Author URL torna o nome do autor clicável. Use para link do projeto/docs.
💡 Dica 6: Footer aceita até 2048 caracteres, mas mantenha curto para não poluir visualmente.
💡 Dica 7: Para embeds dinâmicos, use FORMATTER node para preparar arrays de fields antes de enviar.
Próximo Node
→ DISCORD_SEND_MESSAGE - Enviar mensagens de texto simples → DISCORD_SEND_FILE - Enviar arquivos e imagens → DISCORD_EDIT_MESSAGE - Editar embeds existentes → DISCORD_DELETE_MESSAGE - Deletar mensagens com embed