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

如何为Discord机器人实现!!say命令?附现有命令框架代码

实现Discord机器人的!!say命令

嘿,我来帮你搞定这个!!say命令的实现~你的代码框架已经有雏形了,但有几个逻辑顺序和变量定义的小问题需要调整,我一步步给你理顺:

先梳理原代码的问题点

  • 变量command和message没有提前定义就使用了,会导致编译错误
  • 逻辑顺序颠倒:应该先拆分用户输入的命令,再判断是否是!!say命令
  • 拼写错误:objMsgC...应该是objMsgCh(你定义的消息通道对象)

修正后的完整实现代码

public void onMessageReceived(MessageReceivedEvent evt) { 
    // 获取基础对象
    User objUser = evt.getAuthor(); 
    MessageChannel objMsgCh = evt.getChannel(); 
    Message objMsg = evt.getMessage(); 

    // 如果消息是机器人自己发的,直接跳过(避免无限循环)
    if (objUser.isBot()) return;

    // 拆分用户输入的内容为命令数组(按空格拆分,保留连续空格的处理)
    String[] command = objMsg.getContentRaw().split("\\s+", 2);

    // 检查是否是!!say命令
    if (command.length >= 1 && command[0].equalsIgnoreCase(Ref.prefix + "say")) { 
        // 判断用户是否输入了要发送的内容
        if (command.length == 1) {
            objMsgCh.sendMessage("你需要告诉我要发送什么内容哦~").queue();
            return;
        }

        // 获取要发送的消息内容
        String message = command[1];

        // 发送消息到当前频道
        objMsgCh.sendMessage(message).queue();

        // 可选:删除用户的原命令消息(需要机器人有消息管理权限)
        objMsg.delete().queue();
    } 
}

代码解释

  • 先判断消息是否来自机器人:避免机器人自己触发命令导致无限循环
  • 使用split("\\s+", 2)拆分命令:第一个元素是!!say,第二个元素是后面的所有内容(包括空格),这样不需要循环拼接,更简洁
  • 增加空输入判断:如果用户只打了!!say没有内容,提示用户输入内容
  • 可选删除原命令消息:让频道更整洁,记得给机器人配置消息管理权限

额外注意事项

  • 权限检查:确保机器人在目标频道有发送消息的权限,否则会抛出权限错误
  • 敏感内容控制:如果不想让机器人发送@everyone或@here,可以在发送前添加过滤逻辑:
    if (message.contains("@everyone") || message.contains("@here")) {
        objMsgCh.sendMessage("抱歉,我不能发送提及所有人的消息~").queue();
        return;
    }
    

内容的提问来源于stack exchange,提问作者Franklin-The-Turtle

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:01:08