private ExtractedTweet[] RetrieveNewTweets(SyncTwitterUser user) { var tweets = new ExtractedTweet[0]; // Don't retrieve TL if protected var userView = _twitterUserService.GetUser(user.Acct); if (userView == null || userView.Protected) { return(tweets); } 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}, purging user from cache", user.Acct, user.LastTweetPostedId); _twitterUserService.PurgeUser(user.Acct); } return(tweets); }
public async Task ProcessAsync_Test() { #region Stubs var user = new SyncTwitterUser { Id = 1 }; var tweet1 = new ExtractedTweet { Id = 36 }; var tweet2 = new ExtractedTweet { Id = 37 }; var follower1 = new Follower { FollowingsSyncStatus = new Dictionary <int, long> { { 1, 37 } } }; var usersWithTweets = new UserWithTweetsToSync { Tweets = new [] { tweet1, tweet2 }, Followers = new [] { follower1 }, User = user }; var loggerMock = new Mock <ILogger <SaveProgressionProcessor> >(); #endregion #region Mocks var twitterUserDalMock = new Mock <ITwitterUserDal>(MockBehavior.Strict); twitterUserDalMock .Setup(x => x.UpdateTwitterUserAsync( It.Is <int>(y => y == user.Id), It.Is <long>(y => y == tweet2.Id), It.Is <long>(y => y == tweet2.Id), It.IsAny <DateTime>() )) .Returns(Task.CompletedTask); #endregion var processor = new SaveProgressionProcessor(twitterUserDalMock.Object, loggerMock.Object); await processor.ProcessAsync(usersWithTweets, CancellationToken.None); #region Validations twitterUserDalMock.VerifyAll(); loggerMock.VerifyAll(); #endregion }
public Note GetStatus(string username, ExtractedTweet tweet) { var actorUrl = UrlFactory.GetActorUrl(_instanceSettings.Domain, username); var noteUrl = UrlFactory.GetNoteUrl(_instanceSettings.Domain, username, tweet.Id.ToString()); var to = $"{actorUrl}/followers"; var apPublic = "https://www.w3.org/ns/activitystreams#Public"; var extractedTags = _statusExtractor.Extract(tweet.MessageContent); _statisticsHandler.ExtractedStatus(extractedTags.tags.Count(x => x.type == "Mention")); // Replace RT by a link var content = extractedTags.content; if (content.Contains("{RT}") && tweet.IsRetweet) { if (!string.IsNullOrWhiteSpace(tweet.RetweetUrl)) { content = content.Replace("{RT}", $@"<a href=""{tweet.RetweetUrl}"" rel=""nofollow noopener noreferrer"" target=""_blank"">RT</a>"); } else { content = content.Replace("{RT}", "RT"); } } string inReplyTo = null; if (tweet.InReplyToStatusId != default) { inReplyTo = $"https://{_instanceSettings.Domain}/users/{tweet.InReplyToAccount.ToLowerInvariant()}/statuses/{tweet.InReplyToStatusId}"; } var note = new Note { id = noteUrl, published = tweet.CreatedAt.ToString("s") + "Z", url = noteUrl, attributedTo = actorUrl, inReplyTo = inReplyTo, //to = new [] {to}, //cc = new [] { apPublic }, to = new[] { to }, //cc = new[] { apPublic }, cc = new string[0], sensitive = false, content = $"<p>{content}</p>", attachment = Convert(tweet.Media), tag = extractedTags.tags }; return(note); }
public ExtractedTweet Extract(ITweet tweet) { var extractedTweet = new ExtractedTweet { Id = tweet.Id, InReplyToStatusId = tweet.InReplyToStatusId, InReplyToAccount = tweet.InReplyToScreenName, MessageContent = ExtractMessage(tweet), Media = ExtractMedia(tweet.Media), CreatedAt = tweet.CreatedAt.ToUniversalTime(), IsReply = tweet.InReplyToUserId != null, IsThread = tweet.InReplyToUserId != null && tweet.InReplyToUserId == tweet.CreatedBy.Id, IsRetweet = tweet.IsRetweet || tweet.QuotedStatusId != null, RetweetUrl = ExtractRetweetUrl(tweet) }; return(extractedTweet); }
private bool IsNotAutoRetweet(ExtractedTweet tweet) { return(!tweet.MessageContent.Trim().StartsWith($"[RT {_syncAccount.TwitterName}]")); }