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

Mr_dsa1

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

Тебе нужно создать класс, например 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) 
    //тыры пыры пальцы в дыры

Я ничего не проверял, но по сути должно работать :)
Если нет, то спрашивай.
 
Последнее редактирование:
Спасибо :oops:

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


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

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

[OFFTOPIC]Это всё кстати делается на базовом уровне при изучении Java.[/OFFTOPIC]
 
Какая там ошибка высвечивается?
Вам необходимо зарегистрироваться для просмотра изображений-вложений


И еще, проблема с cp.removeMessage(0), тоже высвечивается ошибка:
Вам необходимо зарегистрироваться для просмотра изображений-вложений

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


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

Вам необходимо зарегистрироваться для просмотра изображений-вложений

Как выглядел чат:
- 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);
        }
       
    }

}
 
Назад
Сверху Снизу