From 4f6914d835f464c4cbff4e3c41a6d8d631c108a7 Mon Sep 17 00:00:00 2001
From: Liza Carvelli <liza@carvel.li>
Date: Wed, 25 Sep 2024 20:07:40 +0200
Subject: [PATCH] Extend error toast handling

---
 .../Controller/GatheringController.cs         |  2 +-
 Questionable/Controller/MiniTaskController.cs | 30 +++++++++++++++++--
 Questionable/Controller/QuestController.cs    | 24 +--------------
 .../Steps/Gathering/MoveToLandingLocation.cs  |  4 ++-
 .../Controller/Steps/Shared/Gather.cs         | 11 ++++++-
 5 files changed, 43 insertions(+), 28 deletions(-)

diff --git a/Questionable/Controller/GatheringController.cs b/Questionable/Controller/GatheringController.cs
index 4af7ede2..8c7dedd4 100644
--- a/Questionable/Controller/GatheringController.cs
+++ b/Questionable/Controller/GatheringController.cs
@@ -51,7 +51,7 @@ internal sealed unsafe class GatheringController : MiniTaskController<GatheringC
         IServiceProvider serviceProvider,
         IDataManager dataManager,
         IPluginLog pluginLog)
-        : base(chatGui, condition, serviceProvider, logger)
+        : base(chatGui, condition, serviceProvider, dataManager, logger)
     {
         _movementController = movementController;
         _gatheringPointRegistry = gatheringPointRegistry;
diff --git a/Questionable/Controller/MiniTaskController.cs b/Questionable/Controller/MiniTaskController.cs
index 2a570eeb..4cf0828e 100644
--- a/Questionable/Controller/MiniTaskController.cs
+++ b/Questionable/Controller/MiniTaskController.cs
@@ -2,14 +2,18 @@
 using System.Collections.Generic;
 using System.Linq;
 using Dalamud.Game.ClientState.Conditions;
+using Dalamud.Game.Text.SeStringHandling;
 using Dalamud.Plugin.Services;
+using LLib;
+using Lumina.Excel.GeneratedSheets;
 using Microsoft.Extensions.DependencyInjection;
 using Microsoft.Extensions.Logging;
 using Questionable.Controller.Steps;
-using Questionable.Controller.Steps.Common;
 using Questionable.Controller.Steps.Interactions;
 using Questionable.Controller.Steps.Shared;
+using Questionable.Functions;
 using Questionable.Model.Questing;
+using Mount = Questionable.Controller.Steps.Common.Mount;
 
 namespace Questionable.Controller;
 
@@ -22,13 +26,17 @@ internal abstract class MiniTaskController<T>
     private readonly IServiceProvider _serviceProvider;
     private readonly ILogger<T> _logger;
 
+    private readonly string _actionCanceledText;
+
     protected MiniTaskController(IChatGui chatGui, ICondition condition, IServiceProvider serviceProvider,
-        ILogger<T> logger)
+        IDataManager dataManager, ILogger<T> logger)
     {
         _chatGui = chatGui;
         _logger = logger;
         _serviceProvider = serviceProvider;
         _condition = condition;
+
+        _actionCanceledText = dataManager.GetString<LogMessage>(1314, x => x.Text)!;
     }
 
     protected virtual void UpdateCurrentTask()
@@ -172,4 +180,22 @@ internal abstract class MiniTaskController<T>
         foreach (ITask task in _taskQueue.RemainingTasks)
             _logger.LogInformation("- {TaskName}", task);
     }
+
+    public void OnErrorToast(ref SeString message, ref bool isHandled)
+    {
+        if (_taskQueue.CurrentTaskExecutor is IToastAware toastAware)
+        {
+            if (toastAware.OnErrorToast(message))
+            {
+                isHandled = true;
+            }
+        }
+
+        if (!isHandled)
+        {
+            if (GameFunctions.GameStringEquals(_actionCanceledText, message.TextValue) &&
+                !_condition[ConditionFlag.InFlight])
+                InterruptQueueWithCombat();
+        }
+    }
 }
diff --git a/Questionable/Controller/QuestController.cs b/Questionable/Controller/QuestController.cs
index b736de2e..fc1734d3 100644
--- a/Questionable/Controller/QuestController.cs
+++ b/Questionable/Controller/QuestController.cs
@@ -43,8 +43,6 @@ internal sealed class QuestController : MiniTaskController<QuestController>, IDi
     private readonly TaskCreator _taskCreator;
     private readonly ILogger<QuestController> _logger;
 
-    private readonly string _actionCanceledText;
-
     private readonly object _progressLock = new();
 
     private QuestProgress? _startedQuest;
@@ -84,7 +82,7 @@ internal sealed class QuestController : MiniTaskController<QuestController>, IDi
         TaskCreator taskCreator,
         IServiceProvider serviceProvider,
         IDataManager dataManager)
-        : base(chatGui, condition, serviceProvider, logger)
+        : base(chatGui, condition, serviceProvider, dataManager, logger)
     {
         _clientState = clientState;
         _gameFunctions = gameFunctions;
@@ -105,8 +103,6 @@ internal sealed class QuestController : MiniTaskController<QuestController>, IDi
         _condition.ConditionChange += OnConditionChange;
         _toastGui.Toast += OnNormalToast;
         _toastGui.ErrorToast += OnErrorToast;
-
-        _actionCanceledText = dataManager.GetString<LogMessage>(1314, x => x.Text)!;
     }
 
     public EAutomationType AutomationType
@@ -809,24 +805,6 @@ internal sealed class QuestController : MiniTaskController<QuestController>, IDi
         _gatheringController.OnNormalToast(message);
     }
 
-    private void OnErrorToast(ref SeString message, ref bool isHandled)
-    {
-        if (_taskQueue.CurrentTaskExecutor is IToastAware toastAware)
-        {
-            if (toastAware.OnErrorToast(message))
-            {
-                isHandled = true;
-            }
-        }
-
-        if (!isHandled)
-        {
-            if (GameFunctions.GameStringEquals(_actionCanceledText, message.TextValue) &&
-                !_condition[ConditionFlag.InFlight])
-                InterruptQueueWithCombat();
-        }
-    }
-
     public void Dispose()
     {
         _toastGui.ErrorToast -= OnErrorToast;
diff --git a/Questionable/Controller/Steps/Gathering/MoveToLandingLocation.cs b/Questionable/Controller/Steps/Gathering/MoveToLandingLocation.cs
index 14552c21..38fa30cd 100644
--- a/Questionable/Controller/Steps/Gathering/MoveToLandingLocation.cs
+++ b/Questionable/Controller/Steps/Gathering/MoveToLandingLocation.cs
@@ -2,6 +2,7 @@
 using System.Linq;
 using System.Numerics;
 using Dalamud.Game.ClientState.Objects.Enums;
+using Dalamud.Game.Text.SeStringHandling;
 using Dalamud.Plugin.Services;
 using Microsoft.Extensions.Logging;
 using Questionable.Controller.Steps.Shared;
@@ -26,7 +27,7 @@ internal static class MoveToLandingLocation
         MoveTo.MoveExecutor moveExecutor,
         GameFunctions gameFunctions,
         IObjectTable objectTable,
-        ILogger<MoveToLandingLocationExecutor> logger) : TaskExecutor<Task>
+        ILogger<MoveToLandingLocationExecutor> logger) : TaskExecutor<Task>, IToastAware
     {
         private ITask _moveTask = null!;
 
@@ -57,5 +58,6 @@ internal static class MoveToLandingLocation
         }
 
         public override ETaskResult Update() => moveExecutor.Update();
+        public bool OnErrorToast(SeString message) => moveExecutor.OnErrorToast(message);
     }
 }
diff --git a/Questionable/Controller/Steps/Shared/Gather.cs b/Questionable/Controller/Steps/Shared/Gather.cs
index 52229aa1..ee5c50a0 100644
--- a/Questionable/Controller/Steps/Shared/Gather.cs
+++ b/Questionable/Controller/Steps/Shared/Gather.cs
@@ -2,6 +2,7 @@
 using System.Collections.Generic;
 using System.Linq;
 using Dalamud.Game.Text;
+using Dalamud.Game.Text.SeStringHandling;
 using Dalamud.Plugin.Services;
 using FFXIVClientStructs.FFXIV.Application.Network.WorkDefinitions;
 using FFXIVClientStructs.FFXIV.Client.Game;
@@ -124,7 +125,8 @@ internal static class Gather
         }
     }
 
-    internal sealed class StartGathering(GatheringController gatheringController) : TaskExecutor<GatheringTask>
+    internal sealed class StartGathering(GatheringController gatheringController) : TaskExecutor<GatheringTask>,
+        IToastAware
     {
         protected override bool Start()
         {
@@ -140,6 +142,13 @@ internal static class Gather
 
             return ETaskResult.StillRunning;
         }
+
+        public bool OnErrorToast(SeString message)
+        {
+            bool isHandled = false;
+            gatheringController.OnErrorToast(ref message, ref isHandled);
+            return isHandled;
+        }
     }
 
     /// <summary>