From ec420346b6335d982b33810f71d30b444b582ce2 Mon Sep 17 00:00:00 2001 From: Nicolas Constant Date: Mon, 1 Feb 2021 20:07:53 -0500 Subject: [PATCH] purge cache when TL retrieval fails, fix #79 --- .../Processors/RetrieveTweetsProcessor.cs | 31 +++++++++--- .../CachedTwitterService.cs | 5 ++ .../TwitterTweetsService.cs | 48 ++++++++----------- 3 files changed, 51 insertions(+), 33 deletions(-) diff --git a/src/BirdsiteLive.Pipeline/Processors/RetrieveTweetsProcessor.cs b/src/BirdsiteLive.Pipeline/Processors/RetrieveTweetsProcessor.cs index c381dcf..c0976c5 100644 --- a/src/BirdsiteLive.Pipeline/Processors/RetrieveTweetsProcessor.cs +++ b/src/BirdsiteLive.Pipeline/Processors/RetrieveTweetsProcessor.cs @@ -9,6 +9,7 @@ using BirdsiteLive.Pipeline.Contracts; using BirdsiteLive.Pipeline.Models; using BirdsiteLive.Twitter; using BirdsiteLive.Twitter.Models; +using Microsoft.Extensions.Logging; using Tweetinvi.Models; namespace BirdsiteLive.Pipeline.Processors @@ -16,13 +17,17 @@ namespace BirdsiteLive.Pipeline.Processors public class RetrieveTweetsProcessor : IRetrieveTweetsProcessor { private readonly ITwitterTweetsService _twitterTweetsService; + private readonly ITwitterUserService _twitterUserService; private readonly ITwitterUserDal _twitterUserDal; + private readonly ILogger _logger; #region Ctor - public RetrieveTweetsProcessor(ITwitterTweetsService twitterTweetsService, ITwitterUserDal twitterUserDal) + public RetrieveTweetsProcessor(ITwitterTweetsService twitterTweetsService, ITwitterUserDal twitterUserDal, ITwitterUserService twitterUserService, ILogger logger) { _twitterTweetsService = twitterTweetsService; _twitterUserDal = twitterUserDal; + _twitterUserService = twitterUserService; + _logger = logger; } #endregion @@ -61,11 +66,25 @@ namespace BirdsiteLive.Pipeline.Processors private ExtractedTweet[] RetrieveNewTweets(SyncTwitterUser user) { - ExtractedTweet[] tweets; - if (user.LastTweetPostedId == -1) - tweets = _twitterTweetsService.GetTimeline(user.Acct, 1); - else - tweets = _twitterTweetsService.GetTimeline(user.Acct, 200, user.LastTweetSynchronizedForAllFollowersId); + var tweets = new ExtractedTweet[0]; + + try + { + if (user.LastTweetPostedId == -1) + tweets = _twitterTweetsService.GetTimeline(user.Acct, 1); + else + tweets = _twitterTweetsService.GetTimeline(user.Acct, 200, user.LastTweetSynchronizedForAllFollowersId); + } + catch (Exception e) + { + _logger.LogError(e, "Error retrieving TL of {Username} from {LastTweetPostedId}", user.Acct, user.LastTweetPostedId); + + if (_twitterUserService is CachedTwitterUserService service) + { + _logger.LogInformation("Purge {Username} from cache", user.Acct); + service.PurgeUser(user.Acct); + } + } return tweets; } diff --git a/src/BirdsiteLive.Twitter/CachedTwitterService.cs b/src/BirdsiteLive.Twitter/CachedTwitterService.cs index 2f0be46..d8ca1fb 100644 --- a/src/BirdsiteLive.Twitter/CachedTwitterService.cs +++ b/src/BirdsiteLive.Twitter/CachedTwitterService.cs @@ -38,5 +38,10 @@ namespace BirdsiteLive.Twitter return user; } + + public void PurgeUser(string username) + { + _userCache.Remove(username); + } } } \ No newline at end of file diff --git a/src/BirdsiteLive.Twitter/TwitterTweetsService.cs b/src/BirdsiteLive.Twitter/TwitterTweetsService.cs index 49684e8..41b2d60 100644 --- a/src/BirdsiteLive.Twitter/TwitterTweetsService.cs +++ b/src/BirdsiteLive.Twitter/TwitterTweetsService.cs @@ -61,36 +61,30 @@ namespace BirdsiteLive.Twitter public ExtractedTweet[] GetTimeline(string username, int nberTweets, long fromTweetId = -1) { var tweets = new List(); - try + + _twitterAuthenticationInitializer.EnsureAuthenticationIsInitialized(); + ExceptionHandler.SwallowWebExceptions = false; + TweetinviConfig.CurrentThreadSettings.TweetMode = TweetMode.Extended; + + var user = _twitterUserService.GetUser(username); + if (user == null || user.Protected) return new ExtractedTweet[0]; + + if (fromTweetId == -1) { - _twitterAuthenticationInitializer.EnsureAuthenticationIsInitialized(); - ExceptionHandler.SwallowWebExceptions = false; - TweetinviConfig.CurrentThreadSettings.TweetMode = TweetMode.Extended; - - var user = _twitterUserService.GetUser(username); - if (user == null || user.Protected) return new ExtractedTweet[0]; - - if (fromTweetId == -1) - { - var timeline = Timeline.GetUserTimeline(user.Id, nberTweets); - _statisticsHandler.CalledTimelineApi(); - if (timeline != null) tweets.AddRange(timeline); - } - else - { - var timelineRequestParameters = new UserTimelineParameters - { - SinceId = fromTweetId, - MaximumNumberOfTweetsToRetrieve = nberTweets - }; - var timeline = Timeline.GetUserTimeline(user.Id, timelineRequestParameters); - _statisticsHandler.CalledTimelineApi(); - if (timeline != null) tweets.AddRange(timeline); - } + var timeline = Timeline.GetUserTimeline(user.Id, nberTweets); + _statisticsHandler.CalledTimelineApi(); + if (timeline != null) tweets.AddRange(timeline); } - catch (Exception e) + else { - _logger.LogError(e, "Error retrieving timeline from {Username}, from {TweetId}", username, fromTweetId); + var timelineRequestParameters = new UserTimelineParameters + { + SinceId = fromTweetId, + MaximumNumberOfTweetsToRetrieve = nberTweets + }; + var timeline = Timeline.GetUserTimeline(user.Id, timelineRequestParameters); + _statisticsHandler.CalledTimelineApi(); + if (timeline != null) tweets.AddRange(timeline); } return tweets.Select(_tweetExtractor.Extract).ToArray();