public async Task EmoteFavourite(string search, bool secondTry = false) { int rows = 4; int columns = 5; if (!CommonHelper.AllowedToRun(BotPermissionType.EnableType2Commands, Context.Message.Channel.Id, Context.Message.Author.Id)) { return; } Stopwatch watch = new Stopwatch(); watch.Start(); var author = Context.Message.Author; if (search.Length < 2 && author.Id != Program.ApplicationSetting.Owner) { await Context.Channel.SendMessageAsync($"Search term needs to be atleast 2 characters long", false); // to prevent from db overload return; } var emoteResult = DiscordHelper.SearchEmote(search, Context.Guild.Id, 0, false, rows, columns); watch.Stop(); int page = 0; string desc = $"**Available({page * emoteResult.PageSize}-{Math.Min((page + 1) * emoteResult.PageSize, emoteResult.TotalEmotesFound)}/{emoteResult.TotalEmotesFound}) '{search}' emojis to use (Usage .<name>)**" + Environment.NewLine; try { EmbedBuilder builder = new EmbedBuilder() { ImageUrl = emoteResult.Url, Description = desc, Color = Color.DarkRed, Title = "Image full size", Footer = new EmbedFooterBuilder() { Text = search + " Page: " + page }, ThumbnailUrl = "https://cdn.battlerush.dev/bot_xmas.png", Timestamp = DateTimeOffset.Now, Url = emoteResult.Url, }; builder.WithAuthor(Context.User); //foreach (var item in emoteResult.Fields) // builder.AddField(item.Key, item.Value); // TODO create common place for button ids var builderComponent = new ComponentBuilder(); int row = 0; int col = 0; foreach (var emote in emoteResult.EmoteList) { if (emoteResult.valid.Skip(row * columns + col).First()) { builderComponent.WithButton(emote.Value, $"emote-fav-{emote.Key}", ButtonStyle.Primary, Emote.Parse($"<:{emote.Value}:{emote.Key}>"), null, false, row); } else { builderComponent.WithButton(emote.Value, $"emote-fav-{emote.Key}", ButtonStyle.Primary, null, null, false, row); } col++; if (col == columns) { row++; col = 0; } } // Start fresh row for paging if (col > 0) { row++; } builderComponent.WithButton("Prev <", $"emote-fav-get-prev-page-{search}-{page}", ButtonStyle.Danger, null, null, page == 0, row); builderComponent.WithButton("> Next", $"emote-fav-get-next-page-{search}-{page}", ButtonStyle.Success, null, null, (page + 1) * emoteResult.PageSize > emoteResult.TotalEmotesFound, row); var msg2 = await Context.Channel.SendMessageAsync("", false, builder.Build(), null, null, null, builderComponent.Build()); } catch (HttpException ex) { foreach (var error in ex.Errors) { if (error.Errors.Any(i => i.Code == "BUTTON_COMPONENT_INVALID_EMOJI")) { var parts = error.Path.Split('.'); int error_row = Convert.ToInt32(Regex.Replace(parts[0], "[^0-9]", "")); int error_column = Convert.ToInt32(Regex.Replace(parts[1], "[^0-9]", "")); var brokenEmote = emoteResult.EmoteList.Skip(error_row * columns + error_column).First(); EmoteDBManager.Instance().ChangeValidStatus(brokenEmote.Key, false); } } // call yourself again to retry -> if (secondTry == false) { await EmoteFavourite(search, true); } // Some emotes may no lonver be valid -> db entry to invalidate the emote } catch (Exception ex) { await Context.Channel.SendMessageAsync(ex.ToString(), false); } }
private async Task <bool> FavEmoteGetPage(int dir, string searchTerm, int page, int rows = 4, int columns = 5, bool secondTry = false) { var message = Context.Interaction as SocketMessageComponent; var user = Context.Interaction.User; if (message.Message.Embeds.First().Author.Value.Name != $"{user.Username}#{user.Discriminator}") { Context.Interaction.RespondAsync("You did not invoke this message.", null, false, true); //Context.Interaction.DeferAsync(); return(false); } page += dir; if (page < 0) { return(false); // disable prev button on page 0 } var emoteResult = DiscordHelper.SearchEmote(searchTerm, Context.Guild.Id, page, false, rows, columns); // TODO pass debug info aswell string desc = $"Available({page * emoteResult.PageSize}-{Math.Min((page + 1) * emoteResult.PageSize, emoteResult.TotalEmotesFound)}/{emoteResult.TotalEmotesFound}) '{searchTerm}' {Environment.NewLine}**To use the emotes (Usage .<name>)**"; EmbedBuilder builder = new EmbedBuilder() { ImageUrl = emoteResult.Url, Description = desc, Color = Color.DarkRed, Title = "Image full size", Footer = new EmbedFooterBuilder() { Text = searchTerm + " Page: " + page }, ThumbnailUrl = "https://cdn.battlerush.dev/bot_xmas.png", Timestamp = DateTimeOffset.Now, Url = emoteResult.Url, }; builder.WithAuthor(Context.Interaction.User); var builderComponent = new ComponentBuilder(); try { int row = 0; int col = 0; foreach (var emote in emoteResult.EmoteList) { if (emoteResult.valid.Skip(row * columns + col).First()) { builderComponent.WithButton(emote.Value, $"emote-fav-{emote.Key}", ButtonStyle.Primary, Emote.Parse($"<:{emote.Value}:{emote.Key}>"), null, false, row); } else { builderComponent.WithButton(emote.Value, $"emote-fav-{emote.Key}", ButtonStyle.Primary, null, null, false, row); } col++; if (col == columns) { row++; col = 0; } } // Start fresh row for paging if (col > 0) { row++; } builderComponent.WithButton("Prev <", $"emote-fav-get-prev-page-{searchTerm}-{page}", ButtonStyle.Danger, null, null, page == 0, row); builderComponent.WithButton("> Next", $"emote-fav-get-next-page-{searchTerm}-{page}", ButtonStyle.Success, null, null, (page + 1) * emoteResult.PageSize > emoteResult.TotalEmotesFound, row); await message.Message.ModifyAsync(i => { i.Embed = builder.Build(); i.Components = builderComponent.Build(); }); } catch (HttpException ex) { foreach (var error in ex.Errors) { if (error.Errors.Any(i => i.Code == "BUTTON_COMPONENT_INVALID_EMOJI")) { var parts = error.Path.Split('.'); int error_row = Convert.ToInt32(Regex.Replace(parts[0], "[^0-9]", "")); int error_column = Convert.ToInt32(Regex.Replace(parts[1], "[^0-9]", "")); var brokenEmote = emoteResult.EmoteList.Skip(error_row * columns + error_column).First(); EmoteDBManager.Instance().ChangeValidStatus(brokenEmote.Key, false); } } // call yourself again to retry -> if (secondTry == false) { await FavEmoteGetPage(dir, searchTerm, (page -= dir), rows = 4, columns = 5, true); } // Some emotes may no lonver be valid -> db entry to invalidate the emote } //Context.Interaction.DeferAsync(); return(true); }