Use new dropbox IPC

This commit is contained in:
Liza 2024-06-21 12:14:14 +02:00
parent bb11f13512
commit 1224fbe688
Signed by: liza
GPG Key ID: 7199F8D727D55F67
3 changed files with 21 additions and 66 deletions

View File

@ -1,15 +1,13 @@
using System; using System;
using System.Collections;
using System.Collections.Generic; using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis; using System.Diagnostics.CodeAnalysis;
using System.Linq; using System.Linq;
using System.Reflection;
using Dalamud.Game.Command; using Dalamud.Game.Command;
using Dalamud.Game.Text.SeStringHandling; using Dalamud.Game.Text.SeStringHandling;
using Dalamud.Plugin; using Dalamud.Plugin;
using Dalamud.Plugin.Ipc;
using Dalamud.Plugin.Services; using Dalamud.Plugin.Services;
using FFXIVClientStructs.FFXIV.Client.Game; using FFXIVClientStructs.FFXIV.Client.Game;
using LLib;
namespace KitchenSink.Commands; namespace KitchenSink.Commands;
@ -29,12 +27,12 @@ internal sealed class DropboxQueue : IDisposable
private readonly IChatGui _chatGui; private readonly IChatGui _chatGui;
private readonly DropboxApi _dropboxApi; private readonly DropboxApi _dropboxApi;
public DropboxQueue(DalamudReflector reflector, ICommandManager commandManager, IChatGui chatGui, public DropboxQueue(DalamudPluginInterface pluginInterface, ICommandManager commandManager, IChatGui chatGui,
IPluginLog pluginLog) IPluginLog pluginLog)
{ {
_commandManager = commandManager; _commandManager = commandManager;
_chatGui = chatGui; _chatGui = chatGui;
_dropboxApi = new DropboxApi(reflector, pluginLog); _dropboxApi = new DropboxApi(pluginInterface, pluginLog);
_commandManager.AddHandler("/dbq", new CommandInfo(Queue) _commandManager.AddHandler("/dbq", new CommandInfo(Queue)
{ {
@ -65,7 +63,7 @@ internal sealed class DropboxQueue : IDisposable
BuildRequest(parts.Length == 2 ? parts[1] : string.Empty); BuildRequest(parts.Length == 2 ? parts[1] : string.Empty);
break; break;
case "clear": case "clear":
_dropboxApi.ClearQueue(); //_dropboxApi.ClearQueue();
break; break;
default: default:
AddToQueue(arguments); AddToQueue(arguments);
@ -135,6 +133,8 @@ internal sealed class DropboxQueue : IDisposable
itemCount.HighQualityQuantity - highQualityQuantity); itemCount.HighQualityQuantity - highQualityQuantity);
} }
} }
_dropboxApi.BeginTrade();
} }
private IReadOnlyList<NeededItem>? ParseArguments(string arguments) private IReadOnlyList<NeededItem>? ParseArguments(string arguments)
@ -232,72 +232,30 @@ internal sealed class DropboxQueue : IDisposable
private sealed class DropboxApi private sealed class DropboxApi
{ {
private readonly DalamudReflector _reflector;
private readonly IPluginLog _pluginLog; private readonly IPluginLog _pluginLog;
private readonly ICallGateSubscriber<object> _beginTradingQueue;
private readonly ICallGateSubscriber<uint,bool,int> _getItemQuantity;
private readonly ICallGateSubscriber<uint,bool,int, object> _setItemQuantity;
public DropboxApi(DalamudReflector reflector, IPluginLog pluginLog) public DropboxApi(DalamudPluginInterface pluginInterface, IPluginLog pluginLog)
{ {
_reflector = reflector;
_pluginLog = pluginLog; _pluginLog = pluginLog;
_beginTradingQueue = pluginInterface.GetIpcSubscriber<object>("Dropbox.BeginTradingQueue");
_getItemQuantity = pluginInterface.GetIpcSubscriber<uint, bool, int>("Dropbox.GetItemQuantity");
_setItemQuantity = pluginInterface.GetIpcSubscriber<uint, bool, int, object>("Dropbox.SetItemQuantity");
} }
[SuppressMessage("Performance", "CA2000", Justification = "Should not dispose other plugin")] public void BeginTrade() => _beginTradingQueue.InvokeAction();
public void EnqueueItem(uint itemId, bool hq, int quantity) public void EnqueueItem(uint itemId, bool hq, int quantity)
{ {
_pluginLog.Verbose($"Preparing to queue {itemId}, {hq}, {quantity}"); _pluginLog.Verbose($"Preparing to queue {itemId}, {hq}, {quantity}");
if (quantity < 0) if (quantity < 0)
return; return;
if (!TryGetItemQuantities(out IDalamudPlugin? dropboxPlugin, out IDictionary? itemQuantities)) int currentQuantity = _getItemQuantity.InvokeFunc(itemId, hq);
throw new InvalidOperationException("Could not retrieve item quantities"); _setItemQuantity.InvokeAction(itemId, hq, quantity + currentQuantity);
uint[] tradeableItemIds = (uint[])dropboxPlugin.GetType()
.GetField("TradeableItems", BindingFlags.Public | BindingFlags.Instance)!
.GetValue(dropboxPlugin)!;
if (!tradeableItemIds.Contains(itemId))
{
_pluginLog.Warning($"Item {itemId} is untradable");
return;
}
var itemDescriptorType = itemQuantities.GetType().GetGenericArguments()[0];
var itemDescriptor = Activator.CreateInstance(itemDescriptorType, args: [itemId, hq])!;
var queuedQuantity = itemQuantities[itemDescriptor];
_pluginLog.Verbose($"Retrieved quantity: {queuedQuantity}");
if (queuedQuantity == null)
return;
var boxType = queuedQuantity.GetType();
var valueField = boxType.GetField("Value", BindingFlags.Public | BindingFlags.Instance)!;
_pluginLog.Information($"Adding {itemDescriptor} to queue");
valueField.SetValue(queuedQuantity, quantity);
}
public void ClearQueue()
{
if (!TryGetItemQuantities(out IDalamudPlugin? _, out IDictionary? itemQuantities))
throw new InvalidOperationException("Could not retrieve item quantities");
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;
} }
} }
} }

View File

@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk"> <Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup> <PropertyGroup>
<TargetFramework>net8.0-windows</TargetFramework> <TargetFramework>net8.0-windows</TargetFramework>
<Version>0.4</Version> <Version>0.5</Version>
<LangVersion>12</LangVersion> <LangVersion>12</LangVersion>
<Nullable>enable</Nullable> <Nullable>enable</Nullable>
<CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies> <CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>

View File

@ -4,7 +4,6 @@ using Dalamud.Plugin;
using Dalamud.Plugin.Services; using Dalamud.Plugin.Services;
using ECommons; using ECommons;
using KitchenSink.Commands; using KitchenSink.Commands;
using LLib;
namespace KitchenSink; namespace KitchenSink;
@ -18,15 +17,13 @@ internal sealed class KitchenSinkPlugin : IDalamudPlugin
public KitchenSinkPlugin(DalamudPluginInterface pluginInterface, ICommandManager commandManager, public KitchenSinkPlugin(DalamudPluginInterface pluginInterface, ICommandManager commandManager,
IClientState clientState, IChatGui chatGui, INotificationManager notificationManager, IDtrBar dtrBar, IClientState clientState, IChatGui chatGui, INotificationManager notificationManager, IDtrBar dtrBar,
ICondition condition, IPluginLog pluginLog, IFramework framework) ICondition condition, IPluginLog pluginLog)
{ {
DalamudReflector reflector = new DalamudReflector(pluginInterface, framework, pluginLog);
ECommonsMain.Init(pluginInterface, this); ECommonsMain.Init(pluginInterface, this);
_autoRetainerApi = new AutoRetainerApi(); _autoRetainerApi = new AutoRetainerApi();
_characterSwitch = new CharacterSwitch(_autoRetainerApi, commandManager, clientState, chatGui, _characterSwitch = new CharacterSwitch(_autoRetainerApi, commandManager, clientState, chatGui,
notificationManager, dtrBar, condition, pluginLog); notificationManager, dtrBar, condition, pluginLog);
_dropboxQueue = new DropboxQueue(reflector, commandManager, chatGui, pluginLog); _dropboxQueue = new DropboxQueue(pluginInterface, commandManager, chatGui, pluginLog);
} }
public void Dispose() public void Dispose()