Discord bot 不会在嵌入中显示来自其他服务器的表情
Discord bot doesn't show emotes from other servers in embeds
我正在使用 Discord.Net 2.2.0 开发 Discord 机器人并使用 VB.NET 编写。我的机器人的(过于雄心勃勃?)的许多功能之一是发布手机游戏的玩家数据,星球大战:英雄银河嵌入。这包括某些角色能力信息,我希望在其中包含一些表情以使其更美观。最初,我将表情上传到我正在测试的服务器上,一切正常:
但是,我意识到,如果我的机器人成功了,我不可能真的在每台服务器上都安装这些表情。我仍处于这个项目的开始阶段,我预见到我将要使用的一些嵌入需要几个“自定义”表情。因此,我决定创建一个新的 Discord 服务器(此后称为机器人的“主”服务器),在其中加载这些表情以供“客户端”或“目标”服务器使用.
不幸的是,当我尝试在嵌入中包含来自机器人主服务器的表情时,我得到的只是表情名称,没有图像:
经过一番尝试后,我尝试在同一个嵌入中包含来自两个服务器的表情,但我得到了“混合”结果。我包含的那些加载到 client/target 服务器中的表情正确显示,但那些来自机器人主服务器的表情仅显示表情名称:
这个方法很长,所以这里有一个非常简化的代码示例,我用来创建嵌入:
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()
方法将表情添加到嵌入中,而不是使用 Name
和 Id
属性“手动”构建它们,但我明白了完全相同的结果。我通过在家庭(和 client/target)服务器中键入 \:emotename:
来检索表情 ID。表情名称(即 :gohomega:
)是正确的,所以我知道它在机器人的主服务器中正确地找到了表情。它只是不显示它们,除非它们被加载到 client/target 服务器中。
我在问题 Discord bot can't show emote “sometimes” 中发现了一个 相似的 问题。尽管那里报告的问题肯定不同,但最终结果 - 显示的表情名称而不是实际图像 - 与我试图解决的问题相同。该问题中的问题是零星的(而我的问题是一致的)并且那里的机器人是用不同的语言编写的(Node.js 而不是 .NET 语言)并使用不同的库(我假设)的事实我想知道问题是否出在 Discord 的末端,而不是与我的代码有关。
我已经三重和四重检查了机器人(及其所在的角色组)是否有权在 client/target 服务器上使用外部表情符号:
最初,我忘记了这一点,它没有适当的权限。但是,即使在授予必要的权限之后,我仍然得到相同的结果。
在这一点上,我承认我可能只是 overlooking/missing 某种东西,或者只是对我正在看的东西很敏感,但我想知道是否有其他人遇到过 (并希望解决)使用来自不同服务器的表情的机器人的这个特殊问题。
编辑
为了确定,我逐步检查了 IDE 中的代码,并检查了其中一个表情的属性,当时它应该被添加到嵌入中:
表情的 Id
和 Url
属性似乎是正确的,但我也继续使用我的浏览器“验证”了 Url
属性 并验证了它确实显示了表情的正确图像。
根据评论,机器人 是 两个服务器的成员:
我在这里抓住了救命稻草,但这也许与“主”服务器太新(我昨晚刚创建)有关?我的意思是,Discord 的文档说这应该有效,而 Discord.Net 文档基本上说的是同一件事。根据评论,它适用于其他人,而我的代码 看起来 “正确”,所以这真的让我相信整个问题都是 Discord 的问题。
我也在 Discord API server (#dotnet_discord-net
) and the Discord Bots 服务器 (#development
) 中问过这个问题,欢迎加入我的其中一个服务器如果需要,可以进行“扩展对话”。
好吧,终于找到问题的原因了,感觉自己是个白痴。我把所有时间都花在了查看机器人的权限和服务器级别的组权限上,但我什至没有思考实际的频道权限。频道中 bot 组角色的 Use External Emoji
权限设置为继承:
我将其设置为允许,voilà,表情效果很好。我检查了文本频道所在类别的权限,发现甚至没有列出 bot/group 角色。我想我错误地认为频道的 bot/group 角色权限将从我设置的 server-level 权限继承,即使频道权限屏幕顶部的消息明确指出权限与类别同步。
故事的寓意?如果它 看起来 像一个权限问题,请不要忘记查看 ALL 的权限 every级。
- 服务器
- 类别
- 频道
我正在使用 Discord.Net 2.2.0 开发 Discord 机器人并使用 VB.NET 编写。我的机器人的(过于雄心勃勃?)的许多功能之一是发布手机游戏的玩家数据,星球大战:英雄银河嵌入。这包括某些角色能力信息,我希望在其中包含一些表情以使其更美观。最初,我将表情上传到我正在测试的服务器上,一切正常:
但是,我意识到,如果我的机器人成功了,我不可能真的在每台服务器上都安装这些表情。我仍处于这个项目的开始阶段,我预见到我将要使用的一些嵌入需要几个“自定义”表情。因此,我决定创建一个新的 Discord 服务器(此后称为机器人的“主”服务器),在其中加载这些表情以供“客户端”或“目标”服务器使用.
不幸的是,当我尝试在嵌入中包含来自机器人主服务器的表情时,我得到的只是表情名称,没有图像:
经过一番尝试后,我尝试在同一个嵌入中包含来自两个服务器的表情,但我得到了“混合”结果。我包含的那些加载到 client/target 服务器中的表情正确显示,但那些来自机器人主服务器的表情仅显示表情名称:
这个方法很长,所以这里有一个非常简化的代码示例,我用来创建嵌入:
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()
方法将表情添加到嵌入中,而不是使用 Name
和 Id
属性“手动”构建它们,但我明白了完全相同的结果。我通过在家庭(和 client/target)服务器中键入 \:emotename:
来检索表情 ID。表情名称(即 :gohomega:
)是正确的,所以我知道它在机器人的主服务器中正确地找到了表情。它只是不显示它们,除非它们被加载到 client/target 服务器中。
我在问题 Discord bot can't show emote “sometimes” 中发现了一个 相似的 问题。尽管那里报告的问题肯定不同,但最终结果 - 显示的表情名称而不是实际图像 - 与我试图解决的问题相同。该问题中的问题是零星的(而我的问题是一致的)并且那里的机器人是用不同的语言编写的(Node.js 而不是 .NET 语言)并使用不同的库(我假设)的事实我想知道问题是否出在 Discord 的末端,而不是与我的代码有关。
我已经三重和四重检查了机器人(及其所在的角色组)是否有权在 client/target 服务器上使用外部表情符号:
最初,我忘记了这一点,它没有适当的权限。但是,即使在授予必要的权限之后,我仍然得到相同的结果。
在这一点上,我承认我可能只是 overlooking/missing 某种东西,或者只是对我正在看的东西很敏感,但我想知道是否有其他人遇到过 (并希望解决)使用来自不同服务器的表情的机器人的这个特殊问题。
编辑
为了确定,我逐步检查了 IDE 中的代码,并检查了其中一个表情的属性,当时它应该被添加到嵌入中:
表情的 Id
和 Url
属性似乎是正确的,但我也继续使用我的浏览器“验证”了 Url
属性 并验证了它确实显示了表情的正确图像。
根据评论,机器人 是 两个服务器的成员:
我在这里抓住了救命稻草,但这也许与“主”服务器太新(我昨晚刚创建)有关?我的意思是,Discord 的文档说这应该有效,而 Discord.Net 文档基本上说的是同一件事。根据评论,它适用于其他人,而我的代码 看起来 “正确”,所以这真的让我相信整个问题都是 Discord 的问题。
我也在 Discord API server (#dotnet_discord-net
) and the Discord Bots 服务器 (#development
) 中问过这个问题,欢迎加入我的其中一个服务器如果需要,可以进行“扩展对话”。
好吧,终于找到问题的原因了,感觉自己是个白痴。我把所有时间都花在了查看机器人的权限和服务器级别的组权限上,但我什至没有思考实际的频道权限。频道中 bot 组角色的 Use External Emoji
权限设置为继承:
我将其设置为允许,voilà,表情效果很好。我检查了文本频道所在类别的权限,发现甚至没有列出 bot/group 角色。我想我错误地认为频道的 bot/group 角色权限将从我设置的 server-level 权限继承,即使频道权限屏幕顶部的消息明确指出权限与类别同步。
故事的寓意?如果它 看起来 像一个权限问题,请不要忘记查看 ALL 的权限 every级。
- 服务器
- 类别
- 频道