注意: 自 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 消息。
为了请求 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
}