Discord.js中MessageCollector如何获取非回复消息的内容?
解决Discord机器人工单系统中获取用户非回复式消息的问题
你当前的消息收集器会捕获频道内所有消息,无法精准获取目标用户针对机器人消息发送的单条非回复内容。可以通过以下方式优化:
核心思路
在按钮触发后,记录机器人发送的引导消息,然后创建带过滤条件的消息收集器,只捕获触发按钮的用户发送的第一条有效消息。
代码示例
// 按钮交互的处理逻辑 button.on('click', async (interaction) => { // 发送工单引导消息并保存该消息对象 const botGuideMessage = await interaction.channel.send('请描述你的问题:'); // 创建消息收集器,设置过滤规则 const messageCollector = interaction.channel.createMessageCollector({ // 过滤条件:仅接收当前触发按钮的用户发送的消息,且在引导消息之后发送 filter: m => m.author.id === interaction.user.id && m.createdTimestamp > botGuideMessage.createdTimestamp, max: 1, // 只收集1条消息后停止 time: 60000 // 可选:设置60秒超时,超时后自动结束收集 }); messageCollector.on('collect', m => { console.log('用户提交的内容:', m.content); answered = true; // 这里可以添加工单内容的处理逻辑,比如存入数据库 }); // 处理超时或收集结束的情况 messageCollector.on('end', collected => { if (collected.size === 0) { interaction.channel.send('超时未提交内容,工单已终止。'); answered = false; } }); });
关键参数说明
- filter:精准筛选目标用户的消息,同时通过时间戳确保只收集引导消息之后的内容,避免捕获历史消息
- max:限制收集数量为1,确保只获取用户的单条回复
- time:设置超时时间,防止收集器长期占用资源
内容的提问来源于stack exchange,提问作者Bootfahrer
相关产品推荐
相关产品推荐

