【发布时间】: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() 方法将表情添加到嵌入中,而不是使用Name 和Id 属性“手动”构建它们,但我得到了完全相同的结果。我通过在家庭(和客户端/目标)服务器中输入\:emotename: 检索了表情ID。表情名称(即:gohomega:)是正确的,所以我知道它可以正确地在机器人的主服务器中找到表情。除非它们被加载到客户端/目标服务器中,否则它不会显示它们。
我发现问题Discord bot can't show emote “sometimes” 中解决了一个类似 问题。尽管报告的问题肯定有所不同,但最终结果 - 显示的表情名称而不是实际图像 - 与我试图排除故障的行为相同。该问题中的问题是零星的(而我的问题是一致的)并且那里的机器人是用不同的语言(Node.js而不是.NET语言)编写并使用不同的库(我假设)的事实让我想知道如果问题可能与 Discord 无关,而与我的代码无关。
我已经三重和四重检查了机器人(以及它所在的角色组)是否有权在客户端/目标服务器上使用外部表情符号:
最初,我忘记了这一点,它没有适当的权限。但是,即使授予了必要的权限,我仍然得到相同的结果。
在这一点上,我并没有承认我可能只是忽略/遗漏了某些东西,或者只是对我正在查看的内容过于关注,但我想知道是否有其他人遇到过(并希望得到解决)机器人使用来自不同服务器的表情的这个特殊问题。
编辑
为了确定,我在我的 IDE 中逐步检查了代码并检查了其中一个表情的属性,当时它应该被添加到嵌入中:
表情的Id 和Url 属性似乎是正确的,但我也继续使用我的浏览器“验证”了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