2017-10-03 2 views
1

私は不協和音のフィルターとして機能したい、不和サーバー用のボットを作成しています。私はテキストファイルから悪い言葉のリストを読んで、それらを配列に格納します。ユーザーが(ボットが聞いているチャンネルの)メッセージを送信するたびに、ボットはそのメッセージにこれらの悪い単語の1つ以上が含まれているかどうかを確認します。これを行うには、私は次のコードを使用します。if文は、メッセージの内容の悪い言葉は配列の最後のいずれかに一致する場合にのみtrue返すこと'Array#each'のIf-Statementは、最後の要素にのみ 'true'を返します。

badWords.each { |badword| 
    if content.downcase.include? badword 
    ... 
    end 
} 

私の問題があります。配列の他の要素と一致する場合は、falseを返します。

私が誤解しているArray#eachの機能はありますか?

答えて

2

最後に\nサインを持つことができますので、stripにお試しください。

if content.downcase.include?(badword.strip) 
+0

ありがとう、これは問題であるようです。 – Esgaroth

+0

これは新しい 'content'が評価されるたびに' .strip'を各バッドワードに個別に適用します。 – moveson

1

私はあなたがより良い何が起こっているかを理解することができるように小さな部分にまであなたのコードを壊し、その後、物事はより簡潔作るためにRubyのEnumerable methodsのいずれかを使用します。また、snake_caseのRubyの規約(badWordsの代わりにbad_words)を使用しましょう。

まず、bad_words配列に不要な文字が含まれていないことを確認します。 bad_wordsコレクションは、毎回各要素を変更するのではなく、1回だけ変更することをお勧めします。

私たちのコレクションは重複を含まないであろう、と我々は要素を一致させるために、それを何度も検索することがありますから、私たちがセットに配列を変換することにより、大幅に効率を向上させることができるため、我々は、それでいる間:

require 'set' 
bad_words = bad_words.map(&:strip).to_set 

次に、コンテンツに悪い単語が含まれているかどうかを確認する方法を書いてみましょう。私たちは、それがブール値を返す示すために、メソッド名の末尾に疑問符をつけます:いずれかの項目には、次のブロックに戻りtrueに渡された場合

def profane?(content) 
    bad_words.any? { |bad_word| content.include?(bad_word) } 
end 

#any?メソッドがtrueを返します。

今、あなたの手術のコードはprofane?を呼び出して、適切な行動とることができます。私は、メソッドの戻りtrueコンテンツが不敬であれば作った

def filter_bad_words(content) 
    if profane?(content) 
    bot.send_message(event.channel.id, "Sorry #{event.user.name}, this message made my profanity senses tingle!") 
    bot.send_message(344559522003812354, "PROFANITY WARNING!!\n user: #{event.user.name}\n message: #{event.content}\n Please check if it is a cause for a warning. Use !?warn to give the user a warning.") 
    event.message.delete 
    true 
    end 
end 

を、そしてコンテンツが不敬でない場合は、デフォルトでnilを返します。 。必要に応じて異なる戻り値を使用することができ、その応答に基づいてさらにアクションをとることができます。

+0

答えをありがとう、それは私に多くの問題をデバッグするのに役立ちました。しかし、@AlexKojinが投稿したのは解決策でした。 – Esgaroth

+0

OKですが、内容に5つのbad_wordsが含まれている場合、5つのメッセージをユーザーに送信してから、5つのメッセージをログに送信してから、event.messageを5回削除しようとします。また、50のbad_wordsのリストがある場合、最初のものが 'content'に含まれていても、それぞれをテストします。私の解決策は、これらの問題の両方を解決します。 – moveson

関連する問題