public async Task StartTweetStreamAsync() { if (_filteredStream.StreamState != StreamState.Running) { _logger.LogInformation("Starting tweet stream."); await _filteredStream.StartMatchingAnyConditionAsync(); } }
public async Task MonitorTweetsAsync() { _twitterStream = _twitterClient.Streams.CreateFilteredStream(); SetStreamTrackers(); _twitterStream.MatchingTweetReceived += C_ProcessTweet; try { await _twitterStream.StartMatchingAnyConditionAsync(); } catch { Thread.Sleep(5000); await MonitorTweetsAsync(); } }
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(); } } }
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); } } }