예제 #1
0
        public async Task <ITwitterResponse> ExecuteQueryAsync(ITwitterRequest request)
        {
            var rateLimitUpdater = _rateLimitUpdaterFactory.Create(_rateLimitCacheManager);

            await PrepareTwitterRequestAsync(request).ConfigureAwait(false);

            var beforeQueryExecuteEventArgs = new BeforeExecutingRequestEventArgs(request.Query);

            request.ExecutionContext.Events.RaiseBeforeWaitingForQueryRateLimits(beforeQueryExecuteEventArgs);

            if (beforeQueryExecuteEventArgs.Cancel)
            {
                throw new OperationCanceledException("Operation was cancelled intentionally.");
            }

            await WaitBeforeExecutingQueryAsync(request).ConfigureAwait(false);

            request.ExecutionContext.Events.RaiseBeforeExecutingQuery(beforeQueryExecuteEventArgs);

            try
            {
                ITwitterResponse twitterResponse;

                if (!(request.Query is IMultipartTwitterQuery))
                {
                    twitterResponse = await _webRequestExecutor.ExecuteQueryAsync(request, request.TwitterClientHandler).ConfigureAwait(false);
                }
                else
                {
                    twitterResponse = await _webRequestExecutor.ExecuteMultipartQueryAsync(request).ConfigureAwait(false);
                }

                QueryCompleted(request, twitterResponse, rateLimitUpdater);

                return(twitterResponse);
            }
            catch (TwitterException ex)
            {
                HandleException(request, ex, rateLimitUpdater);

                throw;
            }
        }
예제 #2
0
        private HttpClient GetHttpClient(ITwitterRequest request)
        {
            if (request.Query == null)
            {
                SetStreamState(StreamState.Stop, null);
                return(null);
            }

            request.Query.Timeout = Timeout.InfiniteTimeSpan;

            var queryBeforeExecuteEventArgs = new BeforeExecutingRequestEventArgs(request.Query);

            _tweetinviEvents.RaiseBeforeWaitingForQueryRateLimits(queryBeforeExecuteEventArgs);

            if (queryBeforeExecuteEventArgs.Cancel)
            {
                SetStreamState(StreamState.Stop, null);
                return(null);
            }

            return(_httpClientWebHelper.GetHttpClient(request.Query));
        }
예제 #3
0
        private async Task WaitBeforeExecutingQueryAsync(ITwitterRequest request)
        {
            var twitterQuery = request.Query;

            if (twitterQuery.DateWhenCredentialsWillHaveTheRequiredRateLimits == null)
            {
                return;
            }

            if (request.ExecutionContext.RateLimitTrackerMode == RateLimitTrackerMode.TrackAndAwait)
            {
                var beforeQueryExecuteEventArgs = new BeforeExecutingRequestEventArgs(request.Query);
                request.ExecutionContext.Events.RaiseBeforeWaitingForQueryRateLimits(beforeQueryExecuteEventArgs);

                if (beforeQueryExecuteEventArgs.Cancel)
                {
                    throw new OperationCanceledException("Operation was cancelled intentionally.");
                }

                await _rateLimitAwaiter.WaitForCredentialsRateLimitAsync(request).ConfigureAwait(false);
            }
        }
예제 #4
0
 protected void RaiseBeforeExecutingQuery(object sender, BeforeExecutingRequestEventArgs beforeExecutingRequestExecutedEventArgs)
 {
     BeforeExecutingRequest?.Invoke(sender, beforeExecutingRequestExecutedEventArgs);
 }
예제 #5
0
 public void RaiseBeforeWaitingForQueryRateLimits(BeforeExecutingRequestEventArgs beforeExecutingRequestAfterExecuteEventArgs)
 {
     this.Raise(BeforeWaitingForRequestRateLimits, beforeExecutingRequestAfterExecuteEventArgs);
 }
예제 #6
0
 protected void RaiseBeforeWaitingForQueryRateLimits(object sender, BeforeExecutingRequestEventArgs beforeExecutingRequestAfterExecuteEventArgs)
 {
     BeforeWaitingForRequestRateLimits?.Invoke(sender, beforeExecutingRequestAfterExecuteEventArgs);
 }
예제 #7
0
 public void RaiseBeforeExecutingQuery(BeforeExecutingRequestEventArgs beforeExecutingRequestExecutedEventArgs)
 {
     this.Raise(BeforeExecutingRequest, beforeExecutingRequestExecutedEventArgs);
 }
예제 #8
0
 private void TweetinviEventsOnBeforeWaitingForRequestRateLimits(object sender, BeforeExecutingRequestEventArgs args)
 {
     _logger.WriteLine($"{args.TwitterQuery.HttpMethod.ToString()}  {args.Url}");
 }