From 993893be652c44ade0d20c799c949a6fb706b5c9 Mon Sep 17 00:00:00 2001 From: jtieri Date: Sun, 16 Apr 2023 23:00:06 -0500 Subject: [PATCH] feat: add chatlog cmd for viewing missed chat msgs --- .../havana/game/commands/CommandManager.java | 1 + .../commands/registered/ChatlogCommand.java | 56 +++++++++++++++++++ .../havana/game/room/entities/RoomEntity.java | 17 ++++-- .../game/room/managers/RoomEntityManager.java | 1 + 4 files changed, 71 insertions(+), 4 deletions(-) create mode 100644 Havana-Server/src/main/java/org/alexdev/havana/game/commands/registered/ChatlogCommand.java diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/commands/CommandManager.java b/Havana-Server/src/main/java/org/alexdev/havana/game/commands/CommandManager.java index 6a8d8ed..2edfdb3 100644 --- a/Havana-Server/src/main/java/org/alexdev/havana/game/commands/CommandManager.java +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/commands/CommandManager.java @@ -59,6 +59,7 @@ public class CommandManager { tempCommands.put(new String[] { "rgb", "rainbow" }, new RainbowDimmerCommand()); tempCommands.put(new String[] { "afk", "idle" }, new AfkCommand()); tempCommands.put(new String[] { "guidestatus" }, new GuideStatusCommand()); + tempCommands.put(new String[] {"cl", "chatlog", "wys"}, new ChatlogCommand()); // Staff commands tempCommands.put(new String[] { "copyroom" }, new CopyRoomCommand()); diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/commands/registered/ChatlogCommand.java b/Havana-Server/src/main/java/org/alexdev/havana/game/commands/registered/ChatlogCommand.java new file mode 100644 index 0000000..955f3e1 --- /dev/null +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/commands/registered/ChatlogCommand.java @@ -0,0 +1,56 @@ +package org.alexdev.havana.game.commands.registered; + +import org.alexdev.havana.dao.mysql.RoomDao; +import org.alexdev.havana.game.commands.Command; +import org.alexdev.havana.game.entity.Entity; +import org.alexdev.havana.game.entity.EntityType; +import org.alexdev.havana.game.moderation.ChatMessage; +import org.alexdev.havana.game.player.Player; +import org.alexdev.havana.game.player.PlayerRank; +import org.alexdev.havana.messages.outgoing.alerts.ALERT; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.Comparator; + +public class ChatlogCommand extends Command { + @Override + public void setPlayerRank() { + super.setPlayerRank(PlayerRank.NORMAL); + } + + @Override + public void handleCommand(Entity entity, String message, String[] args) { + var roomChatLogs = RoomDao.getModChatlog(entity.getRoomUser().getRoom().getId()); + + StringBuilder viewableLogs = new StringBuilder(); + + var sortedChatLogs = roomChatLogs.stream() + .filter(msg -> msg.getSentTime() > entity.getRoomUser().getEnteredRoomAt()) + .sorted(Comparator.comparing(ChatMessage::getSentTime)) + .toList(); + + for (var commandSet : sortedChatLogs) { + LocalDateTime dateTime = LocalDateTime.ofEpochSecond(commandSet.getSentTime(), 0, java.time.ZoneOffset.UTC); + String formattedTime = dateTime.format(DateTimeFormatter.ofPattern("HH:mm:ss")); + + viewableLogs.append("[").append(formattedTime).append("] "); + viewableLogs.append(commandSet.getPlayerName()); + viewableLogs.append(": "); + viewableLogs.append(commandSet.getMessage()); + viewableLogs.append("
"); + } + + if (entity.getType() == EntityType.PLAYER) { + Player player = (Player) entity; + player.send(new ALERT(viewableLogs.toString())); + } + } + + @Override + public String getDescription() { + return "Display chat log for current room."; + } +} + + diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/room/entities/RoomEntity.java b/Havana-Server/src/main/java/org/alexdev/havana/game/room/entities/RoomEntity.java index 45a1086..8915e6f 100644 --- a/Havana-Server/src/main/java/org/alexdev/havana/game/room/entities/RoomEntity.java +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/room/entities/RoomEntity.java @@ -26,12 +26,10 @@ import org.alexdev.havana.game.wordfilter.WordfilterManager; import org.alexdev.havana.messages.outgoing.effects.USER_AVATAR_EFFECT; import org.alexdev.havana.messages.outgoing.rooms.user.*; import org.alexdev.havana.messages.types.MessageComposer; +import org.alexdev.havana.util.DateUtil; import org.alexdev.havana.util.config.GameConfiguration; -import java.util.ArrayList; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.concurrent.BlockingQueue; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.CopyOnWriteArrayList; @@ -75,12 +73,15 @@ public abstract class RoomEntity { private int carryId; private String carryValue; + private long enteredRoomAt; + public RoomEntity(Entity entity) { this.entity = entity; this.statuses = new ConcurrentHashMap<>(); this.path = new LinkedList<>(); this.packetQueueAfterRoomLeave = new LinkedBlockingQueue(); this.timerManager = new RoomTimerManager(this); + this.enteredRoomAt = DateUtil.getCurrentTimeSeconds(); } public void reset() { @@ -103,6 +104,7 @@ public abstract class RoomEntity { this.pixelAvailableTick = new AtomicInteger(GameConfiguration.getInstance().getInteger("pixels.max.tries.single.room.instance")); this.chatMessages = new CopyOnWriteArrayList<>(); this.timerManager.resetTimers(); + this.enteredRoomAt = 0; } /** @@ -1078,4 +1080,11 @@ public abstract class RoomEntity { return pixelAvailableTick; } + public long getEnteredRoomAt() { + return enteredRoomAt; + } + + public void setEnteredRoomAt() { + this.enteredRoomAt = DateUtil.getCurrentTimeSeconds(); + } } diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/room/managers/RoomEntityManager.java b/Havana-Server/src/main/java/org/alexdev/havana/game/room/managers/RoomEntityManager.java index 96d6847..b0f7260 100644 --- a/Havana-Server/src/main/java/org/alexdev/havana/game/room/managers/RoomEntityManager.java +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/room/managers/RoomEntityManager.java @@ -183,6 +183,7 @@ public class RoomEntityManager { entity.getRoomUser().reset(); entity.getRoomUser().setRoom(this.room); entity.getRoomUser().setInstanceId(this.generateUniqueId()); + entity.getRoomUser().setEnteredRoomAt(); Position entryPosition = this.room.getModel().getDoorLocation();