This commit is contained in:
Infi
2024-11-13 04:13:18 +01:00
parent 9597218319
commit 45fdac0dd6
21 changed files with 341 additions and 339 deletions
+1 -1
View File
@@ -11,7 +11,7 @@ resharper_csharp_brace_style=next_line
resharper_csharp_braces_for_foreach=not_required resharper_csharp_braces_for_foreach=not_required
resharper_csharp_braces_for_for=not_required resharper_csharp_braces_for_for=not_required
resharper_csharp_braces_for_while=not_required resharper_csharp_braces_for_while=not_required
charset=utf-8-bom charset=utf-8
end_of_line=crlf end_of_line=crlf
# Microsoft .NET properties # Microsoft .NET properties
+4 -4
View File
@@ -7,10 +7,10 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="JetBrains.Annotations" Version="2023.3.0" /> <PackageReference Include="JetBrains.Annotations" Version="2024.3.0" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.9.0" /> <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.11.1" />
<PackageReference Include="MSTest.TestAdapter" Version="3.3.1" /> <PackageReference Include="MSTest.TestAdapter" Version="3.6.3" />
<PackageReference Include="MSTest.TestFramework" Version="3.3.1" /> <PackageReference Include="MSTest.TestFramework" Version="3.6.3" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
+6 -6
View File
@@ -1,6 +1,6 @@
<Project Sdk="Microsoft.NET.Sdk"> <Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup> <PropertyGroup>
<Version>1.29.3</Version> <Version>1.29.4</Version>
<TargetFramework>net8.0-windows</TargetFramework> <TargetFramework>net8.0-windows</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings> <ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable> <Nullable>enable</Nullable>
@@ -53,13 +53,13 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="DalamudPackager" Version="2.1.13" /> <PackageReference Include="DalamudPackager" Version="11.0.0" />
<PackageReference Include="EmbedIO" Version="3.5.2" /> <PackageReference Include="EmbedIO" Version="3.5.2" />
<PackageReference Include="MessagePack" Version="2.5.140" /> <PackageReference Include="MessagePack" Version="3.0.238-rc.1" />
<PackageReference Include="Microsoft.Data.Sqlite" Version="8.0.4" /> <PackageReference Include="Microsoft.Data.Sqlite" Version="9.0.0" />
<PackageReference Include="Pidgin" Version="3.2.3" /> <PackageReference Include="Pidgin" Version="3.3.0" />
<PackageReference Include="SixLabors.ImageSharp" Version="3.1.5" /> <PackageReference Include="SixLabors.ImageSharp" Version="3.1.5" />
<PackageReference Include="Watson.Lite" Version="6.2.2" /> <PackageReference Include="Watson.Lite" Version="6.2.3" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
+2 -2
View File
@@ -1,5 +1,5 @@
using Dalamud.Plugin.Services; using Dalamud.Plugin.Services;
using Lumina.Excel.GeneratedSheets; using Lumina.Excel.Sheets;
namespace ChatTwo.Code; namespace ChatTwo.Code;
@@ -146,7 +146,7 @@ internal static class InputChannelExt
return null; return null;
var cmds = data.GetExcelSheet<TextCommand>(); var cmds = data.GetExcelSheet<TextCommand>();
return cmds == null ? null : ids.Select(id => cmds.GetRow(id)).Where(id => id != null).Cast<TextCommand>(); return ids.Where(id => cmds.HasRow(id)).Select(id => cmds.GetRow(id));
} }
internal static bool IsLinkshell(this InputChannel channel) => channel switch internal static bool IsLinkshell(this InputChannel channel) => channel switch
+6 -12
View File
@@ -237,20 +237,14 @@ internal class Tab
public float Opacity = 100f; public float Opacity = 100f;
public bool InputDisabled; public bool InputDisabled;
[NonSerialized] [NonSerialized] public uint Unread;
public uint Unread; [NonSerialized] public long LastActivity;
[NonSerialized] public MessageList Messages = new();
[NonSerialized] [NonSerialized] public TellTarget? TellTarget;
public long LastActivity; [NonSerialized] public InputChannel? PreviousChannel;
[NonSerialized] [NonSerialized] public Guid Identifier = Guid.NewGuid();
public MessageList Messages = new();
[NonSerialized]
public InputChannel? PreviousChannel;
[NonSerialized]
public Guid Identifier = Guid.NewGuid();
internal bool Matches(Message message) => message.Matches(ChatCodes, ExtraChatAll, ExtraChatChannels); internal bool Matches(Message message) => message.Matches(ChatCodes, ExtraChatAll, ExtraChatChannels);
+5 -5
View File
@@ -29,7 +29,7 @@ internal sealed unsafe class Chat : IDisposable
[Signature("48 89 5C 24 ?? 48 89 74 24 ?? 57 48 83 EC ?? 48 8D B9 ?? ?? ?? ?? 33 C0")] [Signature("48 89 5C 24 ?? 48 89 74 24 ?? 57 48 83 EC ?? 48 8D B9 ?? ?? ?? ?? 33 C0")]
private readonly delegate* unmanaged<RaptureLogModule*, ushort, Utf8String*, Utf8String*, ulong, ulong, ushort, byte, int, byte, void> PrintTellNative = null!; private readonly delegate* unmanaged<RaptureLogModule*, ushort, Utf8String*, Utf8String*, ulong, ulong, ushort, byte, int, byte, void> PrintTellNative = null!;
[Signature("E8 ?? ?? ?? ?? 48 8D 4C 24 ?? E8 ?? ?? ?? ?? 48 8D 8C 24 ?? ?? ?? ?? E8 ?? ?? ?? ?? B0 01")] [Signature("E8 ?? ?? ?? ?? 48 8D 4C 24 ?? E8 ?? ?? ?? ?? 48 8D 8C 24 ?? ?? ?? ?? E8 ?? ?? ?? ?? B0 ?? 48 8B 8C 24")]
private readonly delegate* unmanaged<NetworkModule*, ulong, ushort, Utf8String*, Utf8String*, ushort, ushort, byte> SendTellNative = null!; private readonly delegate* unmanaged<NetworkModule*, ulong, ushort, Utf8String*, Utf8String*, ushort, ushort, byte> SendTellNative = null!;
// Client::UI::AddonChatLog.OnRefresh // Client::UI::AddonChatLog.OnRefresh
@@ -38,7 +38,7 @@ internal sealed unsafe class Chat : IDisposable
private delegate byte ChatLogRefreshDelegate(nint log, ushort eventId, AtkValue* value); private delegate byte ChatLogRefreshDelegate(nint log, ushort eventId, AtkValue* value);
// Replace with CS version later // Replace with CS version later
[Signature("E8 ?? ?? ?? ?? EB 81 48 8B 1D", DetourName = nameof(ContextMenuTellInForayDetour))] [Signature("48 89 5C 24 ?? 55 56 57 48 81 EC ?? ?? ?? ?? 48 8B 05 ?? ?? ?? ?? 48 33 C4 48 89 84 24 ?? ?? ?? ?? 83 B9", DetourName = nameof(ContextMenuTellInForayDetour))]
private Hook<ContextMenuTellInForayDelegate>? ContextMenuTellInForayHook { get; set; } private Hook<ContextMenuTellInForayDelegate>? ContextMenuTellInForayHook { get; set; }
private delegate void ContextMenuTellInForayDelegate(RaptureShellModule* module, Utf8String* playerName, Utf8String* worldName, ushort worldId, ulong accountId, ulong contentId, ushort reason); private delegate void ContextMenuTellInForayDelegate(RaptureShellModule* module, Utf8String* playerName, Utf8String* worldName, ushort worldId, ulong accountId, ulong contentId, ushort reason);
@@ -123,16 +123,16 @@ internal sealed unsafe class Chat : IDisposable
_ => 0, _ => 0,
}; };
internal static int RotateLinkshellHistory(RotateMode mode) internal static void RotateLinkshellHistory(RotateMode mode)
{ {
var uiModule = UIModule.Instance(); var uiModule = UIModule.Instance();
if (mode == RotateMode.None) if (mode == RotateMode.None)
uiModule->LinkshellCycle = -1; uiModule->LinkshellCycle = -1;
return uiModule->RotateLinkshellHistory(GetRotateIdx(mode)); uiModule->RotateLinkshellHistory(GetRotateIdx(mode));
} }
internal static int RotateCrossLinkshellHistory(RotateMode mode) => internal static void RotateCrossLinkshellHistory(RotateMode mode) =>
UIModule.Instance()->RotateCrossLinkshellHistory(GetRotateIdx(mode)); UIModule.Instance()->RotateCrossLinkshellHistory(GetRotateIdx(mode));
// This function looks up a channel's user-defined color. // This function looks up a channel's user-defined color.
+1 -1
View File
@@ -8,7 +8,7 @@ namespace ChatTwo.GameFunctions;
// From: https://git.anna.lgbt/anna/XivCommon/src/branch/main/XivCommon/Functions/Chat.cs // From: https://git.anna.lgbt/anna/XivCommon/src/branch/main/XivCommon/Functions/Chat.cs
public unsafe class ChatCommon public unsafe class ChatCommon
{ {
[Signature("48 89 5C 24 ?? 57 48 83 EC 20 48 8B FA 48 8B D9 45 84 C9")] [Signature("48 89 5C 24 ?? 48 89 74 24 ?? 57 48 83 EC ?? 48 8B F2 48 8B F9 45 84 C9")]
private readonly delegate* unmanaged<UIModule*, Utf8String*, nint, byte, void> ProcessChatBox = null!; private readonly delegate* unmanaged<UIModule*, Utf8String*, nint, byte, void> ProcessChatBox = null!;
internal ChatCommon() internal ChatCommon()
+6 -7
View File
@@ -10,7 +10,8 @@ using FFXIVClientStructs.FFXIV.Client.UI;
using FFXIVClientStructs.FFXIV.Client.UI.Agent; using FFXIVClientStructs.FFXIV.Client.UI.Agent;
using FFXIVClientStructs.FFXIV.Client.UI.Info; using FFXIVClientStructs.FFXIV.Client.UI.Info;
using FFXIVClientStructs.FFXIV.Component.GUI; using FFXIVClientStructs.FFXIV.Component.GUI;
using Lumina.Excel.GeneratedSheets; using Lumina.Excel;
using Lumina.Excel.Sheets;
using ValueType = FFXIVClientStructs.FFXIV.Component.GUI.ValueType; using ValueType = FFXIVClientStructs.FFXIV.Component.GUI.ValueType;
namespace ChatTwo.GameFunctions; namespace ChatTwo.GameFunctions;
@@ -61,11 +62,9 @@ internal unsafe class GameFunctions : IDisposable
private void ListCommand(string name, ushort world, string commandName) private void ListCommand(string name, ushort world, string commandName)
{ {
var row = Plugin.DataManager.GetExcelSheet<World>()!.GetRow(world); var row = Plugin.DataManager.GetExcelSheet<World>().GetRow(world);
if (row == null)
return;
var worldName = row.Name.RawString; var worldName = row.Name.ExtractText();
ReplacementName = $"{name}@{worldName}"; ReplacementName = $"{name}@{worldName}";
Plugin.Common.SendMessage($"/{commandName} add {Placeholder}"); Plugin.Common.SendMessage($"/{commandName} add {Placeholder}");
} }
@@ -174,9 +173,9 @@ internal unsafe class GameFunctions : IDisposable
return InfoProxyFriendList.Instance()->CharDataSpan.ToArray(); return InfoProxyFriendList.Instance()->CharDataSpan.ToArray();
} }
internal static void OpenQuestLog(Quest quest) internal static void OpenQuestLog(RowRef<Quest> quest)
{ {
var splits = quest.Id.RawString.Split("_"); var splits = quest.Value.Id.ExtractText().Split("_");
if (splits.Length != 2) if (splits.Length != 2)
{ {
Plugin.ChatGui.Print("QuestId is wrongly formatted"); Plugin.ChatGui.Print("QuestId is wrongly formatted");
+1 -1
View File
@@ -86,7 +86,7 @@ public class Processing
if (chunk.Link is PlayerPayload playerPayload) if (chunk.Link is PlayerPayload playerPayload)
userContent = Plugin.ChatLogWindow.HidePlayerInString(userContent, playerPayload.PlayerName, playerPayload.World.RowId); userContent = Plugin.ChatLogWindow.HidePlayerInString(userContent, playerPayload.PlayerName, playerPayload.World.RowId);
else if (Plugin.ClientState.LocalPlayer is { } player) else if (Plugin.ClientState.LocalPlayer is { } player)
userContent = Plugin.ChatLogWindow.HidePlayerInString(userContent, player.Name.TextValue, player.HomeWorld.Id); userContent = Plugin.ChatLogWindow.HidePlayerInString(userContent, player.Name.TextValue, player.HomeWorld.RowId);
} }
var isNotUrl = text.Link is not UriPayload; var isNotUrl = text.Link is not UriPayload;
+1 -1
View File
@@ -6,7 +6,7 @@ using Dalamud.Game.Text.SeStringHandling.Payloads;
using System.Text.RegularExpressions; using System.Text.RegularExpressions;
using Dalamud.Game.Text; using Dalamud.Game.Text;
using FFXIVClientStructs.FFXIV.Client.UI.Agent; using FFXIVClientStructs.FFXIV.Client.UI.Agent;
using Lumina.Excel.GeneratedSheets; using Lumina.Excel.Sheets;
namespace ChatTwo; namespace ChatTwo;
+5 -7
View File
@@ -8,8 +8,9 @@ using Dalamud.Game.Text.SeStringHandling;
using Dalamud.Hooking; using Dalamud.Hooking;
using Dalamud.Interface.ImGuiNotification; using Dalamud.Interface.ImGuiNotification;
using Dalamud.Plugin.Services; using Dalamud.Plugin.Services;
using Dalamud.Utility;
using FFXIVClientStructs.FFXIV.Client.UI.Misc; using FFXIVClientStructs.FFXIV.Client.UI.Misc;
using Lumina.Excel.GeneratedSheets; using Lumina.Excel.Sheets;
namespace ChatTwo; namespace ChatTwo;
@@ -90,7 +91,7 @@ internal class MessageManager : IAsyncDisposable
return Path.Join(Plugin.Interface.ConfigDirectory.FullName, "chat-sqlite.db"); return Path.Join(Plugin.Interface.ConfigDirectory.FullName, "chat-sqlite.db");
} }
private void Logout() private void Logout(int _, int __)
{ {
LastContentId = 0; LastContentId = 0;
} }
@@ -298,11 +299,8 @@ internal class MessageManager : IAsyncDisposable
if (Formats.TryGetValue(type, out var cached)) if (Formats.TryGetValue(type, out var cached))
return cached; return cached;
var logKind = Plugin.DataManager.GetExcelSheet<LogKind>()!.GetRow((ushort)type); var logKind = Plugin.DataManager.GetExcelSheet<LogKind>().GetRow((ushort)type);
if (logKind == null) var format = logKind.Format.ToDalamudString();
return null;
var format = (SeString)logKind.Format;
static bool IsStringParam(Payload payload, byte num) static bool IsStringParam(Payload payload, byte num)
{ {
+33 -49
View File
@@ -14,15 +14,12 @@ using Dalamud.Interface.Textures;
using Dalamud.Interface.Textures.TextureWraps; using Dalamud.Interface.Textures.TextureWraps;
using Dalamud.Interface.Utility; using Dalamud.Interface.Utility;
using Dalamud.Interface.Utility.Raii; using Dalamud.Interface.Utility.Raii;
using Dalamud.Memory;
using Dalamud.Utility; using Dalamud.Utility;
using FFXIVClientStructs.FFXIV.Client.LayoutEngine; using FFXIVClientStructs.FFXIV.Client.LayoutEngine;
using FFXIVClientStructs.FFXIV.Client.UI; using FFXIVClientStructs.FFXIV.Client.UI;
using FFXIVClientStructs.FFXIV.Component.GUI; using FFXIVClientStructs.FFXIV.Component.GUI;
using ImGuiNET; using ImGuiNET;
using Lumina.Excel; using Lumina.Excel.Sheets;
using Lumina.Excel.GeneratedSheets;
using Action = System.Action; using Action = System.Action;
using DalamudPartyFinderPayload = Dalamud.Game.Text.SeStringHandling.Payloads.PartyFinderPayload; using DalamudPartyFinderPayload = Dalamud.Game.Text.SeStringHandling.Payloads.PartyFinderPayload;
using ChatTwoPartyFinderPayload = ChatTwo.Util.PartyFinderPayload; using ChatTwoPartyFinderPayload = ChatTwo.Util.PartyFinderPayload;
@@ -40,21 +37,11 @@ public sealed class PayloadHandler {
public uint HoverCounter; public uint HoverCounter;
public uint LastHoverCounter; public uint LastHoverCounter;
private readonly ExcelSheet<Item> ItemSheet;
private readonly ExcelSheet<EventItem> EventItemSheet;
private readonly ExcelSheet<TerritoryType> TerritorySheet;
private readonly ExcelSheet<EventItemHelp> EventItemHelpSheet;
private const uint PopupSfx = 1u; private const uint PopupSfx = 1u;
internal PayloadHandler(ChatLogWindow logWindow) internal PayloadHandler(ChatLogWindow logWindow)
{ {
LogWindow = logWindow; LogWindow = logWindow;
ItemSheet = Plugin.DataManager.GetExcelSheet<Item>()!;
EventItemSheet = Plugin.DataManager.GetExcelSheet<EventItem>()!;
TerritorySheet = Plugin.DataManager.GetExcelSheet<TerritoryType>()!;
EventItemHelpSheet = Plugin.DataManager.GetExcelSheet<EventItemHelp>()!;
} }
internal void Draw() internal void Draw()
@@ -325,15 +312,15 @@ public sealed class PayloadHandler {
private void HoverStatus(StatusPayload status) private void HoverStatus(StatusPayload status)
{ {
if (Plugin.TextureProvider.GetFromGameIcon(status.Status.Icon).GetWrapOrDefault() is { } icon) if (Plugin.TextureProvider.GetFromGameIcon(status.Status.Value.Icon).GetWrapOrDefault() is { } icon)
InlineIcon(icon); InlineIcon(icon);
var nameString = ResolveRsv(status.Status.Name.ToDalamudString()); var nameString = ResolveRsv(status.Status.Value.Name.ToDalamudString());
var name = ChunkUtil.ToChunks(nameString, ChunkSource.None, null); var name = ChunkUtil.ToChunks(nameString, ChunkSource.None, null);
LogWindow.DrawChunks(name.ToList()); LogWindow.DrawChunks(name.ToList());
ImGui.Separator(); ImGui.Separator();
var descString = ResolveRsv(status.Status.Description.ToDalamudString()); var descString = ResolveRsv(status.Status.Value.Description.ToDalamudString());
var desc = ChunkUtil.ToChunks(descString, ChunkSource.None, null); var desc = ChunkUtil.ToChunks(descString, ChunkSource.None, null);
LogWindow.DrawChunks(desc.ToList()); LogWindow.DrawChunks(desc.ToList());
} }
@@ -346,26 +333,24 @@ public sealed class PayloadHandler {
return; return;
} }
if (item.Item == null) item.Item.TryGetValue(out Item resolvedItem);
return; if (Plugin.TextureProvider.GetFromGameIcon(new GameIconLookup(resolvedItem.Icon, item.IsHQ)).GetWrapOrDefault() is { } icon)
if (Plugin.TextureProvider.GetFromGameIcon(new GameIconLookup(item.Item.Icon, item.IsHQ)).GetWrapOrDefault() is { } icon)
InlineIcon(icon); InlineIcon(icon);
var name = ChunkUtil.ToChunks(item.Item.Name.ToDalamudString(), ChunkSource.None, null); var name = ChunkUtil.ToChunks(resolvedItem.Name.ToDalamudString(), ChunkSource.None, null);
LogWindow.DrawChunks(name.ToList()); LogWindow.DrawChunks(name.ToList());
ImGui.Separator(); ImGui.Separator();
var desc = ChunkUtil.ToChunks(item.Item.Description.ToDalamudString(), ChunkSource.None, null); var desc = ChunkUtil.ToChunks(resolvedItem.Description.ToDalamudString(), ChunkSource.None, null);
LogWindow.DrawChunks(desc.ToList()); LogWindow.DrawChunks(desc.ToList());
} }
private void HoverEventItem(ItemPayload payload) private void HoverEventItem(ItemPayload payload)
{ {
var item = EventItemSheet.GetRow(payload.RawItemId); if (!Sheets.EventItemSheet.HasRow(payload.RawItemId))
if (item == null)
return; return;
var item = Sheets.EventItemSheet.GetRow(payload.RawItemId);
if (Plugin.TextureProvider.GetFromGameIcon(new GameIconLookup(item.Icon)).GetWrapOrDefault() is { } icon) if (Plugin.TextureProvider.GetFromGameIcon(new GameIconLookup(item.Icon)).GetWrapOrDefault() is { } icon)
InlineIcon(icon); InlineIcon(icon);
@@ -373,12 +358,11 @@ public sealed class PayloadHandler {
LogWindow.DrawChunks(name.ToList()); LogWindow.DrawChunks(name.ToList());
ImGui.Separator(); ImGui.Separator();
var help = EventItemHelpSheet.GetRow(payload.RawItemId); if (!Sheets.EventItemHelpSheet.HasRow(payload.RawItemId))
if (help != null) return;
{
var desc = ChunkUtil.ToChunks(help.Description.ToDalamudString(), ChunkSource.None, null); var help = Sheets.EventItemHelpSheet.GetRow(payload.RawItemId);
LogWindow.DrawChunks(desc.ToList()); LogWindow.DrawChunks(ChunkUtil.ToChunks(help.Description.ToDalamudString(), ChunkSource.None, null).ToList());
}
} }
private void HoverURI(UriPayload uri) private void HoverURI(UriPayload uri)
@@ -467,10 +451,10 @@ public sealed class PayloadHandler {
return; return;
} }
var item = ItemSheet.GetRow(payload.ItemId); if (!Sheets.ItemSheet.HasRow(payload.ItemId))
if (item == null)
return; return;
var item = Sheets.ItemSheet.GetRow(payload.ItemId);
var hq = payload.Kind == ItemPayload.ItemKind.Hq; var hq = payload.Kind == ItemPayload.ItemKind.Hq;
if (Plugin.TextureProvider.GetFromGameIcon(new GameIconLookup(item.Icon, hq)).GetWrapOrDefault() is { } icon) if (Plugin.TextureProvider.GetFromGameIcon(new GameIconLookup(item.Icon, hq)).GetWrapOrDefault() is { } icon)
InlineIcon(icon); InlineIcon(icon);
@@ -486,7 +470,7 @@ public sealed class PayloadHandler {
ImGui.Separator(); ImGui.Separator();
var realItemId = payload.RawItemId; var realItemId = payload.RawItemId;
if (item.EquipSlotCategory.Row != 0) if (item.EquipSlotCategory.RowId != 0)
{ {
if (ImGui.Selectable(Language.Context_TryOn)) if (ImGui.Selectable(Language.Context_TryOn))
GameFunctions.Context.TryOn(realItemId, 0); GameFunctions.Context.TryOn(realItemId, 0);
@@ -495,7 +479,7 @@ public sealed class PayloadHandler {
GameFunctions.Context.OpenItemComparison(realItemId); GameFunctions.Context.OpenItemComparison(realItemId);
} }
if (item.ItemSearchCategory.Value?.Category == 3) if (item.ItemSearchCategory.Value.Category == 3)
if (ImGui.Selectable(Language.Context_SearchRecipes)) if (ImGui.Selectable(Language.Context_SearchRecipes))
GameFunctions.Context.SearchForRecipesUsingItem(payload.ItemId); GameFunctions.Context.SearchForRecipesUsingItem(payload.ItemId);
@@ -514,10 +498,10 @@ public sealed class PayloadHandler {
if (payload.Kind != ItemPayload.ItemKind.EventItem) if (payload.Kind != ItemPayload.ItemKind.EventItem)
return; return;
var item = EventItemSheet.GetRow(payload.ItemId); if (!Sheets.EventItemSheet.HasRow(payload.ItemId))
if (item == null)
return; return;
var item = Sheets.EventItemSheet.GetRow(payload.ItemId);
if (Plugin.TextureProvider.GetFromGameIcon(new GameIconLookup(item.Icon)).GetWrapOrDefault() is { } icon) if (Plugin.TextureProvider.GetFromGameIcon(new GameIconLookup(item.Icon)).GetWrapOrDefault() is { } icon)
InlineIcon(icon); InlineIcon(icon);
@@ -541,16 +525,16 @@ public sealed class PayloadHandler {
var world = player.World; var world = player.World;
if (chunk.Message?.Code.Type == ChatType.FreeCompanyLoginLogout) if (chunk.Message?.Code.Type == ChatType.FreeCompanyLoginLogout)
if (Plugin.ClientState.LocalPlayer?.HomeWorld.GameData is { } homeWorld) if (Plugin.ClientState.LocalPlayer?.HomeWorld.IsValid == true)
world = homeWorld; world = Plugin.ClientState.LocalPlayer.HomeWorld;
var name = new List<Chunk> { new TextChunk(ChunkSource.None, null, player.PlayerName) }; var name = new List<Chunk> { new TextChunk(ChunkSource.None, null, player.PlayerName) };
if (world.IsPublic) if (world.Value.IsPublic)
{ {
name.AddRange(new Chunk[] name.AddRange(new Chunk[]
{ {
new IconChunk(ChunkSource.None, null, BitmapFontIcon.CrossWorld), new IconChunk(ChunkSource.None, null, BitmapFontIcon.CrossWorld),
new TextChunk(ChunkSource.None, null, world.Name), new TextChunk(ChunkSource.None, null, world.Value.Name.ExtractText()),
}); });
} }
@@ -561,31 +545,31 @@ public sealed class PayloadHandler {
if (ImGui.Selectable(Language.Context_SendTell)) if (ImGui.Selectable(Language.Context_SendTell))
{ {
// Eureka and Bozja need special handling as tells work different // Eureka and Bozja need special handling as tells work different
if (TerritorySheet.GetRow(Plugin.ClientState.TerritoryType)?.TerritoryIntendedUse != 41) if (Sheets.TerritorySheet.GetRow(Plugin.ClientState.TerritoryType).TerritoryIntendedUse.RowId != 41)
{ {
LogWindow.Chat = $"/tell {player.PlayerName}"; LogWindow.Chat = $"/tell {player.PlayerName}";
if (world.IsPublic) if (world.Value.IsPublic)
LogWindow.Chat += $"@{world.Name}"; LogWindow.Chat += $"@{world.Value.Name}";
LogWindow.Chat += " "; LogWindow.Chat += " ";
} }
else if (validContentId) else if (validContentId)
{ {
LogWindow.Plugin.Functions.Chat.SetEurekaTellChannel(player.PlayerName, world.Name.ToString(), (ushort) world.RowId, 0, chunk.Message!.ContentId, 0, false); LogWindow.Plugin.Functions.Chat.SetEurekaTellChannel(player.PlayerName, world.Value.Name.ToString(), (ushort) world.RowId, 0, chunk.Message!.ContentId, 0, false);
} }
LogWindow.Activate = true; LogWindow.Activate = true;
} }
if (world.IsPublic) if (world.Value.IsPublic)
{ {
var party = Plugin.PartyList; var party = Plugin.PartyList;
var leader = (ulong?) party[(int) party.PartyLeaderIndex]?.ContentId; var leader = (ulong?) party[(int) party.PartyLeaderIndex]?.ContentId;
var isLeader = party.Length == 0 || Plugin.ClientState.LocalContentId == leader; var isLeader = party.Length == 0 || Plugin.ClientState.LocalContentId == leader;
var member = party.FirstOrDefault(member => member.Name.TextValue == player.PlayerName && member.World.Id == world.RowId); var member = party.FirstOrDefault(member => member.Name.TextValue == player.PlayerName && member.World.RowId == world.RowId);
var isInParty = member != default; var isInParty = member != default;
var inInstance = GameFunctions.GameFunctions.IsInInstance(); var inInstance = GameFunctions.GameFunctions.IsInInstance();
var inPartyInstance = TerritorySheet.GetRow(Plugin.ClientState.TerritoryType)?.TerritoryIntendedUse is (41 or 47 or 48 or 52 or 53); var inPartyInstance = Sheets.TerritorySheet.GetRow(Plugin.ClientState.TerritoryType).TerritoryIntendedUse.RowId is (41 or 47 or 48 or 52 or 53);
if (isLeader) if (isLeader)
{ {
if (!isInParty) if (!isInParty)
@@ -655,7 +639,7 @@ public sealed class PayloadHandler {
if (character.Name.TextValue != payload.PlayerName) if (character.Name.TextValue != payload.PlayerName)
continue; continue;
if (payload.World.IsPublic && character.HomeWorld.Id != payload.World.RowId) if (payload.World.Value.IsPublic && character.HomeWorld.RowId != payload.World.RowId)
continue; continue;
return character; return character;
+13 -5
View File
@@ -1,5 +1,5 @@
using Lumina.Excel; using Lumina.Excel;
using Lumina.Excel.GeneratedSheets; using Lumina.Excel.Sheets;
namespace ChatTwo; namespace ChatTwo;
@@ -8,13 +8,21 @@ public static class Sheets
public static readonly ExcelSheet<Item> ItemSheet; public static readonly ExcelSheet<Item> ItemSheet;
public static readonly ExcelSheet<World> WorldSheet; public static readonly ExcelSheet<World> WorldSheet;
public static readonly ExcelSheet<LogFilter> LogFilterSheet; public static readonly ExcelSheet<LogFilter> LogFilterSheet;
public static readonly ExcelSheet<EventItem> EventItemSheet;
public static readonly ExcelSheet<Completion> CompletionSheet;
public static readonly ExcelSheet<TerritoryType> TerritorySheet;
public static readonly ExcelSheet<TextCommand> TextCommandSheet; public static readonly ExcelSheet<TextCommand> TextCommandSheet;
public static readonly ExcelSheet<EventItemHelp> EventItemHelpSheet;
static Sheets() static Sheets()
{ {
ItemSheet = Plugin.DataManager.GetExcelSheet<Item>()!; ItemSheet = Plugin.DataManager.GetExcelSheet<Item>();
WorldSheet = Plugin.DataManager.GetExcelSheet<World>()!; WorldSheet = Plugin.DataManager.GetExcelSheet<World>();
LogFilterSheet = Plugin.DataManager.GetExcelSheet<LogFilter>()!; EventItemSheet = Plugin.DataManager.GetExcelSheet<EventItem>();
TextCommandSheet = Plugin.DataManager.GetExcelSheet<TextCommand>()!; LogFilterSheet = Plugin.DataManager.GetExcelSheet<LogFilter>();
CompletionSheet = Plugin.DataManager.GetExcelSheet<Completion>();
TerritorySheet = Plugin.DataManager.GetExcelSheet<TerritoryType>();
TextCommandSheet = Plugin.DataManager.GetExcelSheet<TextCommand>();
EventItemHelpSheet = Plugin.DataManager.GetExcelSheet<EventItemHelp>();
} }
} }
+54 -42
View File
@@ -19,8 +19,10 @@ using Dalamud.Interface.Utility.Raii;
using Dalamud.Interface.Windowing; using Dalamud.Interface.Windowing;
using Dalamud.Memory; using Dalamud.Memory;
using FFXIVClientStructs.FFXIV.Client.UI; using FFXIVClientStructs.FFXIV.Client.UI;
using FFXIVClientStructs.FFXIV.Client.UI.Agent;
using FFXIVClientStructs.FFXIV.Client.UI.Info;
using ImGuiNET; using ImGuiNET;
using Lumina.Excel.GeneratedSheets; using Lumina.Excel.Sheets;
namespace ChatTwo.Ui; namespace ChatTwo.Ui;
@@ -57,7 +59,6 @@ public sealed class ChatLogWindow : Window
private int InputBacklogIdx = -1; private int InputBacklogIdx = -1;
private int LastTab { get; set; } private int LastTab { get; set; }
private InputChannel? TempChannel; private InputChannel? TempChannel;
internal TellTarget? TellTarget;
public bool TellSpecial; public bool TellSpecial;
private readonly Stopwatch LastResize = new(); private readonly Stopwatch LastResize = new();
private AutoCompleteInfo? AutoCompleteInfo; private AutoCompleteInfo? AutoCompleteInfo;
@@ -128,7 +129,7 @@ public sealed class ChatLogWindow : Window
Plugin.Commands.Register("/clearlog2").Execute -= ClearLog; Plugin.Commands.Register("/clearlog2").Execute -= ClearLog;
} }
private void Logout() private void Logout(int _, int __)
{ {
Plugin.MessageManager.ClearAllTabs(); Plugin.MessageManager.ClearAllTabs();
} }
@@ -138,8 +139,12 @@ public sealed class ChatLogWindow : Window
Plugin.MessageManager.FilterAllTabsAsync(); Plugin.MessageManager.FilterAllTabsAsync();
} }
internal void Activated(ChatActivatedArgs args) internal unsafe void Activated(ChatActivatedArgs args)
{ {
// Return if we don't have a tab selected
if (CurrentTab == null)
return;
TellSpecial = args.TellSpecial; TellSpecial = args.TellSpecial;
Activate = true; Activate = true;
@@ -176,18 +181,18 @@ public sealed class ChatLogWindow : Window
var tellInfo = Plugin.Functions.Chat.GetTellHistoryInfo(idx); var tellInfo = Plugin.Functions.Chat.GetTellHistoryInfo(idx);
if (tellInfo != null && reason != null) if (tellInfo != null && reason != null)
TellTarget = new TellTarget(tellInfo.Name, (ushort) tellInfo.World, tellInfo.ContentId, reason.Value); CurrentTab!.TellTarget = new TellTarget(tellInfo.Name, (ushort) tellInfo.World, tellInfo.ContentId, reason.Value);
} }
else else
{ {
TellTarget = null; CurrentTab!.TellTarget = null;
if (target != null) if (target != null)
TellTarget = target; CurrentTab!.TellTarget = target;
} }
} }
else else
{ {
TellTarget = null; CurrentTab!.TellTarget = null;
} }
if (info.Channel is InputChannel.Linkshell1 or InputChannel.CrossLinkshell1 && info.Rotate != RotateMode.None) if (info.Channel is InputChannel.Linkshell1 or InputChannel.CrossLinkshell1 && info.Rotate != RotateMode.None)
@@ -199,15 +204,13 @@ public sealed class ChatLogWindow : Window
// Rotate using the game's code. // Rotate using the game's code.
if (info.Channel == InputChannel.Linkshell1) if (info.Channel == InputChannel.Linkshell1)
{ {
var idx = GameFunctions.Chat.RotateLinkshellHistory(info.Rotate); GameFunctions.Chat.RotateLinkshellHistory(info.Rotate);
if (idx >= 0 && GameFunctions.Chat.ValidLinkshell((uint)idx)) targetChannel = (InputChannel) AgentChatLog.Instance()->CurrentChannel;
targetChannel = info.Channel + (uint)idx;
} }
else else
{ {
var idx = GameFunctions.Chat.RotateCrossLinkshellHistory(info.Rotate); GameFunctions.Chat.RotateCrossLinkshellHistory(info.Rotate);
if (idx >= 0 && GameFunctions.Chat.ValidCrossLinkshell((uint)idx)) targetChannel = (InputChannel)AgentChatLog.Instance()->CurrentChannel;
targetChannel = info.Channel + (uint)idx;
} }
} }
else else
@@ -293,17 +296,19 @@ public sealed class ChatLogWindow : Window
AddTextCommandChannel(command, type); AddTextCommandChannel(command, type);
} }
if (Sheets.TextCommandSheet.HasRow(116))
{
var echo = Sheets.TextCommandSheet.GetRow(116); var echo = Sheets.TextCommandSheet.GetRow(116);
if (echo != null)
AddTextCommandChannel(echo, ChatType.Echo); AddTextCommandChannel(echo, ChatType.Echo);
} }
}
private void AddTextCommandChannel(TextCommand command, ChatType type) private void AddTextCommandChannel(TextCommand command, ChatType type)
{ {
TextCommandChannels[command.Command] = type; TextCommandChannels[command.Command.ExtractText()] = type;
TextCommandChannels[command.ShortCommand] = type; TextCommandChannels[command.ShortCommand.ExtractText()] = type;
TextCommandChannels[command.Alias] = type; TextCommandChannels[command.Alias.ExtractText()] = type;
TextCommandChannels[command.ShortAlias] = type; TextCommandChannels[command.ShortAlias.ExtractText()] = type;
} }
private void SetUpAllCommands() private void SetUpAllCommands()
@@ -313,10 +318,10 @@ public sealed class ChatLogWindow : Window
var commandNames = commands.SelectMany(cmd => new[] var commandNames = commands.SelectMany(cmd => new[]
{ {
cmd.Command.RawString, cmd.Command.ExtractText(),
cmd.ShortCommand.RawString, cmd.ShortCommand.ExtractText(),
cmd.Alias.RawString, cmd.Alias.ExtractText(),
cmd.ShortAlias.RawString, cmd.ShortAlias.ExtractText(),
}); });
foreach (var command in commandNames) foreach (var command in commandNames)
@@ -673,8 +678,8 @@ public sealed class ChatLogWindow : Window
UIModule.PlaySound(ChatCloseSfx); UIModule.PlaySound(ChatCloseSfx);
} }
if (TempChannel is InputChannel.Tell) if (TempChannel is InputChannel.Tell && CurrentTab != null)
TellTarget = null; CurrentTab.TellTarget = null;
TempChannel = null; TempChannel = null;
if (Plugin.Functions.Chat.UsesTellTempChannel) if (Plugin.Functions.Chat.UsesTellTempChannel)
@@ -724,7 +729,7 @@ public sealed class ChatLogWindow : Window
var channels = new Dictionary<string, InputChannel>(); var channels = new Dictionary<string, InputChannel>();
foreach (var channel in Enum.GetValues<InputChannel>()) foreach (var channel in Enum.GetValues<InputChannel>())
{ {
var name = Sheets.LogFilterSheet.FirstOrDefault(row => row.LogKind == (byte) channel.ToChatType())?.Name?.RawString ?? channel.ToChatType().Name(); var name = Sheets.LogFilterSheet.FirstOrNull(row => row.LogKind == (byte) channel.ToChatType())?.Name.ExtractText() ?? channel.ToChatType().Name();
if (channel.IsLinkshell()) if (channel.IsLinkshell())
{ {
var lsName = Plugin.Functions.Chat.GetLinkshellName(channel.LinkshellIndex()); var lsName = Plugin.Functions.Chat.GetLinkshellName(channel.LinkshellIndex());
@@ -774,14 +779,17 @@ public sealed class ChatLogWindow : Window
internal Chunk[] ReadChannelName(Tab? activeTab) internal Chunk[] ReadChannelName(Tab? activeTab)
{ {
Chunk[] channelNameChunks; Chunk[] channelNameChunks;
if (TellTarget != null) if (activeTab?.TellTarget != null)
{ {
var playerName = TellTarget.Name; var playerName = activeTab.TellTarget.Name;
if (ScreenshotMode) if (ScreenshotMode)
// Note: don't use HidePlayerInString here because // Note: don't use HidePlayerInString here because
// abbreviation settings do not affect this. // abbreviation settings do not affect this.
playerName = HashPlayer(TellTarget.Name, TellTarget.World); playerName = HashPlayer(activeTab.TellTarget.Name, activeTab.TellTarget.World);
var world = Sheets.WorldSheet.GetRow(TellTarget.World)?.Name?.RawString ?? "???";
var world = Sheets.WorldSheet.HasRow(activeTab.TellTarget.World)
? Sheets.WorldSheet.GetRow(activeTab.TellTarget.World).Name.ExtractText()
: "???";
channelNameChunks = channelNameChunks =
[ [
@@ -834,7 +842,9 @@ public sealed class ChatLogWindow : Window
// Note: don't use HidePlayerInString here because // Note: don't use HidePlayerInString here because
// abbreviation settings do not affect this. // abbreviation settings do not affect this.
var playerName = HashPlayer(tellPlayerName, tellWorldId); var playerName = HashPlayer(tellPlayerName, tellWorldId);
var world = Sheets.WorldSheet.GetRow(tellWorldId)?.Name?.RawString ?? "???"; var world = Sheets.WorldSheet.HasRow(tellWorldId)
? Sheets.WorldSheet.GetRow(tellWorldId).Name.ExtractText()
: "???";
channelNameChunks = channelNameChunks =
[ [
@@ -862,7 +872,8 @@ public sealed class ChatLogWindow : Window
internal void SetChannel(InputChannel? channel) internal void SetChannel(InputChannel? channel)
{ {
channel ??= InputChannel.Say; channel ??= InputChannel.Say;
TellTarget = null; if (CurrentTab != null)
CurrentTab.TellTarget = null;
// Instead of calling SetChannel(), we ask the ExtraChat plugin to set a // Instead of calling SetChannel(), we ask the ExtraChat plugin to set a
// channel override by just calling the command directly. // channel override by just calling the command directly.
@@ -901,8 +912,8 @@ public sealed class ChatLogWindow : Window
Plugin.Functions.Chat.SendTellUsingCommandInner(tellBytes); Plugin.Functions.Chat.SendTellUsingCommandInner(tellBytes);
TellSpecial = false; TellSpecial = false;
if (TempChannel is InputChannel.Tell) if (TempChannel is InputChannel.Tell && CurrentTab != null)
TellTarget = null; CurrentTab.TellTarget = null;
Chat = string.Empty; Chat = string.Empty;
return; return;
@@ -910,9 +921,9 @@ public sealed class ChatLogWindow : Window
if (!trimmed.StartsWith('/')) if (!trimmed.StartsWith('/'))
{ {
if (TellTarget != null) if (CurrentTab?.TellTarget != null)
{ {
var target = TellTarget; var target = CurrentTab.TellTarget;
var reason = target.Reason; var reason = target.Reason;
var world = Sheets.WorldSheet.GetRow(target.World); var world = Sheets.WorldSheet.GetRow(target.World);
if (world is { IsPublic: true }) if (world is { IsPublic: true })
@@ -927,7 +938,7 @@ public sealed class ChatLogWindow : Window
} }
if (TempChannel is InputChannel.Tell) if (TempChannel is InputChannel.Tell)
TellTarget = null; CurrentTab.TellTarget = null;
Chat = string.Empty; Chat = string.Empty;
return; return;
@@ -1213,6 +1224,7 @@ public sealed class ChatLogWindow : Window
var switchedTab = LastTab != tabI; var switchedTab = LastTab != tabI;
if (switchedTab) if (switchedTab)
TabChannelSwitch(tab); TabChannelSwitch(tab);
LastTab = tabI; LastTab = tabI;
tab.Unread = 0; tab.Unread = 0;
@@ -1588,12 +1600,12 @@ public sealed class ChatLogWindow : Window
if (text.StartsWith('/')) if (text.StartsWith('/'))
{ {
var command = text.Split(' ')[0]; var command = text.Split(' ')[0];
var cmd = Sheets.TextCommandSheet.FirstOrDefault(cmd => var cmd = Sheets.TextCommandSheet.FirstOrNull(cmd =>
cmd.Command.RawString == command || cmd.Alias.RawString == command || cmd.Command.ExtractText() == command || cmd.Alias.ExtractText() == command ||
cmd.ShortCommand.RawString == command || cmd.ShortAlias.RawString == command); cmd.ShortCommand.ExtractText() == command || cmd.ShortAlias.ExtractText() == command);
if (cmd != null) if (cmd != null)
Plugin.CommandHelpWindow.UpdateContent(cmd); Plugin.CommandHelpWindow.UpdateContent(cmd.Value);
} }
if (data->EventFlag != ImGuiInputTextFlags.CallbackHistory) if (data->EventFlag != ImGuiInputTextFlags.CallbackHistory)
@@ -1733,7 +1745,7 @@ public sealed class ChatLogWindow : Window
if (chunk.Link is PlayerPayload playerPayload) if (chunk.Link is PlayerPayload playerPayload)
content = HidePlayerInString(content, playerPayload.PlayerName, playerPayload.World.RowId); content = HidePlayerInString(content, playerPayload.PlayerName, playerPayload.World.RowId);
else if (Plugin.ClientState.LocalPlayer is { } player) else if (Plugin.ClientState.LocalPlayer is { } player)
content = HidePlayerInString(content, player.Name.TextValue, player.HomeWorld.Id); content = HidePlayerInString(content, player.Name.TextValue, player.HomeWorld.RowId);
} }
if (wrap) if (wrap)
+2 -2
View File
@@ -4,7 +4,7 @@ using Dalamud.Interface.Utility;
using Dalamud.Interface.Windowing; using Dalamud.Interface.Windowing;
using Dalamud.Utility; using Dalamud.Utility;
using ImGuiNET; using ImGuiNET;
using Lumina.Excel.GeneratedSheets; using Lumina.Excel.Sheets;
namespace ChatTwo.Ui; namespace ChatTwo.Ui;
@@ -59,6 +59,6 @@ public class CommandHelpWindow : Window {
if (Command == null) if (Command == null)
return; return;
LogWindow.DrawChunks(ChunkUtil.ToChunks(Command.Description.ToDalamudString(), ChunkSource.None, null).ToList()); LogWindow.DrawChunks(ChunkUtil.ToChunks(Command.Value.Description.ToDalamudString(), ChunkSource.None, null).ToList());
} }
} }
+13 -12
View File
@@ -5,7 +5,8 @@ using Dalamud.Game.Text.SeStringHandling;
using Dalamud.Game.Text.SeStringHandling.Payloads; using Dalamud.Game.Text.SeStringHandling.Payloads;
using Dalamud.Interface.Windowing; using Dalamud.Interface.Windowing;
using ImGuiNET; using ImGuiNET;
using Lumina.Excel;
using Lumina.Excel.Sheets;
using DalamudPartyFinderPayload = Dalamud.Game.Text.SeStringHandling.Payloads.PartyFinderPayload; using DalamudPartyFinderPayload = Dalamud.Game.Text.SeStringHandling.Payloads.PartyFinderPayload;
namespace ChatTwo.Ui; namespace ChatTwo.Ui;
@@ -84,11 +85,11 @@ public class SeStringDebugger : Window
{ {
RenderMetadataDictionary("Link MapLinkPayload", new Dictionary<string, string?> RenderMetadataDictionary("Link MapLinkPayload", new Dictionary<string, string?>
{ {
{ "Map.RowId", map.Map?.RowId.ToString() }, { "Map.RowId", map.Map.RowId.ToString() },
{ "Map.PlaceName", map.Map?.PlaceName.Value?.Name.ToString() }, { "Map.PlaceName", map.Map.Value.PlaceName.Value.Name.ToString() },
{ "Map.PlaceNameRegion", map.Map?.PlaceNameRegion.Value?.Name.ToString() }, { "Map.PlaceNameRegion", map.Map.Value.PlaceNameRegion.Value.Name.ToString() },
{ "Map.PlaceNameSub", map.Map?.PlaceNameSub.Value?.Name.ToString() }, { "Map.PlaceNameSub", map.Map.Value.PlaceNameSub.Value.Name.ToString() },
{ "TerritoryType.RowId", map.TerritoryType?.RowId.ToString() }, { "TerritoryType.RowId", map.TerritoryType.RowId.ToString() },
{ "RawX", map.RawX.ToString() }, { "RawX", map.RawX.ToString() },
{ "RawY", map.RawY.ToString() }, { "RawY", map.RawY.ToString() },
{ "XCoord", map.XCoord.ToString() }, { "XCoord", map.XCoord.ToString() },
@@ -102,8 +103,8 @@ public class SeStringDebugger : Window
{ {
RenderMetadataDictionary("Link QuestPayload", new Dictionary<string, string?> RenderMetadataDictionary("Link QuestPayload", new Dictionary<string, string?>
{ {
{ "Quest.RowId", quest.Quest?.RowId.ToString() }, { "Quest.RowId", quest.Quest.RowId.ToString() },
{ "Quest.Name", quest.Quest?.Name.ToString() }, { "Quest.Name", quest.Quest.Value.Name.ToString() },
}); });
break; break;
} }
@@ -131,7 +132,7 @@ public class SeStringDebugger : Window
{ {
{ "Displayed", player.DisplayedName }, { "Displayed", player.DisplayedName },
{ "Player Name", player.PlayerName }, { "Player Name", player.PlayerName },
{ "World Name", player.World.Name }, { "World Name", player.World.Value.Name.ExtractText() },
{ "Data", string.Join(" ", player.Encode().Select(b => b.ToString("X2"))) }, { "Data", string.Join(" ", player.Encode().Select(b => b.ToString("X2"))) },
}); });
break; break;
@@ -144,7 +145,7 @@ public class SeStringDebugger : Window
{ "RawItemId", item.RawItemId.ToString() }, { "RawItemId", item.RawItemId.ToString() },
{ "Kind", EnumName(item.Kind) }, { "Kind", EnumName(item.Kind) },
{ "IsHQ", item.IsHQ.ToString() }, { "IsHQ", item.IsHQ.ToString() },
{ "Item.Name", item.Item?.Name.ToString() }, { "Item.Name", item.Kind == ItemPayload.ItemKind.EventItem ? Sheets.EventItemSheet.GetRow(item.ItemId).Name.ExtractText() : Sheets.ItemSheet.GetRow(item.ItemId).Name.ExtractText() },
}); });
break; break;
} }
@@ -197,8 +198,8 @@ public class SeStringDebugger : Window
RenderMetadataDictionary("Link StatusPayload", new Dictionary<string, string?> RenderMetadataDictionary("Link StatusPayload", new Dictionary<string, string?>
{ {
{ "Status.RowId", status.Status.RowId.ToString() }, { "Status.RowId", status.Status.RowId.ToString() },
{ "Status.Name", status.Status.Name }, { "Status.Name", status.Status.Value.Name.ExtractText() },
{ "Status.Icon", status.Status.Icon.ToString() } { "Status.Icon", status.Status.Value.Icon.ToString() }
}); });
break; break;
} }
+1 -1
View File
@@ -162,7 +162,7 @@ internal sealed class Database : ISettingsTab
// Generate // Generate
var stopwatch = Stopwatch.StartNew(); var stopwatch = Stopwatch.StartNew();
var playerName = Plugin.ClientState.LocalPlayer?.Name.ToString() ?? "Unknown Player"; var playerName = Plugin.ClientState.LocalPlayer?.Name.ToString() ?? "Unknown Player";
var worldId = Plugin.ClientState.LocalPlayer?.HomeWorld.Id ?? 0; var worldId = Plugin.ClientState.LocalPlayer?.HomeWorld.RowId ?? 0;
var senderSource = new SeStringBuilder() var senderSource = new SeStringBuilder()
.AddText("<") .AddText("<")
.Add(new PlayerPayload(playerName, worldId)) .Add(new PlayerPayload(playerName, worldId))
+115 -117
View File
@@ -5,8 +5,7 @@ using Dalamud.Game;
using Dalamud.Game.Text.SeStringHandling; using Dalamud.Game.Text.SeStringHandling;
using Dalamud.Game.Text.SeStringHandling.Payloads; using Dalamud.Game.Text.SeStringHandling.Payloads;
using Dalamud.Utility; using Dalamud.Utility;
using Lumina.Excel; using Lumina.Excel.Sheets;
using Lumina.Excel.GeneratedSheets;
using Pidgin; using Pidgin;
using static Pidgin.Parser; using static Pidgin.Parser;
using static Pidgin.Parser<char>; using static Pidgin.Parser<char>;
@@ -19,13 +18,6 @@ internal static class AutoTranslate
private static readonly Dictionary<ClientLanguage, List<AutoTranslateEntry>> Entries = new(); private static readonly Dictionary<ClientLanguage, List<AutoTranslateEntry>> Entries = new();
private static readonly HashSet<(uint, uint)> ValidEntries = []; private static readonly HashSet<(uint, uint)> ValidEntries = [];
private static readonly ExcelSheet<Completion> CompletionSheet;
static AutoTranslate()
{
CompletionSheet = Plugin.DataManager.GetExcelSheet<Completion>()!;
}
private static Parser<char, (string name, Maybe<IEnumerable<ISelectorPart>> selector)> Parser() private static Parser<char, (string name, Maybe<IEnumerable<ISelectorPart>> selector)> Parser()
{ {
var sheetName = Any var sheetName = Any
@@ -125,117 +117,123 @@ internal static class AutoTranslate
var parser = Parser(); var parser = Parser();
var list = new List<AutoTranslateEntry>(); var list = new List<AutoTranslateEntry>();
foreach (var row in CompletionSheet)
{
var lookup = row.LookupTable.TextValue();
if (lookup is not ("" or "@"))
{
var (sheetName, selector) = parser.ParseOrThrow(lookup);
var sheetType = typeof(Completion)
.Assembly
.GetType($"Lumina.Excel.GeneratedSheets.{sheetName}")!;
var getSheet = Plugin.DataManager
.GetType()
.GetMethod("GetExcelSheet", Type.EmptyTypes)!
.MakeGenericMethod(sheetType);
var sheet = (ExcelSheetImpl) getSheet.Invoke(Plugin.DataManager, null)!;
var rowParsers = sheet.GetRowParsers().ToArray();
var columns = new List<int>();
var rows = new List<Range>();
if (selector.HasValue)
{
columns.Clear();
rows.Clear();
foreach (var part in selector.Value)
{
switch (part)
{
case IndexRange range:
{
var start = (int) range.Start;
var end = (int) (range.End + 1);
rows.Add(start..end);
break;
}
case SingleRow single:
{
var idx = (int) single.Row;
rows.Add(idx..(idx + 1));
break;
}
case ColumnSpecifier col:
columns.Add((int) col.Column);
break;
}
}
}
if (columns.Count == 0)
columns.Add(0);
var validRows = rowParsers.Select(p => p.RowId).ToArray();
if (rows.Count == 0)
// We can't use an "index from end" (like `^0`) here because
// we're iterating over integers, not an array directly.
// Previously, we were setting `0..^0` which caused these
// sheets to be completely skipped due to this bug.
// See below.
rows.Add(..Index.FromStart((int)validRows.Max() + 1));
foreach (var range in rows)
{
// We iterate over the range by numerical values here, so
// we can't use an "index from end" otherwise nothing will
// happen.
// See above.
for (var i = range.Start.Value; i < range.End.Value; i++)
{
if (!validRows.Contains((uint) i))
continue;
foreach (var col in columns)
{
var rowParser = rowParsers.FirstOrDefault(p => p.RowId == i);
if (rowParser == null)
continue;
var rawName = rowParser.ReadColumn<Lumina.Text.SeString>(col)!;
var name = rawName.ToDalamudString();
var text = name.TextValue;
if (text.Length > 0)
{
list.Add(new AutoTranslateEntry(
row.Group,
(uint) i,
text,
name
));
if (shouldAdd)
ValidEntries.Add((row.Group, (uint) i));
}
}
}
}
}
else if (lookup is not "@")
{
var text = row.Text.ToDalamudString();
list.Add(new AutoTranslateEntry(
row.Group,
row.RowId,
text.TextValue,
text
));
if (shouldAdd)
ValidEntries.Add((row.Group, row.RowId));
}
}
// TODO REMOVE AFTER FIX
Entries[Plugin.DataManager.Language] = list; Entries[Plugin.DataManager.Language] = list;
return list; return list;
// TODO FIX
// foreach (var row in Sheets.CompletionSheet)
// {
// var lookup = row.LookupTable.ExtractText();
// if (lookup is not ("" or "@"))
// {
// var (sheetName, selector) = parser.ParseOrThrow(lookup);
// var sheetType = typeof(Completion)
// .Assembly
// .GetType($"Lumina.Excel.Sheets.{sheetName}")!;
// var getSheet = Plugin.DataManager
// .GetType()
// .GetMethod("GetExcelSheet", Type.EmptyTypes)!
// .MakeGenericMethod(sheetType);
// var sheet = (ExcelSheetImpl) getSheet.Invoke(Plugin.DataManager, null)!;
// var rowParsers = sheet.GetRowParsers().ToArray();
//
// var columns = new List<int>();
// var rows = new List<Range>();
// if (selector.HasValue)
// {
// columns.Clear();
// rows.Clear();
// foreach (var part in selector.Value)
// {
// switch (part)
// {
// case IndexRange range:
// {
// var start = (int) range.Start;
// var end = (int) (range.End + 1);
// rows.Add(start..end);
// break;
// }
// case SingleRow single:
// {
// var idx = (int) single.Row;
// rows.Add(idx..(idx + 1));
// break;
// }
// case ColumnSpecifier col:
// columns.Add((int) col.Column);
// break;
// }
// }
// }
//
// if (columns.Count == 0)
// columns.Add(0);
//
// var validRows = rowParsers.Select(p => p.RowId).ToArray();
// if (rows.Count == 0)
// // We can't use an "index from end" (like `^0`) here because
// // we're iterating over integers, not an array directly.
// // Previously, we were setting `0..^0` which caused these
// // sheets to be completely skipped due to this bug.
// // See below.
// rows.Add(..Index.FromStart((int)validRows.Max() + 1));
//
// foreach (var range in rows)
// {
// // We iterate over the range by numerical values here, so
// // we can't use an "index from end" otherwise nothing will
// // happen.
// // See above.
// for (var i = range.Start.Value; i < range.End.Value; i++)
// {
// if (!validRows.Contains((uint) i))
// continue;
//
// foreach (var col in columns)
// {
// var rowParser = rowParsers.FirstOrDefault(p => p.RowId == i);
// if (rowParser == null)
// continue;
//
// var rawName = rowParser.ReadColumn<Lumina.Text.SeString>(col)!;
// var name = rawName.ToDalamudString();
// var text = name.TextValue;
// if (text.Length > 0)
// {
// list.Add(new AutoTranslateEntry(
// row.Group,
// (uint) i,
// text,
// name
// ));
//
// if (shouldAdd)
// ValidEntries.Add((row.Group, (uint) i));
// }
// }
// }
// }
// }
// else if (lookup is not "@")
// {
// var text = row.Text.ToDalamudString();
// list.Add(new AutoTranslateEntry(
// row.Group,
// row.RowId,
// text.TextValue,
// text
// ));
//
// if (shouldAdd)
// ValidEntries.Add((row.Group, row.RowId));
// }
// }
//
// Entries[Plugin.DataManager.Language] = list;
// return list;
} }
internal static List<AutoTranslateEntry> Matching(string prefix, bool sort) internal static List<AutoTranslateEntry> Matching(string prefix, bool sort)
+2 -2
View File
@@ -38,14 +38,14 @@ internal static class ChunkUtil
case PayloadType.UIForeground: case PayloadType.UIForeground:
var foregroundPayload = (UIForegroundPayload) payload; var foregroundPayload = (UIForegroundPayload) payload;
if (foregroundPayload.IsEnabled) if (foregroundPayload.IsEnabled)
foreground.Push(foregroundPayload.UIColor.UIForeground); foreground.Push(foregroundPayload.UIColor.Value.UIForeground);
else if (foreground.Count > 0) else if (foreground.Count > 0)
foreground.Pop(); foreground.Pop();
break; break;
case PayloadType.UIGlow: case PayloadType.UIGlow:
var glowPayload = (UIGlowPayload) payload; var glowPayload = (UIGlowPayload) payload;
if (glowPayload.IsEnabled) if (glowPayload.IsEnabled)
glow.Push(glowPayload.UIColor.UIGlow); glow.Push(glowPayload.UIColor.Value.UIGlow);
else if (glow.Count > 0) else if (glow.Count > 0)
glow.Pop(); glow.Pop();
break; break;
+16 -1
View File
@@ -1,4 +1,5 @@
using ChatTwo.Resources; using System.Runtime.CompilerServices;
using ChatTwo.Resources;
using Dalamud.Interface.ImGuiNotification; using Dalamud.Interface.ImGuiNotification;
namespace ChatTwo.Util; namespace ChatTwo.Util;
@@ -26,4 +27,18 @@ public static class WrapperUtil
public static IEnumerable<(T Value, int Index)> WithIndex<T>(this IEnumerable<T> list) public static IEnumerable<(T Value, int Index)> WithIndex<T>(this IEnumerable<T> list)
=> list.Select((x, i) => (x, i)); => list.Select((x, i) => (x, i));
/// <summary> Return the first object fulfilling the predicate or null for structs. </summary>
/// <param name="values"> The enumerable. </param>
/// <param name="predicate"> The predicate. </param>
/// <returns> The first object fulfilling the predicate, or a null-optional. </returns>
[MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)]
public static T? FirstOrNull<T>(this IEnumerable<T> values, Func<T, bool> predicate) where T : struct
{
foreach(var val in values)
if (predicate(val))
return val;
return null;
}
} }
+53 -60
View File
@@ -4,9 +4,9 @@
"net8.0-windows7.0": { "net8.0-windows7.0": {
"DalamudPackager": { "DalamudPackager": {
"type": "Direct", "type": "Direct",
"requested": "[2.1.13, )", "requested": "[11.0.0, )",
"resolved": "2.1.13", "resolved": "11.0.0",
"contentHash": "rMN1omGe8536f4xLMvx9NwfvpAc9YFFfeXJ1t4P4PE6Gu8WCIoFliR1sh07hM+bfODmesk/dvMbji7vNI+B/pQ==" "contentHash": "bjT7XUlhIJSmsE/O76b7weUX+evvGQctbQB8aKXt94o+oPWxHpCepxAGMs7Thow3AzCyqWs7cOpp9/2wcgRRQA=="
}, },
"EmbedIO": { "EmbedIO": {
"type": "Direct", "type": "Direct",
@@ -19,30 +19,31 @@
}, },
"MessagePack": { "MessagePack": {
"type": "Direct", "type": "Direct",
"requested": "[2.5.140, )", "requested": "[3.0.238-rc.1, )",
"resolved": "2.5.140", "resolved": "3.0.238-rc.1",
"contentHash": "nkIsgy8BkIfv40bSz9XZb4q//scI1PF3AYeB5X66nSlIhBIqbdpLz8Qk3gHvnjV3RZglQLO/ityK3eNfLii2NA==", "contentHash": "gAVmHb2gswXviGFpAmUgGBVvZEjYGph7Co5hp6IbshEooIuZT34Rv4YcBKvVnUCHdoqxQvK6DZIOPSLSYv3LjQ==",
"dependencies": { "dependencies": {
"MessagePack.Annotations": "2.5.140", "MessagePack.Annotations": "3.0.238-rc.1",
"Microsoft.NET.StringTools": "17.6.3", "MessagePackAnalyzer": "3.0.238-rc.1",
"System.Runtime.CompilerServices.Unsafe": "6.0.0" "Microsoft.NET.StringTools": "17.11.4"
} }
}, },
"Microsoft.Data.Sqlite": { "Microsoft.Data.Sqlite": {
"type": "Direct", "type": "Direct",
"requested": "[8.0.4, )", "requested": "[9.0.0, )",
"resolved": "8.0.4", "resolved": "9.0.0",
"contentHash": "vgLm03wS+CfsolO7qk4KVuvt0CtzgdjKmoORuwxMmiIF1ow1JlOo1vwfDHfwXnGa5+QEbvOUy3169bBcHshfTg==", "contentHash": "lw6wthgXGx3r/U775k1UkUAWIn0kAT0wj4ZRq0WlhPx4WAOiBsIjgDKgWkXcNTGT0KfHiClkM+tyPVFDvxeObw==",
"dependencies": { "dependencies": {
"Microsoft.Data.Sqlite.Core": "8.0.4", "Microsoft.Data.Sqlite.Core": "9.0.0",
"SQLitePCLRaw.bundle_e_sqlite3": "2.1.6" "SQLitePCLRaw.bundle_e_sqlite3": "2.1.10",
"SQLitePCLRaw.core": "2.1.10"
} }
}, },
"Pidgin": { "Pidgin": {
"type": "Direct", "type": "Direct",
"requested": "[3.2.3, )", "requested": "[3.3.0, )",
"resolved": "3.2.3", "resolved": "3.3.0",
"contentHash": "/1Q/f9asEZH7bogARG4EUxYT3LGB+mNC19db4unmx8gL04kkPzkg1VuX/BFk4UMJsqVopYComG/ydCrj1flCww==" "contentHash": "2rvIoIogQG1+vqvXCuz1xiAVljaiacG/wCz/TNpN74TzWw+9iSCjhBLf7kVg24sBi6tArRdrcklHq49ovW2NLA=="
}, },
"SixLabors.ImageSharp": { "SixLabors.ImageSharp": {
"type": "Direct", "type": "Direct",
@@ -52,18 +53,18 @@
}, },
"Watson.Lite": { "Watson.Lite": {
"type": "Direct", "type": "Direct",
"requested": "[6.2.2, )", "requested": "[6.2.3, )",
"resolved": "6.2.2", "resolved": "6.2.3",
"contentHash": "yRYcaRFSnqwy/rrPd+WIFLyvNfgTANo447KiK7j1mKpgUIYPNDAKYxqj9wkDVfvGIHxzt4z3CFK6eWOGWUYsuQ==", "contentHash": "NGVWwQTulT016tiSuwK/AUU+Ebgyq0r0xLaWxll29xv/LTV0w4pHtoPskUPRqnzV8Po+ZndCd5dsUzGCjP0BVA==",
"dependencies": { "dependencies": {
"CavemanTcp": "2.0.2", "CavemanTcp": "2.0.3",
"Watson.Core": "6.2.2" "Watson.Core": "6.2.3"
} }
}, },
"CavemanTcp": { "CavemanTcp": {
"type": "Transitive", "type": "Transitive",
"resolved": "2.0.2", "resolved": "2.0.3",
"contentHash": "T161WxkgNTMC5SQPPDfLCGCD2j3YTvF0ZUGy/1pcGaYi6y7mcSzPymgVzG/6mOjAxJNGotK8hf1iOD8eT3bbhQ==" "contentHash": "/feSFO+5A1tS69Vv9XgD8+Ahz9iRcPj8r1kXIIVxeL+VjUzpPpVoAOtNG70oyu+b8M1RqthZAszaVQHpSPzuwg=="
}, },
"IpMatcher": { "IpMatcher": {
"type": "Transitive", "type": "Transitive",
@@ -72,21 +73,26 @@
}, },
"MessagePack.Annotations": { "MessagePack.Annotations": {
"type": "Transitive", "type": "Transitive",
"resolved": "2.5.140", "resolved": "3.0.238-rc.1",
"contentHash": "JE3vwluOrsJ4t3hnfXzIxJUh6lhx6M/KR8Sark/HOUw1DJ5UKu5JsAnnuaQngg6poFkRx1lzHSLTkxHNJO7+uQ==" "contentHash": "yvnpKGuxZuFHnYZ9N8WQXQn0J28w2f0evh0RekDtuxIEKGPw/qQLQXyQWFzMunfb/+pKTWYlUZR1rvvNcwl10A=="
},
"MessagePackAnalyzer": {
"type": "Transitive",
"resolved": "3.0.238-rc.1",
"contentHash": "qweXSZ+3mrf3RAqBs71vrF20SiNmqQdbrrt/L3749jh7OPpvdyZcHhOd20BSk+THQXgmmQfqF5F3o/J7S7tGCQ=="
}, },
"Microsoft.Data.Sqlite.Core": { "Microsoft.Data.Sqlite.Core": {
"type": "Transitive", "type": "Transitive",
"resolved": "8.0.4", "resolved": "9.0.0",
"contentHash": "x5FE5m1h31UIDEk0j3r38HtYvsa0fxd5jXzvE/SARI7LecXt/jm4z2SUl6TEoJGQOo9Ow2wg3a0MU2E1TVVAdA==", "contentHash": "cFfZjFL+tqzGYw9lB31EkV1IWF5xRQNk2k+MQd+Cf86Gl6zTeAoiZIFw5sRB1Z8OxpEC7nu+nTDsLSjieBAPTw==",
"dependencies": { "dependencies": {
"SQLitePCLRaw.core": "2.1.6" "SQLitePCLRaw.core": "2.1.10"
} }
}, },
"Microsoft.NET.StringTools": { "Microsoft.NET.StringTools": {
"type": "Transitive", "type": "Transitive",
"resolved": "17.6.3", "resolved": "17.11.4",
"contentHash": "N0ZIanl1QCgvUumEL1laasU0a7sOE5ZwLZVTn0pAePnfhq8P7SvTjF8Axq+CnavuQkmdQpGNXQ1efZtu5kDFbA==" "contentHash": "mudqUHhNpeqIdJoUx2YDWZO/I9uEDYVowan89R6wsomfnUJQk6HteoQTlNjZDixhT2B4IXMkMtgZtoceIjLRmA=="
}, },
"RegexMatcher": { "RegexMatcher": {
"type": "Transitive", "type": "Transitive",
@@ -95,32 +101,32 @@
}, },
"SQLitePCLRaw.bundle_e_sqlite3": { "SQLitePCLRaw.bundle_e_sqlite3": {
"type": "Transitive", "type": "Transitive",
"resolved": "2.1.6", "resolved": "2.1.10",
"contentHash": "BmAf6XWt4TqtowmiWe4/5rRot6GerAeklmOPfviOvwLoF5WwgxcJHAxZtySuyW9r9w+HLILnm8VfJFLCUJYW8A==", "contentHash": "UxWuisvZ3uVcVOLJQv7urM/JiQH+v3TmaJc1BLKl5Dxfm/nTzTUrqswCqg/INiYLi61AXnHo1M1JPmPqqLnAdg==",
"dependencies": { "dependencies": {
"SQLitePCLRaw.lib.e_sqlite3": "2.1.6", "SQLitePCLRaw.lib.e_sqlite3": "2.1.10",
"SQLitePCLRaw.provider.e_sqlite3": "2.1.6" "SQLitePCLRaw.provider.e_sqlite3": "2.1.10"
} }
}, },
"SQLitePCLRaw.core": { "SQLitePCLRaw.core": {
"type": "Transitive", "type": "Transitive",
"resolved": "2.1.6", "resolved": "2.1.10",
"contentHash": "wO6v9GeMx9CUngAet8hbO7xdm+M42p1XeJq47ogyRoYSvNSp0NGLI+MgC0bhrMk9C17MTVFlLiN6ylyExLCc5w==", "contentHash": "Ii8JCbC7oiVclaE/mbDEK000EFIJ+ShRPwAvvV89GOZhQ+ZLtlnSWl6ksCNMKu/VGXA4Nfi2B7LhN/QFN9oBcw==",
"dependencies": { "dependencies": {
"System.Memory": "4.5.3" "System.Memory": "4.5.3"
} }
}, },
"SQLitePCLRaw.lib.e_sqlite3": { "SQLitePCLRaw.lib.e_sqlite3": {
"type": "Transitive", "type": "Transitive",
"resolved": "2.1.6", "resolved": "2.1.10",
"contentHash": "2ObJJLkIUIxRpOUlZNGuD4rICpBnrBR5anjyfUFQep4hMOIeqW+XGQYzrNmHSVz5xSWZ3klSbh7sFR6UyDj68Q==" "contentHash": "mAr69tDbnf3QJpRy2nJz8Qdpebdil00fvycyByR58Cn9eARvR+UiG2Vzsp+4q1tV3ikwiYIjlXCQFc12GfebbA=="
}, },
"SQLitePCLRaw.provider.e_sqlite3": { "SQLitePCLRaw.provider.e_sqlite3": {
"type": "Transitive", "type": "Transitive",
"resolved": "2.1.6", "resolved": "2.1.10",
"contentHash": "PQ2Oq3yepLY4P7ll145P3xtx2bX8xF4PzaKPRpw9jZlKvfe4LE/saAV82inND9usn1XRpmxXk7Lal3MTI+6CNg==", "contentHash": "uZVTi02C1SxqzgT0HqTWatIbWGb40iIkfc3FpFCpE/r7g6K0PqzDUeefL6P6HPhDtc6BacN3yQysfzP7ks+wSQ==",
"dependencies": { "dependencies": {
"SQLitePCLRaw.core": "2.1.6" "SQLitePCLRaw.core": "2.1.10"
} }
}, },
"System.Memory": { "System.Memory": {
@@ -128,23 +134,10 @@
"resolved": "4.5.3", "resolved": "4.5.3",
"contentHash": "3oDzvc/zzetpTKWMShs1AADwZjQ/36HnsufHRPcOjyRAAMLDlu2iD33MBI2opxnezcVUtXyqDXXjoFMOU9c7SA==" "contentHash": "3oDzvc/zzetpTKWMShs1AADwZjQ/36HnsufHRPcOjyRAAMLDlu2iD33MBI2opxnezcVUtXyqDXXjoFMOU9c7SA=="
}, },
"System.Runtime.CompilerServices.Unsafe": {
"type": "Transitive",
"resolved": "6.0.0",
"contentHash": "/iUeP3tq1S0XdNNoMz5C9twLSrM/TH+qElHkXWaPvuNOt+99G75NrV0OS2EqHx5wMN7popYjpc8oTjC1y16DLg=="
},
"System.Text.Encodings.Web": {
"type": "Transitive",
"resolved": "8.0.0",
"contentHash": "yev/k9GHAEGx2Rg3/tU6MQh4HGBXJs70y7j1LaM1i/ER9po+6nnQ6RRqTJn1E7Xu0fbIFK80Nh5EoODxrbxwBQ=="
},
"System.Text.Json": { "System.Text.Json": {
"type": "Transitive", "type": "Transitive",
"resolved": "8.0.4", "resolved": "8.0.5",
"contentHash": "bAkhgDJ88XTsqczoxEMliSrpijKZHhbJQldhAmObj/RbrN3sU5dcokuXmWJWsdQAhiMJ9bTayWsL1C9fbbCRhw==", "contentHash": "0f1B50Ss7rqxXiaBJyzUu9bWFOO2/zSlifZ/UNMdiIpDYe4cY4LQQicP4nirK1OS31I43rn062UIJ1Q9bpmHpg=="
"dependencies": {
"System.Text.Encodings.Web": "8.0.0"
}
}, },
"System.ValueTuple": { "System.ValueTuple": {
"type": "Transitive", "type": "Transitive",
@@ -171,12 +164,12 @@
}, },
"Watson.Core": { "Watson.Core": {
"type": "Transitive", "type": "Transitive",
"resolved": "6.2.2", "resolved": "6.2.3",
"contentHash": "lqdT+foblghBKLXuvXBFLJmO9J0TkPCBiQFH4xg4txFM7osm1jvF2IzYjor6w1NL+kNDhvlCRkBNaPSSxfJO/A==", "contentHash": "ccdGhC60dHTV1CA+C+U8zZOTQD4yLoPUDV0ZyXqF4dYmQ/zgwhegAxBGkV3WIw+2fqnTKYwMhJFU/tbkykybvA==",
"dependencies": { "dependencies": {
"IpMatcher": "1.0.4.4", "IpMatcher": "1.0.4.4",
"RegexMatcher": "1.0.8", "RegexMatcher": "1.0.8",
"System.Text.Json": "8.0.4", "System.Text.Json": "8.0.5",
"Timestamps": "1.0.9", "Timestamps": "1.0.9",
"UrlMatcher": "3.0.0" "UrlMatcher": "3.0.0"
} }