Exemplo n.º 1
0
        protected override async Task ExecuteAsync(CancellationToken stoppingToken)
        {
            while (!stoppingToken.IsCancellationRequested)
            {
                try
                {
                    var lastTweetIdTask = _twitterLogService.GetLastTweetId();

                    var user = await _twitterClient.Users.GetUserAsync(_twitterBotSettings.BotUsername);

                    long sinceTweetId = await lastTweetIdTask;

                    var tweets = new List <ITweet>();

                    await foreach (var followerId in GetFollowersIds(user))
                    {
                        var getTimeLineParameters = new GetUserTimelineParameters(followerId);

                        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(tweet.Text));

                        var correctionsResult = await _grammarService.GetCorrections(tweetText);

                        if (correctionsResult.HasCorrections)
                        {
                            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 for now
                                messageBuilder.AppendLine($"*{correction.PossibleReplacements.First()} [{correction.Message}]");
                            }

                            var correctionString = messageBuilder.ToString();

                            _logger.LogInformation($"Sending reply to: {tweet.CreatedBy.ScreenName}");
                            var publishTweetParameters = new PublishTweetParameters(correctionString)
                            {
                                InReplyToTweetId = tweet.Id,
                            };
                            var replyTweet = await _twitterClient.Tweets.PublishTweetAsync(publishTweetParameters);

                            if (replyTweet != null)
                            {
                                _logger.LogInformation("Reply sent successfuly");
                                await _twitterLogService.LogReply(tweet.Id, replyTweet.Id);
                            }

                            await Task.Delay(_twitterBotSettings.PublishTweetDelayMilliseconds);
                        }
                    }

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

                        // Save last Tweet Id
                        await _twitterLogService.LogTweet(lastTweet.Id);
                    }
                }
                catch (Exception ex)
                {
                    _logger.LogError(ex, ex.Message);
                }

                await Task.Delay(_twitterBotSettings.HostedServiceIntervalMilliseconds);
            }
        }
Exemplo n.º 2
0
    protected override async Task ExecuteAsync(CancellationToken stoppingToken)
    {
        Logger.LogInformation("TwitterBotMentionHostedService started");

        while (!stoppingToken.IsCancellationRequested)
        {
            try
            {
                long lastTweetId = await _twitterMentionLogService.GetLastTweetId();

                var getMentionParameters = new GetMentionsTimelineParameters();

                if (lastTweetId == 0)
                {
                    getMentionParameters.PageSize = TwitterBotSettings.TimelineFirstLoadPageSize;
                }
                else
                {
                    getMentionParameters.SinceId = lastTweetId;
                }

                var mentions = await TwitterClient.Timelines.GetMentionsTimelineAsync(getMentionParameters);

                var myUser = await TwitterClient.Users.GetUserAsync(TwitterBotSettings.BotUsername);

                foreach (var mention in mentions.Where(x => x.Text.Contains($"@{TwitterBotSettings.BotUsername}") && (x.InReplyToStatusId.HasValue || x.QuotedStatusId.HasValue)))
                {
                    // Avoid correcting replies to my own tweets
                    if (mention.InReplyToUserId == myUser.Id)
                    {
                        continue;
                    }

                    var tweet = await GetTweetFromMention(mention);

                    if (tweet == null)
                    {
                        continue;
                    }

                    var tweetText = StringUtils.RemoveHashtags(StringUtils.RemoveMentions(StringUtils.RemoveEmojis(tweet.Text)));

                    var correctionsResult = await _grammarService.GetCorrections(tweetText);

                    if (!correctionsResult.HasCorrections)
                    {
                        await PublishReplyTweet($"@{mention.CreatedBy.ScreenName} I don't see anything wrong here.", mention.Id);

                        continue;
                    }

                    var messageBuilder = new StringBuilder();

                    messageBuilder.Append($"@{mention.CreatedBy.ScreenName}");

                    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: {mention.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 : $"@{mention.CreatedBy.ScreenName} {reply}";

                            await PublishReplyTweet(correctionStringSplitted, mention.Id);

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

                        continue;
                    }

                    await PublishReplyTweet(correctionString, mention.Id);

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

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

                    // Save last Tweet Id
                    await _twitterMentionLogService.LogTweet(lastTweet.Id, default);
                }

                var followersTask = TwitterClient.Users.GetFollowersAsync(TwitterBotSettings.BotUsername);
                var friendIdsTask = TwitterClient.Users.GetFriendIdsAsync(TwitterBotSettings.BotUsername);

                await FollowBackUsers(await followersTask, await friendIdsTask);
                await PublishScheduledTweets();
                await LikeRepliesToBot(mentions);
            }
            // TODO: Move all this to some "CatchExceptionService"
            catch (TwitterException ex) when(ex.TwitterDescription.Contains("Try again later") || ex.TwitterDescription.Contains("Timeout limit"))
            {
                Logger.LogWarning(ex, ex.TwitterDescription);
            }
            catch (SqlException ex) when(ex.Message.Contains("SHUTDOWN"))
            {
                Logger.LogWarning(ex, "Sql Server shutdown in progress");
            }
            catch (Exception ex)
            {
                var message = ex is TwitterException tEx ? tEx.TwitterDescription : ex.Message;

                var innerExceptions = ex.GetInnerExceptions();

                if (innerExceptions.Any(x => x.GetType() == typeof(SocketException) && x.Message.Contains("Connection reset by peer")))
                {
                    // The server has reset the connection.
                    Logger.LogWarning(ex, "Socket reseted.");
                }
                else
                {
                    Logger.LogError(ex, message);

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

            await Task.Delay(TwitterBotSettings.HostedServiceIntervalMilliseconds);
        }
    }
        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);
            }
        }