diff --git a/ArchiSteamFarm.sln.DotSettings b/ArchiSteamFarm.sln.DotSettings
new file mode 100644
index 000000000..f28f7b744
--- /dev/null
+++ b/ArchiSteamFarm.sln.DotSettings
@@ -0,0 +1,17 @@
+
+ API
+ ASF
+ FA
+ FS
+ ID
+ OK
+ PIN
+ SC
+ SMS
+ TTL
+ URL
+ WCF
+ WTF
+ XML
+ <Policy Inspect="True" Prefix="" Suffix="" Style="AaBb"><ExtraRule Prefix="_" Suffix="" Style="AaBb" /><ExtraRule Prefix="_" Suffix="" Style="aaBb" /></Policy>
+ <Policy Inspect="True" Prefix="" Suffix="" Style="AaBb"><ExtraRule Prefix="_" Suffix="" Style="aaBb" /></Policy>
\ No newline at end of file
diff --git a/ArchiSteamFarm/ArchiWebHandler.cs b/ArchiSteamFarm/ArchiWebHandler.cs
index cb36cf270..1cee1eaa9 100644
--- a/ArchiSteamFarm/ArchiWebHandler.cs
+++ b/ArchiSteamFarm/ArchiWebHandler.cs
@@ -308,7 +308,7 @@ namespace ArchiSteamFarm {
}
if (response == null) {
- Logging.LogGenericWTF("Request failed even after " + WebBrowser.MaxRetries + " tries");
+ Logging.LogGenericWTF("Request failed even after " + WebBrowser.MaxRetries + " tries", Bot.BotName);
return null;
}
@@ -464,6 +464,39 @@ namespace ArchiSteamFarm {
return await WebBrowser.UrlPostRetry(request, data, referer).ConfigureAwait(false);
}
+ internal bool DeclineTradeOffer(ulong tradeID) {
+ if ((tradeID == 0) || string.IsNullOrEmpty(Bot.BotConfig.SteamApiKey)) {
+ // TODO: Correct this when Mono 4.4+ will be a latest stable one | https://bugzilla.xamarin.com/show_bug.cgi?id=39455
+ Logging.LogNullError("tradeID || SteamApiKey", Bot.BotName);
+ //Logging.LogNullError(nameof(tradeID) + " || " + nameof(Bot.BotConfig.SteamApiKey), Bot.BotName);
+ return false;
+ }
+
+ KeyValue response = null;
+ using (dynamic iEconService = WebAPI.GetInterface("IEconService", Bot.BotConfig.SteamApiKey)) {
+ iEconService.Timeout = Timeout;
+
+ for (byte i = 0; i < WebBrowser.MaxRetries && response == null; i++) {
+ try {
+ response = iEconService.DeclineTradeOffer(
+ tradeofferid: tradeID.ToString(),
+ method: WebRequestMethods.Http.Post,
+ secure: !Program.GlobalConfig.ForceHttp
+ );
+ } catch (Exception e) {
+ Logging.LogGenericException(e, Bot.BotName);
+ }
+ }
+ }
+
+ if (response == null) {
+ Logging.LogGenericWTF("Request failed even after " + WebBrowser.MaxRetries + " tries", Bot.BotName);
+ return false;
+ }
+
+ return true;
+ }
+
internal async Task> GetMyTradableInventory() {
if (!await RefreshSessionIfNeeded().ConfigureAwait(false)) {
return null;
diff --git a/ArchiSteamFarm/Bot.cs b/ArchiSteamFarm/Bot.cs
index 15cfc4a7f..61445eb2b 100755
--- a/ArchiSteamFarm/Bot.cs
+++ b/ArchiSteamFarm/Bot.cs
@@ -1704,11 +1704,12 @@ namespace ArchiSteamFarm {
// TODO: Accept clan invites from master?
break;
default:
- if (!IsMaster(friend.SteamID)) {
- break;
+ if (IsMaster(friend.SteamID)) {
+ SteamFriends.AddFriend(friend.SteamID);
+ } else if (BotConfig.IsBotAccount) {
+ SteamFriends.RemoveFriend(friend.SteamID);
}
- SteamFriends.AddFriend(friend.SteamID);
break;
}
}
diff --git a/ArchiSteamFarm/BotConfig.cs b/ArchiSteamFarm/BotConfig.cs
index bc1c2a102..85e733361 100644
--- a/ArchiSteamFarm/BotConfig.cs
+++ b/ArchiSteamFarm/BotConfig.cs
@@ -70,6 +70,9 @@ namespace ArchiSteamFarm {
[JsonProperty(Required = Required.DisallowNull)]
internal bool AcceptGifts { get; private set; } = false;
+ [JsonProperty(Required = Required.DisallowNull)]
+ internal bool IsBotAccount { get; private set; } = false;
+
[JsonProperty(Required = Required.DisallowNull)]
internal bool SteamTradeMatcher { get; private set; } = false;
diff --git a/ArchiSteamFarm/Trading.cs b/ArchiSteamFarm/Trading.cs
index 1cf97d071..639659c39 100644
--- a/ArchiSteamFarm/Trading.cs
+++ b/ArchiSteamFarm/Trading.cs
@@ -111,6 +111,9 @@ namespace ArchiSteamFarm {
if (await ShouldAcceptTrade(tradeOffer).ConfigureAwait(false)) {
Logging.LogGenericInfo("Accepting trade: " + tradeOffer.TradeOfferID, Bot.BotName);
await Bot.ArchiWebHandler.AcceptTradeOffer(tradeOffer.TradeOfferID).ConfigureAwait(false);
+ } else if (Bot.BotConfig.IsBotAccount) {
+ Logging.LogGenericInfo("Rejecting trade: " + tradeOffer.TradeOfferID, Bot.BotName);
+ Bot.ArchiWebHandler.DeclineTradeOffer(tradeOffer.TradeOfferID);
} else {
Logging.LogGenericInfo("Ignoring trade: " + tradeOffer.TradeOfferID, Bot.BotName);
}
diff --git a/ArchiSteamFarm/config/example.json b/ArchiSteamFarm/config/example.json
index ecf28878c..c027773bd 100644
--- a/ArchiSteamFarm/config/example.json
+++ b/ArchiSteamFarm/config/example.json
@@ -12,6 +12,7 @@
"FarmOffline": false,
"HandleOfflineMessages": false,
"AcceptGifts": false,
+ "IsBotAccount": false,
"SteamTradeMatcher": false,
"ForwardKeysToOtherBots": false,
"DistributeKeys": false,
diff --git a/ConfigGenerator/BotConfig.cs b/ConfigGenerator/BotConfig.cs
index 3efe4b987..e59063e39 100644
--- a/ConfigGenerator/BotConfig.cs
+++ b/ConfigGenerator/BotConfig.cs
@@ -71,6 +71,9 @@ namespace ConfigGenerator {
[JsonProperty(Required = Required.DisallowNull)]
public bool AcceptGifts { get; set; } = false;
+ [JsonProperty(Required = Required.DisallowNull)]
+ public bool IsBotAccount { get; set; } = false;
+
[JsonProperty(Required = Required.DisallowNull)]
public bool SteamTradeMatcher { get; set; } = false;