private async Task GetUpdatedLimits(string token, string tokenSecret) { RateLimitCache.Get[TwitterAPIEndpoint.RateLimitStatus].ResetIfNeeded(); UserRateLimitInfo userInfo = GetCurrentUserInfo(rateLimitDb, TwitterAPIEndpoint.RateLimitStatus, userManager, User); string appResponseBody = await TwitterAPIUtils.GetResponse( configuration, AuthenticationType.Application, TwitterAPIEndpoint.RateLimitStatus, TwitterAPIUtils.RateLimitStatusQuery(RateLimitResources), null, null, null); string userResponseBody = (token == null || tokenSecret == null) ? null : await TwitterAPIUtils.GetResponse( configuration, AuthenticationType.User, TwitterAPIEndpoint.RateLimitStatus, TwitterAPIUtils.RateLimitStatusQuery(RateLimitResources), token, tokenSecret, userInfo); var appResults = (appResponseBody != null) ? RateLimitResults.FromJson(appResponseBody) : null; var userResults = (userResponseBody != null) ? RateLimitResults.FromJson(userResponseBody) : null; UpdateEndpointLimits(appResults, userResults); }
/// <summary> /// Get rate limits for the current user. /// </summary> /// <param name="rateLimitDb"></param> /// <param name="endpoint"></param> /// <param name="userManager"></param> /// <param name="user"></param> /// <returns></returns> internal static UserRateLimitInfo GetCurrentUserInfo(RateLimitDbContext rateLimitDb, TwitterAPIEndpoint endpoint, UserManager <ApplicationUser> userManager, ClaimsPrincipal user) { if (!user.Identity.IsAuthenticated || user.GetTwitterAccessToken() == null) { return(null); } var info = rateLimitDb.Find(typeof(UserRateLimitInfo), new object[] { userManager.GetUserId(user), endpoint }) as UserRateLimitInfo; if (info == null) { info = new UserRateLimitInfo() { UserID = userManager.GetUserId(user), Type = endpoint }; rateLimitDb.Add(info); rateLimitDb.SaveChanges(); } else { info.ResetIfNeeded(); rateLimitDb.Update(info); rateLimitDb.SaveChanges(); } return(info); }
private void UpdateEndpointLimits(RateLimitResults appResults, RateLimitResults userResults) { foreach (var endpoint in Enum.GetValues(typeof(TwitterAPIEndpoint)).Cast <TwitterAPIEndpoint>()) { string key = ""; switch (endpoint) { case TwitterAPIEndpoint.RateLimitStatus: continue; case TwitterAPIEndpoint.SearchTweets: key = "/search/tweets"; break; case TwitterAPIEndpoint.UsersShow: key = "/users/show/:id"; break; case TwitterAPIEndpoint.UsersLookup: key = "/users/lookup"; break; case TwitterAPIEndpoint.OAuthAuthorize: key = "/oauth/authorize"; break; case TwitterAPIEndpoint.FriendsIDs: key = "/friends/following/ids"; break; case TwitterAPIEndpoint.FollowersIDs: key = "/followers/ids"; break; default: throw new Exception("Unimplemented TwitterAPIEndpoint"); } RateLimitCache.Get[endpoint].Update(ParseLimit(appResults, key)); var userInfo = GetCurrentUserInfo(rateLimitDb, endpoint, userManager, User); if (userInfo != null) { userInfo.Update(ParseLimit(userResults, key)); rateLimitDb.Update(userInfo); rateLimitDb.SaveChanges(); } else { var user = new UserRateLimitInfo() { Type = endpoint }; user.Update(ParseLimit(userResults, key)); rateLimitDb.Add(user); rateLimitDb.SaveChanges(); } } }
private async Task <T> GetResults <T>(string query, AuthenticationType authType, Func <string, TwitterAPIEndpoint, string> buildQueryString, TwitterAPIEndpoint endpoint) where T : IQueryResults { UserRateLimitInfo userInfo = RateLimitController.GetCurrentUserInfo(rateLimitDb, endpoint, userManager, User); string responseBody = await TwitterAPIUtils.GetResponse( Configuration, authType, endpoint, buildQueryString(query, endpoint), User.GetTwitterAccessToken(), User.GetTwitterAccessTokenSecret(), userInfo); if (userInfo != null) { userInfo.ResetIfNeeded(); rateLimitDb.Update(userInfo); rateLimitDb.SaveChanges(); } if (responseBody == null) { return(default);