JavaScript开发Discord音乐机器人执行play等指令无响应无报错问题
问题根因及修复方案
1. 事件监听与权限配置错误
- Discord.js v13及以上版本已将原
message事件废弃,替换为messageCreate事件,你当前使用的旧事件无法捕获用户发送的消息 - 声明的网关意图不全:缺少接收消息、语音状态相关的必要意图,且必须开启消息内容权限才能读取用户指令内容,需要修改客户端初始化代码:
// 修改前 const client = new Client({ intents: [Intents.FLAGS.GUILDS] }); // 修改后 const client = new Client({ intents: [ Intents.FLAGS.GUILDS, Intents.FLAGS.GUILD_MESSAGES, Intents.FLAGS.GUILD_VOICE_STATES, Intents.FLAGS.MESSAGE_CONTENT ] });
额外注意:需要同时进入Discord开发者后台的Bot管理页,手动开启Message Content Intent开关,否则代码声明也无效
2. 代码语法错误
你存在赋值逻辑错误,直接覆写了存储队列的servers对象,导致队列逻辑完全失效:
// 错误写法 把servers对象直接改成了数组,完全破坏原有结构 var server = servers = [message.guild.id]; // 正确写法 读取对应服务器的配置 var server = servers[message.guild.id];
3. 废弃API使用
新版本Discord.js已修改了语音相关的属性和方法名:
- 原
message.member.voiceChannel改为message.member.voice.channel - 原
connection.playStream已废弃,需要改用play方法,v14+版本需要单独安装@discordjs/voice依赖处理语音流 - 原
message.guild.voiceConnection改为message.guild.members.me.voice.connection
修复后核心逻辑参考
const { Client, Intents, Attachment} = require('discord.js'); const client = new Client({ intents: [ Intents.FLAGS.GUILDS, Intents.FLAGS.GUILD_MESSAGES, Intents.FLAGS.GUILD_VOICE_STATES, Intents.FLAGS.MESSAGE_CONTENT ] }); const PREFIX = '!'; const ytdl = require("ytdl-core"); var servers = {}; // 改用messageCreate事件 client.on('messageCreate', message => { // 先过滤非指令消息和机器人消息 if (!message.content.startsWith(PREFIX) || message.author.bot) return; let args = message.content.substring(PREFIX.length).split(" "); switch (args[0]) { case 'play': function play(connection, message){ var server = servers[message.guild.id]; // 改用play方法 server.dispatcher = connection.play(ytdl(server.queue[0], {filter: "audioonly"})); server.queue.shift(); server.dispatcher.on("finish", function(){ if(server.queue[0]){ play(connection, message); }else { connection.disconnect(); } }); } if(!args[1]){ message.channel.send("give a link"); return; } // 修正语音频道属性名 if(!message.member.voice.channel){ message.channel.send("you must be on voice chat to play music"); return; } if(!servers[message.guild.id]) servers[message.guild.id] = { queue: [] } // 修正赋值错误 var server = servers[message.guild.id]; server.queue.push(args[1]); if(!message.guild.members.me.voice.connection) message.member.voice.channel.join().then(function(connection){ play(connection, message); }) break; case "ping": message.channel.send("pong"); console.log("pong"); break; } }); client.login(token); client.on('ready', () => { console.log(`Logged in as ${client.user.tag}!`); });
内容的提问来源于stack exchange,提问作者JM0
相关产品推荐
相关产品推荐

