diff --git a/Api/Utility/PluginConfig.cs b/Api/Utility/PluginConfig.cs new file mode 100644 index 0000000..83f9d86 --- /dev/null +++ b/Api/Utility/PluginConfig.cs @@ -0,0 +1,198 @@ +using System.Text; +using System.Text.Json; +using Milimoe.FunGame.Core.Library.Constant; + +namespace Milimoe.FunGame.Core.Api.Utility +{ + /// + /// 简易的插件配置文件生成器 + /// 仅支持部分基本类型(, , , )及其数组(List<long>, List<decimal>, List<string>, List<bool>long[], decimal[], string[], bool[]) + /// 文件会保存为:程序目录/configs//.json + /// + /// + /// 新建一个配置文件,文件会保存为:程序目录/configs//.json + /// + /// + /// + public class PluginConfig(string plugin_name, string file_name) : Dictionary + { + /// + /// 插件的名称 + /// + public string PluginName { get; set; } = plugin_name; + + /// + /// 配置文件的名称(后缀将是.json) + /// + public string FileName { get; set; } = file_name; + + /// + /// 使用索引器给指定key赋值,不存在key会新增 + /// + /// + /// + public new object this[string key] + { + set => Add(key, value); + } + + /// + /// 如果保存了对象,请使用此方法转换 + /// + /// + /// + public void Parse(string key) + { + if (TryGetValue(key, out object? value) && value != null) + { + T? instance = NetworkUtility.JsonDeserialize(value.ToString() ?? ""); + if (instance != null) + { + base[key] = instance; + } + } + } + + /// + /// 使用泛型获取指定key的value + /// + /// + /// + /// + public T? Get(string key) + { + if (TryGetValue(key, out object? value) && value != null) + { + return NetworkUtility.JsonDeserialize(value.ToString() ?? ""); + } + return default; + } + + /// + /// 添加一个配置,如果已存在key会覆盖 + /// + /// + /// + public new void Add(string key, object value) + { + if (value != null) + { + if (TryGetValue(key, out _)) base[key] = value; + else base.Add(key, value); + } + } + + /// + /// 从配置文件中读取配置。 + /// 注意:所有保存时为数组的对象都会变成对象,并且不支持类型 + /// + public void LoadConfig() + { + string dpath = $@"{AppDomain.CurrentDomain.BaseDirectory}configs/{PluginName}"; + string fpath = $@"{dpath}/{FileName}.json"; + if (!Directory.Exists(dpath)) + { + Directory.CreateDirectory(dpath); + } + if (File.Exists(fpath)) + { + string json = File.ReadAllText(fpath, General.DefaultEncoding); + Dictionary dict = NetworkUtility.JsonDeserialize>(json) ?? []; + Clear(); + foreach (string key in dict.Keys) + { + JsonElement obj = (JsonElement)dict[key]; + AddValue(key, obj); + } + } + } + + /// + /// 将配置保存到配置文件。调用此方法会覆盖原有的.json,请注意备份 + /// + public void SaveConfig() + { + string json = NetworkUtility.JsonSerialize((Dictionary)this); + string dpath = $@"{AppDomain.CurrentDomain.BaseDirectory}configs/{PluginName}"; + string fpath = $@"{dpath}/{FileName}.json"; + if (!Directory.Exists(dpath)) + { + Directory.CreateDirectory(dpath); + } + using StreamWriter writer = new(fpath, false, Encoding.Unicode); + writer.WriteLine(json); + writer.Flush(); + } + + /// + /// Json反序列化的方法 + /// + /// + /// + private void AddValue(string key, JsonElement obj) + { + switch (obj.ValueKind) + { + case JsonValueKind.Object: + base.Add(key, obj); + break; + case JsonValueKind.Number: + if (obj.ValueKind == JsonValueKind.Number && obj.TryGetInt64(out long longValue)) + { + base.Add(key, longValue); + } + else if (obj.ValueKind == JsonValueKind.Number && obj.TryGetDecimal(out decimal decValue)) + { + base.Add(key, decValue); + } + break; + case JsonValueKind.String: + base.Add(key, obj.GetString() ?? ""); + break; + case JsonValueKind.True: + case JsonValueKind.False: + base.Add(key, obj.GetBoolean()); + break; + case JsonValueKind.Array: + AddValues(key, obj.EnumerateArray()); + break; + } + } + + /// + /// Json数组反序列化的方法。不支持数组。 + /// + /// + /// + private void AddValues(string key, JsonElement.ArrayEnumerator obj) + { + List longList = []; + List decList = []; + List strList = []; + List bolList = []; + foreach (JsonElement array_e in obj) + { + if (array_e.ValueKind == JsonValueKind.Number && array_e.TryGetInt64(out long longValue)) + { + longList.Add(longValue); + } + else if (array_e.ValueKind == JsonValueKind.Number && array_e.TryGetDecimal(out decimal decValue)) + { + decList.Add(decValue); + } + else if (array_e.ValueKind == JsonValueKind.String) + { + strList.Add(array_e.GetString() ?? ""); + } + else if (array_e.ValueKind == JsonValueKind.True || array_e.ValueKind == JsonValueKind.False) + { + bolList.Add(array_e.GetBoolean()); + } + } + if (longList.Count > 0) base.Add(key, longList); + if (decList.Count > 0) base.Add(key, decList); + if (strList.Count > 0) base.Add(key, strList); + if (bolList.Count > 0) base.Add(key, bolList); + } + } +} diff --git a/Docs/FunGame.Core.xml b/Docs/FunGame.Core.xml index 1638394..198d554 100644 --- a/Docs/FunGame.Core.xml +++ b/Docs/FunGame.Core.xml @@ -780,6 +780,94 @@ Private JsonSerializerOptions + + + 简易的插件配置文件生成器 + 仅支持部分基本类型(, , , )及其数组(List<long>, List<decimal>, List<string>, List<bool>long[], decimal[], string[], bool[]) + 文件会保存为:程序目录/configs//.json + + + 新建一个配置文件,文件会保存为:程序目录/configs//.json + + + + + + + 简易的插件配置文件生成器 + 仅支持部分基本类型(, , , )及其数组(List<long>, List<decimal>, List<string>, List<bool>long[], decimal[], string[], bool[]) + 文件会保存为:程序目录/configs//.json + + + 新建一个配置文件,文件会保存为:程序目录/configs//.json + + + + + + + 插件的名称 + + + + + 配置文件的名称(后缀将是.json) + + + + + 使用索引器给指定key赋值,不存在key会新增 + + + + + + + 如果保存了对象,请使用此方法转换 + + + + + + + 使用泛型获取指定key的value + + + + + + + + 添加一个配置,如果已存在key会覆盖 + + + + + + + 从配置文件中读取配置。 + 注意:所有保存时为数组的对象都会变成对象,并且不支持类型 + + + + + 将配置保存到配置文件。调用此方法会覆盖原有的.json,请注意备份 + + + + + Json反序列化的方法 + + + + + + + Json数组反序列化的方法。不支持数组。 + + + + 已读取的插件列表