Skip to main content

Discord 社交 SDK 功能

系统版本要求

最低兼容版本:Android 5 / iOS 13.0 / Windows 10
最低支持版本:Android 7 / iOS 15.1 / Windows 10

系统版本介于两者之间时,可集成插件但功能被屏蔽。

步骤 1:配置 Discord 应用

info

如已完成 Discord 登录配置,可跳过创建应用步骤。

1.1 创建应用

  1. Discord 官网注册并认证账号
  2. 进入 开发者平台,点击 New Application

图片:创建应用

  1. 输入应用名称,点击 Create
  2. General Information 页面获取 APPLICATION ID

图片:获取 App ID

  1. INTLConfig.ini 中配置 Discord App ID

1.2 申请 SDK 访问权限

  1. 进入 开发者平台
  2. 点击 Getting Started,填写表单并提交

图片:填写表单1

图片:填写表单2

Important

游戏正式上线前需提前告知 Discord 团队,以便开启现网权限。

1.3 配置 OAuth2

  1. 点击 OAuth2,打开 PUBLIC CLIENT 开关

图片:PUBLIC CLIENT

  1. 配置 Redirects
    • Android/iOS: discord-{YOUR_APP_ID}:/authorize/callback
    • PC: http://127.0.0.1/callback

图片:配置 Redirects

note

移动端需配置 DeepLink:在 General InformationDeep Link URL 添加跳转 URL

图片:DeepLink 配置

1.4 配置 Rich Presence 资源

  1. 点击 Rich Presence
  2. 点击 Add Image(s) 上传图片资源

图片:上传资源

步骤 2:注册回调

note

建议在游戏启动时注册所有回调。

一般函数回调

// 添加/移除回调
INTLAPI.AddDiscordBaseResultObserver(OnDiscordBaseResult);
INTLAPI.RemoveDiscordBaseResultObserver(OnDiscordBaseResult);

// 处理回调
private void OnDiscordBaseResult(INTLBaseResult baseRet)
{
switch (baseRet.MethodId)
{
case (int)INTLMethodID.INTL_FRIEND_DISCORD_AUTHORIZE:
// 授权回调
break;
case (int)INTLMethodID.INTL_FRIEND_DISCORD_CREATE_LOBBY:
// 创建/加入大厅回调
break;
case (int)INTLMethodID.INTL_FRIEND_DISCORD_LEAVE_LOBBY:
// 离开大厅回调
break;
case (int)INTLMethodID.INTL_FRIEND_DISCORD_SET_RICH_PRESENCE:
// 设置游戏状态回调
break;
case (int)INTLMethodID.INTL_FRIEND_DISCORD_SEND_MESSAGE:
// 发送消息回调
break;
case (int)INTLMethodID.INTL_FRIEND_DISCORD_REMOVE_FRIEND:
// 删除好友回调
break;
case (int)INTLMethodID.INTL_FRIEND_DISCORD_ADD_FRIEND_BY_ID:
// 通过 ID 添加好友回调
break;
case (int)INTLMethodID.INTL_FRIEND_DISCORD_ADD_FRIEND_BY_NAME:
// 通过用户名添加好友回调
break;
case (int)INTLMethodID.INTL_FRIEND_DISCORD_ACCEPT_FRIEND_REQUEST:
// 接受好友请求回调
break;
case (int)INTLMethodID.INTL_FRIEND_DISCORD_SEND_INVITE_TO_FREIND:
// 发送邀请回调
break;
case (int)INTLMethodID.INTL_FRIEND_DISCORD_ACCEPT_INVITE_FROM_FRIEND:
// 接受邀请回调
break;
case (int)INTLMethodID.INTL_FRIEND_DISCORD_ON_RELATIONSHIP_CHANGED:
// 好友列表变动通知,建议刷新列表
break;
case (int)INTLMethodID.INTL_FRIEND_DISCORD_ON_LOBBY_MEMBER_CHANGED:
// 大厅成员变动通知,建议刷新状态
break;
}
}

个人信息回调

INTLAPI.AddDiscordUserResultObserver(OnDiscordUserResult);
INTLAPI.RemoveDiscordUserResultObserver(OnDiscordUserResult);

private void OnDiscordUserResult(INTLDiscordUserResult userRet)
{
if (userRet.MethodId == (int)INTLMethodID.INTL_FRIEND_DISCORD_GET_CONNECTED_USER)
{
// 处理用户信息
}
}

好友列表回调

INTLAPI.AddDiscordFriendsResultObserver(OnDiscordFriendResult);
INTLAPI.RemoveDiscordFriendsResultObserver(OnDiscordFriendResult);

private void OnDiscordFriendResult(INTLDiscordFriendResult friendRet)
{
// 处理好友列表
}

消息回调

INTLAPI.AddDiscordMessageResultObserver(OnDiscordMessageResult);
INTLAPI.RemoveDiscordMessageResultObserve(OnDiscordMessageResult);

private void OnDiscordMessageResult(INTLDiscordMessageResult messageRet)
{
// 处理消息变动
}

邀请回调

INTLAPI.AddDiscordInviteResultObserver(OnDiscordInviteResult);
INTLAPI.RemoveDiscordInviteResultObserver(OnDiscordInviteResult);

private void OnDiscordInviteResult(INTLDiscordInviteResult inviteRet)
{
// 处理邀请
}

步骤 3:调用 API

DiscordAuthorize

功能:绑定 Discord 账号并授予好友权限

绑定流程

  • 首次:拉起授权页 → 输入账号密码 → 完成绑定
  • 再次:使用缓存直接绑定(更换设备或卸载重装需重新授权)
  • 解绑:需在游戏侧操作(仅在 Discord 取消授权无效)
info

每次登录后、调用其他 Discord 接口前必须调用,等待回调返回 SUCCESS 后再调用其他函数。

Discord 授权的流程如图所示:

authorize flow

Discord PC端内授权页样式参考:

图片:授权页

回调DiscordBaseResultObserver

INTLAPI.DiscordAuthorize();

IsAuthorized

功能:检查本地是否有缓存的 token

使用场景:避免自动弹出授权页

  • 返回 true:直接调用 DiscordAuthorize()
  • 返回 false:显示按钮让用户手动授权
bool isAuthorized = INTLAPI.IsAuthorized();

DiscordGetConnectedUser

回调DiscordUserResultObserver
数据DiscordUserInfo

INTLAPI.DiscordGetConnectedUser();

DiscordQueryFriends

参数

  • page (int): 页数,>0
  • count (int): 每页数量,>0

回调DiscordFriendsResultObserver

INTLAPI.DiscordQueryFriends(1, 10);

DiscordAddFriendByName

参数username (string)
效果:被申请人可查询到请求,同意后双方收到好友列表变动回调

回调DiscordBaseResultObserver

INTLAPI.DiscordAddFriendByName("xiaoming");

DiscordAddFriendByID

参数userId (string)
效果:被申请人可查询到请求,同意后双方收到好友列表变动回调

回调DiscordBaseResultObserver

INTLAPI.DiscordAddFriendById("123456789");

DiscordAcceptFriendRequest

参数userId (string) - 申请人 ID
效果:双方收到好友列表变动回调

回调DiscordBaseResultObserver

INTLAPI.DiscordAcceptFriendRequest("123456789");

DiscordRemoveFriend

参数userId (string)
效果:无需对方同意,双方收到好友列表变动回调

回调DiscordBaseResultObserver

INTLAPI.DiscordRemoveFriend("123456789");
好友列表变动回调

调用好友管理相关函数成功后,双方都会收到 kMethodIDFriendDiscordOnRelationshipChanged 回调。回调不含 userId,需调用 DiscordQueryFriends 获取详情。

DiscordSendMessage

参数

  • recipientId (string): 接收者 ID
  • content (string): 消息内容

发送规则

  • 好友关系:成功
  • 从未加好友:失败
  • 曾为好友已删除:
    • 接收者在线:回调成功但不显示
    • 接收者离线:报错 50007
caution

发送消息涉及隐私,需游戏自行披露。

回调DiscordBaseResultObserver

INTLAPI.DiscordSendMessage("123456789", "hello world!");
info

注册 消息回调 可监听好友消息变动(创建/编辑/删除),消息可能含 emoji 等非文字内容。

DiscordSetRichPresence

回调DiscordBaseResultObserver
参数DiscordRichPresence

INTLDiscordRichPresence richPresence = new INTLDiscordRichPresence();
richPresence.GameName = "Sample";
richPresence.State = "HappyTime";
richPresence.Details = "This is INTL Sample Game";
richPresence.PartyMaxSize = 5;
richPresence.SupportedPlatforms = 1 | 8 | 16;

INTLAPI.DiscordSetRichPresence(richPresence);

DiscordCreateLobby

参数secret (string) - 大厅唯一标识(有效期约 30 天)

限制

  • 一个用户同时只能在一个大厅
  • 需先离开当前大厅才能加入新大厅
  • 退出游戏不自动离开,需主动调用
  • 所有成员离开后几分钟自动失效

建议:加密 secret 防止不知情用户加入

回调DiscordBaseResultObserver

INTLAPI.DiscordCreateLobby("testsecret");

DiscordLeaveLobby

回调DiscordBaseResultObserver

INTLAPI.DiscordLeaveLobby();
info

任一成员加入/离开大厅时,所有成员都会收到回调。

DiscordSendInviteToFriend

必须按顺序执行

  1. 创建大厅
  2. 设置游戏状态
  3. 发送邀请

发送邀请的流程如图所示:

send invite and accept flow

参数

  • userId (string): 好友 ID
  • content (string): 邀请消息

回调DiscordBaseResultObserver

INTLAPI.DiscordSendInviteToFriend("123456789", "hi, come to play with me");

DiscordAcceptInviteFromFriend

有两种方法可以接受来自 Discord 好友的游戏邀请:

方法一:函数调用
注册邀请回调,在回调中调用此函数

方法二:Discord 客户端

  • PC:点击 Join 自动加入
  • 移动端:点击 Join → DeepLink 拉起游戏 → 解析 joinSecret → 调用 DiscordCreateLobby

参数userId (string) - 发送者 ID

回调DiscordBaseResultObserver

INTLAPI.DiscordAcceptInviteFromFriend("123456789");