From 2c3fe180ef3a18fc8fa97d3bf0194cf245ed96a5 Mon Sep 17 00:00:00 2001 From: Anna Date: Sat, 27 Aug 2022 12:30:58 -0400 Subject: [PATCH] feat: begin adding filtering support --- client/ExtraChat/Client.cs | 4 ++++ client/ExtraChat/Ipc.cs | 17 +++++++++++++++++ client/ExtraChat/Util/PayloadUtil.cs | 22 ++++++++++++++++++++++ 3 files changed, 43 insertions(+) create mode 100644 client/ExtraChat/Util/PayloadUtil.cs diff --git a/client/ExtraChat/Client.cs b/client/ExtraChat/Client.cs index ee93c1b..8cb2d02 100644 --- a/client/ExtraChat/Client.cs +++ b/client/ExtraChat/Client.cs @@ -936,6 +936,7 @@ internal class Client : IDisposable { } this.Plugin.Commands.ReregisterAll(); + this.Plugin.Ipc.BroadcastChannelNames(); } private void HandleMessage(MessageResponse resp) { @@ -948,6 +949,9 @@ internal class Client : IDisposable { var message = SeString.Parse(SecretBox.Decrypt(info.SharedSecret, resp.Message)); var output = new SeStringBuilder(); + // add a tag payload for filtering + output.Add(PayloadUtil.CreateTagPayload(resp.Channel)); + output.Add(RawPayload.LinkTerminator); var colour = config.GetUiColour(resp.Channel); output.AddUiForeground(colour); diff --git a/client/ExtraChat/Ipc.cs b/client/ExtraChat/Ipc.cs index e41d70d..95bf5f6 100644 --- a/client/ExtraChat/Ipc.cs +++ b/client/ExtraChat/Ipc.cs @@ -14,17 +14,21 @@ internal class Ipc : IDisposable { private Plugin Plugin { get; } private ICallGateProvider OverrideChannelColour { get; } private ICallGateProvider, Dictionary> ChannelCommandColours { get; } + private ICallGateProvider, Dictionary> ChannelNames { get; } internal Ipc(Plugin plugin) { this.Plugin = plugin; this.OverrideChannelColour = this.Plugin.Interface.GetIpcProvider("ExtraChat.OverrideChannelColour"); this.ChannelCommandColours = this.Plugin.Interface.GetIpcProvider, Dictionary>("ExtraChat.ChannelCommandColours"); + this.ChannelNames = this.Plugin.Interface.GetIpcProvider, Dictionary>("ExtraChat.ChannelNames"); this.ChannelCommandColours.RegisterFunc(_ => this.GetChannelColours()); + this.ChannelNames.RegisterFunc(_ => this.GetChannelNames()); } public void Dispose() { + this.ChannelNames.UnregisterFunc(); this.ChannelCommandColours.UnregisterFunc(); } @@ -41,10 +45,23 @@ internal class Ipc : IDisposable { return dict; } + private Dictionary GetChannelNames() { + return this.Plugin.Client.Channels + .Values + .ToDictionary( + channel => channel.Id, + channel => this.Plugin.ConfigInfo.Channels.TryGetValue(channel.Id, out var info) ? info.Name : "???" + ); + } + internal void BroadcastChannelCommandColours() { this.ChannelCommandColours.SendMessage(this.GetChannelColours()); } + internal void BroadcastChannelNames() { + this.ChannelNames.SendMessage(this.GetChannelNames()); + } + internal void BroadcastOverride() { var over = this.Plugin.GameFunctions.OverrideChannel; if (over == Guid.Empty) { diff --git a/client/ExtraChat/Util/PayloadUtil.cs b/client/ExtraChat/Util/PayloadUtil.cs new file mode 100644 index 0000000..11c6cd6 --- /dev/null +++ b/client/ExtraChat/Util/PayloadUtil.cs @@ -0,0 +1,22 @@ +using Dalamud.Game.Text.SeStringHandling.Payloads; + +namespace ExtraChat.Util; + +internal static class PayloadUtil { + internal static RawPayload CreateTagPayload(Guid id) { + var bytes = new List { + 2, // start byte + 0x27, // interactable + 3 + 16, // chunk length (3 bytes plus data length) + 0x20, // embedded info type (custom) + }; + + // now add data, we always know it's 16 bytes + bytes.AddRange(id.ToByteArray()); + + // end byte + bytes.Add(3); + + return new RawPayload(bytes.ToArray()); + } +}