【问题标题】:Discord bot doesn't show emotes from other servers in embedsDiscord bot 不会在嵌入中显示来自其他服务器的表情
【发布时间】:2020-12-20 21:01:51
【问题描述】:

我正在使用Discord.Net 2.2.0 使用 VB.NET 编写 Discord 机器人。我的机器人的许多功能之一(过于雄心勃勃?)是将移动游戏星球大战:英雄银河中的玩家数据发布到嵌入中。这包括某些角色能力信息,我希望在其中包含一些表情以使其更美观。最初,我已将表情上传到我正在测试的服务器上,一切正常:

但是,我意识到,如果我的机器人成功了,我就无法在每台服务器上都安装这些表情。我仍处于这个项目的初始阶段,我预见到我将使用的一些嵌入需要几个“自定义”表情。因此,我决定创建一个新的 Discord 服务器(以下称为机器人的“主”服务器),在其中加载这些表情以在“客户端”或“目标”服务器中使用。 p>

不幸的是,当我尝试在嵌入中包含来自机器人主服务器的表情时,我得到的只是表情名称,没有图像:

经过一番斗争后,我尝试将来自两台服务器的表情包含在同一个嵌入中,但我得到了“混合”的结果。我包含在客户端/目标服务器中加载的那些表情正确显示,但来自机器人主服务器的表情仅显示表情名称:

这个方法很长,所以这里有一个非常我用来创建嵌入的代码的简化示例:

Dim BotHomeServer As Discord.WebSocket.SocketGuild = BotClient.GetGuild(Convert.ToUInt64(HOME_SERVER_ID))
Dim TargetServer As Discord.WebSocket.SocketGuild = BotClient.GetGuild(Convert.ToUInt64(TARGET_SERVER_ID))
Dim PostingChannel As Discord.WebSocket.SocketTextChannel = TargetServer.GetTextChannel(Convert.ToUInt64(POST_CHANNEL_ID))
Dim HomeEmote As Discord.Emote = Await BotHomeServer.GetEmoteAsync(EMOTE_ID_FROM_HOME_SERVER)
Dim TargetEmote As Discord.Emote = Await TargetServer.GetEmoteAsync(EMOTE_ID_FROM_TARGET_SERVER)
Dim PostBuilder As New Discord.EmbedBuilder

  '... other fields and properties of the embed
PostBuilder.AddField("Home Server Test", "Some Text Here <:" & HomeEmote.Name & ":" & HomeEmote.Id & ">", False)
PostBuilder.AddField("Target Server Test", "Some Text Here <:" & TargetEmote.Name & ":" & TargetEmote.Id & ">", False)
  '... other fields and properties of the embed

Await PostingChannel.SendMessageAsync("This is a test", False, PostBuilder.Build)

我还尝试使用.ToString() 方法将表情添加到嵌入中,而不是使用NameId 属性“手动”构建它们,但我得到了完全相同的结果。我通过在家庭(和客户端/目标)服务器中输入\:emotename: 检索了表情ID。表情名称(即:gohomega:)是正确的,所以我知道它可以正确地在机器人的主服务器中找到表情。除非它们被加载到客户端/目标服务器中,否则它不会显示它们。

我发现问题Discord bot can't show emote “sometimes” 中解决了一个类似 问题。尽管报告的问题肯定有所不同,但最终结果 - 显示的表情名称而不是实际图像 - 与我试图排除故障的行为相同。该问题中的问题是零星的(而我的问题是一致的)并且那里的机器人是用不同的语言(Node.js而不是.NET语言)编写并使用不同的库(我假设)的事实让我想知道如果问题可能与 Discord 无关,而与我的代码无关。

我已经三重和四重检查了机器人(以及它所在的角色组)是否有权在客户端/目标服务器上使用外部表情符号:

最初,我忘记了这一点,它没有适当的权限。但是,即使授予了必要的权限,我仍然得到相同的结果。

在这一点上,我并没有承认我可能只是忽略/遗漏了某些东西,或者只是对我正在查看的内容过于关注,但我想知道是否有其他人遇到过(并希望得到解决)机器人使用来自不同服务器的表情的这个特殊问题。


编辑

为了确定,我在我的 IDE 中逐步检查了代码并检查了其中一个表情的属性,当时它应该被添加到嵌入中:

表情的IdUrl 属性似乎是正确的,但我也继续使用我的浏览器“验证”了Url 属性,并验证它确实显示了正确的表情图像。

根据 cmets,bot 两个服务器的成员:

我在这里抓住了稻草,但也许这与“家庭”服务器如此新(我昨晚刚刚创建它)这一事实有关?我的意思是,Discord 的文档说这应该可以工作,而 Discord.Net 文档基本上也说了同样的话。根据 cmets 的说法,它适用于其他人,并且我的代码 看起来“正确”,所以这真的让我相信整个问题是 Discord 的结果。

我也在 Discord API 服务器 (#dotnet_discord-net) 和 Discord Bots 服务器 (#development) 中问过这个问题,所以感觉如果需要,可以免费加入其中一台服务器进行“扩展对话”。

【问题讨论】:

  • 机器人在家庭服务器中对吗?
  • 是的,机器人是主服务器的成员。当然,它目前处于离线状态,但它确实显示在两台服务器右侧的成员列表中。在我的测试代码之前,我还实现了一些代码,据说这些代码在尝试发布任何内容之前等待机器人连接。
  • @Anu6is - 我刚刚想到......我的机器人的代码目前只实例化 one DiscordSocketClient 对象,即使它连接到两个不同的服务器。我可能需要实例化两个单独的DiscordSocketClient 对象(每个服务器连接一个),不是吗?
  • 不,应该只有一个客户端实例。一个客户,多个公会
  • 我刚刚对此进行了测试,它对我来说效果很好,使用 Emote.Parse 或直接添加字符串。

标签: vb.net discord.net


【解决方案1】:

好的,我终于找到了问题的原因,我觉得自己像个白痴。我把所有时间都花在了查看机器人的权限和服务器级别的组权限上,但我什至没有考虑真正的频道权限。频道中bot组角色的Use External Emoji权限设置为继承:

我将其设置为允许,,表情通过就好了。我检查了文本通道所在类别的权限,发现机器人/组角色甚至没有列出。我想我错误地认为频道的机器人/组角色权限将从我设置的服务器级权限继承,即使频道权限屏幕顶部的消息明确指出权限与类别。

故事的寓意?如果它看起来是权限问题,不要忘记查看每个级别的所有权限。

  • 服务器
  • 类别
  • 频道

【讨论】:

  • 还要确保将您的机器人添加到您想要表情符号的服务器
  • 好点,@stackers。容易忘记的事情。感谢您提出这个问题。
猜你喜欢
  • 2020-10-31
  • 1970-01-01
  • 2019-07-23
  • 2021-10-21
  • 2021-07-27
  • 2022-01-24
  • 2020-06-10
  • 2012-12-24
  • 2020-08-02
相关资源
最近更新 更多