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.
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...';
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
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.
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.
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.
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.
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
}