qstbak/LLib/LLib/DataManagerExtensions.cs
2026-08-17 20:29:32 +10:00

94 lines
3.2 KiB
C#

using System;
using System.Linq;
using System.Text.RegularExpressions;
using Dalamud.Plugin.Services;
using Lumina.Excel;
using Lumina.Text.Payloads;
using Lumina.Text.ReadOnly;
namespace LLib;
public static class DataManagerExtensions
{
public static ReadOnlySeString? GetSeString<T>(this IDataManager dataManager, string key) where T : struct, IQuestDialogueText, IExcelRow<T>
{
ArgumentNullException.ThrowIfNull(dataManager, "dataManager");
return dataManager.GetExcelSheet<T>().Cast<T?>().FirstOrDefault((T? x) => x.Value.Key == key)?.Value;
}
public static string? GetString<T>(this IDataManager dataManager, string key, IPluginLog? pluginLog) where T : struct, IQuestDialogueText, IExcelRow<T>
{
return dataManager.GetSeString<T>(key)?.WithCertainMacroCodeReplacements();
}
public static Regex? GetRegex<T>(this IDataManager dataManager, string key, IPluginLog? pluginLog) where T : struct, IQuestDialogueText, IExcelRow<T>
{
ReadOnlySeString? seString = dataManager.GetSeString<T>(key);
if (!seString.HasValue)
{
return null;
}
return seString.ToRegex();
}
public static ReadOnlySeString? GetSeString<T>(this IDataManager dataManager, uint rowId, Func<T, ReadOnlySeString?> mapper) where T : struct, IExcelRow<T>
{
ArgumentNullException.ThrowIfNull(dataManager, "dataManager");
ArgumentNullException.ThrowIfNull(mapper, "mapper");
T? rowOrDefault = dataManager.GetExcelSheet<T>().GetRowOrDefault(rowId);
if (!rowOrDefault.HasValue)
{
return null;
}
return mapper(rowOrDefault.Value);
}
public static string? GetString<T>(this IDataManager dataManager, uint rowId, Func<T, ReadOnlySeString?> mapper, IPluginLog? pluginLog = null) where T : struct, IExcelRow<T>
{
return dataManager.GetSeString(rowId, mapper)?.WithCertainMacroCodeReplacements();
}
public static Regex? GetRegex<T>(this IDataManager dataManager, uint rowId, Func<T, ReadOnlySeString?> mapper, IPluginLog? pluginLog = null) where T : struct, IExcelRow<T>
{
ReadOnlySeString? seString = dataManager.GetSeString(rowId, mapper);
if (!seString.HasValue)
{
return null;
}
return seString.ToRegex();
}
public static Regex? GetRegex<T>(this T excelRow, Func<T, ReadOnlySeString?> mapper, IPluginLog? pluginLog) where T : struct, IExcelRow<T>
{
ArgumentNullException.ThrowIfNull(mapper, "mapper");
ReadOnlySeString? text = mapper(excelRow);
if (!text.HasValue)
{
return null;
}
return text.ToRegex();
}
public static Regex ToRegex(this ReadOnlySeString? text)
{
ArgumentNullException.ThrowIfNull(text, "text");
return new Regex(string.Join("", text.Value.Select((ReadOnlySePayload payload) => (payload.Type == ReadOnlySePayloadType.Text) ? Regex.Escape(payload.ToString()) : "(.*)")), RegexOptions.Compiled);
}
public static string WithCertainMacroCodeReplacements(this ReadOnlySeString text)
{
return string.Join("", text.Select((ReadOnlySePayload payload) => payload.Type switch
{
ReadOnlySePayloadType.Text => payload.ToString(),
ReadOnlySePayloadType.Macro => payload.MacroCode switch
{
MacroCode.NewLine => Environment.NewLine,
MacroCode.NonBreakingSpace => " ",
MacroCode.Hyphen => "-",
MacroCode.SoftHyphen => "",
_ => payload.ToString(),
},
_ => payload.ToString(),
}));
}
}