You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VB.NET Discord Bot仅私信回复问题:无法识别私信消息

解决VB.NET Discord Bot无法识别私信消息并仅私信回复的问题

你的代码存在两个核心问题,导致无法识别私信消息且不符合仅私信回复的需求:

  1. 强行将message.Author转换为SocketGuildUser——私信中的用户是SocketUser(不属于任何服务器成员),转换会失败,后续依赖服务器角色的判断也会在私信场景下失效。
  2. 同时向频道和用户发消息,不符合“仅私信回复”的要求。

修改后的代码(仅处理私信指令并回复)

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 08:40:34