Esempio n. 1
0
        public Task <Embed> CreateFrontPercentEmbed(FrontBreakdown breakdown, DateTimeZone tz)
        {
            var actualPeriod = breakdown.RangeEnd - breakdown.RangeStart;
            var eb           = new EmbedBuilder()
                               .WithColor(Color.Blue)
                               .WithFooter($"Since {Formats.ZonedDateTimeFormat.Format(breakdown.RangeStart.InZone(tz))} ({Formats.DurationFormat.Format(actualPeriod)} ago)");

            var maxEntriesToDisplay = 24; // max 25 fields allowed in embed - reserve 1 for "others"

            // We convert to a list of pairs so we can add the no-fronter value
            // Dictionary doesn't allow for null keys so we instead have a pair with a null key ;)
            var pairs = breakdown.MemberSwitchDurations.ToList();

            if (breakdown.NoFronterDuration != Duration.Zero)
            {
                pairs.Add(new KeyValuePair <PKMember, Duration>(null, breakdown.NoFronterDuration));
            }

            var membersOrdered = pairs.OrderByDescending(pair => pair.Value).Take(maxEntriesToDisplay).ToList();

            foreach (var pair in membersOrdered)
            {
                var frac = pair.Value / actualPeriod;
                eb.AddField(pair.Key?.Name ?? "*(no fronter)*", $"{frac*100:F0}% ({Formats.DurationFormat.Format(pair.Value)})");
            }

            if (membersOrdered.Count > maxEntriesToDisplay)
            {
                eb.AddField("(others)",
                            Formats.DurationFormat.Format(membersOrdered.Skip(maxEntriesToDisplay)
                                                          .Aggregate(Duration.Zero, (prod, next) => prod + next.Value)), true);
            }

            return(Task.FromResult(eb.Build()));
        }
Esempio n. 2
0
        public Task <Embed> CreateFrontPercentEmbed(FrontBreakdown breakdown, PKSystem system, PKGroup group, DateTimeZone tz, LookupContext ctx, string embedTitle, bool ignoreNoFronters, bool showFlat)
        {
            string color = system.Color;

            if (group != null)
            {
                color = group.Color;
            }

            uint embedColor;

            try
            {
                embedColor = color?.ToDiscordColor() ?? DiscordUtils.Gray;
            }
            catch (ArgumentException)
            {
                embedColor = DiscordUtils.Gray;
            }

            var eb = new EmbedBuilder()
                     .Title(embedTitle)
                     .Color(embedColor);

            string footer = $"Since {breakdown.RangeStart.FormatZoned(tz)} ({(breakdown.RangeEnd - breakdown.RangeStart).FormatDuration()} ago)";

            Duration period;

            if (showFlat)
            {
                period  = Duration.FromTicks(breakdown.MemberSwitchDurations.Values.ToList().Sum(i => i.TotalTicks));
                footer += ". Showing flat list (percentages add up to 100%)";
                if (!ignoreNoFronters)
                {
                    period += breakdown.NoFronterDuration;
                }
                else
                {
                    footer += ", ignoring switch-outs";
                }
            }
            else if (ignoreNoFronters)
            {
                period  = breakdown.RangeEnd - breakdown.RangeStart - breakdown.NoFronterDuration;
                footer += ". Ignoring switch-outs";
            }
            else
            {
                period = breakdown.RangeEnd - breakdown.RangeStart;
            }

            eb.Footer(new(footer));

            var maxEntriesToDisplay = 24; // max 25 fields allowed in embed - reserve 1 for "others"

            // We convert to a list of pairs so we can add the no-fronter value
            // Dictionary doesn't allow for null keys so we instead have a pair with a null key ;)
            var pairs = breakdown.MemberSwitchDurations.ToList();

            if (breakdown.NoFronterDuration != Duration.Zero && !ignoreNoFronters)
            {
                pairs.Add(new KeyValuePair <PKMember, Duration>(null, breakdown.NoFronterDuration));
            }

            var membersOrdered = pairs.OrderByDescending(pair => pair.Value).Take(maxEntriesToDisplay).ToList();

            foreach (var pair in membersOrdered)
            {
                var frac = pair.Value / period;
                eb.Field(new(pair.Key?.NameFor(ctx) ?? "*(no fronter)*", $"{frac*100:F0}% ({pair.Value.FormatDuration()})"));
            }

            if (membersOrdered.Count > maxEntriesToDisplay)
            {
                eb.Field(new("(others)",
                             membersOrdered.Skip(maxEntriesToDisplay)
                             .Aggregate(Duration.Zero, (prod, next) => prod + next.Value)
                             .FormatDuration(), true));
            }

            return(Task.FromResult(eb.Build()));
        }