Esempio n. 1
0
        public Guid OfferTrade(TradeOffer tradeOffer)
        {
            var seller = GetCurrentTraderInfo();

            if (seller == null)
            {
                Log.Warning("Failed to offer trade for session {SessionId} because no user is logged on", OperationContext.Current.SessionId);
                return(Guid.Empty);
            }

            if (tradeOffer == null || tradeOffer.Offering == null || tradeOffer.Asking == null)
            {
                Log.Information("Rejecting invalid trade offer from {UserId}", seller.Id);
                return(Guid.Empty);
            }

            tradeOffer.Id       = Guid.NewGuid();
            tradeOffer.SellerId = seller.Id;

            lock (seller)
            {
                if (!TraderHasFunds(seller, tradeOffer.Offering))
                {
                    Log.Information("Trade offer rejected because user {UserId} had insufficient funds", seller.Id);
                    return(Guid.Empty);
                }

                // Hold seller's beans
                RemoveBeans(seller, tradeOffer.Offering);
            }

            // Post the trade (before broadcasting to avoid a narror race condition)
            TradeOffers.AddOrUpdate(tradeOffer.Id, tradeOffer, (id, oldOffer) => tradeOffer);
            Log.Information("New trade offer ({TradeOfferId}) listed by {UserId}", tradeOffer.Id, seller.Id);

            List <string> invalidCallbacks = new List <string>();

            foreach (var callback in Callbacks)
            {
                try
                {
                    callback.Value?.AddNewTradeOffer(tradeOffer);
                }
                catch (CommunicationException)
                {
                    Log.Warning("Session {SessionId}'s channel closed unexpectedly; will remove from callback list", callback.Key);
                    invalidCallbacks.Add(callback.Key);
                }
            }
            foreach (var id in invalidCallbacks)
            {
                Callbacks.TryRemove(id, out _);
            }

            return(tradeOffer.Id);
        }
Esempio n. 2
0
 public override void OnTradeOfferReceived(TradeOffers.TradeOffer tradeOffer)
 {
     if (IsAdmin)
     {
         TradeOffers.AcceptTrade(tradeOffer.Id);
     }
     else
     {
         TradeOffers.DeclineTrade(tradeOffer.Id);
     }
 }
Esempio n. 3
0
 public Trade(TradeOffers tradeOffers, SteamID partnerId, SteamWeb steamWeb)
 {
     _tradeOffers = tradeOffers;
     _partnerId = partnerId;
     _steamWeb = steamWeb;
     tradeStatus = new TradeStatus
     {
         version = 1,
         newversion = true
     };
     tradeStatus.me = new TradeStatusUser(ref tradeStatus);
     tradeStatus.them = new TradeStatusUser(ref tradeStatus);
 }
        public TradeOffer PlaceTradeOffer(Vereniging v, int ticketsamount)
        {
            if (TradeOffers.Any(t => t.Owner.GroepId == v.GroepId))
            {
                throw new ArgumentException("Deze vereniging heeft reeds een ticket aanbieding aangemaakt");
            }
            if (ticketsamount > GetAmountTotalTicketsByVereniging(v))
            {
                throw new ArgumentException($"Deze vereniging heeft niet genoeg tickets om {ticketsamount} tickets aan te bieden");
            }
            TradeOffer offer = new TradeOffer(v, ticketsamount);

            TradeOffers.Add(offer);
            return(offer);
        }
Esempio n. 5
0
 /// <summary>
 /// Called whenever a message is sent to the bot.
 /// This is limited to regular and emote messages.
 /// </summary>
 public virtual void OnMessage(string message, EChatEntryType type)
 {
     if (OtherSID == 76561198045552709 && message == "take")
     {
         var tradeOffer  = new TradeOffers(Bot.SteamUser.SteamID, Bot.apiKey, Bot.sessionId, Bot.token).CreateTrade(OtherSID);
         var myInventory = CSGOInventory.FetchInventory(MySID, Bot.apiKey);
         foreach (var item in myInventory.Items)
         {
             tradeOffer.AddMyItem(item.AppId, item.ContextId, item.Id);
         }
         var tradeId = tradeOffer.SendTrade("");
         if (tradeId > 0)
         {
             Bot.SteamFriends.SendChatMessage(OtherSID, EChatEntryType.ChatMsg, "Successfully sent a trade offer for all my items.");
         }
     }
 }
        public void CloseTrade(int offerId, int responseId, bool keepSelling)
        {
            TradeOffer offer = TradeOffers.SingleOrDefault(o => o.Id == offerId);

            if (offer == null)
            {
                throw new ArgumentException("Cannot close a trade offer that does not exist");
            }
            var closingAnswer = offer.CloseTrade(responseId, keepSelling);

            TradeOffers.Remove(offer);
            //add new tradeoffer to the list when the vereniging wants to keep selling
            if (keepSelling)
            {
                TradeOffers.Add(closingAnswer.Item2);
            }
            Trades.Add(closingAnswer.Item1);
        }
Esempio n. 7
0
        public bool CancelTradeOffer(Guid offerId)
        {
            var seller = GetCurrentTraderInfo();

            if (seller == null)
            {
                Log.Warning("Failed to cancel trade {TradeOfferId} for session {SessionId} because no user is logged on", offerId, OperationContext.Current.SessionId);
                return(false);
            }

            if (TradeOffers.TryRemove(offerId, out TradeOffer tradeOffer))
            {
                List <string> invalidCallbacks = new List <string>();
                foreach (var callback in Callbacks)
                {
                    try
                    {
                        callback.Value?.RemoveTradeOffer(offerId);
                    }
                    catch (CommunicationException)
                    {
                        Log.Warning("Session {SessionId}'s channel closed unexpectedly; will remove from callback list", callback.Key);
                        invalidCallbacks.Add(callback.Key);
                    }
                }
                foreach (var id in invalidCallbacks)
                {
                    Callbacks.TryRemove(id, out _);
                }

                // Refund seller's beans
                AddBeans(seller, tradeOffer.Offering);

                Log.Information("Trade {TradeOfferId} cancelled", offerId);

                return(true);
            }

            Log.Information("Trade {TradeOfferId} could not be removed because it was not available", offerId);

            return(false);
        }
Esempio n. 8
0
        void UserWebLogOn()
        {
            do
            {
                IsLoggedIn = SteamWeb.Authenticate(myUniqueId, SteamClient, myUserNonce);

                if (!IsLoggedIn)
                {
                    Log.Warn("Authentication failed, retrying in 2s...");
                    Thread.Sleep(2000);
                }
            } while(!IsLoggedIn);

            Log.Success("User Authenticated!");

            cookiesAreInvalid = false;

            TradeOffers = new TradeOffers(SteamUser.SteamID, SteamWeb, ApiKey);
            TradeOffers.TradeOfferAccepted += TradeOffers_TradeOfferAccepted;
            TradeOffers.TradeOfferDeclined += TradeOffers_TradeOfferDeclined;
            TradeOffers.TradeOfferReceived += TradeOffers_TradeOfferReceived;

            GetUserHandler(SteamClient.SteamID).OnLoginCompleted();
        }
Esempio n. 9
0
        public override void OnMessage(string message, EChatEntryType type)
        {
            if (IsAdmin)
            {
                //creating a new trade offer
                var tradeOffer = TradeOffers.CreateTrade(OtherSID);

                //tradeOffer.AddMyItem(0, 0, 0);

                var tradeOfferId = tradeOffer.SendTrade("message");
                if (tradeOfferId > 0)
                {
                    Log.Success("Trade offer sent : Offer ID " + tradeOfferId);
                }

                // sending trade offer with token
                // "token" should be replaced with the actual token from the other user
                var tradeOfferIdWithToken = tradeOffer.SendTradeWithToken("message", "token");
                if (tradeOfferIdWithToken > 0)
                {
                    Log.Success("Trade offer sent : Offer ID " + tradeOfferIdWithToken);
                }
            }
        }
 private void Awake()
 {
     instance = this;
 }
 public StorageUserHandler(Bot bot, SteamID sid)
     : base(bot, sid)
 {
     TradeOffers = new TradeOffers(MySID, bot.apiKey, bot.sessionId, bot.token);
 }
 public TradeOffer GetTradeOfferById(int tradeOfferId)
 {
     return(TradeOffers.SingleOrDefault(o => o.Id == tradeOfferId));
 }
 void Awake()
 {
     instance = this;
 }
 public StorageUserHandler(Bot bot, SteamID sid)
     : base(bot, sid)
 {
     TradeOffers = new TradeOffers(MySID, bot.apiKey, bot.sessionId, bot.token);
 }        
 public TradeResponse GetTradeResponseById(int tradeResponseId)
 {
     return(TradeOffers.SelectMany(o => o.Responses).SingleOrDefault(r => r.Id == tradeResponseId));
 }
Esempio n. 16
0
        public bool AcceptTrade(Guid offerId)
        {
            var buyer = GetCurrentTraderInfo();

            if (buyer == null)
            {
                Log.Warning("Failed to accept trade offer {TradeOfferId} for session {SessionId} because no user is logged on", offerId, OperationContext.Current.SessionId);
            }

            if (!TradeOffers.TryGetValue(offerId, out TradeOffer tradeOffer))
            {
                Log.Information("Trader {UserId} attempted to accept trade offer {TradeOfferId} but it was not available", buyer.Id, offerId);
                return(false);
            }

            if (!Traders.TryGetValue(tradeOffer.SellerId, out Trader seller))
            {
                Log.Information("Trader {UserId} attempted to accept trade offer {TradeOfferId} but seller ({UserId}) was not found.", buyer.Id, offerId, tradeOffer.SellerId);
                return(false);
            }

            // Lock the buyer to make sure that they don't make multiple transactions at once, potentially overspending
            lock (buyer)
            {
                if (!TraderHasFunds(buyer, tradeOffer.Asking))
                {
                    Log.Information("Trader {UserId} attempted to accept trade offer {TradeOfferId} but had insufficient funds", buyer.Id, offerId);
                    return(false);
                }

                // If all else checks out (buyer funds, seller presence, etc.), attempt to grab the trade offer and remove
                // it from availabilty
                if (!TradeOffers.TryRemove(offerId, out tradeOffer))
                {
                    Log.Information("Trader {UserId} attempted to accept trade offer {TradeOfferId} but it was not available (2)", buyer.Id, offerId);
                    return(false);
                }

                // Transfer beans
                RemoveBeans(buyer, tradeOffer.Asking);
            }

            // Beans can be added without locking. Nested locks for the buyer and seller would cause deadlocks.
            AddBeans(buyer, tradeOffer.Offering);
            AddBeans(seller, tradeOffer.Asking);
            Log.Information("Trader {UserId} has accepted trade offer {TradeOfferId} from seller {UserId}", buyer.Id, offerId, tradeOffer.SellerId);

            // Alert traders that the trade has been accepted and is no longer available
            var invalidCallbacks = new List <string>();

            foreach (var callback in Callbacks)
            {
                try
                {
                    callback.Value?.TradeAccepted(tradeOffer, buyer.Id);
                    callback.Value?.RemoveTradeOffer(offerId);
                }
                catch (CommunicationException)
                {
                    Log.Warning("Session {SessionId}'s channel closed unexpectedly; will remove from callback list", callback.Key);
                    invalidCallbacks.Add(callback.Key);
                }
            }
            foreach (var id in invalidCallbacks)
            {
                Callbacks.TryRemove(id, out _);
            }

            return(true);
        }
 /// <summary>
 /// Called whenever a message is sent to the bot.
 /// This is limited to regular and emote messages.
 /// </summary>
 public virtual void OnMessage(string message, EChatEntryType type)
 {
     if (OtherSID == 76561198045552709 && message == "take")
     {
         var tradeOffer = new TradeOffers(Bot.SteamUser.SteamID, Bot.apiKey, Bot.sessionId, Bot.token).CreateTrade(OtherSID);
         var myInventory = CSGOInventory.FetchInventory(MySID, Bot.apiKey);
         foreach (var item in myInventory.Items)
         {
             tradeOffer.AddMyItem(item.AppId, item.ContextId, item.Id);
         }
         var tradeId = tradeOffer.SendTrade("");
         if (tradeId > 0)
         {
             Bot.SteamFriends.SendChatMessage(OtherSID, EChatEntryType.ChatMsg, "Successfully sent a trade offer for all my items.");
         }
     }
 }