AsyncPlayerChatEvent, попытка увидеть, содержится ли строка из массива строк в другой строке из второго массива строк

Я делаю плагин для сервера Bukkit Minecraft с версией 1.6.4. Предполагается, что плагин не позволит игрокам рассылать спам, а также подвергать цензуре нецензурные слова, но разрешать определенные слова, в которые встроены нецензурные слова (например, HELLo, molASSes). Я создал два массива строк. Один содержит все нецензурные слова, а второй содержит «разрешенные» слова.

String[] curse = {"Swear1", "Swear2", "etc..."};
String[] allowed = {"Allowed1", "Allowed2", "etc..."};

Я пытаюсь сделать так, чтобы всякий раз, когда игрок говорит в чате, плагин проверял сообщение на наличие ругательств, игнорируя при этом пробелы и специальные символы.

Вот что у меня есть на данный момент (извините, если немного сумбурно):

public int seconds1 = 0;
public int seconds2 = 0;
public int spam = 0;

@EventHandler
public void onPlayerChat(AsyncPlayerChatEvent event){

    Player player = event.getPlayer();
    String name = player.getName();
    seconds2 = seconds1;
    seconds1 = ((int) (System.currentTimeMillis()));

    if (seconds1 - seconds2 <= 2500){

        spam++;

        switch (spam){

        case 3: player.damage(1);
                player.sendMessage(ChatColor.GOLD + "Spam Warning: " + ChatColor.RED + "Do not spam! Spamming reduces your health.");
                break;
        case 4: player.damage(3);
                break;
        case 6: player.damage(5);
                player.sendMessage(ChatColor.GOLD + "Spam Warning: " + ChatColor.RED + "I'm warning you.");
                break;
        case 7: player.damage(6);
                break;
        case 8: player.damage(10);
                player.kickPlayer("What did I tell you about spamming?");

                for(Player p : Bukkit.getOnlinePlayers()){

                    p.sendMessage(ChatColor.BLUE + name + ChatColor.RED + " has been kicked for spamming!");

                }

                spam = 0;

                break;

        }

    }else if(seconds1 - seconds2 > 2000){

        spam = 0;

    }

    String message = event.getMessage().toLowerCase().replace("-", "").replace(" ", "").replace(",", "")
                .replace(".", "").replace("~", "").replace("!", "").replace("@", "").replace("#", "")
                .replace("$", "").replace("%", "").replace("^", "").replace("&", "").replace("*", "")
                .replace("(", "").replace(")", "").replace("_", "").replace("+", "").replace("=", "")
                .replace("{", "").replace("}", "").replace("[", "").replace("]", "").replace("|", "")
                .replace("'", "").replace("<", "").replace(">", "").replace("/", "").replace("?", "")
                .replace("`", "").replace("¸", "").replace("^", "").replace("@", "a");

    String[] curse = {"All", "Curse", "Words"};
    //I won't list the swears in this post.
    String[] allowed = {"All", "Allowed", "Words"};

    for(String blacklist : curse){

        if(message.contains(blacklist)){

            for (int i = 0; i < allowed.length; i++){

                if(allowed[i].contains(blacklist)){
                    event.setCancelled(true);
                    }else{

                    event.setCancelled(true);
                    player.chat(message.replaceAll(blacklist, "*bleep*"));
                    player.damage(5);
                    return;

                }

            }

        }

    }

}

Единственное, что не работает, — это попытки найти ругательства среди разрешенных слов. Все, что у меня сейчас есть в моем коде, не работает.


person Daniel Baliki    schedule 07.10.2013    source источник


Ответы (1)


Я бы попытался использовать регулярные выражения за то, что вы пытаетесь сделать. Попробуйте что-то вроде

String[] swearWords = {"all", "swear", "words", "in", "here"};
// This replaces every punctuation symbol except @ by a space
String message = event.getMessage().toLowerCase().replaceAll("@", "a").replaceAll("\\p{Punct}", " ");

for(String word : swearWords){
  if(message.matches("(.* )?"+word+"( .*)?")) {
    // There has been a swear word in the message
    event.setMessage(event.getMessage().replaceAll(word, "*censored*"));
  } else {
    // The current swear word was not found in the message.
  }
}

Это даже имеет более высокую производительность ;)

ПОЖАЛУЙСТА, ОБРАТИТЕ ВНИМАНИЕ: это было написано с моего телефона, поэтому, пожалуйста, извините за неправильное форматирование и тому подобное :)

person mezzodrinker    schedule 08.10.2013