如何在discord.js中实现命令可指定重复执行X次的功能?
实现!playlist [X]指令的核心代码逻辑
默认你使用discord.js v14+版本开发,核心需要实现3部分逻辑:
1. 指令参数解析与合法性校验
- 首先监听消息前缀匹配
!playlist的指令,提取后面的X参数 - 做参数合法性判断:
- 无参数/参数不是纯数字:返回提示
请输入有效的歌曲数量,正确格式:\!playlist 5`` - 参数小于1或者大于你设定的最大播放上限(比如20,避免队列过长):返回提示
歌曲数量需在1-20之间
- 无参数/参数不是纯数字:返回提示
示例代码:
// 消息监听部分 client.on('messageCreate', async msg => { if (!msg.content.startsWith('!playlist') || msg.author.bot) return; const args = msg.content.split(' '); const playCount = parseInt(args[1]); if (isNaN(playCount) || playCount < 1 || playCount > 20) { return msg.reply('请输入有效的歌曲数量,正确格式:`!playlist 5`,数量范围1-20'); } // 后续调用播放逻辑 })
2. lofi.js逻辑改造
你需要把原有lofi.js里的单次播放逻辑封装成可重复调用的异步函数,不要每次重复执行整个文件,避免重复初始化资源。
改造后的lofi.js示例:
// lofi.js const playlist = [/* 你的lofi歌曲列表 */]; let currentIndex = 0; // 导出单次播放的异步函数 async function playSingleLofi(voiceConnection) { const nextSong = playlist[currentIndex % playlist.length]; currentIndex++; // 这里保留你原有播放单首歌曲的逻辑,返回Promise在歌曲播放结束时resolve return new Promise(resolve => { const player = createAudioPlayer(); const resource = createAudioResource(nextSong.path); player.play(resource); voiceConnection.subscribe(player); player.on('idle', () => resolve()); }) } module.exports = { playSingleLofi };
3. 循环播放控制逻辑
调用lofi.js导出的函数做异步循环,避免同步循环导致所有歌曲同时触发:
// 接前面的指令监听逻辑 const { playSingleLofi } = require('./lofi.js'); // 先判断用户是否在语音频道,获取语音连接逻辑你原有应该已经有,这里省略 const voiceConnection = await joinVoiceChannel(/* 你的语音频道参数 */); // 异步循环播放X次 for (let i = 0; i < playCount; i++) { await playSingleLofi(voiceConnection); } msg.reply(`已播放完你请求的${playCount}首lofi歌曲`);
可选优化:可以加全局播放状态标记,防止用户重复发送指令同时触发多个播放队列;也可以加
!stopplay指令清空当前播放循环。
内容的提问来源于stack exchange,提问作者Commander1An
相关产品推荐
相关产品推荐

