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); }
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); }
public static TwitterUser GetSuggestedUser(TwitterStatusBase status) { if (IsPublishedByRetweet(status)) return ((TwitterStatus)status).RetweetedOriginal.User; else return status.User; }
public TweetViewModel(TwitterStatusBase status) { if (status == null) throw new ArgumentNullException("status"); this.bindingId = status.Id; this.Status = status; }
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); } }
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)); }
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())); }
/// <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(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))); } }
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)); } }
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); } } }
protected override bool FilterStatus(TwitterStatusBase status) { if (this._failed) { return false; } try { return this._compiled.Value(status); } catch { this._failed = true; throw; } }
/// <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 { } }
public static bool IsPublishedByRetweet(TwitterStatusBase status) { if (status == null) return false; var ss = status as TwitterStatus; return ss != null && ss.RetweetedOriginal != null; }
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> /// まだステータス情報が関連付けられていない場合に、ステータス情報を関連付けます。 /// </summary> public void SetStatus(TwitterStatusBase status) { if (this.Status != null) return; if (status.Id != bindingId) throw new ArgumentException("ステータスIDが一致しません。"); this.Status = status; }
public bool Equals(TwitterStatusBase status) { return(status != null && this.Id == status.Id); }
/// <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; }
protected override bool FilterStatus(TwitterStatusBase status) { return FilterUser(status.User); }
/// <summary> /// 指定したツイートをこのフィルタを保持しているクラスタに再度通します。<para /> /// 存在していないツイートがフィルタを通れば追加され、存在しているツイートがフィルタを通らなくなれば除去されます。 /// </summary> protected void RaisePartialRequireReaccept(TwitterStatusBase tsb) { RequirePartialReaccept(tsb); }
protected override bool FilterStatus(Dulcet.Twitter.TwitterStatusBase status) { return(status is TwitterDirectMessage); }
protected override bool FilterStatus(Dulcet.Twitter.TwitterStatusBase status) { var s = status as TwitterStatus; return(s != null && s.RetweetedOriginal != null); }
protected override bool FilterStatus(Dulcet.Twitter.TwitterStatusBase status) { return(FilterUser(TwitterHelper.GetSuggestedUser(status))); }
public bool Equals(TwitterStatusBase status) { return status != null && this.Id == status.Id; }
protected override bool FilterStatus(TwitterStatusBase status) { var st = status as TwitterStatus; return st != null && this.Match(st.Source, this.needle, this.isCaseSensitive); }
/// <summary> /// フィルタを適用します。 /// </summary> /// <returns>フィルタを通過したか</returns> public bool Filter(TwitterStatusBase status) { return FilterStatus(status) == !Negate; }
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); }
void filter_RequirePartialReaccept(TwitterStatusBase tsb) { this.RequirePartialReaccept(tsb); }
protected abstract bool FilterStatus(TwitterStatusBase status);
/// <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); } } }
/// <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 { } }
protected override bool FilterStatus(Dulcet.Twitter.TwitterStatusBase status) { return(TraceId(status.Id)); }