/// <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); } } }
public TweetViewModel(TwitterStatusBase status) { if (status == null) { throw new ArgumentNullException("status"); } this.bindingId = status.Id; this.Status = status; }
/// <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("&", "&").Replace(">", ">").Replace("<", "<"); // Considering surrogate pairs and Combining Character. string text = SubstringForSurrogatePaire(orgtext, 0, indices[0]) + expand + SubstringForSurrogatePaire(orgtext, indices[1]); //再度処理を施す status.Text = text.Replace("<", "<").Replace(">", ">").Replace("&", "&"); } } }); } } catch { } }
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))); }
public static bool IsPublishedByRetweet(TwitterStatusBase status) { if (status == null) { return(false); } var ss = status as TwitterStatus; return(ss != null && ss.RetweetedOriginal != null); }
public static TwitterUser GetSuggestedUser(TwitterStatusBase status) { if (IsPublishedByRetweet(status)) { return(((TwitterStatus)status).RetweetedOriginal.User); } else { return(status.User); } }
/// <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; } }
/// <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; } }
protected override bool FilterStatus(TwitterStatusBase status) { if (this._failed) { return(false); } try { return(this._compiled.Value(status)); } catch { this._failed = true; throw; } }
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); } }
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); }
/// <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); }
protected override bool FilterStatus(TwitterStatusBase status) { var st = status as TwitterStatus; return(st != null && this.Match(st.Source, this.needle, this.isCaseSensitive)); }
void filter_RequirePartialReaccept(TwitterStatusBase tsb) { this.RequirePartialReaccept(tsb); }
/// <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); }
/// <summary> /// 指定したツイートをこのフィルタを保持しているクラスタに再度通します。<para /> /// 存在していないツイートがフィルタを通れば追加され、存在しているツイートがフィルタを通らなくなれば除去されます。 /// </summary> protected void RaisePartialRequireReaccept(TwitterStatusBase tsb) { RequirePartialReaccept(tsb); }
protected abstract bool FilterStatus(TwitterStatusBase status);
/// <summary> /// フィルタを適用します。 /// </summary> /// <returns>フィルタを通過したか</returns> public bool Filter(TwitterStatusBase status) { return(FilterStatus(status) == !Negate); }
protected override bool FilterStatus(TwitterStatusBase status) { return(FilterUser(status.User)); }