API Discord

Discord

Nota: A partir da API v10, o domínio da Discord API mudou de discordapp.com para discord.com. O componente foi atualizado para usar a versão 10 da API e o novo domínio.

 

Os Gateways são a forma de comunicação em tempo real do Discord sobre WebSockets seguros. Os clientes receberão eventos e dados pelo gateway ao qual estão conectados e enviarão dados pela REST API.

 

Autorização

Primeiro você deve gerar um novo Bot e copiar o Bot Token, que será utilizado para autenticar por meio da API. Em seguida, defina este token no Componente da API.

 


TsgcWSAPI_Discord1.DiscordOptions.BotOptions.Token := '...bot token here...';

 

Intents

Manter uma aplicação com estado pode ser difícil quando se trata da quantidade de dados que você precisa processar, especialmente em escala. Gateway Intents são um sistema para ajudar a reduzir essa carga computacional.

Ao se identificar para o gateway, você pode especificar um parâmetro intents que permite assinar condicionalmente "intents" predefinidos, grupos de eventos definidos pelo Discord. Se você não especificar um determinado intent, não receberá nenhum dos eventos de gateway agrupados nesse grupo. Os intents válidos são (o valor zero significa que todos os eventos são recebidos):

 

GUILDS (1 << 0) = Integer (1)

- GUILD_CREATE

- GUILD_DELETE

- GUILD_ROLE_CREATE

- GUILD_ROLE_UPDATE

- GUILD_ROLE_DELETE

- CHANNEL_CREATE

- CHANNEL_UPDATE

- CHANNEL_DELETE

- CHANNEL_PINS_UPDATE

GUILD_MEMBERS (1 << 1) = Integer (2)

  - GUILD_MEMBER_ADD

  - GUILD_MEMBER_UPDATE

  - GUILD_MEMBER_REMOVE

GUILD_BANS (1 << 2) = Integer (4)

- GUILD_BAN_ADD

- GUILD_BAN_REMOVE

GUILD_EMOJIS (1 << 3) = Integer (8)

- GUILD_EMOJIS_UPDATE

GUILD_INTEGRATIONS (1 << 4) = Integer (16)

- GUILD_INTEGRATIONS_UPDATE

GUILD_WEBHOOKS (1 << 5) = Integer (32)

- WEBHOOKS_UPDATE

GUILD_INVITES (1 << 6) = Integer (64)

- INVITE_CREATE

- INVITE_DELETE

GUILD_VOICE_STATES (1 << 7) = Integer (128)

- VOICE_STATE_UPDATE

GUILD_PRESENCES (1 << 8) = Integer (256)

- PRESENCE_UPDATE

GUILD_MESSAGES (1 << 9) = Integer (512)

- MESSAGE_CREATE

- MESSAGE_UPDATE

- MESSAGE_DELETE

GUILD_MESSAGE_REACTIONS (1 << 10) = Integer (1024)

- MESSAGE_REACTION_ADD

  - MESSAGE_REACTION_REMOVE

- MESSAGE_REACTION_REMOVE_ALL

- MESSAGE_REACTION_REMOVE_EMOJI

GUILD_MESSAGE_TYPING (1 << 11) = Integer (2048)

- TYPING_START

DIRECT_MESSAGES (1 << 12) = Integer (4096)

- CHANNEL_CREATE

- MESSAGE_CREATE

- MESSAGE_UPDATE

- MESSAGE_DELETE

- CHANNEL_PINS_UPDATE

DIRECT_MESSAGE_REACTIONS (1 << 13) = Integer (8192)

- MESSAGE_REACTION_ADD

  - MESSAGE_REACTION_REMOVE

- MESSAGE_REACTION_REMOVE_ALL

- MESSAGE_REACTION_REMOVE_EMOJI

DIRECT_MESSAGE_TYPING (1 << 14) = Integer (16384)

- TYPING_START

 

Heartbeat

Os heartbeats são tratados automaticamente pelo componente, portanto você não precisa se preocupar com eles. Quando o cliente conecta ao servidor, o servidor envia uma resposta HELLO com um intervalo de heartbeat, e o componente lê a resposta e ajusta automaticamente o heartbeat para enviar um ping a cada x segundos. Às vezes, o servidor pode enviar um ping ao cliente; isso também é tratado automaticamente pelo cliente.

 

Conexão Pronta

Quando a conexão está pronta, após um login bem-sucedido e a autorização pelo servidor, o evento OnDiscordReady é gerado e então você pode começar a receber atualizações do servidor.

 

Connection Resume

 

Se a conexão fechar inesperadamente, quando o cliente tenta reconectar, ele chama o evento OnDiscordBeforeReconnect. O componente salva automaticamente todos os dados necessários para fazer um resume bem-sucedido, mas os parâmetros podem ser alterados se necessário. Se você não quiser reconectar e iniciar uma nova sessão limpa, basta definir Reconnect como False.

 

Se a sessão for retomada, o evento OnDiscordResumed é disparado. Se for uma nova sessão, OnDiscordReady será disparado.

 

 

Despachar eventos

Os eventos são despachados por meio de OnDiscordDispatch, então aqui você pode ler os eventos enviados pelo servidor ao cliente.

 


procedure OnDiscordDispatch(Sender: TObject; const aEvent, RawData: string);
begin
  DoLog('#discord dispatch: ' + aEvent + ' ' + RawData);
end;

O parâmetro aEvent contém o nome do evento.

RawData contém a mensagem JSON completa.

 

HTTP Requests

Para solicitar informações sobre guilds, usuários ou atualizar dados... em vez de usar mensagens websocket do gateway, o Discord exige o uso de requisições HTTP. Veja abaixo todos os métodos disponíveis para fazer uma requisição HTTP:

 

function GET_Request(const aPath: String): string;

function POST_Request(const aPath, aMessage: String): string;

function PUT_Request(const aPath, aMessage: String): string;

function PATCH_Request(const aPath, aMessage: String): string;

function DELETE_Request(const aPath: String): string;

 

Exemplo: obter informações do usuário atual


result := GET_Request('/users/@me');

 

exemplo de resposta do servidor:


{
"id": "637423922035480852",
"username": "test",
"avatar": null,
"discriminator": "5125",
"bot": true,
"email": null,
"verified": true,
"locale": "en-US",
"mfa_enabled": false,
"flags": 0
}