Discord漫游器未在嵌入中显示来自其他服务器的表情

时间:2020-09-01 17:45:43

标签: vb.net discord.net

我正在使用Discord.Net 2.2.0并用VB.NET编写Discord机器人。我的机器人程序的许多功能之一(过于雄心勃勃?)将嵌入来自《星际大战:英雄银河》等手机游戏的玩家数据。这包括某些角色能力信息,我希望其中包含一些表情符号,以使其在美学上更加令人愉悦。最初,我将表情上传到了要测试的服务器上,并且一切正常:

Embed with emotes loaded from only the client/target server

但是,我意识到,如果我的机器人大肆宣传,我真的不可能在每台服务器上都安装这些表情。我仍处于该项目的开始阶段,我预见到我将要使用的一些嵌入需要一些“自定义”表情。因此,我决定创建一个新的Discord服务器(此后称为bot的“家庭”服务器),在其中加载这些表情以供“客户端”或“目标”服务器使用。

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

Embed with emotes loaded from only the home server

与之抗争之后,我尝试将来自两个服务器的表情包含在同一嵌入中,并且得到“混合”结果。包含在客户端/目标服务器中的那些表情可以正确显示,但是来自机器人主服务器的那些表情仅显示表情名称:

Embed with emotes loaded from both home and client/target server

该方法相当长,所以这是我用来创建嵌入代码的非常简化示例:

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身上,而不是与我的代码无关。

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

Target server permission settings for bot role

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

在这一点上,我并不是要承认自己可能只是忽略/遗漏了一些东西,或者只是对自己正在看的东西一头雾水,但我想知道是否还有其他人遇到(并希望解决)机器人使用来自其他服务器的表情符号引起的这个特殊问题。


编辑

为了确定一点,我逐步浏览了IDE中的代码,并检查了其中一种表情的属性,该表情应该被添加到嵌入中:

Emote object definition at runtime

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

根据评论,机器人 是两个服务器的成员:

Membership listings for each server

我在这里抓着稻草,但也许与“家庭”服务器太新了(我昨天晚上才创建它)有关?我的意思是,Discord的文档说这应该可行,而Discord.Net文档基本上说的是同一件事。根据评论,它适用于其他人,并且我的代码看起来“正确”,因此,这确实使我相信整个问题都与Discord有关。

我也在 Discord API 服务器(#dotnet_discord-net Discord Bots 服务器({ {1}}),如果需要,请随时加入我的服务器之一进行“扩展对话”。

1 个答案:

答案 0 :(得分:0)

好的,我终于找到了问题的起因,我觉得自己很傻。我花了所有时间在服务器级别上查看漫游器的权限和组权限,但是我什至没有思考实际的通道权限。频道中的漫游器组角色的Use External Emoji权限已设置为继承:

Use External Emoji permission setting

我将其设置为允许,并且voilà,这些表情都很好。我检查了文本通道所在类别的权限,发现甚至没有列出漫游器/组角色。我想我误以为该通道的漫游器/组角色权限将继承自我设置的服务器级别权限,即使该通道的权限屏幕顶部的消息明确指出该权限已与类别。

故事的寓意?如果看起来像是权限问题,请不要忘记在每个级别查看权限的 ALL

  • 服务器
  • 类别
  • 频道