private void AddFiltersStream(TwitterFilterOptions filteredOptions)
        {
            var user = User.GetUserFromScreenName(filteredOptions.FollowUserName);

            _stream.AddFollow(user);
            _stream.AddTrack(filteredOptions.Track);
        }
Ejemplo n.º 2
0
        private void CheckTwitterFollows()
        {
            if (_twitterStream == null)
            {
                return;
            }

            foreach (var user in _config.TwitterUpdates.TwitterUsers)
            {
                var userId = Convert.ToInt64(user);
                if (_twitterStream.ContainsFollow(userId))
                {
                    continue;
                }

#pragma warning disable RECS0165
                _twitterStream.AddFollow(userId, async x =>
#pragma warning restore RECS0165
                {
                    if (userId != x.CreatedBy.Id)
                    {
                        return;
                    }
                    //if (x.IsRetweet) return;

                    await SendTwitterNotification(x.CreatedBy.Id, x.Url);
                });
            }
        }
Ejemplo n.º 3
0
 private static void InitializeStream()
 {
     stream = Stream.CreateFilteredStream();
     stream.AddFollow(user);
     stream.StreamStopped         += StreamStopped;
     stream.StreamStarted         += StreamStarted;
     stream.MatchingTweetReceived += MatchingTweetReceived;
 }
Ejemplo n.º 4
0
        public override void SetupEvent()
        {
            TwitterConnector twitterConnector = this.InParameters["twitter"].GetValue() as TwitterConnector;

            this.stream = twitterConnector.Client.Streams.CreateFilteredStream();
            stream.MatchingTweetReceived += Stream_MatchingTweetReceived;

            var twitterUser = twitterConnector.Client.Users.GetUserAsync(this.InParameters["user"].GetValue().ToString());

            twitterUser.Wait();
            stream.AddFollow(twitterUser.Result);

            stream.StartMatchingAllConditionsAsync();
        }
Ejemplo n.º 5
0
        private void StartTwitterStream()
        {
            TwitterStream = Tweetinvi.Stream.CreateFilteredStream();
            TwitterStream.MatchingTweetReceived += OnTweetReceived;

            TwitterStream.StallWarnings = true;
            TwitterStream.WarningFallingBehindDetected += (sender, args) =>
            {
                Log.WriteWarn("Twitter", $"Stream falling behind: {args.WarningMessage.PercentFull} {args.WarningMessage.Code} {args.WarningMessage.Message}");
            };

            TwitterStream.StreamStopped += (sender, args) =>
            {
                var ex = args.Exception;
                var twitterDisconnectMessage = args.DisconnectMessage;

                if (ex != null)
                {
                    Log.WriteError("Twitter", ex.ToString());
                }

                if (twitterDisconnectMessage != null)
                {
                    Log.WriteError("Twitter", $"Stream stopped: {twitterDisconnectMessage.Code} {twitterDisconnectMessage.Reason}");
                }

                TwitterStream.StopStream();

                Task.Factory.StartNew(() =>
                {
                    Thread.Sleep(5000);
                    TwitterStream.StartStreamMatchingAnyConditionAsync();
                });
            };

            var twitterUsers = Tweetinvi.User.GetUsersFromScreenNames(Config.Twitter.AccountsToFollow.Keys);

            foreach (var user in twitterUsers)
            {
                var channels = Config.Twitter.AccountsToFollow.First(u => u.Key.Equals(user.ScreenName, StringComparison.InvariantCultureIgnoreCase));

                Log.WriteInfo("Twitter", $"Following @{user.ScreenName}");

                TwitterToChannels.Add(user.Id, channels.Value);

                TwitterStream.AddFollow(user);
            }

            TwitterStream.StartStreamMatchingAnyConditionAsync();
        }
        public TtsBot(ILogger <TtsBot> logger, Option option, AdminAccess.AdminAccess.AdminAccessClient grpcClient, DataStore store)
        {
            _option       = option ?? throw new ArgumentNullException(nameof(option));
            _grpcClient   = grpcClient ?? throw new ArgumentNullException(nameof(grpcClient));
            _store        = store ?? throw new ArgumentNullException(nameof(store));
            _logger       = logger ?? throw new ArgumentNullException(nameof(logger));
            _tweetIdRegex = new Regex(@"\/(?<tweetId>\d+)");

            if (option.GoogleUseEnvironmentVariable)
            {
                _ttsClient = TextToSpeechClient.Create();
            }
            else
            {
                if (string.IsNullOrWhiteSpace(_option.GoogleApplicationCredentialsPath))
                {
                    throw new ArgumentNullException(nameof(_option.GoogleApplicationCredentialsPath), "Credential path cannot be empty if not using Enviornment Variable \"GOOGLE_APPLICATION_CREDENTIALS\"");
                }

                TextToSpeechClientBuilder builder = new TextToSpeechClientBuilder();
                builder.CredentialsPath = _option.GoogleApplicationCredentialsPath;

                _ttsClient = builder.Build();
            }

            _discord      = new DiscordSocketClient();
            _discord.Log += obj =>
            {
                _logger.LogDebug("{0}", obj);
                return(Task.CompletedTask);
            };

            _userCredentials = Auth.CreateCredentials(option.TwitterConsumerKey,
                                                      option.TwitterConsumerSecret,
                                                      option.TwitterUserAccessToken,
                                                      option.TwitterUserAccessSecret);
            Auth.SetCredentials(_userCredentials);

            _stream = TwitterStream.CreateFilteredStream(_userCredentials, TweetMode.Extended);
            _stream.MatchingTweetReceived += OnMatchingTweetReceived;

            foreach (var user in _store.Users)
            {
                _stream.AddFollow(user.Id);
            }

            _store.UsersChanged += OnUserAddedToDataStore;
        }
        private void OnUserAddedToDataStore(object sender, UserChangedEventArgs args)
        {
            _stream.PauseStream();

            if (args.NewUser != null)
            {
                _stream.AddFollow(args.NewUser.Id);
            }

            if (args.OldUser != null)
            {
                _stream.RemoveFollow(args.OldUser.Id);
            }

            _stream.ResumeStream();
        }
Ejemplo n.º 8
0
        public async Task StartAsync(CancellationToken cancellationToken)
        {
            var consumerKey    = Environment.GetEnvironmentVariable("TwitterConsumerKey");
            var consumerSecret = Environment.GetEnvironmentVariable("TwitterConsumerSecret");
            var accessKey      = Environment.GetEnvironmentVariable("TwitterAccessKey");
            var accessSecret   = Environment.GetEnvironmentVariable("TwitterAccessSecret");

            var userClient = new TwitterClient(consumerKey, consumerSecret, accessKey, accessSecret);

            _filteredStream = userClient.Streams.CreateFilteredStream();

            if (!string.IsNullOrEmpty(_attribute.Filter))
            {
                _filteredStream.AddTrack(_attribute.Filter);
            }

            if (!string.IsNullOrWhiteSpace(_attribute.User))
            {
                var user = await userClient.Users.GetUserAsync(_attribute.User);

                _filteredStream.AddFollow(user);
            }

            _filteredStream.MatchingTweetReceived += async(obj, tweetEvent) =>
            {
                var triggerData = new TriggeredFunctionData
                {
                    TriggerValue = tweetEvent
                };
                await Executor.TryExecuteAsync(triggerData, CancellationToken.None);
            };

            _filteredStream.DisconnectMessageReceived += (obj, disconnectEvent) =>
            {
                _filteredStream.Stop();
            };

            await _filteredStream.StartMatchingAllConditionsAsync();
        }
Ejemplo n.º 9
0
        public static async Task RegisterFilteredStreamEventsAsync(string[] users, string[] trackKeywords)
        {
            if (users == null)
            {
                log.Fatal("No Users Are Being Followed.  Server is useless.");
                return;
            }

            try
            {
                stream = Stream.CreateFilteredStream();
                foreach (string userName in users)
                {
                    IUserIdentifier myUser = Tweetinvi.User.GetUserFromScreenName(userName);
                    stream.AddFollow(myUser);
                }
                if (trackKeywords != null)
                {
                    foreach (string keyword in trackKeywords)
                    {
                        stream.AddTrack(keyword);
                    }
                }
                stream.MatchingTweetReceived     += StreamEventCallbackManager.FilteredStream_MatchingTweetReceived;
                stream.StreamStopped             += StreamEventCallbackManager.Stream_Stopped;
                stream.DisconnectMessageReceived += StreamEventCallbackManager.Stream_Disconnected;
                stream.StreamPaused  += StreamEventCallbackManager.Stream_Paused;
                stream.StreamResumed += StreamEventCallbackManager.Stream_Resumed;
                await stream.StartStreamMatchingAllConditionsAsync();

                log.Info("Now Listening To Stream Events.");
            }
            catch (Exception e)
            {
                log.Fatal("FAILED TO REGISTER TO STREAM EVENTS!", e);
            }
        }
Ejemplo n.º 10
0
        public void CreateCommands()
        {
            var CService = _client.GetService <CommandService>();

            IFilteredStream FilteredStream = Tweetinvi.Stream.CreateFilteredStream();
            ISampleStream   SampleStream   = Tweetinvi.Stream.CreateSampleStream();

            CService.CreateCommand("StreamState")
            .Description("Gets the states of the streams")
            .Do(async(e) =>
            {
                await e.Channel.SendMessage("```Sample Stream: " + SampleStream.StreamState + Environment.NewLine + "Filtered Stream: " + FilteredStream.StreamState + "```");
            });

            CService.CreateCommand("PurgeStreams")
            .Alias("Kill", "Stop", "PS")
            .Description("Hopefully stops the stream")
            .Do(async(e) =>
            {
                FilteredStream.StopStream();
                SampleStream.StopStream();
                FilteredStream.ClearTracks();
                await e.Channel.SendMessage("```Sample Stream: " + SampleStream.StreamState + Environment.NewLine + "Filtered Stream: " + FilteredStream.StreamState + "```");
            });

            CService.CreateCommand("StopSampleStream")
            .Description("Stops all sample streams")
            .Do(async(e) =>
            {
                SampleStream.StopStream();
                await e.Channel.SendMessage("```Sample Stream: " + SampleStream.StreamState + Environment.NewLine + "Filtered Stream: " + FilteredStream.StreamState + "```");
            });

            CService.CreateCommand("StopFilteredStream")
            .Description("Stops all Filtered streams")
            .Do(async(e) =>
            {
                FilteredStream.StopStream();
                await e.Channel.SendMessage("```Sample Stream: " + SampleStream.StreamState + Environment.NewLine + "Filtered Stream: " + FilteredStream.StreamState + "```");
            });

            CService.CreateCommand("Track")
            .Description("Tracks a twitter User Either from their ID or Handle")
            .Parameter("User", ParameterType.Unparsed)
            .Description("Tracks a Twitter User")
            .Do(async(e) =>
            {
                if (Regex.IsMatch(e.GetArg("User"), @"-?\d+(\.\d+)?"))
                {
                    long User    = Convert.ToInt64(e.GetArg("User"));
                    IUser Target = Tweetinvi.User.GetUserFromId(Convert.ToInt64(e.GetArg("User")));

                    await e.Channel.SendMessage("Tracking " + Tweetinvi.User.GetUserFromId(Convert.ToInt64(e.GetArg("User"))));

                    FilteredStream.AddFollow(User);
                    FilteredStream.MatchingTweetReceived += (sender, args) =>
                    {
                        e.Channel.SendMessage(Target + " " + args.Tweet);
                    };
                    FilteredStream.StreamStopped += (sender, args) =>
                    {
                        var Exception         = args.Exception;
                        var DisconnectMessage = args.DisconnectMessage;
                        e.Channel.SendMessage("Filtered stream ended exception: " + Exception + " Disconnect message: " + DisconnectMessage);
                    };
                    await FilteredStream.StartStreamMatchingAllConditionsAsync();
                }
                else
                {
                    var Target = Tweetinvi.User.GetUserFromScreenName(e.GetArg("User"));

                    await e.Channel.SendMessage("Tracking " + Tweetinvi.User.GetUserFromScreenName(e.GetArg("User")));

                    FilteredStream.AddFollow(Target);
                    FilteredStream.MatchingTweetReceived += (sender, args) =>
                    {
                        Console.WriteLine("Found Tweet");
                        e.Channel.SendMessage(e.GetArg("User") + " Tweeted " + args.Tweet);
                    };
                    await FilteredStream.StartStreamMatchingAllConditionsAsync();
                }
            });

            CService.CreateCommand("Spam")
            .Alias("Havoc", "Anton", "Cancer")
            .Description("Initializes a socalled sample stream which returns 1% of all public tweets Discord will not show them all because of RateLimits.")
            .Do(async(e) =>
            {
                if (e.User.ServerPermissions.ManageServer == true)
                {
                    SampleStream.TweetReceived += (sender, args) =>
                    {
                        e.Channel.SendMessage(args.Tweet.Text.ToString());
                    };
                    await SampleStream.StartStreamAsync();
                }
                else
                {
                    await e.Channel.SendMessage("ERROR most likely you do not have sufficient permissions");
                }
            });

            CService.CreateCommand("Sample")
            .Description("Initializes a socalled sample stream but instead of 1% its specified with an amount of random tweets, Neat!")
            .Parameter("Tweets", ParameterType.Unparsed)
            .Do(async(e) =>
            {
                if (Regex.IsMatch(e.GetArg("Tweets"), @"-?\d+(\.\d+)?"))
                {
                    int Tweets = Convert.ToInt32(e.GetArg("Tweets"));
                    await e.Channel.SendMessage("Transmitting " + e.GetArg("Tweets") + " Tweets");

                    int i = 0;
                    SampleStream.TweetReceived += (sender, args) =>
                    {
                        i++;
                        if (i < Tweets)
                        {
                            e.Channel.SendMessage(args.Tweet.Text.ToString());
                        }
                        else
                        {
                            SampleStream.StopStream();
                        }
                    };
                    FilteredStream.StreamStopped += (sender, args) =>
                    {
                        var Exception         = args.Exception;
                        var DisconnectMessage = args.DisconnectMessage;
                        e.Channel.SendMessage("Filtered stream ended exception: " + Exception + " Disconnect message: " + DisconnectMessage);
                    };
                    await SampleStream.StartStreamAsync();
                }
                else
                {
                    await e.Channel.SendMessage("Error Invalid input");
                }
            });
        }
Ejemplo n.º 11
0
        public void TweetTask(string text, bool displayMsg = true)
        {
            RateLimit.RateLimitTrackerMode = RateLimitTrackerMode.TrackAndAwait;                                                               //to avoid ratelimits, let Tweetinvi handle it
            var embed = new EmbedBuilder();

            if (stream == null)
            {
                stream = Stream.CreateFilteredStream();                                                                                             //create a stream for the live feed
            }
            foreach (var feed in twitterFeeds)
            {
                stream.AddFollow(User.GetUserFromScreenName(feed.twitterUser));                                                                                                         //set the stream to follow said user(s)
            }
            stream.MatchingTweetReceived += async(sender, args) =>
            {
                var tweet = args.Tweet;

                foreach (var feed in twitterFeeds)
                {
                    if (tweet.CreatedBy.ScreenName == feed.twitterUser)                                                                                                         //if the twitter screen name matches a saved screen name...
                    {
                        embed = new EmbedBuilder();
                        embed.WithAuthor($"{tweet.CreatedBy.Name} (@{tweet.CreatedBy.ScreenName})", tweet.CreatedBy.ProfileImageUrl, tweet.Url);
                        embed.WithDescription(tweet.Text);
                        embed.WithColor(0, 172, 237);                             //Twitter blue

                        if (tweet.Media.Count > 0)
                        {
                            embed.WithImageUrl(tweet.Media[0].MediaURL);
                        }

                        foreach (var channel in feed.channels)                                                                                                                          //post the embedded tweet in every channel
                        {
                            await channel.SendMessageAsync("", false, embed.Build());
                        }

                        break;
                    }
                }
            };

            stream.StreamStopped += (sender, args) =>
            {
                if (args.Exception != null)
                {
                    Console.WriteLine(args.Exception);
                }
            };

            var MainThread = new Thread(() => stream.StartStreamMatchingAnyConditionAsync());

            MainThread.Start();
            MainThread = new Thread(async() =>
            {
                if (!String.IsNullOrWhiteSpace(text) && displayMsg)
                {
                    var msg = await ReplyAsync($"`Live feed is now hooked into @{text}.`");
                    await Task.Delay(2000);
                    await msg.DeleteAsync();
                }
                else if (!displayMsg)
                {
                    var msg = await ReplyAsync($"`The live feed of @{text} has been removed.`");
                    await Task.Delay(2000);
                    await msg.DeleteAsync();
                }

                await Context.Client.SetGameAsync($"{twitterFeeds.Count} user's Twitter feed", null, ActivityType.Listening);
                while (true)
                {
                    Thread.Sleep(2000);
                    if (!running)
                    {
                        stream.StopStream();
                        stream.ClearFollows();
                        await Context.Client.SetGameAsync(null);
                        break;
                    }
                }
            });
            MainThread.Start();
            MainThread.IsBackground = true;
        }
 public void AddFollow(IUser userToFollow, Action <ITweet> actionOnReceived)
 {
     stream.AddFollow(userToFollow, actionOnReceived);
 }
Ejemplo n.º 13
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);
                }
            }
        }
Ejemplo n.º 14
0
        public static void CreateCommands()
        {
            var CService = _client.GetService <CommandService>();

            ISampleStream   SampleStream   = Tweetinvi.Stream.CreateSampleStream();
            IFilteredStream FilteredStream = Tweetinvi.Stream.CreateFilteredStream();

            CService.CreateCommand("State")
            .Alias("StreamState", "SS")
            .Description("Displays whether the streams are running or not")
            .Do(async(e) =>
            {
                await e.Channel.SendMessage($"Filtered Stream: {FilteredStream.StreamState} {Environment.NewLine}Sample Stream: {SampleStream.StreamState}");
            });

            CService.CreateCommand("PurgeStreams")
            .Alias("PS", "Purge")
            .Description("Purges all running streams")
            .Do(async(e) =>
            {
                SampleStream.StopStream();
                FilteredStream.StopStream();
                FilteredStream.ClearTracks();
                await e.Channel.SendMessage($"```Sample Stream: {SampleStream.StreamState} {Environment.NewLine}Filtered Stream: {FilteredStream.StreamState}```");
            });

            CService.CreateCommand("Sample")
            .Description("Initializes a socalled sample stream but instead of 1% its specified with an amount of random tweets, Neat!")
            .Parameter("Tweets", ParameterType.Unparsed)
            .Do(async(e) =>
            {
                if (Regex.IsMatch(e.GetArg("Tweets"), @"-?\d+(\.\d+)?"))
                {
                    int Tweets = Convert.ToInt32(e.GetArg("Tweets"));
                    await e.Channel.SendMessage("Transmitting " + e.GetArg("Tweets") + " Tweets");

                    Console.WriteLine(Tweetinvi.User.GetAuthenticatedUser());
                    int i = 0;
                    SampleStream.TweetReceived += (sender, args) =>
                    {
                        if (i < Tweets)
                        {
                            e.Channel.SendMessage(args.Tweet.Text.ToString());
                            i++;
                        }
                        else
                        {
                            SampleStream.StopStream();
                        }
                    };
                    SampleStream.StreamStopped += (sender, args) =>
                    {
                        var Exception         = args.Exception;
                        var DisconnectMessage = args.DisconnectMessage;
                        e.Channel.SendMessage($"```Stream ended { Environment.NewLine }Exception: { Exception } { Environment.NewLine }Disconnect message: { DisconnectMessage }```");
                    };
                    await SampleStream.StartStreamAsync();
                }
                else
                {
                    await e.Channel.SendMessage("Error Invalid input");
                }
            });

            CService.CreateCommand("Track")
            .Description("Tracks a twitter User Either from their ID or Handle")
            .Parameter("User", ParameterType.Unparsed)
            .Description("Tracks a Twitter User")
            .Do(async(e) =>
            {
                if (Regex.IsMatch(e.GetArg("User"), @"-?\d+(\.\d+)?"))
                {
                    long User    = Convert.ToInt64(e.GetArg("User"));
                    IUser Target = Tweetinvi.User.GetUserFromId(Convert.ToInt64(e.GetArg("User")));

                    await e.Channel.SendMessage($"Tracking { Tweetinvi.User.GetUserFromId(Convert.ToInt64(e.GetArg("User"))) }");

                    FilteredStream.AddFollow(User);
                    FilteredStream.MatchingTweetReceived += (sender, args) =>
                    {
                        e.Channel.SendMessage(Target + " " + args.Tweet);
                    };
                    FilteredStream.StreamStopped += (sender, args) =>
                    {
                        e.Channel.SendMessage("Filtered Stream Ended");
                    };
                    await FilteredStream.StartStreamMatchingAllConditionsAsync();
                }
                else
                {
                    var Target = Tweetinvi.User.GetUserFromScreenName(e.GetArg("User"));

                    await e.Channel.SendMessage($"Tracking { Tweetinvi.User.GetUserFromScreenName(e.GetArg("User")) }");

                    FilteredStream.AddFollow(Target);
                    FilteredStream.MatchingTweetReceived += (sender, args) =>
                    {
                        Console.WriteLine("Found Tweet");
                        e.Channel.SendMessage($"{ e.GetArg("User") } Tweeted { args.Tweet }");
                    };
                    await FilteredStream.StartStreamMatchingAllConditionsAsync();
                }
            });
        }
Ejemplo n.º 15
0
        public void StartStream()
        {
            Tweetinvi.ExceptionHandler.SwallowWebExceptions = false;
            var credentials = Tweetinvi.Auth.SetUserCredentials(
                TwitterAppCredentials.ConsumerKey,
                TwitterAppCredentials.ConsumerSecret,
                TwitterAppCredentials.AccessToken,
                TwitterAppCredentials.AccessSecret
                );

            var user = Tweetinvi.User.GetUserFromScreenName("AndrewYang");

            _filteredStream             = Tweetinvi.Stream.CreateFilteredStream();
            _filteredStream.FilterLevel = Tweetinvi.Streaming.Parameters.StreamFilterLevel.None;
            _filteredStream.TweetMode   = Tweetinvi.TweetMode.Extended;
            //_filteredStream.AddLocation(new Location(30.6266, 81.4609, 30.6319, 81.6065));
            _filteredStream.AddFollow(user.Id);
            _filteredStream.AddTrack("YangGang");
            _filteredStream.AddTrack("NevadaCaucuses");
            _filteredStream.AddTrack("StillVotingYang");
            _filteredStream.AddTrack("NevadaForYang");
            //stream.AddTrack("SecureTheBag");
            //stream.AddTrack("YangMediaBlackout");
            //stream.AddTrack("YangMediaShoutout");
            //stream.AddTrack("YangWillWin");
            //stream.AddTrack("YangOrBust");
            //stream.AddTrack("YangBeatsTrump");
            //stream.AddTrack("NewHampshireForYang");
            //stream.AddTrack("AmericaNeedsYang");
            //stream.AddTrack("LetYangSpeak");
            //stream.AddTrack("VoteYang");

            _filteredStream.MatchingTweetReceived += (sender, args) =>
            {
                try
                {
                    ITweet fullTweet  = null;
                    ITweet childTweet = null;

                    var tweet = args.Tweet;
                    if (tweet.IsRetweet)
                    {
                        return;
                    }

                    TwitterUser savedUser;
                    using (var db = new TwitterSearchModel())
                    {
                        savedUser = db.TwitterUsers.Where(u => u.TwitterUserID == tweet.CreatedBy.IdStr).FirstOrDefault();
                    }
                    if (savedUser == null)
                    {
                        var user     = Tweetinvi.User.GetUserFromId(tweet.CreatedBy.Id);
                        var userJson = Tweetinvi.JsonSerializer.ToJson(user.UserDTO);
                        Console.WriteLine($"New User: {userJson}");
                        using (var db = new TwitterSearchModel())
                        {
                            db.TwitterUsers.Add(new TwitterUser
                            {
                                TwitterUserID   = user.IdStr,
                                TwitterUserJson = userJson
                            });
                            db.SaveChanges();
                        }
                    }
                    TweetRecord savedTweet;
                    using (var db = new TwitterSearchModel())
                    {
                        savedTweet = db.TweetRecords.Where(t => t.TweetID == tweet.IdStr).FirstOrDefault();
                    }
                    if (savedTweet == null)
                    {
                        fullTweet = Tweetinvi.Tweet.GetTweet(tweet.Id);

                        //var voteYang = Tweetinvi.Timeline.GetUserTimeline(.GetExistingList()
                        var tweetJson = Tweetinvi.JsonSerializer.ToJson(fullTweet.TweetDTO);

                        using (var db = new TwitterSearchModel())
                        {
                            db.TweetRecords.Add(new TweetRecord
                            {
                                TweetID   = tweet.IdStr,
                                TweetJson = tweetJson
                            });
                            db.SaveChanges();
                        }
                        Console.WriteLine($"User: {fullTweet.CreatedBy.Name}");
                        Console.WriteLine($"Tweet: {fullTweet.FullText ?? fullTweet.Text}");
                        Console.WriteLine($"{fullTweet.Url}");
                        Console.WriteLine();
                    }



                    //tweetPostQueue.Enqueue(tweet)
                    //var fbPostResult = PostToFacebook(tweet).Result;


                    string childTweetIDStr = tweet.InReplyToStatusIdStr ?? tweet.QuotedStatusIdStr;
                    if (childTweetIDStr != null)
                    {
                        long childTweetID = tweet.InReplyToStatusId ?? tweet.QuotedStatusId ?? 0;
                        childTweet = Tweetinvi.Tweet.GetTweet(childTweetID);
                        TweetRecord savedChildTweet;
                        using (var db = new TwitterSearchModel())
                        {
                            savedChildTweet = db.TweetRecords.Where(t => t.TweetID == childTweetIDStr).FirstOrDefault();
                        }

                        if (savedChildTweet == null)
                        {
                            if (childTweetID != 0)
                            {
                                if (childTweet != null)
                                {
                                    using (var db = new TwitterSearchModel())
                                    {
                                        db.TweetRecords.Add(
                                            new TweetRecord
                                        {
                                            TweetID   = childTweetIDStr,
                                            TweetJson = Tweetinvi.JsonSerializer.ToJson(childTweet.TweetDTO)
                                        });
                                        db.SaveChanges();
                                    }
                                }
                            }
                        }
                    }
                    if (fullTweet != null && childTweet == null)
                    {
                        _tweetHub.Clients.All.SendAsync("ReceiveTweet", fullTweet.TweetDTO.ToJson(), null);
                    }
                    if (fullTweet != null && childTweet != null)
                    {
                        _tweetHub.Clients.All.SendAsync("ReceiveTweet", fullTweet.TweetDTO.ToJson(), childTweet.TweetDTO.ToJson());
                    }
                }
                catch (Exception e)
                {
                    Console.WriteLine($"ERROR: { e.Message}");
                }
                finally
                {
                }
            };

            _filteredStream.StartStreamMatchingAnyCondition();
        }