- add: config invoke
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user