Esempio n. 1
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);
                }
            }
        }
Esempio n. 2
0
 public TweetViewModel(TwitterStatusBase status)
 {
     if (status == null)
     {
         throw new ArgumentNullException("status");
     }
     this.bindingId = status.Id;
     this.Status    = status;
 }
Esempio n. 3
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 { }
        }
Esempio n. 4
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)));
        }
Esempio n. 5
0
        public static bool IsPublishedByRetweet(TwitterStatusBase status)
        {
            if (status == null)
            {
                return(false);
            }
            var ss = status as TwitterStatus;

            return(ss != null && ss.RetweetedOriginal != null);
        }
Esempio n. 6
0
 public static TwitterUser GetSuggestedUser(TwitterStatusBase status)
 {
     if (IsPublishedByRetweet(status))
     {
         return(((TwitterStatus)status).RetweetedOriginal.User);
     }
     else
     {
         return(status.User);
     }
 }
Esempio n. 7
0
 /// <summary>
 /// まだステータス情報が関連付けられていない場合に、ステータス情報を関連付けます。
 /// </summary>
 public void SetStatus(TwitterStatusBase status)
 {
     if (this.Status != null)
     {
         return;
     }
     if (status.Id != bindingId)
     {
         throw new ArgumentException("ステータスIDが一致しません。");
     }
     this.Status = status;
 }
 /// <summary>
 /// Create TwitterStreamingElement
 /// </summary>
 public TwitterStreamingElement(TwitterStatusBase tbase)
 {
     this.Status = tbase;
     this.SourceUser = tbase.User;
     var tstatus = tbase as TwitterStatus;
     if (tstatus != null)
     {
         this.Kind = ElementKind.Status;
     }
     else
     {
         this.Kind = ElementKind.DirectMessage;
     }
 }
Esempio n. 9
0
        /// <summary>
        /// Create StreamingEvent
        /// </summary>
        public StreamingEvent(TwitterStatusBase tbase)
        {
            this.Status     = tbase;
            this.SourceUser = tbase.User;
            var tstatus = tbase as TwitterStatus;

            if (tstatus != null)
            {
                this.Kind = ElementKind.Status;
            }
            else
            {
                this.Kind = ElementKind.DirectMessage;
            }
        }
Esempio n. 10
0
 protected override bool FilterStatus(TwitterStatusBase status)
 {
     if (this._failed)
     {
         return(false);
     }
     try
     {
         return(this._compiled.Value(status));
     }
     catch
     {
         this._failed = true;
         throw;
     }
 }
Esempio n. 11
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);
            }
        }
Esempio n. 12
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);
        }
Esempio n. 13
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);
 }
Esempio n. 14
0
        protected override bool FilterStatus(TwitterStatusBase status)
        {
            var st = status as TwitterStatus;

            return(st != null && this.Match(st.Source, this.needle, this.isCaseSensitive));
        }
Esempio n. 15
0
 void filter_RequirePartialReaccept(TwitterStatusBase tsb)
 {
     this.RequirePartialReaccept(tsb);
 }
Esempio n. 16
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);
        }
Esempio n. 17
0
 /// <summary>
 /// 指定したツイートをこのフィルタを保持しているクラスタに再度通します。<para />
 /// 存在していないツイートがフィルタを通れば追加され、存在しているツイートがフィルタを通らなくなれば除去されます。
 /// </summary>
 protected void RaisePartialRequireReaccept(TwitterStatusBase tsb)
 {
     RequirePartialReaccept(tsb);
 }
Esempio n. 18
0
 protected abstract bool FilterStatus(TwitterStatusBase status);
Esempio n. 19
0
 /// <summary>
 /// フィルタを適用します。
 /// </summary>
 /// <returns>フィルタを通過したか</returns>
 public bool Filter(TwitterStatusBase status)
 {
     return(FilterStatus(status) == !Negate);
 }
Esempio n. 20
0
 protected override bool FilterStatus(TwitterStatusBase status)
 {
     return(FilterUser(status.User));
 }