Pular para o conteúdo
Decoding Chat API

Opcodes e códigos de fechamento

Um opcode é o número identificador de um payload do Gateway. Um código de fechamento (close code) é o número que o Gateway envia ao encerrar uma conexão WebSocket. Todos os valores nesta página pertencem exclusivamente ao Gateway principal. Consulte Visão geral do Gateway para a máquina de estados da conexão e Comandos do cliente para os formatos de payload.

OpNomeDireção
0DispatchServidor para cliente
1HeartbeatBidirecional
2IdentifyCliente para servidor
3Presence UpdateCliente para servidor
4Voice State UpdateCliente para servidor
5Voice Server PingReservado
6ResumeCliente para servidor
7ReconnectServidor para cliente
8Request Guild MembersCliente para servidor
9Invalid Session1Servidor para cliente
10HelloServidor para cliente
11Heartbeat ACKServidor para cliente
12Gateway ErrorReservado
14Lazy RequestCliente para servidor
15Request Guild CountsCliente para servidor
16Request Channel Member CountsCliente para servidor

1 O Decoding Chat nunca envia o Opcode 9 com d: true, de modo que um Invalid Session nunca é uma instrução para retomar

OpPayloadQuando é enviado
0Dados específicos do eventoO servidor envia um evento com nome em t e sequência em s1
1Última sequência processada ou null pelo cliente; null pelo servidorO cliente envia periodicamente. O servidor solicita heartbeat imediato caso 90% do intervalo decorra sem confirmação2
2Objeto de IdentifyO cliente inicia uma sessão autenticada
3Objeto de Presence UpdateO cliente atualiza sua presença na sessão
4Objeto de Voice State UpdateO cliente conecta, move, altera ou desconecta da voz
5Não implementadoNunca enviado. Clientes que o enviarem serão desconectados3
6Objeto de ResumeO cliente restaura uma sessão retida4
7Sem campo dO Gateway solicita reconexão e fecha o socket com 40005
8Objeto de Request Guild MembersO cliente solicita páginas de membros de servidores
9Booleano literal falseA sessão indicada não pôde ser alcançada, seq abaixo do piso de replay ou sessão ativa encerrada6
10Objeto com heartbeat_intervalEnviado assim que o WebSocket é aceito, antes de ler payloads do cliente
11Sem campo dConfirma o recebimento de um heartbeat válido
12Não implementadoNunca enviado. Erros chegam como Dispatch ou no frame de fechamento
14Objeto de Lazy RequestO cliente atualiza assinaturas de servidores
15Objeto de Request Guild CountsO cliente consulta contagens de membros de servidores
16Objeto de Request Channel Member CountsO cliente consulta contagens de membros de canais

1 Resumed contém a sequência atual sem incrementá-la; Dispatches reproduzidos mantêm a sequência original de criação

2 Responda a uma solicitação de heartbeat do servidor imediatamente, mantendo o envio regular agendado

3 Enviar Opcode 5 ou 12 resulta no mesmo fechamento que um opcode indefinido

4 Resume é aceito havendo ou não sessão vinculada no momento

5 O Opcode 7 precede o fechamento quando o nó estiver em drain, em migração de sessão ou quando um novo socket assumir a sessão

6 Após esse frame, o socket fica não autenticado. Em falha de Resume em socket já vinculado, a sessão vinculada permanece

O registro é completo. O Opcode 13 e valores acima de 16 são indefinidos.

Ordem de resolução de payloads de entrada pelo Gateway:

  1. Payload sem d não alcança o comando. Identify fecha com 4005. Todos os demais fecham com 4001.
  2. Heartbeat e Resume são processados independentemente de haver sessão vinculada.
  3. Identify fecha com 4005 caso uma sessão já esteja vinculada.
  4. Qualquer outro opcode fecha com 4003 enquanto a conexão não estiver autenticada.
  5. Com sessão vinculada, Presence Update, Voice State Update, Request Guild Members, Lazy Request, Request Guild Counts e Request Channel Member Counts são processados. Qualquer outro valor fecha com 4001.
CódigoNomeSignificado
4000Unknown errorDrain do nó, erro não classificado de sessão ou sessão retida inalcançável
4001Unknown opcodeOpcode indefinido, opcode exclusivo de servidor ou payload sem d
4002Decode errorTamanho de payload, fluxo de compressão, codificação ou campos inválidos
4003Not authenticatedComando autenticado recebido antes de Identify ou Resume
4004Authentication failedToken inválido ou não proprietário da sessão retida
4005Already authenticatedIdentify recebido enquanto uma sessão já estava vinculada, ou sem d
4007Invalid sequenceSequência de Heartbeat ou Resume fora dos limites aceitos
4008Rate limitedLimite de conexões simultâneas, payloads por conexão, por IP ou por usuário excedido
4009Session timeoutMais de 45.000 ms decorridos sem confirmação de heartbeat enquanto o Gateway a aguardava
4010Invalid shardO valor shard do Identify não é um par [shard_id, shard_count] válido
4011Sharding requiredMais de 2.500 servidores vinculados a uma única sessão de bot
4012Invalid API versionO parâmetro de conexão v está ausente ou não é 1

O código 4006 não é atribuído, e nenhum código acima de 4012 é definido.

CódigoRetomávelEstado resultante
4000CondicionalFechado. A sessão vinculada permanece recuperável1
4001CondicionalFechado. Sessão previamente estabelecida permanece retida
4002CondicionalFechado. Sessão previamente estabelecida permanece retida
4003NãoFechado. Nenhuma sessão existe nesta conexão
4004CondicionalFechado. Resume não invalida a sessão que nomeou2
4005CondicionalFechado. Sessão previamente estabelecida permanece retida
4007Não para esta tentativaFechado. A sessão retida aguarda até sua janela expirar
4008CondicionalFechado. Sessão previamente estabelecida permanece retida
4009CondicionalFechado. Sessão previamente estabelecida permanece retida
4010NãoFechado. Nenhuma sessão foi criada
4011NãoFechado. Nenhuma sessão foi criada
4012NãoFechado antes do Hello. Nenhuma sessão existe

1 Um fechamento que deixe a sessão sem socket inicia uma nova janela de retenção de 60.000 ms a partir da desconexão

2 Um Resume com token inválido preserva a sessão até o término de sua janela de retenção, permitindo que o token correto a recupere

O Gateway envia uma string de motivo exata em cada fechamento de aplicação.

MotivoCódigoCausa
Invalid API version4012O parâmetro de conexão v está ausente ou não é 1
Too many connections4008O IP de origem atingiu 256 conexões Gateway simultâneas
Encode failed4002Falha na codificação do frame Hello
Compression failed: zstd-stream4002Falha na compressão zstd do frame Hello
Payload too large4002Mensagem de entrada excedeu 4.096 bytes na rede ou após descompressão
Decompression failed4002Mensagem comprimida de entrada não pôde ser descomprimida
Decode failed4002Payload não é JSON válido ou decodificou em algo que não é objeto
Invalid payload4002Objeto decodificado não possui campo op
Rate limited4008Orçamento de payloads da conexão, do IP ou da conta foi excedido
Unknown opcode4001Opcode indefinido, exclusivo de servidor ou payload sem campo d
Not authenticated4003Comando autenticado recebido antes da vinculação de sessão
Already authenticated4005Identify recebido com sessão já vinculada ou sem campo d
Invalid identify payload4002Identify sem token/properties ou com tipos inválidos
Invalid shard4010Valor shard do Identify não é um par [shard_id, shard_count] válido
Sharding required4011Mais de 2.500 servidores associados ao shard do bot
Too many sessions4008Usuário atingiu o teto de 100 sessões ativas simultâneas
Invalid token4004Token do Identify inválido ou token do Resume não é dono da sessão
Failed to start session4000Falha não classificada na criação da sessão
Invalid resume payload4002Resume inválido, token/session_id ausentes ou seq não inteiro
Invalid sequence4007Sequência de Heartbeat ou Resume fora dos limites válidos
Invalid presence payload4002Presence Update inválido ou com valor desconhecido de status
Session unavailable4000Sessão retida inalcançável durante o Resume
Session drain requested; reconnect to continue4000Opcode 7 enviado imediatamente antes do fechamento
Heartbeat timeout4009Nenhuma confirmação de heartbeat recebida dentro de 45.000 ms

A conexão pode ser encerrada sem código de aplicação do Decoding Chat (ex.: quedas de rede, resets de proxy, códigos 1000 ou 1001). Nesses casos, a sessão permanece retida e disponível para recuperação por 60.000 ms.