From dc153572dd67df727661ba4b3d351480317dfe04 Mon Sep 17 00:00:00 2001
From: GanyusLeftHorn <1244229+GanyusLeftHorn@users.noreply.github.com>
Date: Tue, 16 Aug 2022 18:15:10 -0700
Subject: [PATCH] Fix chat welcome messages and some slight refactoring.

---
 .../ChatManager.java => chat/ChatSystem.java} | 38 +++++++++----------
 .../ChatSystemHandler.java}                   |  5 +--
 .../emu/grasscutter/game/player/Player.java   | 10 +----
 .../grasscutter/server/game/GameServer.java   | 17 ++++-----
 4 files changed, 30 insertions(+), 40 deletions(-)
 rename src/main/java/emu/grasscutter/game/{managers/chat/ChatManager.java => chat/ChatSystem.java} (84%)
 rename src/main/java/emu/grasscutter/game/{managers/chat/ChatManagerHandler.java => chat/ChatSystemHandler.java} (83%)

diff --git a/src/main/java/emu/grasscutter/game/managers/chat/ChatManager.java b/src/main/java/emu/grasscutter/game/chat/ChatSystem.java
similarity index 84%
rename from src/main/java/emu/grasscutter/game/managers/chat/ChatManager.java
rename to src/main/java/emu/grasscutter/game/chat/ChatSystem.java
index 62a93638..7f039d96 100644
--- a/src/main/java/emu/grasscutter/game/managers/chat/ChatManager.java
+++ b/src/main/java/emu/grasscutter/game/chat/ChatSystem.java
@@ -1,4 +1,4 @@
-package emu.grasscutter.game.managers.chat;
+package emu.grasscutter.game.chat;
 
 import emu.grasscutter.GameConstants;
 import emu.grasscutter.command.CommandMap;
@@ -20,7 +20,7 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
-public class ChatManager implements ChatManagerHandler {
+public class ChatSystem implements ChatSystemHandler {
     static final String PREFIXES = "[/!]";
     static final Pattern RE_PREFIXES = Pattern.compile(PREFIXES);
     static final Pattern RE_COMMANDS = Pattern.compile("\n" + PREFIXES);
@@ -31,7 +31,7 @@ public class ChatManager implements ChatManagerHandler {
 
     private final GameServer server;
 
-    public ChatManager(GameServer server) {
+    public ChatSystem(GameServer server) {
         this.server = server;
     }
 
@@ -50,15 +50,15 @@ public class ChatManager implements ChatManagerHandler {
     /********************
      * Chat history handling
      ********************/
-    private void putInHistory(int uid, int targetId, ChatInfo info) {
+    private void putInHistory(int uid, int partnerId, ChatInfo info) {
         if (!this.history.containsKey(uid)) {
             this.history.put(uid, new HashMap<>());
         }
-        if (!this.history.get(uid).containsKey(targetId)) {
-            this.history.get(uid).put(targetId, new ArrayList<>());
+        if (!this.history.get(uid).containsKey(partnerId)) {
+            this.history.get(uid).put(partnerId, new ArrayList<>());
         }
 
-        this.history.get(uid).get(targetId).add(info);
+        this.history.get(uid).get(partnerId).add(info);
     }
 
     public void clearHistoryOnLogout(Player player) {
@@ -67,9 +67,9 @@ public class ChatManager implements ChatManagerHandler {
         }
     }
 
-    public void handlePullPrivateChatReq(Player player, int targetUid) {
-        if (this.history.containsKey(player.getUid()) && this.history.get(player.getUid()).containsKey(targetUid)) {
-            player.sendPacket(new PacketPullPrivateChatRsp(this.history.get(player.getUid()).get(targetUid)));
+    public void handlePullPrivateChatReq(Player player, int partnerId) {
+        if (this.history.getOrDefault(player.getUid(), Map.of()).containsKey(partnerId)) {
+            player.sendPacket(new PacketPullPrivateChatRsp(this.history.get(player.getUid()).get(partnerId)));
         }
         else {
             player.sendPacket(new PacketPullPrivateChatRsp(List.of()));
@@ -77,17 +77,17 @@ public class ChatManager implements ChatManagerHandler {
     }
 
     public void handlePullRecentChatReq(Player player) {
+        // If this user has no chat history yet, create it by sending the server welcome messages.
+        if (!this.history.getOrDefault(player.getUid(), Map.of()).containsKey(GameConstants.SERVER_CONSOLE_UID)) {
+            this.sendServerWelcomeMessages(player);
+        }
+
         // For now, we send the list three messages from the server for the recent chat history.
         // This matches the previous behavior, but ultimately, we should probably keep track of the last chat partner
         // for every given player and return the last messages exchanged with that partner.
-        if (this.history.containsKey(player.getUid()) && this.history.get(player.getUid()).containsKey(GameConstants.SERVER_CONSOLE_UID)) {
-            int historyLength = this.history.get(player.getUid()).get(GameConstants.SERVER_CONSOLE_UID).size();
-            var messages = this.history.get(player.getUid()).get(GameConstants.SERVER_CONSOLE_UID).subList(Math.max(historyLength - 3, 0), historyLength);
-            player.sendPacket(new PacketPullRecentChatRsp(messages));
-        }
-        else {
-            player.sendPacket(new PacketPullRecentChatRsp(List.of()));
-        }
+        int historyLength = this.history.get(player.getUid()).get(GameConstants.SERVER_CONSOLE_UID).size();
+        var messages = this.history.get(player.getUid()).get(GameConstants.SERVER_CONSOLE_UID).subList(Math.max(historyLength - 3, 0), historyLength);
+        player.sendPacket(new PacketPullRecentChatRsp(messages));
     }
 
     /********************
@@ -199,7 +199,7 @@ public class ChatManager implements ChatManagerHandler {
     /********************
      * Welcome messages
      ********************/
-    public void sendServerWelcomeMessages(Player player) {
+    private void sendServerWelcomeMessages(Player player) {
         var joinOptions = GAME_INFO.joinOptions;
 
         if (joinOptions.welcomeEmotes != null && joinOptions.welcomeEmotes.length > 0) {
diff --git a/src/main/java/emu/grasscutter/game/managers/chat/ChatManagerHandler.java b/src/main/java/emu/grasscutter/game/chat/ChatSystemHandler.java
similarity index 83%
rename from src/main/java/emu/grasscutter/game/managers/chat/ChatManagerHandler.java
rename to src/main/java/emu/grasscutter/game/chat/ChatSystemHandler.java
index b8b197a2..9a3d66f2 100644
--- a/src/main/java/emu/grasscutter/game/managers/chat/ChatManagerHandler.java
+++ b/src/main/java/emu/grasscutter/game/chat/ChatSystemHandler.java
@@ -1,9 +1,9 @@
-package emu.grasscutter.game.managers.chat;
+package emu.grasscutter.game.chat;
 
 import emu.grasscutter.game.player.Player;
 import emu.grasscutter.server.game.GameServer;
 
-public interface ChatManagerHandler {
+public interface ChatSystemHandler {
     GameServer getServer();
     void sendPrivateMessage(Player player, int targetUid, String message);
     void sendPrivateMessage(Player player, int targetUid, int emote);
@@ -13,6 +13,5 @@ public interface ChatManagerHandler {
     void sendPrivateMessageFromServer(int targetUid, int emote);
     void handlePullPrivateChatReq(Player player, int targetUid);
     void clearHistoryOnLogout(Player player);
-    void sendServerWelcomeMessages(Player player);
     void handlePullRecentChatReq(Player player);
 }
diff --git a/src/main/java/emu/grasscutter/game/player/Player.java b/src/main/java/emu/grasscutter/game/player/Player.java
index 586a4bfd..6fcad527 100644
--- a/src/main/java/emu/grasscutter/game/player/Player.java
+++ b/src/main/java/emu/grasscutter/game/player/Player.java
@@ -51,14 +51,12 @@ import emu.grasscutter.net.proto.AbilityInvokeEntryOuterClass.AbilityInvokeEntry
 import emu.grasscutter.net.proto.AttackResultOuterClass.AttackResult;
 import emu.grasscutter.net.proto.CombatInvokeEntryOuterClass.CombatInvokeEntry;
 import emu.grasscutter.net.proto.GadgetInteractReqOuterClass.GadgetInteractReq;
-import emu.grasscutter.net.proto.InteractTypeOuterClass.InteractType;
 import emu.grasscutter.net.proto.MpSettingTypeOuterClass.MpSettingType;
 import emu.grasscutter.net.proto.OnlinePlayerInfoOuterClass.OnlinePlayerInfo;
 import emu.grasscutter.net.proto.PlayerLocationInfoOuterClass.PlayerLocationInfo;
 import emu.grasscutter.net.proto.ProfilePictureOuterClass.ProfilePicture;
 import emu.grasscutter.net.proto.PropChangeReasonOuterClass.PropChangeReason;
 import emu.grasscutter.net.proto.SocialDetailOuterClass.SocialDetail;
-import emu.grasscutter.net.proto.VisionTypeOuterClass.VisionType;
 import emu.grasscutter.scripts.data.SceneRegion;
 import emu.grasscutter.server.event.player.PlayerJoinEvent;
 import emu.grasscutter.server.event.player.PlayerQuitEvent;
@@ -799,7 +797,6 @@ public class Player {
         }
 
         this.getServer().getChatSystem().sendPrivateMessageFromServer(getUid(), message.toString());
-        // this.sendPacket(new PacketPrivateChatNotify(GameConstants.SERVER_CONSOLE_UID, getUid(), message.toString()));
     }
 
     /**
@@ -809,7 +806,6 @@ public class Player {
      * @param message The message to send.
      */
     public void sendMessage(Player sender, Object message) {
-        // this.sendPacket(new PacketPrivateChatNotify(sender.getUid(), this.getUid(), message.toString()));
         this.getServer().getChatSystem().sendPrivateMessage(sender, this.getUid(), message.toString());
     }
 
@@ -1194,12 +1190,8 @@ public class Player {
         session.send(new PacketPlayerEnterSceneNotify(this)); // Enter game world
         session.send(new PacketPlayerLevelRewardUpdateNotify(rewardedLevels));
 
-
         // First notify packets sent
-        this.hasSentLoginPackets = true;
-
-        // Send server welcome chat.
-        this.getServer().getChatSystem().sendServerWelcomeMessages(this);
+        this.hasSentLoginPackets = true; 
 
         // Set session state
         session.setState(SessionState.ACTIVE);
diff --git a/src/main/java/emu/grasscutter/server/game/GameServer.java b/src/main/java/emu/grasscutter/server/game/GameServer.java
index c8768eec..fc4e3dea 100644
--- a/src/main/java/emu/grasscutter/server/game/GameServer.java
+++ b/src/main/java/emu/grasscutter/server/game/GameServer.java
@@ -2,10 +2,11 @@ package emu.grasscutter.server.game;
 
 import emu.grasscutter.GameConstants;
 import emu.grasscutter.Grasscutter;
-import emu.grasscutter.command.CommandMap;
 import emu.grasscutter.database.DatabaseHelper;
 import emu.grasscutter.game.Account;
 import emu.grasscutter.game.battlepass.BattlePassSystem;
+import emu.grasscutter.game.chat.ChatSystem;
+import emu.grasscutter.game.chat.ChatSystemHandler;
 import emu.grasscutter.game.combine.CombineManger;
 import emu.grasscutter.game.drop.DropSystem;
 import emu.grasscutter.game.dungeons.DungeonSystem;
@@ -13,8 +14,6 @@ import emu.grasscutter.game.dungeons.challenge.DungeonChallenge;
 import emu.grasscutter.game.expedition.ExpeditionSystem;
 import emu.grasscutter.game.gacha.GachaSystem;
 import emu.grasscutter.game.managers.CookingManager;
-import emu.grasscutter.game.managers.chat.ChatManager;
-import emu.grasscutter.game.managers.chat.ChatManagerHandler;
 import emu.grasscutter.game.managers.energy.EnergyManager;
 import emu.grasscutter.game.managers.stamina.StaminaManager;
 import emu.grasscutter.game.player.Player;
@@ -74,7 +73,7 @@ public final class GameServer extends KcpServer {
     private final ServerTaskScheduler scheduler;
     private final TaskMap taskMap;
 
-    private ChatManagerHandler chatManager;
+    private ChatSystemHandler chatManager;
 
     public GameServer() {
         this(getAdapterInetSocketAddress());
@@ -124,27 +123,27 @@ public final class GameServer extends KcpServer {
         this.questSystem = new QuestSystem(this);
 
         // Chata manager
-        this.chatManager = new ChatManager(this);
+        this.chatManager = new ChatSystem(this);
 
         // Hook into shutdown event.
         Runtime.getRuntime().addShutdownHook(new Thread(this::onServerShutdown));
     }
 
     @Deprecated
-    public ChatManagerHandler getChatManager() {
+    public ChatSystemHandler getChatManager() {
         return chatManager;
     }
 
     @Deprecated
-    public void setChatManager(ChatManagerHandler chatManager) {
+    public void setChatManager(ChatSystemHandler chatManager) {
         this.chatManager = chatManager;
     }
 
-    public ChatManagerHandler getChatSystem() {
+    public ChatSystemHandler getChatSystem() {
         return chatManager;
     }
 
-    public void setChatSystem(ChatManagerHandler chatManager) {
+    public void setChatSystem(ChatSystemHandler chatManager) {
         this.chatManager = chatManager;
     }
 
-- 
GitLab