Opmerking: Vanaf API v10 is het Discord API-domein gewijzigd van discordapp.com naar discord.com. De component is bijgewerkt om API-versie 10 en het nieuwe domein te gebruiken.
Gateways zijn de vorm van realtime communicatie van Discord via beveiligde WebSockets. Clients ontvangen gebeurtenissen en gegevens via de gateway waarmee ze zijn verbonden en sturen gegevens via de REST API.
Eerst moet u een nieuwe Bot genereren en het Bot Token kopiëren dat wordt gebruikt voor authenticatie via de API. Stel dit token vervolgens in de API-component in.
TsgcWSAPI_Discord1.DiscordOptions.BotOptions.Token := '...bot token here...';
Het bijhouden van een stateful toepassing kan moeilijk zijn als het gaat om de hoeveelheid gegevens die u moet verwerken, vooral op schaal. Gateway Intents zijn een systeem om die rekenkundige last te verlichten.
Bij identificatie bij de gateway kunt u een intents-parameter opgeven waarmee u vooraf gedefinieerde "intents" kunt abonneren, groepen van gebeurtenissen gedefinieerd door Discord. Als u een bepaalde intent niet opgeeft, ontvangt u geen van de gateway-gebeurtenissen die in die groep zijn gebatcht. De geldige intents zijn (nulwaarde betekent dat alle gebeurtenissen worden ontvangen):
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) = Geheel getal (4096)
- CHANNEL_CREATE
- MESSAGE_CREATE
- MESSAGE_UPDATE
- MESSAGE_DELETE
- CHANNEL_PINS_UPDATE
DIRECT_MESSAGE_REACTIONS (1 << 13) = Geheel getal (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 worden automatisch verwerkt door de component, dus u hoeft zich er geen zorgen over te maken. Wanneer de client verbinding maakt met de server, stuurt de server een HELLO-antwoord met een heartbeat-interval, en de component leest het antwoord en past de heartbeat automatisch aan om elke x seconden een ping te sturen. Soms kan de server een ping naar de client sturen; dit wordt ook automatisch afgehandeld door de client.
Wanneer de verbinding gereed is, nadat een succesvolle aanmelding en autorisatie door de server, wordt de gebeurtenis OnDiscordReady geactiveerd en kunt u updates van de server beginnen te ontvangen.
Als de verbinding onverwacht wordt verbroken, roept het component bij de herverbindingspoging de gebeurtenis OnDiscordBeforeReconnect aan. Het component slaat automatisch alle benodigde gegevens op voor een succesvolle hervatie, maar parameters kunnen indien nodig worden gewijzigd. Als u niet opnieuw wilt verbinden en een nieuwe schone sessie wilt starten, stel dan Reconnect in op False.
Als de sessie wordt hervat, wordt de gebeurtenis OnDiscordResumed geactiveerd. Als het een nieuwe sessie is, wordt OnDiscordReady geactiveerd.
Gebeurtenissen worden verzonden via OnDiscordDispatch, zodat u hier de gebeurtenissen kunt lezen die door de server naar de client worden gestuurd.
procedure OnDiscordDispatch(Sender: TObject; const aEvent, RawData: string);
begin
DoLog('#discord dispatch: ' + aEvent + ' ' + RawData);
end;
aEvent-parameter bevat de naam van de gebeurtenis.
RawData bevat het volledige JSON-bericht.
Om informatie op te vragen over guilds, gebruikers, of gegevens bij te werken... in plaats van gateway websocket-berichten te gebruiken, vereist Discord het gebruik van HTTP-verzoeken. Hieronder vindt u alle beschikbare methoden om een HTTP-verzoek te maken:
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;
Voorbeeld: huidige gebruikersinformatie ophalen
result := GET_Request('/users/@me');
voorbeeldrespons van server:
{
"id": "637423922035480852",
"username": "test",
"avatar": null,
"discriminator": "5125",
"bot": true,
"email": null,
"verified": true,
"locale": "en-US",
"mfa_enabled": false,
"flags": 0
}