- add: config invoke

This commit is contained in:
2025-06-19 21:12:42 +03:00
parent 73682acbab
commit 10d317c867
12 changed files with 308 additions and 96 deletions

View File

@@ -8,6 +8,8 @@ namespace Nebula.Shared.Services;
public class ConVar<T>
{
internal ConfigurationService.OnConfigurationChangedDelegate<T?>? OnValueChanged;
public ConVar(string name, T? defaultValue = default)
{
Name = name ?? throw new ArgumentNullException(nameof(name));
@@ -45,11 +47,16 @@ public class ConfigurationService
ConfigurationApi = fileService.CreateFileApi("config");
}
private void SubscribeVarChanged<T>(ConVar<T> convar, OnConfigurationChangedDelegate<T> @delegate)
public ConfigChangeSubscriberDisposable<T> SubscribeVarChanged<T>(ConVar<T> convar, OnConfigurationChangedDelegate<T?> @delegate, bool invokeNow = false)
{
convar.OnValueChanged += @delegate;
if (invokeNow)
{
@delegate(GetConfigValue(convar));
}
return new ConfigChangeSubscriberDisposable<T>(convar, @delegate);
}
public T? GetConfigValue<T>(ConVar<T> conVar)
{
@@ -107,8 +114,12 @@ public class ConfigurationService
public void SetConfigValue<T>(ConVar<T> conVar, T value)
{
ArgumentNullException.ThrowIfNull(conVar);
if (value == null) throw new ArgumentNullException(nameof(value));
if (value == null)
{
ConfigurationApi.Remove(GetFileName(conVar));
conVar.OnValueChanged?.Invoke(conVar.DefaultValue);
return;
}
if (!conVar.Type.IsInstanceOfType(value))
{
@@ -129,6 +140,7 @@ public class ConfigurationService
stream.Seek(0, SeekOrigin.Begin);
ConfigurationApi.Save(GetFileName(conVar), stream);
conVar.OnValueChanged?.Invoke(value);
}
catch (Exception e)
{
@@ -140,4 +152,20 @@ public class ConfigurationService
{
return $"{conVar.Name}.json";
}
}
public sealed class ConfigChangeSubscriberDisposable<T> : IDisposable
{
private readonly ConVar<T> _convar;
private readonly ConfigurationService.OnConfigurationChangedDelegate<T> _delegate;
public ConfigChangeSubscriberDisposable(ConVar<T> convar, ConfigurationService.OnConfigurationChangedDelegate<T> @delegate)
{
_convar = convar;
_delegate = @delegate;
}
public void Dispose()
{
_convar.OnValueChanged -= _delegate;
}
}

View File

@@ -72,17 +72,19 @@ internal class ServiceLogger : ILogger
if (!DebugService.DoFileLog) return;
if(!Directory.Exists(directory)) Directory.CreateDirectory(directory);
_path = Path.Combine(directory, $"{Category}.log");
_fileStream = File.Open(Path.Combine(directory,$"{Category}.log"), FileMode.Create, FileAccess.Write, FileShare.Read);
_streamWriter = new StreamWriter(_fileStream);
File.Create(_path).Dispose();
}
public string Category { get; init; }
private Dictionary<string, ServiceLogger> Childs { get; init; } = new();
private readonly FileStream _fileStream;
private readonly StreamWriter _streamWriter;
private FileStream? _fileStream;
private StreamWriter? _streamWriter;
private readonly string _path;
public ServiceLogger GetLogger(string category)
{
@@ -109,17 +111,25 @@ internal class ServiceLogger : ILogger
private void LogToFile(string output)
{
if(!DebugService.DoFileLog) return;
_fileStream = File.Open(_path, FileMode.Append, FileAccess.Write, FileShare.ReadWrite);
_streamWriter = new StreamWriter(_fileStream);
Root?.LogToFile(output);
_streamWriter.WriteLine(output);
_streamWriter.Flush();
_streamWriter.Dispose();
_fileStream.Dispose();
_fileStream = null;
_streamWriter = null;
}
public void Dispose()
{
if (!DebugService.DoFileLog) return;
_streamWriter.Dispose();
_fileStream.Dispose();
_streamWriter?.Dispose();
_fileStream?.Dispose();
foreach (var (_, child) in Childs)
{
child.Dispose();