Discord.js音乐机器人投票跳过系统问题求助:重复投票与达标未跳过故障
修复你的Discord.js投票跳过系统问题
让我帮你搞定这两个故障,咱们一步步来看问题出在哪,以及怎么修复:
问题1:同一用户能重复投票
你代码里已经判断了用户是否投过票,但判断后没有终止后续代码,导致提示完用户“已经投过票”之后,还是把用户ID塞进了voteskips数组里。只需要在提示语句后面加个return,就能阻止重复添加。
问题2:票数达标却无法跳过歌曲
这里有两个核心错误:
- 计算所需票数时用了
message.member.voice.channel.size——这个属性是语音频道的最大可容纳人数,不是当前在频道里的真实成员数,应该换成channel.members.size。 - 跳过歌曲后没有重置
voteskips数组,下次投票会累积之前的票数,导致逻辑混乱。
修复后的完整代码
else if (cmd === "skip") { let queue = distube.getQueue(message.guild.id); let channel = message.member.voice.channel; // 检查用户是否在语音频道 if (!channel) { return message.channel.send("You need to Join Voice Channel"); } // 检查是否有播放队列 if (!queue) { return message.channel.send("Nothing Playing"); } // 检查是否还有下一首歌 if (queue.songs.length < 1) { return message.channel.send("There are no more tracks left. Add some"); } // 计算所需票数:当前语音频道成员数的一半向上取整 const required = Math.ceil(channel.members.size / 2); // 检查用户是否已投票 if (voteskips.includes(message.member.id)) { return message.channel.send("You already voted for skipping this song"); } // 添加投票 voteskips.push(message.member.id); message.channel.send(`**Votes : ${voteskips.length}/${channel.members.size}** ${required - voteskips.length} more votes needed to skip`); // 检查是否达到跳过条件 if (voteskips.length >= required) { // 执行跳过/停止操作 if (queue.autoplay || queue.songs.length > 1) { distube.skip(message); } else { distube.stop(message); } // 发送跳过成功提示 message.channel.send({ embeds: [ new Discord.MessageEmbed() .setTitle("Skipped current track") .setColor("LIGHT_GREY") ] }); // 重置投票数组,为下一次投票做准备 voteskips = []; } }
额外优化提示
- 建议把
voteskips改成按服务器存储的对象(比如const voteSkips = new Map();),这样多个服务器同时使用时不会互相干扰,避免跨服务器的投票数据混乱。 - 可以在歌曲开始播放时自动重置对应服务器的投票数组,确保每次新歌曲的投票都是从零开始。
内容的提问来源于stack exchange,提问作者BoomerangTheBEst
相关产品推荐
相关产品推荐

