API Discord

Discord

참고: API v10부터 Discord API 도메인이 discordapp.com에서 discord.com으로 변경되었습니다. 구성 요소는 API 버전 10과 새 도메인을 사용하도록 업데이트되었습니다.

 

Gateway는 안전한 WebSockets를 통한 Discord의 실시간 통신 형태입니다. 클라이언트는 연결된 gateway를 통해 이벤트와 데이터를 수신하고 REST API를 통해 데이터를 보냅니다.

 

권한 부여

먼저 새 Bot을 생성하고 API를 통해 인증하는 데 사용할 Bot Token을 복사해야 합니다. 그런 다음 이 토큰을 API Component에 설정하십시오.

 


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

 

Intents

상태 저장 애플리케이션을 유지하는 것은 특히 대규모로 처리해야 하는 데이터 양 측면에서 어려울 수 있습니다. Gateway Intents는 그러한 계산 부담을 줄이는 데 도움이 되는 시스템입니다.

gateway에 식별할 때, intents 매개변수를 지정하여 사전 정의된 "intents", 즉 Discord가 정의한 이벤트 그룹을 조건부로 구독할 수 있습니다. 특정 intent를 지정하지 않으면, 해당 그룹으로 묶인 gateway 이벤트를 받지 못합니다. 유효한 intent는 다음과 같습니다(0 값은 모든 이벤트가 수신됨을 의미):

 

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

하트비트는 구성 요소가 자동으로 처리하므로 신경 쓸 필요가 없습니다. 클라이언트가 서버에 연결되면 서버가 하트비트 간격이 있는 HELLO 응답을 보내고, 구성 요소가 응답을 읽고 x초마다 ping을 보내도록 하트비트를 자동으로 조정합니다. 때때로 서버가 클라이언트에 ping을 보낼 수 있으며, 이것도 클라이언트가 자동으로 처리합니다.

 

Connection Ready

연결이 준비되면, 즉 성공적인 로그인과 서버의 권한 부여 후에 OnDiscordReady 이벤트가 발생하며, 그 후에 서버로부터 업데이트를 수신하기 시작할 수 있습니다.

 

Connection Resume

 

연결이 예기치 않게 닫히면 클라이언트가 다시 연결하려고 할 때 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 Requests

길드, 사용자에 대한 정보를 요청하거나 데이터를 업데이트하려면... gateway websocket 메시지를 사용하는 대신 Discord는 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
}