Eventos do Gateway
Um Dispatch relata uma alteração ou resultado de comando através do Gateway. Ele tem opcode 0, um nome de evento e um payload.
Envelope de Dispatch
Seção intitulada “Envelope de Dispatch”| Campo | Tipo | Descrição |
|---|---|---|
| op | integer | Valor 0 |
| t | string | Nome do evento em maiúsculas |
| s | integer | Sequência de sessão não negativa |
| d | any | Payload definido para o evento nomeado |
{ "op": 0, "t": "MESSAGE_CREATE", "s": 17, "d": { }}Ready estabelece a sequência 1. Dispatches ao vivo a avançam em um. Dispatches reproduzidos mantêm sua sequência original e podem ter lacunas. Resumed tem a sequência atual da sessão sem avançá-la. O próximo Dispatch ao vivo tem essa sequência mais um. A sequência é local a uma sessão do Gateway e não ordena nada entre shards ou operações HTTP.
Entrega de Dispatch
Seção intitulada “Entrega de Dispatch”A Filtragem de eventos define a entrega por disponibilidade da guilda, visibilidade do canal, permissões e configurações de sessão. Dispatches com escopo de conta passam apenas pelos filtros no nível da sessão, que são o filtro de shard e a lista ignored_events.
A maioria dos Dispatches com escopo de guilda tem uma string guild_id. Guild Create e Guild Sync identificam a guilda como id, e o mesmo faz todo Guild Delete que não seja o que a própria guilda envia quando é deletada. Guild Counts Update e Channel Member Counts Update não possuem um guild_id de nível superior, e cada entrada em seu array counts tem o seu próprio.
A sessão de origem é excluída de um Dispatch apenas para Message Reaction Add e Message Reaction Remove em um canal de guilda, e apenas quando a requisição forneceu um session_id. Esse campo é removido do payload. O mesmo campo em uma reação de mensagem direta ou mensagem direta em grupo é encaminhado para cada destinatário inalterado e não exclui ninguém. O ator que emite qualquer outra mutação recebe o Dispatch resultante como qualquer outra sessão elegível.
Um Dispatch é armazenado em buffer para replay de Resume, a menos que seja Guild Sync, Guild Member List Update ou Guild Members Chunk. Esses são entregues ao vivo e nunca retidos. Um único Dispatch superdimensionado é entregue, mas não retido, como descreve Limites e rate limits. Ready e a rajada de guildas que o segue para uma sessão de bot também são enviados fora do buffer de replay. Os eventos iniciais Call Create são retidos como qualquer outro Dispatch e são reproduzidos no Resume.
Eventos de Dispatch
Seção intitulada “Eventos de Dispatch”| Evento | Descrição | Escopo |
|---|---|---|
| Ready | O estado inicial da sessão após um Identify bem-sucedido | Ciclo de vida da sessão |
| Resumed | O replay retido é concluído após um Resume bem-sucedido | Ciclo de vida da sessão |
| Sessions Replace | O conjunto de presença de sessão ao vivo da conta é substituído | Usuário atual |
| Auth Session Change | A sessão de autenticação da conta é rotacionada | Usuário atual |
| Rate Limited | Uma requisição de membro é recusada por seu orçamento | Resposta de comando |
| User Update | O registro da conta do usuário atual muda | Usuário atual |
| User Settings Update | As configurações gerais da conta do usuário atual mudam | Usuário atual |
| User Guild Settings Update | Um registro de notificação de guilda muda | Usuário atual |
| User Note Update | O usuário atual escreve ou apaga uma nota privada | Usuário atual |
| User Pinned DMs Update | O conjunto de canais privados fixados do usuário atual é substituído | Usuário atual |
| User Connections Update | O conjunto de conexões externas do usuário atual é substituído | Usuário atual |
| WebAuthn Credentials Update | O conjunto de credenciais WebAuthn do usuário atual é substituído | Usuário atual |
| Relationship Add | O usuário atual ganha um relacionamento | Usuário atual |
| Relationship Update | Um dos relacionamentos do usuário atual muda | Usuário atual |
| Relationship Remove | O usuário atual perde um relacionamento | Usuário atual |
| Saved Message Create | O usuário atual salva uma mensagem | Usuário atual |
| Saved Message Delete | O usuário atual remove o salvamento de uma mensagem | Usuário atual |
| Recent Mention Delete | O usuário atual remove uma menção recente | Usuário atual |
| Favorite Meme Create | O usuário atual salva um meme | Usuário atual |
| Favorite Meme Update | Um dos memes do usuário atual muda | Usuário atual |
| Favorite Meme Delete | O usuário atual exclui um meme | Usuário atual |
| Guild Create | Uma guilda fica disponível para a sessão | Conexão com a guilda |
| Guild Sync | Uma sessão inscrita recebe o estado atual completo da guilda novamente | Conexão com a guilda |
| Guild Update | A configuração de uma guilda muda | Conexão com a guilda |
| Guild Delete | Uma guilda sai da visibilidade da sessão ou fica indisponível | Conexão com a guilda |
| Guild Role Create | Um cargo é criado em uma guilda | Conexão com a guilda |
| Guild Role Update | Exatamente um registro de cargo muda | Conexão com a guilda |
| Guild Role Update Bulk | Uma operação altera vários registros de cargos juntos | Conexão com a guilda |
| Guild Role Delete | Um cargo é deletado de uma guilda | Conexão com a guilda |
| Guild Emojis Update | Os emojis de uma guilda mudam | Conexão com a guilda |
| Guild Stickers Update | Os adesivos de uma guilda mudam | Conexão com a guilda |
| Channel Create | Um canal se torna visível para a sessão | Visibilidade do canal |
| Channel Update | Um canal visível muda | Visibilidade do canal |
| Channel Update Bulk | Uma operação altera vários canais juntos | Visibilidade do canal |
| Channel Delete | Um canal sai da visibilidade da sessão | Visibilidade do canal |
| Channel Recipient Add | Um usuário entra em uma mensagem direta em grupo à qual a sessão pertence | Canal privado |
| Channel Recipient Remove | Um usuário sai de uma mensagem direta em grupo à qual a sessão pertence | Canal privado |
| Webhooks Update | O conjunto de webhooks de um canal de guilda visível muda | Visibilidade do canal |
| Invite Create | Um convite é criado | Audiência do convite |
| Invite Delete | Um convite é deletado | Audiência do convite |
| Guild Member Add | Um usuário se torna membro de uma guilda conectada | Conexão com a guilda |
| Guild Member Update | O estado da guilda ou a representação de usuário público de um membro muda | Conexão com a guilda |
| Guild Member Remove | Um usuário deixa de ser membro de uma guilda conectada | Conexão com a guilda |
| Guild Members Chunk | Um resultado de membro limitado responde a Request Guild Members | Resposta de comando |
| Guild Member List Update | Uma lista de membros inscrita ressincroniza os intervalos do assinante | Inscrição em lista de membros |
| Guild Audit Log Entry Create | Uma entrada de log de auditoria é escrita em uma guilda | Detentores de VIEW_AUDIT_LOG |
| Guild Ban Add | Um banimento de guilda é criado | Conexão com a guilda |
| Guild Ban Remove | Um banimento de guilda é removido | Conexão com a guilda |
| Presence Update | Uma presença visível muda | Inscrição de presença |
| Presence Update Bulk | Uma guilda em recuperação entrega suas presenças visíveis em conjunto | Conexão com a guilda |
| Passive Updates | Valores last_message_id de canais ou estados de voz mudaram para uma sessão passiva | Sessão passiva |
| Message Create | Uma mensagem visível é criada | Visibilidade do canal |
| Message Update | Uma mensagem visível muda e é republicada na íntegra | Acesso à mensagem |
| Message Delete | Uma mensagem visível é deletada | Acesso à mensagem |
| Message Delete Bulk | Várias mensagens em um canal são deletadas juntas | Visibilidade do canal |
| Message ACK | O estado de leitura do usuário atual avança para um canal | Usuário atual |
| Message Reaction Add | Um usuário adiciona uma reação a uma mensagem | Acesso à mensagem |
| Message Reaction Add Many | Uma sessão com debounce recebe várias adições de reação como um único evento | Acesso à mensagem |
| Message Reaction Remove | A reação de um usuário é removida de uma mensagem | Acesso à mensagem |
| Message Reaction Remove All | Todas as reações são removidas de uma mensagem de uma só vez | Acesso à mensagem |
| Message Reaction Remove Emoji | Todas as reações usando um emoji são removidas de uma mensagem | Acesso à mensagem |
| Typing Start | Um usuário visível começa a digitar em um canal | Visibilidade do canal |
| Channel Pins Update | O horário do pin mais recente de um canal muda | Visibilidade do canal |
| Channel Pins ACK | O usuário atual reconhece os pins de um canal | Usuário atual |
| Voice State Update | O estado de voz de um participante de guilda ou chamada muda | Visibilidade do canal |
| Voice Server Update | A sessão recebe ou substitui sua própria concessão de voz | Sessão atual |
| Entrance Sound Play | O som de entrada de um participante toca em um canal de voz | Canal de voz |
| Call Create | Uma chamada de canal privado começa ou se torna visível | Destinatário da chamada |
| Call Update | O conjunto de chamadas, a lista de participantes ou a região de uma chamada muda | Destinatário da chamada |
| Call Delete | Uma chamada termina ou se torna indisponível | Destinatário da chamada |
| Guild Counts Update | Contagens de membros e online são retornadas para guildas conectadas | Resposta de comando |
| Channel Member Counts Update | Contagens de membros e online por canal são retornadas para uma guilda | Resposta de comando |
Sessão e usuário atual
Seção intitulada “Sessão e usuário atual”O estado inicial da sessão. Enviado uma vez após um Identify bem-sucedido, sempre com sequência 1.
| Campo | Tipo | Descrição |
|---|---|---|
| session_id | string | Identificador para Resume |
| version | integer | Versão da API do Gateway que a conexão negociou, sempre 1 |
| user | objeto user | A conta autenticada em sua representação privada |
| guilds1 | array[objeto guild ready] | As guildas da sessão |
| private_channels | array[objeto channel] | Canais de mensagens diretas e mensagens diretas em grupo |
| relationships2 | array[objeto relationship] | Os relacionamentos da conta |
| presences3 | array[objeto presence] | Presenças visíveis no momento da conexão |
| users4 | array[objeto partial user] | Usuários referenciados pelo payload |
| sessions | array[objeto session presence] | Outras sessões ao vivo da conta |
| read_states | array[objeto read state] | Estado de leitura por canal |
| user_settings | ?objeto user settings | Configurações gerais da conta |
| user_guild_settings | array[objeto user guild settings] | Configurações de notificação por guilda |
| notes | map[snowflake, string] | Notas privadas indexadas por ID de usuário |
| pinned_dms | array[snowflake] | IDs de canais privados fixados |
| favorite_memes | array[objeto meme] | Memes salvos |
| webauthn_credentials | array[objeto WebAuthn credential] | Credenciais WebAuthn registradas |
| rtc_regions | array[objeto RTC region] | Regiões de voz, ordenadas pela mais próxima primeiro |
| country_code | string | País resolvido a partir do endereço de conexão, US quando o endereço não resolve para nenhum |
| latitude? | string | Latitude resolvida a partir do endereço de conexão, renderizada como uma string decimal |
| longitude? | string | Longitude resolvida a partir do endereço de conexão, renderizada como uma string decimal |
| auth_session_id_hash? | string | Hash Base64url identificando a sessão de autenticação |
| shard? | array[integer] | O par [shard_id, shard_count] aceito, presente apenas quando Identify forneceu um |
| _timings? | object | Detalhamento de tempo no lado do HTTP, presente apenas para uma conta de equipe |
| _timings_gw? | object | Detalhamento de tempo no lado do Gateway, presente apenas para uma conta de equipe |
1 Em uma sessão de bot, cada entrada é uma guilda indisponível apenas com id e unavailable: true. A rajada descrita abaixo envia então um Guild Create com o estado completo de cada guilda disponível e um Guild Delete para cada indisponível
2 Cada entrada tem seu campo user removido e as contas removidas aparecem em users em vez disso, de modo que um cliente resolve um relacionamento através do id da entrada
3 Uma sessão de bot sempre recebe um array vazio aqui
4 Coletado a partir dos relacionamentos da conta, os destinatários de seus canais privados e os membros em guilds, deduplicados por ID de conta. Uma sessão de bot sempre recebe um array vazio aqui
Ready é enviado fora do buffer de replay, então um Resume nunca o reproduz.
Uma sessão de bot recebe um Guild Create por guilda disponível imediatamente após Ready, e um Guild Delete por guilda indisponível. Juntos, eles resolvem as entradas do array guilds. Esses Dispatches também são enviados fora do buffer de replay.
Logo após o Ready, cada sessão recebe um Call Create para cada um de seus canais privados que tem uma chamada ativa.
Objeto guild ready
Seção intitulada “Objeto guild ready”A mesma estrutura aparece em Ready, Guild Create e Guild Sync.
| Campo | Tipo | Descrição |
|---|---|---|
| id | snowflake | ID da guilda |
| properties | objeto guild | Registro da guilda sem seus cargos, canais, emojis, adesivos ou membros |
| roles | array[objeto guild role] | Cada cargo na guilda |
| channels | array[objeto channel] | Canais que a sessão pode ver |
| emojis | array[objeto guild emoji] | Cada emoji na guilda |
| stickers | array[objeto guild sticker] | Cada adesivo na guilda |
| members1 | array[objeto guild member] | Os membros de que a sessão precisa imediatamente |
| member_count | integer | Contagem total de membros |
| online_count2 | integer | Contagem de membros online |
| presences3 | array[objeto presence] | Sempre um array vazio |
| voice_states | array[objeto voice state] | Estados de voz em canais que a sessão pode ver |
| joined_at | ?ISO8601 timestamp | Quando a conta se juntou à guilda, null quando a conta não é membro |
| unavailable? | boolean | Se a guilda está indisponível |
| unavailable_hidden? | boolean | Se uma guilda indisponível está oculta do cliente |
1 O próprio objeto de membro da sessão mais o objeto de membro de cada participante nomeado por voice_states, e nada mais. Um cliente que precise do restante da lista de membros a solicita com Request Guild Members ou se inscreve em uma lista de membros através de Lazy Request
2 Conta os membros que mantêm uma sessão Gateway ao vivo e publicam um status que não seja offline ou invisible. Cada destinatário recebe o mesmo número em toda a guilda. Guild Counts Update relata uma contagem por espectador
3 Presenças de guilda chegam como Dispatches separados Presence Update e Presence Update Bulk
Uma guilda indisponível é reduzida a id e unavailable: true, mais unavailable_hidden: true quando a guilda está oculta. Ela não tem nenhum dos outros campos. Cada entrada no array guilds de um Ready de uma sessão de bot tem essa forma, apenas com id e unavailable: true.
Dentro de Ready e dentro da rajada Guild Create que um bot recebe imediatamente após Ready, cada entrada em members tem seu user substituído por {"id": "..."}. O Ready de uma sessão de bot não tem members nenhum, porque cada uma de suas guildas é uma guilda indisponível, então um bot vê a forma reduzida apenas na rajada. Em uma sessão de usuário, as contas removidas aparecem no array users do payload Ready. O array users de um bot é vazio, então um bot puxa essas contas com Request Guild Members. Um Guild Create enviado posteriormente na sessão, e cada Guild Sync, têm os membros com user intactos.
Objeto session presence
Seção intitulada “Objeto session presence”| Campo | Tipo | Descrição |
|---|---|---|
| session_id | string | Identificador da sessão, ou o literal all para a entrada agregada |
| status | string | online, idle, dnd, invisible ou offline |
| afk | boolean | Se a sessão está ausente |
| mobile | boolean | Se a sessão é mobile |
A primeira entrada sempre tem session_id: "all" e o status combinado da conta, que é o primeiro de dnd, online, idle e invisible que qualquer uma de suas sessões tem, ou offline quando nenhuma tem.
Objeto WebAuthn credential
Seção intitulada “Objeto WebAuthn credential”| Campo | Tipo | Descrição |
|---|---|---|
| id | string | ID da credencial |
| name | string | Nome da credencial |
| created_at | ISO8601 timestamp | Quando a credencial foi registrada |
| last_used_at | ?ISO8601 timestamp | Quando a credencial foi usada pela última vez |
Objeto RTC region
Seção intitulada “Objeto RTC region”| Campo | Tipo | Descrição |
|---|---|---|
| id | string | ID da região |
| name | string | Nome da região legível por humanos |
| emoji | string | Emoji da região |
O array sempre começa com uma entrada sintética cujo id é automatic, name é Automatic e emoji é o globo. Escolher essa entrada deixa a região a cargo do servidor. Todas as outras entradas são uma região que a conta pode selecionar, ordenadas pela distância a partir da latitude e longitude nas propriedades do Identify. O Decoding Chat ordena pela distância apenas quando ambos os valores são analisados como números finitos, caso contrário, ordena pelo ID da região.
RESUMED
Seção intitulada “RESUMED”Enviado após um Resume bem-sucedido ter reproduzido todo Dispatch retido acima da sequência fornecida.
| Campo | Tipo | Descrição |
|---|---|---|
| _timings_gw? | object | Detalhamento de tempo no lado do Gateway, presente apenas para uma conta de equipe |
O payload é de resto vazio. Resumed tem a sequência atual da sessão em s sem avançá-la, e o próximo Dispatch ao vivo tem essa sequência mais um.
SESSIONS_REPLACE
Seção intitulada “SESSIONS_REPLACE”O conjunto de sessões ao vivo da conta mudou. O payload é um array JSON simples de objetos session presence e é sempre o conjunto completo. Um cliente que armazena as sessões as substitui por este array. Ready envia o conjunto inicial como sessions.
AUTH_SESSION_CHANGE
Seção intitulada “AUTH_SESSION_CHANGE”A sessão de autenticação da conta foi rotacionada, por exemplo, por uma mudança de senha em outro dispositivo.
| Campo | Tipo | Descrição |
|---|---|---|
| old_auth_session_id_hash | string | Hash Base64url da sessão de autenticação que foi substituída |
| new_auth_session_id_hash | string | Hash Base64url da sessão de autenticação substituta |
| new_token | string | Substituto para o token que o cliente possui |
Cada sessão da conta recebe o evento, incluindo aquela que causou a rotação. Um cliente DEVE usar new_token para toda requisição HTTP posterior e para qualquer Resume ou Identify posterior. Um cliente cujo próprio auth_session_id_hash do Ready é igual a old_auth_session_id_hash DEVE substituí-lo por new_auth_session_id_hash.
RATE_LIMITED
Seção intitulada “RATE_LIMITED”Um comando Request Guild Members foi recusado pelo orçamento de lista completa de membros do bot. Entregue apenas à sessão solicitante.
| Campo | Tipo | Descrição |
|---|---|---|
| opcode | integer | O opcode recusado, que é sempre 8 |
| retry_after | number | Segundos até que a requisição possa ser tentada novamente |
| meta | object | Contexto para a requisição recusada |
meta tem guild_id e, quando a requisição nomeou exatamente uma guilda e forneceu um nonce válido, nonce.
Esse orçamento admite uma requisição de membro não filtrada por conta de bot e guilda a cada 30.000 ms, e retry_after é o restante dessa janela em segundos. Toda outra recusa de comando é silenciosa.
USER_UPDATE
Seção intitulada “USER_UPDATE”O registro da conta do usuário atual foi alterado. O payload é o objeto de usuário completo em sua representação privada.
Assinantes de presença recebem o user atualizado em uma Atualização de Presença, a menos que o status publicado do usuário seja offline.
USER_SETTINGS_UPDATE
Seção intitulada “USER_SETTINGS_UPDATE”As configurações da conta do usuário atual foram alteradas. O payload é o objeto de configurações do usuário completo.
O Decoding Chat republica a presença da conta a cada atualização de configurações, independentemente de status ou custom_status terem mudado. Um status offline no payload é tratado como invisible (invisível), e força cada sessão ativa da conta para esse status.
USER_GUILD_SETTINGS_UPDATE
Seção intitulada “USER_GUILD_SETTINGS_UPDATE”As configurações de notificação de uma guilda foram alteradas. O payload é o objeto de configurações da guilda do usuário completo.
USER_NOTE_UPDATE
Seção intitulada “USER_NOTE_UPDATE”O usuário atual escreveu ou apagou uma nota privada.
| Campo | Tipo | Descrição |
|---|---|---|
| id | snowflake | Usuário sobre o qual é a nota |
| note | string | Texto da nota, vazio quando apagado |
USER_PINNED_DMS_UPDATE
Seção intitulada “USER_PINNED_DMS_UPDATE”O conjunto de canais privados fixados do usuário atual foi alterado. O payload é um array JSON simples de strings de IDs de canais na ordem fixada e é sempre o conjunto completo. Um cliente que armazena os canais fixados os substitui por este array. Ready envia o conjunto inicial como pinned_dms.
USER_CONNECTIONS_UPDATE
Seção intitulada “USER_CONNECTIONS_UPDATE”O conjunto de conexões externas do usuário atual foi alterado.
| Campo | Tipo | Descrição |
|---|---|---|
| connections | array[objeto de conexão] | Toda conexão que a conta possui |
connections é sempre o conjunto completo. Um cliente que armazena as conexões as substitui por este array.
WEBAUTHN_CREDENTIALS_UPDATE
Seção intitulada “WEBAUTHN_CREDENTIALS_UPDATE”O conjunto de credenciais WebAuthn do usuário atual foi alterado. O payload é um array JSON simples de objetos de credencial WebAuthn e é sempre o conjunto completo. Um cliente que armazena as credenciais as substitui por este array. Ready envia o conjunto inicial como webauthn_credentials.
RELATIONSHIP_ADD
Seção intitulada “RELATIONSHIP_ADD”O usuário atual ganhou um relacionamento. O payload é o objeto de relacionamento completo.
| Campo | Tipo | Descrição |
|---|---|---|
| id | snowflake | O ID do outro usuário |
| type | integer | Tipo de relacionamento |
| user | objeto de usuário parcial | O outro usuário |
| since? | timestamp ISO8601 | Quando o relacionamento foi criado, ausente quando o registro não tem timestamp |
| nickname | ?string | Apelido privado para o outro usuário |
| share_voice_activity | boolean | Se o usuário atual compartilha a atividade de voz com este amigo no painel Ativo Agora |
| friend_shares_voice_activity1 | boolean | Se o outro usuário compartilha a atividade de voz com o usuário atual |
1 Sempre true neste Dispatch, mesmo para uma amizade cujo parceiro tenha o compartilhamento desativado.
Um cliente que precisa do valor real DEVE lê-lo de Listar relacionamentos.
RELATIONSHIP_UPDATE
Seção intitulada “RELATIONSHIP_UPDATE”Um relacionamento existente foi alterado. O payload tem a mesma estrutura de Adição de Relacionamento.
friend_shares_voice_activity é a configuração real do parceiro apenas no par de Dispatches que Modificar compartilhamento de atividade de voz envia para ambas as partes de cada amizade. Todas as outras Atualizações de Relacionamento enviam true.
RELATIONSHIP_REMOVE
Seção intitulada “RELATIONSHIP_REMOVE”Um relacionamento terminou.
| Campo | Tipo | Descrição |
|---|---|---|
| id | snowflake | O ID do outro usuário |
SAVED_MESSAGE_CREATE
Seção intitulada “SAVED_MESSAGE_CREATE”O usuário atual salvou uma mensagem. O payload é o objeto de mensagem completo como o usuário a vê.
SAVED_MESSAGE_DELETE
Seção intitulada “SAVED_MESSAGE_DELETE”O usuário atual removeu uma mensagem salva.
| Campo | Tipo | Descrição |
|---|---|---|
| message_id | snowflake | A mensagem que não está mais salva |
RECENT_MENTION_DELETE
Seção intitulada “RECENT_MENTION_DELETE”O usuário atual removeu uma mensagem do feed de menções recentes.
| Campo | Tipo | Descrição |
|---|---|---|
| message_id | snowflake | A mensagem removida do feed |
FAVORITE_MEME_CREATE
Seção intitulada “FAVORITE_MEME_CREATE”O usuário atual salvou um meme. O payload é o objeto de meme completo.
FAVORITE_MEME_UPDATE
Seção intitulada “FAVORITE_MEME_UPDATE”Um dos memes do usuário atual foi alterado. O payload é o objeto de meme completo.
FAVORITE_MEME_DELETE
Seção intitulada “FAVORITE_MEME_DELETE”O usuário atual excluiu um meme.
| Campo | Tipo | Descrição |
|---|---|---|
| meme_id | snowflake | O meme excluído |
Guildas e canais
Seção intitulada “Guildas e canais”GUILD_CREATE
Seção intitulada “GUILD_CREATE”Uma guilda tornou-se disponível para a sessão. O payload é um objeto de guilda pronta.
roles, channels, emojis, stickers e voice_states estão sempre completos. Um cliente que armazena qualquer um deles para a guilda substitui sua lista armazenada pelo novo array. members é uma lista parcial. Um cliente adiciona ou atualiza esses membros e mantém todos os outros membros que já armazena.
Cada sessão recebe Guild Create quando uma guilda se torna disponível após Ready, por exemplo, após ingressar em uma ou após uma guilda indisponível se recuperar. Uma sessão de bot também recebe uma para cada guilda disponível no burst que segue Ready.
O Guild Create de uma sessão de bot tem unavailable: false, a menos que seja o primeiro Guild Create para uma guilda em que o bot ingressou durante a sessão e o Ready não a listou. Esse Dispatch não tem o campo unavailable, mesmo quando um Guild Delete com unavailable: true para a guilda veio antes dele. Uma sessão de usuário nunca recebe o campo no Guild Create.
GUILD_SYNC
Seção intitulada “GUILD_SYNC”Uma sessão que solicitou uma sincronização por meio do Lazy Request recebe novamente o estado completo atual da guilda. O payload é um objeto de guilda pronta, e um cliente lida com ele da mesma maneira que o Guild Create.
O Decoding Chat envia uma sincronização quando um Lazy Request alterna a guilda entre ativa e passiva, e quando sync: true nomeia uma guilda que a sessão ainda não sincronizou. Um segundo sync: true para uma guilda já sincronizada não envia nada.
GUILD_UPDATE
Seção intitulada “GUILD_UPDATE”A configuração de uma guilda foi alterada. O payload é o objeto de guilda completo com guild_id adicionado, que repete o id do próprio objeto.
Guild Update é o único Dispatch que uma guilda indisponível envia. Um cliente descobre a partir dele que uma guilda entrou ou saiu do estado indisponível.
GUILD_DELETE
Seção intitulada “GUILD_DELETE”Uma guilda saiu da visibilidade da sessão ou tornou-se indisponível.
| Campo | Tipo | Descrição |
|---|---|---|
| id | snowflake | ID da guilda |
| guild_id?1 | snowflake | Repete o id |
| unavailable? | boolean | Verdadeiro quando a guilda está temporariamente indisponível |
| unavailable_hidden? | boolean | Verdadeiro quando uma guilda indisponível está oculta do cliente |
1 Presente apenas quando a própria guilda é excluída. O payload possui id sozinho quando a conta sai de uma guilda ou é removida de uma, e id com unavailable no formulário indisponível.
Sem unavailable, a conta não é mais um membro, e um cliente exclui tudo o que armazena para aquela guilda. Com unavailable: true, a guilda está temporariamente inacessível. Um cliente mantém a guilda como uma entrada indisponível até que um posterior Guild Create envie seu estado completo novamente.
GUILD_ROLE_CREATE
Seção intitulada “GUILD_ROLE_CREATE”Um cargo foi criado em uma guilda.
| Campo | Tipo | Descrição |
|---|---|---|
| guild_id | snowflake | Guilda à qual o cargo pertence |
| role | objeto de cargo de guilda | O cargo criado |
GUILD_ROLE_UPDATE
Seção intitulada “GUILD_ROLE_UPDATE”Exatamente um registro de cargo foi alterado.
| Campo | Tipo | Descrição |
|---|---|---|
| guild_id | snowflake | Guilda à qual o cargo pertence |
| role | objeto de cargo de guilda | A representação completa e atualizada do cargo |
GUILD_ROLE_UPDATE_BULK
Seção intitulada “GUILD_ROLE_UPDATE_BULK”Uma operação alterou vários cargos juntos, na maioria das vezes uma reordenação.
| Campo | Tipo | Descrição |
|---|---|---|
| guild_id | snowflake | Guilda à qual os cargos pertencem |
| roles | array[objeto de cargo de guilda] | Cada cargo alterado em sua representação completa e atualizada |
GUILD_ROLE_DELETE
Seção intitulada “GUILD_ROLE_DELETE”Um cargo foi excluído de uma guilda.
| Campo | Tipo | Descrição |
|---|---|---|
| guild_id | snowflake | Guilda à qual o cargo pertencia |
| role_id | snowflake | O cargo excluído |
GUILD_EMOJIS_UPDATE
Seção intitulada “GUILD_EMOJIS_UPDATE”Os emojis de uma guilda foram alterados.
| Campo | Tipo | Descrição |
|---|---|---|
| guild_id | snowflake | Guilda à qual os emojis pertencem |
| emojis | array[objeto de emoji de guilda] | Cada emoji na guilda |
Um cliente que armazena os emojis da guilda os substitui por este array. O Decoding Chat não envia eventos per-emoji de criação, atualização ou exclusão.
GUILD_STICKERS_UPDATE
Seção intitulada “GUILD_STICKERS_UPDATE”Os adesivos de uma guilda foram alterados.
| Campo | Tipo | Descrição |
|---|---|---|
| guild_id | snowflake | Guilda à qual os adesivos pertencem |
| stickers | array[objeto de adesivo de guilda] | Cada adesivo na guilda |
Um cliente que armazena os adesivos da guilda os substitui por este array. O Decoding Chat não envia eventos per-sticker de criação, atualização ou exclusão.
CHANNEL_CREATE
Seção intitulada “CHANNEL_CREATE”Um canal tornou-se visível para a sessão, seja recém-criado ou recém-permitido. O payload é o objeto de canal completo, com guild_id presente para um canal de guilda.
CHANNEL_UPDATE
Seção intitulada “CHANNEL_UPDATE”Um canal visível foi alterado. O payload é o objeto de canal completo.
CHANNEL_UPDATE_BULK
Seção intitulada “CHANNEL_UPDATE_BULK”Uma operação alterou vários canais juntos, na maioria das vezes uma reordenação.
| Campo | Tipo | Descrição |
|---|---|---|
| guild_id | snowflake | Guilda à qual os canais pertencem |
| channels | array[objeto de canal] | Cada canal alterado em sua representação completa e atualizada |
Cada destinatário vê apenas os canais que pode visualizar. Um resultado vazio não produz Dispatch e não consome número de sequência.
CHANNEL_DELETE
Seção intitulada “CHANNEL_DELETE”Um canal saiu da visibilidade da sessão, seja excluído ou recém-oculto. O payload é o objeto de canal completo como era antes da mudança.
Os destinatários são as sessões que podiam ver o canal antes de ele ser excluído.
CHANNEL_RECIPIENT_ADD
Seção intitulada “CHANNEL_RECIPIENT_ADD”Um usuário ingressou em uma mensagem direta de grupo à qual a sessão pertence.
| Campo | Tipo | Descrição |
|---|---|---|
| channel_id | snowflake | Canal de mensagem direta de grupo |
| user | objeto de usuário parcial | O usuário que ingressou |
CHANNEL_RECIPIENT_REMOVE
Seção intitulada “CHANNEL_RECIPIENT_REMOVE”Um usuário saiu de uma mensagem direta de grupo à qual a sessão pertence.
| Campo | Tipo | Descrição |
|---|---|---|
| channel_id | snowflake | Canal de mensagem direta de grupo |
| user | objeto de usuário parcial | O usuário que saiu |
WEBHOOKS_UPDATE
Seção intitulada “WEBHOOKS_UPDATE”O conjunto de webhooks de um canal de guilda foi alterado. O evento não tem dados de webhook, portanto, um cliente que precisa do novo conjunto os lê pela API HTTP.
| Campo | Tipo | Descrição |
|---|---|---|
| guild_id | snowflake | Guilda à qual o canal pertence |
| channel_id | snowflake | Canal cujos webhooks mudaram |
INVITE_CREATE
Seção intitulada “INVITE_CREATE”Um convite foi criado. O payload é o objeto de convite completo estendido com seus metadados de convite.
Um convite de guilda chega às sessões que possuem MANAGE_CHANNELS no canal do convite. Um convite de mensagem direta de grupo chega a todos os destinatários desse grupo, sem verificação de permissão.
INVITE_DELETE
Seção intitulada “INVITE_DELETE”Um convite foi excluído.
| Campo | Tipo | Descrição |
|---|---|---|
| code | string | O código do convite excluído |
| channel_id? | snowflake | Canal para o qual o convite apontava, ausente quando o convite não armazenava nenhum |
| guild_id?1 | snowflake | Guilda à qual o convite pertencia |
1 Presente em todo convite de guilda. Um convite de mensagem direta de grupo não tem guild_id
Os destinatários são escolhidos da mesma maneira que para Criação de Convite.
Membros e moderação
Seção intitulada “Membros e moderação”GUILD_MEMBER_ADD
Seção intitulada “GUILD_MEMBER_ADD”Um usuário se tornou membro de uma guilda à qual a sessão está conectada. O payload é o objeto guild member completo com guild_id adicionado.
GUILD_MEMBER_UPDATE
Seção intitulada “GUILD_MEMBER_UPDATE”O estado de guilda de um membro ou sua representação pública de usuário mudou. O payload é o objeto guild member completo com guild_id adicionado.
Em uma guilda com mais de 250 membros, uma sessão passiva recebe este evento apenas quando o sujeito é seu próprio usuário.
GUILD_MEMBER_REMOVE
Seção intitulada “GUILD_MEMBER_REMOVE”Um usuário deixou de ser membro de uma guilda à qual a sessão está conectada.
| Field | Type | Description |
|---|---|---|
| guild_id | snowflake | Guilda que o usuário deixou |
| user1 | object | O usuário que não é mais um membro |
1 O objeto possui apenas id. Nenhum outro campo de conta é enviado, portanto, um cliente DEVE resolver a conta a partir do estado que já possui
Em uma guilda com mais de 250 membros, uma sessão passiva recebe este evento apenas quando o sujeito é seu próprio usuário.
GUILD_MEMBERS_CHUNK
Seção intitulada “GUILD_MEMBERS_CHUNK”Responde à solicitação Request Guild Members para a sessão solicitante.
| Field | Type | Description |
|---|---|---|
| guild_id | snowflake | Guilda à qual os membros pertencem |
| members | array[objeto guild member] | Até 1.000 membros |
| chunk_index | integer | Índice baseado em zero deste pedaço (chunk) |
| chunk_count | integer | Total de pedaços nesta resposta |
| presences? | array[objeto de presença] | Presente apenas quando a requisição definiu presences e pelo menos um membro tem uma presença visível |
| nonce? | string | Ecoado apenas quando a solicitação nomeou exatamente uma guilda e forneceu um nonce válido |
Uma solicitação que não corresponde a nenhum membro ainda produz um pedaço com um array members vazio, chunk_index 0 e chunk_count 1.
Este evento é entregue ao vivo e nunca é retido para repetição por Resume.
GUILD_MEMBER_LIST_UPDATE
Seção intitulada “GUILD_MEMBER_LIST_UPDATE”Uma lista de membros na qual a sessão se inscreveu através de Lazy Request ressincroniza os intervalos do assinante.
| Field | Type | Description |
|---|---|---|
| guild_id | snowflake | Guilda à qual a lista pertence |
| id | string | Identificador da lista, que é sempre o ID do canal como uma string |
| channel_id? | snowflake | Canal ao qual a lista está limitada |
| member_count | integer | Total de membros na lista |
| online_count | integer | Membros online na lista |
| groups | array[objeto member list group] | Cabeçalhos de grupo na ordem da lista |
| ops | array[objeto member list operation] | Operações a serem aplicadas |
Objeto member list group
Seção intitulada “Objeto member list group”| Field | Type | Description |
|---|---|---|
| id1 | string | Identificador do grupo, que é um ID de cargo içado (hoisted), online ou offline |
| count | integer | Membros no grupo |
1 Grupos de cargos içados vêm primeiro na ordem de cargos, depois online, depois offline
Um grupo cuja contagem é 0 é omitido. O grupo offline também é omitido assim que contiver mais de 1.000 membros e, nesse caso, items omite também os membros offline. O member_count pode então exceder o número de itens que um cliente poderá ler.
Objeto member list operation
Seção intitulada “Objeto member list operation”| Field | Type | Description |
|---|---|---|
| op | string | Tipo de operação, que é sempre SYNC |
| range | array[integer] | Intervalo [start, end] inclusivo que esta operação substitui |
| items | array[objeto member list item] | Itens de substituição para o intervalo |
SYNC é a única operação que o Decoding Chat envia. Um cliente DEVE ignorar uma operação cujo op não reconheça ou cujo intervalo falhe nos limites definidos em Lazy Request.
Objeto member list item
Seção intitulada “Objeto member list item”Cada item possui exatamente um dos campos.
| Field | Type | Description |
|---|---|---|
| group? | objeto member list group | Um cabeçalho de grupo ocupando uma posição na lista |
| member?1 | objeto guild member | Um membro da lista |
1 Estendido com um campo presence que sempre existe. O valor é o objeto de presença da guilda para esse membro quando o membro está visivelmente online para a guilda e, caso contrário, o espaço reservado (placeholder) {"status": "offline", "mobile": false, "afk": false}
GUILD_AUDIT_LOG_ENTRY_CREATE
Seção intitulada “GUILD_AUDIT_LOG_ENTRY_CREATE”Uma entrada de log de auditoria foi escrita. O payload é o objeto guild audit log entry que List guild audit logs retorna para a mesma entrada, com guild_id adicionado. Ele sempre possui id, action_type, user_id e target_id. reason é resolvido conforme o motivo de log de auditoria descreve, e options possui apenas as chaves publicadas do objeto audit log options, com a mesma quantidade e tipos booleanos. changes está presente quando pelo menos uma alteração sobrevive à filtragem.
Uma atualização que não altera nada não registra nenhuma entrada, como afirma o registro de ações de auditoria, de modo que não emite nenhum evento.
A chave de alteração ip é removida de changes, portanto, uma entrada cuja única alteração foi o ip não tem changes nenhum. Um cliente DEVE tratar um options ou changes ausente como um conjunto vazio.
Os destinatários são todas as sessões na guilda que possuem VIEW_AUDIT_LOG, incluindo a sessão em ação.
GUILD_BAN_ADD
Seção intitulada “GUILD_BAN_ADD”Um banimento de guilda foi criado.
| Field | Type | Description |
|---|---|---|
| guild_id | snowflake | Guilda na qual o banimento foi criado |
| user1 | object | O usuário banido |
1 O objeto possui apenas id. Nenhum outro campo de conta é enviado
GUILD_BAN_REMOVE
Seção intitulada “GUILD_BAN_REMOVE”Um banimento de guilda foi removido.
| Field | Type | Description |
|---|---|---|
| guild_id | snowflake | Guilda da qual o banimento foi removido |
| user1 | object | O usuário desbanido |
1 O objeto possui apenas id. Nenhum outro campo de conta é enviado
PRESENCE_UPDATE
Seção intitulada “PRESENCE_UPDATE”Uma presença visível mudou. O payload é um objeto de presença.
Uma sessão recebe uma presença de um amigo, de um destinatário de uma mensagem direta de grupo à qual pertence e de um membro de guilda no qual se inscreveu através do array members de uma solicitação Lazy Request. Uma sessão de bot não possui assinaturas de amigo ou de mensagem direta de grupo, de modo que o caminho da guilda é o único que a alcança.
As Atualizações de Presença (Presence Updates) normalmente seguem o Ready. A explosão (burst) inicial de Atualizações de Presença omite usuários já incluídos no Ready. Se o Ready demorar mais de 10.000 ms, as Atualizações de Presença podem chegar antes dele.
Presenças posteriores podem ser atrasadas até que sua guilda, relacionamento ou mensagem direta de grupo se torne visível. Elas podem chegar após Relationship Add, Relationship Update, Channel Create, Channel Update ou Channel Recipient Add. A entrega não é garantida para um sujeito que nunca se torna visível.
Objeto de presença (Presence object)
Seção intitulada “Objeto de presença (Presence object)”| Field | Type | Description |
|---|---|---|
| user | objeto partial user | O usuário ao qual a presença pertence |
| status | string | online, idle, dnd ou offline |
| mobile | boolean | Se o status ativo do usuário provém de uma sessão mobile |
| afk | boolean | Se todas as sessões do usuário estão ausentes (away) |
| custom_status | ?objeto custom status | O status personalizado do usuário |
| guild_id? | snowflake | Contexto da guilda, presente quando a presença chegou através de uma guilda |
O status publicado de uma conta é o status de maior precedência em suas sessões ativas, resolvido na ordem dnd, online, idle, invisible e, finalmente, offline quando não há sessão ativa. Uma sessão que selecionou invisible, e uma conta sem sessão ativa, ambas publicam status: "offline". Uma sessão que perdeu seu transporte é publicada como offline 5.000 ms depois, mesmo que permaneça retomável (resumable) pelo resto da sua janela de retenção de 60.000 ms. Um Resume bem-sucedido publica novamente o status que selecionou por último.
mobile é verdadeiro (true) apenas quando o status resolvido da conta é online e pelo menos uma sessão online se declarou móvel (mobile). afk é falso sempre que mobile é verdadeiro. Caso contrário, é verdadeiro apenas quando todas as sessões ativas estão ausentes.
custom_status é suprimido para null sempre que o status publicado for offline, para que uma conta invisível nunca revele um.
Objeto custom status
Seção intitulada “Objeto custom status”| Field | Type | Description |
|---|---|---|
| text | ?string | Texto de status personalizado |
| expires_at | ?ISO8601 timestamp | Quando o status personalizado expira |
| emoji_id | ?snowflake | ID do emoji personalizado |
| emoji_name | ?string | Emoji Unicode ou o nome do emoji personalizado |
| emoji_animated | boolean | Se o emoji personalizado é animado |
PRESENCE_UPDATE_BULK
Seção intitulada “PRESENCE_UPDATE_BULK”Várias presenças visíveis são entregues em um único Dispatch. Uma guilda o envia apenas quando sai do estado indisponível. Toda sessão que permaneceu conectada o recebe imediatamente após o Guild Create que restaura a guilda.
| Field | Type | Description |
|---|---|---|
| guild_id | snowflake | Contexto da guilda aplicado a cada entrada |
| presences1 | array[objeto de presença] | As presenças, no máximo 500 por Dispatch |
1 Apenas presenças visivelmente online são incluídas, e a própria presença do destinatário é removida. Um lote (batch) que estaria vazio não produz Dispatch, e um conjunto maior que 500 é dividido em Dispatches consecutivos
Cada entrada possui o contexto da guilda do lote. Um cliente DEVE tratar cada entrada como se ela mesma nomeasse guild_id.
PASSIVE_UPDATES
Seção intitulada “PASSIVE_UPDATES”Uma sessão passiva em uma guilda com mais de 250 membros recebe alterações perdidas a cada 30.000 ms. Nenhum evento é enviado quando nada mudou.
| Field | Type | Description |
|---|---|---|
| guild_id | snowflake | Guilda que a atualização cobre |
| channels | map[snowflake, snowflake] | last_message_id alterado por canal |
| voice_states?1 | array[objeto voice state] | Estados de voz alterados em canais que a sessão pode visualizar |
1 Omitido quando o conjunto estaria vazio. Um participante que saiu de um canal visível desde o ciclo anterior aparece aqui com o channel_id definido como null
channels contém apenas os canais cujo last_message_id mudou desde a atualização anterior para aquela sessão, e apenas canais que a sessão pode visualizar. voice_states contém apenas os estados de voz cuja version avançou.
Mensagens e reações
Seção intitulada “Mensagens e reações”MESSAGE_CREATE
Seção intitulada “MESSAGE_CREATE”Uma mensagem visível foi criada. O payload é o objeto message completo com os campos abaixo adicionados.
| Field | Type | Description |
|---|---|---|
| channel_type | integer | Tipo de canal do canal onde a mensagem foi criada |
| nicks? | map[snowflake, string] | Apelidos de mensagens diretas de grupo, presentes apenas para uma mensagem direta de grupo que armazena pelo menos um |
| mention_here? | boolean | Sempre true quando presente, e presente apenas quando a mensagem tem uma menção here |
| guild_id? | snowflake | Guilda à qual o canal pertence |
| member?1 | objeto guild member | O objeto guild member do autor, presente em um canal de guilda |
1 O campo user é removido dele, e a conta fica em author da mensagem
O Message Create sozinho substitui (overrides) tanto o filtro passivo quanto a lista ignored_events, e os dois usam testes diferentes. Uma menção direta, uma menção de um dos cargos do usuário, uma menção everyone ou uma menção here substitui o filtro passivo. Uma menção direta, everyone ou here, por si só, substitui a lista ignored_events.
MESSAGE_UPDATE
Seção intitulada “MESSAGE_UPDATE”Uma mensagem visível mudou. O payload é o objeto message atual completo, sem channel_type, nicks ou mention_here. Em um canal de guilda, ele é estendido com guild_id e com member, o objeto guild member do autor com seu campo user removido.
Os destinatários devem possuir READ_MESSAGE_HISTORY no canal, ou a mensagem deve ser mais recente do que o limite de histórico de mensagens da guilda.
MESSAGE_DELETE
Seção intitulada “MESSAGE_DELETE”Uma mensagem visível foi excluída.
| Campo | Tipo | Descrição |
|---|---|---|
| id | snowflake | A mensagem excluída |
| channel_id | snowflake | Canal onde a mensagem estava |
| content?1 | ?string | Conteúdo que a mensagem continha antes de ser excluída |
| author_id?1 | snowflake | Conta que escreveu a mensagem |
| guild_id? | snowflake | Guilda à qual o canal pertence |
| member?2 | objeto membro da guilda | O objeto de membro da guilda do autor, presente em um canal de guilda |
1 Ambos os campos são omitidos quando um administrador da instância excluiu a mensagem por meio da API de Administração, quando o Decoding Chat a excluiu após uma denúncia CSAM, ou quando o Decoding Chat a excluiu porque a moderação de conteúdo bloqueou uma pré-visualização de link nela, e author_id também é omitido para uma mensagem sem autor.
2 O campo user é removido dele, e o campo inteiro fica ausente quando author_id está ausente ou o autor não é mais um membro.
MESSAGE_DELETE_BULK
Seção intitulada “MESSAGE_DELETE_BULK”Várias mensagens em um canal foram excluídas juntas.
| Campo | Tipo | Descrição |
|---|---|---|
| ids | array[snowflake] | As mensagens excluídas |
| channel_id | snowflake | Canal onde as mensagens estavam |
| guild_id? | snowflake | Guilda à qual o canal pertence |
MESSAGE_ACK
Seção intitulada “MESSAGE_ACK”O estado de leitura do usuário atual avançou para um canal, geralmente porque outra das sessões da conta o leu.
| Campo | Tipo | Descrição |
|---|---|---|
| channel_id | snowflake | Canal cujo estado de leitura avançou |
| message_id | snowflake | Mensagem para a qual o estado de leitura agora aponta |
| mention_count | integer | Contagem restante de menções para o canal |
| manual? | boolean | Se a confirmação foi explícita |
| version? | string | Versão do estado de leitura como uma string decimal |
MESSAGE_REACTION_ADD
Seção intitulada “MESSAGE_REACTION_ADD”Um usuário adicionou uma reação a uma mensagem.
| Campo | Tipo | Descrição |
|---|---|---|
| user_id | snowflake | Usuário que reagiu |
| channel_id | snowflake | Canal onde a mensagem está |
| message_id | snowflake | Mensagem que recebeu a reação |
| emoji | objeto emoji de reação | O emoji |
| guild_id? | snowflake | Guilda à qual o canal pertence |
| member? | objeto membro da guilda | O objeto de membro da guilda do usuário que reagiu, presente em um canal de guilda |
Em um canal de guilda, a sessão nomeada pelo session_id da solicitação é excluída e esse campo é removido do payload. Em um canal privado, o campo é entregue como session_id e não exclui ninguém, então um cliente DEVE tolerar receber de volta sua própria reação.
Objeto emoji de reação
Seção intitulada “Objeto emoji de reação”| Campo | Tipo | Descrição |
|---|---|---|
| name | string | Emoji Unicode, ou o nome do emoji personalizado |
| id? | snowflake | ID do emoji personalizado, ausente para um emoji Unicode |
| animated?1 | boolean | Se o emoji personalizado é animado |
1 Presente apenas no evento Message Reaction Add que cria a primeira reação com aquele emoji na mensagem. Uma adição a um emoji que já tem um reator, um Message Reaction Remove e um Message Reaction Remove Emoji omitem o campo.
Nem id nem animated são nulos em nenhum momento. Uma reação Unicode omite ambos, então um cliente distingue as formas pela presença de id. Um cliente NÃO DEVE interpretar um animated ausente como false.
MESSAGE_REACTION_ADD_MANY
Seção intitulada “MESSAGE_REACTION_ADD_MANY”Com a flag de sessão DEBOUNCE_MESSAGE_REACTIONS, adições em canais privados são agrupadas ao longo de 650 ms e entregues juntas. Cada janela mantém as 512 últimas adições. Adições em canais de guilda sempre chegam como eventos individuais Message Reaction Add.
| Campo | Tipo | Descrição |
|---|---|---|
| channel_id1 | snowflake | Canal onde a mensagem está |
| message_id1 | snowflake | Mensagem que recebeu as reações |
| guild_id?1 | snowflake | Guilda à qual o canal pertence |
| reactions | array[objeto de adição de reação] | As adições combinadas, na ordem de chegada |
1 Todas as adições em reactions pertencem a esta mensagem. Uma janela cobrindo várias mensagens produz um Dispatch separado para cada uma.
Quando a janela se fecha contendo exatamente uma adição, o Decoding Chat envia um Message Reaction Add para a sessão. Uma sessão sem a flag recebe um Message Reaction Add por adição.
Objeto de adição de reação
Seção intitulada “Objeto de adição de reação”| Campo | Tipo | Descrição |
|---|---|---|
| user_id | snowflake | Usuário que reagiu |
| emoji | objeto emoji de reação | O emoji |
| member? | objeto membro da guilda | O objeto de membro da guilda do usuário que reagiu, presente em um canal de guilda |
MESSAGE_REACTION_REMOVE
Seção intitulada “MESSAGE_REACTION_REMOVE”A reação de um usuário foi removida de uma mensagem.
| Campo | Tipo | Descrição |
|---|---|---|
| user_id | snowflake | Usuário cuja reação foi removida |
| channel_id | snowflake | Canal onde a mensagem está |
| message_id | snowflake | Mensagem em que a reação estava |
| emoji | objeto emoji de reação | O emoji |
| guild_id? | snowflake | Guilda à qual o canal pertence |
| member? | objeto membro da guilda | O objeto de membro da guilda do usuário, presente em um canal de guilda |
A exclusão funciona exatamente como em Message Reaction Add, então a sessão atuante é descartada em um canal de guilda e mantida em um privado.
Com o debounce de reação ativado, uma adição removida dentro da mesma janela não produz nenhum dos eventos para essa mensagem, usuário e emoji.
MESSAGE_REACTION_REMOVE_ALL
Seção intitulada “MESSAGE_REACTION_REMOVE_ALL”Todas as reações foram removidas de uma mensagem de uma só vez.
| Campo | Tipo | Descrição |
|---|---|---|
| channel_id | snowflake | Canal onde a mensagem está |
| message_id | snowflake | Mensagem cujas reações foram limpas |
| guild_id? | snowflake | Guilda à qual o canal pertence |
MESSAGE_REACTION_REMOVE_EMOJI
Seção intitulada “MESSAGE_REACTION_REMOVE_EMOJI”Todas as reações usando um emoji foram removidas de uma mensagem.
| Campo | Tipo | Descrição |
|---|---|---|
| channel_id | snowflake | Canal onde a mensagem está |
| message_id | snowflake | Mensagem onde as reações estavam |
| emoji | objeto emoji de reação | O emoji cujas reações foram removidas |
| guild_id? | snowflake | Guilda à qual o canal pertence |
TYPING_START
Seção intitulada “TYPING_START”Um usuário visível começou a digitar em um canal.
| Campo | Tipo | Descrição |
|---|---|---|
| channel_id | snowflake | Canal no qual o usuário está digitando |
| user_id | snowflake | Usuário que começou a digitar |
| timestamp | integer | Segundos Unix de quando a digitação começou |
| guild_id? | snowflake | Guilda à qual o canal pertence |
| member? | objeto membro da guilda | O objeto de membro da guilda do usuário digitando, presente em um canal de guilda |
O override typing definido por meio da Solicitação Preguiçosa (Lazy Request) decide a entrega em uma guilda. Sem override, uma sessão recebe o evento quando está ativa na guilda ou quando a guilda tem 250 membros ou menos, então uma sessão passiva em uma guilda pequena ainda o recebe. Uma guilda que define o bit TYPING_EVENTS em suas operações de guilda desativadas não produz o evento para ninguém.
CHANNEL_PINS_UPDATE
Seção intitulada “CHANNEL_PINS_UPDATE”O horário do pin mais recente de um canal mudou.
| Campo | Tipo | Descrição |
|---|---|---|
| channel_id | snowflake | Canal cujos pins mudaram |
| last_pin_timestamp | ?timestamp ISO8601 | Horário do pin mais recente, nulo quando nada está fixado |
| guild_id? | snowflake | Guilda à qual o canal pertence |
CHANNEL_PINS_ACK
Seção intitulada “CHANNEL_PINS_ACK”O usuário atual confirmou os pins de um canal. Todas as sessões da conta recebem o evento, incluindo aquela que emitiu a confirmação.
| Campo | Tipo | Descrição |
|---|---|---|
| channel_id | snowflake | Canal cujos pins foram confirmados |
| timestamp | timestamp ISO8601 | Horário que a confirmação registrou para o canal |
Voz e chamadas
Seção intitulada “Voz e chamadas”VOICE_STATE_UPDATE
Seção intitulada “VOICE_STATE_UPDATE”O estado de voz de um participante mudou. O payload é um objeto de estado de voz.
Os destinatários são as sessões que podem visualizar o canal de voz, incluindo sessões passivas. Uma sessão passiva em uma guilda com mais de 250 membros também recebe os estados de voz alterados por meio de Atualizações Passivas.
Um channel_id nulo significa que o participante saiu.
Objeto de estado de voz
Seção intitulada “Objeto de estado de voz”| Campo | Tipo | Descrição |
|---|---|---|
| guild_id | ?snowflake | Guilda à qual o canal de voz pertence, nulo em uma chamada |
| channel_id | ?snowflake | Canal de voz, nulo quando o participante saiu |
| user_id | ?snowflake | Participante |
| connection_id | ?string | Identidade da conexão de voz |
| session_id | ?string | Sessão de gateway proprietária da conexão |
| member | ?objeto membro da guilda | O objeto de membro da guilda do participante, nulo em uma chamada |
| mute | boolean | Mudo pelo servidor |
| deaf | boolean | Surdo pelo servidor |
| self_mute | boolean | Mudo do microfone local |
| self_deaf | boolean | Surdo da saída local |
| self_video | boolean | Se o participante publica vídeo da câmera |
| self_stream1 | boolean | Se a conexão anuncia uma faixa de compartilhamento de tela |
| is_mobile | boolean | Se o participante está em um cliente móvel |
| suppress | boolean | Se o participante está suprimido |
| viewer_stream_keys | array[string] | Streams que esta conexão está assistindo |
| e2ee_capable | boolean | Se o cliente do participante suporta voz com criptografia de ponta a ponta |
| version | integer | Versão monotônica do estado de voz deste participante |
1 O cliente do participante reporta esse valor. Em um canal de voz de guilda, o Decoding Chat o define como falso quando o participante não tem a permissão STREAM.
A forma de transmissão não tem region_id, server_id, latitude ou longitude.
VOICE_SERVER_UPDATE
Seção intitulada “VOICE_SERVER_UPDATE”A sessão recebeu ou substituiu sua própria concessão de voz. Entregue apenas à sessão solicitante.
| Campo | Tipo | Descrição |
|---|---|---|
| token | string | O token de acesso do LiveKit que esta conexão apresenta |
| endpoint | string | A URL de sinalização do LiveKit para se conectar, um endereço ws:// ou wss:// |
| connection_id | string | A conexão de voz coberta pela concessão |
| channel_id | snowflake | O canal coberto pela concessão |
| guild_id?1 | snowflake | A guilda à qual o canal pertence |
| e2ee_key?2 | string | O material de chave que a criptografia de ponta a ponta do canal usa |
1 Presente para um canal de voz de guilda e ausente para uma chamada, de forma que um cliente lê o escopo a partir deste campo.
2 Presente apenas quando o canal possui criptografia de ponta a ponta.
O Decoding Chat usa LiveKit para mídia de voz. Não há um segundo websocket de voz, nenhum conjunto de opcode de voz e nenhuma etapa de descoberta UDP. Um cliente abre uma conexão LiveKit para endpoint, apresenta o token lá e fala o protocolo LiveKit a partir desse momento. A Voz define a nomeação da sala, a identidade do participante e as fontes de faixa que uma concessão admite.
Uma concessão é emitida quando uma conexão é aberta, quando ela se move para outro canal e quando sua região muda. Alternar self_mute, self_video ou self_stream não produz uma nova concessão. Uma mudança de região de chamada reemite uma concessão para cada participante da chamada.
ENTRANCE_SOUND_PLAY
Seção intitulada “ENTRANCE_SOUND_PLAY”Um participante pediu para que seu som de entrada tocasse em um canal de voz no qual ele já está conectado.
| Campo | Tipo | Descrição |
|---|---|---|
| user_id | snowflake | Participante cujo som toca |
| channel_id | snowflake | Canal de voz |
| guild_id | ?snowflake | Guilda à qual o canal pertence, nulo para uma chamada |
| sound_id | snowflake | Som de entrada |
| hash | string | Hash de conteúdo do arquivo de som |
| url | string | URL para buscar o som |
| duration_ms | integer | Duração do som em milissegundos |
| content_type | string | Tipo MIME do arquivo de som |
Os destinatários são todas as outras contas com um estado de voz naquele canal, um Dispatch cada e no máximo um por conta. A conta solicitante nunca recebe seu próprio som.
CALL_CREATE
Seção intitulada “CALL_CREATE”Uma chamada de canal privado começou, ou tornou-se visível no estado inicial da sessão.
| Campo | Tipo | Descrição |
|---|---|---|
| channel_id | snowflake | Canal em que a chamada está |
| message_id | snowflake | Mensagem de chamada que abriu a chamada |
| region | ?string | Região de voz que atende a chamada, nulo até que uma seja escolhida |
| ringing | array[snowflake] | Destinatários sendo chamados (tocando) |
| voice_states1 | array[objeto de estado de voz] | Participantes, ordenados por ID do participante |
| recipients?2 | array[snowflake] | Todos os destinatários do canal |
| created_at?2 | integer | Milissegundos Unix de quando a chamada foi aberta |
1 As entradas também incluem region_id e server_id, que os clientes DEVEM ignorar.
2 Presente no estado da chamada inicial ou recuperada.
O estado inicial da chamada chega logo após o Ready. O estado recuperado pode chegar após uma perda na conexão da chamada, quer o cliente tenha recebido o evento Call Delete ou não.
Os destinatários são todos os destinatários do canal, não importa se eles entraram na chamada ou não. O mesmo conjunto recebe o Call Update e o Call Delete.
CALL_UPDATE
Seção intitulada “CALL_UPDATE”O conjunto de toque, lista de participantes ou região de uma chamada ativa mudou. O payload tem a mesma estrutura de Call Create sem recipients e created_at.
Uma operação sem efeito visível não produz nenhum Call Update.
CALL_DELETE
Seção intitulada “CALL_DELETE”Uma chamada terminou ou tornou-se indisponível.
| Campo | Tipo | Descrição |
|---|---|---|
| channel_id | snowflake | Canal no qual a chamada estava |
| unavailable?1 | boolean | Verdadeiro quando a chamada tornou-se indisponível |
1 Ausente quando a chamada terminou.
Com unavailable: true, o cliente DEVE manter a chamada como uma entrada indisponível. Se ela se tornar disponível novamente, um novo Call Create incluirá recipients e created_at. A recuperação não é garantida.
Eventos de resposta de contagem
Seção intitulada “Eventos de resposta de contagem”GUILD_COUNTS_UPDATE
Seção intitulada “GUILD_COUNTS_UPDATE”Responde ao Solicitar Contagens de Guildas para a sessão solicitante.
| Campo | Tipo | Descrição |
|---|---|---|
| counts | array[objeto de entrada de contagem de guilda] | Uma entrada por guilda que respondeu a tempo |
| nonce? | string | Ecoado quando a solicitação forneceu um nonce válido |
Uma guilda que não está conectada, ou que perdeu seu prazo, não tem nenhuma entrada em counts.
Objeto de entrada de contagem de guilda
Seção intitulada “Objeto de entrada de contagem de guilda”| Campo | Tipo | Descrição |
|---|---|---|
| guild_id | snowflake | Guilda que as contagens descrevem |
| member_count | integer | Total de membros |
| online_count1 | integer | Membros online visíveis para a conta solicitante |
1 Conta apenas os membros online que compartilham pelo menos um canal que a conta solicitante pode visualizar. Uma conta que tem a permissão ADMINISTRATOR recebe a contagem online inteira da guilda, e uma conta que não pode visualizar nenhum canal recebe 1 quando ela mesma está online e 0 quando não está.
CHANNEL_MEMBER_COUNTS_UPDATE
Seção intitulada “CHANNEL_MEMBER_COUNTS_UPDATE”Responde ao Solicitar Contagens de Membros do Canal para a sessão solicitante.
| Campo | Tipo | Descrição |
|---|---|---|
| counts | array[objeto de entrada de contagem de canal] | Uma entrada por canal que respondeu |
| nonce? | string | Ecoado quando a solicitação forneceu um nonce válido |
Um canal que a sessão não pode visualizar, e um canal no qual faltar a permissão VIEW_CHANNEL_MEMBERS, não tem nenhuma entrada em counts.
Objeto de entrada de contagem de canal
Seção intitulada “Objeto de entrada de contagem de canal”| Campo | Tipo | Descrição |
|---|---|---|
| guild_id | snowflake | Guilda à qual o canal pertence |
| channel_id | snowflake | Canal que as contagens descrevem |
| member_count | integer | Membros que podem visualizar o canal |
| online_count | integer | Membros online que podem visualizar o canal |
Representação de recursos
Seção intitulada “Representação de recursos”Todo objeto de recurso nomeado nesta página tem a representação definida pela API HTTP. Um payload Dispatch com um objeto de recurso tem os mesmos campos, com os eventos de escopo de guilda adicionando guild_id e os eventos de mensagem e reação adicionando member.
Estas reduções são específicas do Gateway e não aparecem em lugar nenhum da API HTTP. O evento Ready remove user de cada relacionamento e de cada membro de guilda e move essas contas para seu array users. O member adicionado a um evento de mensagem tem o seu próprio user removido, e a conta fica em author da mensagem. Um cliente DEVE resolver essas contas a partir do payload circundante.

