private void UpdateMatchesBasedOnHashTagEntities(ITweet tweet, MatchOn matchOn, Dictionary <string, Action <ITweet> > matchingTrackAndActions,
                                                         MatchedTweetReceivedEventArgs matchingTracksEventArgs, Dictionary <string, Action <ITweet> > matchingQuotedTrackAndActions)
        {
            if (matchOn.HasFlag(MatchOn.Everything) ||
                matchOn.HasFlag(MatchOn.AllEntities) ||
                matchOn.HasFlag(MatchOn.HashTagEntities))
            {
                var hashTags = tweet.Entities.Hashtags.Select(x => x.Text);

                hashTags.ForEach(x =>
                {
                    var tracksMatchingHashTag = _streamTrackManager.GetMatchingTracksAndActions(x);
                    tracksMatchingHashTag.ForEach(t => { matchingTrackAndActions.TryAdd(t.Item1, t.Item2); });
                    if (tracksMatchingHashTag.Count > 0)
                    {
                        matchingTracksEventArgs.MatchOn |= MatchOn.HashTagEntities;
                    }
                });

                if (tweet.QuotedTweet != null)
                {
                    var quotedHashTags = tweet.QuotedTweet.Entities.Hashtags.Select(x => x.Text);

                    quotedHashTags.ForEach(x =>
                    {
                        var tracksMatchingHashTag = _streamTrackManager.GetMatchingTracksAndActions(x);
                        tracksMatchingHashTag.ForEach(t => { matchingQuotedTrackAndActions.TryAdd(t.Item1, t.Item2); });
                        if (tracksMatchingHashTag.Count > 0)
                        {
                            matchingTracksEventArgs.QuotedTweetMatchOn |= MatchOn.HashTagEntities;
                        }
                    });
                }
            }
        }
        private void UpdateMatchesBasedOnTweetInReplyToUser(ITweet tweet, MatchOn matchOn,
                                                            Dictionary <long, Action <ITweet> > matchingFollowersAndActions, MatchedTweetReceivedEventArgs matchingTracksEventArgs,
                                                            Dictionary <long, Action <ITweet> > matchingQuotedFollowersAndActions)
        {
            if (matchOn.HasFlag(MatchOn.Everything) ||
                matchOn.HasFlag(MatchOn.FollowerInReplyTo))
            {
                var             userId = tweet.InReplyToUserId;
                Action <ITweet> actionToExecuteWhenMatchingFollower;

                if (userId != null && _followingUserIds.TryGetValue(userId, out actionToExecuteWhenMatchingFollower))
                {
                    matchingFollowersAndActions.TryAdd(userId.Value, actionToExecuteWhenMatchingFollower);
                    matchingTracksEventArgs.MatchOn |= MatchOn.FollowerInReplyTo;
                }

                if (tweet.QuotedTweet != null)
                {
                    var             quotedTweetCreatorId = tweet.QuotedTweet.InReplyToUserId;
                    Action <ITweet> actionToExecuteWhenMatchingFollowerFromQuotedTweet;

                    if (quotedTweetCreatorId != null && _followingUserIds.TryGetValue(quotedTweetCreatorId, out actionToExecuteWhenMatchingFollowerFromQuotedTweet))
                    {
                        matchingQuotedFollowersAndActions.TryAdd(quotedTweetCreatorId.Value, actionToExecuteWhenMatchingFollowerFromQuotedTweet);
                        matchingTracksEventArgs.QuotedTweetMatchOn |= MatchOn.FollowerInReplyTo;
                    }
                }
            }
        }
        private void UpdateMatchesBasedOnUserMentions(ITweet tweet, MatchOn matchOn, Dictionary <string, Action <ITweet> > matchingTrackAndActions,
                                                      MatchedTweetReceivedEventArgs matchingTracksEventArgs, Dictionary <string, Action <ITweet> > matchingQuotedTrackAndActions)
        {
            if (matchOn.HasFlag(MatchOn.Everything) ||
                matchOn.HasFlag(MatchOn.AllEntities) ||
                matchOn.HasFlag(MatchOn.UserMentionEntities))
            {
                var mentionsScreenName = tweet.Entities.UserMentions.Select(x => x.ScreenName);
                mentionsScreenName.ForEach(x =>
                {
                    var tracksMatchingMentionScreenName = _streamTrackManager.GetMatchingTracksAndActions(x);
                    tracksMatchingMentionScreenName.ForEach(t => { matchingTrackAndActions.TryAdd(t.Item1, t.Item2); });
                    if (tracksMatchingMentionScreenName.Count > 0)
                    {
                        matchingTracksEventArgs.MatchOn |= MatchOn.UserMentionEntities;
                    }
                });

                if (tweet.QuotedTweet != null)
                {
                    var quotedMentionsScreenName = tweet.QuotedTweet.Entities.UserMentions.Select(x => x.ScreenName);
                    quotedMentionsScreenName.ForEach(x =>
                    {
                        var tracksMatchingMentionScreenName = _streamTrackManager.GetMatchingTracksAndActions(x);
                        tracksMatchingMentionScreenName.ForEach(t => { matchingQuotedTrackAndActions.TryAdd(t.Item1, t.Item2); });
                        if (tracksMatchingMentionScreenName.Count > 0)
                        {
                            matchingTracksEventArgs.QuotedTweetMatchOn |= MatchOn.UserMentionEntities;
                        }
                    });
                }
            }
        }
 public FilteredStreamMatcherConfig(MatchOn matchOn)
 {
     MatchOn = matchOn;
     TweetMatchingTrackAndActions       = new Dictionary <T, Action <ITweet> >();
     RetweetMatchingTrackAndActions     = new Dictionary <T, Action <ITweet> >();
     QuotedTweetMatchingTrackAndActions = new Dictionary <T, Action <ITweet> >();
 }
예제 #5
0
        // Constructor
        public FilteredStream(
            ITwitterClient client,
            IStreamTrackManager <ITweet> streamTrackManager,
            IFilterStreamTweetMatcherFactory filterStreamTweetMatcherFactory,
            IJsonObjectConverter jsonObjectConverter,
            IJObjectStaticWrapper jObjectStaticWrapper,
            IStreamResultGenerator streamResultGenerator,
            ITwitterClientFactories factories,
            ICreateFilteredTweetStreamParameters createFilteredTweetStreamParameters)
            : base(client, streamTrackManager,
                   jsonObjectConverter,
                   jObjectStaticWrapper,
                   streamResultGenerator,
                   factories,
                   createFilteredTweetStreamParameters)
        {
            StreamTrackManager = streamTrackManager;
            _client            = client;
            _filterStreamTweetMatcherFactory = filterStreamTweetMatcherFactory;
            _factories = factories;

            _followingUserIds = new Dictionary <long?, Action <ITweet> >();
            _locations        = new Dictionary <ILocation, Action <ITweet> >();

            MatchOn = MatchOn.Everything;
        }
예제 #6
0
파일: Board.cs 프로젝트: groundh0g/camp2018
        public void FillQueue(List <Piece> queue, PieceTypes type)
        {
            if (queue[0].PieceType == PieceTypes.Empty)
            {
                queue[0] = new Piece()
                {
                    PieceType = type
                };
            }
            for (int i = 1; i < queue.Count; i++)
            {
                if (queue[i].PieceType == PieceTypes.Empty)
                {
                    var values    = Enum.GetValues(typeof(PieceTypes));
                    var pieceType = PieceTypes.Empty;

                    while (pieceType == PieceTypes.Empty)
                    {
                        pieceType = (PieceTypes)values.GetValue(rand.Next(values.Length - 1));
                        if (MatchOn.Contains(pieceType))
                        {
                            pieceType = PieceTypes.Empty;
                        }
                    }

                    queue[i] = new Piece()
                    {
                        PieceType = pieceType
                    };
                }
            }
        }
        // Update Event Args
        private void UpdateMatchesBasedOnTweetText(ITweet tweet, MatchOn matchOn, Dictionary <string, Action <ITweet> > matchingTrackAndActions,
                                                   MatchedTweetReceivedEventArgs matchingTracksEventArgs, Dictionary <string, Action <ITweet> > matchingQuotedTrackAndActions)
        {
            if (matchOn.HasFlag(MatchOn.Everything) ||
                matchOn.HasFlag(MatchOn.TweetText))
            {
                var tracksMatchingTweetText = _streamTrackManager.GetMatchingTracksAndActions(tweet.FullText);
                tracksMatchingTweetText.ForEach(x => { matchingTrackAndActions.TryAdd(x.Item1, x.Item2); });
                if (tracksMatchingTweetText.Count > 0)
                {
                    matchingTracksEventArgs.MatchOn |= MatchOn.TweetText;
                }

                if (tweet.QuotedTweet != null)
                {
                    var tracksMatchingQuotedTweetText = _streamTrackManager.GetMatchingTracksAndActions(tweet.QuotedTweet.FullText);
                    tracksMatchingQuotedTweetText.ForEach(x => { matchingQuotedTrackAndActions.TryAdd(x.Item1, x.Item2); });
                    if (tracksMatchingQuotedTweetText.Count > 0)
                    {
                        matchingTracksEventArgs.QuotedTweetMatchOn |= MatchOn.TweetText;
                    }
                }
            }
        }
        private void UpdateMatchesBasedOnTweetLocation(ITweet tweet, MatchOn matchOn, Dictionary <ILocation, Action <ITweet> > matchingLocationAndActions,
                                                       MatchedTweetReceivedEventArgs matchingTracksEventArgs, Dictionary <ILocation, Action <ITweet> > matchingQuotedLocationAndActions)
        {
            if (matchOn.HasFlag(MatchOn.Everything) ||
                matchOn.HasFlag(MatchOn.TweetLocation))
            {
                var matchedLocations = GetMatchedLocations(tweet).ToArray();
                matchedLocations.ForEach(x => { matchingLocationAndActions.TryAdd(x.Key, x.Value); });
                if (matchedLocations.Length > 0)
                {
                    matchingTracksEventArgs.MatchOn |= MatchOn.TweetLocation;
                }

                if (tweet.QuotedTweet != null)
                {
                    var quotedMatchedLocations = GetMatchedLocations(tweet.QuotedTweet).ToArray();
                    quotedMatchedLocations.ForEach(x => { matchingQuotedLocationAndActions.TryAdd(x.Key, x.Value); });
                    if (quotedMatchedLocations.Length > 0)
                    {
                        matchingTracksEventArgs.QuotedTweetMatchOn |= MatchOn.TweetLocation;
                    }
                }
            }
        }
        public MatchedTweetReceivedEventArgs GetMatchingTweetEventArgsAndRaiseMatchingElements(ITweet tweet, string json, MatchOn matchOn)
        {
            var result = new MatchedTweetReceivedEventArgs(tweet, json);

            var trackMatcherConfig     = new FilteredStreamMatcherConfig <string>(matchOn);
            var locationMatcherConfig  = new FilteredStreamMatcherConfig <ILocation>(matchOn);
            var followersMatcherConfig = new FilteredStreamMatcherConfig <long>(matchOn);

            UpdateMatchesBasedOnTweetText(tweet, trackMatcherConfig, result);
            UpdateMatchesBasedOnUrlEntities(tweet, trackMatcherConfig, result);
            UpdateMatchesBasedOnHashTagEntities(tweet, trackMatcherConfig, result);
            UpdateMatchesBasedOnUserMentions(tweet, trackMatcherConfig, result);
            UpdateMatchesBasedOnSymbols(tweet, trackMatcherConfig, result);
            UpdateMatchesBasedOnTweetLocation(tweet, locationMatcherConfig, result);
            UpdateMatchesBasedOnTweetCreator(tweet, followersMatcherConfig, result);
            UpdateMatchesBasedOnTweetInReplyToUser(tweet, followersMatcherConfig, result);

            result.MatchingTracks    = trackMatcherConfig.TweetMatchingTrackAndActions.Select(x => x.Key).ToArray();
            result.MatchingLocations = locationMatcherConfig.TweetMatchingTrackAndActions.Select(x => x.Key).ToArray();
            result.MatchingFollowers = followersMatcherConfig.TweetMatchingTrackAndActions.Select(x => x.Key).ToArray();

            result.RetweetMatchingTracks    = trackMatcherConfig.RetweetMatchingTrackAndActions.Select(x => x.Key).ToArray();
            result.RetweetMatchingLocations = locationMatcherConfig.RetweetMatchingTrackAndActions.Select(x => x.Key).ToArray();
            result.RetweetMatchingFollowers = followersMatcherConfig.RetweetMatchingTrackAndActions.Select(x => x.Key).ToArray();

            result.QuotedTweetMatchingTracks    = trackMatcherConfig.QuotedTweetMatchingTrackAndActions.Select(x => x.Key).ToArray();
            result.QuotedTweetMatchingLocations = locationMatcherConfig.QuotedTweetMatchingTrackAndActions.Select(x => x.Key).ToArray();
            result.QuotedTweetMatchingFollowers = followersMatcherConfig.QuotedTweetMatchingTrackAndActions.Select(x => x.Key).ToArray();

            CallMultipleActions(tweet, trackMatcherConfig.GetAllMatchingTracks().Select(x => x.Value));
            CallMultipleActions(tweet, locationMatcherConfig.GetAllMatchingTracks().Select(x => x.Value));
            CallMultipleActions(tweet, followersMatcherConfig.GetAllMatchingTracks().Select(x => x.Value));

            return(result);
        }
        public MatchedTweetReceivedEventArgs GetMatchingTweetEventArgsAndRaiseMatchingElements(ITweet tweet, string json, MatchOn matchOn)
        {
            var matchingTracksEventArgs = new MatchedTweetReceivedEventArgs(tweet, json);

            var matchingTrackAndActions     = new Dictionary <string, Action <ITweet> >();
            var matchingLocationsAndActions = new Dictionary <ILocation, Action <ITweet> >();
            var matchingFollowersAndActions = new Dictionary <long, Action <ITweet> >();

            var matchingQuotedTrackAndActions     = new Dictionary <string, Action <ITweet> >();
            var matchingQuotedLocationsAndActions = new Dictionary <ILocation, Action <ITweet> >();
            var matchingQuotedFollowersAndActions = new Dictionary <long, Action <ITweet> >();

            UpdateMatchesBasedOnTweetText(tweet, matchOn, matchingTrackAndActions, matchingTracksEventArgs, matchingQuotedTrackAndActions);
            UpdateMatchesBasedOnUrlEntities(tweet, matchOn, matchingTrackAndActions, matchingTracksEventArgs, matchingQuotedTrackAndActions);
            UpdateMatchesBasedOnHashTagEntities(tweet, matchOn, matchingTrackAndActions, matchingTracksEventArgs, matchingQuotedTrackAndActions);
            UpdateMatchesBasedOnUserMentions(tweet, matchOn, matchingTrackAndActions, matchingTracksEventArgs, matchingQuotedTrackAndActions);
            UpdateMatchesBasedOnTweetLocation(tweet, matchOn, matchingLocationsAndActions, matchingTracksEventArgs, matchingQuotedLocationsAndActions);
            UpdateMatchesBasedOnTweetCreator(tweet, matchOn, matchingFollowersAndActions, matchingTracksEventArgs, matchingQuotedFollowersAndActions);
            UpdateMatchesBasedOnTweetInReplyToUser(tweet, matchOn, matchingFollowersAndActions, matchingTracksEventArgs, matchingQuotedFollowersAndActions);

            var matchingTracks    = matchingTrackAndActions.Select(x => x.Key).ToArray();
            var matchingLocations = matchingLocationsAndActions.Select(x => x.Key).ToArray();
            var matchingFollowers = matchingFollowersAndActions.Select(x => x.Key).ToArray();

            matchingTracksEventArgs.MatchingTracks    = matchingTracks;
            matchingTracksEventArgs.MatchingLocations = matchingLocations;
            matchingTracksEventArgs.MatchingFollowers = matchingFollowers;

            var matchingQuotedTracks    = matchingQuotedTrackAndActions.Select(x => x.Key).ToArray();
            var matchingQuotedLocations = matchingQuotedLocationsAndActions.Select(x => x.Key).ToArray();
            var matchingQuotedFollowers = matchingQuotedFollowersAndActions.Select(x => x.Key).ToArray();

            matchingTracksEventArgs.QuotedTweetMatchingTracks    = matchingQuotedTracks;
            matchingTracksEventArgs.QuotedTweetMatchingLocations = matchingQuotedLocations;
            matchingTracksEventArgs.QuotedTweetMatchingFollowers = matchingQuotedFollowers;

            var allMatchingTracks    = matchingTrackAndActions.MergeWith(matchingQuotedTrackAndActions);
            var allMatchingLocations = matchingLocationsAndActions.MergeWith(matchingQuotedLocationsAndActions);
            var allMatchingFollowers = matchingFollowersAndActions.MergeWith(matchingQuotedFollowersAndActions);

            CallMultipleActions(tweet, allMatchingTracks.Select(x => x.Value));
            CallMultipleActions(tweet, allMatchingLocations.Select(x => x.Value));
            CallMultipleActions(tweet, allMatchingFollowers.Select(x => x.Value));

            return(matchingTracksEventArgs);
        }
        private void UpdateMatchesBasedOnUrlEntities(
            ITweet tweet,
            MatchOn matchOn,
            Dictionary <string, Action <ITweet> > matchingTrackAndActions,
            MatchedTweetReceivedEventArgs matchingTracksEventArgs,
            Dictionary <string, Action <ITweet> > matchingQuotedTrackAndActions)
        {
            if (matchOn.HasFlag(MatchOn.Everything) ||
                matchOn.HasFlag(MatchOn.AllEntities) ||
                matchOn.HasFlag(MatchOn.URLEntities))
            {
                var expandedURLs = tweet.Entities.Urls.Select(x => x.ExpandedURL);
                expandedURLs = expandedURLs.Union(tweet.Entities.Medias.Select(x => x.ExpandedURL));
                expandedURLs.ForEach(x =>
                {
                    var tracksMatchingExpandedURL = _streamTrackManager.GetMatchingTracksAndActions(x);
                    tracksMatchingExpandedURL.ForEach(t => { matchingTrackAndActions.TryAdd(t.Item1, t.Item2); });
                    if (tracksMatchingExpandedURL.Count > 0)
                    {
                        matchingTracksEventArgs.MatchOn |= MatchOn.URLEntities;
                    }
                });

                var displayedURLs = tweet.Entities.Urls.Select(x => x.DisplayedURL);
                displayedURLs = displayedURLs.Union(tweet.Entities.Medias.Select(x => x.DisplayURL));
                displayedURLs.ForEach(x =>
                {
                    var tracksMatchingDisplayedURL = _streamTrackManager.GetMatchingTracksAndActions(x);
                    tracksMatchingDisplayedURL.ForEach(t => { matchingTrackAndActions.TryAdd(t.Item1, t.Item2); });
                    if (tracksMatchingDisplayedURL.Count > 0)
                    {
                        matchingTracksEventArgs.MatchOn |= MatchOn.URLEntities;
                    }
                });

                if (tweet.QuotedTweet != null)
                {
                    var quotedTweetExpandedURLs = tweet.QuotedTweet.Entities.Urls.Select(x => x.ExpandedURL);
                    quotedTweetExpandedURLs = quotedTweetExpandedURLs.Union(tweet.QuotedTweet.Entities.Medias.Select(x => x.ExpandedURL));
                    quotedTweetExpandedURLs.ForEach(x =>
                    {
                        var tracksMatchingExpandedURL = _streamTrackManager.GetMatchingTracksAndActions(x);
                        tracksMatchingExpandedURL.ForEach(t => { matchingQuotedTrackAndActions.TryAdd(t.Item1, t.Item2); });
                        if (tracksMatchingExpandedURL.Count > 0)
                        {
                            matchingTracksEventArgs.QuotedTweetMatchOn |= MatchOn.URLEntities;
                        }
                    });

                    var quotedTweetDisplayedURLs = tweet.QuotedTweet.Entities.Urls.Select(x => x.DisplayedURL);
                    quotedTweetDisplayedURLs = quotedTweetDisplayedURLs.Union(tweet.QuotedTweet.Entities.Medias.Select(x => x.DisplayURL));
                    quotedTweetDisplayedURLs.ForEach(x =>
                    {
                        var tracksMatchingDisplayedURL = _streamTrackManager.GetMatchingTracksAndActions(x);
                        tracksMatchingDisplayedURL.ForEach(t => { matchingQuotedTrackAndActions.TryAdd(t.Item1, t.Item2); });
                        if (tracksMatchingDisplayedURL.Count > 0)
                        {
                            matchingTracksEventArgs.QuotedTweetMatchOn |= MatchOn.URLEntities;
                        }
                    });
                }
            }
        }
예제 #12
0
        private MatchedTweetReceivedEventArgs GetMatchingTweetEventArgsAndRaiseMatchingElements(ITweet tweet, string json)
        {
            var matchingTracksEventArgs = new MatchedTweetReceivedEventArgs(tweet, json);

            var matchingTrackAndActions     = new Dictionary <string, Action <ITweet> >();
            var matchingLocationAndActions  = new Dictionary <ILocation, Action <ITweet> >();
            var matchingFollowersAndActions = new Dictionary <long, Action <ITweet> >();

            if (MatchOn.HasFlag(MatchOn.Everything) ||
                MatchOn.HasFlag(MatchOn.TweetText))
            {
                var tracksMatchingTweetText = _streamTrackManager.GetMatchingTracksAndActions(tweet.FullText);

                tracksMatchingTweetText.ForEach(x =>
                {
                    matchingTrackAndActions.TryAdd(x.Item1, x.Item2);
                });

                if (tracksMatchingTweetText.Count > 0)
                {
                    matchingTracksEventArgs.MatchOn |= MatchOn.TweetText;
                }
            }

            if (MatchOn.HasFlag(MatchOn.Everything) ||
                MatchOn.HasFlag(MatchOn.AllEntities) ||
                MatchOn.HasFlag(MatchOn.URLEntities))
            {
                var expandedURLs = tweet.Entities.Urls.Select(x => x.ExpandedURL);
                expandedURLs = expandedURLs.Union(tweet.Entities.Medias.Select(x => x.ExpandedURL));

                expandedURLs.ForEach(x =>
                {
                    var tracksMatchingExpandedURL = _streamTrackManager.GetMatchingTracksAndActions(x);
                    tracksMatchingExpandedURL.ForEach(t =>
                    {
                        matchingTrackAndActions.TryAdd(t.Item1, t.Item2);
                    });

                    if (tracksMatchingExpandedURL.Count > 0)
                    {
                        matchingTracksEventArgs.MatchOn |= MatchOn.URLEntities;
                    }
                });

                var displayedURLs = tweet.Entities.Urls.Select(x => x.DisplayedURL);
                displayedURLs = displayedURLs.Union(tweet.Entities.Medias.Select(x => x.DisplayURL));

                displayedURLs.ForEach(x =>
                {
                    var tracksMatchingDisplayedURL = _streamTrackManager.GetMatchingTracksAndActions(x);

                    tracksMatchingDisplayedURL.ForEach(t =>
                    {
                        matchingTrackAndActions.TryAdd(t.Item1, t.Item2);
                    });

                    if (tracksMatchingDisplayedURL.Count > 0)
                    {
                        matchingTracksEventArgs.MatchOn |= MatchOn.URLEntities;
                    }
                });
            }

            if (MatchOn.HasFlag(MatchOn.Everything) ||
                MatchOn.HasFlag(MatchOn.AllEntities) ||
                MatchOn.HasFlag(MatchOn.HashTagEntities))
            {
                var hashTags = tweet.Entities.Hashtags.Select(x => x.Text);

                hashTags.ForEach(x =>
                {
                    var tracksMatchingHashTag = _streamTrackManager.GetMatchingTracksAndActions(x);

                    tracksMatchingHashTag.ForEach(t =>
                    {
                        matchingTrackAndActions.TryAdd(t.Item1, t.Item2);
                    });

                    if (tracksMatchingHashTag.Count > 0)
                    {
                        matchingTracksEventArgs.MatchOn |= MatchOn.HashTagEntities;
                    }
                });
            }

            if (MatchOn.HasFlag(MatchOn.Everything) ||
                MatchOn.HasFlag(MatchOn.AllEntities) ||
                MatchOn.HasFlag(MatchOn.UserMentionEntities))
            {
                var mentionsScreenName = tweet.Entities.UserMentions.Select(x => x.ScreenName);

                mentionsScreenName.ForEach(x =>
                {
                    var tracksMatchingMentionScreenName = _streamTrackManager.GetMatchingTracksAndActions(x);

                    tracksMatchingMentionScreenName.ForEach(t =>
                    {
                        matchingTrackAndActions.TryAdd(t.Item1, t.Item2);
                    });

                    if (tracksMatchingMentionScreenName.Count > 0)
                    {
                        matchingTracksEventArgs.MatchOn |= MatchOn.UserMentionEntities;
                    }
                });
            }

            if (MatchOn.HasFlag(MatchOn.Everything) ||
                MatchOn.HasFlag(MatchOn.TweetLocation))
            {
                var matchedLocations = GetMatchedLocations(tweet).ToArray();

                matchedLocations.ForEach(x =>
                {
                    matchingLocationAndActions.TryAdd(x.Key, x.Value);
                });

                if (matchedLocations.Length > 0)
                {
                    matchingTracksEventArgs.MatchOn |= MatchOn.TweetLocation;
                }
            }

            if (MatchOn.HasFlag(MatchOn.Everything) ||
                MatchOn.HasFlag(MatchOn.Follower))
            {
                var             userId = tweet.CreatedBy?.Id;
                Action <ITweet> actionToExecuteWhenMatchingFollower;

                if (userId != null && _followingUserIds.TryGetValue(userId, out actionToExecuteWhenMatchingFollower))
                {
                    matchingFollowersAndActions.TryAdd(userId.Value, actionToExecuteWhenMatchingFollower);
                    matchingTracksEventArgs.MatchOn |= MatchOn.Follower;
                }
            }

            if (MatchOn.HasFlag(MatchOn.Everything) ||
                MatchOn.HasFlag(MatchOn.FollowerInReplyTo))
            {
                var             userId = tweet.InReplyToUserId;
                Action <ITweet> actionToExecuteWhenMatchingFollower;

                if (userId != null && _followingUserIds.TryGetValue(userId, out actionToExecuteWhenMatchingFollower))
                {
                    matchingFollowersAndActions.TryAdd(userId.Value, actionToExecuteWhenMatchingFollower);
                    matchingTracksEventArgs.MatchOn |= MatchOn.FollowerInReplyTo;
                }
            }

            var matchingTracks    = matchingTrackAndActions.Select(x => x.Key).ToArray();
            var matchingLocations = matchingLocationAndActions.Select(x => x.Key).ToArray();
            var matchingFollowers = matchingFollowersAndActions.Select(x => x.Key).ToArray();

            matchingTracksEventArgs.MatchingTracks    = matchingTracks;
            matchingTracksEventArgs.MatchingLocations = matchingLocations;
            matchingTracksEventArgs.MatchingFollowers = matchingFollowers;

            CallMultipleActions(tweet, matchingTrackAndActions.Select(x => x.Value));
            CallMultipleActions(tweet, matchingLocationAndActions.Select(x => x.Value));
            CallMultipleActions(tweet, matchingFollowersAndActions.Select(x => x.Value));

            return(matchingTracksEventArgs);
        }