public static async Task <FeatureRequest <Response.Booru, Error.Booru> > SearchBooru(bool isChanSafe, string[] tags, BooruSharp.Booru.Booru booru, Random r) { if (isChanSafe && !booru.IsSafe()) { return(new FeatureRequest <Response.Booru, Error.Booru>(null, Error.Booru.ChanNotNSFW)); } BooruSharp.Search.Post.SearchResult res; try { res = await booru.GetRandomImage(tags); } catch (BooruSharp.Search.InvalidTags) { List <string> newTags = new List <string>(); foreach (string s in tags) { string tag = s; if ((await booru.GetNbImage(s)) == 0) { var related = await new BooruSharp.Booru.Konachan().GetTags(s); tag = null; foreach (var rTag in related) { if ((await booru.GetNbImage(rTag.name)) > 0) { tag = rTag.name; break; } } if (tag == null) { return(new FeatureRequest <Response.Booru, Error.Booru>(null, Error.Booru.NotFound)); } } newTags.Add(tag); } try { res = await booru.GetRandomImage(newTags.ToArray()); } catch (BooruSharp.Search.InvalidTags) { return(new FeatureRequest <Response.Booru, Error.Booru>(null, Error.Booru.NotFound)); } } Error.Booru error = Error.Booru.None; string url = res.fileUrl.AbsoluteUri; Color color = GetColorFromRating(res.rating); string saveId = (tagInfos.Count + 1) + Utilities.GenerateRandomCode(4, r); tagInfos.Add(saveId, new Tuple <Type, BooruSharp.Search.Post.SearchResult>(booru.GetType(), res)); return(new FeatureRequest <Response.Booru, Error.Booru>(new Response.Booru() { url = url, colorRating = color, saveId = saveId, tags = res.tags }, error)); }
public static async Task <FeatureRequest <Response.Booru, Error.Booru> > SearchBooru(bool isChanSafe, string[] tags, ABooru booru, Random r, int remainingTries = 5) { if (isChanSafe && !booru.IsSafe()) { return(new FeatureRequest <Response.Booru, Error.Booru>(null, Error.Booru.ChanNotNSFW)); } BooruSharp.Search.Post.SearchResult res; List <string> newTags = null; try { res = await booru.GetRandomImageAsync(tags); } catch (BooruSharp.Search.InvalidTags) { newTags = new List <string>(); foreach (string s in tags) { string tag = s; var related = await new Konachan().GetTagsAsync(s); if (related.Length == 0) { return(new FeatureRequest <Response.Booru, Error.Booru>(null, Error.Booru.NotFound)); } newTags.Add(tag = related.OrderBy(x => GetStringDistance(x.name, s)).First().name); } try { res = await booru.GetRandomImageAsync(newTags.ToArray()); } catch (BooruSharp.Search.InvalidTags) { return(new FeatureRequest <Response.Booru, Error.Booru>(null, Error.Booru.NotFound)); } } Error.Booru error = Error.Booru.None; if (res.fileUrl == null) { if (remainingTries == 0) { return(new FeatureRequest <Response.Booru, Error.Booru>(null, Error.Booru.NotFound)); } else { return(await SearchBooru(isChanSafe, tags, booru, r, remainingTries - 1)); } } string url = res.fileUrl.AbsoluteUri; Color color = GetColorFromRating(res.rating); string saveId = null; if (!(booru is E621) && !(booru is E926)) { saveId = (tagInfos.Count + 1) + Utilities.GenerateRandomCode(4, r); tagInfos.Add(saveId, new Tuple <Type, BooruSharp.Search.Post.SearchResult>(booru.GetType(), res)); } return(new FeatureRequest <Response.Booru, Error.Booru>(new Response.Booru() { url = url, colorRating = color, saveId = saveId, tags = res.tags, newTags = newTags?.ToArray() }, error)); }