/// <summary> /// calls the twitter api to get timeline results for a user /// </summary> /// <returns></returns> public static List <Status> GetUserTimeline(TimelineParams inputParams) { // check the cache for existing data List <Status> tweets = (List <Status>)CacheHelper.GetFromCache(CacheKey.UserTimeline, BuildParamString(inputParams)); if (tweets == null) { tweets = new List <Status>(); ulong lastTweetId = 0; string searchScreenName; // a valid context TwitterContext context = ContextHelper.GetContext(); // if a screen name has not been provided then get the current users screen name and last tweet id if (string.IsNullOrEmpty(inputParams.ScreenName)) { User authenticatedUser = ContextHelper.GetAuthenticatedUser(); searchScreenName = authenticatedUser.Identifier.ScreenName; if (authenticatedUser.Status != null) { lastTweetId = ulong.Parse(authenticatedUser.Status.StatusID); } } // if a screen name has been provided then get the user and store thier last tweet id else { searchScreenName = inputParams.ScreenName; var users = from u in context.User where u.Type == UserType.Show && u.ScreenName == inputParams.ScreenName select u; User user = users.SingleOrDefault(); lastTweetId = ulong.Parse(user.Status.StatusID); } try { // Here it is necesary to get the tweets in chunks and add the results to the tweets list // as the number of results returned from the api call is effectively up to the count supplied // due to limitations in the twitter REST api //set a max loops value as a backup int maxloops = 5, count = 0; while (tweets.Count < inputParams.TweetCount && count < maxloops) { //increment the count count++; List <Status> chunkList; chunkList = (from tweet in context.Status where tweet.Type == StatusType.User && tweet.ExcludeReplies == !inputParams.ShowReplies && tweet.IncludeRetweets == inputParams.IncludeRetweets && tweet.Count == inputParams.TweetCount && tweet.ScreenName == searchScreenName && tweet.MaxID == lastTweetId orderby tweet.CreatedAt descending select tweet).ToList(); // add the chunk items into the tweet list foreach (Status tweet in chunkList) { if (tweets.Count < inputParams.TweetCount) { tweets.Add(tweet); } } // store the last tweet recieved so we dont get the same ones next loop (-1 to prevent re-retrieving the last tweet) if (tweets.Count > 0) { lastTweetId = ulong.Parse(chunkList[chunkList.Count - 1].StatusID) - 1; } } CacheHelper.AddToCache(tweets, ConfigHelper.GetAppSetting <int>(ConfigKey.TwitterCacheDuration, 20), CacheKey.UserTimeline, BuildParamString(inputParams)); } catch (TwitterQueryException ex) { } } return(tweets); }
/// <summary> /// calls the twitter api to get tweets form a list /// </summary> /// <returns></returns> public static List <Status> GetList(TimelineParams inputParams) { // check the cache for existing data List <Status> tweets = (List <Status>)CacheHelper.GetFromCache(CacheKey.UserTimeline, BuildParamString(inputParams)); if (tweets == null) { tweets = new List <Status>(); string searchScreenName = inputParams.ScreenName; ulong lastTweetId = 0; // a valid context TwitterContext context = ContextHelper.GetContext(); // if a screen name has not been provided then get the current users screen name if (string.IsNullOrEmpty(inputParams.ScreenName)) { User authenticatedUser = ContextHelper.GetAuthenticatedUser(); searchScreenName = authenticatedUser.Identifier.ScreenName; } try { // Here it is necesary to get the tweets in chunks and add the results to the tweets list // as the number of results returned from the api call is effectively up to the count supplied // due to limitations in the twitter REST api //set a max loops value as a backup int maxloops = 5, count = 0; while (tweets.Count < inputParams.TweetCount && count < maxloops) { //increment the count count++; List <Status> chunkList; if (lastTweetId == 0) { chunkList = (from list in context.List where list.Type == ListType.Statuses && list.OwnerScreenName == searchScreenName && list.Slug == inputParams.ListName && // name of list to get statuses for list.Count == inputParams.TweetCount select list) .First().Statuses; } else { chunkList = (from list in context.List where list.Type == ListType.Statuses && list.OwnerScreenName == searchScreenName && list.Slug == inputParams.ListName && // name of list to get statuses for list.Count == inputParams.TweetCount && list.MaxID == lastTweetId select list) .First().Statuses; } // add the chunk items into the tweet list foreach (Status tweet in chunkList) { if (tweets.Count < inputParams.TweetCount && (inputParams.IncludeRetweets || (tweet.RetweetedStatus == null || tweet.RetweetedStatus.User == null))) { tweets.Add(tweet); } } // store the last tweet recieved so we dont get the same ones next loop (-1 to prevent re-retrieving the last tweet) if (tweets.Count > 0) { lastTweetId = ulong.Parse(chunkList[chunkList.Count - 1].StatusID) - 1; } } CacheHelper.AddToCache(tweets, ConfigHelper.GetAppSetting <int>(ConfigKey.TwitterCacheDuration, 20), CacheKey.UserTimeline, BuildParamString(inputParams)); } catch (TwitterQueryException ex) { } } return(tweets); }