Gateway

Eventos em tempo real via socket.io e intents.

O Gateway entrega eventos em tempo real. Ele é socket.io v4 (não um WebSocket puro): use a biblioteca socket.io-client.

Conectar

socket.io-client
const { io } = require('socket.io-client');

const socket = io('https://nexapp.online', {
  path: '/socket.io',             // padrão
  auth: { token: process.env.NEX_TOKEN },
});

socket.on('connect', () => console.log('online'));
socket.on('connect_error', (err) => console.error(err.message)); // "Sem token" | "Token inválido"
socket.on('disconnect', (reason) => console.log('caiu:', reason));
  • Ao conectar, o bot fica online (ou no status salvo em Presença).
  • Não existe evento READY nem handshake de intents: os intents são lidos da configuração da aplicação no momento de cada entrega.
  • O heartbeat é o ping/pong nativo do socket.io (25 s / 20 s) — não precisa implementar nada.
  • O socket.io reconecta sozinho; ao cair o último socket, o bot fica offline.
Sem replay
O Gateway não guarda eventos. O que acontecer enquanto o bot estiver desconectado é perdido — para recuperar mensagens, use o histórico pela REST.

Intents

Configurados no portal (PUT /api/applications/:id/intents). Um evento só chega se o intent estiver ligado e o bot tiver acesso (ex.: VER_CANAL no canal da mensagem).

IntentLibera
messages.readMESSAGE_CREATE, MESSAGE_UPDATE, MESSAGE_DELETE
members.readGUILD_MEMBER_ADD, GUILD_MEMBER_REMOVE
interactions.receiveINTERACTION_CREATE (modo Gateway). Também é obrigatório para os comandos aparecerem e os cliques funcionarem.
voice.connectEventos de voz e a rota voice-members — veja Voz.
messages.writeSó declarativo — hoje não libera nem bloqueia nada. Enviar depende apenas da permissão ENVIAR_MENSAGENS.

Eventos

Só os eventos abaixo fazem parte da API pública. Reações, fixar, mudanças de canal/cargo e mensagens em threads ainda não são enviadas a bots. Um bot nunca recebe DMs, pedidos de amizade ou notificações.

MESSAGE_CREATE / MESSAGE_UPDATE

O objeto Message completo. Inclui as mensagens do próprio bot — filtre por fromId ou applicationId para não responder a si mesmo.

Payload (resumido)
{
  "id": "…", "serverId": "…", "channelId": "…", "fromId": "…",
  "content": "!ping", "type": "text", "createdAt": "…", "editedAt": null,
  "embeds": null, "components": null, "flags": 0, "applicationId": null,
  "replyTo": null, "mentions": [], "reactions": [], "pinned": false
}

MESSAGE_DELETE

Payload
{ "id": "id-da-mensagem" }
Nota
Só o id vem no evento. Se precisar saber o canal, guarde o mapeamento quando a mensagem for criada.

GUILD_MEMBER_ADD

Alguém entrou no servidor (convite, Descobrir, entrada automática) ou um bot foi instalado.

Payload
{
  "serverId": "…", "userId": "…", "nickname": null, "joinedAt": "…",
  "timeoutUntil": null, "timeoutReason": null, "roleIds": [],
  "user": { "id": "…", "username": "…", "displayName": "…", "isBot": false }
}

GUILD_MEMBER_REMOVE

Payload
{ "serverId": "…", "userId": "…", "reason": "kicked" }

reason: kicked, banned, app_uninstalled ou ausente (saiu por conta própria).

INTERACTION_CREATE

Slash command, clique em componente ou envio de modal — formato completo em Interações. Só no modo Gateway.

Eventos de voz

channel_voice:participants_update, channel_voice:signal, voice:permission_changed e voice:session_ended — veja Voz.