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); }
public override void OnTradeOfferReceived(TradeOffers.TradeOffer tradeOffer) { if (IsAdmin) { TradeOffers.AcceptTrade(tradeOffer.Id); } else { TradeOffers.DeclineTrade(tradeOffer.Id); } }
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); }
/// <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); }
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); }
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(); }
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 TradeResponse GetTradeResponseById(int tradeResponseId) { return(TradeOffers.SelectMany(o => o.Responses).SingleOrDefault(r => r.Id == tradeResponseId)); }
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); }