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);
}
}
}