2017-12-23 22 views
0

これは私の現在のコードです。クレジットは@アンドレ・ディオンの助けになります。Discord.js //メッセージをフィルタリングして起動し、bulkDeleteのDiscordAPIErrorを回避します

if (message.channel.type == 'text') { 
    message.channel.fetchMessages().then(messages => { 
     const botMessages = messages.filter(msg => msg.author.bot) 
     message.channel.bulkDelete(botMessages); 
     messagesDeleted = botMessages.array().length; // number of messages deleted 

     // Logging the number of messages deleted on both the channel and console 
     message.channel.send("Deletion of messages successful. Total messages deleted: " + messagesDeleted); 
     console.log('Deletion of messages successful. Total messages deleted: ' + messagesDeleted) 
    }).catch(err => { 
     console.log('Error while doing Bulk Delete'); 
     console.log(err); 
    }); 
} 

ユーザーが「!clearMessages」と入力すると、このコードが実行され、ボットからのメッセージのみが削除されます。 !/./>で始まるユーザーからのメッセージも削除する機能を追加したいと思います(これらのメッセージはボットだけでなくユーザーからのものかもしれません)ので、const botMessagesでこの行を編集しようとしました:const botMessages = messages.filter(msg => msg.author.bot && msg.content.startsWith("!" || "." || ">"));うまくいかなかった。私が間違っているところを指摘してください。どうすればこの問題を解決できますか?

もう1つのボットメッセージがある場合、ボットはメッセージを削除せず、削除するメッセージが少なくとも2-100個必要であるというDiscordAPIErrorが表示されます。これを回避する方法はありますか?

ありがとうございました。

+0

エラーをバイパスする方法は、2つのメッセージを一緒に削除することです。したがって、ユーザーが「.kick @ユーザー」と入力すると、ボットは「キックされたユーザー」と言います。 "!clearMessages"と打ち込んだら、ボットbulkはで始まるメッセージを削除します。 ( ".kick @ User")、ボットから "キックされたユーザー"というメッセージも表示されます。これは、今では2つのメッセージを一括消去して1ではないので動作しますか? –

答えて

1

const botMessages = messages.filter(msg => msg.author.bot && msg.content.startsWith("!" || "." || ">"));には2つの問題があります。"!"

  1. は最初truthyの文に対して評価することが起こっています。 String#startsWithはパターンが1つしかないので、そのコールを3つのコールに分割する必要があります。のは、便宜上、単一の変数にこれらのチェックの結果を代入してみましょう:あなたはボットユーザーによって発行されたか、そのコマンドのように見えるされたメッセージをフィルタリングしたい

    const isCommand = msg.content.startsWith("!") || msg.content.startsWith(".") || msg.content.startsWith(">"); 
    
  2. 。現在、あなたのロジックは、ボットによって発行されたメッセージがコマンドのように見えるように書かれています。これは間違っています(ボットはコマンドを発行しません)。上記の追加で正しいチェックは次のようになります。

    あなたのフィルタロジックは、あなたのDiscordAPIError例外を修正する必要がありますが、何も悪いの呼び出しが発行されていないされていることを確認するために、あなたはbulkDelete呼び出しを守る必要があります修正
    const botMessages = messages.filterArray(msg => { 
        const isCommand = msg.content.startsWith("!") || msg.content.startsWith(".") || msg.content.startsWith(">"); 
    
        return msg.author.bot || isCommand; 
    }); 
    

if (botMessages.length > 1) { 
    message.channel.bulkDelete(botMessages); 
} else if (botMessages.length) { 
    botMessages[0].delete(); 
} else { 
    // nothing to delete 
} 
+0

こんにちは..もう一度ありがとうございます。私はあなたのコードを試しましたが[ここをクリックしてください](https://pastebin.com/raw/Wau2QbzJ)、それは動作しないと私は[これを得る(http://prntscr.com/ hreesk)をクリアするだけです。 !/> /で始まるユーザーからのメッセージを削除するには、コマンド "!clearMessages"が必要です。また、ボットからメッセージを削除したいと思っています。私が間違ったことを教えてもらえますか? –

+0

そして、不一致のapiエラーがバイパスされたかどうかをテストするために[this](https://pastebin.com/raw/7rpTFgwi)を試しました。コンソールログも表示され、1ボットメッセージが削除されたというメッセージが送信されます。ただし、ディスカードサーバでは削除されません。また、3つ以上のメッセージについては削除されません。だから私は 'botMessages.length'を' bot.messages.array()。length'に変更しました。これは2つ以上のメッセージで機能しましたが、1の場合、コンソールに[this](http://prntscr.com/hrevz8)エラーが表示されます –

+0

私は 'Collection' /' Array'の動作を説明するために[解決策を更新しました](https://stackoverflow.com/revisions/47952736/4)でした。そうでなければ、「うまくいかない」ということを明確にする必要があります。表示されるメッセージは、エラーではなく、廃止予定の通知です。 –

関連する問題