winmr-api/Services/Scanners/AbstractScanner.cs
2025-07-03 15:22:40 +03:00

67 lines
1.8 KiB
C#

// File: Services/Scanners/AbstractScanner.cs
using WebmrAPI.Utils;
namespace WebmrAPI.Services.Scanners
{
public abstract class AbstractScanner<T> : IScannable where T : new()
{
internal IScanProvider _provider;
LazyConcurrentContainer<T> _container;
abstract public ScanTarget Target { get; }
internal IScanProvider Provider { get => _provider; }
internal LazyConcurrentContainer<T> Container { get => _container; }
internal int Timeout { get => _provider.GetTimeout(Target); }
internal bool IsActual()
{
return (DateTime.UtcNow - Container.LastUpdate).TotalSeconds < Timeout;
}
internal bool GetFromCacheOrNew(long key, out T res)
{
var cache = Container.Container;
bool result = true;
T? found;
if (cache == null || !cache.TryGetValue(key, out found))
{
result = false;
found = new();
}
res = found;
return result;
}
abstract internal bool Scan(out Dictionary<long, T>? data);
public void Scan()
{
bool success = false;
if (Container.Container != null && IsActual()) return;
try
{
if (success = Scan(out var data))
{
Container.SetContainer(data);
}
}
finally
{
if (!success)
{
Container.CleanContainer();
}
}
}
public AbstractScanner(IScanProvider scanProvider, LazyConcurrentContainer<T> container)
{
_provider = scanProvider;
_container = container;
}
}
}