Files
Sinmai-Assist/Config/ConfigManager.cs
2025-10-13 18:18:59 +08:00

107 lines
3.1 KiB
C#

using System;
using System.IO;
using System.Linq;
using System.Reflection;
using MelonLoader;
using YamlDotNet.Core;
using YamlDotNet.RepresentationModel;
using YamlDotNet.Serialization;
using YamlDotNet.Serialization.NamingConventions;
namespace SinmaiAssist.Config
{
public class ConfigManager<T> where T : new()
{
private readonly string _configPath;
private T _config;
private readonly IYamlTypeConverter _customConverter;
public ConfigManager(string configPath = "config.yml", IYamlTypeConverter customConverter = null)
{
_configPath = configPath;
_customConverter = customConverter;
InitConfig();
}
private void InitConfig()
{
try
{
if (!File.Exists(_configPath))
{
_config = new T();
SaveConfig();
MelonLogger.Msg($"Create Default Config '{_configPath}' ");
return;
}
LoadConfig();
}
catch (YamlException ex)
{
MelonLogger.Error($"Load Config '{_configPath}' Failed: \n{ex.Message}");
MelonLogger.Warning($"Your Config is not valid, please delete it and restart the game.");
throw;
}
catch (Exception ex)
{
MelonLogger.Error($"Init Config '{_configPath}' Failed: \n{ex.Message}");
throw;
}
}
public T GetConfig()
{
if (_config == null)
{
throw new InvalidOperationException("Configuration is not initialized.");
}
return _config;
}
private ISerializer CreateSerializer()
{
var builder = new SerializerBuilder()
.WithNamingConvention(CamelCaseNamingConvention.Instance);
if (_customConverter != null)
{
builder = builder.WithTypeConverter(_customConverter);
}
return builder.Build();
}
private IDeserializer CreateDeserializer()
{
var builder = new DeserializerBuilder()
.WithNamingConvention(CamelCaseNamingConvention.Instance);
if (_customConverter != null)
{
builder = builder.WithTypeConverter(_customConverter);
}
return builder.Build();
}
private void SaveConfig()
{
var directory = Path.GetDirectoryName(_configPath);
if (!Directory.Exists(directory))
Directory.CreateDirectory(directory);
var serializer = CreateSerializer();
var yaml = serializer.Serialize(_config);
File.WriteAllText(_configPath, yaml);
}
private void LoadConfig()
{
var deserializer = CreateDeserializer();
var yaml = File.ReadAllText(_configPath);
_config = deserializer.Deserialize<T>(yaml);
}
}
}