private EmbedBuilder BuildImageEmbed(PostData postData, string embedDescription) { StringBuilder seriesNames = new StringBuilder(TagParser.EscapeUnderscore(postData.SeriesName)); StringBuilder title = new StringBuilder(TagParser.BuildTitle(postData.TagName)); StringBuilder tagIds = new StringBuilder(postData.TagId.ToString()); StringBuilder tagIdTitle = new StringBuilder("Character ID"); StringBuilder seriesNameTitle = new StringBuilder("Series Name"); if (postData.AdditionalData != null) { foreach (string s in postData.AdditionalData.AdditionalTagNames) { title.Append($", {TagParser.BuildTitle(s)}"); } foreach (int i in postData.AdditionalData.AdditionalTagIds) { tagIds.Append($", {i}"); } tagIdTitle.Append("s"); foreach (string s in postData.AdditionalData.AdditionalSeriesNames) { if (s != postData.SeriesName) { seriesNames.Append($", {s}"); } } seriesNameTitle.Append("s"); } return(new EmbedBuilder().WithTitle(title.ToString()) .AddField(tagIdTitle.ToString(), tagIds.ToString(), true) .AddField("Post ID", postData.LinkId, true) .AddField(seriesNameTitle.ToString(), seriesNames.ToString(), true) .WithDescription(embedDescription) .WithImageUrl(postData.Link) .WithUrl(postData.Link) .WithAuthor(Context.Client.CurrentUser) .WithFooter($"Image {postData.PostIndex + 1} of {postData.PostCount}") .WithColor(Color.DarkGrey) .WithCurrentTimestamp()); }
private async Task <EmbedBuilder> SearchCollabAsync(string[] searchTerms, int postId = 0, ROLL_SEQUENCE rollSequence = ROLL_SEQUENCE.RANDOM) { if (!_pageService.HandlerAdded) { Context.Client.ReactionAdded += ReactionAdded_Event; _pageService.HandlerAdded = true; } if (searchTerms.Length < 2 || searchTerms.Length > 5) { await ReplyAsync("Please provide between 2 and 5 character names."); return(null); } bool wildcardLastArg = false; if (searchTerms[searchTerms.Length - 1] == "*") { wildcardLastArg = true; Array.Resize(ref searchTerms, searchTerms.Length - 1); } List <string> searchTermsList = new List <string>(searchTerms); foreach (string s in searchTermsList) { if (searchTermsList.FindAll(t => t == s).Count > 1) { await ReplyAsync("Names may not be specified more than once."); return(null); } } DbCharacterIndex charIndex = _characterIndex; using (MySqlConnection charConn = _characterIndex.GetConnection()) { int id; string tag; string matchedName; for (int i = 0; i < searchTerms.Length; i++) { if (int.TryParse(searchTerms[i], out id)) { tag = charIndex.LookupTagById(id, charConn); if (!string.IsNullOrEmpty(tag)) { searchTerms[i] = tag; } } searchTerms[i] = TagParser.Format(searchTerms[i]); if (!charIndex.HasExactMatch(searchTerms[i], charConn, out matchedName)) { await ReplyAsync($"Character name '{TagParser.EscapeUnderscore(searchTerms[i])}' could not be found."); return(null); } else { searchTerms[i] = matchedName; } } EmbedBuilder embed; if (wildcardLastArg) { List <string> furtherCollabs = charIndex.CollabsWithCharacters(searchTerms, charConn); if (furtherCollabs.Count == 0) { await ReplyAsync($"No further collabs with the specified character(s) exist."); return(null); } List <TagData> tagData = charIndex.LookupTagData(furtherCollabs, charConn); pages = TagParser.CompileSuggestions(tagData, EmbedBuilder.MaxFieldCount); embed = BuildSuggestionsEmbed(pages); } else { PostData postData = null; switch (rollSequence) { case ROLL_SEQUENCE.RANDOM: postData = charIndex.LookupRandomCollab(searchTerms, charConn); break; case ROLL_SEQUENCE.PREVIOUS: postData = charIndex.LookupPreviousCollab(searchTerms, postId, charConn); break; case ROLL_SEQUENCE.NEXT: postData = charIndex.LookupNextCollab(searchTerms, postId, charConn); break; } string embedDescription = rerollCollabDescription + "." + Environment.NewLine + listCharactersDescription + "."; embedDescription += Environment.NewLine + cycleCharacterPageDescription + "."; if (postData != null && !string.IsNullOrEmpty(postData.Link)) { embed = BuildImageEmbed(postData, embedDescription); } else { await ReplyAsync($"No images found for this collab."); return(null); } } return(embed); } }
private async Task <EmbedBuilder> SearchAsync(string searchTerm, CATEGORY category, ITagIndex tagIndex, int postIndex = 0, ROLL_SEQUENCE rollSequence = ROLL_SEQUENCE.RANDOM) { if (string.IsNullOrEmpty(searchTerm)) { string usageString = "Usage: "; switch (category) { case CATEGORY.CHARACTER: await ReplyAsync(usageString + "oka.character character_name"); break; case CATEGORY.SERIES: await ReplyAsync(usageString + "oka.series series_name"); break; } return(null); } if (!_pageService.HandlerAdded) { Context.Client.ReactionAdded += ReactionAdded_Event; _pageService.HandlerAdded = true; } searchTerm = TagParser.Format(searchTerm); string tag; string searchTermEscaped; string searchTermMatched; int id; PostData postData = null; List <string> tags; List <TagData> tagData; EmbedBuilder embed; List <EmbedFieldBuilder> fields = new List <EmbedFieldBuilder>(); string embedDescription = rerollCharacterDescription + ", " + rerollSeriesDescription + ". " + Environment.NewLine + listCharactersDescription + "."; using (MySqlConnection conn = tagIndex.GetConnection()) { if (int.TryParse(searchTerm, out id)) { tag = tagIndex.LookupTagById(id, conn); if (!string.IsNullOrEmpty(tag)) { searchTerm = tag; } } searchTermEscaped = TagParser.EscapeUnderscore(searchTerm); if (tagIndex.HasExactMatch(searchTerm, conn, out searchTermMatched)) { switch (rollSequence) { case ROLL_SEQUENCE.RANDOM: postData = tagIndex.LookupRandomPost(searchTermMatched, conn); break; case ROLL_SEQUENCE.PREVIOUS: postData = tagIndex.LookupPreviousPost(searchTermMatched, postIndex, conn); break; case ROLL_SEQUENCE.NEXT: postData = tagIndex.LookupNextPost(searchTermMatched, postIndex, conn); break; } switch (category) { case CATEGORY.CHARACTER: embedDescription += Environment.NewLine + cycleCharacterPageDescription + "."; break; } if (postData != null && !string.IsNullOrEmpty(postData.Link)) { embed = BuildImageEmbed(postData, embedDescription); } else { await ReplyAsync(NoImages.Replace("%", searchTermEscaped)); return(null); } } else { embed = new EmbedBuilder(); tags = tagIndex.LookupTags(searchTerm, conn); if (tags.Count > 0) { if (tags.Count > MaxSearchResults) { await ReplyAsync(ExcessiveResults.Replace("%", searchTerm)); return(null); } tagData = tagIndex.LookupTagData(tags, conn); pages = TagParser.CompileSuggestions(tagData, EmbedBuilder.MaxFieldCount); embed = BuildSuggestionsEmbed(pages); } else { await ReplyAsync(NoResults.Replace("%", searchTermEscaped)); return(null); } } return(embed); } }
public async Task InSeriesAsync(string seriesName = null) { if (string.IsNullOrEmpty(seriesName)) { await ReplyAsync("Usage: oka.in_series series_name"); return; } if (!_pageService.HandlerAdded) { Context.Client.ReactionAdded += ReactionAdded_Event; _pageService.HandlerAdded = true; } DbSeriesIndex seriesIndex = _seriesIndex; DbCharacterIndex charIndex = _characterIndex; using (MySqlConnection charConn = _characterIndex.GetConnection()) using (MySqlConnection seriesConn = _seriesIndex.GetConnection()) { int id; string tag; string seriesNameEscaped; if (int.TryParse(seriesName, out id)) { tag = seriesIndex.LookupTagById(id, seriesConn); if (!string.IsNullOrEmpty(tag)) { seriesName = tag; } } seriesName = TagParser.Format(seriesName); seriesNameEscaped = TagParser.EscapeUnderscore(seriesName); List <string> characters = seriesIndex.CharactersInSeries(seriesName, seriesConn); if (characters.Count > 0) { if (characters.Count < MaxSearchResults) { List <TagData> characterData = charIndex.LookupTagData(characters, charConn); pages = TagParser.CompileSuggestions(characterData, EmbedBuilder.MaxFieldCount); EmbedBuilder embed = BuildSuggestionsEmbed(pages); if (embed != null) { var toSend = await Context.Channel.SendMessageAsync(embed : embed.Build()); ulong msgId = toSend.Id; PageData pageData = new PageData(pages); _pageService.AddLimited(msgId, pageData); await toSend.AddReactionAsync(Constants.PageBack); await toSend.AddReactionAsync(Constants.PageForward); await toSend.AddReactionAsync(Constants.SortAlphabetical); await toSend.AddReactionAsync(Constants.SortNumerical); await toSend.AddReactionAsync(Constants.ChangeOrder); } } else { await ReplyAsync(ExcessiveResults.Replace("%", seriesNameEscaped)); } } else { await ReplyAsync(NoResults.Replace("%", seriesNameEscaped)); } } }