public async Task ScavengeDrillCommand() { if (!_gamesService.Scavenges.ContainsKey(Context.User.Id) || _gamesService.Scavenges[Context.User.Id] == null) { await SendErrorAsync($"**{Context.User.Username}**, you are not scavenging!"); return; } if (_gamesService.Scavenges[Context.User.Id].Ores.Count == 0) { await SendErrorAsync($"**{Context.User.Username}**, there is nothing to drill!"); return; } var user = MarbleBotUser.Find(Context); if (!(user.Items.ContainsKey(81) || user.Items.ContainsKey(82))) { await SendErrorAsync($"**{Context.User.Username}**, you need a drill to mine ore!"); return; } var item = _gamesService.Scavenges[Context.User.Id].Ores.Dequeue(); _gamesService.Scavenges[Context.User.Id].UsedOres.Enqueue(item); if (user.Items.ContainsKey(item.Id)) { user.Items[item.Id]++; } else { user.Items.Add(item.Id, 1); } user.NetWorth += item.Price; MarbleBotUser.UpdateUser(user); await _gamesService.Scavenges[Context.User.Id].UpdateEmbed(); var confirmationMessage = await ReplyAsync($"**{Context.User.Username}**, you have successfully added **{item.Name}** x**1** to your inventory!"); // Clean up the messages created if the bot can delete messages if (!Context.IsPrivate && Context.Guild.CurrentUser.GuildPermissions.ManageMessages) { await Task.Delay(4000); await Context.Message.DeleteAsync(); await confirmationMessage.DeleteAsync(); } }
public async Task DailyCommand() { var user = (await MarbleBotUser.Find(Context)) !; if ((DateTime.UtcNow - user.LastDaily).TotalHours < 24) { DateTime aDayAgo = DateTime.UtcNow.AddDays(-1); await ReplyAsync($"You need to wait for {GetTimeSpanSentence(user.LastDaily - aDayAgo)} until you can get your daily gift again!"); return; } if ((DateTime.UtcNow - user.LastDaily).TotalHours > _dailyTimeoutService.DailyTimeout) { user.DailyStreak = 0; } int power = user.DailyStreak > 100 ? 100 : user.DailyStreak; decimal gift = (decimal)MathF.Round(MathF.Pow(200f, 1f + power / 100f), 2); bool giveCraftingStation = user.DailyStreak > 2 && !user.Items.ContainsKey(17); user.Balance += gift; user.NetWorth += gift; user.DailyStreak++; user.LastDaily = DateTime.UtcNow; if (giveCraftingStation) { user.Items.Add(17, 1); } bool giveQefpedunCharm = false; if (!user.Items.ContainsKey(10) && DateTime.UtcNow.DayOfYear < 51 && DateTime.UtcNow.DayOfYear > 42) { giveQefpedunCharm = true; user.Items.Add(10, 1); } MarbleBotUser.UpdateUser(user); await ReplyAsync($"**{Context.User.Username}**, you have received {UnitOfMoney}**{gift:n2}**!\n(Streak: **{user.DailyStreak}**)"); if (giveCraftingStation) { await ReplyAsync("You have been given a **Crafting Station Mk.I**!"); } if (giveQefpedunCharm) { await ReplyAsync("You have been given a **Qefpedun Charm**!"); } }
public async Task BuyCommand(Item item, int noOfItems = 1) { if (noOfItems < 1) { await SendErrorAsync($"**{Context.User.Username}**, invalid number of items! Use `mb/help buy` to see how the command works."); return; } if (item.Price == -1) { await SendErrorAsync($"**{Context.User.Username}**, this item cannot be sold!"); return; } if (!item.OnSale) { await SendErrorAsync($"**{Context.User.Username}**, this item is not on sale!"); return; } var user = (await MarbleBotUser.Find(Context)) !; if (user.Balance >= item.Price * noOfItems) { if (user.Items.ContainsKey(item.Id)) { user.Items[item.Id] += noOfItems; } else { user.Items.Add(item.Id, noOfItems); } user.Balance -= item.Price * noOfItems; MarbleBotUser.UpdateUser(user); await ReplyAsync($"**{user.Name}** has successfully purchased **{item.Name}** x**{noOfItems}** for {UnitOfMoney}**{item.Price:n2}** each!\nTotal price: {UnitOfMoney}**{item.Price * noOfItems:n2}**\nNew balance: {UnitOfMoney}**{user.Balance:n2}**."); } else { await SendErrorAsync("You can't afford this!"); } }
public async Task ScavengeSellCommand() { var user = MarbleBotUser.Find(Context); if (!_gamesService.Scavenges.ContainsKey(Context.User.Id) || _gamesService.Scavenges[Context.User.Id] == null) { await SendErrorAsync($"**{Context.User.Username}**, you are not scavenging!"); return; } if (_gamesService.Scavenges[Context.User.Id].Items.Count == 0) { await SendErrorAsync($"**{Context.User.Username}**, there is nothing to sell!"); return; } var item = _gamesService.Scavenges[Context.User.Id].Items.Dequeue(); _gamesService.Scavenges[Context.User.Id].UsedItems.Enqueue(item); user.Balance += item.Price; user.NetWorth += item.Price; MarbleBotUser.UpdateUser(user); await _gamesService.Scavenges[Context.User.Id].UpdateEmbed(); var confirmationMessage = await ReplyAsync($"**{Context.User.Username}**, you have successfully sold **{item.Name}** x**1** for {UnitOfMoney}**{item.Price:n2}**!"); // Clean up the messages created if the bot can delete messages if (!Context.IsPrivate && Context.Guild.CurrentUser.GuildPermissions.ManageMessages) { await Task.Delay(4000); await Context.Message.DeleteAsync(); await confirmationMessage.DeleteAsync(); } }
public async Task RaceStartCommand() { ulong fileId = Context.IsPrivate ? Context.User.Id : Context.Guild.Id; if (!File.Exists($"Data{Path.DirectorySeparatorChar}{fileId}.race")) { await SendErrorAsync($"**{Context.User.Username}**, no-one is signed up!"); return; } var builder = new EmbedBuilder() .WithColor(GetColor(Context)); int marbleCount = 0; var marbles = new List <(ulong id, string name)>(); using (var marbleList = new StreamReader($"Data{Path.DirectorySeparatorChar}{fileId}.race")) { if (marbleList.BaseStream.Length == 0) { await SendErrorAsync($"**{Context.User.Username}**, no-one is signed up!"); return; } var formatter = new BinaryFormatter(); marbles = (List <(ulong, string)>)formatter.Deserialize(marbleList.BaseStream); marbleCount = marbles.Count; } ulong[] marbleIds = marbles.Select(marbleInfo => marbleInfo.id).ToArray(); if (marbleCount == 0) { await SendErrorAsync($"**{Context.User.Username}**, no-one is signed up!"); return; } // Get the death messages var messages = new List <string>(); using (var messageFile = new StreamReader($"Resources{Path.DirectorySeparatorChar}RaceDeathMessages.txt")) { while (!messageFile.EndOfStream) { messages.Add((await messageFile.ReadLineAsync()) !); } } // Race start builder.WithTitle("The race has started!"); var message = await ReplyAsync(embed : builder.Build()); await Task.Delay(1500); for (int alive = marbleCount; alive > 1; alive--) { int eliminatedIndex = _randomService.Rand.Next(0, marbles.Count); string deathMessage = messages[_randomService.Rand.Next(0, messages.Count - 1)]; builder.AddField($"{Bold(marbles[eliminatedIndex].name)} is eliminated!", $"{marbles[eliminatedIndex].name} {deathMessage} and is now out of the competition!"); // A special message may be displayed depending on the name of last place if (alive == marbleCount) { string json = await File.ReadAllTextAsync($"Resources{Path.DirectorySeparatorChar}RaceSpecialMessages.json"); var messageDict = JsonSerializer.Deserialize <Dictionary <string, string> >(json) !; var marbleName = marbles[eliminatedIndex].name.ToLower().RemoveChar(' '); if (messageDict.ContainsKey(marbleName)) { builder.WithDescription($"*{messageDict[marbleName]}*"); } } marbles.RemoveAt(eliminatedIndex); await message.ModifyAsync(msg => msg.Embed = builder.Build()); await Task.Delay(1500); } // Race finish (ulong winningMarbleId, string winningMarbleName) = marbles[0]; string boldedWinningMarbleName = Bold(winningMarbleName); builder.AddField($"{boldedWinningMarbleName} wins!", $"{winningMarbleName} is the winner!"); if (marbleCount > 1) { await using var racers = new StreamWriter($"Data{Path.DirectorySeparatorChar}RaceWinners.txt", true); await racers.WriteLineAsync(winningMarbleName); } await message.ModifyAsync(msg => msg.Embed = builder.Build()); await ReplyAsync($":trophy: | {boldedWinningMarbleName} won the race!"); // Reward winner var user = MarbleBotUser.Find(winningMarbleId); if ((DateTime.UtcNow - user.LastRaceWin).TotalHours > 6) { int noOfSameUser = marbleIds.Count(marbleId => marbleId == winningMarbleId); decimal gift = (decimal)MathF.Round(((float)marbleCount / noOfSameUser - 1) * 100, 2); if (gift > 0) { if (user.Items.ContainsKey(83)) { gift *= 3; } user.Balance += gift; user.NetWorth += gift; user.LastRaceWin = DateTime.UtcNow; user.RaceWins++; MarbleBotUser.UpdateUser(user); await ReplyAsync($"**{user.Name}** won {UnitOfMoney}**{gift:n2}** for winning the race!"); } } await using (var marbleList = new StreamWriter($"Data{Path.DirectorySeparatorChar}{fileId}.race", false)) { await marbleList.WriteAsync(""); } }
public async Task CraftCommand(Item requestedItem, int noOfItems = 1) { var user = (await MarbleBotUser.Find(Context)) !; if (!user.Items.ContainsKey(17) && !user.Items.ContainsKey(62)) { await SendErrorAsync($"**{Context.User.Username}**, you need a Crafting Station to craft items!"); return; } if (requestedItem.CraftingStationRequired == 2 && !user.Items.ContainsKey(62)) { await SendErrorAsync($"**{Context.User.Username}**, your current Crafting Station cannot craft this item!"); return; } if (requestedItem.CraftingRecipe == null) { await SendErrorAsync($"**{Context.User.Username}**, the item **{requestedItem.Name}** cannot be crafted!"); return; } bool sufficientMaterials = requestedItem.CraftingRecipe .All(itemPair => user.Items.ContainsKey(itemPair.Key) && itemPair.Value * noOfItems <= user.Items[itemPair.Key]); if (!sufficientMaterials) { await SendErrorAsync($"**{Context.User.Username}**, you do not have enough items to craft this!"); return; } int noCrafted = requestedItem.CraftingProduced * noOfItems; var output = new StringBuilder(); decimal currentNetWorth = user.NetWorth; foreach ((int itemId, int noRequired) in requestedItem.CraftingRecipe) { var item = Item.Find <Item>(itemId); int noLost = noRequired * noOfItems; output.AppendLine($"`[{item.Id:000}]` {item.Name}: {noLost}"); user.Items[itemId] -= noLost; user.NetWorth -= item.Price * noOfItems; } if (!user.Items.ContainsKey(requestedItem.Id)) { user.Items.Add(requestedItem.Id, noCrafted); } else { user.Items[requestedItem.Id] += noCrafted; } user.NetWorth += requestedItem.Price * noCrafted; MarbleBotUser.UpdateUser(user); await ReplyAsync(embed : new EmbedBuilder() .WithColor(GetColor(Context)) .WithDescription($"**{Context.User.Username}** has successfully crafted **{requestedItem.Name}** x**{noCrafted}**!") .WithTitle("Crafting: " + requestedItem.Name) .AddField("Lost items", output.ToString()) .AddField("Net Worth", $"Old: {UnitOfMoney}**{currentNetWorth:n2}**\nNew: {UnitOfMoney}**{user.NetWorth:n2}**") .Build()); }
public async Task DecraftCommand(Item requestedItem, int noOfItems = 1) { var user = (await MarbleBotUser.Find(Context)) !; if (!user.Items.ContainsKey(17) && !user.Items.ContainsKey(62)) { await SendErrorAsync($"**{Context.User.Username}**, you need a Crafting Station to decraft items!"); return; } if (requestedItem.CraftingProduced == 0) { await SendErrorAsync($"**{Context.User.Username}**, you cannot dismantle this item!"); return; } if (requestedItem.CraftingStationRequired == 2 && !user.Items.ContainsKey(62)) { await SendErrorAsync($"**{Context.User.Username}**, your Crafting Station is not advanced enough to dismantle this item!"); return; } if (requestedItem.CraftingRecipe == null) { await SendErrorAsync($"**{Context.User.Username}**, the item **{requestedItem.Name}** cannot be decrafted!"); return; } if (!user.Items.ContainsKey(requestedItem.Id) || user.Items[requestedItem.Id] < noOfItems) { await SendErrorAsync($"**{Context.User.Username}**, you do not have enough of this item!"); return; } decimal currentNetWorth = user.NetWorth; int noCrafted = requestedItem.CraftingProduced * noOfItems; var output = new StringBuilder(); foreach ((int itemId, int noRequired) in requestedItem.CraftingRecipe) { var item = Item.Find <Item>(itemId); int noGained = noRequired * noOfItems; output.AppendLine($"`[{item.Id:000}]` {item.Name}: {noGained}"); if (user.Items.ContainsKey(item.Id)) { user.Items[itemId] += noGained; } else { user.Items.Add(item.Id, noGained); } user.NetWorth += item.Price * noOfItems; } user.Items[requestedItem.Id] -= noCrafted; user.NetWorth -= requestedItem.Price * noCrafted; MarbleBotUser.UpdateUser(user); await ReplyAsync(embed : new EmbedBuilder() .WithColor(GetColor(Context)) .WithDescription($"**{Context.User.Username}** has successfully decrafted **{requestedItem.Name}** x**{noCrafted}**!") .WithTitle($"Crafting: {requestedItem.Name}") .AddField("Gained items", output.ToString()) .AddField("Net Worth", $"Old: {UnitOfMoney}**{currentNetWorth:n2}**\nNew: {UnitOfMoney}**{user.NetWorth:n2}**") .Build()); }