Exemplo n.º 1
0
 public static bool IsMuted(TwitterStatusBase status)
 {
     return (Setting.Instance.TimelineFilteringProperty.MuteFilterCluster != null &&
         Setting.Instance.TimelineFilteringProperty.MuteFilterCluster.Filter(status) &&
         !AccountStorage.Contains(status.User.ScreenName)) ||
         IsMuted(status.User);
 }
Exemplo n.º 2
0
        protected override bool FilterStatus(Dulcet.Twitter.TwitterStatusBase status)
        {
            var s = status as TwitterStatus;

            if (s != null)
            {
                if (isStrict)
                {
                    return(!String.IsNullOrEmpty(s.InReplyToUserScreenName) &&
                           Match(s.InReplyToUserScreenName, this.needle));
                }
                else
                {
                    return(RegularExpressions.AtRegex.Matches(status.Text)
                           .Cast <Match>().Any(m => Match(m.Groups[1].Value, needle)));
                }
            }
            var dm = status as TwitterDirectMessage;

            if (dm != null)
            {
                return(Match(dm.Recipient.ScreenName, this.needle));
            }
            return(false);
        }
Exemplo n.º 3
0
 public static TwitterUser GetSuggestedUser(TwitterStatusBase status)
 {
     if (IsPublishedByRetweet(status))
         return ((TwitterStatus)status).RetweetedOriginal.User;
     else
         return status.User;
 }
Exemplo n.º 4
0
 public TweetViewModel(TwitterStatusBase status)
 {
     if (status == null)
         throw new ArgumentNullException("status");
     this.bindingId = status.Id;
     this.Status = status;
 }
Exemplo n.º 5
0
        protected override bool FilterStatus(Dulcet.Twitter.TwitterStatusBase status)
        {
            bool init = Interlocked.Exchange(ref initCheckFlag, 1) == 0;

            if (ListStorage.IsListMemberCached(this.listUser, this.listName))
            {
                var ids =
                    ListStorage.GetListMembers(this.listUser, this.listName)
                    .Select(u => u.TwitterUser.ScreenName).ToArray();
                return(ids.Contains(status.User.ScreenName) &&
                       (!(status is TwitterStatus) ||
                        String.IsNullOrEmpty(((TwitterStatus)status).InReplyToUserScreenName) ||
                        ids.Contains(((TwitterStatus)status).InReplyToUserScreenName)));
            }
            else
            {
                if (init)
                {
                    Task.Factory.StartNew(() =>
                    {
                        try
                        {
                            ListStorage.GetListMembers(this.listUser, this.listName).ToArray();
                            this.RaiseRequireReaccept();
                        }
                        catch { }
                    });
                }
                return(false);
            }
        }
Exemplo n.º 6
0
 public static bool IsMuted(TwitterStatusBase status)
 {
     var tweet = status as TwitterStatus;
     return (Setting.Instance.TimelineFilteringProperty.MuteFilterCluster != null &&
         Setting.Instance.TimelineFilteringProperty.MuteFilterCluster.Filter(status) &&
         !AccountStorage.Contains(status.User.ScreenName)) ||
         IsMuted(status.User) ||
         (tweet != null && tweet.RetweetedOriginal != null && IsMuted(tweet.RetweetedOriginal.User));
 }
Exemplo n.º 7
0
        protected override bool FilterStatus(Dulcet.Twitter.TwitterStatusBase status)
        {
            var ts = TweetStorage.Get(status.Id);

            if (ts == null)
            {
                return(false);
            }
            return(this.Range.Check(ts.RetweetedUsers.Count()));
        }
Exemplo n.º 8
0
 /// <summary>
 /// このフィルタクラスタに所属するフィルタについて、フィルタ条件に合致するかの判定を行います。<para />
 /// Negateは内部で考慮されます。<para />
 /// フィルタが一つもない場合は、U=∅のときの∀(AND)、∃(OR)のBoolean値に準じます。<para />
 /// (ANDのとき:TRUE ORのとき:FALSE)
 /// </summary>
 /// <param name="status">フィルタテストするステータス</param>
 /// <returns>ステータスがフィルタに合致するか</returns>
 public bool Filter(TwitterStatusBase status)
 {
     if (_filters != null)
     {
         foreach (var f in _filters)
         {
             // ANDのとき => FALSEに出会ったらFALSEを返す
             // ORのとき => TRUEに出会ったらTRUEを返す 
             if (f.Filter(status) != ConcatenateAnd)
                 return ConcatenateAnd == Negate;
         }
     }
     // ANDのとき => FALSEに出会っていないのでTRUEを返す
     // ORのとき => TRUEに出会っていないのでFALSEを返す
     return ConcatenateAnd == !Negate;
 }
Exemplo n.º 9
0
        protected override bool FilterStatus(Dulcet.Twitter.TwitterStatusBase status)
        {
            var ts = status as TwitterStatus;

            if (ts != null && ts.RetweetedOriginal != null && !acceptBlocking)
            {
                return(AccountStorage.Accounts.Where(i => Match(i.ScreenName, needle))
                       .Any(i => i.IsFollowing(status.User.NumericId)) &&
                       AccountStorage.Accounts.Where(i => Match(i.ScreenName, needle))
                       .All(i => !i.IsBlocking(ts.RetweetedOriginal.User.NumericId)));
            }
            else
            {
                return(AccountStorage.Accounts.Where(i => Match(i.ScreenName, needle))
                       .Any(i => i.IsFollowing(status.User.NumericId)));
            }
        }
Exemplo n.º 10
0
 protected override bool FilterStatus(Dulcet.Twitter.TwitterStatusBase status)
 {
     var s = status as TwitterStatus;
     if (s == null)
     {
         var d = status as TwitterDirectMessage;
         if (d == null)
             return false;
         else
             return MatchingUtil.MatchAccount(d.Recipient.ScreenName, needle) || MatchingUtil.MatchAccount(d.Sender.ScreenName, needle);
     }
     else
     {
         return AccountStorage.Accounts
             .Where(i => MatchingUtil.MatchAccount(i.ScreenName, needle))
             .Any(i => IsMemberOfTimeline(s, i));
     }
 }
Exemplo n.º 11
0
        protected override bool FilterStatus(Dulcet.Twitter.TwitterStatusBase status)
        {
            // conversation control
            var vm = TweetStorage.Get(status.Id);

            if (status is TwitterDirectMessage)
            {
                var dm = (TwitterDirectMessage)status;
                return
                    ((dm.Sender.ScreenName.Equals(user1, StringComparison.CurrentCultureIgnoreCase) &&
                      dm.Recipient.ScreenName.Equals(user2, StringComparison.CurrentCultureIgnoreCase)) ||
                     (dm.Sender.ScreenName.Equals(user2, StringComparison.CurrentCultureIgnoreCase) &&
                      dm.Recipient.ScreenName.Equals(user1, StringComparison.CurrentCultureIgnoreCase)));
            }
            else
            {
                if (!status.User.ScreenName.Equals(user1, StringComparison.CurrentCultureIgnoreCase) &&
                    !status.User.ScreenName.Equals(user2, StringComparison.CurrentCultureIgnoreCase))
                {
                    return(false);
                }

                // ここおかしい, @が入る
                // あとユーザー名マッチングを使えるように
                if (RegularExpressions.AtRegex.Matches(status.Text).Cast <Match>()
                    .Any(m => m.Value.Equals("@" + user1, StringComparison.CurrentCultureIgnoreCase) ||
                         m.Value.Equals("@" + user2, StringComparison.CurrentCultureIgnoreCase)))
                {
                    return(true);
                }
                if (vm != null && vm.InReplyFroms.Select(id => TweetStorage.Get(id))
                    .Where(irvm => irvm != null)
                    .Any(irvm => irvm.Status.User.ScreenName.Equals(user1, StringComparison.CurrentCultureIgnoreCase) ||
                         irvm.Status.User.ScreenName.Equals(user2, StringComparison.CurrentCultureIgnoreCase)))
                {
                    return(true);
                }
                else
                {
                    return(false);
                }
            }
        }
Exemplo n.º 12
0
 protected override bool FilterStatus(TwitterStatusBase status)
 {
     if (this._failed)
     {
         return false;
     }
     try
     {
         return this._compiled.Value(status);
     }
     catch
     {
         this._failed = true;
         throw;
     }
 }
Exemplo n.º 13
0
 /// <summary>
 /// ステータスのプリプロセッシング
 /// </summary>
 private static void PreProcess(TwitterStatusBase status)
 {
     try
     {
         if (status.Entities != null)
         {
             // extracting t.co
             var urls = status.Entities.GetChildNode("urls");
             if (urls != null)
             {
                 // indicesの始まりが遅い順に置換していく
                 urls.GetChildNodes("item")
                     .Where(i => i.GetChildNode("indices") != null)
                     .Where(i => i.GetChildNode("indices").GetChildValues("item") != null)
                     .OrderByDescending(i => i.GetChildNode("indices").GetChildValues("item")
                         .Select(s => int.Parse(s.Value)).First())
                     .ForEach(i =>
                 {
                     var expand = i.GetChildValue("expanded_url").Value;
                     if (String.IsNullOrWhiteSpace(expand))
                         expand = i.GetChildValue("url").Value;
                     if (!String.IsNullOrWhiteSpace(expand))
                     {
                         var indices = i.GetChildNode("indices").GetChildValues("item")
                             .Select(v => int.Parse(v.Value)).OrderBy(v => v).ToArray();
                         if (indices.Length == 2)
                         {
                             status.Text = status.Text.Substring(0, indices[0]) +
                                 expand + status.Text.Substring(indices[1]);
                         }
                     }
                 });
             }
         }
     }
     catch { }
 }
Exemplo n.º 14
0
 public static bool IsPublishedByRetweet(TwitterStatusBase status)
 {
     if (status == null) return false;
     var ss = status as TwitterStatus;
     return ss != null && ss.RetweetedOriginal != null;
 }
Exemplo n.º 15
0
 public static bool IsMentionOfMe(TwitterStatusBase status)
 {
     var tweet = status as TwitterStatus;
     // DMではなくて、リツイートでもないことを確認する
     if (tweet != null && tweet.RetweetedOriginal == null)
     {
         // リツイートステータス以外で、自分への返信を探す
         var matches = RegularExpressions.AtRegex.Matches(status.Text);
         if (matches.Count > 0 && matches.Cast<Match>().Select(m => m.Value)
                 .Where(s => AccountStorage.Contains(s)).FirstOrDefault() != null)
             return true;
     }
     return false;
 }
Exemplo n.º 16
0
 /// <summary>
 /// まだステータス情報が関連付けられていない場合に、ステータス情報を関連付けます。
 /// </summary>
 public void SetStatus(TwitterStatusBase status)
 {
     if (this.Status != null) return;
     if (status.Id != bindingId)
         throw new ArgumentException("ステータスIDが一致しません。");
     this.Status = status;
 }
Exemplo n.º 17
0
 public bool Equals(TwitterStatusBase status)
 {
     return(status != null && this.Id == status.Id);
 }
Exemplo n.º 18
0
 /// <summary>
 /// ステータスベースの登録処理
 /// </summary>
 private static TweetViewModel RegisterCore(TwitterStatusBase statusBase)
 {
     TweetViewModel viewModel;
     using (elockWrap.GetUpgradableReaderLock())
     {
         if (empties.TryGetValue(statusBase.Id, out viewModel))
         {
             // 既にViewModelが生成済み
             if (!viewModel.IsStatusInfoContains)
                 viewModel.SetStatus(statusBase);
             using (elockWrap.GetWriterLock())
             {
                 empties.Remove(statusBase.Id);
             }
         }
         else
         {
             // 全く初めて触れるステータス
             viewModel = new TweetViewModel(statusBase);
         }
     }
     if (ValidateTweet(viewModel))
     {
         // プリプロセッシング
         PreProcess(statusBase);
         bool delr = false;
         using (elockWrap.GetReaderLock())
         {
             delr = deleteReserveds.Contains(statusBase.Id);
         }
         if (!delr)
         {
             using (lockWrap.GetUpgradableReaderLock())
             {
                 if (dictionary.ContainsKey(statusBase.Id))
                 {
                     return viewModel; // すでにKrile内に存在する
                 }
                 else
                 {
                     using (lockWrap.GetWriterLock())
                     {
                         dictionary.Add(statusBase.Id, viewModel);
                     }
                     _count++;
                 }
             }
             Task.Factory.StartNew(() => RaiseStatusAdded(viewModel)).ContinueWith(_ =>
             {
                 // delay add
                 using (vmLockWrap.GetWriterLock())
                 {
                     viewmodels.Add(viewModel);
                 }
             });
         }
     }
     return viewModel;
 }
Exemplo n.º 19
0
 protected override bool FilterStatus(TwitterStatusBase status)
 {
     return FilterUser(status.User);
 }
Exemplo n.º 20
0
 /// <summary>
 /// 指定したツイートをこのフィルタを保持しているクラスタに再度通します。<para />
 /// 存在していないツイートがフィルタを通れば追加され、存在しているツイートがフィルタを通らなくなれば除去されます。
 /// </summary>
 protected void RaisePartialRequireReaccept(TwitterStatusBase tsb)
 {
     RequirePartialReaccept(tsb);
 }
Exemplo n.º 21
0
 protected override bool FilterStatus(Dulcet.Twitter.TwitterStatusBase status)
 {
     return(status is TwitterDirectMessage);
 }
Exemplo n.º 22
0
        protected override bool FilterStatus(Dulcet.Twitter.TwitterStatusBase status)
        {
            var s = status as TwitterStatus;

            return(s != null && s.RetweetedOriginal != null);
        }
Exemplo n.º 23
0
 protected override bool FilterStatus(Dulcet.Twitter.TwitterStatusBase status)
 {
     return(FilterUser(TwitterHelper.GetSuggestedUser(status)));
 }
Exemplo n.º 24
0
 public bool Equals(TwitterStatusBase status)
 {
     return status != null && this.Id == status.Id;
 }
Exemplo n.º 25
0
 protected override bool FilterStatus(TwitterStatusBase status)
 {
     var st = status as TwitterStatus;
     return st != null && this.Match(st.Source, this.needle, this.isCaseSensitive);
 }
Exemplo n.º 26
0
 /// <summary>
 /// フィルタを適用します。
 /// </summary>
 /// <returns>フィルタを通過したか</returns>
 public bool Filter(TwitterStatusBase status)
 {
     return FilterStatus(status) == !Negate;
 }
Exemplo n.º 27
0
 void f_RequirePartialReaccept(TwitterStatusBase tsb)
 {
     var tvm = TweetStorage.Register(tsb);
     if (tvm == null || !TweetStorage.ValidateTweet(tvm)) return;
     if (CheckFilters(tvm))
         AddTweet(tvm);
     else
         RemoveTweet(tvm);
 }
Exemplo n.º 28
0
 void filter_RequirePartialReaccept(TwitterStatusBase tsb)
 {
     this.RequirePartialReaccept(tsb);
 }
Exemplo n.º 29
0
 protected abstract bool FilterStatus(TwitterStatusBase status);
Exemplo n.º 30
0
 /// <summary>
 /// 受信したツイートを登録します。<para />
 /// 諸々の処理を自動で行います。
 /// </summary>
 public static TweetViewModel Register(TwitterStatusBase statusBase)
 {
     TweetViewModel robj;
     using (lockWrap.GetReaderLock())
     {
         if (dictionary.TryGetValue(statusBase.Id, out robj))
             return robj;
     }
     var status = statusBase as TwitterStatus;
     if (status != null)
     {
         return RegisterStatus(status);
     }
     else
     {
         var dmsg = statusBase as TwitterDirectMessage;
         if (dmsg != null)
         {
             return RegisterDirectMessage(dmsg);
         }
         else
         {
             throw new InvalidOperationException("不明なステータスを受信しました: " + statusBase);
         }
     }
 }
Exemplo n.º 31
0
        /// <summary>
        /// ステータスのプリプロセッシング
        /// </summary>
        private static void PreProcess(TwitterStatusBase status)
        {
            try
            {
                if (status.Entities != null)
                {
                    // extracting t.co and official image
                    new[]
                    {
                        status.Entities.GetChildNode("urls"),
                        status.Entities.GetChildNode("media")
                    }
                        .Where(n => n != null)
                        .SelectMany(n => n.GetChildNodes("item"))
                        .Where(i => i.GetChildNode("indices") != null)
                        .Where(i => i.GetChildNode("indices").GetChildValues("item") != null)
                        .OrderByDescending(i => i.GetChildNode("indices").GetChildValues("item")
                            .Select(s => int.Parse(s.Value)).First())
                        .ForEach(i =>
                    {
                        String expand = null;
                        if (i.GetChildValue("media_url") != null)
                            expand = i.GetChildValue("media_url").Value;
                        if (String.IsNullOrWhiteSpace(expand) && i.GetChildValue("expanded_url") != null)
                            expand = i.GetChildValue("expanded_url").Value;
                        if (String.IsNullOrWhiteSpace(expand) && i.GetChildValue("url") != null)
                            expand = i.GetChildValue("url").Value;
                        if (!String.IsNullOrWhiteSpace(expand))
                        {
                            var indices = i.GetChildNode("indices").GetChildValues("item")
                                .Select(v => int.Parse(v.Value)).OrderBy(v => v).ToArray();
                            if (indices.Length == 2)
                            {
                                //一旦内容を元の状態に戻す(参照:XmlParser.ParseString)
                                string orgtext = status.Text.Replace("&", "&amp;").Replace(">", "&gt;").Replace("<", "&lt;");

                                // Considering surrogate pairs and Combining Character.
                                string text =
                                    SubstringForSurrogatePaire(orgtext, 0, indices[0])
                                    + expand
                                    + SubstringForSurrogatePaire(orgtext, indices[1]);

                                //再度処理を施す
                                status.Text = text.Replace("&lt;", "<").Replace("&gt;", ">").Replace("&amp;", "&");
                            }
                        }
                    });
                }
            }
            catch { }
        }
Exemplo n.º 32
0
 protected override bool FilterStatus(Dulcet.Twitter.TwitterStatusBase status)
 {
     return(TraceId(status.Id));
 }