API Discord

Discord

Nota: A partir de la versión 10 de la API, el dominio de la API de Discord ha cambiado de discordapp.com a discord.com. El componente ha sido actualizado para usar la versión 10 de la API y el nuevo dominio.

 

Los gateways son la forma de comunicación en tiempo real de Discord mediante WebSockets seguros. Los clientes recibirán eventos y datos a través del gateway al que estén conectados y enviarán datos a través de la API REST.

 

Autorización

Primero debe generar un nuevo Bot y copiar el Token del Bot que se usará para autenticarse a través de la API. Luego establezca este token en el componente API.

 


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

 

Intenciones

Mantener una aplicación con estado puede resultar complicado en cuanto a la cantidad de datos que se espera procesar, especialmente a gran escala. Los Gateway Intents son un sistema para ayudarle a reducir esa carga computacional.

Al identificarse con la puerta de enlace, puede especificar un parámetro intents que le permite suscribirse condicionalmente a "intents" predefinidos, grupos de eventos definidos por Discord. Si no especifica un cierto intent, no recibirá ninguno de los eventos de la puerta de enlace que se agrupan en ese grupo. Los intents válidos son (el valor cero significa que se reciben todos los eventos):

 

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

Los heartbeats son gestionados automáticamente por el componente, por lo que no tiene que preocuparse por ellos. Cuando el cliente se conecta al servidor, el servidor envía una respuesta HELLO con un intervalo de heartbeat, y el componente lee la respuesta y ajusta automáticamente el heartbeat para enviar un ping cada x segundos. En ocasiones el servidor puede enviar un ping al cliente; esto también es gestionado automáticamente por el cliente.

 

Conexión lista

Cuando la conexión está lista, después de un inicio de sesión y autorización correctos por parte del servidor, se genera el evento OnDiscordReady y a continuación puede comenzar a recibir actualizaciones del servidor.

 

Reanudación de conexión

 

Si la conexión se cierra de forma inesperada, cuando el cliente intenta reconectarse, llama al evento OnDiscordBeforeReconnect. El componente guarda automáticamente todos los datos necesarios para realizar una reanudación satisfactoria, pero los parámetros pueden modificarse si es necesario. Si no desea reconectarse e iniciar una nueva sesión limpia, simplemente establezca Reconnect en False.

 

Si la sesión se reanuda, se activa el evento OnDiscordResumed. Si es una nueva sesión, se activará OnDiscordReady.

 

 

Despachar eventos

Los eventos se despachan a través de OnDiscordDispatch, donde puede leer los eventos enviados por el servidor al cliente.

 


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

aEvent el parámetro contiene el nombre del evento.

RawData contiene el mensaje JSON completo.

 

Solicitudes HTTP

Para solicitar información sobre guilds, usuarios o actualizar datos... en lugar de utilizar mensajes de gateway websocket, Discord requiere el uso de solicitudes HTTP. A continuación encontrará todos los métodos disponibles para realizar una solicitud 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;

 

Ejemplo: obtener información del usuario actual


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

 

respuesta de muestra del servidor:


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