Uwaga: Począwszy od wersji API v10, domena API Discord zmieniła się z discordapp.com na discord.com. Komponent został zaktualizowany do wersji API 10 i nowej domeny.
Bramy (Gateways) to mechanizm Discord do komunikacji w czasie rzeczywistym za pośrednictwem bezpiecznych WebSockets. Klienci odbierają zdarzenia i dane przez bramę, z którą są połączeni, i wysyłają dane przez REST API.
W pierwszej kolejności należy wygenerować nowego bota i skopiować token bota, który będzie używany do uwierzytelniania przez API. Następnie należy ustawić ten token w komponencie API.
TsgcWSAPI_Discord1.DiscordOptions.BotOptions.Token := '...bot token here...';
Utrzymywanie aplikacji ze stanem może być trudne ze względu na ilość danych do przetworzenia, zwłaszcza w dużej skali. Gateway Intents to system pomagający zmniejszyć to obciążenie obliczeniowe.
Podczas identyfikacji w bramce można określić parametr intents, który umożliwia warunkową subskrypcję predefiniowanych "intencji" — grup zdarzeń zdefiniowanych przez Discord. Nieuwzględnienie danej intencji skutkuje brakiem otrzymywania zdarzeń bramki należących do tej grupy. Prawidłowe intencje to (wartość zero oznacza odbieranie wszystkich zdarzeń):
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
Sygnały heartbeat są obsługiwane automatycznie przez komponent, bez konieczności ich ręcznej obsługi. Gdy klient łączy się z serwerem, serwer wysyła odpowiedź HELLO z interwałem heartbeat, a komponent odczytuje tę odpowiedź i automatycznie dostosowuje heartbeat, aby wysyłać ping co określoną liczbę sekund. Czasami serwer może wysłać ping do klienta; jest to również obsługiwane automatycznie przez klienta.
Gdy połączenie jest gotowe, po pomyślnym zalogowaniu i autoryzacji przez serwer, wywoływane jest zdarzenie OnDiscordReady, po czym można rozpocząć odbieranie aktualizacji z serwera.
Jeśli połączenie zostaje nieoczekiwanie zamknięte i klient próbuje ponownie się połączyć, wywoływane jest zdarzenie OnDiscordBeforeReconnect. Komponent automatycznie zapisuje wszystkie dane potrzebne do pomyślnego wznowienia, ale parametry można zmienić w razie potrzeby. Jeśli nie chcesz ponownie łączyć się i rozpocząć nową czystą sesję, ustaw Reconnect na False.
Jeśli sesja zostanie wznowiona, wywoływane jest zdarzenie OnDiscordResumed. Jeśli to nowa sesja, wywoływane będzie OnDiscordReady.
Zdarzenia są wysyłane przez OnDiscordDispatch; tutaj można odczytywać zdarzenia wysyłane przez serwer do klienta.
procedure OnDiscordDispatch(Sender: TObject; const aEvent, RawData: string);
begin
DoLog('#discord dispatch: ' + aEvent + ' ' + RawData);
end;
aEvent parametr zawiera nazwę zdarzenia.
RawData zawiera pełną wiadomość JSON.
W celu żądania informacji o guildach, użytkownikach lub aktualizacji danych... zamiast używać wiadomości bramki WebSocket, Discord wymaga użycia żądań HTTP. Poniżej znajdziesz wszystkie metody dostępne do wykonywania żądań 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;
Przykład: pobierz informacje o bieżącym użytkowniku
result := GET_Request('/users/@me');
przykładowa odpowiedź z serwera:
{
"id": "637423922035480852",
"username": "test",
"avatar": null,
"discriminator": "5125",
"bot": true,
"email": null,
"verified": true,
"locale": "en-US",
"mfa_enabled": false,
"flags": 0
}