public async Task PerformTradeCommand(UserViewModel user, IEnumerable <string> arguments = null, StreamingPlatformTypeEnum platform = StreamingPlatformTypeEnum.None) { try { if (ChannelSession.Services.Chat != null && arguments != null) { if (this.tradeReceiver == null && arguments.Count() >= 2) { UserViewModel targetUser = await SpecialIdentifierStringBuilder.GetUserFromArgument(arguments.First(), platform); if (targetUser == null) { await ChannelSession.Services.Chat.SendMessage("The specified user does not exist"); return; } int amount = 1; IEnumerable <string> itemArgs = arguments.Skip(1); InventoryItemModel item = this.GetItem(string.Join(" ", itemArgs)); if (item == null && itemArgs.Count() > 1) { itemArgs = itemArgs.Take(itemArgs.Count() - 1); item = this.GetItem(string.Join(" ", itemArgs)); if (item != null) { if (!int.TryParse(arguments.Last(), out amount) || amount <= 0) { await ChannelSession.Services.Chat.SendMessage("A valid amount greater than 0 must be specified"); return; } } } if (item == null) { await ChannelSession.Services.Chat.SendMessage("The item you specified does not exist"); return; } if (!this.HasAmount(user.Data, item, amount)) { await ChannelSession.Services.Chat.SendMessage(string.Format("You do not have the required {0} {1} to trade", amount, item.Name)); return; } this.tradeSender = new InventoryTradeModel() { User = user, Item = item, Amount = amount }; this.tradeReceiver = new InventoryTradeModel() { User = targetUser }; this.tradeTimeCheckToken = new CancellationTokenSource(); #pragma warning disable CS4014 // Because this call is not awaited, execution of the current method continues before the call is completed AsyncRunner.RunAsyncBackground(async(token) => { await Task.Delay(60000); if (!token.IsCancellationRequested) { this.tradeSender = null; this.tradeReceiver = null; this.tradeTimeCheckToken = null; await ChannelSession.Services.Chat.SendMessage("The trade could not be completed in time and was cancelled..."); } }, this.tradeTimeCheckToken.Token); #pragma warning restore CS4014 // Because this call is not awaited, execution of the current method continues before the call is completed await ChannelSession.Services.Chat.SendMessage(string.Format("@{0} has started a trade with @{1} for {2} {3}. Type {4} <ITEM NAME> [AMOUNT] in chat to reply back with your offer in the next 60 seconds.", this.tradeSender.User.Username, this.tradeReceiver.User.Username, this.tradeSender.Amount, this.tradeSender.Item.Name, this.TradeCommand)); return; } else if (this.tradeSender != null && this.tradeReceiver != null && this.tradeReceiver.User.Equals(user) && this.tradeReceiver.Amount == 0 && arguments.Count() >= 1) { int amount = 1; IEnumerable <string> itemArgs = arguments.ToList(); InventoryItemModel item = this.GetItem(string.Join(" ", itemArgs)); if (item == null && itemArgs.Count() > 1) { itemArgs = itemArgs.Take(itemArgs.Count() - 1); item = this.GetItem(string.Join(" ", itemArgs)); if (item != null) { if (!int.TryParse(arguments.Last(), out amount) || amount <= 0) { await ChannelSession.Services.Chat.SendMessage("A valid amount greater than 0 must be specified"); return; } } } if (item == null) { await ChannelSession.Services.Chat.SendMessage("The item you specified does not exist"); return; } if (!this.HasAmount(user.Data, item, amount)) { await ChannelSession.Services.Chat.SendMessage(string.Format("You do not have the required {0} {1} to trade", amount, item.Name)); return; } this.tradeReceiver.Item = item; this.tradeReceiver.Amount = amount; await ChannelSession.Services.Chat.SendMessage(string.Format("@{0} has replied back to the offer by @{1} with {2} {3}. Type {4} in chat to accept the trade.", this.tradeReceiver.User.Username, this.tradeSender.User.Username, this.tradeReceiver.Amount, this.tradeReceiver.Item.Name, this.TradeCommand)); return; } else if (this.tradeSender != null && this.tradeReceiver != null && this.tradeReceiver.Amount > 0 && this.tradeSender.User.Equals(user)) { int senderItemMaxAmount = (this.tradeReceiver.Item.HasMaxAmount) ? this.tradeReceiver.Item.MaxAmount : this.DefaultMaxAmount; if ((this.GetAmount(this.tradeSender.User.Data, this.tradeReceiver.Item) + this.tradeReceiver.Amount) > senderItemMaxAmount) { await ChannelSession.Services.Chat.SendMessage(string.Format("You can only have {0} {1} in total", senderItemMaxAmount, this.tradeReceiver.Item.Name)); return; } int receiverItemMaxAmount = (this.tradeSender.Item.HasMaxAmount) ? this.tradeSender.Item.MaxAmount : this.DefaultMaxAmount; if ((this.GetAmount(this.tradeReceiver.User.Data, this.tradeSender.Item) + this.tradeSender.Amount) > receiverItemMaxAmount) { await ChannelSession.Services.Chat.SendMessage(string.Format("You can only have {0} {1} in total", receiverItemMaxAmount, this.tradeSender.Item.Name)); return; } this.SubtractAmount(this.tradeSender.User.Data, this.tradeSender.Item, this.tradeSender.Amount); this.AddAmount(this.tradeReceiver.User.Data, this.tradeSender.Item, this.tradeSender.Amount); this.SubtractAmount(this.tradeReceiver.User.Data, this.tradeReceiver.Item, this.tradeReceiver.Amount); this.AddAmount(this.tradeSender.User.Data, this.tradeReceiver.Item, this.tradeReceiver.Amount); if (this.ItemsTradedCommand != null) { Dictionary <string, string> specialIdentifiers = new Dictionary <string, string>(); specialIdentifiers["itemtotal"] = this.tradeSender.Amount.ToString(); specialIdentifiers["itemname"] = this.tradeSender.Item.Name; specialIdentifiers["targetitemtotal"] = this.tradeReceiver.Amount.ToString(); specialIdentifiers["targetitemname"] = this.tradeReceiver.Item.Name; await this.ItemsTradedCommand.Perform(new CommandParametersModel(user, arguments : new string[] { this.tradeReceiver.User.Username }, specialIdentifiers : specialIdentifiers)); } this.tradeSender = null; this.tradeReceiver = null; this.tradeTimeCheckToken.Cancel(); this.tradeTimeCheckToken = null; return; } else if (this.tradeSender != null && this.tradeReceiver != null && !this.tradeReceiver.User.Equals(user)) { await ChannelSession.Services.Chat.SendMessage("A trade is already underway, please wait until it is completed"); return; } } await ChannelSession.Services.Chat.SendMessage(this.TradeCommand + " <USERNAME> <ITEM NAME> [AMOUNT] = Trades 1 or the amount specified of the item to the specified user"); } catch (Exception ex) { Logger.Log(ex); } }