protected virtual void UpdateProperties() { // Check if the fields don't fit on one page. if (AllFieldBuilders.Count > MaxFieldsPerPage) { // Pages are not used if page number is negative. if (Page == null) { EmbedBuilder.Footer = new EmbedFooterBuilder() { IconUrl = $"https://cdn.discordapp.com/emojis/{WarningEmoteId}.png", Text = $"{AllFieldBuilders.Count - MaxFieldsPerPage} items were excluded", }; EmbedBuilder.Fields = AllFieldBuilders.GetRange(0, AllFieldBuilders.Count > 25 ? 25 : AllFieldBuilders.Count); } else { // Ensure page number is within bounds. Page = Math.Min(TotalNumberOfPages, Math.Max(Page ?? 0, 1)); EmbedBuilder.Footer = new EmbedFooterBuilder() { IconUrl = $"https://cdn.discordapp.com/emojis/{InfoEmoteId}.png", Text = $"Page {Page}/{TotalNumberOfPages}", }; // Page 0 and 1 should have the same starting index (never negative). int startIndex = MaxFieldsPerPage * Math.Max((int)Page - 1, 0); // Get the fields that are within the page and set the embed's fields to that. bool isFinalPage = Page == TotalNumberOfPages; EmbedBuilder.Fields = AllFieldBuilders.GetRange(startIndex, isFinalPage ? (AllFieldBuilders.Count - startIndex) : MaxFieldsPerPage); } } else { Page = null; EmbedBuilder.Fields = AllFieldBuilders; } }
public ValueListMessage(string keyword, List <KeywordValue> values, Func <Task> galleryButton, int?page = null) : base(new List <EmbedFieldBuilder>(), $"*There are {values.Count} values in total, as listed below.*", $"📒 Values for '{keyword}'", page) { foreach (KeywordValue value in values) { var user = value.AddedByUserId == 0 ? "[UNKNOWN USER]" : BotService.Client.GetUser(value.AddedByUserId).Username; var date = value.DateTimeAddedBinary == 0 ? "[UNKNOWN DATE]" : DateTime.FromBinary(value.DateTimeAddedBinary).ToDiscordTimestamp("D"); AllFieldBuilders.Add( new EmbedFieldBuilder() { Name = $"Added by {user} at {date}", Value = $"{value.TimesLiked} times liked, {value.TimesDeleted} times deleted.\n```{value.Content}```", }); } GalleryButton = galleryButton; }
public ListOfSongsMessage(Queue <UserSongRequest> queue, string title = "List of songs", int?page = null) : base(new List <EmbedFieldBuilder>(), $"*The total duration of the songs below is {VoiceModule.DurationAsString(queue.Sum(r => r.VideoMetadata.Duration))}*", title) { double totalDuration = 0; int i = 0; foreach (UserSongRequest songRequest in queue) { i++; totalDuration += songRequest.VideoMetadata.Duration; var fieldBuilderForSongRequest = new EmbedFieldBuilder() { Name = $"{i}) {songRequest.VideoMetadata.Title}", Value = $"[More details]({songRequest.VideoMetadata.WebpageUrl}) • {VoiceModule.DurationAsString(songRequest.VideoMetadata.Duration)} \nRequested {songRequest.TimeRequested.ToDiscordTimestamp("R")} by {songRequest.RequestedByMention}", }; AllFieldBuilders.Add(fieldBuilderForSongRequest); } Page = page; UpdateProperties(); }
protected LeaderboardMessage( IEnumerable <LeaderboardEntry> leaderboardEntries, Func <LeaderboardEntry, string> detailsPredicate, string title, string description = null, int?page = null) : base(new List <EmbedFieldBuilder>(), description, title) { int num = 1; foreach (var entry in leaderboardEntries) { AllFieldBuilders.Add(new EmbedFieldBuilder() { Name = $"{num}) {entry.Points} points", Value = $"{entry.PlayedByMention} at {entry.PlayedAt.ToDiscordTimestamp("f")}\n{detailsPredicate.Invoke(entry)}", }); num++; } Page = page; UpdateProperties(); }