feat: add ExtraChat channel filtering
This commit is contained in:
parent
03ac04a690
commit
cfa57ae11a
|
@ -2,6 +2,7 @@ using ChatTwo.Code;
|
||||||
using ChatTwo.Resources;
|
using ChatTwo.Resources;
|
||||||
using ChatTwo.Ui;
|
using ChatTwo.Ui;
|
||||||
using Dalamud.Configuration;
|
using Dalamud.Configuration;
|
||||||
|
using Dalamud.Game.Text.SeStringHandling.Payloads;
|
||||||
using Dalamud.Logging;
|
using Dalamud.Logging;
|
||||||
using ImGuiNET;
|
using ImGuiNET;
|
||||||
|
|
||||||
|
@ -147,6 +148,8 @@ internal static class UnreadModeExt {
|
||||||
internal class Tab {
|
internal class Tab {
|
||||||
public string Name = Language.Tab_DefaultName;
|
public string Name = Language.Tab_DefaultName;
|
||||||
public Dictionary<ChatType, ChatSource> ChatCodes = new();
|
public Dictionary<ChatType, ChatSource> ChatCodes = new();
|
||||||
|
public bool ExtraChatAll;
|
||||||
|
public HashSet<Guid> ExtraChatChannels = new();
|
||||||
|
|
||||||
[Obsolete("Use UnreadMode instead")]
|
[Obsolete("Use UnreadMode instead")]
|
||||||
public bool DisplayUnread = true;
|
public bool DisplayUnread = true;
|
||||||
|
@ -172,7 +175,18 @@ internal class Tab {
|
||||||
}
|
}
|
||||||
|
|
||||||
internal bool Matches(Message message) {
|
internal bool Matches(Message message) {
|
||||||
return message.Code.Type.IsGm() || this.ChatCodes.TryGetValue(message.Code.Type, out var sources) && (message.Code.Source is 0 or (ChatSource) 1 || sources.HasFlag(message.Code.Source));
|
var extraChatChannel = Guid.Empty;
|
||||||
|
if (message.ContentSource.Payloads.Count > 0 && message.ContentSource.Payloads[0] is RawPayload raw) {
|
||||||
|
// this does an encode and clone every time it's accessed, so cache
|
||||||
|
var data = raw.Data;
|
||||||
|
if (data[1] == 0x27 && data[2] == 19 && data[3] == 0x20) {
|
||||||
|
extraChatChannel = new Guid(data[4..]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return message.Code.Type.IsGm()
|
||||||
|
|| (extraChatChannel != Guid.Empty && (this.ExtraChatAll || this.ExtraChatChannels.Contains(extraChatChannel)))
|
||||||
|
|| this.ChatCodes.TryGetValue(message.Code.Type, out var sources) && (message.Code.Source is 0 or (ChatSource) 1 || sources.HasFlag(message.Code.Source));
|
||||||
}
|
}
|
||||||
|
|
||||||
internal void AddMessage(Message message, bool unread = true) {
|
internal void AddMessage(Message message, bool unread = true) {
|
||||||
|
@ -199,6 +213,8 @@ internal class Tab {
|
||||||
return new Tab {
|
return new Tab {
|
||||||
Name = this.Name,
|
Name = this.Name,
|
||||||
ChatCodes = this.ChatCodes.ToDictionary(entry => entry.Key, entry => entry.Value),
|
ChatCodes = this.ChatCodes.ToDictionary(entry => entry.Key, entry => entry.Value),
|
||||||
|
ExtraChatAll = this.ExtraChatAll,
|
||||||
|
ExtraChatChannels = this.ExtraChatChannels.ToHashSet(),
|
||||||
#pragma warning disable CS0618
|
#pragma warning disable CS0618
|
||||||
DisplayUnread = this.DisplayUnread,
|
DisplayUnread = this.DisplayUnread,
|
||||||
#pragma warning restore CS0618
|
#pragma warning restore CS0618
|
||||||
|
@ -258,8 +274,10 @@ internal enum LanguageOverride {
|
||||||
French,
|
French,
|
||||||
German,
|
German,
|
||||||
Greek,
|
Greek,
|
||||||
|
|
||||||
// Italian,
|
// Italian,
|
||||||
Japanese,
|
Japanese,
|
||||||
|
|
||||||
// Korean,
|
// Korean,
|
||||||
// Norwegian,
|
// Norwegian,
|
||||||
PortugueseBrazil,
|
PortugueseBrazil,
|
||||||
|
|
|
@ -14,30 +14,34 @@ internal sealed class ExtraChat : IDisposable {
|
||||||
|
|
||||||
private ICallGateSubscriber<OverrideInfo, object> OverrideChannelGate { get; }
|
private ICallGateSubscriber<OverrideInfo, object> OverrideChannelGate { get; }
|
||||||
private ICallGateSubscriber<Dictionary<string, uint>, Dictionary<string, uint>> ChannelCommandColoursGate { get; }
|
private ICallGateSubscriber<Dictionary<string, uint>, Dictionary<string, uint>> ChannelCommandColoursGate { get; }
|
||||||
|
private ICallGateSubscriber<Dictionary<Guid, string>, Dictionary<Guid, string>> ChannelNamesGate { get; }
|
||||||
|
|
||||||
internal (string, uint)? ChannelOverride { get; set; }
|
internal (string, uint)? ChannelOverride { get; set; }
|
||||||
|
|
||||||
private Dictionary<string, uint> ChannelCommandColoursInternal { get; set; } = new();
|
private Dictionary<string, uint> ChannelCommandColoursInternal { get; set; } = new();
|
||||||
internal IReadOnlyDictionary<string, uint> ChannelCommandColours => this.ChannelCommandColoursInternal;
|
internal IReadOnlyDictionary<string, uint> ChannelCommandColours => this.ChannelCommandColoursInternal;
|
||||||
|
|
||||||
|
private Dictionary<Guid, string> ChannelNamesInternal { get; set; } = new();
|
||||||
|
internal IReadOnlyDictionary<Guid, string> ChannelNames => this.ChannelNamesInternal;
|
||||||
|
|
||||||
internal ExtraChat(Plugin plugin) {
|
internal ExtraChat(Plugin plugin) {
|
||||||
this.Plugin = plugin;
|
this.Plugin = plugin;
|
||||||
|
|
||||||
this.OverrideChannelGate = this.Plugin.Interface.GetIpcSubscriber<OverrideInfo, object>("ExtraChat.OverrideChannelColour");
|
this.OverrideChannelGate = this.Plugin.Interface.GetIpcSubscriber<OverrideInfo, object>("ExtraChat.OverrideChannelColour");
|
||||||
this.ChannelCommandColoursGate = this.Plugin.Interface.GetIpcSubscriber<Dictionary<string, uint>, Dictionary<string, uint>>("ExtraChat.ChannelCommandColours");
|
this.ChannelCommandColoursGate = this.Plugin.Interface.GetIpcSubscriber<Dictionary<string, uint>, Dictionary<string, uint>>("ExtraChat.ChannelCommandColours");
|
||||||
|
this.ChannelNamesGate = this.Plugin.Interface.GetIpcSubscriber<Dictionary<Guid, string>, Dictionary<Guid, string>>("ExtraChat.ChannelNames");
|
||||||
|
|
||||||
this.OverrideChannelGate.Subscribe(this.OnOverrideChannel);
|
this.OverrideChannelGate.Subscribe(this.OnOverrideChannel);
|
||||||
this.ChannelCommandColoursGate.Subscribe(this.OnChannelCommandColours);
|
this.ChannelCommandColoursGate.Subscribe(this.OnChannelCommandColours);
|
||||||
|
this.ChannelNamesGate.Subscribe(this.OnChannelNames);
|
||||||
try {
|
try {
|
||||||
this.ChannelCommandColoursInternal = this.ChannelCommandColoursGate.InvokeFunc(null!);
|
this.ChannelCommandColoursInternal = this.ChannelCommandColoursGate.InvokeFunc(null!);
|
||||||
|
this.ChannelNamesInternal = this.ChannelNamesGate.InvokeFunc(null!);
|
||||||
} catch (Exception) {
|
} catch (Exception) {
|
||||||
// no-op
|
// no-op
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void OnChannelCommandColours(Dictionary<string, uint> obj) {
|
|
||||||
this.ChannelCommandColoursInternal = obj;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Dispose() {
|
public void Dispose() {
|
||||||
this.OverrideChannelGate.Unsubscribe(this.OnOverrideChannel);
|
this.OverrideChannelGate.Unsubscribe(this.OnOverrideChannel);
|
||||||
}
|
}
|
||||||
|
@ -50,4 +54,12 @@ internal sealed class ExtraChat : IDisposable {
|
||||||
|
|
||||||
this.ChannelOverride = (info.Channel, info.Rgba);
|
this.ChannelOverride = (info.Channel, info.Rgba);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void OnChannelCommandColours(Dictionary<string, uint> obj) {
|
||||||
|
this.ChannelCommandColoursInternal = obj;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnChannelNames(Dictionary<Guid, string> obj) {
|
||||||
|
this.ChannelNamesInternal = obj;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -845,4 +845,10 @@
|
||||||
<data name="Options_CollapseDuplicateMessages_Description" xml:space="preserve">
|
<data name="Options_CollapseDuplicateMessages_Description" xml:space="preserve">
|
||||||
<value>Replace consecutive duplicate messages with a counter appended to the first instance of the message.</value>
|
<value>Replace consecutive duplicate messages with a counter appended to the first instance of the message.</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="Options_Tabs_ExtraChatChannels" xml:space="preserve">
|
||||||
|
<value>ExtraChat channels</value>
|
||||||
|
</data>
|
||||||
|
<data name="Options_Tabs_ExtraChatAll" xml:space="preserve">
|
||||||
|
<value>All</value>
|
||||||
|
</data>
|
||||||
</root>
|
</root>
|
||||||
|
|
|
@ -24,7 +24,7 @@ internal sealed class Settings : IUiComponent {
|
||||||
new Display(this.Mutable),
|
new Display(this.Mutable),
|
||||||
new Ui.SettingsTabs.Fonts(this.Mutable),
|
new Ui.SettingsTabs.Fonts(this.Mutable),
|
||||||
new ChatColours(this.Mutable, this.Ui.Plugin),
|
new ChatColours(this.Mutable, this.Ui.Plugin),
|
||||||
new Tabs(this.Mutable),
|
new Tabs(this.Ui.Plugin, this.Mutable),
|
||||||
new Database(this.Mutable, this.Ui.Plugin.Store),
|
new Database(this.Mutable, this.Ui.Plugin.Store),
|
||||||
new Miscellaneous(this.Mutable),
|
new Miscellaneous(this.Mutable),
|
||||||
new About(),
|
new About(),
|
||||||
|
|
|
@ -7,13 +7,15 @@ using ImGuiNET;
|
||||||
namespace ChatTwo.Ui.SettingsTabs;
|
namespace ChatTwo.Ui.SettingsTabs;
|
||||||
|
|
||||||
internal sealed class Tabs : ISettingsTab {
|
internal sealed class Tabs : ISettingsTab {
|
||||||
|
private Plugin Plugin { get; }
|
||||||
private Configuration Mutable { get; }
|
private Configuration Mutable { get; }
|
||||||
|
|
||||||
public string Name => Language.Options_Tabs_Tab + "###tabs-tabs";
|
public string Name => Language.Options_Tabs_Tab + "###tabs-tabs";
|
||||||
|
|
||||||
private int _toOpen = -2;
|
private int _toOpen = -2;
|
||||||
|
|
||||||
internal Tabs(Configuration mutable) {
|
internal Tabs(Plugin plugin, Configuration mutable) {
|
||||||
|
this.Plugin = plugin;
|
||||||
this.Mutable = mutable;
|
this.Mutable = mutable;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -158,6 +160,27 @@ internal sealed class Tabs : ISettingsTab {
|
||||||
ImGui.TreePop();
|
ImGui.TreePop();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (this.Plugin.ExtraChat.ChannelNames.Count > 0 && ImGui.TreeNodeEx(Language.Options_Tabs_ExtraChatChannels)) {
|
||||||
|
ImGui.Checkbox(Language.Options_Tabs_ExtraChatAll, ref tab.ExtraChatAll);
|
||||||
|
|
||||||
|
ImGui.Separator();
|
||||||
|
|
||||||
|
foreach (var (id, name) in this.Plugin.ExtraChat.ChannelNames) {
|
||||||
|
var enabled = tab.ExtraChatChannels.Contains(id);
|
||||||
|
if (!ImGui.Checkbox($"{name}##ec-{id}", ref enabled)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (enabled) {
|
||||||
|
tab.ExtraChatChannels.Add(id);
|
||||||
|
} else {
|
||||||
|
tab.ExtraChatChannels.Remove(id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ImGui.TreePop();
|
||||||
|
}
|
||||||
|
|
||||||
ImGui.TreePop();
|
ImGui.TreePop();
|
||||||
|
|
||||||
ImGui.PopID();
|
ImGui.PopID();
|
||||||
|
|
Loading…
Reference in New Issue