Javascript Discord.jsv12清除命令

Javascript Discord.jsv12清除命令,javascript,discord,discord.js,Javascript,Discord,Discord.js,我有一个clear命令,可以删除您想要删除的邮件量。但每当我说“清除3”时,它只会清除2条消息 client.on('message',异步(message)=>{ 如果( message.content.toLowerCase().startsWith(前缀+清除)|| message.content.toLowerCase().startsWith(前缀+'c') ) { 如果(!message.member.hasPermission('MANAGE_MESSAGES')) return

我有一个
clear
命令,可以删除您想要删除的邮件量。但每当我说“清除3”时,它只会清除2条消息

client.on('message',异步(message)=>{
如果(
message.content.toLowerCase().startsWith(前缀+清除)||
message.content.toLowerCase().startsWith(前缀+'c')
) {
如果(!message.member.hasPermission('MANAGE_MESSAGES'))
return message.channel.send(“您无法使用此命令,因为缺少`manage_messages`perm');
如果(!isNaN(message.content.split(“”)[1])){
设金额=0;
if(message.content.split(“”)[1]==“1”| | message.content.split(“”)[1]==“0”){
金额=1;
}否则{
金额=message.content.split(“”)[1];
如果(金额>100){
金额=100;
}
}
等待消息.channel.bulkDelete(amount,true)。然后((u message)=>{
message.channel.send(`Bot cleared\`${u message.size}\`messages:broom:`)。然后((sent)=>{
setTimeout(函数(){
sent.delete();
}, 2500);
});
});
}否则{
message.channel.send('输入要清除的邮件数量')。然后((sent)=>{
setTimeout(函数(){
sent.delete();
}, 2500);
});
}
}否则{
if(message.content.toLowerCase()==前缀+“帮助清除”){
const newEmbed=new Discord.MessageEmbed().setColor('#00B2B2').setTitle('**清除帮助**');
新嵌入
.setDescription('此命令清除消息,例如'.clear 5'或'.c 5`.'))
.setFooter(`Requested by${message.author.tag}`,message.author.displayAvatarURL())
.setTimestamp();
message.channel.send(newEmbed);
}
}
});

您的代码运行正常,它删除了正确数量的消息。您忘记的是,您当前的带有注释的消息也是一条消息,并且也将计入删除的金额。所以你可以把这个数字增加一

我可能会对您的代码进行一些更改:

  • 我将使用正则表达式捕获多个空格,而不是将消息拆分为单个空格。当前版本无法使用
    。清除5
    。如果选中,
    isNaN(“”)
    false
  • 检查金额是否为正数
  • 删除硬编码的
    前缀
    es
  • 删除不必要的
    等待
  • 前缀添加早期检查
  • client.on('message',(message)=>{
    如果(!message.content.startsWith(prefix)| | message.author.bot)返回;
    const args=message.content
    .toLowerCase()
    .slice(前缀.length)
    .trim()
    .split(/\s+/);
    常量[命令,输入]=参数;
    如果(命令=='clear'| |命令=='c'){
    如果(!message.member.hasPermission('MANAGE_MESSAGES')){
    返回消息.channel
    .发送(
    “您无法使用此命令,因为您缺少'manage_messages'perm'”,
    );
    }
    如果(isNaN(输入)){
    返回消息.channel
    .send('输入要清除的邮件数量')
    。然后((发送)=>{
    设置超时(()=>{
    sent.delete();
    }, 2500);
    });
    }
    if(数字(输入)<0){
    返回消息.channel
    .send('输入正数')
    。然后((发送)=>{
    设置超时(()=>{
    sent.delete();
    }, 2500);
    });
    }
    //另外添加一条以删除当前邮件
    常数量=数量(输入)>100
    ? 101
    :数字(输入)+1;
    message.channel.bulkDelete(金额,true)
    。然后(_消息)=>{
    消息通道
    //是否要在此处包含当前邮件?
    //如果不是,则应为${u message.size-1}
    .send(`Bot cleared\`${u message.size}\`messages:broom:`)
    。然后((发送)=>{
    设置超时(()=>{
    sent.delete();
    }, 2500);
    });
    });
    }
    如果(命令=='help'&&input=='clear'){
    const newEmbed=newmessageembed()
    .setColor(“#00B2B2”)
    .setTitle(“**清除帮助**”)
    .setDescription(
    `此命令清除消息,例如\${prefix}clear 5\'或\`${prefix}c 5\`,
    )
    .setFooter(
    `由${message.author.tag}`请求,
    message.author.displayAvatarURL(),
    )
    .setTimestamp();
    message.channel.send(newEmbed);
    }
    });
    
    这是因为它正在删除触发它的消息。简单的修复,只需取给定的数字,再加上一个

    wait message.channel.bulkDelete(parseInt(amount)+1,true)。然后((u message)=>{
    
    触发消息(命令消息)也正在获取

    有多种解决方案:

  • 在获取/批量删除其他消息之前删除命令消息
  • 仅获取在命令消息之前发送的消息
  • 将删除邮件的数量增加1
  • 我在下面的代码中标记了所有3个解决方案

    client.on('message', async (message) => {
      if (
        message.content.toLowerCase().startsWith(prefix + 'clear') ||
        message.content.toLowerCase().startsWith(prefix + 'c ')
      ) {
        if (!message.member.hasPermission('MANAGE_MESSAGES'))
          return message.channel.send("You cant use this command since you're missing `manage_messages` perm");
        if (!isNaN(message.content.split(' ')[1])) {
          let amount = 0;
          if (message.content.split(' ')[1] === '1' || message.content.split(' ')[1] === '0') {
            amount = 1;
          } else {
            amount = message.content.split(' ')[1];
            if (amount > 100) {
              amount = 100;
            }
          }
    
    /* 1. Solution */
    
          await message.delete().catch(e => { amount++; });
    
          await message.channel.bulkDelete(amount, true).then((_message) => {
            message.channel.send(`Bot cleared \`${_message.size}\` messages :broom:`).then((sent) => {
              setTimeout(function () {
                sent.delete();
              }, 2500);
            });
          });
    
    /* 2. Solution */
          const messagesToDelete = await message.channel.messages.fetch({ before: message.id, limit: amount });
    
          await message.channel.bulkDelete(messagesToDelete, true).then((_message) => {
            message.channel.send(`Bot cleared \`${_message.size}\` messages :broom:`).then((sent) => {
              setTimeout(function () {
                sent.delete();
              }, 2500);
            });
          });
    
    /* 3. Solution */
    
          amount >= 100 ? await message.delete() /* You can only bulk delete 100 messages */ : amount++;
    
          await message.channel.bulkDelete(amount, true).then((_message) => {
            message.channel.send(`Bot cleared \`${_message.size}\` messages :broom:`).then((sent) => {
              setTimeout(function () {
                sent.delete();
              }, 2500);
            });
          });
    
    /* The following code is your old code */
    
        } else {
          message.channel.send('enter the amount of messages that you would like to clear').then((sent) => {
            setTimeout(function () {
              sent.delete();
            }, 2500);
          });
        }
      } else {
        if (message.content.toLowerCase() === prefix + 'help clear') {
          const newEmbed = new Discord.MessageEmbed().setColor('#00B2B2').setTitle('**Clear Help**');
          newEmbed
            .setDescription('This command clears messages for example `.clear 5` or `.c 5`.')
            .setFooter(`Requested by ${message.author.tag}`, message.author.displayAvatarURL())
            .setTimestamp();
          message.channel.send(newEmbed);
        }
      }
    });
    

    只做amount+1?听起来不错,但在JavaScript中,如果
    amount
    是一个字符串,
    amount+1
    也将是一个字符串。我的意思是,如果
    amount=“3”
    amount+1
    将是
    “31”
    @ZsoltMeszaros amount在这里不应该是字符串。它是虽然。如果
    message.content
    ,清除3'
    并检查message.content.split(“”)[1]
    ,它返回
    “字符串”
    @ZsoltMeszaros检查我的编辑。我想那会有用吗?是的,那应该很好,尽管添加基数也是一个很好的做法:
    parseInt(amount,10)+1
    。现在让我来投票你的答案;)非常感谢,我真的很感激。:)不客气。如果它解决了你的问题,你也可以:)谢谢