VB.NET Discord Bot仅私信回复问题:无法识别私信消息
解决VB.NET Discord Bot无法识别私信消息并仅私信回复的问题
你的代码存在两个核心问题,导致无法识别私信消息且不符合仅私信回复的需求:
- 强行将
message.Author转换为SocketGuildUser——私信中的用户是SocketUser(不属于任何服务器成员),转换会失败,后续依赖服务器角色的判断也会在私信场景下失效。 - 同时向频道和用户发消息,不符合“仅私信回复”的要求。
修改后的代码(仅处理私信指令并回复)
Private Async Function onMessage(message As SocketMessage) As Task ' 忽略机器人自身发送的消息,避免循环触发 If message.Source = MessageSource.Bot Then Return ' 判断当前消息是否来自私信频道 If TypeOf message.Channel Is SocketDMChannel Then ' 匹配指令(忽略大小写,可选) If message.Content.Equals("!say 1", StringComparison.OrdinalIgnoreCase) Then ' 仅向发送者发送私信回复 Await message.Author.SendMessageAsync("2") End If End If End Function
代码修改说明
- 去掉了服务器角色检查:私信场景下没有服务器上下文,该判断完全无效;如果需要验证用户在特定服务器的角色,需额外添加服务器成员验证逻辑(但你的需求是仅私信回复,所以无需保留)。
- 用
TypeOf message.Channel Is SocketDMChannel精准判断私信场景,确保只处理私信消息。 - 直接使用
message.Author(SocketUser类型)发送私信,无需强制转换为服务器成员对象。 - 仅保留私信回复的代码,完全符合需求。
可选扩展:支持服务器频道指令但仅私信回复
如果需要让Bot在服务器频道收到指令时也仅用私信回复,可去掉私信判断,代码如下:
Private Async Function onMessage(message As SocketMessage) As Task If message.Source = MessageSource.Bot Then Return ' 匹配指令,不管是服务器频道还是私信,都仅私信回复 If message.Content.Equals("!say 1", StringComparison.OrdinalIgnoreCase) Then Await message.Author.SendMessageAsync("2") End If End Function
内容的提问来源于stack exchange,提问作者StikxX
相关产品推荐
相关产品推荐

