From 51004f30175e8f220f4b82fa2aa7a562ec07e885 Mon Sep 17 00:00:00 2001 From: t0w0bi Date: Sun, 21 Sep 2025 17:39:40 +0100 Subject: [PATCH] Update syncshell chat. Update /ss to /ps Remove whitespaces from sending in syncshell chat. --- MareSynchronos/Interop/GameChatHooks.cs | 43 ++++++++++++++----- MareSynchronos/MareSynchronos.csproj | 2 +- MareSynchronos/Services/ChatService.cs | 8 ++-- .../Services/CommandManagerService.cs | 11 ++--- MareSynchronos/UI/Components/GroupPanel.cs | 2 +- 5 files changed, 45 insertions(+), 21 deletions(-) diff --git a/MareSynchronos/Interop/GameChatHooks.cs b/MareSynchronos/Interop/GameChatHooks.cs index 02c5a22..f8a0534 100644 --- a/MareSynchronos/Interop/GameChatHooks.cs +++ b/MareSynchronos/Interop/GameChatHooks.cs @@ -3,6 +3,7 @@ using Dalamud.Game.Text.SeStringHandling.Payloads; using Dalamud.Hooking; using Dalamud.Memory; using Dalamud.Plugin.Services; +using Dalamud.Utility; using Dalamud.Utility.Signatures; using FFXIVClientStructs.FFXIV.Client.System.String; using FFXIVClientStructs.FFXIV.Client.UI; @@ -26,7 +27,7 @@ public unsafe sealed class GameChatHooks : IDisposable // Based on https://git.anna.lgbt/anna/ExtraChat/src/branch/main/client/ExtraChat/GameFunctions.cs private readonly ILogger _logger; - private readonly Action _ssCommandHandler; + private readonly Action _psCommandHandler; #region signatures #pragma warning disable CS0649 @@ -130,10 +131,10 @@ public unsafe sealed class GameChatHooks : IDisposable } } - public GameChatHooks(ILogger logger, IGameInteropProvider gameInteropProvider, Action ssCommandHandler) + public GameChatHooks(ILogger logger, IGameInteropProvider gameInteropProvider, Action psCommandHandler) { _logger = logger; - _ssCommandHandler = ssCommandHandler; + _psCommandHandler = psCommandHandler; logger.LogInformation("Initializing GameChatHooks"); gameInteropProvider.InitializeFromAttributes(this); @@ -209,19 +210,41 @@ public unsafe sealed class GameChatHooks : IDisposable if (isReply) _nextMessageIsReply = utcNow + TimeSpan.FromMilliseconds(100); - // If it is a command, check if it begins with /ss first so we can handle the message directly + // If it is a command, check if it begins with /ps first so we can handle the message directly // Letting Dalamud handle the commands causes all of the special payloads to be dropped - if (isCommand && messageSpan.StartsWith(System.Text.Encoding.ASCII.GetBytes("/ss"))) + if (isCommand && messageSpan.StartsWith(System.Text.Encoding.ASCII.GetBytes("/ps"))) { + for (int i = 1; i <= ChatService.CommandMaxNumber; ++i) { - var cmdString = $"/ss{i} "; + var cmdString = $"/ps{i} "; if (messageSpan.StartsWith(System.Text.Encoding.ASCII.GetBytes(cmdString))) { - var ssChatBytes = ProcessChatMessage(message); - ssChatBytes = ssChatBytes.Skip(cmdString.Length).ToArray(); - _ssCommandHandler?.Invoke(i, ssChatBytes); - return; + var psChatBytes = ProcessChatMessage(message); + psChatBytes = psChatBytes.Skip(cmdString.Length).ToArray(); + if (psChatBytes.Length > 0) + { + bool isBlank = true; + int j; + + for (j = 0; j < psChatBytes.Length; j++) + { + if(!char.IsWhiteSpace((char)psChatBytes[j])) + { + isBlank = false; + break; + } + } + + if (isBlank) + { + SendMessageHook!.OriginalDisposeSafe(thisPtr, message, uiModule); + return; + } + + _psCommandHandler?.Invoke(i, psChatBytes); + return; + } } } } diff --git a/MareSynchronos/MareSynchronos.csproj b/MareSynchronos/MareSynchronos.csproj index 2bcaf38..7cc4d52 100644 --- a/MareSynchronos/MareSynchronos.csproj +++ b/MareSynchronos/MareSynchronos.csproj @@ -2,7 +2,7 @@ ClubPenguinSync - 1.7.1.2 + 1.7.1.3 https://github.com/Rawrington/ClubPenguinSync/ diff --git a/MareSynchronos/Services/ChatService.cs b/MareSynchronos/Services/ChatService.cs index bfa3ab6..88ce27a 100644 --- a/MareSynchronos/Services/ChatService.cs +++ b/MareSynchronos/Services/ChatService.cs @@ -72,7 +72,7 @@ public class ChatService : DisposableMediatorSubscriberBase { var chatMsg = message.ChatMsg; var prefix = new SeStringBuilder(); - prefix.AddText("[BnnuyChat] "); + prefix.AddText("[PenguinChat] "); _chatGui.Print(new XivChatEntry{ MessageBytes = [..prefix.Build().Encode(), ..message.ChatMsg.PayloadContent], Name = chatMsg.SenderName, @@ -121,7 +121,7 @@ public class ChatService : DisposableMediatorSubscriberBase } if (color != 0) msg.AddUiForeground((ushort)color); - msg.AddText($"[SS{shellNumber}]<"); + msg.AddText($"[PS{shellNumber}]<"); if (message.ChatMsg.Sender.UID.Equals(_apiController.UID, StringComparison.Ordinal)) { // Don't link to your own character @@ -179,7 +179,7 @@ public class ChatService : DisposableMediatorSubscriberBase if (_gameChatHooks.IsValueCreated && _gameChatHooks.Value.ChatChannelOverride != null) { // Very dumb and won't handle re-numbering -- need to identify the active chat channel more reliably later - if (_gameChatHooks.Value.ChatChannelOverride.ChannelName.StartsWith($"SS [{shellNumber}]", StringComparison.Ordinal)) + if (_gameChatHooks.Value.ChatChannelOverride.ChannelName.StartsWith($"PS [{shellNumber}]", StringComparison.Ordinal)) SwitchChatShell(shellNumber); } } @@ -200,7 +200,7 @@ public class ChatService : DisposableMediatorSubscriberBase // BUG: This doesn't always update the chat window e.g. when renaming a group _gameChatHooks.Value.ChatChannelOverride = new() { - ChannelName = $"SS [{shellNumber}]: {name}", + ChannelName = $"PS [{shellNumber}]: {name}", ChatMessageHandler = chatBytes => SendChatShell(shellNumber, chatBytes) }; return; diff --git a/MareSynchronos/Services/CommandManagerService.cs b/MareSynchronos/Services/CommandManagerService.cs index 2450f9b..e5fba1f 100644 --- a/MareSynchronos/Services/CommandManagerService.cs +++ b/MareSynchronos/Services/CommandManagerService.cs @@ -1,5 +1,6 @@ using Dalamud.Game.Command; using Dalamud.Plugin.Services; +using Dalamud.Utility; using MareSynchronos.FileCache; using MareSynchronos.MareConfiguration; using MareSynchronos.MareConfiguration.Models; @@ -17,7 +18,7 @@ public sealed class CommandManagerService : IDisposable private const string _commandName = "/sync"; private const string _commandName2 = "/clubpenguin"; - private const string _ssCommandPrefix = "/ss"; + private const string _psCommandPrefix = "/ps"; private readonly ApiController _apiController; private readonly ICommandManager _commandManager; @@ -52,7 +53,7 @@ public sealed class CommandManagerService : IDisposable // Lazy registration of all possible /ss# commands which tbf is what the game does for linkshells anyway for (int i = 1; i <= ChatService.CommandMaxNumber; ++i) { - _commandManager.AddHandler($"{_ssCommandPrefix}{i}", new CommandInfo(OnChatCommand) + _commandManager.AddHandler($"{_psCommandPrefix}{i}", new CommandInfo(OnChatCommand) { ShowInHelp = false }); @@ -65,7 +66,7 @@ public sealed class CommandManagerService : IDisposable _commandManager.RemoveHandler(_commandName2); for (int i = 1; i <= ChatService.CommandMaxNumber; ++i) - _commandManager.RemoveHandler($"{_ssCommandPrefix}{i}"); + _commandManager.RemoveHandler($"{_psCommandPrefix}{i}"); } private void OnCommand(string command, string args) @@ -139,9 +140,9 @@ public sealed class CommandManagerService : IDisposable if (_mareConfigService.Current.DisableSyncshellChat) return; - int shellNumber = int.Parse(command[_ssCommandPrefix.Length..]); + int shellNumber = int.Parse(command[_psCommandPrefix.Length..]); - if (args.Length == 0) + if (args.Length == 0 || args.IsNullOrWhitespace()) { _chatService.SwitchChatShell(shellNumber); } diff --git a/MareSynchronos/UI/Components/GroupPanel.cs b/MareSynchronos/UI/Components/GroupPanel.cs index 067d591..53ffe18 100644 --- a/MareSynchronos/UI/Components/GroupPanel.cs +++ b/MareSynchronos/UI/Components/GroupPanel.cs @@ -246,7 +246,7 @@ internal sealed class GroupPanel if (!_mareConfig.Current.DisableSyncshellChat && shellConfig.Enabled) { ImGui.TextUnformatted($"[{shellNumber}]"); - UiSharedService.AttachToolTip("Chat command prefix: /ss" + shellNumber); + UiSharedService.AttachToolTip("Chat command prefix: /ps" + shellNumber); } if (textIsGid) ImGui.PushFont(UiBuilder.MonoFont); ImGui.SameLine();