Vb.net 在用户添加Response Discord.net时指定角色

Vb.net 在用户添加Response Discord.net时指定角色,vb.net,discord.net,Vb.net,Discord.net,我正在尝试添加反馈(砰砰向上+砰砰向下)以嵌入到EmbeddeBuilder消息中。如果用户竖起大拇指,则将角色“good”应用于他,如果用户竖起大拇指,则将角色“bad”应用于他,如果用户移除了他的反应类型(thump..up/dawn),则将移除他的角色(win/lose) message_txt_Embed是将要发送的嵌入消息 Private Async Function onMsg(message As SocketMessage) As Task '''''''''''''''''''

我正在尝试添加反馈(砰砰向上+砰砰向下)以嵌入到EmbeddeBuilder消息中。如果用户竖起大拇指,则将角色“good”应用于他,如果用户竖起大拇指,则将角色“bad”应用于他,如果用户移除了他的反应类型(thump..up/dawn),则将移除他的角色(win/lose)

message_txt_Embed是将要发送的嵌入消息

Private Async Function onMsg(message As SocketMessage) As Task
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
If message.Source = MessageSource.Bot Then
        'ignore bot repeat message message
Else

   If message.Content = message_txt_Embed.text Then

            Dim msg As String = message.Content
            Dim embed As New EmbedBuilder With {
      .Title = msg,
      .Description = "No Description",
      .Color = New Discord.Color(255, 0, 0)
       }
            Await message.Channel.SendMessageAsync("", False, embed)


            '''''' what i try to add reaction for user's who add reaction

            Dim guild As SocketGuild = (CType(message.Channel, SocketGuildChannel)).Guild
            Dim emote As IEmote = guild.Emotes.First(Function(e) e.Name = ":thumbsup:")
            Await guild.Users.AddReactionAsync(emote)

            ''''''
        End If

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
End If
例如,当我将message_txt_Embed.text更改为“test”,然后运行bot时,它是如何工作的。如果我输入了“test”[作为message_txt_Embed.text],那么就创建嵌入消息


我的观点是:当用户添加了反应时,我如何为用户应用角色(砰..up/dawn),如果用户删除了他的反应,我如何删除角色。

首先,我想用示例代码澄清一些问题。见下面的评论

”此函数仅在客户端接收到消息时调用。
“当用户向消息添加反应时,不会调用它。
"因此,这里不应包括与反应有关的逻辑。
专用异步函数onMsg(消息作为SocketMessage)作为任务
如果message.Source=MessageSource.Bot,则
“您可以使用以下方法,而不是在您的情况下使用空生化需氧量:
'如果不是message.Source=MessageSource.Bot,则
“执行你的逻辑
"完"
'上面的代码将不再需要包含ELSE部分
'并且不再要求IF部分为空
其他的
如果message.Content=message\u txt\u Embed.text,则
Dim msg As String=message.Content
Dim embed作为具有{
.Title=msg,
.Description=“无描述”,
.Color=newdiscord.Color(255,0,0)
}
wait message.Channel.SendMessageAsync(“”,False,embed)
作为SocketGuild=(CType(message.Channel,SocketGuildChannel)).guild的Dim guild
如果你想得到标准的拇指表情符号,这是行不通的
“SocketGuild#Emotes是公会中可用的自定义Emotes的集合。
'如果这个拇指支撑实际上是一个自定义表情,您可以使用':'访问该名称'
Dim emote作为IEmote=guild.Emotes.First(函数(e)e.Name=“:thumbsup:”)
等待guild.Users.AddReactionAsync(emote)'这不是有效的函数。
如果结束
如果结束
解决方案:
-创建一个(Ulong)列表,用于存储添加反应时应赋予角色的任何消息的ID。这可确保不会为对频道中的任何和每一条消息作出反应而指定角色。
-使用ReactionAdded和ReactionRemoved事件侦听用户添加或删除的反应

您可以在

“任何时候创建消息以添加反应角色时
'该邮件id应添加到此列表中。
'此示例不包括填充此列表的代码!
私有只读反应消息作为新列表(ULong)
“订阅ReactionAdded和ReactionRemoved事件(不包括代码)
添加反应-添加角色

Private Async Function ReactionAdded(缓存为可缓存(对于IUserMessage,ULong),通道为ISocketMessageChannel,反应为SocketReaction)作为任务
如果未指定reaction.User.is,则返回
'cache.id是用户向其添加反应的消息的id
'检查用户响应的消息是否为有效的响应消息
'如果有效,则消息id应存在于我们的ReactionMessages集合中
'有效的反应消息是应分配或删除角色的唯一消息
如果ReactionMessages.Contains(cache.Id),则
作为IRole的Dim角色=无

'unicode字符串(你能澄清你的意思吗?“当我将message_txt_Embed.text(例如)更改为“test”,然后运行bot时,它是如何工作的。如果我键入“test”[作为message_txt_Embed.text],然后创建嵌入消息。”@Anu6is ok,当bot run将为特定的channel.id“45…”发送嵌入消息时,以及如果用户添加了响应(砰的一声)将角色添加到他身上作为“赢“/如果他移除(砰的一声)反应,那么如果发现“赢”,则从他身上移除角色@Bego.这是我添加注释的旧代码。在那一行我添加了注释
这不是一个有效的函数
。阅读提供的整个解决方案并尝试理解所说的内容如何。当然,我看到了“这不是一个有效的函数”,我很累,但我问了很多失败的原因。我会尽我的努力,rn,希望我得到它,作为答案。它现在起作用了,但它只是增加了作用,当我消除了我的反应,而不是消除了我的作用。它只能增加感谢,我修复了所有这些。