public static async Task Purchase(UserViewModel user, IEnumerable <string> arguments)
        {
            if (arguments.Count() == 0)
            {
                List <string> items = new List <string>();
                foreach (RedemptionStoreProductModel product in ChannelSession.Settings.RedemptionStoreProducts.Values.ToList())
                {
                    if (product.IsInfinite || product.CurrentAmount > 0)
                    {
                        items.Add(product.Name);
                    }
                }
                await ChannelSession.Services.Chat.SendMessage("Products Available to Purchase: " + string.Join(", ", items), platform : user.Platform);
            }
            else
            {
                string name = string.Join(" ", arguments);
                RedemptionStoreProductModel product = ChannelSession.Settings.RedemptionStoreProducts.Values.ToList().FirstOrDefault(p => p.Name.Equals(name, StringComparison.CurrentCultureIgnoreCase));
                if (product == null)
                {
                    if (ChannelSession.Services.Chat != null)
                    {
                        await ChannelSession.Services.Chat.SendMessage(MixItUp.Base.Resources.NoRedemptionStoreProductWithThatName);
                    }
                    return;
                }

                if (!product.IsInfinite)
                {
                    if (product.CurrentAmount <= 0)
                    {
                        if (ChannelSession.Services.Chat != null)
                        {
                            await ChannelSession.Services.Chat.SendMessage(MixItUp.Base.Resources.NoMoreRedemptionStoreProducts);
                        }
                        return;
                    }

                    ThresholdRequirementModel threshold = product.Requirements.Threshold;
                    if (threshold != null && threshold.IsEnabled && threshold.Amount > product.CurrentAmount)
                    {
                        if (ChannelSession.Services.Chat != null)
                        {
                            await ChannelSession.Services.Chat.SendMessage(MixItUp.Base.Resources.NotEnoughRedemptionStoreProducts);
                        }
                        return;
                    }
                }

                Result result = await product.Requirements.Validate(new CommandParametersModel(user, arguments));

                if (result.Success)
                {
                    await product.Requirements.Perform(new CommandParametersModel(user, arguments));

                    foreach (CommandParametersModel u in product.Requirements.GetPerformingUsers(new CommandParametersModel(user, arguments)))
                    {
                        if (!product.IsInfinite)
                        {
                            product.CurrentAmount--;
                        }

                        RedemptionStorePurchaseModel purchase = new RedemptionStorePurchaseModel(product, u.User);
                        ChannelSession.Settings.RedemptionStorePurchases.Add(purchase);

                        if (product.AutoRedeem)
                        {
                            await purchase.Redeem();
                        }
                        else
                        {
                            purchase.State = RedemptionStorePurchaseRedemptionState.ManualRedeemNeeded;
                            u.SpecialIdentifiers[RedemptionStoreProductModel.ProductNameSpecialIdentifier] = product.Name;

                            CommandModelBase command = ChannelSession.Settings.GetCommand(ChannelSession.Settings.RedemptionStoreManualRedeemNeededCommandID);
                            if (command != null)
                            {
                                await ChannelSession.Services.Command.Queue(command, u);
                            }

                            GlobalEvents.RedemptionStorePurchasesUpdated();
                        }
                    }
                }
            }
        }
 public ThresholdRequirementViewModel(ThresholdRequirementModel requirement)
 {
     this.Amount         = requirement.Amount;
     this.TimeSpan       = requirement.TimeSpan;
     this.RunForEachUser = requirement.RunForEachUser;
 }