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!"); }
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); } } }
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); } } }
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!"); }
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); }
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); } } }
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); } } }