using Newtonsoft.Json.Linq; using System; namespace Kerobot.Services.GuildState { /// /// Contains a guild state object and other useful metadata in regards to it. /// class StateInfo : IDisposable { static readonly TimeSpan TimeUntilStale = new TimeSpan(0, 15, 0); /// /// Module-provided data. /// public object Data { get; } /// /// Hash of the JToken used to generate the data. In certain casaes, it is used to check /// if the configuration may be stale and needs to be reloaded. /// private readonly int _configHash; private DateTimeOffset _lastStaleCheck; public StateInfo(object data, int configHash) { Data = data; _configHash = configHash; _lastStaleCheck = DateTimeOffset.UtcNow; } public void Dispose() { if (Data is IDisposable dd) { dd.Dispose(); } } /// /// Checks if the current data may be stale, based on the last staleness check or /// if the underlying configuration has changed. /// public bool IsStale(JToken comparison) { if (DateTimeOffset.UtcNow - _lastStaleCheck > TimeUntilStale) return true; if (comparison.GetHashCode() != _configHash) return true; _lastStaleCheck = DateTimeOffset.UtcNow; return false; } } }