Merge pull request #6 from deansheather/dean/extrachat-input-channels
feat: allow tab input channel to be set to ExtraChat
This commit is contained in:
@@ -84,4 +84,14 @@ internal enum ChatType : ushort {
|
||||
CrossLinkshell6 = 105,
|
||||
CrossLinkshell7 = 106,
|
||||
CrossLinkshell8 = 107,
|
||||
|
||||
// Custom types:
|
||||
ExtraChatLinkshell1 = 1001,
|
||||
ExtraChatLinkshell2 = 1002,
|
||||
ExtraChatLinkshell3 = 1003,
|
||||
ExtraChatLinkshell4 = 1004,
|
||||
ExtraChatLinkshell5 = 1005,
|
||||
ExtraChatLinkshell6 = 1006,
|
||||
ExtraChatLinkshell7 = 1007,
|
||||
ExtraChatLinkshell8 = 1008,
|
||||
}
|
||||
|
||||
@@ -162,6 +162,14 @@ internal static class ChatTypeExt {
|
||||
ChatType.CrossLinkshell6 => Language.ChatType_CrossLinkshell6,
|
||||
ChatType.CrossLinkshell7 => Language.ChatType_CrossLinkshell7,
|
||||
ChatType.CrossLinkshell8 => Language.ChatType_CrossLinkshell8,
|
||||
ChatType.ExtraChatLinkshell1 => Language.ChatType_ExtraChatLinkshell1,
|
||||
ChatType.ExtraChatLinkshell2 => Language.ChatType_ExtraChatLinkshell2,
|
||||
ChatType.ExtraChatLinkshell3 => Language.ChatType_ExtraChatLinkshell3,
|
||||
ChatType.ExtraChatLinkshell4 => Language.ChatType_ExtraChatLinkshell4,
|
||||
ChatType.ExtraChatLinkshell5 => Language.ChatType_ExtraChatLinkshell5,
|
||||
ChatType.ExtraChatLinkshell6 => Language.ChatType_ExtraChatLinkshell6,
|
||||
ChatType.ExtraChatLinkshell7 => Language.ChatType_ExtraChatLinkshell7,
|
||||
ChatType.ExtraChatLinkshell8 => Language.ChatType_ExtraChatLinkshell8,
|
||||
_ => type.ToString(),
|
||||
};
|
||||
}
|
||||
|
||||
@@ -29,4 +29,14 @@ internal enum InputChannel : uint {
|
||||
Linkshell6 = 24,
|
||||
Linkshell7 = 25,
|
||||
Linkshell8 = 26,
|
||||
|
||||
// Custom channels:
|
||||
ExtraChatLinkshell1 = 1001,
|
||||
ExtraChatLinkshell2 = 1002,
|
||||
ExtraChatLinkshell3 = 1003,
|
||||
ExtraChatLinkshell4 = 1004,
|
||||
ExtraChatLinkshell5 = 1005,
|
||||
ExtraChatLinkshell6 = 1006,
|
||||
ExtraChatLinkshell7 = 1007,
|
||||
ExtraChatLinkshell8 = 1008,
|
||||
}
|
||||
|
||||
@@ -30,6 +30,14 @@ internal static class InputChannelExt {
|
||||
InputChannel.Linkshell6 => ChatType.Linkshell6,
|
||||
InputChannel.Linkshell7 => ChatType.Linkshell7,
|
||||
InputChannel.Linkshell8 => ChatType.Linkshell8,
|
||||
InputChannel.ExtraChatLinkshell1 => ChatType.ExtraChatLinkshell1,
|
||||
InputChannel.ExtraChatLinkshell2 => ChatType.ExtraChatLinkshell2,
|
||||
InputChannel.ExtraChatLinkshell3 => ChatType.ExtraChatLinkshell3,
|
||||
InputChannel.ExtraChatLinkshell4 => ChatType.ExtraChatLinkshell4,
|
||||
InputChannel.ExtraChatLinkshell5 => ChatType.ExtraChatLinkshell5,
|
||||
InputChannel.ExtraChatLinkshell6 => ChatType.ExtraChatLinkshell6,
|
||||
InputChannel.ExtraChatLinkshell7 => ChatType.ExtraChatLinkshell7,
|
||||
InputChannel.ExtraChatLinkshell8 => ChatType.ExtraChatLinkshell8,
|
||||
_ => throw new ArgumentOutOfRangeException(nameof(input), input, null),
|
||||
};
|
||||
|
||||
@@ -50,6 +58,14 @@ internal static class InputChannelExt {
|
||||
InputChannel.CrossLinkshell6 => 5,
|
||||
InputChannel.CrossLinkshell7 => 6,
|
||||
InputChannel.CrossLinkshell8 => 7,
|
||||
InputChannel.ExtraChatLinkshell1 => 0,
|
||||
InputChannel.ExtraChatLinkshell2 => 1,
|
||||
InputChannel.ExtraChatLinkshell3 => 2,
|
||||
InputChannel.ExtraChatLinkshell4 => 3,
|
||||
InputChannel.ExtraChatLinkshell5 => 4,
|
||||
InputChannel.ExtraChatLinkshell6 => 5,
|
||||
InputChannel.ExtraChatLinkshell7 => 6,
|
||||
InputChannel.ExtraChatLinkshell8 => 7,
|
||||
_ => uint.MaxValue,
|
||||
};
|
||||
|
||||
@@ -79,6 +95,14 @@ internal static class InputChannelExt {
|
||||
InputChannel.Linkshell6 => "/linkshell6",
|
||||
InputChannel.Linkshell7 => "/linkshell7",
|
||||
InputChannel.Linkshell8 => "/linkshell8",
|
||||
InputChannel.ExtraChatLinkshell1 => "/ecl1",
|
||||
InputChannel.ExtraChatLinkshell2 => "/ecl2",
|
||||
InputChannel.ExtraChatLinkshell3 => "/ecl3",
|
||||
InputChannel.ExtraChatLinkshell4 => "/ecl4",
|
||||
InputChannel.ExtraChatLinkshell5 => "/ecl5",
|
||||
InputChannel.ExtraChatLinkshell6 => "/ecl6",
|
||||
InputChannel.ExtraChatLinkshell7 => "/ecl7",
|
||||
InputChannel.ExtraChatLinkshell8 => "/ecl8",
|
||||
_ => "",
|
||||
};
|
||||
|
||||
@@ -150,4 +174,16 @@ internal static class InputChannelExt {
|
||||
InputChannel.CrossLinkshell8 => true,
|
||||
_ => false,
|
||||
};
|
||||
|
||||
internal static bool IsExtraChatLinkshell(this InputChannel channel) => channel switch {
|
||||
InputChannel.ExtraChatLinkshell1 => true,
|
||||
InputChannel.ExtraChatLinkshell2 => true,
|
||||
InputChannel.ExtraChatLinkshell3 => true,
|
||||
InputChannel.ExtraChatLinkshell4 => true,
|
||||
InputChannel.ExtraChatLinkshell5 => true,
|
||||
InputChannel.ExtraChatLinkshell6 => true,
|
||||
InputChannel.ExtraChatLinkshell7 => true,
|
||||
InputChannel.ExtraChatLinkshell8 => true,
|
||||
_ => false,
|
||||
};
|
||||
}
|
||||
|
||||
@@ -611,7 +611,12 @@ internal sealed unsafe class Chat : IDisposable {
|
||||
}
|
||||
|
||||
internal void SetChannel(InputChannel channel, string? tellTarget = null) {
|
||||
if (ChangeChatChannel == null)
|
||||
// ExtraChat linkshells aren't supported in game so we never want to
|
||||
// call the ChangeChatChannel function with them.
|
||||
//
|
||||
// Callers should call ChatLogWindow.SetChannel() which handles
|
||||
// ExtraChat channels
|
||||
if (ChangeChatChannel == null || channel.IsExtraChatLinkshell())
|
||||
return;
|
||||
|
||||
var target = Utf8String.FromString(tellTarget ?? "");
|
||||
|
||||
@@ -623,7 +623,7 @@ public sealed class PayloadHandler {
|
||||
|
||||
var inputChannel = chunk.Message?.Code.Type.ToInputChannel();
|
||||
if (inputChannel != null && ImGui.Selectable(Language.Context_ReplyInSelectedChatMode)) {
|
||||
LogWindow.Plugin.Functions.Chat.SetChannel(inputChannel.Value);
|
||||
LogWindow.SetChannel(inputChannel.Value);
|
||||
LogWindow.Activate = true;
|
||||
}
|
||||
|
||||
|
||||
Generated
+72
@@ -419,6 +419,78 @@ namespace ChatTwo.Resources {
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to ExtraChat Linkshell [1].
|
||||
/// </summary>
|
||||
internal static string ChatType_ExtraChatLinkshell1 {
|
||||
get {
|
||||
return ResourceManager.GetString("ChatType_ExtraChatLinkshell1", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to ExtraChat Linkshell [2].
|
||||
/// </summary>
|
||||
internal static string ChatType_ExtraChatLinkshell2 {
|
||||
get {
|
||||
return ResourceManager.GetString("ChatType_ExtraChatLinkshell2", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to ExtraChat Linkshell [3].
|
||||
/// </summary>
|
||||
internal static string ChatType_ExtraChatLinkshell3 {
|
||||
get {
|
||||
return ResourceManager.GetString("ChatType_ExtraChatLinkshell3", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to ExtraChat Linkshell [4].
|
||||
/// </summary>
|
||||
internal static string ChatType_ExtraChatLinkshell4 {
|
||||
get {
|
||||
return ResourceManager.GetString("ChatType_ExtraChatLinkshell4", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to ExtraChat Linkshell [5].
|
||||
/// </summary>
|
||||
internal static string ChatType_ExtraChatLinkshell5 {
|
||||
get {
|
||||
return ResourceManager.GetString("ChatType_ExtraChatLinkshell5", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to ExtraChat Linkshell [6].
|
||||
/// </summary>
|
||||
internal static string ChatType_ExtraChatLinkshell6 {
|
||||
get {
|
||||
return ResourceManager.GetString("ChatType_ExtraChatLinkshell6", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to ExtraChat Linkshell [7].
|
||||
/// </summary>
|
||||
internal static string ChatType_ExtraChatLinkshell7 {
|
||||
get {
|
||||
return ResourceManager.GetString("ChatType_ExtraChatLinkshell7", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to ExtraChat Linkshell [8].
|
||||
/// </summary>
|
||||
internal static string ChatType_ExtraChatLinkshell8 {
|
||||
get {
|
||||
return ResourceManager.GetString("ChatType_ExtraChatLinkshell8", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Free Company.
|
||||
/// </summary>
|
||||
|
||||
@@ -877,7 +877,30 @@
|
||||
<data name="Options_TooltipOffset_Desc">
|
||||
<value>Use this option if you experience cut-off tooltips.</value>
|
||||
</data>
|
||||
|
||||
<data name="ChatType_ExtraChatLinkshell1" xml:space="preserve">
|
||||
<value>ExtraChat Linkshell [1]</value>
|
||||
</data>
|
||||
<data name="ChatType_ExtraChatLinkshell2" xml:space="preserve">
|
||||
<value>ExtraChat Linkshell [2]</value>
|
||||
</data>
|
||||
<data name="ChatType_ExtraChatLinkshell3" xml:space="preserve">
|
||||
<value>ExtraChat Linkshell [3]</value>
|
||||
</data>
|
||||
<data name="ChatType_ExtraChatLinkshell4" xml:space="preserve">
|
||||
<value>ExtraChat Linkshell [4]</value>
|
||||
</data>
|
||||
<data name="ChatType_ExtraChatLinkshell5" xml:space="preserve">
|
||||
<value>ExtraChat Linkshell [5]</value>
|
||||
</data>
|
||||
<data name="ChatType_ExtraChatLinkshell6" xml:space="preserve">
|
||||
<value>ExtraChat Linkshell [6]</value>
|
||||
</data>
|
||||
<data name="ChatType_ExtraChatLinkshell7" xml:space="preserve">
|
||||
<value>ExtraChat Linkshell [7]</value>
|
||||
</data>
|
||||
<data name="ChatType_ExtraChatLinkshell8" xml:space="preserve">
|
||||
<value>ExtraChat Linkshell [8]</value>
|
||||
</data>
|
||||
<data name="Context_CopyContent">
|
||||
<value>Copy content</value>
|
||||
</data>
|
||||
|
||||
@@ -151,7 +151,7 @@ public sealed class ChatLogWindow : Window, IUiComponent {
|
||||
var prevTemp = _tempChannel;
|
||||
|
||||
if (info.Permanent) {
|
||||
Plugin.Functions.Chat.SetChannel(info.Channel.Value);
|
||||
SetChannel(info.Channel.Value);
|
||||
} else {
|
||||
_tempChannel = info.Channel.Value;
|
||||
}
|
||||
@@ -496,7 +496,17 @@ public sealed class ChatLogWindow : Window, IUiComponent {
|
||||
ImGui.TextUnformatted(_tempChannel.Value.ToChatType().Name());
|
||||
}
|
||||
} else if (activeTab is { Channel: { } channel }) {
|
||||
ImGui.TextUnformatted(channel.ToChatType().Name());
|
||||
if (channel.IsExtraChatLinkshell()) {
|
||||
// We cannot lookup ExtraChat channel names from index over
|
||||
// IPC so we just don't show the name if it's the tabs
|
||||
// channel.
|
||||
//
|
||||
// We don't call channel.ToChatType().Name() as it has the
|
||||
// long name as used in the settings window.
|
||||
ImGui.TextUnformatted($"ECLS [{channel.LinkshellIndex() + 1}]");
|
||||
} else {
|
||||
ImGui.TextUnformatted(channel.ToChatType().Name());
|
||||
}
|
||||
} else if (Plugin.ExtraChat.ChannelOverride is var (overrideName, _)) {
|
||||
ImGui.TextUnformatted(overrideName);
|
||||
} else {
|
||||
@@ -525,7 +535,7 @@ public sealed class ChatLogWindow : Window, IUiComponent {
|
||||
var name = Plugin.DataManager.GetExcelSheet<LogFilter>()!
|
||||
.FirstOrDefault(row => row.LogKind == (byte) channel.ToChatType())
|
||||
?.Name
|
||||
?.RawString ?? channel.ToString();
|
||||
?.RawString ?? channel.ToChatType().Name();
|
||||
|
||||
if (channel.IsLinkshell()) {
|
||||
var lsName = Plugin.Functions.Chat.GetLinkshellName(channel.LinkshellIndex());
|
||||
@@ -545,9 +555,18 @@ public sealed class ChatLogWindow : Window, IUiComponent {
|
||||
name += $": {lsName}";
|
||||
}
|
||||
|
||||
if (channel.IsExtraChatLinkshell() && Plugin.ExtraChat.ChannelNames.Count == 0) {
|
||||
// Sadly the ExtraChat IPC doesn't provide a method to
|
||||
// lookup what channel numbers are assigned, or what the
|
||||
// channel names are.
|
||||
//
|
||||
// Show all ExtraChat options if the user is in at least
|
||||
// one channel.
|
||||
continue;
|
||||
}
|
||||
|
||||
if (ImGui.Selectable(name)) {
|
||||
Plugin.Functions.Chat.SetChannel(channel);
|
||||
_tellTarget = null;
|
||||
SetChannel(channel);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -609,7 +628,7 @@ public sealed class ChatLogWindow : Window, IUiComponent {
|
||||
if (Plugin.Functions.Chat.UsesTellTempChannel)
|
||||
{
|
||||
Plugin.Functions.Chat.UsesTellTempChannel = false;
|
||||
Plugin.Functions.Chat.SetChannel(Plugin.Functions.Chat.PreviousChannel ?? InputChannel.Say);
|
||||
SetChannel(Plugin.Functions.Chat.PreviousChannel);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -621,7 +640,7 @@ public sealed class ChatLogWindow : Window, IUiComponent {
|
||||
if (Plugin.Functions.Chat.UsesTellTempChannel)
|
||||
{
|
||||
Plugin.Functions.Chat.UsesTellTempChannel = false;
|
||||
Plugin.Functions.Chat.SetChannel(Plugin.Functions.Chat.PreviousChannel ?? InputChannel.Say);
|
||||
SetChannel(Plugin.Functions.Chat.PreviousChannel);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -639,7 +658,7 @@ public sealed class ChatLogWindow : Window, IUiComponent {
|
||||
if (Plugin.Functions.Chat.UsesTellTempChannel)
|
||||
{
|
||||
Plugin.Functions.Chat.UsesTellTempChannel = false;
|
||||
Plugin.Functions.Chat.SetChannel(Plugin.Functions.Chat.PreviousChannel ?? InputChannel.Say);
|
||||
SetChannel(Plugin.Functions.Chat.PreviousChannel);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -676,6 +695,22 @@ public sealed class ChatLogWindow : Window, IUiComponent {
|
||||
}
|
||||
}
|
||||
|
||||
internal void SetChannel(InputChannel? channel)
|
||||
{
|
||||
channel ??= InputChannel.Say;
|
||||
|
||||
_tellTarget = null;
|
||||
if (channel.Value.IsExtraChatLinkshell()) {
|
||||
// Instead of calling SetChannel(), we ask the ExtraChat plugin to
|
||||
// set a channel override by just calling the command directly.
|
||||
var bytes = Encoding.UTF8.GetBytes(channel.Value.Prefix());
|
||||
Plugin.Common.Functions.Chat.SendMessageUnsafe(bytes);
|
||||
return;
|
||||
}
|
||||
|
||||
Plugin.Functions.Chat.SetChannel(channel.Value);
|
||||
}
|
||||
|
||||
private void SendChatBox(Tab? activeTab) {
|
||||
if (!string.IsNullOrWhiteSpace(Chat)) {
|
||||
var trimmed = Chat.Trim();
|
||||
|
||||
Reference in New Issue
Block a user