Exemplo n.º 1
0
        async Task <bool> CheckApiAvailableAsync()
        {
            var apiInfo   = GitHubClient.GetLastApiInfo();
            var rateLimit = apiInfo?.RateLimit;

            if (rateLimit == null)
            {
                var serverApiInfo = await GitHubClient.Miscellaneous.GetRateLimits();

                rateLimit = serverApiInfo.Resources.Core;
            }

            if (rateLimit == null || rateLimit.Remaining > 2)
            {
                return(true);
            }

            if ((rateLimit.Reset > DateTime.UtcNow) && (rateLimit.Reset - DateTime.UtcNow < new TimeSpan(0, 2, 0)))
            {
                Logger.LogInformation($"Waiting for Rate Limit reset {rateLimit.Reset.ToLocalTime()}");
                Thread.Sleep((int)(rateLimit.Reset - DateTime.UtcNow).Ticks + 1000);
                return(true);
            }

            Logger.LogInformation("Rate Limit reset at {reset}", rateLimit.Reset.LocalDateTime);
            return(false);
        }
Exemplo n.º 2
0
        private static async Task <DateTimeOffset?> GetWorkingStartTime(IssueData issue, HashSet <string> workingLabels, IGitHubClient gitHubClient)
        {
            // No GraphQL API for this :(
            var workingLabelsOnThisIssue =
                issue.Labels
                .Where(label => workingLabels.Contains(label.Name, StringComparer.OrdinalIgnoreCase))
                .Select(label => label.Name);

            if (!workingLabelsOnThisIssue.Any())
            {
                // Item isn't in any Working state, so ignore it
                return(null);
            }

            // Find all "labeled" events for this issue
            var issueEvents = await gitHubClient.Issue.Events.GetAllForIssue(issue.Repository.Owner.Login, issue.Repository.Name, issue.Number);

            var lastApiInfo = gitHubClient.GetLastApiInfo();

            foreach (var workingLabelOnThisIssue in workingLabelsOnThisIssue)
            {
                var labelEvent = issueEvents.LastOrDefault(
                    issueEvent =>
                    issueEvent.Event == EventInfoState.Labeled &&
                    string.Equals(issueEvent.Label.Name, workingLabelOnThisIssue, StringComparison.OrdinalIgnoreCase));

                if (labelEvent != null)
                {
                    // If an event where this label was applied was found, return the date on which it was applied
                    return(labelEvent.CreatedAt);
                }
            }

            return(null);
        }
Exemplo n.º 3
0
        private async Task AwaitRateLimit()
        {
            var rateLimit = _gitHubClient.GetLastApiInfo()?.RateLimit;

            _logger.LogDebug($"Remaining requests: {rateLimit?.Remaining.ToString() ?? "unknown"}");
            if (rateLimit == null || rateLimit.Remaining > 0)
            {
                return;
            }
            var dtOffset = rateLimit.Reset.Subtract(DateTimeOffset.Now).Add(TimeSpan.FromSeconds(1));

            if (dtOffset > TimeSpan.Zero)
            {
                _logger.LogInformation($"Sleeping for {dtOffset} until rate limit resets");
                await Task.Delay(dtOffset);
            }
        }
Exemplo n.º 4
0
        public int?GetRemainingRequestCount()
        {
            var apiInfo = _client.GetLastApiInfo();

            return(apiInfo?.RateLimit.Remaining);
        }