purge cache when TL retrieval fails, fix #79

This commit is contained in:
Nicolas Constant 2021-02-01 20:07:53 -05:00
parent 52e2868deb
commit ec420346b6
No known key found for this signature in database
GPG key ID: 1E9F677FB01A5688
3 changed files with 51 additions and 33 deletions

View file

@ -9,6 +9,7 @@ using BirdsiteLive.Pipeline.Contracts;
using BirdsiteLive.Pipeline.Models; using BirdsiteLive.Pipeline.Models;
using BirdsiteLive.Twitter; using BirdsiteLive.Twitter;
using BirdsiteLive.Twitter.Models; using BirdsiteLive.Twitter.Models;
using Microsoft.Extensions.Logging;
using Tweetinvi.Models; using Tweetinvi.Models;
namespace BirdsiteLive.Pipeline.Processors namespace BirdsiteLive.Pipeline.Processors
@ -16,13 +17,17 @@ namespace BirdsiteLive.Pipeline.Processors
public class RetrieveTweetsProcessor : IRetrieveTweetsProcessor public class RetrieveTweetsProcessor : IRetrieveTweetsProcessor
{ {
private readonly ITwitterTweetsService _twitterTweetsService; private readonly ITwitterTweetsService _twitterTweetsService;
private readonly ITwitterUserService _twitterUserService;
private readonly ITwitterUserDal _twitterUserDal; private readonly ITwitterUserDal _twitterUserDal;
private readonly ILogger<RetrieveTweetsProcessor> _logger;
#region Ctor #region Ctor
public RetrieveTweetsProcessor(ITwitterTweetsService twitterTweetsService, ITwitterUserDal twitterUserDal) public RetrieveTweetsProcessor(ITwitterTweetsService twitterTweetsService, ITwitterUserDal twitterUserDal, ITwitterUserService twitterUserService, ILogger<RetrieveTweetsProcessor> logger)
{ {
_twitterTweetsService = twitterTweetsService; _twitterTweetsService = twitterTweetsService;
_twitterUserDal = twitterUserDal; _twitterUserDal = twitterUserDal;
_twitterUserService = twitterUserService;
_logger = logger;
} }
#endregion #endregion
@ -61,11 +66,25 @@ namespace BirdsiteLive.Pipeline.Processors
private ExtractedTweet[] RetrieveNewTweets(SyncTwitterUser user) private ExtractedTweet[] RetrieveNewTweets(SyncTwitterUser user)
{ {
ExtractedTweet[] tweets; var tweets = new ExtractedTweet[0];
if (user.LastTweetPostedId == -1)
tweets = _twitterTweetsService.GetTimeline(user.Acct, 1); try
else {
tweets = _twitterTweetsService.GetTimeline(user.Acct, 200, user.LastTweetSynchronizedForAllFollowersId); 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; return tweets;
} }

View file

@ -38,5 +38,10 @@ namespace BirdsiteLive.Twitter
return user; return user;
} }
public void PurgeUser(string username)
{
_userCache.Remove(username);
}
} }
} }

View file

@ -61,36 +61,30 @@ namespace BirdsiteLive.Twitter
public ExtractedTweet[] GetTimeline(string username, int nberTweets, long fromTweetId = -1) public ExtractedTweet[] GetTimeline(string username, int nberTweets, long fromTweetId = -1)
{ {
var tweets = new List<ITweet>(); var tweets = new List<ITweet>();
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(); var timeline = Timeline.GetUserTimeline(user.Id, nberTweets);
ExceptionHandler.SwallowWebExceptions = false; _statisticsHandler.CalledTimelineApi();
TweetinviConfig.CurrentThreadSettings.TweetMode = TweetMode.Extended; if (timeline != null) tweets.AddRange(timeline);
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);
}
} }
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(); return tweets.Select(_tweetExtractor.Extract).ToArray();