Пример #1
0
        private async Task <IEnumerable <RedditPostResultData> > GetSubRedditPosts(RedditQuery query)
        {
            var url = $"/{query.SubReddit}/{query.Sorting}.json?t={query.Interval}&limit={query.Limit}";

            if (_resultCache.TryGetValue(url, out var value))
            {
                if (value.InsertedAt.AddMinutes(CacheExpirationTimeInMinutes) > DateTime.UtcNow)
                {
                    return(value.Data);
                }

                _resultCache.Remove(url);
            }

            var response = await _httpClient.GetAsync(url);

            var responseJson = await response.Content.ReadAsStringAsync();

            var apiResult = JsonConvert.DeserializeObject <RedditApiResult>(responseJson);

            var result = apiResult.Data.Children.Select(r => r.Data).ToList();

            if (!_resultCache.ContainsKey(url))
            {
                _resultCache.Add(url, new CacheValue
                {
                    InsertedAt = DateTime.UtcNow,
                    Data       = result
                });
            }

            return(result);
        }
Пример #2
0
        public async IAsyncEnumerable <AbstractQueryResult> Process(Query query)
        {
            var queryParts = query.RawQuery.Split(' ');

            var subReddit = queryParts[0];

            var    validParts = 1;
            string sorting    = null;
            string interval   = null;
            string limit      = null;

            foreach (var part in queryParts.Skip(1))
            {
                if (!int.TryParse(part, out _) && Enum.TryParse(part, ignoreCase: true, out RedditQuerySorting _))
                {
                    sorting = part;
                    validParts++;
                }

                if (!int.TryParse(part, out _) && Enum.TryParse(part, ignoreCase: true, out RedditQueryInterval _))
                {
                    interval = part;
                    validParts++;
                }

                if (int.TryParse(part, out var val) && val <= 100)
                {
                    limit = part;
                    validParts++;
                }
            }

            yield return(new SubRedditResult(subReddit));

            var redditQuery = RedditQuery.FromStringValues(subReddit, sorting, interval, limit);

            //Matches the scenario where a user is typing one of the parameters, so we don't send requests unnecessarily with invalid parameters.
            if (validParts < queryParts.Length)
            {
                yield break;
            }

            var result = await GetSubRedditPosts(redditQuery);

            foreach (var redditPostResult in result)
            {
                yield return(new RedditResult(redditPostResult));
            }
        }