API Discord

Discord

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.

 

Autoryzacja

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

 

Intencje

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

 

Heartbeat

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.

 

Połączenie gotowe

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.

 

Wznawianie połączenia

 

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.

 

 

Dispatch Events

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.

 

Żądania HTTP

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
}