diff --git a/DataManagerExtensions.cs b/DataManagerExtensions.cs new file mode 100644 index 0000000..dd80f29 --- /dev/null +++ b/DataManagerExtensions.cs @@ -0,0 +1,61 @@ +using System; +using System.Linq; +using System.Text.RegularExpressions; +using Dalamud.Plugin.Services; +using Lumina.Excel; +using Lumina.Excel.CustomSheets; +using Lumina.Text; +using Lumina.Text.Payloads; + +namespace LLib; + +public static class DataManagerExtensions +{ + public static string GetDialogue(IDataManager dataManager, string key, IPluginLog? pluginLog) + where T : QuestDialogueText + { + string result = dataManager.GetExcelSheet()! + .Single(x => x.Key == key) + .Value + .ToString(); + pluginLog?.Verbose($"{typeof(T).Name}.{key} => {result}"); + return result; + } + + public static SeString? GetSeString(this IDataManager dataManager, uint rowId, Func mapper) + where T : ExcelRow + { + var row = dataManager.GetExcelSheet()?.GetRow(rowId); + if (row == null) + return null; + + return mapper(row); + } + + public static string? GetString(this IDataManager dataManager, uint rowId, Func mapper, IPluginLog? pluginLog = null) + where T : ExcelRow + { + string? text = GetSeString(dataManager, rowId, mapper)?.ToString(); + + pluginLog?.Verbose($"{typeof(T).Name}.{rowId} => {text}"); + return text; + } + + public static Regex? GetRegex(this IDataManager dataManager, uint rowId, Func mapper, IPluginLog? pluginLog = null) + where T : ExcelRow + { + SeString? text = GetSeString(dataManager, rowId, mapper); + if (text == null) + return null; + + string regex = string.Join("", text.Payloads.Select(payload => + { + if (payload is TextPayload) + return Regex.Escape(payload.RawString); + else + return ".*"; + })); + pluginLog?.Verbose($"{typeof(T).Name}.{rowId} => /{regex}/"); + return new Regex(regex); + } +}