diff --git a/ArchiSteamFarm/ArchiHandler.cs b/ArchiSteamFarm/ArchiHandler.cs index 173c030b2..4b666419f 100644 --- a/ArchiSteamFarm/ArchiHandler.cs +++ b/ArchiSteamFarm/ArchiHandler.cs @@ -37,6 +37,8 @@ namespace ArchiSteamFarm { internal sealed class ArchiHandler : ClientMsgHandler { internal const byte MaxGamesPlayedConcurrently = 32; // This is limit introduced by Steam Network + internal DateTime LastPacketReceived { get; private set; } = DateTime.MinValue; + private readonly ArchiLogger ArchiLogger; internal ArchiHandler(ArchiLogger archiLogger) { @@ -53,6 +55,8 @@ namespace ArchiSteamFarm { return; } + LastPacketReceived = DateTime.Now; + switch (packetMsg.MsgType) { case EMsg.ClientFSOfflineMessageNotification: HandleFSOfflineMessageNotification(packetMsg); diff --git a/ArchiSteamFarm/Bot.cs b/ArchiSteamFarm/Bot.cs index b6cebcdf7..42823d3e9 100755 --- a/ArchiSteamFarm/Bot.cs +++ b/ArchiSteamFarm/Bot.cs @@ -48,6 +48,7 @@ namespace ArchiSteamFarm { private const uint LoginID = GlobalConfig.DefaultWCFPort; // This must be the same for all ASF bots and all ASF processes private const ushort MaxSteamMessageLength = 2048; private const byte MaxTwoFactorCodeFailures = 3; + private const byte MinHeartBeatTTL = GlobalConfig.DefaultConnectionTimeout; // Assume client is responsive for at least that amount of seconds internal static readonly ConcurrentDictionary Bots = new ConcurrentDictionary(); @@ -756,7 +757,10 @@ namespace ArchiSteamFarm { } try { - await SteamApps.PICSGetProductInfo(0, null); + if (DateTime.Now.Subtract(ArchiHandler.LastPacketReceived).TotalSeconds > MinHeartBeatTTL) { + await SteamApps.PICSGetProductInfo(0, null); + } + HeartBeatFailures = 0; Statistics?.OnHeartBeat().Forget(); } catch {