Hinweis: Ab API v10 hat sich die Discord-API-Domäne von discordapp.com zu discord.com geändert. Die Komponente wurde aktualisiert, um API-Version 10 und die neue Domäne zu verwenden.
Gateways sind Discords Form der Echtzeitkommunikation über sichere WebSockets. Clients empfangen Ereignisse und Daten über das Gateway, mit dem sie verbunden sind, und senden Daten über die REST API.
Zuerst müssen Sie einen neuen Bot generieren und das Bot-Token kopieren, das zur Authentifizierung über die API verwendet wird. Legen Sie dann dieses Token in der API-Komponente fest.
TsgcWSAPI_Discord1.DiscordOptions.BotOptions.Token := '...bot token here...';
Die Pflege einer zustandsbehafteten Anwendung kann schwierig sein, wenn es um die Datenmenge geht, die Sie verarbeiten müssen, insbesondere im großen Maßstab. Gateway Intents sind ein System, das Ihnen hilft, diese Rechenlast zu senken.
Bei der Identifikation gegenüber dem Gateway können Sie einen intents-Parameter angeben, der es Ihnen ermöglicht, bedingt vordefinierte "Intents" zu abonnieren, Gruppen von Ereignissen, die von Discord definiert wurden. Wenn Sie ein bestimmtes Intent nicht angeben, erhalten Sie keine der Gateway-Ereignisse, die in dieser Gruppe zusammengefasst sind. Die gültigen Intents sind (der Wert null bedeutet, dass alle Ereignisse empfangen werden):
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
Heartbeats werden automatisch von der Komponente behandelt, sodass Sie sich nicht darum kümmern müssen. Wenn sich der Client mit dem Server verbindet, sendet der Server eine HELLO-Antwort mit einem Heartbeat-Intervall, und die Komponente liest die Antwort und passt den Heartbeat automatisch an, um alle x Sekunden ein Ping zu senden. Manchmal kann der Server ein Ping an den Client senden; dies wird ebenfalls automatisch vom Client behandelt.
Wenn die Verbindung bereit ist, wird nach einer erfolgreichen Anmeldung und Autorisierung durch den Server das Ereignis OnDiscordReady ausgelöst und Sie können beginnen, Aktualisierungen vom Server zu empfangen.
Wenn die Verbindung unerwartet geschlossen wird, ruft der Client beim Versuch, die Verbindung wiederherzustellen, das Ereignis OnDiscordBeforeReconnect auf. Die Komponente speichert automatisch alle für eine erfolgreiche Wiederaufnahme benötigten Daten, aber die Parameter können bei Bedarf geändert werden. Wenn Sie keine Wiederverbindung wünschen und eine neue, saubere Sitzung starten möchten, setzen Sie einfach Reconnect auf False.
Wenn die Sitzung wieder aufgenommen wird, wird das Ereignis OnDiscordResumed ausgelöst. Wenn es sich um eine neue Sitzung handelt, wird OnDiscordReady ausgelöst.
Ereignisse werden über OnDiscordDispatch verteilt, sodass Sie hier vom Server an den Client gesendete Ereignisse lesen können.
procedure OnDiscordDispatch(Sender: TObject; const aEvent, RawData: string);
begin
DoLog('#discord dispatch: ' + aEvent + ' ' + RawData);
end;
aEvent Parameter enthält den Ereignisnamen.
RawData enthält die vollständige JSON-Nachricht.
Um Informationen über Gilden, Benutzer anzufordern oder Daten zu aktualisieren... erfordert Discord anstelle von Gateway-WebSocket-Nachrichten die Verwendung von HTTP-Anfragen. Nachfolgend finden Sie alle verfügbaren Methoden, um eine HTTP-Anfrage zu stellen:
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;
Beispiel: aktuelle Benutzerinformationen abrufen
result := GET_Request('/users/@me');
Beispielantwort vom Server:
{
"id": "637423922035480852",
"username": "test",
"avatar": null,
"discriminator": "5125",
"bot": true,
"email": null,
"verified": true,
"locale": "en-US",
"mfa_enabled": false,
"flags": 0
}