示例#1
0
        public async Task LogTweet_NoTweetExistInRepository_Should_AddTweet()
        {
            // Arrange
            var repositoryMock = new Mock <IRepository <TwitterLog> >();

            // Returns false when Any is called
            repositoryMock.Setup(v => v.Any(It.IsAny <Expression <Func <TwitterLog, bool> > >()))
            .ReturnsAsync(false);

            var service = new TwitterLogService(repositoryMock.Object);

            // Act
            await service.LogTweet(123456);

            // Assert
            repositoryMock.Verify(v => v.Add(It.IsAny <TwitterLog>()), Times.Once);
        }
示例#2
0
        public async Task GetLastTweetId_RepositoryEmpty_Should_ReturnsZero()
        {
            // Arrange
            var repositoryMock = new Mock <IRepository <TwitterLog> >();

            // Returns false when Any is called
            repositoryMock.Setup(v => v.Any(It.IsAny <Expression <Func <TwitterLog, bool> > >()))
            .ReturnsAsync(false);

            var service = new TwitterLogService(repositoryMock.Object);

            // Act
            var result = await service.GetLastTweetId();

            // Assert
            Assert.Equal(0, result);
        }
示例#3
0
        public async Task GetLastTweetId_RepositoryNotEmpty_Should_ReturnsMaxTweetId()
        {
            // Arrange
            var repositoryMock = new Mock <IRepository <TwitterLog> >();

            const long maxTweetId = 123456;

            // Returns true when Any is called
            repositoryMock.Setup(v => v.Any(It.IsAny <Expression <Func <TwitterLog, bool> > >()))
            .ReturnsAsync(true);

            // Returns maxTweetId value when Max is called
            repositoryMock.Setup(v => v.Max(It.IsAny <Expression <Func <TwitterLog, long> > >()))
            .ReturnsAsync(maxTweetId);

            var service = new TwitterLogService(repositoryMock.Object);

            // Act
            var result = await service.GetLastTweetId();

            // Assert
            Assert.Equal(maxTweetId, result);
        }
        protected override async Task ExecuteAsync(CancellationToken stoppingToken)
        {
            while (!stoppingToken.IsCancellationRequested)
            {
                try
                {
                    var lastTweetIdTask = TwitterLogService.GetLastTweetId();

                    var followers = await TwitterClient.Users.GetFollowersAsync(TwitterBotSettings.BotUsername);

                    var friendIds = await TwitterClient.Users.GetFriendIdsAsync(TwitterBotSettings.BotUsername);

                    long sinceTweetId = await lastTweetIdTask;

                    var tweets = new List <ITweet>();

                    foreach (var follower in followers)
                    {
                        if (follower.Protected && !friendIds.Contains(follower.Id))
                        {
                            continue;
                        }

                        var getTimeLineParameters = new GetUserTimelineParameters(follower);

                        if (sinceTweetId == 0)
                        {
                            getTimeLineParameters.PageSize = TwitterBotSettings.TimelineFirstLoadPageSize;
                        }
                        else
                        {
                            getTimeLineParameters.SinceId = sinceTweetId;
                        }

                        var timeLine = await TwitterClient.Timelines.GetUserTimelineAsync(getTimeLineParameters);

                        if (timeLine.Length == 0)
                        {
                            continue;
                        }

                        // Avoid Retweets.
                        tweets.AddRange(timeLine.Where(v => !v.Text.StartsWith("RT")));
                    }

                    foreach (var tweet in tweets)
                    {
                        var tweetText = StringUtils.RemoveHashtags(StringUtils.RemoveMentions(StringUtils.RemoveEmojis(tweet.Text)));

                        var correctionsResult = await _grammarService.GetCorrections(tweetText);

                        if (!correctionsResult.HasCorrections)
                        {
                            continue;
                        }

                        var messageBuilder = new StringBuilder();

                        var mentionedUsers = tweet.UserMentions.Select(v => v.ToString()).Join(" "); // Other users mentioned in the tweet
                        messageBuilder.Append($"@{tweet.CreatedBy.ScreenName} {mentionedUsers} ");

                        foreach (var correction in correctionsResult.Corrections)
                        {
                            // Only suggest the first possible replacement
                            messageBuilder.AppendLine($"*{correction.PossibleReplacements.First()} [{correction.Message}]");
                        }

                        var correctionString = messageBuilder.ToString();

                        Logger.LogInformation($"Sending reply to: {tweet.CreatedBy.ScreenName}");

                        if (correctionString.Length >= Defaults.TwitterTextMaxLength)
                        {
                            var replyTweets = correctionString.SplitInParts(Defaults.TwitterTextMaxLength);

                            foreach (var(reply, index) in replyTweets.WithIndex())
                            {
                                var correctionStringSplitted = index == 0 ? reply : $"@{tweet.CreatedBy.ScreenName} {mentionedUsers} {reply}";

                                await PublishReplyTweet(correctionStringSplitted, tweet.Id);

                                await Task.Delay(TwitterBotSettings.PublishTweetDelayMilliseconds, stoppingToken);
                            }

                            continue;
                        }

                        await PublishReplyTweet(correctionString, tweet.Id);

                        await Task.Delay(TwitterBotSettings.PublishTweetDelayMilliseconds, stoppingToken);
                    }

                    if (tweets.Any())
                    {
                        var lastTweet = tweets.OrderByDescending(v => v.Id).First();

                        // Save last Tweet Id
                        await TwitterLogService.LogTweet(lastTweet.Id);
                    }

                    await FollowBackUsers(followers, friendIds);
                    await PublishScheduledTweets();
                    await LikeRepliesToBot(tweets);
                }
                catch (Exception ex)
                {
                    var message = ex is TwitterException tEx ? tEx.TwitterDescription : ex.Message;

                    Logger.LogError(ex, message);

                    // fire and forget
                    _ = _githubService.CreateBugIssue($"Application Exception: {message}", ex, GithubIssueLabels.Twitter);
                }

                await Task.Delay(TwitterBotSettings.HostedServiceIntervalMilliseconds);
            }
        }