Esempio n. 1
0
        public void TestSetColSpan()
        {
            var cs    = new CellStyle(CellHorizontalAlignment.Left, CellTextTrimmingStyle.Crop, CellNullStyle.EmptyString);
            var csr   = new CellStyle(CellHorizontalAlignment.Right, CellTextTrimmingStyle.Crop, CellNullStyle.EmptyString);
            var csc   = new CellStyle(CellHorizontalAlignment.Center, CellTextTrimmingStyle.Crop, CellNullStyle.EmptyString);
            var table = new TextTable(2, TableBordersStyle.CLASSIC, TableVisibleBorders.ALL, false, "");

            table.Columns.ElementAt(0).SetWidthRange(6, 10);
            table.Columns.ElementAt(1).SetWidthRange(2, 7);

            table.AddCell("abcd", cs);
            table.AddCell("123456", cs);
            table.AddCell("mno", cs, 2);
            table.AddCell("xyztu", csr, 2);
            table.AddCell("efgh", csc, 2);

            Assert.AreEqual(""
                            + "+------+------+\n"
                            + "|abcd  |123456|\n"
                            + "+-------------+\n"
                            + "|mno          |\n"
                            + "+-------------+\n"
                            + "|        xyztu|\n"
                            + "+-------------+\n"
                            + "|    efgh     |\n"
                            + "+-------------+", table.Render());
        }
        public void TestTwoCellsHorizontal()
        {
            var cellStyle = new CellStyle(CellHorizontalAlignment.Left, CellTextTrimmingStyle.Crop, CellNullStyle.EmptyString);
            var textTable = new TextTable(2, TableBordersStyle.CLASSIC, TableVisibleBorders.ALL, false, "");

            textTable.AddCell("abcdef", cellStyle);
            textTable.AddCell("123456", cellStyle);

            Assert.AreEqual(""
                            + "+------+------+\n"
                            + "|abcdef|123456|\n"
                            + "+------+------+", textTable.Render());
        }
Esempio n. 3
0
        public void TestTooWideCell()
        {
            var cellStyle = new CellStyle(CellHorizontalAlignment.Left, CellTextTrimmingStyle.Crop, CellNullStyle.EmptyString);
            var table     = new TextTable(3, TableBordersStyle.CLASSIC, TableVisibleBorders.ALL, false, "");

            table.AddCell("abc", cellStyle, 5);
            table.AddCell("defg", cellStyle, 5);
            Assert.AreEqual(""
                            + "+----+\n"
                            + "|abc |\n"
                            + "+----+\n"
                            + "|defg|\n"
                            + "+----+", table.Render());
        }
Esempio n. 4
0
    private static void FormatAndWriteToConsole(Dictionary <string, string> agentsAndLocations)
    {
        var basicTable = new TextTable(2);

        basicTable.AddCell("Agent file");
        basicTable.AddCell("Agent path");

        foreach (var agentAndLocation in agentsAndLocations)
        {
            basicTable.AddCell(agentAndLocation.Key);
            basicTable.AddCell(agentAndLocation.Value);
        }

        Console.WriteLine(agentsAndLocations.Count == 0
            ? CliOutput.AgentsDetectCommandRunner_Run_No_detected_agents_found
            : basicTable.Render());
    }
        public void TestEmptyCell()
        {
            var cellStyle = new CellStyle(CellHorizontalAlignment.Left, CellTextTrimmingStyle.Crop, CellNullStyle.EmptyString);
            var table     = new TextTable(1, TableBordersStyle.CLASSIC, TableVisibleBorders.ALL, false, "");

            table.AddCell("", cellStyle);
            Assert.AreEqual(""
                            + "++\n"
                            + "||\n"
                            + "++", table.Render());
        }
Esempio n. 6
0
        public void TestWideIncompleteNullCell()
        {
            var cellStyle = new CellStyle(CellHorizontalAlignment.Left, CellTextTrimmingStyle.Crop, CellNullStyle.EmptyString);
            var table     = new TextTable(7, TableBordersStyle.CLASSIC, TableVisibleBorders.ALL, false, string.Empty);

            table.AddCell(null, cellStyle, 3);

            Assert.AreEqual(""
                            + "+--+++++\n"
                            + "|  |||||\n"
                            + "+--+++++", table.Render());
        }
        public void TestMissingCell()
        {
            var cellStyle = new CellStyle(CellHorizontalAlignment.Left, CellTextTrimmingStyle.Crop, CellNullStyle.EmptyString);
            var table     = new TextTable(2, TableBordersStyle.CLASSIC, TableVisibleBorders.ALL, false, "");

            table.Columns[0].SetWidthRange(6, 10);
            table.Columns[1].SetWidthRange(2, 7);

            table.AddCell("abcd", cellStyle);
            table.AddCell("123456", cellStyle);
            table.AddCell("mno", cellStyle);
            table.AddCell("45689", cellStyle);
            table.AddCell("xyztu", cellStyle);

            Assert.AreEqual(""
                            + "+------+------+\n"
                            + "|abcd  |123456|\n"
                            + "+------+------+\n"
                            + "|mno   |45689 |\n"
                            + "+------+------+\n"
                            + "|xyztu |      |\n"
                            + "+------+------+", table.Render());
        }
Esempio n. 8
0
        public void TestSetColSpanWide()
        {
            var cellStyle1 = new CellStyle(CellHorizontalAlignment.Left, CellTextTrimmingStyle.Crop, CellNullStyle.EmptyString);
            var cellStyle2 = new CellStyle(CellHorizontalAlignment.Right, CellTextTrimmingStyle.Crop, CellNullStyle.EmptyString);
            var textTable  = new TextTable(2, TableBordersStyle.CLASSIC_WIDE, TableVisibleBorders.ALL, false, "");

            textTable.Columns[0].SetWidthRange(6, 10);
            textTable.Columns[1].SetWidthRange(2, 7);

            textTable.AddCell("abcd", cellStyle1);
            textTable.AddCell("123456", cellStyle1);
            textTable.AddCell("mno", cellStyle1, 2);
            textTable.AddCell("xyztu", cellStyle2, 2);

            Assert.AreEqual(""
                            + "+--------+--------+\n"
                            + "| abcd   | 123456 |\n"
                            + "+-----------------+\n"
                            + "| mno             |\n"
                            + "+-----------------+\n"
                            + "|           xyztu |\n"
                            + "+-----------------+", textTable.Render());
        }
        public void TestAutomaticWidth()
        {
            var cellStyle = new CellStyle(CellHorizontalAlignment.Left, CellTextTrimmingStyle.Crop, CellNullStyle.EmptyString);
            var textTable = new TextTable(2, TableBordersStyle.CLASSIC, TableVisibleBorders.ALL, false, "");

            textTable.AddCell("abcdef", cellStyle);
            textTable.AddCell("123456", cellStyle);
            textTable.AddCell("mno", cellStyle);
            textTable.AddCell("45689", cellStyle);
            textTable.AddCell("xyztuvw", cellStyle);
            textTable.AddCell("01234567", cellStyle);

            Assert.AreEqual(""
                            + "+-------+--------+\n"
                            + "|abcdef |123456  |\n"
                            + "+-------+--------+\n"
                            + "|mno    |45689   |\n"
                            + "+-------+--------+\n"
                            + "|xyztuvw|01234567|\n"
                            + "+-------+--------+", textTable.Render());
        }
Esempio n. 10
0
    private static void FormatAndWriteToConsole(IList <PackageLibYear>?libYearPackages)
    {
        if (libYearPackages != null)
        {
            var libYearTotal = libYearPackages.Sum(libYear => libYear.LibYear);

            var tableStyle = new CellStyle(CellHorizontalAlignment.Right);
            var table      = new TextTable(6, TableBordersStyle.DESIGN_FORMAL,
                                           TableVisibleBorders.SURROUND_HEADER_FOOTER_AND_COLUMNS);

            table.AddCell(CliOutput.ComputeLibYearCommandRunner_Table_Header_Package);
            table.AddCell(CliOutput.ComputeLibYearCommandRunner_Table_Header_Currently_Installed);
            table.AddCell(CliOutput.ComputeLibYearCommandRunner_Table_Header_Released_at);
            table.AddCell(CliOutput.ComputeLibYearCommandRunner_Table_Header_Latest_Available);
            table.AddCell(CliOutput.ComputeLibYearCommandRunner_Table_Header_Released_at);
            table.AddCell("Libyear");

            foreach (var libYearPackage in libYearPackages)
            {
                if (libYearPackage.ExceptionMessage == null)
                {
                    _ = libYearPackage.CurrentVersion ??
                        throw new NullReferenceException("libYearPackage has no CurrentVersion");
                    _ = libYearPackage.LatestVersion ??
                        throw new NullReferenceException("libYearPackage has no LatestVersion");

                    table.AddCell(libYearPackage.CurrentVersion.Name);
                    table.AddCell(libYearPackage.CurrentVersion.Version, tableStyle);
                    table.AddCell(libYearPackage.ReleaseDateCurrentVersion.ToString("s"), tableStyle);
                    table.AddCell(libYearPackage.LatestVersion.Version, tableStyle);
                    table.AddCell(libYearPackage.ReleaseDateLatestVersion.ToString("s"), tableStyle);
                    table.AddCell(libYearPackage.LibYear.ToString(CultureInfo.InvariantCulture.NumberFormat),
                                  tableStyle);
                    continue;
                }

                _ = libYearPackage.PackageUrl ??
                    throw new NullReferenceException("libYearPackage has no LatestVersion");

                table.AddCell(libYearPackage.PackageUrl.Name, tableStyle);
                table.AddCell(libYearPackage.ExceptionMessage, tableStyle, 5);
            }

            table.AddCell("Total", tableStyle, 5);
            table.AddCell(libYearTotal.ToString(CultureInfo.InvariantCulture.NumberFormat), tableStyle);

            Console.WriteLine(table.Render());
        }
    }
Esempio n. 11
0
        public static void WriteSummaryTable(this TextWriter writer, IEnumerable <Measurement> measurements, Algorithm?baseline = default(Algorithm?))
        {
            // | Vertices | Algorithm | Avg. Duration [ms] | Avg. Total cost | Avg. Diff to <baseline> |
            var isBaseline  = baseline != null;
            var columnCount = isBaseline ? 5 : 4;
            var table       = new TextTable(columnCount);

            var leftAlignmentStyle = new CellStyle(
                CellHorizontalAlignment.Left,
                CellTextTrimmingStyle.Dots,
                CellNullStyle.EmptyString,
                removeTerminalFormats: false /*otherwise '[' creates weird char sequence which is appended to cell*/);

            var rightAlignmentStyle = new CellStyle(
                CellHorizontalAlignment.Right,
                CellTextTrimmingStyle.Dots,
                CellNullStyle.EmptyString,
                removeTerminalFormats: false /*otherwise '[' creates weird char sequence which is appended to cell*/);

            table.AddCell(" Vertices ", leftAlignmentStyle);
            table.AddCell(" Algorithm ", leftAlignmentStyle);
            table.AddCell(" Avg. Duration [ms] ", leftAlignmentStyle);
            table.AddCell(" Avg. Total cost ", leftAlignmentStyle);
            if (baseline != null)
            {
                table.AddCell($" Avg. Diff to {baseline} ");
            }

            var groups = measurements
                         .GroupBy(m => m.Coloring.Graph.Vertices.Count)
                         .ToImmutableArray();


            foreach (var sizeGroup in groups)
            {
                var avgDiff = sizeGroup
                              .GroupBy(m => m.Filename)
                              .SelectMany(g => {
                    var baseCost = g.FirstOrDefault(m => m.Algorithm == baseline)?.Coloring.SummaryCost ?? 1;
                    return(g.Select(m => (measurement: m, diff: ((double)m.Coloring.SummaryCost / baseCost) - 1)));
                })
                              .GroupBy(t => t.measurement.Algorithm)
                              .ToDictionary(g => g.Key, g => g.Average(t => t.diff));


                foreach (var algorithmGroup in sizeGroup.GroupBy(m => m.Algorithm))
                {
                    var durationAvg = algorithmGroup.Average(m => m.Duration.TotalMilliseconds);
                    var avgCost     = (decimal)algorithmGroup.Average(m => m.Coloring.SummaryCost);
                    // vertices
                    table.AddCell($" {sizeGroup.Key} ", rightAlignmentStyle);
                    // algorithm
                    table.AddCell($" {algorithmGroup.Key} ", leftAlignmentStyle);
                    // duration
                    table.AddCell($" {durationAvg:N5} ", rightAlignmentStyle);
                    // total color cost
                    table.AddCell($" {avgCost:N2} ", rightAlignmentStyle);
                    if (baseline != null)
                    {
                        // diff to baseline
                        table.AddCell($" {(decimal)avgDiff[algorithmGroup.Key]:P2} ", rightAlignmentStyle);
                    }
                }
                if (sizeGroup != groups.Last())
                {
                    // add empty row
                    for (int i = 0; i < columnCount; i++)
                    {
                        table.AddCell(null);
                    }
                }
            }

            writer.WriteLine();
            writer.WriteLine();
            writer.WriteLine("Summary:");
            writer.WriteLine("========");
            writer.WriteLine();
            foreach (var line in table.RenderAsStringArray())
            {
                writer.WriteLine(line);
            }
            writer.WriteLine();
        }
Esempio n. 12
0
        public void TestCenteredColSpan()
        {
            var cellStyle1 = new CellStyle(CellHorizontalAlignment.Left, CellTextTrimmingStyle.Crop, CellNullStyle.EmptyString);
            var cellStyle2 = new CellStyle(CellHorizontalAlignment.Right, CellTextTrimmingStyle.Crop, CellNullStyle.EmptyString);

            var table = new TextTable(4, TableBordersStyle.CLASSIC, TableVisibleBorders.ALL, false, string.Empty);

            table.Columns[0].SetWidthRange(3, 10);
            table.Columns[1].SetWidthRange(2, 7);
            table.Columns[2].SetWidthRange(3, 10);

            table.AddCell("abcd", cellStyle1);
            table.AddCell("123456", cellStyle1);
            table.AddCell("efgh", cellStyle1);
            table.AddCell("789012", cellStyle1);

            table.AddCell("ijkl", cellStyle1);
            table.AddCell("mno", cellStyle1, 2);
            table.AddCell("345678", cellStyle1);

            table.AddCell("mnop", cellStyle1);
            table.AddCell("901234", cellStyle1);
            table.AddCell("qrst", cellStyle1);
            table.AddCell("567890", cellStyle1);

            Assert.AreEqual(""
                            + "+----+------+----+------+\n"
                            + "|abcd|123456|efgh|789012|\n"
                            + "+----+-----------+------+\n"
                            + "|ijkl|mno        |345678|\n"
                            + "+----+-----------+------+\n"
                            + "|mnop|901234|qrst|567890|\n"
                            + "+----+------+----+------+", table.Render());
        }
Esempio n. 13
0
        static void Main()
        {
            // 1. BASIC TABLE EXAMPLE
            var basicTable = new TextTable(3);

            basicTable.AddCell("Artist");
            basicTable.AddCell("Album");
            basicTable.AddCell("Year");
            basicTable.AddCell("Jamiroquai");
            basicTable.AddCell("Emergency on Planet Earth");
            basicTable.AddCell("1993");
            basicTable.AddCell("Jamiroquai");
            basicTable.AddCell("The Return of the Space Cowboy");
            basicTable.AddCell("1994");
            Console.WriteLine(basicTable.Render());

            // +----------+-------------------------------+-----+
            // |Artist    |Album                         |Year|
            // +----------+-------------------------------+-----+
            // |Jamiroquai|Emergency on Planet Earth     |1993|
            // |Jamiroquai|The Return of the Space Cowboy|1994|
            // +----------+-------------------------------+-----+


            // 2. ADVANCED TABLE EXAMPLE
            var numberStyleAdvancedTable = new CellStyle(CellHorizontalAlignment.Right);
            var advancedTable            = new TextTable(3, TableBordersStyle.DESIGN_FORMAL, TableVisibleBorders.SURROUND_HEADER_FOOTER_AND_COLUMNS);

            advancedTable.SetColumnWidthRange(0, 6, 14);
            advancedTable.SetColumnWidthRange(1, 4, 12);
            advancedTable.SetColumnWidthRange(2, 4, 12);

            advancedTable.AddCell("Region");
            advancedTable.AddCell("Orders", numberStyleAdvancedTable);
            advancedTable.AddCell("Sales", numberStyleAdvancedTable);

            advancedTable.AddCell("North");
            advancedTable.AddCell("6,345", numberStyleAdvancedTable);
            advancedTable.AddCell("$87.230", numberStyleAdvancedTable);

            advancedTable.AddCell("Center");
            advancedTable.AddCell("837", numberStyleAdvancedTable);
            advancedTable.AddCell("$12.855", numberStyleAdvancedTable);

            advancedTable.AddCell("South");
            advancedTable.AddCell("5,344", numberStyleAdvancedTable);
            advancedTable.AddCell("$72.561", numberStyleAdvancedTable);

            advancedTable.AddCell("Total", numberStyleAdvancedTable, 2);
            advancedTable.AddCell("$172.646", numberStyleAdvancedTable);

            Console.WriteLine(advancedTable.Render());

            // ======================
            // Region Orders    Sales
            // ------ ------ --------
            // North   6,345  $87.230
            // Center    837  $12.855
            // South   5,344  $72.561
            // ------ ------ --------
            //         Total $172.646
            // ======================


            // 3. FANCY TABLE EXAMPLE
            var numberStyleFancyTable = new CellStyle(CellHorizontalAlignment.Right);
            var fancyTable            = new TextTable(3, TableBordersStyle.DESIGN_PAPYRUS, TableVisibleBorders.SURROUND_HEADER_FOOTER_AND_COLUMNS);

            fancyTable.AddCell("Region");
            fancyTable.AddCell("Orders", numberStyleFancyTable);
            fancyTable.AddCell("Sales", numberStyleFancyTable);

            fancyTable.AddCell("North");
            fancyTable.AddCell("6,345", numberStyleFancyTable);
            fancyTable.AddCell("$87.230", numberStyleFancyTable);

            fancyTable.AddCell("Center");
            fancyTable.AddCell("837", numberStyleFancyTable);
            fancyTable.AddCell("$12.855", numberStyleFancyTable);

            fancyTable.AddCell("South");
            fancyTable.AddCell("5,344", numberStyleFancyTable);
            fancyTable.AddCell("$72.561", numberStyleFancyTable);

            fancyTable.AddCell("Total", numberStyleFancyTable, 2);
            fancyTable.AddCell("$172.646", numberStyleFancyTable);

            Console.WriteLine(fancyTable.Render());

            // o~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~o
            //  )  Region  Orders     Sales  (
            //  )  ~~~~~~  ~~~~~~  ~~~~~~~~  (
            //  )  North    6,345   $87.230  (
            //  )  Center     837   $12.855  (
            //  )  South    5,344   $72.561  (
            //  )  ~~~~~~  ~~~~~~  ~~~~~~~~  (
            //  )           Total  $172.646  (
            // o~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~o


            // 4. UNICODE TABLE EXAMPLE
            var numberStyleUnicodeTable = new CellStyle(CellHorizontalAlignment.Right);
            var unicodeTable            = new TextTable(3, TableBordersStyle.UNICODE_BOX_DOUBLE_BORDER_WIDE, TableVisibleBorders.SURROUND_HEADER_FOOTER_AND_COLUMNS, true);

            unicodeTable.AddCell("Region");
            unicodeTable.AddCell("Orders", numberStyleUnicodeTable);
            unicodeTable.AddCell("Sales", numberStyleUnicodeTable);

            unicodeTable.AddCell("North");
            unicodeTable.AddCell("6,345", numberStyleUnicodeTable);
            unicodeTable.AddCell("$87.230", numberStyleUnicodeTable);

            unicodeTable.AddCell("Center");
            unicodeTable.AddCell("837", numberStyleUnicodeTable);
            unicodeTable.AddCell("$12.855", numberStyleUnicodeTable);

            unicodeTable.AddCell("South");
            unicodeTable.AddCell("5,344", numberStyleUnicodeTable);
            unicodeTable.AddCell("$72.561", numberStyleUnicodeTable);

            unicodeTable.AddCell("Total", numberStyleUnicodeTable, 2);
            unicodeTable.AddCell("$172.646", numberStyleUnicodeTable);

            var unicodeTableStringArray = unicodeTable.RenderAsStringArray();
            var sb = new StringBuilder("<html><body><pre>");

            foreach (string line in unicodeTableStringArray)
            {
                sb.Append(line);
                sb.Append("<br>");
            }
            sb.Append("</pre></html>");

            File.WriteAllText("unicode.html", sb.ToString(), Encoding.UTF8);

            // unicode.html
            // ╔════════╤════════╤══════════╗
            // ║ Region │ Orders │    Sales ║
            // ╟────────┼────────┼──────────╢
            // ║ North  │  6,345 │  $87.230 ║
            // ║ Center │    837 │  $12.855 ║
            // ║ South  │  5,344 │  $72.561 ║
            // ╟────────┴────────┼──────────╢
            // ║           Total │ $172.646 ║
            // ╚═════════════════╧══════════╝
        }
Esempio n. 14
0
 public async Task ExecuteAllActiveWebhooksAsync(DPSReportJSON reportJSON)
 {
     if (reportJSON.Encounter.BossId.Equals(1)) // WvW
     {
         var extraJSONFightName = (reportJSON.ExtraJSON is null) ? reportJSON.Encounter.Boss : reportJSON.ExtraJSON.FightName;
         var extraJSON          = (reportJSON.ExtraJSON is null) ? string.Empty : $"Recorded by: {reportJSON.ExtraJSON.RecordedBy}\nDuration: {reportJSON.ExtraJSON.Duration}\nElite Insights version: {reportJSON.ExtraJSON.EliteInsightsVersion}";
         var icon     = string.Empty;
         var bossData = Bosses.GetBossDataFromId(1);
         if (!(bossData is null))
         {
             icon = bossData.Icon;
         }
         var colour = 16752238;
         var discordContentEmbedThumbnail = new DiscordAPIJSONContentEmbedThumbnail()
         {
             Url = icon
         };
         var timestampDateTime = DateTime.UtcNow;
         if (!(reportJSON.ExtraJSON is null))
         {
             timestampDateTime = reportJSON.ExtraJSON.TimeStart;
         }
         var timestamp           = timestampDateTime.ToString("o");
         var discordContentEmbed = new DiscordAPIJSONContentEmbed()
         {
             Title       = extraJSONFightName,
             Url         = reportJSON.Permalink,
             Description = $"{extraJSON}\narcdps version: {reportJSON.EVTC.Type}{reportJSON.EVTC.Version}",
             Colour      = colour,
             TimeStamp   = timestamp,
             Thumbnail   = discordContentEmbedThumbnail
         };
         // fields
         if (!(reportJSON.ExtraJSON is null))
         {
             // squad summary
             var squadPlayers = reportJSON.ExtraJSON.Players
                                .Where(x => !x.FriendNPC && !x.NotInSquad)
                                .Count();
             var squadDamage = reportJSON.ExtraJSON.Players
                               .Where(x => !x.FriendNPC && !x.NotInSquad)
                               .Select(x => x.DpsTargets.Sum(y => y.Sum(z => z.Damage)))
                               .Sum();
             var squadDps = reportJSON.ExtraJSON.Players
                            .Where(x => !x.FriendNPC && !x.NotInSquad)
                            .Select(x => x.DpsTargets.Sum(y => y.Sum(z => z.DPS)))
                            .Sum();
             var squadDowns = reportJSON.ExtraJSON.Players
                              .Where(x => !x.FriendNPC && !x.NotInSquad)
                              .Select(x => x.Defenses.First().DownCount)
                              .Sum();
             var squadDeaths = reportJSON.ExtraJSON.Players
                               .Where(x => !x.FriendNPC && !x.NotInSquad)
                               .Select(x => x.Defenses.First().DeadCount)
                               .Sum();
             var squadSummary = new TextTable(5, tableStyle, tableBorders);
             squadSummary.SetColumnWidthRange(0, 3, 3);
             squadSummary.SetColumnWidthRange(1, 10, 10);
             squadSummary.SetColumnWidthRange(2, 10, 10);
             squadSummary.SetColumnWidthRange(3, 8, 8);
             squadSummary.SetColumnWidthRange(4, 8, 8);
             squadSummary.AddCell("#", tableCellCenterAlign);
             squadSummary.AddCell("DMG", tableCellCenterAlign);
             squadSummary.AddCell("DPS", tableCellCenterAlign);
             squadSummary.AddCell("Downs", tableCellCenterAlign);
             squadSummary.AddCell("Deaths", tableCellCenterAlign);
             squadSummary.AddCell($"{squadPlayers}", tableCellCenterAlign);
             squadSummary.AddCell($"{squadDamage.ParseAsK()}", tableCellCenterAlign);
             squadSummary.AddCell($"{squadDps.ParseAsK()}", tableCellCenterAlign);
             squadSummary.AddCell($"{squadDowns}", tableCellCenterAlign);
             squadSummary.AddCell($"{squadDeaths}", tableCellCenterAlign);
             var squadField = new DiscordAPIJSONContentEmbedField()
             {
                 Name  = "Squad summary:",
                 Value = $"```{squadSummary.Render()}```"
             };
             // enemy summary field
             var enemyField = new DiscordAPIJSONContentEmbedField()
             {
                 Name  = "Enemy summary:",
                 Value = $"```Summary could not have been generated.\nToggle detailed WvW to enable this feature.```"
             };
             if (reportJSON.ExtraJSON.Targets.Count > 1)
             {
                 var enemyPlayers = reportJSON.ExtraJSON.Targets
                                    .Count() - 1;
                 var enemyDamage = reportJSON.ExtraJSON.Targets
                                   .Where(x => !x.IsFake)
                                   .Select(x => x.DpsAll.First().Damage)
                                   .Sum();
                 var enemyDps = reportJSON.ExtraJSON.Targets
                                .Where(x => !x.IsFake)
                                .Select(x => x.DpsAll.First().DPS)
                                .Sum();
                 var enemyDowns = reportJSON.ExtraJSON.Players
                                  .Where(x => !x.FriendNPC && !x.NotInSquad)
                                  .Select(x => x.StatsTargets.Select(y => y.First().Downed).Sum())
                                  .Sum();
                 var enemyDeaths = reportJSON.ExtraJSON.Players
                                   .Where(x => !x.FriendNPC && !x.NotInSquad)
                                   .Select(x => x.StatsTargets.Select(y => y.First().Killed).Sum())
                                   .Sum();
                 var enemySummary = new TextTable(5, tableStyle, tableBorders);
                 enemySummary.SetColumnWidthRange(0, 3, 3);
                 enemySummary.SetColumnWidthRange(1, 10, 10);
                 enemySummary.SetColumnWidthRange(2, 10, 10);
                 enemySummary.SetColumnWidthRange(3, 8, 8);
                 enemySummary.SetColumnWidthRange(4, 8, 8);
                 enemySummary.AddCell("#", tableCellCenterAlign);
                 enemySummary.AddCell("DMG", tableCellCenterAlign);
                 enemySummary.AddCell("DPS", tableCellCenterAlign);
                 enemySummary.AddCell("Downs", tableCellCenterAlign);
                 enemySummary.AddCell("Deaths", tableCellCenterAlign);
                 enemySummary.AddCell($"{enemyPlayers}", tableCellCenterAlign);
                 enemySummary.AddCell($"{enemyDamage.ParseAsK()}", tableCellCenterAlign);
                 enemySummary.AddCell($"{enemyDps.ParseAsK()}", tableCellCenterAlign);
                 enemySummary.AddCell($"{enemyDowns}", tableCellCenterAlign);
                 enemySummary.AddCell($"{enemyDeaths}", tableCellCenterAlign);
                 enemyField = new DiscordAPIJSONContentEmbedField()
                 {
                     Name  = "Enemy summary:",
                     Value = $"```{enemySummary.Render()}```"
                 };
             }
             // damage summary
             var damageStats = reportJSON.ExtraJSON.Players
                               .Where(x => !x.FriendNPC && !x.NotInSquad)
                               .Where(x => x.DpsTargets.Sum(y => y.First().Damage) > 0)
                               .OrderByDescending(x => x.DpsTargets.Sum(y => y.First().Damage))
                               .Take(10)
                               .ToList();
             var damageSummary = new TextTable(4, tableStyle, tableBorders);
             damageSummary.SetColumnWidthRange(0, 3, 3);
             damageSummary.SetColumnWidthRange(1, 25, 25);
             damageSummary.SetColumnWidthRange(2, 7, 7);
             damageSummary.SetColumnWidthRange(3, 6, 6);
             damageSummary.AddCell("#", tableCellCenterAlign);
             damageSummary.AddCell("Name");
             damageSummary.AddCell("DMG", tableCellRightAlign);
             damageSummary.AddCell("DPS", tableCellRightAlign);
             var rank = 0;
             foreach (var player in damageStats)
             {
                 rank++;
                 damageSummary.AddCell($"{rank}", tableCellCenterAlign);
                 damageSummary.AddCell($"{player.Name} ({player.ProfessionShort})");
                 damageSummary.AddCell($"{player.DpsTargets.Sum(y => y.First().Damage).ParseAsK()}", tableCellRightAlign);
                 damageSummary.AddCell($"{player.DpsTargets.Sum(y => y.First().DPS).ParseAsK()}", tableCellRightAlign);
             }
             var damageField = new DiscordAPIJSONContentEmbedField()
             {
                 Name  = "Damage summary:",
                 Value = $"```{damageSummary.Render()}```"
             };
             // cleanses summary
             var cleansesStats = reportJSON.ExtraJSON.Players
                                 .Where(x => !x.FriendNPC && !x.NotInSquad)
                                 .Where(x => x.Support.First().CondiCleanseTotal > 0)
                                 .OrderByDescending(x => x.Support.First().CondiCleanseTotal)
                                 .Take(10)
                                 .ToList();
             var cleansesSummary = new TextTable(3, tableStyle, tableBorders);
             cleansesSummary.SetColumnWidthRange(0, 3, 3);
             cleansesSummary.SetColumnWidthRange(1, 27, 27);
             cleansesSummary.SetColumnWidthRange(2, 12, 12);
             cleansesSummary.AddCell("#", tableCellCenterAlign);
             cleansesSummary.AddCell("Name");
             cleansesSummary.AddCell("Cleanses", tableCellRightAlign);
             rank = 0;
             foreach (var player in cleansesStats)
             {
                 rank++;
                 cleansesSummary.AddCell($"{rank}", tableCellCenterAlign);
                 cleansesSummary.AddCell($"{player.Name} ({player.ProfessionShort})");
                 cleansesSummary.AddCell($"{player.Support.First().CondiCleanseTotal}", tableCellRightAlign);
             }
             var cleansesField = new DiscordAPIJSONContentEmbedField()
             {
                 Name  = "Cleanses summary:",
                 Value = $"```{cleansesSummary.Render()}```"
             };
             // boon strips summary
             var boonStripsStats = reportJSON.ExtraJSON.Players
                                   .Where(x => !x.FriendNPC && !x.NotInSquad)
                                   .Where(x => x.Support.First().BoonStrips > 0)
                                   .OrderByDescending(x => x.Support.First().BoonStrips)
                                   .Take(10)
                                   .ToList();
             var boonStripsSummary = new TextTable(3, tableStyle, tableBorders);
             boonStripsSummary.SetColumnWidthRange(0, 3, 3);
             boonStripsSummary.SetColumnWidthRange(1, 27, 27);
             boonStripsSummary.SetColumnWidthRange(2, 12, 12);
             boonStripsSummary.AddCell("#", tableCellCenterAlign);
             boonStripsSummary.AddCell("Name");
             boonStripsSummary.AddCell("Strips", tableCellRightAlign);
             rank = 0;
             foreach (var player in boonStripsStats)
             {
                 rank++;
                 boonStripsSummary.AddCell($"{rank}", tableCellCenterAlign);
                 boonStripsSummary.AddCell($"{player.Name} ({player.ProfessionShort})");
                 boonStripsSummary.AddCell($"{player.Support.First().BoonStrips}", tableCellRightAlign);
             }
             var boonStripsField = new DiscordAPIJSONContentEmbedField()
             {
                 Name  = "Boon strips summary:",
                 Value = $"```{boonStripsSummary.Render()}```"
             };
             // add the fields
             discordContentEmbed.Fields = new List <DiscordAPIJSONContentEmbedField>()
             {
                 squadField,
                 enemyField,
                 damageField,
                 cleansesField,
                 boonStripsField
             };
         }
         // post to discord
         var discordContentWvW = new DiscordAPIJSONContent()
         {
             Embeds = new List <DiscordAPIJSONContentEmbed>()
             {
                 discordContentEmbed
             }
         };
         try
         {
             var jsonContentWvW = JsonConvert.SerializeObject(discordContentWvW);
             foreach (var key in allWebhooks.Keys)
             {
                 var webhook = allWebhooks[key];
                 if (!webhook.Active ||
                     (webhook.SuccessFailToggle.Equals(DiscordWebhookDataSuccessToggle.OnSuccessOnly) && !(reportJSON.Encounter.Success ?? false)) ||
                     (webhook.SuccessFailToggle.Equals(DiscordWebhookDataSuccessToggle.OnFailOnly) && (reportJSON.Encounter.Success ?? false)) ||
                     (webhook.BossesDisable.Contains(reportJSON.Encounter.BossId)) ||
                     (!webhook.Team.IsSatisfied(reportJSON.ExtraJSON)))
                 {
                     continue;
                 }
                 var uri = new Uri(webhook.URL);
                 using var content  = new StringContent(jsonContentWvW, Encoding.UTF8, "application/json");
                 using var response = await mainLink.HttpClientController.PostAsync(uri, content);
             }
             if (allWebhooks.Count > 0)
             {
                 mainLink.AddToText(">:> All active webhooks successfully executed.");
             }
         }
         catch
         {
             mainLink.AddToText(">:> Unable to execute active webhooks.");
         }
     }
     else // not WvW
     {
         var bossName      = $"{reportJSON.Encounter.Boss}{(reportJSON.ChallengeMode ? " CM" : string.Empty)}";
         var successString = (reportJSON.Encounter.Success ?? false) ? ":white_check_mark:" : "❌";
         var extraJSON     = (reportJSON.ExtraJSON is null) ? string.Empty : $"Recorded by: {reportJSON.ExtraJSON.RecordedBy}\nDuration: {reportJSON.ExtraJSON.Duration}\nElite Insights version: {reportJSON.ExtraJSON.EliteInsightsVersion}\n";
         var icon          = string.Empty;
         var bossData      = Bosses.GetBossDataFromId(reportJSON.Encounter.BossId);
         if (!(bossData is null))
         {
             bossName = $"{bossData.Name}{(reportJSON.ChallengeMode ? " CM" : string.Empty)}";
             icon     = bossData.Icon;
         }
         var colour = (reportJSON.Encounter.Success ?? false) ? 32768 : 16711680;
         var discordContentEmbedThumbnail = new DiscordAPIJSONContentEmbedThumbnail()
         {
             Url = icon
         };
         var timestampDateTime = DateTime.UtcNow;
         if (!(reportJSON.ExtraJSON is null))
         {
             timestampDateTime = reportJSON.ExtraJSON.TimeStart;
         }
         var timestamp           = timestampDateTime.ToString("o");
         var discordContentEmbed = new DiscordAPIJSONContentEmbed()
         {
             Title       = bossName,
             Url         = reportJSON.Permalink,
             Description = $"{extraJSON}Result: {successString}\narcdps version: {reportJSON.EVTC.Type}{reportJSON.EVTC.Version}",
             Colour      = colour,
             TimeStamp   = timestamp,
             Thumbnail   = discordContentEmbedThumbnail
         };
         var discordContentWithoutPlayers = new DiscordAPIJSONContent()
         {
             Embeds = new List <DiscordAPIJSONContentEmbed>()
             {
                 discordContentEmbed
             }
         };
         var discordContentEmbedForPlayers = new DiscordAPIJSONContentEmbed()
         {
             Title       = bossName,
             Url         = reportJSON.Permalink,
             Description = $"{extraJSON}Result: {successString}\narcdps version: {reportJSON.EVTC.Type}{reportJSON.EVTC.Version}",
             Colour      = colour,
             TimeStamp   = timestamp,
             Thumbnail   = discordContentEmbedThumbnail
         };
         if (reportJSON.Players.Values.Count <= 10)
         {
             var fields = new List <DiscordAPIJSONContentEmbedField>();
             if (reportJSON.ExtraJSON is null)
             {
                 foreach (var player in reportJSON.Players.Values)
                 {
                     fields.Add(new DiscordAPIJSONContentEmbedField()
                     {
                         Name = player.CharacterName, Value = $"```\n{player.DisplayName}\n\n{Players.ResolveSpecName(player.Profession, player.EliteSpec)}\n```", Inline = true
                     });
                 }
             }
             else
             {
                 // player list
                 var playerNames = new TextTable(2, tableStyle, tableBorders);
                 playerNames.SetColumnWidthRange(0, 21, 21);
                 playerNames.SetColumnWidthRange(1, 20, 20);
                 playerNames.AddCell("Character");
                 playerNames.AddCell("Account name");
                 foreach (var player in reportJSON.ExtraJSON.Players.Where(x => !x.FriendNPC).OrderBy(x => x.Name))
                 {
                     playerNames.AddCell($"{player.Name}");
                     playerNames.AddCell($"{player.Account}");
                 }
                 fields.Add(new DiscordAPIJSONContentEmbedField()
                 {
                     Name  = "Players in squad/group:",
                     Value = $"```{playerNames.Render()}```"
                 });
                 var numberOfRealTargers = reportJSON.ExtraJSON.Targets
                                           .Where(x => !x.IsFake)
                                           .Count();
                 // damage summary
                 var damageStats = reportJSON.ExtraJSON.Players
                                   .Where(x => !x.FriendNPC)
                                   .Select(x => new
                 {
                     Player = x,
                     DPS    = numberOfRealTargers > 0 ? reportJSON.ExtraJSON.PlayerTargetDPS[x] : x.DpsAll.First().DPS
                 })
                                   .OrderByDescending(x => x.DPS)
                                   .Take(10)
                                   .ToList();
                 var dpsTargetSummary = new TextTable(3, tableStyle, TableVisibleBorders.HEADER_AND_FOOTER);
                 dpsTargetSummary.SetColumnWidthRange(0, 5, 5);
                 dpsTargetSummary.SetColumnWidthRange(1, 27, 27);
                 dpsTargetSummary.SetColumnWidthRange(2, 8, 8);
                 dpsTargetSummary.AddCell("#", tableCellCenterAlign);
                 dpsTargetSummary.AddCell("Name");
                 dpsTargetSummary.AddCell("DPS", tableCellRightAlign);
                 var rank = 0;
                 foreach (var player in damageStats)
                 {
                     rank++;
                     dpsTargetSummary.AddCell($"{rank}", tableCellCenterAlign);
                     dpsTargetSummary.AddCell($"{player.Player.Name} ({player.Player.ProfessionShort})");
                     dpsTargetSummary.AddCell($"{player.DPS.ParseAsK()}", tableCellRightAlign);
                 }
                 dpsTargetSummary.AddCell(string.Empty);
                 dpsTargetSummary.AddCell("Total");
                 var totalDPS = damageStats
                                .Select(x => x.DPS)
                                .Sum();
                 dpsTargetSummary.AddCell($"{totalDPS.ParseAsK()}", tableCellRightAlign);
                 fields.Add(new DiscordAPIJSONContentEmbedField()
                 {
                     Name  = "DPS target summary:",
                     Value = $"```{dpsTargetSummary.Render()}```"
                 });
             }
             discordContentEmbedForPlayers.Fields = fields;
         }
         var discordContentWithPlayers = new DiscordAPIJSONContent()
         {
             Embeds = new List <DiscordAPIJSONContentEmbed>()
             {
                 discordContentEmbedForPlayers
             }
         };
         try
         {
             var jsonContentWithoutPlayers = JsonConvert.SerializeObject(discordContentWithoutPlayers);
             var jsonContentWithPlayers    = JsonConvert.SerializeObject(discordContentWithPlayers);
             foreach (var key in allWebhooks.Keys)
             {
                 var webhook = allWebhooks[key];
                 if (!webhook.Active ||
                     (webhook.SuccessFailToggle.Equals(DiscordWebhookDataSuccessToggle.OnSuccessOnly) && !(reportJSON.Encounter.Success ?? false)) ||
                     (webhook.SuccessFailToggle.Equals(DiscordWebhookDataSuccessToggle.OnFailOnly) && (reportJSON.Encounter.Success ?? false)) ||
                     (webhook.BossesDisable.Contains(reportJSON.Encounter.BossId)) ||
                     (!webhook.Team.IsSatisfied(reportJSON.ExtraJSON)))
                 {
                     continue;
                 }
                 var uri = new Uri(webhook.URL);
                 if (webhook.ShowPlayers)
                 {
                     using var content = new StringContent(jsonContentWithPlayers, Encoding.UTF8, "application/json");
                     using (await mainLink.HttpClientController.PostAsync(uri, content)) { }
                 }
                 else
                 {
                     using var content = new StringContent(jsonContentWithoutPlayers, Encoding.UTF8, "application/json");
                     using (await mainLink.HttpClientController.PostAsync(uri, content)) { }
                 }
             }
             if (allWebhooks.Count > 0)
             {
                 mainLink.AddToText(">:> All active webhooks successfully executed.");
             }
         }
         catch
         {
             mainLink.AddToText(">:> Unable to execute active webhooks.");
         }
     }
 }