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