Discord.js机器人命令参数问题:多空格文本截断求助
解决Discord机器人;say命令文本丢失的问题
嘿,我来帮你搞定这个;say命令的参数问题!你遇到的核心问题是参数解析时只提取了单个词,没有把后续所有文本合并成完整字符串,导致机器人只发送了"hi"而丢失后面的内容。
问题根源
你当前的代码应该是把输入按空格分割后,只取了第二个参数(比如args[1]),但用户输入的hi guys I'm a text是多个空格分隔的词,这些词会被拆成数组的多个元素,只取args[1]自然只能拿到第一个词"hi"。
修复方案
我们需要调整参数处理逻辑:先取出目标频道名,再把剩下的所有参数拼接成完整文本。下面是完整的代码示例(补全了你没贴完的消息监听逻辑):
const Discord = require('discord.js'); const bot = new Discord.Client({disableEveryone: true}); bot.on("ready", async () => { console.log(`Bot is ready! ${bot.user.username}`); // 你这里的genera...应该是generateInvite之类的?如果是邀请链接可以补全: // let link = await bot.generateInvite({ permissions: ['SEND_MESSAGES'] }); // console.log(`Invite link: ${link}`); }); bot.on("message", (message) => { // 忽略机器人消息和非前缀开头的消息 if (!message.content.startsWith(';') || message.author.bot) return; // 拆分命令和参数:去掉前缀后按空格分割 const args = message.content.slice(1).split(' '); const command = args.shift().toLowerCase(); if (command === 'say') { // 1. 取出第一个参数:目标频道名 const targetChannelName = args.shift(); // 2. 把剩下的所有参数用空格拼接成完整文本 const textToSend = args.join(' '); // 检查是否缺少必要参数 if (!targetChannelName || !textToSend) { return message.reply('使用格式不对哦!正确用法:`;say 目标频道名 要发送的完整文本`'); } // 查找服务器内的目标频道 const targetChannel = message.guild.channels.cache.find(ch => ch.name === targetChannelName); if (targetChannel) { targetChannel.send(textToSend); message.reply(`已在${targetChannelName}频道发送消息!`); } else { message.reply(`找不到名为${targetChannelName}的频道,请检查频道名是否正确!`); } } }); // 记得替换成你的机器人token bot.login('YOUR_BOT_TOKEN');
关键优化点
args.shift():每次调用会取出数组的第一个元素,这里先取出频道名后,剩下的args就是所有文本内容args.join(' '):把剩余数组元素用空格连接,完美还原用户输入的完整文本,不管有多少个词
进阶方案:用正则解析更可靠
如果担心频道名包含特殊字符(比如连字符、下划线),可以用正则表达式直接匹配频道名和后续文本,逻辑更清晰:
bot.on("message", (message) => { if (message.author.bot) return; // 正则匹配:;say 频道名 任意文本(频道名允许包含非空格的字符) const sayMatch = message.content.match(/^;say (\S+) (.+)$/); if (sayMatch) { const targetChannelName = sayMatch[1]; const textToSend = sayMatch[2]; // 后续的频道查找和发送逻辑和上面一致 const targetChannel = message.guild.channels.cache.find(ch => ch.name === targetChannelName); if (targetChannel) { targetChannel.send(textToSend); } else { message.reply(`找不到频道${targetChannelName}!`); } } });
这样修改后,你输入;say general hi guys I'm a text,机器人就会在general频道发送完整的hi guys I'm a text啦!
内容的提问来源于stack exchange,提问作者Eric Wang
相关产品推荐
相关产品推荐

