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