Ejemplo n.º 1
0
        private async Task DisplayAdventure(Adventure adventure)
        {
            try
            {
                // Get the channel for this adventure..
                IMessageChannel channel = DiscordSocketClient.GetChannel(adventure.Channel) as IMessageChannel;

                // Get all players associated with this adventure.
                IEnumerable <Player> players = await PlayersRepository.GetAdventuringPlayersAsEnumerable(adventure.Id);

                // Get the adventureMessage that we will update.
                IUserMessage adventureMessage;
                // If we were passed the "RegenerateMessages" flag set to true, or if there is no Adventure Message, then create a new adventureMessage.
                if (adventure.RegenerateMessage || adventure.AdventureMessage == 0)
                {
                    adventureMessage = await channel.SendMessageAsync("<ADVENTURE MESSAGE>") as IUserMessage;
                }
                // If we were passed the "RegenerateMessages" flag set to false, then retrieve the existing adventureMessage.
                else
                {
                    adventureMessage = await channel.GetMessageAsync(adventure.AdventureMessage) as IUserMessage;
                }

                // Alter the messages to now have new status updates.
                EmbedBuilder embedBuilder = new EmbedBuilder();

                embedBuilder.Color = Color.Blue;

                TimeSpan timePassed      = DateTime.UtcNow - adventure.StartTime;
                string   adventureHeader = $"ADVENTURE - {timePassed.ToString(@"mm\:ss")}";
                embedBuilder.Title = adventureHeader;

                List <string> frontlinePlayers = new List <string>();
                List <string> midlinePlayers   = new List <string>();
                List <string> backlinePlayers  = new List <string>();

                foreach (Player player in players)
                {
                    double healthTicksRaw = player.Health / (double)player.MaxHealth;
                    int    healthTicks    = 0;
                    for (int i = 1; i < BarDisplaySize + 1; i++)
                    {
                        if (healthTicksRaw < (i / (double)BarDisplaySize))
                        {
                            break;
                        }
                        healthTicks += 1;
                    }

                    string healthBar = "[";
                    for (int i = 0; i < healthTicks; i++)
                    {
                        healthBar += "+";
                    }
                    for (int i = 0; i < BarDisplaySize - healthTicks; i++)
                    {
                        healthBar += "-";
                    }
                    healthBar += "]";

                    double manaTicksRaw = player.Mana / (double)Player.MaxMana;
                    int    manaTicks    = 0;
                    for (int i = 1; i < BarDisplaySize + 1; i++)
                    {
                        if (manaTicksRaw < (i / (double)BarDisplaySize))
                        {
                            break;
                        }
                        manaTicks += 1;
                    }
                    string manaBar = "[";
                    for (int i = 0; i < manaTicks; i++)
                    {
                        manaBar += "+";
                    }
                    for (int i = 0; i < BarDisplaySize - manaTicks; i++)
                    {
                        manaBar += "-";
                    }
                    manaBar += "]";

                    string display = $"<@{player.Id}> ({player.Class}) \n HP {player.Health}/{player.MaxHealth} {healthBar} \n MP {player.Mana}/{Player.MaxMana} {manaBar}";

                    switch (player.AdventureRank)
                    {
                    case Adventure.Rank.Frontline:
                        frontlinePlayers.Add(display);
                        break;

                    case Adventure.Rank.Midline:
                        midlinePlayers.Add(display);
                        break;

                    case Adventure.Rank.Backline:
                        backlinePlayers.Add(display);
                        break;

                    default:
                        throw new Exception("Invalid Rank!");
                    }
                }

                string frontlinePlayerField = string.Join("\n\n", frontlinePlayers.ToArray());
                if (string.IsNullOrEmpty(frontlinePlayerField))
                {
                    frontlinePlayerField = "<No Players>";
                }

                string midlinePlayerField = string.Join("\n\n", midlinePlayers.ToArray());
                if (string.IsNullOrEmpty(midlinePlayerField))
                {
                    midlinePlayerField = "<No Players>";
                }

                string backlinePlayerField = string.Join("\n\n", backlinePlayers.ToArray());
                if (string.IsNullOrEmpty(backlinePlayerField))
                {
                    backlinePlayerField = "<No Players>";
                }

                embedBuilder.AddField("Player Frontline", frontlinePlayerField);
                embedBuilder.AddField("Player Midline", midlinePlayerField);
                embedBuilder.AddField("Player Backline", backlinePlayerField);
                embedBuilder.AddField("\u200b", "\u200b");

                string adventureLog = string.Join("\n", (adventure.Logs ?? new List <string>()).ToArray());
                if (string.IsNullOrEmpty(adventureLog))
                {
                    adventureLog = "<No Logs>";
                }

                embedBuilder.AddField("Adventure Log", adventureLog);

                await adventureMessage.ModifyAsync(m =>
                {
                    m.Content = "";
                    m.Embed   = embedBuilder.Build();
                });

                // If we were passed the "RegenerateMessages" flag set to true, or if there was no AdventureMessage, then delete old adventureMessage if possible.
                // Then, toggle the "RegenerateMessages" flag to false, and set the new adventureMessage on the Adventure.
                if (adventure.RegenerateMessage || adventure.AdventureMessage == 0)
                {
                    if (adventure.AdventureMessage != 0)
                    {
                        await channel.DeleteMessageAsync(await channel.GetMessageAsync(adventure.AdventureMessage));
                    }

                    await AdventuresRepository.SetNewChannelsForMessages
                    (
                        adventureId : adventure.Id,
                        adventureMessage : adventureMessage.Id
                    );
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
            }
        }