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] { get => base[key]; set { if (value != null) 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 object? GetValue(string key) { if (base.TryGetValue(key, out object? value) && value != null) { return value; } return null; } /// /// 使用泛型获取指定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, General.DefaultEncoding); 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); } } }