You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Discord机器人kick命令无响应(需实现随机GIF发送)及profile/info/hello命令失效问题求助

看起来你的机器人多个命令失效,而且kick命令还有逻辑漏洞,我来帮你逐个排查修复:

一、核心问题:命令触发逻辑错误(profile/hello/info失效的根源)

index.jsmessage事件处理里,你明明已经提取了command作为前缀后的第一个关键词,但后续的switch却错误地判断args[0]。比如用户输入!profile时,command'profile',而args是空数组,args[0]undefined,完全匹配不到case 'profile',这直接导致这三个命令彻底无法触发。

修复方案:

switch (args[0])改成switch (command),同时修复hello命令里未定义的member变量(替换为message.author)。修复后的message事件代码如下:

client.on('message', message => {
 if (!message.content.startsWith(prefix) || message.author.bot) return;
 const args = message.content.slice(prefix.length).split(/ +/);
 const command = args.shift().toLowerCase();

 // 原有命令逻辑保持不变
 if (command === 'ping') {
 client.commands.get('ping').execute(message, args);
 } else if (command == 'website') {
 client.commands.get('website').execute(message, args);
 } else if (command == 'clear') {
 client.commands.get('clear').execute(message, args);
 } else if (command == 'kick') {
 client.commands.get('kick').execute(message, args);
 } else if (command == 'ban') {
 client.commands.get('ban').execute(message, args);
 } 
 // 修复switch的判断对象为command
 switch (command) {
 case 'profile':
 const embed = new MessageEmbed()
 .setTitle('User Information')
 .addField('User Name', message.author.username)
 .addField('Version ', version)
 .addField('Current Server', message.guild.name)
 .setColor(0x000000)
 .setFooter('jajaja')
 .setThumbnail(message.author.displayAvatarURL())
 message.channel.send({ embeds: [embed] });
 break;
 case 'hello':
 const embed1 = new MessageEmbed()
 // 修复未定义的member变量,改为message.author
 .setDescription(`<@${message.author.id}> is greeting Everyone!`)
 .setColor(0x000000)
 message.channel.send({ embeds: [embed1] });
 break;
 case 'info':
 // 这里注意:args[1]应该是args[0],因为command已经被shift走了
 if (args[0] === 'version') {
 message.channel.send('Version ' + version);
 } else {
 message.channel.send('Invalid Args')
 }
 break;
 }
})

额外修正:info命令里的args[1]改为args[0],因为command已经被shift从数组中移除了。

二、kick命令的多维度修复

你的kick.js存在拼写错误、资源路径错误、逻辑顺序混乱等多个问题,导致命令要么无响应要么异常:

1. 权限判断拼写错误

member.roles.highest.position > message.member.roles.highest.positon里的positon少了一个i,应该是position——这个错误会导致权限判断完全失效,甚至可能静默抛出错误。

2. 本地GIF无法在Embed中直接显示

Discord的Embed不支持直接读取本地文件路径,你写的${randomNumber}.gif机器人根本找不到资源。这里用本地附件+Embed引用的方案解决,适合本地存储GIF的场景。

3. 逻辑顺序混乱

你把用户校验放在了fs.readdir的异步回调里,这会导致即使没有提到用户,也会执行无效的文件读取操作。应该先完成参数校验,再处理文件和踢人逻辑。

4. 踢人失败无用户提示

原代码只在终端打印错误,用户完全不知道踢人失败,需要在catch里给用户发送明确提示。

修复后的kick.js代码:

const Discord = require('discord.js');
const fs = require('fs');
const path = require('path'); // 引入path模块处理路径

module.exports = {
 name: 'kick',
 description: 'Kicks A User.',
 execute(message, args) {
 const member = message.mentions.members.first();

 // 先完成参数校验,不通过直接返回
 if (!member) {
 return message.channel.send("Invalid Member Given!");
 }
 // 修复拼写错误:positon -> position
 if (member.roles.highest.position > message.member.roles.highest.position) {
 return message.channel.send("This user is a higher role than you!");
 }

 let reason = args.slice(1).join(" ");
 if (!reason) reason = "No Reason Provided!";

 // 读取kickgifs目录下的文件
 fs.readdir('./kickgifs', (err, files) => {
 if (err) {
 console.log(err);
 return message.channel.send("Failed to load kick GIFs!");
 }
 // 基于目录文件数量生成随机索引,避免越界
 const randomIndex = Math.floor(Math.random() * files.length);
 const randomGif = files[randomIndex];
 const gifPath = path.join(__dirname, '../kickgifs', randomGif); // 正确的本地路径

 // 创建附件
 const attachment = new Discord.AttachmentBuilder(gifPath);

 // 创建Embed,引用附件URL
 const embed = new Discord.MessageEmbed()
 .setColor(0x000000) // 颜色值添加0x前缀,避免解析异常
 .setImage(`attachment://${randomGif}`)
 .setDescription(`<@${member.user.id}> Has Been **Kicked** By **${message.author.username}**`);

 // 执行踢人并处理结果
 member.kick(reason)
 .then(() => {
 // 踢人成功,发送Embed和附件
 message.channel.send({ embeds: [embed], files: [attachment] });
 })
 .catch(err => {
 console.log(err);
 message.channel.send(`Failed to kick <@${member.user.id}>: ${err.message}`);
 });
 });
 }
}

三、额外检查项

  1. 确保kickgifs目录存在,且里面有至少一个GIF文件;
  2. 机器人需要拥有KICK_MEMBERS权限才能执行踢人操作;
  3. 确认Discord.js版本匹配:如果是v13版本,把AttachmentBuilder改成Attachment
  4. 检查机器人邀请链接是否包含applications.commands权限,且已成功加入目标服务器。

经过这些修复后,你的kickprofilehelloinfo命令应该都能正常工作了!

内容的提问来源于stack exchange,提问作者Asuka

火山引擎 最新活动