Example #1
0
File: Ops.cs Project: bion33/Kronos
        /// <summary> Generate a report of likely military operations during the last (major or minor) update </summary>
        public async Task Run(string userAgent, Dictionary <string, string> userTags, bool interactiveLog = false)
        {
            Console.Write("Compiling operations report... \n");

            api     = RepoApi.Api(userAgent);
            regions = await RepoRegionDump.Dump(userAgent, userTags).Regions();

            // Start and end of last (major or minor) update
            var updateStart = StartOfLastUpdate();
            var updateEnd   = await api.LastUpdateFor(regions.Last().Name);

            // Get happenings
            var delegateChangeHappenings = await api.DelegateChangesFrom(updateStart, updateEnd);

            // Parse each happening to the DelegacyChange DTO
            var delegacyChanges = DelegacyChanges(delegateChangeHappenings);

            // Filter out the suspicious changes from among the (supposedly) legitimate changes
            var ops = await FilterOps(delegacyChanges, updateEnd - 43200, userTags, interactiveLog);

            if (interactiveLog)
            {
                Console.Write("Saving to report... ");
            }

            // Generate report
            ops = ops.OrderBy(o => o.ChangeTimeStamp).ToList();
            var report = Report(ops);

            // Save
            var date = TimeUtil.DateForPath();

            Directory.CreateDirectory(date);
            await File.WriteAllTextAsync($"{date}/Kronos-Ops_{date}.md", report);

            if (interactiveLog)
            {
                Console.Write("[done].\n");
            }
        }
Example #2
0
        /// <summary> Generate a XLSX sheet containing the relevant information </summary>
        private async Task XlsxSheet(List <Region> regions)
        {
            var wb = new XLWorkbook();
            var ws = wb.Worksheets.Add("TimeSheet");

            // Header
            var row = new List <object>
            {
                "Region", "Major", "Minor", "Nations", "Endo's", "Protected", "Exec. D", "Tagged", "Link", "", "World",
                "Data"
            };

            ws.AddRow(1, row);

            var majorTime = await dump.MajorTook();

            var minorTime = await dump.MinorTook();

            var nations = await dump.NumNations();

            // Add overall update information
            ws.AddWorldData(2, 11, nations, (int)majorTime, (int)minorTime);

            // Add for each region its name, major and minor update, nations, votes for its WA Delegate, whether
            // it has a founder or not, whether it's WA Delegate has executive authority, whether it is tagged as
            // "invader", and its hyperlink.
            for (var i = 2; i < regions.Count + 2; i++)
            {
                var region = regions[i - 2];
                row = new List <object>
                {
                    "'" + region.Name,
                    "'" + region.ReadableMajorUpdateTime,
                    "'" + region.ReadableMinorUpdateTime,
                    region.NationCount,
                    region.DelegateVotes,
                    !region.Founderless ? "Founder" : region.Password ? "Password" : "No",
                        region.DelegateAuthority.ToUpper().Contains("X") ? "Y" : "N",
                    region.Tagged || region.Embassies.Any(e => e.EmbassyType == EmbassyClass.RaiderRegions)
                        ? "Y"
                        : "N"
                };
                ws.AddRow(i, row);
                ws.Cell($"I{i}").SetValue(region.Url).Hyperlink = new XLHyperlink(region.Url);
            }

            // Style header
            ws.Range("A1:I1").Style.Fill.BackgroundColor = XLColor.Gray;
            ws.Range("K1:L1").Style.Fill.BackgroundColor = XLColor.Gray;
            ws.Row(1).Style.Font.Bold = true;

            // Align
            ws.Columns(1, 12).AdjustToContents();
            ws.Column("I").Width = 40;
            ws.Range("I2", $"G{regions.Count + 1}").Style.Alignment.Horizontal = XLAlignmentHorizontalValues.Justify;
            ws.Column("K").Style.Alignment.Horizontal = XLAlignmentHorizontalValues.Right;
            ws.Column("L").Style.Alignment.Horizontal = XLAlignmentHorizontalValues.Left;

            // Add conditional colours for whether or not the region has a founder (green) or password (olive)
            // Use yellow for unprotected regions
            ws.Range("F2", $"F{regions.Count + 1}").AddConditionalFormat().WhenStartsWith("F").Fill
            .SetBackgroundColor(XLColor.Green);
            ws.Range("F2", $"F{regions.Count + 1}").AddConditionalFormat().WhenStartsWith("P").Fill
            .SetBackgroundColor(XLColor.Olive);
            ws.Range("F2", $"F{regions.Count + 1}").AddConditionalFormat().WhenStartsWith("N").Fill
            .SetBackgroundColor(XLColor.Yellow);

            // Add conditional colours for whether or not the WA Delegacy is executive
            ws.Range("G2", $"G{regions.Count + 1}").AddConditionalFormat().WhenEndsWith("Y").Fill
            .SetBackgroundColor(XLColor.DarkOrange);
            ws.Range("G2", $"G{regions.Count + 1}").AddConditionalFormat().WhenEndsWith("N").Fill
            .SetBackgroundColor(XLColor.Green);

            // Add conditional colours for whether or not the region is tagged "invader"
            ws.Range("H2", $"H{regions.Count + 1}").AddConditionalFormat().WhenEndsWith("Y").Fill
            .SetBackgroundColor(XLColor.Red);
            ws.Range("H2", $"H{regions.Count + 1}").AddConditionalFormat().WhenEndsWith("N").Fill
            .SetBackgroundColor(XLColor.Green);

            // Save
            var date = TimeUtil.DateForPath();

            Directory.CreateDirectory(date);
            wb.SaveAs($"{date}/Kronos-TimeSheet_{date}.xlsx");
        }
Example #3
0
        /// <summary> Generate a XLSX sheet containing the relevant information </summary>
        private async Task XlsxSheet(List <Region> regions)
        {
            var wb = new XLWorkbook();
            var ws = wb.Worksheets.Add("TimeSheet");

            // Header
            var row = new List <object>
            {
                "Region", "Major", "Minor", "Nations", "Endo's", "Founder", "Link", "", "World", "Data"
            };

            ws.AddRow(1, row);

            var majorTime = await dump.MajorTook();

            var minorTime = await dump.MinorTook();

            var nations = await dump.NumNations();

            // Add overall update information
            ws.AddWorldData(2, 9, nations, (int)majorTime, (int)minorTime);

            // Add for each region its name, major and minor update, nations, votes for its WA Delegate, whether
            // it has a founder or not, and its hyperlink.
            for (var i = 2; i < regions.Count + 2; i++)
            {
                var region = regions[i - 2];
                row = new List <object>
                {
                    "'" + region.Name,
                    "'" + region.ReadableMajorUpdateTime,
                    "'" + region.ReadableMinorUpdateTime,
                    region.NationCount,
                    region.DelegateVotes,
                    !region.Founderless ? "Y" : "N"
                };
                ws.AddRow(i, row);
                ws.Cell($"G{i}").SetValue(region.Url).Hyperlink = new XLHyperlink(region.Url);
            }

            // Style header
            ws.Range("A1:G1").Style.Fill.BackgroundColor = XLColor.Gray;
            ws.Range("I1:J1").Style.Fill.BackgroundColor = XLColor.Gray;
            ws.Row(1).Style.Font.Bold = true;

            // Align
            ws.Columns(1, 9).AdjustToContents();
            ws.Column("G").Width = 40;
            ws.Range("G2", $"G{regions.Count + 1}").Style.Alignment.Horizontal = XLAlignmentHorizontalValues.Justify;
            ws.Column("I").Style.Alignment.Horizontal = XLAlignmentHorizontalValues.Right;
            ws.Column("J").Style.Alignment.Horizontal = XLAlignmentHorizontalValues.Left;

            // Add conditional colours for whether or not the region has a founder
            ws.Range("F2", $"F{regions.Count + 1}").AddConditionalFormat().WhenEndsWith("Y").Fill
            .SetBackgroundColor(XLColor.Green);
            ws.Range("F2", $"F{regions.Count + 1}").AddConditionalFormat().WhenEndsWith("N").Fill
            .SetBackgroundColor(XLColor.Red);

            // Save
            var date = TimeUtil.DateForPath();

            Directory.CreateDirectory(date);
            wb.SaveAs($"{date}/Kronos-Detag_{date}.xlsx");
        }