From 5038527c90b5d190e9a3660cee825bf15af10d5c Mon Sep 17 00:00:00 2001 From: JustArchi Date: Mon, 21 Dec 2015 10:55:55 +0100 Subject: [PATCH] Handle offline messages, closes #42 --- ArchiSteamFarm/Bot.cs | 145 ++++++++++++++++++------------ ArchiSteamFarm/config/example.xml | 1 - 2 files changed, 88 insertions(+), 58 deletions(-) diff --git a/ArchiSteamFarm/Bot.cs b/ArchiSteamFarm/Bot.cs index f85f640b6..0b63bb074 100755 --- a/ArchiSteamFarm/Bot.cs +++ b/ArchiSteamFarm/Bot.cs @@ -142,6 +142,7 @@ namespace ArchiSteamFarm { SteamFriends = SteamClient.GetHandler(); CallbackManager.Subscribe(OnFriendsList); CallbackManager.Subscribe(OnFriendMsg); + CallbackManager.Subscribe(OnFriendMsgHistory); if (UseAsfAsMobileAuthenticator && File.Exists(MobileAuthenticatorFile)) { SteamGuardAccount = JsonConvert.DeserializeObject(File.ReadAllText(MobileAuthenticatorFile)); @@ -517,6 +518,67 @@ namespace ArchiSteamFarm { } } + private async Task HandleMessage(ulong steamID, string message) { + if (IsValidCdKey(message)) { + ArchiHandler.RedeemKey(message); + return; + } + + if (!message.StartsWith("!")) { + return; + } + + if (!message.Contains(" ")) { + switch (message) { + case "!2fa": + Response2FA(steamID); + break; + case "!2faoff": + Response2FAOff(steamID); + break; + case "!exit": + await ShutdownAllBots().ConfigureAwait(false); + break; + case "!farm": + SendMessageToUser(steamID, "Please wait..."); + await CardsFarmer.StartFarming().ConfigureAwait(false); + SendMessageToUser(steamID, "Done!"); + break; + case "!restart": + await Program.Restart().ConfigureAwait(false); + break; + case "!status": + ResponseStatus(steamID); + break; + case "!stop": + await Shutdown().ConfigureAwait(false); + break; + } + } else { + string[] args = message.Split(' '); + switch (args[0]) { + case "!2fa": + Response2FA(steamID, args[1]); + break; + case "!2faoff": + Response2FAOff(steamID, args[1]); + break; + case "!redeem": + ArchiHandler.RedeemKey(args[1]); + break; + case "!start": + ResponseStart(steamID, args[1]); + break; + case "!stop": + await ResponseStop(steamID, args[1]).ConfigureAwait(false); + break; + case "!status": + ResponseStatus(steamID, args[1]); + break; + } + } + } + @@ -623,74 +685,44 @@ namespace ArchiSteamFarm { return; } - ulong steamID = callback.Sender; + await HandleMessage(callback.Sender, callback.Message).ConfigureAwait(false); + } + + private async void OnFriendMsgHistory(SteamFriends.FriendMsgHistoryCallback callback) { + if (callback == null) { + return; + } + + if (callback.Result != EResult.OK) { + return; + } + + ulong steamID = callback.SteamID; + if (steamID != SteamMasterID) { return; } - string message = callback.Message; - if (string.IsNullOrEmpty(message)) { + var messages = callback.Messages; + if (messages.Count == 0) { return; } - if (IsValidCdKey(message)) { - ArchiHandler.RedeemKey(message); + // Get last message + var lastMessage = messages[messages.Count - 1]; + + // If message is read already, return + if (!lastMessage.Unread) { return; } - if (!message.StartsWith("!")) { + // If message is too old, return + if (DateTime.UtcNow.Subtract(lastMessage.Timestamp).TotalMinutes > 1) { return; } - if (!message.Contains(" ")) { - switch (message) { - case "!2fa": - Response2FA(steamID); - break; - case "!2faoff": - Response2FAOff(steamID); - break; - case "!exit": - await ShutdownAllBots().ConfigureAwait(false); - break; - case "!farm": - SendMessageToUser(steamID, "Please wait..."); - await CardsFarmer.StartFarming().ConfigureAwait(false); - SendMessageToUser(steamID, "Done!"); - break; - case "!restart": - await Program.Restart().ConfigureAwait(false); - break; - case "!status": - ResponseStatus(steamID); - break; - case "!stop": - await Shutdown().ConfigureAwait(false); - break; - } - } else { - string[] args = message.Split(' '); - switch (args[0]) { - case "!2fa": - Response2FA(steamID, args[1]); - break; - case "!2faoff": - Response2FAOff(steamID, args[1]); - break; - case "!redeem": - ArchiHandler.RedeemKey(args[1]); - break; - case "!start": - ResponseStart(steamID, args[1]); - break; - case "!stop": - await ResponseStop(steamID, args[1]).ConfigureAwait(false); - break; - case "!status": - ResponseStatus(steamID, args[1]); - break; - } - } + // Handle the message + await HandleMessage(steamID, lastMessage.Message).ConfigureAwait(false); } private void OnAccountInfo(SteamUser.AccountInfoCallback callback) { @@ -866,8 +898,7 @@ namespace ArchiSteamFarm { return; } - // TODO: Enable this after SK2 1.7+ gets released - //SteamFriends.RequestOfflineMessages(); + SteamFriends.RequestOfflineMessages(); } private async void OnPurchaseResponse(ArchiHandler.PurchaseResponseCallback callback) { diff --git a/ArchiSteamFarm/config/example.xml b/ArchiSteamFarm/config/example.xml index fd795ce4d..016387427 100644 --- a/ArchiSteamFarm/config/example.xml +++ b/ArchiSteamFarm/config/example.xml @@ -71,7 +71,6 @@ -