我正在尝试添加以嵌入在嵌入式消息中的反馈(重击 重击(。如果用户大拇指,则将角色"好"应用于他,如果他大拇指命名的角色"不好",如果删除了他的反应类型(thump..up/dawn(将删除他的角色(win/win/损失(。
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时,它如何工作,例如"测试",然后运行bot。如果我输入"测试" [作为message_txt_embed.text],则创建嵌入邮件。
我的意思是:在添加反应时,我该如何为用户扮演角色(重击/黎明(,如果他删除了他的反应,也可以删除角色。
首先,我想清除示例代码的一些问题。请参阅下面的评论
'This function is only called when a message is recieved by the client.
'It is not going to be called when a user adds a reaction to a message.
'As such, no logic should be included in here in relation to reactions.
Private Async Function onMsg(message As SocketMessage) As Task
If message.Source = MessageSource.Bot Then
'Instead of having an empty bode in your condition, you could use:
'If Not message.Source = MessageSource.Bot Then
' execute your logic
'End If
'The code above would remove the need for includeing an ELSE section
'and no longer require the IF section to be empty
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)
Dim guild As SocketGuild = (CType(message.Channel, SocketGuildChannel)).Guild
'If you are trying to get the standard thumbsup emoji this is not going to work
'SocketGuild#Emotes is a collection of custom emotes that are available in the guild.
'If this thumbsup is in fact a custom emote you'd access the name withoug the ':'
Dim emote As IEmote = guild.Emotes.First(Function(e) e.Name = ":thumbsup:")
Await guild.Users.AddReactionAsync(emote) 'This is not a valid function.
End If
End If
解决方案:
- 创建(ULONG的(列表,该列表将用于存储任何消息的ID时,该消息添加时应发挥作用。这样可以确保对频道中的任何消息没有反应的角色。
- 使用反应辅助和反驳事件来聆听用户添加或删除的反应。
您可以在此处找到有关反应添加事件的文档
'Any time a message is created with the purpose of adding reaction roles
'that message id should be added to this list.
'This example does not include code for populating this list!
Private ReadOnly ReactionMessages As New List(Of ULong)
'Subscribe to the ReactionAdded and ReactionRemoved events (code not included)
添加了反应 - 添加角色
Private Async Function ReactionAdded(cache As Cacheable(Of IUserMessage, ULong), channel As ISocketMessageChannel, reaction As SocketReaction) As Task
If Not reaction.User.IsSpecified Then Return
'cache.id is the id of the message the user added the reaction to
'Check if the message the user is reacting to is a valid reaction message
'If valid, the message id should exist in our ReactionMessages collection
'Valid reaction messages are the only message that should assign or remove roles
If ReactionMessages.Contains(cache.Id) Then
Dim role As IRole = Nothing
'The unicode string (👍 and 👎) is used when comparing Discord emojis
If reaction.Emote.Name.Equals("👍") Then
'Retrieve the "good role" from the guild, using the role id
role = DirectCast(channel, SocketGuildChannel).Guild.GetRole(123456789)
ElseIf reaction.Emote.Name.Equals("👎") Then
'Retrieve the "bad role" from the guild, using the role id
role = DirectCast(channel, SocketGuildChannel).Guild.GetRole(987654321)
End If
'Only if the role was found within the guild should we attempt to add it to the user
If role IsNot Nothing Then Await DirectCast(reaction.User.Value, SocketGuildUser).AddRoleAsync(role)
End If
End Function
反应删除 - 删除角色
Private Async Function ReactionRemoved(cache As Cacheable(Of IUserMessage, ULong), channel As ISocketMessageChannel, reaction As SocketReaction) As Task
If Not reaction.User.IsSpecified Then Return
'cache.id is the id of the message the user is reacting to
'Check if the message the user is reacting to is a valid reaction message
'If valid, the message id should exist in our ReactionMessages collection
'Valid reaction messages are the only message that should assign or remove roles
If ReactionMessages.Contains(cache.Id) Then
Dim role As IRole = Nothing
Dim user As SocketGuildUser = reaction.User.Value
'The unicode string (👍 and 👎) is used when comparing Discord emojis
If reaction.Emote.Name.Equals("👍") Then
'Retrieve the "good role" from the guild, using the role id
role = DirectCast(channel, SocketGuildChannel).Guild.GetRole(123456789)
ElseIf reaction.Emote.Name.Equals("👎") Then
'Retrieve the "bad role" from the guild, using the role id
role = DirectCast(channel, SocketGuildChannel).Guild.GetRole(987654321)
End If
'If the role was found within the guild and the user currently has the role assigned, remove the role from the user
If role IsNot Nothing AndAlso user.Roles.Any(Function(r) r.Id = role.Id) Then Await user.RemoveRoleAsync(role)
End If
End Function