Discord.NET 向 SocketMessage 添加反应

Discord.NET Adding Reactions to a SocketMessage

我正在使用 Discord.NET 版本 1.0.2 来清理

我的 Discord Bot 应用程序中有一个 MessageReceived 任务:

private async Task MessageReceived(SocketMessage message)

这个任务,因为已经可以扣除,每次在 Discord 中收到发给这个机器人的消息时运行。但是,我试图弄清楚如何对机器人收到的消息添加反应。在 SocketMessage 下,没有方法可以对收到的消息添加反应。上网查了一下,发现RestUserMessage里面有AddReactionAsync(IEmote, RequestOptions)这个方法。然后我将 Socket Message 转换为 RestUserMessage

var rMessage = (RestUserMessage) await message.Channel.GetMessageAsync(message.Id);

运行 我的变量 rMessage for RestUserMessage 下的 AddReactionAsync 方法有效,但参数没有正确获取,正如我从网上阅读和文档。

IEmote貌似是字符串,但是字符串不满足这个参数,说是没有从StringIEmote的转换。我尝试将此 String 转换为 IEmote 但这没有用。

RequestOptions 变量似乎完全符合参数 new RequestOptions()

我的完整代码是:

private async Task MessageReceived(SocketMessage message)
{
    var rMessage = (RestUserMessage) await message.Channel.GetMessageAsync(message.Id);
    rMessage.AddReactionAsync(???, new RequestOptions());
}

如何正确实现此 IEmote 参数,或者如何定义 IEmote 变量。此外,定义 new RequestOptions() 变量也是满足此参数的正确方法。这也是通过 Discord.NET 向消息添加反应的正确方法吗?如果不是,那是什么?

我做过的研究:

https://github.com/RogueException/Discord.Net/issues/490
https://discord.foxbot.me/docs/api/Discord.Rest.RestUserMessage.html
https://discord.foxbot.me/docs/api/Discord.IEmote.html
https://discord.foxbot.me/docs/api/Discord.RequestOptions.html

如果您转到 Emojipedia,并获取 unicode 版本,如下所示:

复制后,您必须创建一个新的 Emoji 对象,如下所示:

var YourEmoji = new Emoji("");

然后您可以对所需的消息添加反应,我将使用 Context.Message :

Context.Message.AddReactionAsync(YourEmoji);

Unknown 的解决方案适用于常规表情,但不适用于公会特定表情。

这是我想出的解决方案:

SocketGuild guild = ((SocketGuildChannel) message.Channel).Guild;
IEmote emote = guild.Emotes.First(e => e.Name == "my-custom-emote");
message.AddReactionAsync(emote);

您已经找到了添加表情符号的方法,但我会继续介绍一种将公会表情符号添加到消息中的方法。在这种情况下,您需要表情符号的原始字符串。不要将它与 Emoji 混淆,Emoji 代表 Unicode 表情符号,但 Emote 来自 Discord.Net,代表自定义表情符号。由于 IEmote 接口,AddReactionAsync 方法接受两个对象。

Emote emote = Emote.Parse("<:craig_cat:603083214281506817>")

在这种情况下,我们将使用名为 craig_cat 的表情符号和提供的 ID 创建一个 Emote 对象。 为了获得要解析的原始字符串,在您的 Discord 客户端中,只需发送表情符号 (:craig_cat:),但在它前面加上一个反斜杠 (\)。

请注意,如果是动画表情符号,它将如下所示:

Emote emote = Emote.Parse("<a:running:703588456198307900>")

标点符号前必须有一个 a 才能将其识别为动画表情符号。

在这两种情况下,您都可以通过以下示例将其添加到消息中:

Context.Message.AddReactionAsync(emote); //Adds the reaction to the user's message that triggered the task (works only in a command)

大多数其他 interfaces/objects 也支持此方法,转换会有所帮助。

您也可以随时使用这种原始格式在消息中包含表情符号。