using Dalamud.Plugin; using Dalamud.Plugin.Ipc; using Dalamud.Plugin.Ipc.Exceptions; using Microsoft.Extensions.Logging; namespace Questionable.External; internal sealed class ArtisanIpc { private readonly ILogger _logger; private readonly ICallGateSubscriber _craftItem; private readonly ICallGateSubscriber _isBusy; private readonly ICallGateSubscriber _getEnduranceStatus; private readonly ICallGateSubscriber _setEnduranceStatus; private readonly ICallGateSubscriber _getStopRequest; private readonly ICallGateSubscriber _setStopRequest; public ArtisanIpc(IDalamudPluginInterface pluginInterface, ILogger logger) { _logger = logger; _craftItem = pluginInterface.GetIpcSubscriber("Artisan.CraftItem"); _isBusy = pluginInterface.GetIpcSubscriber("Artisan.IsBusy"); _getEnduranceStatus = pluginInterface.GetIpcSubscriber("Artisan.GetEnduranceStatus"); _setEnduranceStatus = pluginInterface.GetIpcSubscriber("Artisan.SetEnduranceStatus"); _getStopRequest = pluginInterface.GetIpcSubscriber("Artisan.GetStopRequest"); _setStopRequest = pluginInterface.GetIpcSubscriber("Artisan.SetStopRequest"); } public bool IsAvailable() { try { _isBusy.InvokeFunc(); return true; } catch (IpcError) { return false; } } public bool IsBusy() { try { return _isBusy.InvokeFunc(); } catch (IpcError exception) { _logger.LogError(exception, "Unable to check Artisan busy status"); return false; } } public bool IsCrafting() { try { return _isBusy.InvokeFunc() || _getEnduranceStatus.InvokeFunc(); } catch (IpcError exception) { _logger.LogError(exception, "Unable to check Artisan crafting status"); return false; } } public bool CraftItem(ushort recipeId, int quantity) { try { _logger.LogDebug("Attempting to craft {Quantity} items with recipe {RecipeId} with Artisan", quantity, recipeId); _craftItem.InvokeAction(recipeId, quantity); return true; } catch (IpcError exception) { _logger.LogError(exception, "Unable to craft items"); return false; } } public void SetEnduranceStatus(bool enabled) { try { _setEnduranceStatus.InvokeAction(enabled); } catch (IpcError exception) { _logger.LogError(exception, "Unable to set Artisan endurance status"); } } public bool GetStopRequest() { try { return _getStopRequest.InvokeFunc(); } catch (IpcError exception) { _logger.LogError(exception, "Unable to check Artisan stop request"); return false; } } public void SetStopRequest(bool stop) { try { _setStopRequest.InvokeAction(stop); } catch (IpcError exception) { _logger.LogError(exception, "Unable to set Artisan stop request"); } } }