文本配置器添加只读读取;添加桌面版连接参数 (#111)

This commit is contained in:
milimoe 2025-03-07 00:38:04 +08:00 committed by GitHub
parent 9e55587ea0
commit 99493f4e73
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 124 additions and 81 deletions

View File

@ -19,6 +19,11 @@ namespace Milimoe.FunGame.Core.Api.Utility
/// </summary>
public static string RootPath { get; set; } = "novels";
/// <summary>
/// 是否允许 <see cref="SaveConfig"/>
/// </summary>
public bool Readonly { get; set; } = false;
/// <summary>
/// 模组的名称
/// </summary>
@ -29,6 +34,12 @@ namespace Milimoe.FunGame.Core.Api.Utility
/// </summary>
public string FileName { get; set; } = file_name;
/// <summary>
/// 断言方法字典<para/>
/// <see cref="NovelNode"/> 和 <see cref="NovelOption"/> 都有显示的条件,反序列化 json 文件时,会根据其名称来分配具体的断言方法
/// </summary>
public Dictionary<string, Func<bool>> Predicates { get; set; } = [];
/// <summary>
/// 使用索引器给指定key赋值不存在key会新增
/// </summary>
@ -62,29 +73,24 @@ namespace Milimoe.FunGame.Core.Api.Utility
/// </summary>
/// <param name="key"></param>
/// <param name="value"></param>
public new void Add(string key, NovelNode value)
{
if (value != null)
{
if (TryGetValue(key, out _)) base[key] = value;
else base.Add(key, value);
}
}
public new void Add(string key, NovelNode value) => base[key] = value;
/// <summary>
/// 从指定路径加载配置文件,并根据其文件名,转换为本框架所需的文件<para/>
/// <paramref name="copyToRootPath"/> 为 false 时将不会复制此文件至配置文件目录并且不允许 <see cref="SaveConfig"/><para/>
/// 需要注意:<paramref name="checkConflict"/> 用于检查加载的文件名是否在配置文件目录中已经存在<para/>
/// 如果不使用此检查,使用 <see cref="SaveConfig"/> 时可能会覆盖原有文件(程序目录/<see cref="RootPath"/>(通常是 novels)/<paramref name="novelName"/>/[所选的文件名].json
/// </summary>
/// <param name="path"></param>
/// <param name="novelName"></param>
/// <param name="copyToRootPath"></param>
/// <param name="checkConflict"></param>
/// <param name="predicates"></param>
/// <returns></returns>
/// <exception cref="FileNotFoundException" />
/// <exception cref="InvalidOperationException" />
/// <exception cref="InvalidDataException" />
public static NovelConfig LoadFrom(string path, string novelName, bool checkConflict = true, Dictionary<string, Func<bool>>? predicates = null)
public static NovelConfig LoadFrom(string path, string novelName, bool copyToRootPath = true, bool checkConflict = true, Dictionary<string, Func<bool>>? predicates = null)
{
if (!File.Exists(path))
{
@ -92,9 +98,12 @@ namespace Milimoe.FunGame.Core.Api.Utility
}
string fileName = Path.GetFileNameWithoutExtension(path);
NovelConfig config;
if (copyToRootPath)
{
string dpath = $@"{AppDomain.CurrentDomain.BaseDirectory}{RootPath}/{novelName}";
string fpath = $@"{dpath}/{fileName}.json";
if (checkConflict && File.Exists(fpath))
{
throw new InvalidOperationException($"文件 {fileName}.json 已存在,请先重命名。");
@ -111,9 +120,20 @@ namespace Milimoe.FunGame.Core.Api.Utility
}
File.WriteAllText(fpath, json, General.DefaultEncoding);
// 从新文件加载配置
NovelConfig config = new(novelName, fileName);
config = new(novelName, fileName);
config.LoadConfig(predicates);
}
else
{
// 从新文件加载配置
config = new(novelName, fileName)
{
Readonly = true
};
string json = File.ReadAllText(path, General.DefaultEncoding);
Dictionary<string, NovelNode> dict = NetworkUtility.JsonDeserialize<Dictionary<string, NovelNode>>(json) ?? [];
config.LoadConfig(dict, predicates);
}
return config;
}
@ -130,6 +150,25 @@ namespace Milimoe.FunGame.Core.Api.Utility
{
string json = File.ReadAllText(fpath, General.DefaultEncoding);
Dictionary<string, NovelNode> dict = NetworkUtility.JsonDeserialize<Dictionary<string, NovelNode>>(json) ?? [];
LoadConfig(dict, predicates);
}
}
/// <summary>
/// 根据断言方法字典重新生成小说的字典
/// </summary>
/// <param name="dict"></param>
/// <param name="predicates"></param>
private void LoadConfig(Dictionary<string, NovelNode> dict, Dictionary<string, Func<bool>>? predicates = null)
{
if (predicates != null)
{
foreach (string key in predicates.Keys)
{
// 直接覆盖
Predicates[key] = predicates[key];
}
}
Clear();
foreach (string key in dict.Keys)
{
@ -149,13 +188,13 @@ namespace Milimoe.FunGame.Core.Api.Utility
}
}
}
if (predicates != null)
if (Predicates != null)
{
if (obj.Values.TryGetValue(nameof(NovelNode.AndPredicates), out object? value2) && value2 is List<string> aps)
{
foreach (string ap in aps)
{
if (predicates.TryGetValue(ap, out Func<bool>? value3) && value3 != null)
if (Predicates.TryGetValue(ap, out Func<bool>? value3) && value3 != null)
{
obj.AndPredicates[ap] = value3;
}
@ -165,7 +204,7 @@ namespace Milimoe.FunGame.Core.Api.Utility
{
foreach (string op in ops)
{
if (predicates.TryGetValue(op, out Func<bool>? value3) && value3 != null)
if (Predicates.TryGetValue(op, out Func<bool>? value3) && value3 != null)
{
obj.OrPredicates[op] = value3;
}
@ -184,13 +223,13 @@ namespace Milimoe.FunGame.Core.Api.Utility
}
}
}
if (predicates != null)
if (Predicates != null)
{
if (option.Values.TryGetValue(nameof(NovelNode.AndPredicates), out object? value3) && value3 is List<string> aps)
{
foreach (string ap in aps)
{
if (predicates.TryGetValue(ap, out Func<bool>? value4) && value4 != null)
if (Predicates.TryGetValue(ap, out Func<bool>? value4) && value4 != null)
{
option.AndPredicates[ap] = value4;
}
@ -200,7 +239,7 @@ namespace Milimoe.FunGame.Core.Api.Utility
{
foreach (string op in ops)
{
if (predicates.TryGetValue(op, out Func<bool>? value4) && value4 != null)
if (Predicates.TryGetValue(op, out Func<bool>? value4) && value4 != null)
{
option.OrPredicates[op] = value4;
}
@ -210,13 +249,16 @@ namespace Milimoe.FunGame.Core.Api.Utility
}
}
}
}
/// <summary>
/// 将配置保存到配置文件。调用此方法会覆盖原有的.json请注意备份
/// </summary>
public void SaveConfig()
{
if (Readonly)
{
return;
}
string json = NetworkUtility.JsonSerialize((Dictionary<string, NovelNode>)this);
string dpath = $@"{AppDomain.CurrentDomain.BaseDirectory}{RootPath}/{NovelName}";
string fpath = $@"{dpath}/{FileName}.json";

View File

@ -90,6 +90,7 @@ namespace Milimoe.FunGame.Core.Api.Utility
WriteINI("Server", "Key", "");
WriteINI("Server", "Status", "1");
WriteINI("Server", "BannedList", "");
WriteINI("Server", "UseDesktopParameters", "true");
/**
* ServerMail
*/