Как сохранить последние сообщения игрока

Mr_dsa1

Пользователь
Здравствуйте. Мне нужно сохранять предвидящее сообщения игрока, чтоб в дальнейшем с ним работать, но я не знаю как это сделать, поискал на просторах сети, там не совсем то, что нужно. Мне всего лишь нужно, чтоб например:
- тест1
- тест2
Сообщение тест1 сохранялось, а при отправки сообщения тест2 я работал с сообщением тест1, затем удалял сообщение тест1 и так постоянно. То есть мне нужно сохранять только два последних сообщений, которое отправлял игрок. (Для блокировки повторов сообщений). Очень надеюсь на вашу помощь.
 

BuseSo

Разработчик
ээ...

Тебе нужно создать класс, например CustomPlayer
В нём сделать выявить игрока и его сообщения:
Java:
private Player player;
private ArrayList<String> messages;
Далее создать конструктор класса:

Java:
public CustomPlayer(Player player, String message) {
    if(!Main.cpls.contains(this)) {
        messages = new ArrayList<String>();
    }
    
    this.player = player;
    messages.add(message);
}
Как далее понятно - в главном классе нужно создать статик ArrayList<Player>();

Возвращаемся к CustomPlayer. Создаём здесь методы getPlayer(), getMessages(), removeMessage():
Java:
public Player getPlayer() {
    return this.player;
}

public ArrayList<String> getMessages() {
    return this.messages;
}

public void removeMessage(String message) {
    this.messages.remove(message);
}
Мы не создали метод addMessage(), потому что суть этого метода лежит в конструкторе.

Теперь в ивенте AsyncPlayerChatMessage делаем следующий код:

Java:
Player p = e.getPlayer();
String newMessage = e.getMessage();

CustomPlayer cp = new CustomPlayer(p, newMessage);

//Код на предыдущее сообщение:
if(cp.getMessages().get(0)/*делаешь что-то*/) {
    //ещё что-то делаешь
    cp.removeMessage(0);
}

//Код на текущее сообщение:
if(newMessage) 
    //тыры пыры пальцы в дыры
Я ничего не проверял, но по сути должно работать :)
Если нет, то спрашивай.
 

Mr_dsa1

Пользователь
Спасибо :oops:

//Код на предыдущее сообщение: if(cp.getMessages().get(0)/*делаешь что-то*/) { //ещё что-то делаешь cp.removeMessage(0); } //Код на текущее сообщение: if(newMessage) //тыры пыры пальцы в дыры
Можешь объяснить что делает cp.getMessages().get(0) ? (у меня с ним ошибки, но скорее всего дело во мне)
И у меня ошибки с newMessage:
1578123022100.png
 

BuseSo

Разработчик
cp - экземпляр класса CustomPlayer.
getMessages() - получение списка сообщений.
get(0) - получение первого сообщения из списка.
Какая там ошибка высвечивается?


И у меня ошибки с newMessage:
1578123022100.png
if делает проверку, отвечая на вопрос "Правда/Ложь":
Ты не можешь сделать проверку по типу "если <сообщение, которое получено из newMessage>", потому что этот вопрос не даст ответ "Да" или "Нет".

Нужно сделать хоть какую-то проверку, например, содержится ли в этом сообщении что-то или превышает ли сообщение какую-либо длину по кол-ву символов:
if(newMessage.equals("что должно быть в сообщении, чтобы пройти проверку")) { }
if(newMessage.length > 5) { } и т.д.

offtop Это всё кстати делается на базовом уровне при изучении Java.
 

BuseSo

Разработчик
Здесь я объяснил, что нужно делать.
Если тебе нужно узнать, есть ли что-то в строке, то пиши так:
cp.getMessages().get(0).contains("тыры пыры")


И еще, проблема с cp.removeMessage(0), тоже высвечивается ошибка:
В классе CustomPlayer напиши метод:
Java:
public void removeMessage(int i) {
    this.messages.remove(i);
}
 

Mr_dsa1

Пользователь
Написал код, но есть проблема, повторение работает теперь через 1 слово, вот скрин чата -

chat1.png
Как выглядел чат:
- test1
- test2
- test2
- test1
- test2
Может кто подскажет в чем проблема или предложит другое решение ?
Java:
package chatguard.main;

import java.util.HashMap;

import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.AsyncPlayerChatEvent;
import org.bukkit.event.player.PlayerJoinEvent;


public class Handler implements Listener{
   
    private ChatGuard plugin;
   
    public Handler(ChatGuard plugin) {
        this.plugin = plugin;
    }

    //создаем наши HashMap
    HashMap<String, String> lastMessages = new HashMap<>();
    HashMap<String, String> newMessage = new HashMap<>();
   
    @EventHandler
    public void obJoin(PlayerJoinEvent e) {
        lastMessages.clear();
        newMessage.clear();
    }

   
    @EventHandler
    public void onChat(AsyncPlayerChatEvent e) {
        String pname = e.getPlayer().getName();   //Получаем ник игрока (Тип: Ник)
        Player p = e.getPlayer();       //Получаем ник игрока (Тип: CraftBukkit Ник)
        String msg = e.getMessage();   //Получаем сообщение игрока в чат
        Boolean isBlocked = false;
        String errormsg = plugin.getConfig().getString("messages.repeat");
        errormsg = errormsg.replace("&", "\u00a7");
       
       
        //выполняется если newMessage пустой, lastMessages не пустой - заполняем newMessage
        //перестает выполнятся после второго сообщения игрока
        if(newMessage.isEmpty() && !(lastMessages.isEmpty())  ){
            newMessage.put(pname, msg);
            String newmsg = newMessage.get(pname);
            String lastmsg = lastMessages.get(pname);
         
            //если новое сообщение игрока равно старому, отправить сообщение Equals
            if(newmsg.equalsIgnoreCase(lastmsg) && newmsg.length()>1 && lastmsg.length()>1) {
                p.sendMessage("1");
                e.setCancelled(true);
                newMessage.clear();
                isBlocked = true;
            }
        }else if (lastMessages.isEmpty()){
            lastMessages.put(pname, msg);
        }else if (  !(lastMessages.isEmpty()) && !(newMessage.isEmpty() && isBlocked == true)  ){
            p.sendMessage("2");
            String msg1 = e.getMessage();
            lastMessages.put(pname, msg1);
            newMessage.clear();
            e.setCancelled(true);
        }
       
    }

}
 

Комнаты в чате

Верх Низ