public async Task StartTweetStreamAsync()
 {
     if (_filteredStream.StreamState != StreamState.Running)
     {
         _logger.LogInformation("Starting tweet stream.");
         await _filteredStream.StartMatchingAnyConditionAsync();
     }
 }
Пример #2
0
 public async Task MonitorTweetsAsync()
 {
     _twitterStream = _twitterClient.Streams.CreateFilteredStream();
     SetStreamTrackers();
     _twitterStream.MatchingTweetReceived += C_ProcessTweet;
     try
     {
         await _twitterStream.StartMatchingAnyConditionAsync();
     }
     catch
     {
         Thread.Sleep(5000);
         await MonitorTweetsAsync();
     }
 }
Пример #3
0
        private async void CheckTimeToUpdateTickers()
        {
            if (DateTime.Now.Hour - _lastUpdateTime.Hour > 1)
            {
                _twitterStream.Stop();
                await LoadTickersAsync();

                _twitterStream = _twitterClient.Streams.CreateFilteredStream();
                SetStreamTrackers();
                try
                {
                    await _twitterStream.StartMatchingAnyConditionAsync();
                }
                catch
                {
                    await MonitorTweetsAsync();
                }
            }
        }
Пример #4
0
        private void TweetThread()
        {
            _backtraceClient?.Send($"{_breadcrumbName} started");

            _log.Info("Tweet thread started!");

            FilteredStream               = _twitterClient.Streams.CreateFilteredStream();
            FilteredStream.FilterLevel   = StreamFilterLevel.None;
            FilteredStream.StallWarnings = true;

            foreach (var stream in _config.Streams)
            {
                FilteredStream.AddFollow(stream.TwitterUserId);
                _log.Info($"Added {stream.TwitterUserId} to tracking");
            }

            _backtraceClient?.Send("Added configured IDs to stream");

            FilteredStream.MatchingTweetReceived += (sender, args) =>
            {
                ITweet tweet = args.Tweet;
                _log.Info($"Found tweet from {tweet.CreatedBy.ScreenName}");

                TwitterStreamConfigModel.Stream stream =
                    _config.Streams.Find(s => s.TwitterUserId == tweet.CreatedBy.Id);

                if (stream == null)
                {
                    return;
                }
                Dictionary <string, string> data =
                    new Dictionary <string, string>
                {
                    { "Twitter ID", tweet.CreatedBy.IdStr },
                    { "Tweet ID", tweet.IdStr },
                    { "Tweet Body", tweet.FullText },
                    { "Destination channels", string.Join(", ", stream.Channels) }
                };

                _backtraceClient?.Send($"Found matching Tweet, from {tweet.CreatedBy.Name}");

                if (stream.IgnoreRetweets && tweet.IsRetweet)
                {
                    _log.Info(
                        $"Ignoring tweet {tweet.IdStr} as IgnoreRetweets is {stream.IgnoreRetweets} and IsRetweet is {tweet.IsRetweet}");
                    return;
                }

                if (stream.IgnoreReplies && tweet.InReplyToUserId != null)
                {
                    _log.Info(
                        $"Ignoring tweet {tweet.IdStr} as IgnoreReplies is {stream.IgnoreReplies} and InReplyToUserId is not null (it is {tweet.InReplyToUserId})");
                    return;
                }

                if (tweet.IsRetweet)
                {
                    if (stream.RetweetsToIgnoreByUserId.Contains(tweet.RetweetedTweet.CreatedBy.Id))
                    {
                        _log.Info($"Ignoring tweet {tweet.IdStr} as author has been ignored");
                        return;
                    }
                }

                foreach (string channel in stream.Channels)
                {
                    if (!_ircClient.JoinedChannels.Contains(channel))
                    {
                        continue;
                    }

                    _log.Info($"Sending tweet from {tweet.CreatedBy.Name} to {channel}");
                    if (_ircClient.IsConnected)
                    {
                        if (tweet.IsRetweet)
                        {
                            if (tweet.CreatedBy.Name == tweet.CreatedBy.ScreenName)
                            {
                                _ircClient.SendMessage(SendType.Message, channel,
                                                       $"{IrcConstants.IrcBold}@{tweet.CreatedBy.ScreenName}:{IrcConstants.IrcNormal} RT @{tweet.RetweetedTweet.CreatedBy.ScreenName} {WebUtility.HtmlDecode(tweet.RetweetedTweet.FullText.ReplaceNonPrintableCharacters(' ').ReplaceNewlines("⏎"))} - {tweet.Url}");
                                return;
                            }
                            _ircClient.SendMessage(SendType.Message, channel,
                                                   $"{IrcConstants.IrcBold}{tweet.CreatedBy.Name} (@{tweet.CreatedBy.ScreenName}):{IrcConstants.IrcNormal} RT @{tweet.RetweetedTweet.CreatedBy.ScreenName} {WebUtility.HtmlDecode(tweet.RetweetedTweet.FullText.ReplaceNonPrintableCharacters(' ').ReplaceNewlines("⏎"))} - {tweet.Url}");
                            return;
                        }

                        if (tweet.CreatedBy.Name == tweet.CreatedBy.ScreenName)
                        {
                            _ircClient.SendMessage(SendType.Message, channel,
                                                   $"{IrcConstants.IrcBold}@{tweet.CreatedBy.ScreenName}:{IrcConstants.IrcNormal} {WebUtility.HtmlDecode(tweet.FullText.ReplaceNonPrintableCharacters(' ').ReplaceNewlines("⏎"))} - {tweet.Url}");
                            return;
                        }
                        _ircClient.SendMessage(SendType.Message, channel,
                                               $"{IrcConstants.IrcBold}{tweet.CreatedBy.Name} (@{tweet.CreatedBy.ScreenName}):{IrcConstants.IrcNormal} {WebUtility.HtmlDecode(tweet.FullText.ReplaceNonPrintableCharacters(' ').ReplaceNewlines("⏎"))} - {tweet.Url}");
                        return;
                    }
                    _log.Error("Tried to send message to channel but IRC bot is not connected");
                }
            };

            FilteredStream.StreamStopped += (sender, args) =>
            {
                _log.Error("Twitter stream disconnected with following reason");
                _log.Error(args.DisconnectMessage?.Reason);
                _backtraceClient?.Send(args.Exception);
                if (args.DisconnectMessage != null) // If socket closed for "reasons" this will be null
                {
                    _log.Error(
                        $"Twitter disconnect message was: ({args.DisconnectMessage.Code}) {args.DisconnectMessage.Reason}");
                }
            };

            FilteredStream.WarningFallingBehindDetected += (sender, args) =>
            {
                _log.Info($"Twitter stream is falling behind. Warning from Twitter: {args.WarningMessage.Message}");
                _log.Info($"Twitter queue is {args.WarningMessage.PercentFull}% full");
                _backtraceClient?.Send($"Twitter stream falling behind, queue {args.WarningMessage.PercentFull}% full");
            };

            while (true)
            {
                try
                {
                    FilteredStream.StartMatchingAnyConditionAsync().Wait();
                    Thread.Sleep(5000);
                }
                catch (Exception e)
                {
                    _log.Error(e);
                }
            }
        }