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);
        }
示例#2
0
        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
        }
示例#3
0
        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}]"));
 }