From 61b6b2115acdec4e6ec310454ef95cfc11db8e39 Mon Sep 17 00:00:00 2001 From: Liza Carvelli Date: Sat, 5 Oct 2024 21:03:04 +0200 Subject: [PATCH] Fix /dbq clear --- KitchenSink/Commands/DropboxQueue.cs | 38 +++++++++++++++++++++++++--- KitchenSink/KitchenSink.csproj | 2 +- KitchenSink/KitchenSinkPlugin.cs | 7 +++-- 3 files changed, 40 insertions(+), 7 deletions(-) diff --git a/KitchenSink/Commands/DropboxQueue.cs b/KitchenSink/Commands/DropboxQueue.cs index 5239201..918292d 100644 --- a/KitchenSink/Commands/DropboxQueue.cs +++ b/KitchenSink/Commands/DropboxQueue.cs @@ -1,14 +1,17 @@ using System; +using System.Collections; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Diagnostics.CodeAnalysis; using System.Linq; +using System.Reflection; using Dalamud.Game.Command; using Dalamud.Game.Text.SeStringHandling; using Dalamud.Plugin; using Dalamud.Plugin.Ipc; using Dalamud.Plugin.Services; using FFXIVClientStructs.FFXIV.Client.Game; +using LLib; namespace KitchenSink.Commands; @@ -28,12 +31,15 @@ internal sealed class DropboxQueue : IDisposable private readonly IChatGui _chatGui; private readonly DropboxApi _dropboxApi; - public DropboxQueue(IDalamudPluginInterface pluginInterface, ICommandManager commandManager, IChatGui chatGui, + public DropboxQueue(IDalamudPluginInterface pluginInterface, + DalamudReflector reflector, + ICommandManager commandManager, + IChatGui chatGui, IPluginLog pluginLog) { _commandManager = commandManager; _chatGui = chatGui; - _dropboxApi = new DropboxApi(pluginInterface, pluginLog); + _dropboxApi = new DropboxApi(pluginInterface, reflector, pluginLog); _commandManager.AddHandler("/dbq", new CommandInfo(Queue) { @@ -64,7 +70,7 @@ internal sealed class DropboxQueue : IDisposable BuildRequest(parts.Length == 2 ? parts[1] : string.Empty); break; case "clear": - //_dropboxApi.ClearQueue(); + _dropboxApi.ClearQueue(); break; default: AddToQueue(arguments); @@ -233,13 +239,15 @@ internal sealed class DropboxQueue : IDisposable private sealed class DropboxApi { + private readonly DalamudReflector _reflector; private readonly IPluginLog _pluginLog; private readonly ICallGateSubscriber _beginTradingQueue; private readonly ICallGateSubscriber _getItemQuantity; private readonly ICallGateSubscriber _setItemQuantity; - public DropboxApi(IDalamudPluginInterface pluginInterface, IPluginLog pluginLog) + public DropboxApi(IDalamudPluginInterface pluginInterface, DalamudReflector reflector, IPluginLog pluginLog) { + _reflector = reflector; _pluginLog = pluginLog; _beginTradingQueue = pluginInterface.GetIpcSubscriber("Dropbox.BeginTradingQueue"); @@ -258,5 +266,27 @@ internal sealed class DropboxQueue : IDisposable int currentQuantity = _getItemQuantity.InvokeFunc(itemId, hq); _setItemQuantity.InvokeAction(itemId, hq, quantity + currentQuantity); } + + public void ClearQueue() + { + if (TryGetItemQuantities(out _, out IDictionary? itemQuantities)) + itemQuantities.Clear(); + } + + private bool TryGetItemQuantities([NotNullWhen(true)] out IDalamudPlugin? dropboxPlugin, + [NotNullWhen(true)] out IDictionary? itemQuantities) + { + if (!_reflector.TryGetDalamudPlugin("Dropbox", out dropboxPlugin)) + { + itemQuantities = null; + return false; + } + + var itemQueueUiType = dropboxPlugin.GetType().Assembly.GetType("Dropbox.ItemQueueUI")!; + itemQuantities = + (IDictionary?)itemQueueUiType.GetField("ItemQuantities", BindingFlags.Public | BindingFlags.Static)! + .GetValue(null); + return itemQuantities != null; + } } } diff --git a/KitchenSink/KitchenSink.csproj b/KitchenSink/KitchenSink.csproj index 4c02419..e293459 100644 --- a/KitchenSink/KitchenSink.csproj +++ b/KitchenSink/KitchenSink.csproj @@ -1,6 +1,6 @@  - 1.0 + 1.1 dist diff --git a/KitchenSink/KitchenSinkPlugin.cs b/KitchenSink/KitchenSinkPlugin.cs index d3e0c05..3775b94 100644 --- a/KitchenSink/KitchenSinkPlugin.cs +++ b/KitchenSink/KitchenSinkPlugin.cs @@ -4,6 +4,7 @@ using Dalamud.Plugin; using Dalamud.Plugin.Services; using ECommons; using KitchenSink.Commands; +using LLib; namespace KitchenSink; @@ -17,13 +18,15 @@ internal sealed class KitchenSinkPlugin : IDalamudPlugin public KitchenSinkPlugin(IDalamudPluginInterface pluginInterface, ICommandManager commandManager, IClientState clientState, IChatGui chatGui, INotificationManager notificationManager, IDtrBar dtrBar, - ICondition condition, IPluginLog pluginLog) + ICondition condition, IFramework framework, IPluginLog pluginLog) { + DalamudReflector reflector = new DalamudReflector(pluginInterface, framework, pluginLog); + ECommonsMain.Init(pluginInterface, this); _autoRetainerApi = new AutoRetainerApi(); _characterSwitch = new CharacterSwitch(_autoRetainerApi, commandManager, clientState, chatGui, notificationManager, dtrBar, condition, pluginLog); - _dropboxQueue = new DropboxQueue(pluginInterface, commandManager, chatGui, pluginLog); + _dropboxQueue = new DropboxQueue(pluginInterface, reflector, commandManager, chatGui, pluginLog); } public void Dispose()