如何为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
相关产品推荐
相关产品推荐

