2023-02-08 23:53:42 +00:00
|
|
|
|
using System;
|
|
|
|
|
|
|
|
|
|
namespace SharpChat.Config {
|
|
|
|
|
public class CachedValue<T> {
|
|
|
|
|
private IConfig Config { get; }
|
|
|
|
|
private string Name { get; }
|
|
|
|
|
private TimeSpan Lifetime { get; }
|
|
|
|
|
private T Fallback { get; }
|
2023-02-10 06:07:59 +00:00
|
|
|
|
private object ConfigAccess { get; } = new();
|
2023-02-08 23:53:42 +00:00
|
|
|
|
|
|
|
|
|
private object CurrentValue { get; set; }
|
|
|
|
|
private DateTimeOffset LastRead { get; set; }
|
|
|
|
|
|
|
|
|
|
public T Value {
|
|
|
|
|
get {
|
2023-02-10 06:07:59 +00:00
|
|
|
|
lock(ConfigAccess) { // this lock doesn't really make sense since it doesn't affect other config calls
|
2023-02-08 23:53:42 +00:00
|
|
|
|
DateTimeOffset now = DateTimeOffset.Now;
|
|
|
|
|
if((now - LastRead) >= Lifetime) {
|
|
|
|
|
LastRead = now;
|
|
|
|
|
CurrentValue = Config.ReadValue(Name, Fallback);
|
|
|
|
|
Logger.Debug($"Read {Name} ({CurrentValue})");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return (T)CurrentValue;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static implicit operator T(CachedValue<T> val) => val.Value;
|
|
|
|
|
|
|
|
|
|
public CachedValue(IConfig config, string name, TimeSpan lifetime, T fallback) {
|
|
|
|
|
Config = config ?? throw new ArgumentNullException(nameof(config));
|
|
|
|
|
Name = name ?? throw new ArgumentNullException(nameof(name));
|
|
|
|
|
Lifetime = lifetime;
|
|
|
|
|
Fallback = fallback;
|
|
|
|
|
if(string.IsNullOrWhiteSpace(name))
|
|
|
|
|
throw new ArgumentException("Name cannot be empty.", nameof(name));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void Refresh() {
|
2023-02-10 06:07:59 +00:00
|
|
|
|
LastRead = DateTimeOffset.MinValue;
|
2023-02-08 23:53:42 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public override string ToString() {
|
|
|
|
|
return Value.ToString();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|