Note : à partir de l'API v10, le domaine de l'API Discord est passé de discordapp.com à discord.com. Le composant a été mis à jour pour utiliser la version 10 de l'API et le nouveau domaine.
Les passerelles sont la forme de communication en temps réel de Discord via des WebSockets sécurisés. Les clients reçoivent des événements et des données via la passerelle à laquelle ils sont connectés et envoient des données via l'API REST.
Vous devez d'abord générer un nouveau Bot et copier le jeton Bot qui sera utilisé pour s'authentifier via l'API. Définissez ensuite ce jeton dans le composant API.
TsgcWSAPI_Discord1.DiscordOptions.BotOptions.Token := '...bot token here...';
Maintenir une application avec état peut être difficile en raison de la quantité de données à traiter, surtout à grande échelle. Les Gateway Intents sont un système pour vous aider à réduire cette charge de calcul.
Lors de l'identification auprès de la passerelle, vous pouvez spécifier un paramètre intents qui vous permet de vous abonner conditionnellement à des « intents » prédéfinis, groupes d'événements définis par Discord. Si vous ne spécifiez pas un certain intent, vous ne recevrez aucun des événements de passerelle regroupés dans ce groupe. Les intents valides sont (valeur zéro signifie que tous les événements sont reçus) :
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
Les battements de cœur sont gérés automatiquement par le composant, vous n'avez donc pas à vous en préoccuper. Lorsque le client se connecte au serveur, le serveur envoie une réponse HELLO avec un intervalle de battement de cœur, et le composant lit la réponse et ajuste automatiquement le battement de cœur pour envoyer un ping toutes les x secondes. Parfois, le serveur peut envoyer un ping au client ; cela est également géré automatiquement par le client.
Lorsque la connexion est prête, après un login et une autorisation réussis par le serveur, l'événement OnDiscordReady est déclenché et vous pouvez alors commencer à recevoir des mises à jour du serveur.
Si la connexion se ferme de manière inattendue, lorsque le client tente de se reconnecter, il appelle l'événement OnDiscordBeforeReconnect. Le composant sauvegarde automatiquement toutes les données nécessaires pour effectuer une reprise réussie, mais les paramètres peuvent être modifiés si nécessaire. Si vous ne souhaitez pas vous reconnecter et démarrer une nouvelle session propre, définissez simplement Reconnect sur False.
Si la session est reprise, l'événement OnDiscordResumed est déclenché. S'il s'agit d'une nouvelle session, OnDiscordReady sera déclenché.
Les événements sont distribués via OnDiscordDispatch, vous pouvez donc y lire les événements envoyés par le serveur au client.
procedure OnDiscordDispatch(Sender: TObject; const aEvent, RawData: string);
begin
DoLog('#discord dispatch: ' + aEvent + ' ' + RawData);
end;
aEvent le paramètre contient le nom de l'événement.
RawData contient le message JSON complet.
Pour demander des informations sur les guildes, les utilisateurs ou mettre à jour des données... au lieu d'utiliser des messages WebSocket de passerelle, Discord requiert l'utilisation de requêtes HTTP. Vous trouverez ci-dessous toutes les méthodes disponibles pour effectuer une requête 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;
Exemple : obtenir les informations de l'utilisateur actuel
result := GET_Request('/users/@me');
exemple de réponse du serveur :
{
"id": "637423922035480852",
"username": "test",
"avatar": null,
"discriminator": "5125",
"bot": true,
"email": null,
"verified": true,
"locale": "en-US",
"mfa_enabled": false,
"flags": 0
}