Skip to content
This repository has been archived by the owner on Jul 30, 2024. It is now read-only.

Commit

Permalink
Merge pull request #934 from BlueRaja/PollTradeOfferStatus
Browse files Browse the repository at this point in the history
Poll trade offer status automatically
  • Loading branch information
BlueRaja committed Apr 16, 2016
2 parents d0f255c + 2821031 commit e15d13e
Show file tree
Hide file tree
Showing 13 changed files with 231 additions and 212 deletions.
1 change: 1 addition & 0 deletions Bin/Debug/settings-template.json
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
"MaximumActionGap":30,
"DisplayNamePrefix":"[AutomatedBot] ",
"TradePollingInterval":800,
"TradeOfferPollingIntervalSecs":30,
"ConsoleLogLevel":"Success",
"FileLogLevel":"Info",
"AutoStart": "true",
Expand Down
4 changes: 3 additions & 1 deletion Bin/Release/settings-template.json
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,11 @@
"MaximumActionGap":30,
"DisplayNamePrefix":"[AutomatedBot] ",
"TradePollingInterval":800,
"TradeOfferPollingIntervalSecs":30,
"ConsoleLogLevel":"Success",
"FileLogLevel":"Info",
"AutoStart": "true"
"AutoStart": "true",
"SchemaLang":"en"
}
]
}
8 changes: 6 additions & 2 deletions SteamBot/AdminUserHandler.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
using SteamKit2;
using SteamTrade;
using System.Collections.Generic;
using SteamTrade.TradeOffer;

namespace SteamBot
{
Expand Down Expand Up @@ -129,9 +130,12 @@ public override void OnTradeReady(bool ready)
Trade.SetReady(true);
}

public override void OnTradeSuccess()
public override void OnTradeOfferUpdated(TradeOffer offer)
{
Log.Success("Trade Complete.");
if(offer.OfferState == TradeOfferState.TradeOfferStateAccepted)
{
Log.Success("Trade Complete.");
}
}

public override void OnTradeAwaitingConfirmation(long tradeOfferID)
Expand Down
115 changes: 70 additions & 45 deletions SteamBot/Bot.cs
Original file line number Diff line number Diff line change
Expand Up @@ -41,12 +41,14 @@ public class Bot : IDisposable
private TradeManager tradeManager;
private TradeOfferManager tradeOfferManager;
private int tradePollingInterval;
private int tradeOfferPollingIntervalSecs;
private string myUserNonce;
private string myUniqueId;
private bool cookiesAreInvalid = true;
private List<SteamID> friends;
private bool disposed = false;
private string consoleInput;
private Thread tradeOfferThread;
#endregion

#region Public readonly variables
Expand Down Expand Up @@ -156,6 +158,7 @@ public Bot(Configuration.BotInfo config, string apiKey, UserHandlerCreator handl
MaximumActionGap = config.MaximumActionGap;
DisplayNamePrefix = config.DisplayNamePrefix;
tradePollingInterval = config.TradePollingInterval <= 100 ? 800 : config.TradePollingInterval;
tradeOfferPollingIntervalSecs = (config.TradeOfferPollingIntervalSecs == 0 ? 30 : config.TradeOfferPollingIntervalSecs);
schemaLang = config.SchemaLang != null && config.SchemaLang.Length == 2 ? config.SchemaLang.ToLower() : "en";
Admins = config.Admins;
ApiKey = !String.IsNullOrEmpty(config.ApiKey) ? config.ApiKey : apiKey;
Expand Down Expand Up @@ -316,7 +319,7 @@ public TradeOffer NewTradeOffer(SteamID other)
/// <returns></returns>
public bool TryGetTradeOffer(string offerId, out TradeOffer tradeOffer)
{
return tradeOfferManager.GetOffer(offerId, out tradeOffer);
return tradeOfferManager.TryGetOffer(offerId, out tradeOffer);
}

public void HandleBotCommand(string command)
Expand Down Expand Up @@ -373,6 +376,37 @@ public void HandleBotCommand(string command)
}
}

protected void SpawnTradeOfferPollingThread()
{
if (tradeOfferThread == null)
{
tradeOfferThread = new Thread(TradeOfferPollingFunction);
tradeOfferThread.Start();
}
}

protected void CancelTradeOfferPollingThread()
{
tradeOfferThread = null;
}

protected void TradeOfferPollingFunction()
{
while (tradeOfferThread == Thread.CurrentThread)
{
try
{
tradeOfferManager.EnqueueUpdatedOffers();
}
catch (Exception e)
{
Log.Error("Error while polling trade offers: " + e);
}

Thread.Sleep(tradeOfferPollingIntervalSecs*1000);
}
}

public void HandleInput(string input)
{
consoleInput = input;
Expand Down Expand Up @@ -582,25 +616,25 @@ void HandleSteamMessage(ICallbackMsg msg)
RemoveUserHandler(friend.SteamID);
}
else if (friend.Relationship == EFriendRelationship.RequestRecipient)
{
{
if (GetUserHandler(friend.SteamID).OnFriendAdd())
{
if (!friends.Contains(friend.SteamID))
{
friends.Add(friend.SteamID);
if (!friends.Contains(friend.SteamID))
{
friends.Add(friend.SteamID);
}
else
{
Log.Error("Friend was added who was already in friends list: " + friend.SteamID);
SteamFriends.AddFriend(friend.SteamID);
}
else
{
if(friends.Contains(friend.SteamID))
{
friends.Remove(friend.SteamID);
}
SteamFriends.AddFriend(friend.SteamID);
}
else
{
SteamFriends.RemoveFriend(friend.SteamID);
RemoveUserHandler(friend.SteamID);
RemoveUserHandler(friend.SteamID);
}
}
}
break;
}
}
Expand Down Expand Up @@ -710,6 +744,7 @@ void HandleSteamMessage(ICallbackMsg msg)
{
IsLoggedIn = false;
Log.Warn("Logged off Steam. Reason: {0}", callback.Result);
CancelTradeOfferPollingThread();
});

msg.Handle<SteamClient.DisconnectedCallback> (callback =>
Expand All @@ -719,29 +754,14 @@ void HandleSteamMessage(ICallbackMsg msg)
IsLoggedIn = false;
CloseTrade();
Log.Warn("Disconnected from Steam Network!");
CancelTradeOfferPollingThread();
}
SteamClient.Connect ();
});
#endregion

#region Notifications
msg.Handle<SteamBot.SteamNotifications.NotificationCallback>(callback =>
{
//currently only appears to be of trade offer
if (callback.Notifications.Count != 0)
{
foreach (var notification in callback.Notifications)
{
Log.Info(notification.UserNotificationType + " notification");
}
}
// Get offers only if cookies are valid
if (CheckCookies())
tradeOfferManager.GetOffers();
});

msg.Handle<SteamBot.SteamNotifications.CommentNotificationCallback>(callback =>
{
//various types of comment notifications on profile/activity feed etc
Expand Down Expand Up @@ -882,8 +902,9 @@ void UserWebLogOn()
tradeOfferManager = new TradeOfferManager(ApiKey, SteamWeb);
SubscribeTradeOffer(tradeOfferManager);
cookiesAreInvalid = false;

// Success, check trade offers which we have received while we were offline
tradeOfferManager.GetOffers();
SpawnTradeOfferPollingThread();
}

/// <summary>
Expand Down Expand Up @@ -917,7 +938,7 @@ bool CheckCookies()
return true;
}

UserHandler GetUserHandler(SteamID sid)
public UserHandler GetUserHandler(SteamID sid)
{
if (!userHandlers.ContainsKey(sid))
userHandlers[sid] = createHandler(this, sid);
Expand Down Expand Up @@ -991,28 +1012,24 @@ public void GetInventory()

public void TradeOfferRouter(TradeOffer offer)
{
if (offer.OfferState == TradeOfferState.TradeOfferStateActive)
{
GetUserHandler(offer.PartnerSteamId).OnNewTradeOffer(offer);
}
GetUserHandler(offer.PartnerSteamId).OnTradeOfferUpdated(offer);
}
public void SubscribeTradeOffer(TradeOfferManager tradeOfferManager)
{
tradeOfferManager.OnNewTradeOffer += TradeOfferRouter;
tradeOfferManager.OnTradeOfferUpdated += TradeOfferRouter;
}

//todo: should unsubscribe eventually...
public void UnsubscribeTradeOffer(TradeOfferManager tradeOfferManager)
{
tradeOfferManager.OnNewTradeOffer -= TradeOfferRouter;
tradeOfferManager.OnTradeOfferUpdated -= TradeOfferRouter;
}

/// <summary>
/// Subscribes all listeners of this to the trade.
/// </summary>
public void SubscribeTrade (Trade trade, UserHandler handler)
{
trade.OnSuccess += handler.OnTradeSuccess;
trade.OnAwaitingConfirmation += handler._OnTradeAwaitingConfirmation;
trade.OnClose += handler.OnTradeClose;
trade.OnError += handler.OnTradeError;
Expand All @@ -1031,7 +1048,6 @@ public void SubscribeTrade (Trade trade, UserHandler handler)
/// </summary>
public void UnsubscribeTrade (UserHandler handler, Trade trade)
{
trade.OnSuccess -= handler.OnTradeSuccess;
trade.OnAwaitingConfirmation -= handler._OnTradeAwaitingConfirmation;
trade.OnClose -= handler.OnTradeClose;
trade.OnError -= handler.OnTradeError;
Expand All @@ -1053,7 +1069,7 @@ private Inventory FetchBotsInventory()
var inventory = Inventory.FetchInventory(SteamUser.SteamID, ApiKey, SteamWeb);
if(inventory.IsPrivate)
{
log.Warn("The bot's backpack is private! If your bot adds any items it will fail! Your bot's backpack should be Public.");
Log.Warn("The bot's backpack is private! If your bot adds any items it will fail! Your bot's backpack should be Public.");
}
return inventory;
}
Expand Down Expand Up @@ -1199,8 +1215,18 @@ private void BackgroundWorkerOnDoWork(object sender, DoWorkEventArgs doWorkEvent
{
try
{
msg = SteamClient.WaitForCallback(true);
HandleSteamMessage(msg);
msg = SteamClient.GetCallback(true);
if (msg != null)
{
HandleSteamMessage(msg);
}

if(tradeOfferManager != null)
{
tradeOfferManager.HandleNextPendingTradeOfferUpdate();
}

Thread.Sleep(1);
}
catch (WebException e)
{
Expand All @@ -1209,8 +1235,7 @@ private void BackgroundWorkerOnDoWork(object sender, DoWorkEventArgs doWorkEvent
}
catch (Exception e)
{
Log.Error(e.ToString());
Log.Warn("Restarting bot...");
Log.Error("Unhandled exception occurred in bot: " + e);
}
}
}
Expand Down
1 change: 1 addition & 0 deletions SteamBot/Configuration.cs
Original file line number Diff line number Diff line change
Expand Up @@ -158,6 +158,7 @@ public class BotInfo
public int MaximumActionGap { get; set; }
public string DisplayNamePrefix { get; set; }
public int TradePollingInterval { get; set; }
public int TradeOfferPollingIntervalSecs { get; set; }
public string ConsoleLogLevel { get; set; }
public string FileLogLevel { get; set; }
[JsonConverter(typeof(JsonToSteamID))]
Expand Down
28 changes: 23 additions & 5 deletions SteamBot/SimpleUserHandler.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
using SteamKit2;
using System.Collections.Generic;
using SteamTrade;
using SteamTrade.TradeOffer;
using SteamTrade.TradeWebAPI;

namespace SteamBot
Expand Down Expand Up @@ -82,17 +83,34 @@ public override void OnTradeReady (bool ready)
}
}

public override void OnTradeSuccess()
{
Log.Success("Trade Complete.");
}

public override void OnTradeAwaitingConfirmation(long tradeOfferID)
{
Log.Warn("Trade ended awaiting confirmation");
SendChatMessage("Please complete the confirmation to finish the trade");
}

public override void OnTradeOfferUpdated(TradeOffer offer)
{
switch (offer.OfferState)
{
case TradeOfferState.TradeOfferStateAccepted:
Log.Info($"Trade offer {offer.TradeOfferId} has been completed!");
SendChatMessage("Trade completed, thank you!");
break;
case TradeOfferState.TradeOfferStateActive:
case TradeOfferState.TradeOfferStateNeedsConfirmation:
case TradeOfferState.TradeOfferStateInEscrow:
//Trade is still active but incomplete
break;
case TradeOfferState.TradeOfferStateCountered:
Log.Info($"Trade offer {offer.TradeOfferId} was countered");
break;
default:
Log.Info($"Trade offer {offer.TradeOfferId} failed");
break;
}
}

public override void OnTradeAccept()
{
if (Validate() || IsAdmin)
Expand Down
8 changes: 6 additions & 2 deletions SteamBot/SteamTradeDemoHandler.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
using SteamKit2;
using System.Collections.Generic;
using SteamTrade;
using SteamTrade.TradeOffer;

namespace SteamBot
{
Expand Down Expand Up @@ -194,9 +195,12 @@ public override void OnTradeReady (bool ready)
}
}

public override void OnTradeSuccess()
public override void OnTradeOfferUpdated(TradeOffer offer)
{
Log.Success("Trade Complete.");
if(offer.OfferState == TradeOfferState.TradeOfferStateAccepted)
{
Log.Success("Trade Complete.");
}
}

public override void OnTradeAwaitingConfirmation(long tradeOfferID)
Expand Down
12 changes: 9 additions & 3 deletions SteamBot/TradeOfferUserHandler.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,15 @@ public class TradeOfferUserHandler : UserHandler
{
public TradeOfferUserHandler(Bot bot, SteamID sid) : base(bot, sid) { }

public override void OnNewTradeOffer(TradeOffer offer)
public override void OnTradeOfferUpdated(TradeOffer offer)
{
if(offer.OfferState == TradeOfferState.TradeOfferStateAccepted)
{
OnNewTradeOffer(offer);
}
}

private void OnNewTradeOffer(TradeOffer offer)
{
//receiving a trade offer
if (IsAdmin)
Expand Down Expand Up @@ -112,8 +120,6 @@ public override void OnTradeError(string error) { }

public override void OnTradeTimeout() { }

public override void OnTradeSuccess() { }

public override void OnTradeAwaitingConfirmation(long tradeOfferID) { }

public override void OnTradeInit() { }
Expand Down
Loading

0 comments on commit e15d13e

Please sign in to comment.