Exemple #1
0
        private static string DoDrugSpikeDown(int userId, DrugBotDataContext db, IDialogContext context)
        {
            // randomize the drug to spike
            var drugs = db.GetDrugs().ToList();
            var drug  = drugs.ElementAt(rand.Next(0, drugs.Count()));

            // todo: put these bounds somewhere static or configurable
            // adjust drug price, % of the min
            var spikeRate  = GetRandomDoubleBetween(0.20, 0.40);
            var minPrice   = drug.MinPrice;
            var spikePrice = (int)(minPrice * spikeRate);

            if (spikePrice <= 0)
            {
                spikePrice = 1;
            }

            var drugPrices = context.UserData.Get <Dictionary <int, int> >(StateKeys.DrugPrices);

            drugPrices[drug.DrugId] = spikePrice;
            context.UserData.SetValue(StateKeys.DrugPrices, drugPrices);

            var spikeText = RandomDownSpikeText();

            return($"{spikeText} {drug.Name} prices have bottomed out!");
        }
Exemple #2
0
        private async Task MessageReceivedAsync(IDialogContext context, IAwaitable <IMessageActivity> result)
        {
            var message = await result;

            if (message.Text.ToLower() == "cancel")
            {
                this.Done(context);
            }
            else
            {
                var db = new DrugBotDataContext();

                var drugs = db.GetDrugs().ToList()
                            .Select(x => new
                {
                    Name   = x.Name.ToLower(),
                    DrugId = x.DrugId,
                });

                var drugPrices = this.GetDrugPrices(context);

                if (drugs.Any(x => x.Name == message.Text.ToLower()))
                {
                    var drug = drugs.Single(x => x.Name == message.Text.ToLower());

                    var user      = this.GetUser(context);
                    var inventory = user.Inventory.FirstOrDefault(x => x.DrugId == drug.DrugId);

                    if (inventory != null && inventory.Quantity > 0)
                    {
                        if (drugPrices.Any(x => x.Key == drug.DrugId))
                        {
                            context.UserData.SetValue(StateKeys.DrugToSell, drug.Name);

                            // get inventory
                            var qty = user.Inventory.Single(x => x.DrugId == drug.DrugId).Quantity;

                            // prompt for quantity
                            PromptDialog.Number(context, SellQuantityAsync, $"You have {qty:n0}. How much do you want to sell?");
                        }
                    }
                    else
                    {
                        await context.PostAsync("You don't have any of that. Type CANCEL if you don't want to sell anything.");

                        context.Wait(MessageReceivedAsync);
                    }
                }
                else
                {
                    await context.PostAsync("You can't sell that...Type CANCEL if you don't want to sell anything.");

                    context.Wait(MessageReceivedAsync);
                }
            }
        }
Exemple #3
0
        private async Task MessageReceivedAsync(IDialogContext context, IAwaitable <IMessageActivity> result)
        {
            var message = await result;

            if (message.Text.ToLower() == "cancel")
            {
                this.Done(context);
            }
            else
            {
                var db    = new DrugBotDataContext();
                var drugs = db.GetDrugs().ToList()
                            .Select(x => new
                {
                    DrugId = x.DrugId,
                    Name   = x.Name.ToLower(),
                });

                if (drugs.Any(x => x.Name == message.Text.ToLower()))
                {
                    // send intended drug to state
                    // confirm db record matches, so we store a good drug name to bot state
                    var drug = drugs.Single(x => x.Name == message.Text.ToLower());
                    context.UserData.SetValue(StateKeys.DrugToBuy, drug.Name);

                    // get affordability
                    var user      = this.GetUser(context);
                    var drugPrice = this.GetDrugPrices(context).Single(x => x.Key == drug.DrugId).Value;
                    var canAfford = user.Wallet / drugPrice;
                    var canHold   = user.InventorySize - user.Inventory.Sum(x => x.Quantity);

                    // prompt for quantity
                    PromptDialog.Number(context, BuyQuantityAsync, $"You can afford {canAfford:n0} and hold {canHold}. How much do you want to buy?");
                }
                else
                {
                    await context.PostAsync("You can't buy that...Type CANCEL if you don't want to buy anything.");

                    context.Wait(MessageReceivedAsync);
                }
            }
        }
Exemple #4
0
        private static string DoDrugSpike(int userId, DrugBotDataContext db, IDialogContext context)
        {
            // randomize the drug to spike
            var drugs = db.GetDrugs().ToList();
            var drug  = drugs.ElementAt(rand.Next(0, drugs.Count()));

            // todo: put these bounds somewhere static or configurable
            // adjust drug price, 50% to 400% over the max
            var spikeRate  = GetRandomDoubleBetween(0.50, 4.0);
            var maxPrice   = drug.MaxPrice;
            var spikePrice = (int)(maxPrice + (maxPrice * spikeRate));

            var drugPrices = context.UserData.Get <Dictionary <int, int> >(StateKeys.DrugPrices);

            drugPrices[drug.DrugId] = spikePrice;
            context.UserData.SetValue(StateKeys.DrugPrices, drugPrices);

            var spikeText = RandomSpikeText();

            return($"{spikeText} {drug.Name} prices have gone through the roof!");
        }
Exemple #5
0
        protected Dictionary <int, int> GetDrugPrices(IDialogContext context, bool newPrices = false)
        {
            var drugPrices = new Dictionary <int, int>();

            var db    = new DrugBotDataContext();
            var drugs = db.GetDrugs().ToList();

            if (!context.UserData.TryGetValue(StateKeys.DrugPrices, out drugPrices) || newPrices)
            {
                drugPrices = new Dictionary <int, int>();

                foreach (var drug in drugs)
                {
                    var price = rand.Next(drug.MinPrice, drug.MaxPrice);
                    drugPrices.Add(drug.DrugId, price);
                }

                // store to state
                context.UserData.SetValue(StateKeys.DrugPrices, drugPrices);
            }

            return(drugPrices);
        }
Exemple #6
0
        private async Task SellQuantityAsync(IDialogContext context, IAwaitable <long> result)
        {
            var qty = await result;

            if (qty < 1)
            {
                await context.PostAsync("Looks like you don't want to sell any--thanks for wasting my time");

                this.Done(context);
            }
            else
            {
                // yeah, i know this could truncate
                var quantity = Convert.ToInt32(qty);
                var db       = new DrugBotDataContext();

                var userId = context.UserData.Get <int>(StateKeys.UserId);
                var user   = db.Users.Single(x => x.UserId == userId);

                var drugs = db.GetDrugs().ToList()
                            .Select(x => new
                {
                    Name      = x.Name,
                    NameLower = x.Name.ToLower(),
                    DrugId    = x.DrugId,
                });

                // determine drug price
                var drugPrices = this.GetDrugPrices(context);
                var drugToSell = context.UserData.Get <string>(StateKeys.DrugToSell);
                var drug       = drugs.Single(x => x.NameLower == drugToSell);

                if (user.Inventory.Any(x => x.DrugId == drug.DrugId && x.Quantity >= quantity))
                {
                    var price = drugPrices[drug.DrugId];

                    var total = price * quantity;
                    user.Wallet += total;
                    var item = user.Inventory.Single(x => x.DrugId == drug.DrugId);
                    item.Quantity -= quantity;

                    try
                    {
                        db.Commit();
                    }
                    catch
                    {
                        await context.PostAsync("Something happened when saving your sell inventory. Yeah, I'm still an alpha bot...");
                    }

                    await context.PostAsync($"You sold {qty} for {total:C0}.");

                    await context.PostAsync($"You have {user.Wallet:C0} in your wallet.");

                    this.Done(context);
                }
                else
                {
                    await context.PostAsync("You don't have that much to sell...");

                    this.Done(context);
                }
            }
        }
Exemple #7
0
        private async Task BuyQuantityAsync(IDialogContext context, IAwaitable <long> result)
        {
            var qty = await result;

            // yeah, i know this could truncate
            if (qty < 1)
            {
                await context.PostAsync("Looks like you don't want to buy any--thanks for wasting my time");

                this.Done(context);
            }
            else
            {
                var quantity = Convert.ToInt32(qty);

                // todo: put this somewhere common
                var db = new DrugBotDataContext();

                var userId = context.UserData.Get <int>(StateKeys.UserId);
                var user   = db.Users.FirstOrDefault(x => x.UserId == userId);

                if (user.InventorySize >= user.Inventory.Sum(x => x.Quantity) + qty)
                {
                    var drugs = db.GetDrugs().ToList()
                                .Select(x => new
                    {
                        Name      = x.Name,
                        NameLower = x.Name.ToLower(),
                        DrugId    = x.DrugId,
                    });

                    if (user != null)
                    {
                        // determine drug price
                        var drugPrices = this.GetDrugPrices(context);
                        var drugToBuy  = context.UserData.Get <string>(StateKeys.DrugToBuy);
                        var drug       = drugs.Single(x => x.NameLower == drugToBuy);
                        var price      = drugPrices[drug.DrugId];

                        // check wallet for enough money
                        if (user.Wallet >= price * qty)
                        {
                            var cost = price * quantity;

                            // do transaction
                            user.Wallet -= cost;
                            await context.PostAsync($"You spent {cost:C0} on {qty} units of {drug.Name}");

                            await context.PostAsync($"You have {user.Wallet:C0} remaining");

                            // add inventory
                            if (user.Inventory.Any(x => x.Drug.Name == drug.Name))
                            {
                                // already has zero or more of this drug, add to it
                                var inventory = user.Inventory.FirstOrDefault(x => x.Drug.Name == drug.Name);
                                inventory.Quantity += quantity;
                            }
                            else
                            {
                                // add this inventory for the firs time
                                var inventory = new InventoryItem
                                {
                                    UserId   = user.UserId,
                                    DrugId   = drug.DrugId,
                                    Quantity = quantity,
                                };
                                db.AddInventory(inventory);
                            }

                            try
                            {
                                db.SaveChanges();
                            }
                            catch
                            {
                                await context.PostAsync("Something happened when saving your buy inventory. Yeah, I'm still an alpha bot...");
                            }

                            this.Done(context);
                        }
                        else
                        {
                            await context.PostAsync("You don't have enough money to buy that.");

                            this.Done(context);
                        }
                    }
                }
                else
                {
                    // not enough inventory space
                    await context.PostAsync("You don't have enough inventory space to buy all that.");

                    this.Done(context);
                }
            }
        }