public async Task <bool> HandleReactionAddedAsync(IUserMessage message, IEmote reaction, IUser user) { var embed = message.Embeds.FirstOrDefault(); if (embed == null || embed.Author == null || embed.Footer == null) { return(false); // Embed checks } if (!ReactionSettings.PaginationReactions.Any(emote => emote.IsEqual(reaction))) { return(false); // Reaction check. } if (message.ReferencedMessage == null) { return(false); } if (!embed.TryParseMetadata <PointsEmbedMetadata>(out var metadata)) { return(false); // Not a points board embed. } var count = await PointsService.GetUserCountAsync(); if (count == 0) { return(false); } int newStart = metadata.Start; if (reaction.IsEqual(ReactionSettings.MoveToFirst)) { newStart = 0; } else if (reaction.IsEqual(ReactionSettings.MoveToLast)) { newStart = count - 1; } else if (reaction.IsEqual(ReactionSettings.MoveToNext)) { newStart += BoardPageLimit; } else if (reaction.IsEqual(ReactionSettings.MoveToPrevious)) { newStart -= BoardPageLimit; } if (newStart >= count) { newStart = count - 1; } else if (newStart < 0) { newStart = 0; } newStart -= newStart % BoardPageLimit; var context = new CommandContext(Client, message.ReferencedMessage); if (newStart != metadata.Start) { var board = await PointsService.GetLeaderboardAsync(newStart, BoardPageLimit, metadata.DateFrom); var newEmbed = new PointsEmbed() .WithBoard(board, context.Client.CurrentUser, count, newStart, BoardPageLimit, metadata.DateFrom) .Build(); await message.ModifyAsync(msg => msg.Embed = newEmbed); } if (!context.IsPrivate) // DMs have blocked removing reactions. { await message.RemoveReactionAsync(reaction, user); } return(true); }
public async Task <bool> HandleReactionAddedAsync(IUserMessage message, IEmote reaction, IUser user) { var embed = message.Embeds.FirstOrDefault(); if (embed == null || embed.Author == null || embed.Footer == null) { return(false); // Embed checks } if (!ReactionSettings.PaginationReactions.Any(emote => emote.IsEqual(reaction))) { return(false); // Reaction check. } if (message.ReferencedMessage == null) { return(false); } if (!embed.TryParseMetadata <HelpPageEmbedMetadata>(out var metadata)) { return(false); // Not a help embed. } var context = new CommandContext(Client, message.ReferencedMessage); var availableModules = await CommandService.Modules .FindAllAsync(async mod => (await mod.GetExecutableCommandsAsync(context, Provider)).Count > 0); int maxPages = Math.Min(metadata.PageCount, availableModules.Count); // Maximal count of available pages. int newPage = metadata.PageNumber; if (reaction.IsEqual(ReactionSettings.MoveToFirst)) { newPage = 1; } else if (reaction.IsEqual(ReactionSettings.MoveToLast)) { newPage = maxPages; } else if (reaction.IsEqual(ReactionSettings.MoveToNext) && newPage < maxPages) { newPage++; } else if (reaction.IsEqual(ReactionSettings.MoveToPrevious) && newPage > 1) { newPage--; } if (newPage != metadata.PageNumber) { var module = availableModules[newPage - 1]; var newEmbed = (await new HelpPageEmbed() .WithModuleAsync(module, context, Provider, maxPages, Configuration["Prefix"], newPage)) .Build(); await message.ModifyAsync(msg => msg.Embed = newEmbed); } if (!context.IsPrivate) // DMs have blocked removing reactions. { await message.RemoveReactionAsync(reaction, user); } return(true); }