diff --git a/ArchiSteamFarm/ArchiHandler.cs b/ArchiSteamFarm/ArchiHandler.cs index 4233deac4..fbeb64b77 100644 --- a/ArchiSteamFarm/ArchiHandler.cs +++ b/ArchiSteamFarm/ArchiHandler.cs @@ -122,7 +122,7 @@ namespace ArchiSteamFarm { } internal void AckMessage(ulong steamID, uint timestamp) { - if ((steamID == 0) || (timestamp == 0)) { + if ((steamID == 0) || !new SteamID(steamID).IsIndividualAccount || (timestamp == 0)) { ArchiLogger.LogNullError(nameof(steamID) + " || " + nameof(timestamp)); return; @@ -140,9 +140,9 @@ namespace ArchiSteamFarm { UnifiedFriendMessagesService.SendMessage(x => x.AckMessage(request), true); } - internal void AcknowledgeClanInvite(ulong clanID, bool acceptInvite) { - if (clanID == 0) { - ArchiLogger.LogNullError(nameof(clanID)); + internal void AcknowledgeClanInvite(ulong steamID, bool acceptInvite) { + if ((steamID == 0) || !new SteamID(steamID).IsClanAccount) { + ArchiLogger.LogNullError(nameof(steamID)); return; } @@ -153,7 +153,7 @@ namespace ArchiSteamFarm { ClientMsg request = new ClientMsg { Body = { - ClanID = clanID, + ClanID = steamID, AcceptInvite = acceptInvite } }; @@ -162,7 +162,7 @@ namespace ArchiSteamFarm { } internal async Task AddFriend(ulong steamID) { - if (steamID == 0) { + if ((steamID == 0) || !new SteamID(steamID).IsIndividualAccount) { ArchiLogger.LogNullError(nameof(steamID)); return false; @@ -462,7 +462,7 @@ namespace ArchiSteamFarm { } internal async Task RemoveFriend(ulong steamID) { - if (steamID == 0) { + if ((steamID == 0) || !new SteamID(steamID).IsIndividualAccount) { ArchiLogger.LogNullError(nameof(steamID)); return false; @@ -503,7 +503,7 @@ namespace ArchiSteamFarm { } internal async Task SendMessage(ulong steamID, string message) { - if ((steamID == 0) || string.IsNullOrEmpty(message)) { + if ((steamID == 0) || !new SteamID(steamID).IsIndividualAccount || string.IsNullOrEmpty(message)) { ArchiLogger.LogNullError(nameof(steamID) + " || " + nameof(message)); return EResult.Fail; @@ -575,6 +575,41 @@ namespace ArchiSteamFarm { return response.Result; } + internal async Task SendTypingStatus(ulong steamID) { + if ((steamID == 0) || !new SteamID(steamID).IsIndividualAccount) { + ArchiLogger.LogNullError(nameof(steamID)); + + return EResult.Fail; + } + + if (!Client.IsConnected) { + return EResult.NoConnection; + } + + CFriendMessages_SendMessage_Request request = new CFriendMessages_SendMessage_Request { + chat_entry_type = (int) EChatEntryType.Typing, + steamid = steamID + }; + + SteamUnifiedMessages.ServiceMethodResponse response; + + try { + response = await UnifiedFriendMessagesService.SendMessage(x => x.SendMessage(request)); + } catch (Exception e) { + ArchiLogger.LogGenericWarningException(e); + + return EResult.Timeout; + } + + if (response == null) { + ArchiLogger.LogNullError(nameof(response)); + + return EResult.Fail; + } + + return response.Result; + } + internal void SetCurrentMode(uint chatMode) { if (chatMode == 0) { ArchiLogger.LogNullError(nameof(chatMode)); diff --git a/ArchiSteamFarm/Bot.cs b/ArchiSteamFarm/Bot.cs index 1e6e5d255..d95864312 100755 --- a/ArchiSteamFarm/Bot.cs +++ b/ArchiSteamFarm/Bot.cs @@ -1079,13 +1079,13 @@ namespace ArchiSteamFarm { } internal async Task SendMessage(ulong steamID, string message) { - if ((steamID == 0) || string.IsNullOrEmpty(message)) { + if ((steamID == 0) || !new SteamID(steamID).IsIndividualAccount || string.IsNullOrEmpty(message)) { ArchiLogger.LogNullError(nameof(steamID) + " || " + nameof(message)); return false; } - if (!IsConnectedAndLoggedOn || !new SteamID(steamID).IsIndividualAccount) { + if (!IsConnectedAndLoggedOn) { return false; } @@ -1214,6 +1214,20 @@ namespace ArchiSteamFarm { return true; } + internal async Task SendTypingMessage(ulong steamID) { + if ((steamID == 0) || !new SteamID(steamID).IsIndividualAccount) { + ArchiLogger.LogNullError(nameof(steamID)); + + return false; + } + + if (!IsConnectedAndLoggedOn) { + return false; + } + + return await ArchiHandler.SendTypingStatus(steamID).ConfigureAwait(false) == EResult.OK; + } + internal void SetUserInput(ASF.EUserInputType inputType, string inputValue) { if ((inputType == ASF.EUserInputType.Unknown) || string.IsNullOrEmpty(inputValue)) { ArchiLogger.LogNullError(nameof(inputType) + " || " + nameof(inputValue)); diff --git a/ArchiSteamFarm/Commands.cs b/ArchiSteamFarm/Commands.cs index 2b0467c82..c270b8c25 100644 --- a/ArchiSteamFarm/Commands.cs +++ b/ArchiSteamFarm/Commands.cs @@ -33,6 +33,8 @@ using SteamKit2; namespace ArchiSteamFarm { public sealed class Commands { + private const ushort SteamTypingStatusDelay = 10000; // Steam client broadcasts typing status each 10 seconds + private readonly Bot Bot; private readonly Dictionary CachedGamesOwned = new Dictionary(); @@ -408,13 +410,19 @@ namespace ArchiSteamFarm { message = message.Substring(ASF.GlobalConfig.CommandPrefix.Length); } + Task responseTask = Response(steamID, message); + bool feedback = Bot.HasPermission(steamID, BotConfig.EPermission.FamilySharing); if (feedback) { - await Bot.SendMessage(steamID, FormatBotResponse(Strings.PleaseWait)).ConfigureAwait(false); + await Bot.SendTypingMessage(steamID).ConfigureAwait(false); + + while (!responseTask.IsCompleted && (await Task.WhenAny(responseTask, Task.Delay(SteamTypingStatusDelay)).ConfigureAwait(false) != responseTask)) { + await Bot.SendTypingMessage(steamID).ConfigureAwait(false); + } } - string response = await Response(steamID, message).ConfigureAwait(false); + string response = await responseTask.ConfigureAwait(false); if (string.IsNullOrEmpty(response)) { if (!feedback) { @@ -449,13 +457,19 @@ namespace ArchiSteamFarm { message = message.Substring(ASF.GlobalConfig.CommandPrefix.Length); } + Task responseTask = Response(steamID, message); + bool feedback = Bot.HasPermission(steamID, BotConfig.EPermission.FamilySharing); if (feedback) { await Bot.SendMessage(chatGroupID, chatID, FormatBotResponse(Strings.PleaseWait)).ConfigureAwait(false); + + while (!responseTask.IsCompleted && (await Task.WhenAny(responseTask, Task.Delay(SteamTypingStatusDelay)).ConfigureAwait(false) != responseTask)) { + await Bot.SendMessage(chatGroupID, chatID, FormatBotResponse(Strings.PleaseWait)).ConfigureAwait(false); + } } - string response = await Response(steamID, message).ConfigureAwait(false); + string response = await responseTask.ConfigureAwait(false); if (string.IsNullOrEmpty(response)) { if (!feedback) {