From 319fe69088233b5381c87cbbcaa2e3ac27b2a33c Mon Sep 17 00:00:00 2001 From: JustArchi Date: Sun, 17 Dec 2017 11:31:42 +0100 Subject: [PATCH] Don't keep SteamTimeDifference infinitely With long-running systems time might run out of sync eventually. --- ArchiSteamFarm/ArchiHandler.cs | 2 +- ArchiSteamFarm/ArchiWebHandler.cs | 2 +- ArchiSteamFarm/MobileAuthenticator.cs | 10 +++++++++- ArchiSteamFarm/Statistics.cs | 6 +++--- 4 files changed, 14 insertions(+), 6 deletions(-) diff --git a/ArchiSteamFarm/ArchiHandler.cs b/ArchiSteamFarm/ArchiHandler.cs index 62b07c828..293f7b616 100644 --- a/ArchiSteamFarm/ArchiHandler.cs +++ b/ArchiSteamFarm/ArchiHandler.cs @@ -37,7 +37,7 @@ namespace ArchiSteamFarm { private readonly ArchiLogger ArchiLogger; - internal DateTime LastPacketReceived { get; private set; } = DateTime.MinValue; + internal DateTime LastPacketReceived { get; private set; } internal ArchiHandler(ArchiLogger archiLogger) => ArchiLogger = archiLogger ?? throw new ArgumentNullException(nameof(archiLogger)); diff --git a/ArchiSteamFarm/ArchiWebHandler.cs b/ArchiSteamFarm/ArchiWebHandler.cs index a31fe16e1..d260ac134 100644 --- a/ArchiSteamFarm/ArchiWebHandler.cs +++ b/ArchiSteamFarm/ArchiWebHandler.cs @@ -67,7 +67,7 @@ namespace ArchiSteamFarm { private string CachedApiKey; private bool? CachedPublicInventory; private string CachedTradeToken; - private DateTime LastSessionRefreshCheck = DateTime.MinValue; + private DateTime LastSessionRefreshCheck; private bool MarkingInventoryScheduled; private ulong SteamID; private string VanityURL; diff --git a/ArchiSteamFarm/MobileAuthenticator.cs b/ArchiSteamFarm/MobileAuthenticator.cs index dd053f181..579a5e2d8 100644 --- a/ArchiSteamFarm/MobileAuthenticator.cs +++ b/ArchiSteamFarm/MobileAuthenticator.cs @@ -34,10 +34,12 @@ namespace ArchiSteamFarm { internal sealed class MobileAuthenticator : IDisposable { private const byte CodeDigits = 5; private const byte CodeInterval = 30; + private const byte SteamTimeTTL = 24; // For how many hours we can assume that SteamTimeDifference is correct private static readonly char[] CodeCharacters = { '2', '3', '4', '5', '6', '7', '8', '9', 'B', 'C', 'D', 'F', 'G', 'H', 'J', 'K', 'M', 'N', 'P', 'Q', 'R', 'T', 'V', 'W', 'X', 'Y' }; private static readonly SemaphoreSlim TimeSemaphore = new SemaphoreSlim(1, 1); + private static DateTime LastSteamTimeCheck; private static int? SteamTimeDifference; // "ERROR" is being used by SteamDesktopAuthenticator @@ -338,10 +340,14 @@ namespace ArchiSteamFarm { } private async Task GetSteamTime() { + if (SteamTimeDifference.HasValue && (DateTime.UtcNow.Subtract(LastSteamTimeCheck).TotalHours < SteamTimeTTL)) { + return (uint) (Utilities.GetUnixTime() + SteamTimeDifference.Value); + } + await TimeSemaphore.WaitAsync().ConfigureAwait(false); try { - if (SteamTimeDifference.HasValue) { + if (SteamTimeDifference.HasValue && (DateTime.UtcNow.Subtract(LastSteamTimeCheck).TotalHours < SteamTimeTTL)) { return (uint) (Utilities.GetUnixTime() + SteamTimeDifference.Value); } @@ -351,6 +357,8 @@ namespace ArchiSteamFarm { } SteamTimeDifference = (int) (serverTime - Utilities.GetUnixTime()); + LastSteamTimeCheck = DateTime.UtcNow; + return (uint) (Utilities.GetUnixTime() + SteamTimeDifference.Value); } finally { TimeSemaphore.Release(); diff --git a/ArchiSteamFarm/Statistics.cs b/ArchiSteamFarm/Statistics.cs index 1e42d5a72..4bab541a3 100644 --- a/ArchiSteamFarm/Statistics.cs +++ b/ArchiSteamFarm/Statistics.cs @@ -39,9 +39,9 @@ namespace ArchiSteamFarm { private readonly Bot Bot; private readonly SemaphoreSlim RequestsSemaphore = new SemaphoreSlim(1, 1); - private DateTime LastAnnouncementCheck = DateTime.MinValue; - private DateTime LastHeartBeat = DateTime.MinValue; - private DateTime LastPersonaStateRequest = DateTime.MinValue; + private DateTime LastAnnouncementCheck; + private DateTime LastHeartBeat; + private DateTime LastPersonaStateRequest; private bool ShouldSendHeartBeats; internal Statistics(Bot bot) => Bot = bot ?? throw new ArgumentNullException(nameof(bot));