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); }
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); }
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); } }
public int?GetRemainingRequestCount() { var apiInfo = _client.GetLastApiInfo(); return(apiInfo?.RateLimit.Remaining); }