注意: 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 が発生します。
イベントは OnDiscordDispatch を通じてディスパッチされるため、ここでサーバーからクライアントに送信されたイベントを読み取ることができます。
procedure OnDiscordDispatch(Sender: TObject; const aEvent, RawData: string);
begin
DoLog('#discord dispatch: ' + aEvent + ' ' + RawData);
end;
aEvent パラメーターにはイベント名が含まれます。
RawData には完全なJSONメッセージが含まれます。
ギルド、ユーザーに関する情報を取得したり、データを更新したりするために、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
}