Пример #1
0
        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));
        }
Пример #2
0
        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));
        }