using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using System.Linq;
+using System.Text;
using Dalamud.Game.ClientState.Conditions;
using Dalamud.Game.ClientState.Keys;
using Dalamud.Game.Gui.Toast;
using Dalamud.Game.Text.SeStringHandling;
using Dalamud.Plugin.Services;
using FFXIVClientStructs.FFXIV.Client.Game;
+using Lumina.Excel.Sheets;
using Microsoft.Extensions.Logging;
using Questionable.Controller.Steps;
using Questionable.Controller.Steps.Interactions;
}
}
+ private const char ClipboardSeparator = ';';
+ public string ExportQuestPriority()
+ {
+ return string.Join(ClipboardSeparator, ManualPriorityQuests.Select(x => x.Id.ToString()));
+ }
+
+ public void ClearQuestPriority()
+ {
+ ManualPriorityQuests.Clear();
+ }
+
+ public bool AddQuestPriority(ElementId elementId)
+ {
+ if (_questRegistry.TryGetQuest(elementId, out Quest? quest) && !ManualPriorityQuests.Contains(quest))
+ ManualPriorityQuests.Add(quest);
+ return true;
+ }
+
+ public bool InsertQuestPriority(int index, ElementId elementId)
+ {
+ try
+ {
+ if (_questRegistry.TryGetQuest(elementId, out Quest? quest) && !ManualPriorityQuests.Contains(quest))
+ ManualPriorityQuests.Insert(index, quest);
+ return true;
+ }
+ catch (Exception e) {
+ _logger.LogError(e, "Failed to insert quest in priority list");
+ _chatGui.PrintError("Failed to insert quest in priority list, please check /xllog for details.", CommandHandler.MessageTag, CommandHandler.TagColor);
+ return false;
+ }
+ }
+
public bool WasLastTaskUpdateWithin(TimeSpan timeSpan)
{
_logger.LogInformation("Last update: {Update}", _lastTaskUpdate);
using System.Collections.Generic;
using System.Linq;
using System.Numerics;
+using Dalamud.Game.ClientState.Objects;
using Dalamud.Plugin;
using Dalamud.Plugin.Ipc;
using JetBrains.Annotations;
private const string IpcStartSingleQuest = "Questionable.StartSingleQuest";
private const string IpcIsQuestLocked = "Questionable.IsQuestLocked";
private const string IpcImportQuestPriority = "Questionable.ImportQuestPriority";
+ private const string IpcClearQuestPriority = "Questionable.ClearQuestPriority";
+ private const string IpcAddQuestPriority = "Questionable.AddQuestPriority";
+ private const string IpcInsertQuestPriority = "Questionable.InsertQuestPriority";
+ private const string IpcExportQuestPriority = "Questionable.ExportQuestPriority";
private readonly QuestController _questController;
private readonly QuestRegistry _questRegistry;
private readonly QuestFunctions _questFunctions;
+ private readonly PriorityWindow _priorityWindow;
private readonly ICallGateProvider<bool> _isRunning;
private readonly ICallGateProvider<string?> _getCurrentQuestId;
private readonly ICallGateProvider<string, bool> _startSingleQuest;
private readonly ICallGateProvider<string, bool> _isQuestLocked;
private readonly ICallGateProvider<string, bool> _importQuestPriority;
+ private readonly ICallGateProvider<string, bool> _addQuestPriority;
+ private readonly ICallGateProvider<bool> _clearQuestPriority;
+ private readonly ICallGateProvider<int, string, bool> _insertQuestPriority;
+ private readonly ICallGateProvider<string> _exportQuestPriority;
public QuestionableIpc(
QuestController questController,
EventInfoComponent eventInfoComponent,
QuestRegistry questRegistry,
QuestFunctions questFunctions,
+ PriorityWindow priorityWindow,
IDalamudPluginInterface pluginInterface)
{
_questController = questController;
_questRegistry = questRegistry;
_questFunctions = questFunctions;
+ _priorityWindow = priorityWindow;
_isRunning = pluginInterface.GetIpcProvider<bool>(IpcIsRunning);
_isRunning.RegisterFunc(() =>
_startSingleQuest = pluginInterface.GetIpcProvider<string, bool>(IpcStartSingleQuest);
_startSingleQuest.RegisterFunc(questId => StartQuest(questId, true));
- //_startSingleQuest.RegisterFunc((questId) => StartQuest(questController, questRegistry, questId, true));
_isQuestLocked = pluginInterface.GetIpcProvider<string, bool>(IpcIsQuestLocked);
_isQuestLocked.RegisterFunc((questId) => IsQuestLocked(questId));
_importQuestPriority = pluginInterface.GetIpcProvider<string, bool>(IpcImportQuestPriority);
_importQuestPriority.RegisterFunc((encodedQuestPriority) => ImportQuestPriority(encodedQuestPriority));
+
+ _importQuestPriority = pluginInterface.GetIpcProvider<string, bool>(IpcAddQuestPriority);
+ _importQuestPriority.RegisterFunc((questId) => AddQuestPriority(questId));
+
+ _clearQuestPriority = pluginInterface.GetIpcProvider<bool>(IpcClearQuestPriority);
+ _clearQuestPriority.RegisterFunc(ClearQuestPriority);
+
+ _insertQuestPriority = pluginInterface.GetIpcProvider<int, string, bool>(IpcInsertQuestPriority);
+ _insertQuestPriority.RegisterFunc((index, questId) => InsertQuestPriority(index, questId));
+
+ _exportQuestPriority = pluginInterface.GetIpcProvider<string>(IpcExportQuestPriority);
+ _exportQuestPriority.RegisterFunc(_priorityWindow.EncodeQuestPriority);
}
private bool StartQuest(string questId, bool single)
private bool ImportQuestPriority(string encodedQuestPriority)
{
- List<ElementId> questElements = PriorityWindow.ParseQuestPriority(encodedQuestPriority);
+ List<ElementId> questElements = PriorityWindow.DecodeQuestPriority(encodedQuestPriority);
_questController.ImportQuestPriority(questElements);
return true;
}
+ private bool ClearQuestPriority()
+ {
+ _questController.ClearQuestPriority();
+ return true;
+ }
+
+ private bool AddQuestPriority(string questId)
+ {
+ if (ElementId.TryFromString(questId, out var elementId) && elementId != null &&
+ _questRegistry.TryGetQuest(elementId, out var quest))
+ {
+ return _questController.AddQuestPriority(elementId);
+ }
+ return true;
+ }
+
+ private bool InsertQuestPriority(int index, string questId)
+ {
+ if (ElementId.TryFromString(questId, out var elementId) && elementId != null &&
+ _questRegistry.TryGetQuest(elementId, out var quest))
+ {
+ return _questController.InsertQuestPriority(index, elementId);
+ }
+ return true;
+ }
+
public void Dispose()
{
_startSingleQuest.UnregisterFunc();
_questController.ManualPriorityQuests.RemoveAll(q => _questFunctions.IsQuestComplete(q.Id));
ImGui.SameLine();
if (ImGuiComponents.IconButtonWithText(FontAwesomeIcon.Trash, "Clear"))
- _questController.ManualPriorityQuests.Clear();
+ _questController.ClearQuestPriority();
ImGui.EndDisabled();
ImGui.Spacing();
private List<ElementId> ParseClipboardItems()
{
string? clipboardText = GetClipboardText();
- return ParseQuestPriority(clipboardText);
+ return DecodeQuestPriority(clipboardText);
}
- public static List<ElementId> ParseQuestPriority(string? clipboardText)
+ public static List<ElementId> DecodeQuestPriority(string? clipboardText)
{
List<ElementId> clipboardItems = new List<ElementId>();
try
return clipboardItems;
}
- private void ExportToClipboard()
+ public string EncodeQuestPriority()
{
- string clipboardText = ClipboardPrefix + Convert.ToBase64String(Encoding.UTF8.GetBytes(
+ return ClipboardPrefix + Convert.ToBase64String(Encoding.UTF8.GetBytes(
string.Join(ClipboardSeparator, _questController.ManualPriorityQuests.Select(x => x.Id.ToString()))));
+ }
+
+ private void ExportToClipboard()
+ {
+ string clipboardText = EncodeQuestPriority();
ImGui.SetClipboardText(clipboardText);
_chatGui.Print("Copied quests to clipboard.", CommandHandler.MessageTag, CommandHandler.TagColor);
}