private TradeOfferTransaction UpdateTradeOffer(TradeOfferTransaction transaction) { try { var doc = new Document <dynamic> { Id = Guid.NewGuid().ToString(), Content = transaction, }; var r = _bucket.Upsert(doc); if (r.Success) { Log.Info("Trade Offer Persisted"); } else { Log.Error("Error in persisting TradeOffer"); } } catch (Exception e) { Log.Error(e); } return(transaction); }
private void Pay(PaymentMessage msg) { var transaction = new TradeOfferTransaction(msg.TransactionId); try { var doc = _dataAccess.Ask <DataAccessMessage <TradeOfferTransaction> >(new DataAccessMessage <TradeOfferTransaction>(transaction, DataAccessActionType.Retrieve)).Result; transaction = doc.Content; if (transaction != null) { transaction = new TradeOfferTransaction(transaction, msg); } else { transaction = new TradeOfferTransaction(msg); Log.Warn($"No transaction id = {msg.TransactionId} found in the Database! Needs support"); } var result = _dataAccess.Ask <DataAccessMessage <TradeOfferTransaction> >(new DataAccessMessage <TradeOfferTransaction>(transaction, DataAccessActionType.UpdateTradeOffer)); if (transaction.State == TradeOfferTransactionState.Completed) { Log.Info($"Transaction {transaction.Id} has been completed already, user paid extra ammount Price = {transaction.Price}, Paid ammount = {transaction.PaidAmmount}"); } _bots.FirstOrDefault(b => b.Path.Name == transaction.BotPath)?.Tell(new PaymentNotificationMessage(transaction)); } catch (Exception e) { Log.Error(e); } }
public void RetrieveTest() { var dataAccessor = Sys.ActorOf(DataAccessActor.Props(new List <IActorRef> { TestActor }), "data"); var json = File.ReadAllText("json/tradeOfferTransaction.json"); var transaction = JsonConvert.DeserializeObject <TradeOfferTransaction>(json); transaction = new TradeOfferTransaction(transaction.TradeOfferId); var ob = dataAccessor.Ask(new DataAccessMessage <TradeOfferTransaction>(transaction, DataAccessActionType.Retrieve)).Result; }
private TradeOfferTransaction Retrieve(TradeOfferTransaction transaction) { List <TradeOfferTransaction> resultList = null; try { if (transaction.Id != Guid.Empty) { var result = _bucket.Query <TradeOfferTransaction>( $"select id, offer, offerState, paidAmmount, price, state, timeStamp, tradeOfferId, buyer, botPath from `TreasureHunter` where id = '{transaction.Id}';"); if (result.Success) { resultList = result.Rows; } else { Log.Error("Cannot find"); return(null); } } else if (transaction.TradeOfferId != null) { var result = _bucket.Query <TradeOfferTransaction>($"select id, offer, offerState, paidAmmount, price, state, timeStamp, tradeOfferId, buyer, botPath from `TreasureHunter` where tradeOfferId = '{transaction.TradeOfferId}';"); if (result.Success) { resultList = result.Rows; } else { Log.Error("Cannot find"); return(null); } } } catch (Exception e) { Log.Error(e);; return(null); } return(resultList?.OrderBy(t => t.TimeStamp)?.LastOrDefault()); }
public override void OnTradeOfferUpdated(TradeOffer offer) { var escowDuration = Bot.GetEscrowDuration(offer.TradeOfferId); var error = Bot.CheckIfBotCanAcceptTradeOffer(offer.TradeOfferId); if (error != null) { Log.Warn(error); if (error.Contains("unable to trade")) { SendChatMessage("Bot Unable to Trade. Please Cancel your trade Offer"); return; } if (error.Contains("This trade offer is no longer valid.")) { return; } } var itemsTuple = GetItems(offer); var ourItemString = Environment.NewLine + string.Join(Environment.NewLine + " ", itemsTuple.Item1.Select(i => i.ToString())); var theirItemString = Environment.NewLine + string.Join(Environment.NewLine + " ", itemsTuple.Item2.Select(i => i.ToString())); Log.Info($"Order Update from {Bot.SteamFriends.GetFriendPersonaName(offer.PartnerSteamId)} OrderId = " + offer.TradeOfferId); Log.Info("They want " + ourItemString); Log.Info("I will get " + theirItemString); double price = Bot.Valuate(itemsTuple.Item1, itemsTuple.Item2); var transaction = Bot .UpdateTradeOffer(new TradeOfferTransaction(offer.TradeOfferId), DataAccessActionType.Retrieve); var oldTransaction = transaction; if (transaction == null) { transaction = new TradeOfferTransaction(offer, TradeOfferTransactionState.New, price, Bot); } else { transaction = new TradeOfferTransaction(transaction, offer); } Log.Info(transaction); if (transaction.State != TradeOfferTransactionState.Paid && oldTransaction?.State == transaction.State && oldTransaction?.OfferState == transaction.OfferState) //force update paid status { Log.Info("Incoming TradeOffer is not updated, Skip"); return; } switch (offer.OfferState) { case TradeOfferState.TradeOfferStateAccepted: Log.Info($"Trade offer {offer.TradeOfferId} from {Bot.SteamFriends.GetFriendPersonaName(offer.PartnerSteamId)} has been completed!"); transaction = new TradeOfferTransaction(transaction, TradeOfferTransactionState.Completed); SendChatMessage("Trade completed, thank you!"); Log.Info("Update the Offer..."); Bot.UpdateTradeOffer(transaction, DataAccessActionType.UpdateTradeOffer); return; case TradeOfferState.TradeOfferStateActive: Log.Info("Update the Offer..."); Bot .UpdateTradeOffer(transaction, DataAccessActionType.UpdateTradeOffer); if (!offer.IsOurOffer) { switch (transaction.State) { case TradeOfferTransactionState.New: Log.Info("New Trade Found"); if (escowDuration.DaysMyEscrow > 0) { SendChatMessage( $"WARNING!!!!! This Bot is under Trade escowDuration and the items you buying will be hold by steam for {escowDuration.DaysMyEscrow}, if you don't want to proceed please cancel the tradeoffer and do not pay"); } if (escowDuration.DaysTheirEscrow > 0) { SendChatMessage( $"WARNING!!!!! You are under Trade escowDuration and the items you buying will be hold by steam for {escowDuration.DaysMyEscrow}, if you don't want to proceed please cancel the tradeoffer and do not pay"); } SendChatMessage($"Please pay SGD ${transaction.Price} to {"Kiljaeden"} for Order {transaction.Id}"); break; case TradeOfferTransactionState.Paid: case TradeOfferTransactionState.Completed: Log.Info($"Existing Trade, Paid completed {transaction.Id}"); Bot.PaymentNotifySelf(transaction); break; case TradeOfferTransactionState.PartialPaid: Log.Info($"Existing Trade, Partial Paid, Price = {transaction.Price}, PaidAmmount = {transaction.PaidAmmount} {transaction.Id}"); SendChatMessage( $"Please pay SGD ${transaction.Price - transaction.PaidAmmount} to {"Kiljaeden"} for Order {transaction.Id}"); break; case TradeOfferTransactionState.Expired: Log.Info($"Existing Trade, Transaction Expired"); SendChatMessage( $"Payment Period Expired for Order {transaction.Id}"); offer.Decline(); break; default: throw new ArgumentOutOfRangeException(); } } break; case TradeOfferState.TradeOfferStateNeedsConfirmation: Log.Info("Update the Offer..."); Bot .UpdateTradeOffer(transaction, DataAccessActionType.UpdateTradeOffer); Log.Info($"Trade offer {offer.TradeOfferId} from {Bot.SteamFriends.GetFriendPersonaName(offer.PartnerSteamId)} Needs Confirmation - " + Environment.NewLine + "Bot:" + (offer.Items.GetMyItems().Count > 0) + Environment.NewLine + "{Bot.SteamFriends.GetFriendPersonaName(offer.PartnerSteamId)}: " + (offer.Items.GetTheirItems().Count > 0)); switch (transaction.State) { case TradeOfferTransactionState.Completed: if (offer.Items.GetTheirItems().Count > 0) { SendChatMessage($"Please Confirm Trade"); } break; case TradeOfferTransactionState.Paid: if (offer.Items.GetTheirItems().Count > 0) { SendChatMessage($"Please Confirm Trade"); } Bot.PaymentNotifySelf(transaction); break; case TradeOfferTransactionState.New: case TradeOfferTransactionState.PartialPaid: Log.Error("Trade reachs confirmation stage but transaction is at " + transaction.State); break; } break; case TradeOfferState.TradeOfferStateInEscrow: Log.Info("Update the Offer..."); Bot .UpdateTradeOffer(transaction, DataAccessActionType.UpdateTradeOffer); Log.Info($"Trade offer {offer.TradeOfferId} from {Bot.SteamFriends.GetFriendPersonaName(offer.PartnerSteamId)} in Escow"); switch (transaction.State) { case TradeOfferTransactionState.Completed: Log.Info($"Trade offer {offer.TradeOfferId} from {Bot.SteamFriends.GetFriendPersonaName(offer.PartnerSteamId)} Needs {(offer.IsOurOffer ? "bot" : offer.TradeOfferId)} Confirmation"); string @object = offer.IsOurOffer ? "Bot's" : "Your"; Log.Info($"Existing Trade, Paid completed {transaction.Id}¡£ Due to {@object} Account Limitation, the Trade is on-hold by steam"); SendChatMessage($"Due to {@object} Account Limitation, the Trade is on-hold by steam"); break; case TradeOfferTransactionState.New: case TradeOfferTransactionState.Paid: case TradeOfferTransactionState.PartialPaid: Log.Error("Trade reachs escow stage but transaction is at " + transaction.State); break; } break; case TradeOfferState.TradeOfferStateCountered: Log.Info("Update the Offer..."); Bot .UpdateTradeOffer(transaction, DataAccessActionType.UpdateTradeOffer); Log.Info($"Trade offer {offer.TradeOfferId} was countered by " + (offer.IsOurOffer ? "bot" : Bot.SteamFriends.GetFriendPersonaName(offer.PartnerSteamId))); break; case TradeOfferState.TradeOfferStateInvalid: case TradeOfferState.TradeOfferStateExpired: case TradeOfferState.TradeOfferStateCanceled: case TradeOfferState.TradeOfferStateDeclined: case TradeOfferState.TradeOfferStateInvalidItems: case TradeOfferState.TradeOfferStateCanceledBySecondFactor: case TradeOfferState.TradeOfferStateUnknown: Log.Info("Update the Offer..."); Bot .UpdateTradeOffer(transaction, DataAccessActionType.UpdateTradeOffer); Log.Info($"Trade offer {offer.TradeOfferId} failed because of {offer.OfferState}"); switch (transaction.State) { case TradeOfferTransactionState.Completed: Log.Info($"Existing Trade, Paid completed {transaction.Id}"); SendChatMessage($"Due to Unknown failure, we have received your payment but the item is not traded, Please contact our support"); break; case TradeOfferTransactionState.PartialPaid: Log.Info($"Existing Trade, Paid partially ammount = {transaction.PaidAmmount} for {transaction.Id}"); SendChatMessage($"Due to Unknown failure, we have received your partial payment but the item is not traded, Please contact our support"); break; case TradeOfferTransactionState.New: case TradeOfferTransactionState.Paid: Log.Error("Trade reachs escow stage but transaction is at " + transaction.State); break; } break; } Log.Info("Update the Offer..."); Bot .UpdateTradeOffer(transaction, DataAccessActionType.UpdateTradeOffer); }