Discord.js v13.6.0:如何实现重复获取合规输入及角色标签查询?
Discord.js 13.6.0 顺序消息收集器实现(价格+角色标签)
你需要通过分步状态控制实现顺序收集,用变量跟踪当前要获取的内容,每个步骤单独做有效性校验,输入不合规时仅发送提示、不终止收集器,直到拿到有效内容再进入下一环节。以下是修复后的完整代码:
// 初始化收集状态:0=收集价格,1=收集角色标签 let currentStep = 0; let collectedPrice = null; let collectedRole = null; // 过滤器:仅接收发起操作的用户消息(替换为你原有的过滤逻辑) const filter = (msg) => msg.author.id === mainMessage.author.id; const collector = await mainMessage.channel.createMessageCollector({ filter: filter, time: 900000 }); collector.on("collect", async (message) => { // 第一步:收集价格 if (currentStep === 0) { const priceItem = message.content; // 校验是否为有效数字 if (isNaN(parseFloat(priceItem))) { return message.channel.send(`To nie liczba`); } // 价格有效,保存并切换到角色收集步骤 collectedPrice = parseFloat(priceItem); currentStep = 1; message.channel.send(`请输入角色标签(可@角色或直接输入角色名称):`); } // 第二步:收集角色标签 else if (currentStep === 1) { let targetRole; // 优先识别@提到的角色 if (message.mentions.roles.size > 0) { targetRole = message.mentions.roles.first(); } // 无@时按名称查找服务器内角色 else { targetRole = message.guild.roles.cache.find(role => role.name.toLowerCase() === message.content.toLowerCase() ); } // 校验角色是否存在 if (!targetRole) { return message.channel.send(`未找到该角色,请重新输入`); } // 角色有效,保存并终止收集器 collectedRole = targetRole; collector.stop(); } }); collector.on("end", (collected, reason) => { // 正常完成全部收集的情况 if (reason === "user" && collectedPrice && collectedRole) { mainMessage.edit({ content: `Nazwa: ${itemName}\nPieniadze: ${collectedPrice}\nRola: ${collectedRole.name}`, }); mainMessage.channel.send(`信息收集完成!`); } // 超时或未完成收集的情况 else { mainMessage.channel.send(`信息收集超时或未完成,请重新发起`); } });
核心逻辑说明
- 顺序控制:用
currentStep变量标记当前收集阶段,确保流程严格按「价格→角色」顺序执行 - 校验容错:每个阶段单独做有效性检查,输入不合规时仅发送提示,不终止收集器,直到用户输入有效内容
- 角色匹配:支持两种输入方式(@角色/角色名称),覆盖用户常用操作场景
- 结束反馈:区分正常完成和超时/中断情况,给出对应提示
内容的提问来源于stack exchange,提问作者user11664235
相关产品推荐
相关产品推荐

