Table of Contents

Kook.Net 中的表情符号

KOOK 中的表情符号包含两种形式,即 Emoji 表情与服务器自定义表情,在 Kook.Net 中分别以 EmojiEmote 表示,这两个类都实现了 IEmote 接口。

Emoji

Emoji 是一种通用的表情符号,是 Unicode 标准中的一部分,可以在任何支持 Unicode 标准的平台上使用。因此,诸如 👌👀 等的字符串都会被 KOOK 解析为 Emoji 表情符号。

每个被 KOOK 所支持的 Emoji 表情符号都有其对应的短代码,其为由两个冒号及其所包围的别名组成,例如 👌👀 可分别被表示为 :ok_hand::heart::eyes:。KOOK API 处理有关 Emoji 表情符号的消息时会自动将短代码转换为对应的 Emoji 表情符号。

有关 KOOK 所受支持的短代码,可参考此页面

声明 Emoji

要创建 Emoji 对象,可将 Emoji 表情符号或其 Unicode 传入 Emoji 的构造函数中,例如 new Emoji("👌");new Emoji("\uD83D\uDC4C");,也可以通过使用 ParseTryParse 解析 Emoji 表情符号或其短代码的方式创建 Emoji 对象,例如 Emoji.Parse("👌")Emoji.Parse(":ok_hand:")Emoji.TryParse(":ok_hand:", out var emoji)

为消息添加 Emoji 表情符号的代码示例:

public async Task ReactAsync(SocketUserMessage userMsg)
{
    // 使用表情符号本身
    await userMsg.AddReactionAsync(new Emoji("👌"));
    // 使用 Unicode
    await userMsg.AddReactionAsync(new Emoji("\uD83D\uDC4C"));
    // 使用短代码
    await userMsg.AddReactionAsync(Emoji.Parse(":ok_hand:"));
}

Emote

Kook.Net 中的 Emote 指代 KOOK 中添加到服务器内的自定义表情符号,其在 KMarkdown 中的完全限定形式形如: (emj)kook-logo(emj)[1591057729615250/9nG5PxHkZE074074]。 其中,kook-logo 为表情符号的别名,1591057729615250/9nG5PxHkZE074074 为表情符号的 ID。

目前 KOOK 中尚未提供便捷获取自定义表情符号的完全限定形式的方法,要获取自定义表情符号的完全限定形式,可通过一下几种方式:

  1. Kook.Net 对消息体中的表情符号部分进行了解析,可通过 Tags 获取 TypeEmojiEmote 对象,通过 ToKMarkdownString 方法获取完全限定形式。
  2. 通过 Emotes 属性获取服务器中的全部自定义表情符号,从而获取其完全限定形式。
  3. 通过 GetEmotesAsync 方法获取服务器中的全部自定义表情符号,从而获取其完全限定形式。
  4. 在 KOOK 网页端或桌面客户端中启用开发者工具 (Ctrl+Alt+Shift+O),通过跟踪与表情符号相关的网络请求负载或响应, 或选中通过元素查看器选择并检查聊天消息中的表情符号元素的源码 (Ctrl+Shift+C),获取其完全限定形式。

声明 Emote

要通过服务器自定义表情符号的完全限定形式创建 Emote 对象,请使用 ParseTryParse 方法,例如 Emote.Parse("(emj)kook-logo(emj)[1591057729615250/9nG5PxHkZE074074]")

public async Task ReactAsync(SocketUserMessage userMsg)
{
    if (Emote.TryParse(emoteString, out var emote))
    {
        await userMsg.AddReactionAsync(emote);
    }
}
Tip

要在 Socket 客户端中通过表情符号名称获取指定的表情符号,可以访问 Emotes 属性。

private readonly KookSocketClient _client;

public async Task ReactAsync(SocketUserMessage userMsg, string emoteName)
{
    var emote = _client.Guilds
        .SelectMany(x => x.Emotes)
        .FirstOrDefault(x => x.Name.IndexOf(
            emoteName, StringComparison.OrdinalIgnoreCase) != -1);
    if (emote is null) return;
    await userMsg.AddReactionAsync(emote);
}
Tip

KOOK 中,激活 BUFF 的用户可以跨服务器使用表情符号,因此,Bot 可能会收到来自 Bot 自身并未加入的服务器的表情符号。 虽然 KOOK Bot API 允许 Bot 跨服务器使用表情符号,但不能使用未加入的服务器的表情符号。 为了安全起见,若在 Socket 客户端中要在消息中引用、或添加新回应时采用未知来源的表情符号,应当访问所有服务器的 Emotes 属性来确定表情符号是否存在于 Bot 所加入的服务器中,或捕获可能的异常。

更多信息

要进一步了解如何使用 Emoji 和 Emote,请参阅 IEmote 文档。