API Discord

Discord

注意: 自 API v10 起,Discord API 域名已从 discordapp.com 更改为 discord.com。该组件已更新为使用 API 版本 10 和新域名。

 

Gateway 是 Discord 通过安全 WebSocket 进行实时通信的形式。客户端通过其连接的 gateway 接收事件和数据,并通过 REST API 发送数据。

 

授权

首先,您必须生成一个新的机器人,并复制用于通过 API 进行认证的 Bot Token。然后在 API 组件中设置此令牌。

 


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

 

意图

在需要处理大量数据时,尤其是规模化时,维护有状态应用程序可能比较困难。Gateway Intents 是一种帮助您降低计算负担的系统。

向 gateway 进行标识时,您可以指定一个 intents 参数,允许您有条件地订阅预定义的"意图",即 Discord 定义的事件组。如果您不指定某个意图,将不会收到该组中的任何 gateway 事件。有效的意图为(零值表示接收所有事件):

 

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 秒发送一次 ping。有时服务器也会向客户端发送 ping;这也由客户端自动处理。

 

连接就绪

连接就绪后,经服务器成功登录并授权后,会触发 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 消息。

 

HTTP 请求

为了请求 guild、用户信息或更新数据……Discord 要求使用 HTTP 请求而非 gateway WebSocket 消息,以下是所有可用于发起 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
}