mirror of
https://github.com/JustArchiNET/ArchiSteamFarm.git
synced 2026-01-06 17:10:13 +00:00
Improve trading failure handling
It seems that even if Steam responds with e.g. internal server error (500), the trade gets accepted 20-30 seconds later, which doesn't make ANY sense, but does anything in Steam do? Let's improve the logic a bit by returning result even if we in fact failed in Accept/Decline function, this will allow us to deal with confirmations even if failed trade in fact succeeded.
This commit is contained in:
@@ -662,37 +662,38 @@ namespace ArchiSteamFarm {
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
internal async Task<bool> AcceptTradeOffer(ulong tradeID) {
|
internal async Task AcceptTradeOffer(ulong tradeID) {
|
||||||
if (tradeID == 0) {
|
if (tradeID == 0) {
|
||||||
Logging.LogNullError(nameof(tradeID), Bot.BotName);
|
Logging.LogNullError(nameof(tradeID), Bot.BotName);
|
||||||
return false;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!await RefreshSessionIfNeeded().ConfigureAwait(false)) {
|
if (!await RefreshSessionIfNeeded().ConfigureAwait(false)) {
|
||||||
return false;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
string sessionID = WebBrowser.CookieContainer.GetCookieValue(SteamCommunityURL, "sessionid");
|
string sessionID = WebBrowser.CookieContainer.GetCookieValue(SteamCommunityURL, "sessionid");
|
||||||
if (string.IsNullOrEmpty(sessionID)) {
|
if (string.IsNullOrEmpty(sessionID)) {
|
||||||
Logging.LogNullError(nameof(sessionID), Bot.BotName);
|
Logging.LogNullError(nameof(sessionID), Bot.BotName);
|
||||||
return false;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
string referer = SteamCommunityURL + "/tradeoffer/" + tradeID;
|
string referer = SteamCommunityURL + "/tradeoffer/" + tradeID;
|
||||||
string request = referer + "/accept";
|
string request = referer + "/accept";
|
||||||
|
|
||||||
Dictionary<string, string> data = new Dictionary<string, string>(3) {
|
Dictionary<string, string> data = new Dictionary<string, string>(3) {
|
||||||
{ "sessionid", sessionID },
|
{ "sessionid", sessionID },
|
||||||
{ "serverid", "1" },
|
{ "serverid", "1" },
|
||||||
{ "tradeofferid", tradeID.ToString() }
|
{ "tradeofferid", tradeID.ToString() }
|
||||||
};
|
};
|
||||||
|
|
||||||
return await WebBrowser.UrlPostRetry(request, data, referer).ConfigureAwait(false);
|
await WebBrowser.UrlPostRetry(request, data, referer).ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
internal bool DeclineTradeOffer(ulong tradeID) {
|
internal void DeclineTradeOffer(ulong tradeID) {
|
||||||
if ((tradeID == 0) || string.IsNullOrEmpty(Bot.BotConfig.SteamApiKey)) {
|
if ((tradeID == 0) || string.IsNullOrEmpty(Bot.BotConfig.SteamApiKey)) {
|
||||||
Logging.LogNullError(nameof(tradeID) + " || " + nameof(Bot.BotConfig.SteamApiKey), Bot.BotName);
|
Logging.LogNullError(nameof(tradeID) + " || " + nameof(Bot.BotConfig.SteamApiKey), Bot.BotName);
|
||||||
return false;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
KeyValue response = null;
|
KeyValue response = null;
|
||||||
@@ -712,12 +713,9 @@ namespace ArchiSteamFarm {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (response != null) {
|
if (response == null) {
|
||||||
return true;
|
Logging.LogGenericWarning("Request failed even after " + WebBrowser.MaxRetries + " tries", Bot.BotName);
|
||||||
}
|
}
|
||||||
|
|
||||||
Logging.LogGenericWarning("Request failed even after " + WebBrowser.MaxRetries + " tries", Bot.BotName);
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
internal async Task<HashSet<Steam.Item>> GetMySteamInventory(bool tradable) {
|
internal async Task<HashSet<Steam.Item>> GetMySteamInventory(bool tradable) {
|
||||||
|
|||||||
@@ -152,23 +152,25 @@ namespace ArchiSteamFarm {
|
|||||||
case ParseTradeResult.EResult.AcceptedWithItemLose:
|
case ParseTradeResult.EResult.AcceptedWithItemLose:
|
||||||
case ParseTradeResult.EResult.AcceptedWithoutItemLose:
|
case ParseTradeResult.EResult.AcceptedWithoutItemLose:
|
||||||
Logging.LogGenericInfo("Accepting trade: " + tradeOffer.TradeOfferID, Bot.BotName);
|
Logging.LogGenericInfo("Accepting trade: " + tradeOffer.TradeOfferID, Bot.BotName);
|
||||||
return await Bot.ArchiWebHandler.AcceptTradeOffer(tradeOffer.TradeOfferID).ConfigureAwait(false) ? result : null;
|
await Bot.ArchiWebHandler.AcceptTradeOffer(tradeOffer.TradeOfferID).ConfigureAwait(false);
|
||||||
|
break;
|
||||||
case ParseTradeResult.EResult.RejectedPermanently:
|
case ParseTradeResult.EResult.RejectedPermanently:
|
||||||
case ParseTradeResult.EResult.RejectedTemporarily:
|
case ParseTradeResult.EResult.RejectedTemporarily:
|
||||||
if (result.Result == ParseTradeResult.EResult.RejectedPermanently) {
|
if (result.Result == ParseTradeResult.EResult.RejectedPermanently) {
|
||||||
if (Bot.BotConfig.IsBotAccount) {
|
if (Bot.BotConfig.IsBotAccount) {
|
||||||
Logging.LogGenericInfo("Rejecting trade: " + tradeOffer.TradeOfferID, Bot.BotName);
|
Logging.LogGenericInfo("Rejecting trade: " + tradeOffer.TradeOfferID, Bot.BotName);
|
||||||
return Bot.ArchiWebHandler.DeclineTradeOffer(tradeOffer.TradeOfferID) ? result : null;
|
Bot.ArchiWebHandler.DeclineTradeOffer(tradeOffer.TradeOfferID);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
IgnoredTrades.Add(tradeOffer.TradeOfferID);
|
IgnoredTrades.Add(tradeOffer.TradeOfferID);
|
||||||
}
|
}
|
||||||
|
|
||||||
Logging.LogGenericInfo("Ignoring trade: " + tradeOffer.TradeOfferID, Bot.BotName);
|
Logging.LogGenericInfo("Ignoring trade: " + tradeOffer.TradeOfferID, Bot.BotName);
|
||||||
return result;
|
break;
|
||||||
default:
|
|
||||||
return result;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task<ParseTradeResult> ShouldAcceptTrade(Steam.TradeOffer tradeOffer) {
|
private async Task<ParseTradeResult> ShouldAcceptTrade(Steam.TradeOffer tradeOffer) {
|
||||||
|
|||||||
Reference in New Issue
Block a user