diff --git a/Influx/AllaganTools/AllaganToolsIpc.cs b/Influx/AllaganTools/AllaganToolsIpc.cs index b022606..1cdbc52 100644 --- a/Influx/AllaganTools/AllaganToolsIpc.cs +++ b/Influx/AllaganTools/AllaganToolsIpc.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Reflection; using Dalamud.Plugin; using Dalamud.Plugin.Ipc; using Dalamud.Plugin.Ipc.Exceptions; @@ -21,7 +22,7 @@ internal sealed class AllaganToolsIpc : IDisposable private ICharacterMonitor _characters; private IInventoryMonitor _inventories; - private IFilterService _filters; + private IListService _lists; public AllaganToolsIpc(DalamudPluginInterface pluginInterface, IChatGui chatGui, DalamudReflector dalamudReflector, IFramework framework, IPluginLog pluginLog) @@ -37,7 +38,7 @@ internal sealed class AllaganToolsIpc : IDisposable _characters = new UnavailableCharacterMonitor(_pluginLog); _inventories = new UnavailableInventoryMonitor(_pluginLog); - _filters = new UnavailableFilterService(_pluginLog); + _lists = new UnavailableListService(_pluginLog); _initialized.Subscribe(ConfigureIpc); @@ -64,12 +65,27 @@ internal sealed class AllaganToolsIpc : IDisposable { if (_dalamudReflector.TryGetDalamudPlugin("Allagan Tools", out var it, false, true)) { - var pluginService = it.GetType().Assembly.GetType("InventoryTools.PluginService")!; + var pluginLoader = it.GetType() + .GetProperty("PluginLoader", BindingFlags.NonPublic | BindingFlags.Instance)! + .GetValue(it)!; + var host = pluginLoader.GetType().GetProperty("Host")!.GetValue(pluginLoader)!; + var serviceProvider = host.GetType().GetProperty("Services")!.GetValue(host)!; + var getServiceMethod = serviceProvider.GetType().GetMethod("GetService")!; + object GetService(Type t) => getServiceMethod.Invoke(serviceProvider, [t])!; - _characters = new CharacterMonitor(pluginService.GetProperty("CharacterMonitor")!.GetValue(null)!); + var ccl = it.GetType() + .GetField("_service", BindingFlags.NonPublic | BindingFlags.Instance)! + .GetValue(it)! + .GetType() + .Assembly; + + _characters = + new CharacterMonitor(GetService(ccl.GetType("CriticalCommonLib.Services.ICharacterMonitor")!)); _inventories = new InventoryMonitor( - pluginService.GetProperty("InventoryMonitor")!.GetValue(null)!); - _filters = new FilterService(pluginService.GetProperty("FilterService")!.GetValue(null)!); + GetService(ccl.GetType("CriticalCommonLib.Services.IInventoryMonitor")!)); + _lists = new ListService( + GetService(it.GetType().Assembly.GetType("InventoryTools.Services.Interfaces.IListService")!), + GetService(it.GetType().Assembly.GetType("InventoryTools.Lists.ListFilterService")!)); } else { @@ -97,11 +113,11 @@ internal sealed class AllaganToolsIpc : IDisposable } } - public Filter? GetFilter(string keyOrName) + public FilterResult? GetFilter(string keyOrName) { try { - return _filters.GetFilterByKeyOrName(keyOrName); + return _lists.GetFilterByKeyOrName(keyOrName); } catch (IpcError e) { @@ -140,7 +156,7 @@ internal sealed class AllaganToolsIpc : IDisposable _initialized.Unsubscribe(ConfigureIpc); _characters = new UnavailableCharacterMonitor(_pluginLog); _inventories = new UnavailableInventoryMonitor(_pluginLog); - _filters = new UnavailableFilterService(_pluginLog); + _lists = new UnavailableListService(_pluginLog); } private sealed class InventoryWrapper(IEnumerable items) diff --git a/Influx/AllaganTools/CharacterMonitor.cs b/Influx/AllaganTools/CharacterMonitor.cs index a166632..4c6b662 100644 --- a/Influx/AllaganTools/CharacterMonitor.cs +++ b/Influx/AllaganTools/CharacterMonitor.cs @@ -16,8 +16,9 @@ internal sealed class CharacterMonitor : ICharacterMonitor { ArgumentNullException.ThrowIfNull(@delegate); _delegate = @delegate; - _getPlayerCharacters = _delegate.GetType().GetMethod("GetPlayerCharacters")!; - _allCharacters = _delegate.GetType().GetMethod("AllCharacters")!; + _getPlayerCharacters = + _delegate.GetType().GetMethod("GetPlayerCharacters") ?? throw new MissingMethodException(); + _allCharacters = _delegate.GetType().GetMethod("AllCharacters") ?? throw new MissingMethodException(); } public IEnumerable PlayerCharacters => GetCharactersInternal(_getPlayerCharacters); diff --git a/Influx/AllaganTools/Filter.cs b/Influx/AllaganTools/FilterResult.cs similarity index 51% rename from Influx/AllaganTools/Filter.cs rename to Influx/AllaganTools/FilterResult.cs index f6c5510..85be1aa 100644 --- a/Influx/AllaganTools/Filter.cs +++ b/Influx/AllaganTools/FilterResult.cs @@ -7,23 +7,22 @@ using System.Threading.Tasks; namespace Influx.AllaganTools; -internal sealed class Filter +internal sealed class FilterResult { private readonly object _delegate; - private readonly MethodInfo _generateFilteredList; + private readonly PropertyInfo _sortedItems; - public Filter(object @delegate) + public FilterResult(object @delegate) { ArgumentNullException.ThrowIfNull(@delegate); _delegate = @delegate; - _generateFilteredList = _delegate.GetType().GetMethod("GenerateFilteredList")!; + _sortedItems = + _delegate.GetType().GetProperty("SortedItems") ?? throw new MissingMemberException(); } public IReadOnlyList GenerateFilteredList() { - Task task = (Task)_generateFilteredList.Invoke(_delegate, new object?[] { null })!; - object result = task.GetType().GetProperty("Result")!.GetValue(task)!; - return ((IEnumerable)result.GetType().GetProperty("SortedItems")!.GetValue(result)!) + return ((IEnumerable)_sortedItems.GetValue(_delegate)!) .Cast() .Select(x => new SortingResult(x)) .ToList(); diff --git a/Influx/AllaganTools/FilterService.cs b/Influx/AllaganTools/FilterService.cs deleted file mode 100644 index f32ddba..0000000 --- a/Influx/AllaganTools/FilterService.cs +++ /dev/null @@ -1,23 +0,0 @@ -using System; -using System.Reflection; - -namespace Influx.AllaganTools; - -internal sealed class FilterService : IFilterService -{ - private readonly object _delegate; - private readonly MethodInfo _getFilterByKeyOrName; - - public FilterService(object @delegate) - { - ArgumentNullException.ThrowIfNull(@delegate); - _delegate = @delegate; - _getFilterByKeyOrName = _delegate.GetType().GetMethod("GetFilterByKeyOrName")!; - } - - public Filter? GetFilterByKeyOrName(string keyOrName) - { - var f = _getFilterByKeyOrName.Invoke(_delegate, [keyOrName]); - return f != null ? new Filter(f) : null; - } -} diff --git a/Influx/AllaganTools/IFilterService.cs b/Influx/AllaganTools/IFilterService.cs deleted file mode 100644 index ae52de4..0000000 --- a/Influx/AllaganTools/IFilterService.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace Influx.AllaganTools; - -internal interface IFilterService -{ - Filter? GetFilterByKeyOrName(string keyOrName); -} diff --git a/Influx/AllaganTools/IListService.cs b/Influx/AllaganTools/IListService.cs new file mode 100644 index 0000000..1d4f0fd --- /dev/null +++ b/Influx/AllaganTools/IListService.cs @@ -0,0 +1,6 @@ +namespace Influx.AllaganTools; + +internal interface IListService +{ + FilterResult? GetFilterByKeyOrName(string keyOrName); +} diff --git a/Influx/AllaganTools/Inventory.cs b/Influx/AllaganTools/Inventory.cs index d93c909..dbd540f 100644 --- a/Influx/AllaganTools/Inventory.cs +++ b/Influx/AllaganTools/Inventory.cs @@ -15,7 +15,7 @@ internal sealed class Inventory { ArgumentNullException.ThrowIfNull(@delegate); _delegate = @delegate; - _getAllInventories = _delegate.GetType().GetMethod("GetAllInventories")!; + _getAllInventories = _delegate.GetType().GetMethod("GetAllInventories") ?? throw new MissingMethodException(); CharacterId = (ulong)_delegate.GetType().GetProperty("CharacterId")!.GetValue(_delegate)!; } diff --git a/Influx/AllaganTools/InventoryItem.cs b/Influx/AllaganTools/InventoryItem.cs index f9f5c0d..fd3b18f 100644 --- a/Influx/AllaganTools/InventoryItem.cs +++ b/Influx/AllaganTools/InventoryItem.cs @@ -1,5 +1,5 @@ using System; -using FFXIVClientStructs.FFXIV.Client.Game; +using Dalamud.Logging; namespace Influx.AllaganTools; @@ -10,7 +10,7 @@ internal sealed class InventoryItem ArgumentNullException.ThrowIfNull(@delegate); Category = (int)@delegate.GetType().GetField("SortedCategory")!.GetValue(@delegate)!; Container = (int)@delegate.GetType().GetField("SortedContainer")!.GetValue(@delegate)!; - ItemId = (uint)@delegate.GetType().GetField("ItemId")!.GetValue(@delegate)!; + ItemId = (uint)@delegate.GetType().GetProperty("ItemId")!.GetValue(@delegate)!; Quantity = (uint)@delegate.GetType().GetField("Quantity")!.GetValue(@delegate)!; } diff --git a/Influx/AllaganTools/ListService.cs b/Influx/AllaganTools/ListService.cs new file mode 100644 index 0000000..53dc2f0 --- /dev/null +++ b/Influx/AllaganTools/ListService.cs @@ -0,0 +1,28 @@ +using System; +using System.Reflection; + +namespace Influx.AllaganTools; + +internal sealed class ListService : IListService +{ + private readonly object _listService; + private readonly object _listFilterService; + private readonly MethodInfo _getListByKeyOrName; + private readonly MethodInfo _refreshList; + + public ListService(object listService, object listFilterService) + { + ArgumentNullException.ThrowIfNull(listService); + _listService = listService; + _listFilterService = listFilterService; + _getListByKeyOrName = + _listService.GetType().GetMethod("GetListByKeyOrName") ?? throw new MissingMethodException(); + _refreshList = _listFilterService.GetType().GetMethod("RefreshList") ?? throw new MissingMethodException(); + } + + public FilterResult? GetFilterByKeyOrName(string keyOrName) + { + var f = _getListByKeyOrName.Invoke(_listService, [keyOrName]); + return f != null ? new FilterResult(_refreshList.Invoke(_listFilterService, [f])!) : null; + } +} diff --git a/Influx/AllaganTools/SortingResult.cs b/Influx/AllaganTools/SortingResult.cs index 3c044d6..918082c 100644 --- a/Influx/AllaganTools/SortingResult.cs +++ b/Influx/AllaganTools/SortingResult.cs @@ -13,7 +13,7 @@ internal sealed class SortingResult Quantity = (int)@delegate.GetType().GetProperty("Quantity")!.GetValue(@delegate)!; var inventoryItem = @delegate.GetType().GetProperty("InventoryItem")!.GetValue(@delegate)!; - ItemId = (uint)inventoryItem.GetType().GetField("ItemId")!.GetValue(inventoryItem)!; + ItemId = (uint)inventoryItem.GetType().GetProperty("ItemId")!.GetValue(inventoryItem)!; Flags = (ItemFlags)inventoryItem.GetType().GetField("Flags")!.GetValue(inventoryItem)!; } diff --git a/Influx/AllaganTools/UnavailableFilterService.cs b/Influx/AllaganTools/UnavailableListService.cs similarity index 52% rename from Influx/AllaganTools/UnavailableFilterService.cs rename to Influx/AllaganTools/UnavailableListService.cs index 08e4269..83a0f97 100644 --- a/Influx/AllaganTools/UnavailableFilterService.cs +++ b/Influx/AllaganTools/UnavailableListService.cs @@ -2,9 +2,9 @@ namespace Influx.AllaganTools; -internal sealed class UnavailableFilterService(IPluginLog pluginLog) : IFilterService +internal sealed class UnavailableListService(IPluginLog pluginLog) : IListService { - public Filter? GetFilterByKeyOrName(string keyOrName) + public FilterResult? GetFilterByKeyOrName(string keyOrName) { pluginLog.Warning("Filter Service is unavailable"); return null; diff --git a/Influx/Influx.csproj b/Influx/Influx.csproj index 4f64b12..8c6294b 100644 --- a/Influx/Influx.csproj +++ b/Influx/Influx.csproj @@ -1,7 +1,7 @@ net8.0-windows - 0.16 + 0.17 12 enable true @@ -25,7 +25,7 @@ - + diff --git a/Influx/packages.lock.json b/Influx/packages.lock.json index 0fa8f85..ccc84cd 100644 --- a/Influx/packages.lock.json +++ b/Influx/packages.lock.json @@ -25,9 +25,9 @@ }, "Microsoft.Extensions.ObjectPool": { "type": "Direct", - "requested": "[8.0.3, )", - "resolved": "8.0.3", - "contentHash": "sk/TGiccSeXUtVeBfFlWJnzp6xLlAxIW+bCHs7uVPLFPQk8vICNmu9Gc3JsKOn6fQuRkrPetQ8EHv4dCiMqhxg==" + "requested": "[9.0.0-preview.1.24081.5, )", + "resolved": "9.0.0-preview.1.24081.5", + "contentHash": "aAR7YW+pUUdvHk3vj7GtAi71dWGDIuY9270lsmQ6lKw23zzY+r8pLP3cGNbJdlnA9VWl+S+gnIVkBCqj2ROlEg==" }, "CsvHelper": { "type": "Transitive",