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();