예제 #1
0
        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();
            }
        }
예제 #2
0
파일: Economy.cs 프로젝트: Doc671/MarbleBot
        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**!");
            }
        }
예제 #3
0
파일: Economy.cs 프로젝트: Doc671/MarbleBot
        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!");
            }
        }
예제 #4
0
        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();
            }
        }
예제 #5
0
        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("");
            }
        }
예제 #6
0
파일: Economy.cs 프로젝트: Doc671/MarbleBot
        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());
        }
예제 #7
0
파일: Economy.cs 프로젝트: Doc671/MarbleBot
        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());
        }