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