Pular para conteúdo

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:

  1. Apresentação Profissional: Criar mensagens com aparência polida e estruturada
  2. Organização de Informações: Apresentar dados em campos separados e hierarquizados
  3. Identidade Visual: Usar cores, logos e imagens para branding
  4. Conteúdo Rico: Incluir thumbnails, imagens, footers, timestamps e links

Como funciona internamente?

Quando o DISCORD_SEND_EMBED é executado, o sistema:

  1. Valida Autenticação: Verifica webhook URL ou bot token
  2. Valida Embed: Garante que pelo menos o título do embed está presente
  3. Constrói Embed: Monta objeto embed com title, description, color, fields, author, footer, images
  4. Prepara Payload: Cria JSON com array de embeds e content opcional
  5. Envia Requisição: POST para webhook URL ou API do Discord
  6. Processa Resposta: Retorna dados da mensagem incluindo embed renderizado
  7. 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

  1. Notificações de Status: "Exibir status de deploy com cor verde/vermelho e campos de versão, autor, timestamp"
  2. Dashboards: "Criar card com métricas diárias: vendas, usuários ativos, receita"
  3. Perfis de Usuário: "Mostrar informações de usuário com avatar, nome, cargo, data de entrada"
  4. Tickets de Suporte: "Criar embed com detalhes do ticket: ID, categoria, prioridade, status"
  5. 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_MESSAGE para texto simples sem formatação
  • Envio de Arquivos: Use DISCORD_SEND_FILE quando precisar anexar documentos
  • Editar Embeds: Use DISCORD_EDIT_MESSAGE para 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