API Discord

Discord

注意: API v10以降、DiscordのAPIドメインはdiscordapp.comからdiscord.comに変更されました。コンポーネントはAPIバージョン10と新しいドメインを使用するように更新されました。

 

ゲートウェイは Discord のセキュアな WebSocket を通じたリアルタイム通信の形式です。クライアントは接続しているゲートウェイを通じてイベントとデータを受信し、REST API を通じてデータを送信します。

 

認証

まず新しいボットを生成し、API を通じて認証するために使用するボットトークンをコピーします。次に、このトークンを API コンポーネントに設定します。

 


TsgcWSAPI_Discord1.DiscordOptions.BotOptions.Token := '...bot token here...';

 

インテント

特にスケール時に処理が期待されるデータ量を考えると、ステートフルなアプリケーションの維持は困難な場合があります。Gateway Intents は計算負荷を軽減するためのシステムです。

ゲートウェイへの識別時に、Discord によって事前定義された「インテント」(イベントのグループ)に条件付きでサブスクライブできる intents パラメータを指定できます。特定のインテントを指定しない場合、そのグループにまとめられたゲートウェイ イベントは受信されません。有効なインテントは以下の通りです(ゼロ値はすべてのイベントを受信することを意味します):

 

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

 

ハートビート

ハートビートはコンポーネントによって自動的に処理されるため、気にする必要はありません。クライアントがサーバーに接続すると、サーバーはハートビート間隔とともに HELLO レスポンスを送信し、コンポーネントはレスポンスを読み取り、x秒ごとにピングを送信するようにハートビートを自動調整します。サーバーからクライアントへのピング送信もクライアントによって自動的に処理されます。

 

接続準備完了

接続の準備ができ、サーバーによるログインと認可が正常に完了すると、OnDiscordReady イベントが発生し、サーバーからのアップデートの受信を開始できます。

 

接続の再開

 

接続が予期せず閉じられた場合、クライアントが再接続しようとすると OnDiscordBeforeReconnect イベントが呼び出されます。コンポーネントは成功した再開に必要なすべてのデータを自動的に保存しますが、必要に応じてパラメータを変更できます。再接続せずに新しいクリーンなセッションを開始したい場合は、Reconnect を False に設定してください。

 

セッションが再開された場合、OnDiscordResumed イベントが発生します。新しいセッションの場合は OnDiscordReady が発生します。

 

 

Dispatch Events

イベントは OnDiscordDispatch を通じてディスパッチされるため、ここでサーバーからクライアントに送信されたイベントを読み取ることができます。

 


procedure OnDiscordDispatch(Sender: TObject; const aEvent, RawData: string);
begin
  DoLog('#discord dispatch: ' + aEvent + ' ' + RawData);
end;

aEvent パラメーターにはイベント名が含まれます。

RawData には完全なJSONメッセージが含まれます。

 

HTTP リクエスト

ギルド、ユーザーに関する情報を取得したり、データを更新したりするために、DiscordはゲートウェイWebSocketメッセージの代わりにHTTPリクエストを使用することを要求します。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;

 

使用例: 現在のユーザー情報を取得する


result := GET_Request('/users/@me');

 

サーバーからのサンプルレスポンス:


{
"id": "637423922035480852",
"username": "test",
"avatar": null,
"discriminator": "5125",
"bot": true,
"email": null,
"verified": true,
"locale": "en-US",
"mfa_enabled": false,
"flags": 0
}