private static void RemoveTweetSink(AccountInfo info, long tweetId) { var tweet = ApiHelper.ExecApi(() => info.DestroyStatus(tweetId)); if (tweet != null) { if (tweet.Id != tweetId) { NotifyStorage.Notify("削除には成功しましたが、ツイートIDが一致しません。(" + tweetId.ToString() + " -> " + tweet.Id.ToString() + ")"); } else { if (tweet.InReplyToStatusId != 0) { var s = TweetStorage.Get(tweet.InReplyToStatusId); if (s != null) { s.RemoveInReplyToThis(tweetId); } } TweetStorage.Remove(tweetId); NotifyStorage.Notify("削除しました:" + tweet.ToString()); } } else { NotifyStorage.Notify("ツイートを削除できませんでした(@" + info.ScreenName + ")"); } }
private void ReceiveTimeline() { if (User == null || User.TwitterUser == null) { return; } IsStandby = false; Task.Factory.StartNew(() => { try { var acc = AccountStorage.GetRandom(a => a.Followings.Contains(this.User.TwitterUser.NumericId), true); var tweets = InjectionPoint.UnfoldTimeline(i => acc.GetUserTimeline(userId: this.User.TwitterUser.NumericId, count: 100, includeRts: true, page: i), 100, 5); if (tweets != null) { tweets.ForEach(t => TweetStorage.Register(t)); } } catch (Exception e) { ExceptionStorage.Register(e, ExceptionCategory.TwitterError, "ユーザータイムラインを受信できませんでした: @" + this.User.TwitterUser.ScreenName, ReceiveTimeline); } finally { IsStandby = true; } }); }
public TwitterWorker(TweetStorage storage) { _storage = storage; _stream = Stream.CreateFilteredStream(); _stream.MatchingTweetAndLocationReceived += _stream_MatchingTweetAndLocationReceived; }
private void RemoveOldTweets() { Task.Factory.StartNew(() => { TweetStorage.GetAll(tvm => (DateTime.Now - tvm.CreatedAt).TotalHours > 12) .ForEach(t => TweetStorage.Remove(t.bindingId)); }); }
private void Ok() { // remove from krile Setting.Instance.TimelineFilteringProperty.MuteFilterCluster = Setting.Instance.TimelineFilteringProperty.MuteFilterCluster.Join(this.GenerateConfiguredFilter()); TweetStorage.UpdateMute(); this.Messenger.Raise(new WindowActionMessage("WindowAction", WindowAction.Close)); }
public void Apply() { Setting.Instance.TimelineFilteringProperty.MuteFilterCluster = new FilterCluster() { Filters = this._filterEditorViewModel.RootFilters }; TweetStorage.UpdateMute(); Setting.Instance.TimelineFilteringProperty.MuteBlockedUsers = this._muteBlockedUsers; }
protected override bool FilterStatus(Dulcet.Twitter.TwitterStatusBase status) { var vm = TweetStorage.Get(status.Id); if (vm == null) { return(false); } return(vm.RetweetedUsers.Any(u => Match(u.TwitterUser.ScreenName, needle))); }
protected override bool FilterStatus(Dulcet.Twitter.TwitterStatusBase status) { var ts = TweetStorage.Get(status.Id); if (ts == null) { return(false); } return(this.Range.Check(ts.FavoredUsers.Count())); }
private static void UnretweetSink(IEnumerable <AccountInfo> infos, TweetViewModel status) { var ts = status.Status as TwitterStatus; if (ts == null) { NotifyStorage.Notify("DirectMessageはUnretweetできません。"); return; } if (ts.RetweetedOriginal != null) { status = TweetStorage.Get(ts.RetweetedOriginal.Id, true); } if (status == null) { NotifyStorage.Notify("Retweet オリジナルデータが見つかりません。"); return; } bool success = true; Parallel.ForEach(infos, d => { // リツイート状態更新 var ud = d.UserViewModel; if (ud != null) { status.RegisterRetweeted(ud); } try { unretweetInjection.Execute(new Tuple <AccountInfo, TweetViewModel>(d, status)); } catch (Exception ex) { if (ud != null) { status.RemoveRetweeted(ud); } success = false; NotifyStorage.Notify("Retweetキャンセルに失敗しました: @" + d.ScreenName); if (!(ex is ApplicationException)) { ExceptionStorage.Register(ex, ExceptionCategory.TwitterError, "Retweetキャンセル操作時にエラーが発生しました"); } } }); if (success) { NotifyStorage.Notify("Retweetをキャンセルしました: @" + status.Status.User.ScreenName + ": " + status.Status.Text); } }
private void ReturnToBox() { parent.SetOpenText(true, true); if (this.inReplyToId != 0 && TweetStorage.Contains(this.inReplyToId) == TweetExistState.Exists) { parent.SetInReplyTo(TweetStorage.Get(this.inReplyToId)); } parent.SetText(this.body); parent.OverrideTarget(new[] { this.accountInfo }); Remove(); }
private static void AddUnderControlled(AccountInfo info) { if (underControls.ContainsKey(info)) { NotifyStorage.Notify("[規制管理: @" + info.ScreenName + " は規制されています。解除予想時刻: " + underControls[info].ToString("HH:mm:ss")); return; } var timestamp = DateTime.Now.Subtract(TwitterDefine.UnderControlTimespan); // APIを利用してツイートを遡り受信 var notify = NotifyStorage.NotifyManually("[規制管理: @" + info.ScreenName + " の直近のツイートを受信しています...]"); try { ApiHelper.ExecApi(() => info.GetUserTimeline(count: 150, includeRts: true)) .Guard() .ForEach(i => TweetStorage.Register(i)); notify.Message = "[規制管理:規制開始時刻を割り出しています...]"; // 127tweet/3hours var originate = TweetStorage.GetAll( t => t.Status.User.ScreenName == info.ScreenName && DateTime.Now.Subtract(t.CreatedAt) < TwitterDefine.UnderControlTimespan) .OrderByDescending((t) => t.Status.CreatedAt) .Skip(TwitterDefine.UnderControlCount - 1) .FirstOrDefault(); if (originate == null) { originate = TweetStorage.GetAll( t => t.Status.User.ScreenName == info.ScreenName && DateTime.Now.Subtract(t.CreatedAt) < TwitterDefine.UnderControlTimespan) .OrderByDescending((t) => t.Status.CreatedAt) .LastOrDefault(); } if (originate == null) { NotifyStorage.Notify("[規制管理: @" + info.ScreenName + " はPOST規制されていますが、解除時刻を予想できません。しばらく置いて試してみてください。]"); } else { var release = (originate.Status.CreatedAt + TwitterDefine.UnderControlTimespan); NotifyStorage.Notify("[規制管理: @" + info.ScreenName + " はPOST規制されています。解除予想時刻は " + release.ToString("HH:mm:ss") + " です。]"); underControls.AddOrUpdate(info, release); OnOnUnderControlChanged(new UnderControlEventArgs(info, true)); } } finally { notify.Dispose(); } }
private static void TweetSpeedUpdateSink(object o) { // 鳥人 var morigin = (DateTime.Now - new TimeSpan(0, 1, 0)); TweetSpeedPerMin = TweetStorage.GetAll((t) => t.CreatedAt > morigin).Count(); var horigin = (DateTime.Now - new TimeSpan(1, 0, 0)); TweetSpeedPerHour = TweetStorage.GetAll((t) => t.CreatedAt > horigin).Count(); System.Diagnostics.Debug.WriteLine(morigin.ToString() + " / " + horigin.ToString()); OnTweetSpeedUpdated(EventArgs.Empty); }
private static void UnfavTweetSink(IEnumerable <AccountInfo> infos, TweetViewModel status) { var ts = status.Status as TwitterStatus; if (ts == null) { NotifyStorage.Notify("DirectMessageはFavできません。"); return; } if (ts.RetweetedOriginal != null) { status = TweetStorage.Get(ts.RetweetedOriginal.Id, true); } if (status == null) { NotifyStorage.Notify("Unfav 対象ステータスが見つかりません。"); return; } bool success = true; Parallel.ForEach(infos, (d) => { var ud = d.UserViewModel; // ふぁぼり状態更新 if (ud != null) { status.RemoveFavored(ud); } try { unfavoriteInjection.Execute(new Tuple <AccountInfo, TweetViewModel>(d, status)); } catch (Exception ex) { success = false; if (ud != null) { status.RegisterFavored(ud); } NotifyStorage.Notify("Unfavに失敗しました: @" + d.ScreenName); if (!(ex is ApplicationException)) { ExceptionStorage.Register(ex, ExceptionCategory.TwitterError, "Unfav操作時にエラーが発生しました"); } } }); if (success) { NotifyStorage.Notify("Unfavしました: @" + status.Status.User.ScreenName + ": " + status.Status.Text); } }
private static void UpdateDirectMessageSink(AccountInfo info, string target, string body) { var status = info.SendDirectMessage(target, body); if (status == null || status.Id == 0) { throw new WebException("Timeout or failure sending tweet.", WebExceptionStatus.Timeout); } TweetStorage.Register(status); NotifyStorage.Notify("DMを送信しました: @" + info.ScreenName + " -> @" + target + ": " + body); }
private static void UpdateTweetSink(AccountInfo info, string text, long?inReplyToId = null) { var status = info.UpdateStatus(text, inReplyToId); if (status == null || status.Id == 0) { throw new WebException("Timeout or failure sending tweet.", WebExceptionStatus.Timeout); } TweetStorage.Register(status); NotifyStorage.Notify("ツイートしました:@" + info.ScreenName + ": " + text); }
private static void RemoveRetweetCore(AccountInfo d, TweetViewModel status) { // リツイートステータスの特定 var rts = TweetStorage.GetAll(vm => vm.Status.User.ScreenName == d.ScreenName && vm.Status is TwitterStatus && ((TwitterStatus)vm.Status).RetweetedOriginal != null && ((TwitterStatus)vm.Status).RetweetedOriginal.Id == status.Status.Id).FirstOrDefault(); if (rts == null || ApiHelper.ExecApi(() => d.DestroyStatus(rts.Status.Id) == null)) { throw new ApplicationException(); } }
private string Uniquify(String body) { var tweets = TweetStorage.GetAll(vm => vm.Status.User.ScreenName == accountInfo.ScreenName) .OrderByDescending(t => t.CreatedAt) .Take(10) .ToArray(); while (tweets.Any(t => t.Text == body) && body.Length < TwitterDefine.TweetMaxLength) { body += "";//ZWJ } return(body); }
public void InvalidateCache() { if (DispatcherHelper.UIDispatcher.CheckAccess()) { // ディスパッチャ スレッドではInvalidateCacheを行わない throw new InvalidOperationException("Can't invalidate cache on the Dispatcher thread."); } this._tweetsSource.Clear(); TweetStorage.GetAll(vm => CheckFilters(vm)) .Select(tvm => new TabDependentTweetViewModel(tvm, this.Parent)) .Block(TwitterDefine.TimelineDispatchBlockCount) .ForEach(t => this._tweetsSource.AddRangeVolatile(t)); this.Commit(); }
public bool RemoveFavored(UserViewModel user) { lock (_favoreds) { if (user == null || this._favoreds.Select(s => s.TwitterUser.ScreenName).FirstOrDefault(s => s == user.TwitterUser.ScreenName) == null) { return(false); } this._favoreds.Remove(user); } TweetStorage.NotifyTweetStateChanged(this); // RaisePropertyChanged(() => FavoredUsers); RaisePropertyChanged(() => FavoredUsersCount); RaisePropertyChanged(() => IsFavorExists); RaisePropertyChanged(() => IsFavored); return(true); }
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 sealed override void DoWork() { try { var received = (GetTweets() ?? new TwitterStatusBase[0]).ToArray(); previousReceived = DateTime.Now; // var newbiesCount = received.Count(s => TweetStorage.Contains(s.Id) == TweetExistState.Unreceived); received.ForEach(s => TweetStorage.Register(s)); var pivotarray = received.Take(TwitterDefine.IntervalLookPrevious).ToArray(); var pivot = pivotarray.LastOrDefault(); var newest = received.FirstOrDefault(); if (pivot != null && newest != null) { // newbiesRate = (double)newbiesCount / received.Length; if (newbiesRate < TwitterDefine.MinNewbiesRate) { newbiesRate = TwitterDefine.MinNewbiesRate; } timesPerTweet = (double)(newest.CreatedAt.Subtract(pivot.CreatedAt)).TotalMilliseconds / pivotarray.Length; if (timesPerTweet > TwitterDefine.TimesPerTweetMaximumValue) { timesPerTweet = TwitterDefine.TimesPerTweetMaximumValue; } } else { // 受信すべきタイムラインが無い // 受信レートを最小にして様子を見る newbiesRate = TwitterDefine.MinNewbiesRate; timesPerTweet = TwitterDefine.TimesPerTweetMaximumValue; } } catch (WebException ex) { ExceptionStorage.Register(ex, ExceptionCategory.TwitterError, "Twitterとの通信に失敗しました。"); } catch (IOException ioex) { ExceptionStorage.Register(ioex, ExceptionCategory.TwitterError, "ネットワークでエラーが発生しました。"); } catch (Exception ex) { ExceptionStorage.Register(ex, ExceptionCategory.InternalError, "ステータス受信時に内部エラーが発生しました。"); } }
public bool RegisterRetweeted(UserViewModel user) { lock (_retweeteds) { if (user == null || this._retweeteds.Select(s => s.TwitterUser.ScreenName) .FirstOrDefault(s => s == user.TwitterUser.ScreenName) != null) { return(false); } this._retweeteds.Add(user); } TweetStorage.NotifyTweetStateChanged(this); // RaisePropertyChanged(() => RetweetedUsers); RaisePropertyChanged(() => RetweetedUsersCount); RaisePropertyChanged(() => IsRetweetExists); RaisePropertyChanged(() => IsRetweeted); return(true); }
public static IEnumerable <TwitterStatusBase> UnfoldTimeline(Func <int, IEnumerable <TwitterStatusBase> > reader, int lengthThreshold, int maxDepth) { List <IEnumerable <TwitterStatusBase> > cache = new List <IEnumerable <TwitterStatusBase> >(); for (int i = 0; i < maxDepth; i++) { var status = ApiHelper.ExecApi(() => reader(i)).Guard().OrderByDescending(t => t.CreatedAt); cache.Add(status); if (status.Count() < lengthThreshold) { break; } if (!status.Take(1).Any(s => TweetStorage.Contains(s.Id) == TweetExistState.Unreceived)) { break; } } return(cache.Where(i => i != null).SelectMany(i => 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); } } }
private static void RemoveDMSink(AccountInfo info, long tweetId) { var tweet = ApiHelper.ExecApi(() => info.DestroyDirectMessage(tweetId)); if (tweet != null) { if (tweet.Id != tweetId) { NotifyStorage.Notify("削除には成功しましたが、ダイレクトメッセージIDが一致しません。(" + tweetId.ToString() + " -> " + tweet.Id.ToString() + ")"); } else { TweetStorage.Remove(tweetId); NotifyStorage.Notify("削除しました:" + tweet.ToString()); } } else { NotifyStorage.Notify("ダイレクトメッセージを削除できませんでした(@" + info.ScreenName + ")"); } }
private bool TraceId(long id) { var vm = TweetStorage.Get(id); if (vm == null || !vm.IsStatusInfoContains) { return(false); } if (vm.Status.Id == tracePoint) { return(true); } var ts = vm.Status as TwitterStatus; if (ts == null || ts.InReplyToStatusId == 0) { return(false); } else { return(TraceId(ts.InReplyToStatusId)); } }
public void Loaded() { KernelService.AddMenu("Import JSON", () => { var dialog = new OpenFileDialog(); dialog.Filter = "JSON Format|*.json|すべてのファイル|*.*"; dialog.Multiselect = true; var result = dialog.ShowDialog(); if (result.HasValue && result.Value) { Task.Factory.StartNew(() => { dialog.FileNames.AsParallel().ForAll(file => { var fileName = Path.GetFileName(file); using (var notify = NotifyStorage.NotifyManually(fileName + " を読み込んでいます")) { try { using (var reader = JsonReaderWriterFactory.CreateJsonReader(new FileStream(file, FileMode.Open, FileAccess.Read), XmlDictionaryReaderQuotas.Max)) { XElement.Load(reader).Elements() .Select(TwitterStatus.FromNode) .ForEach(s => TweetStorage.Register(s)); } } catch (Exception ex) { ExceptionStorage.Register(ex, ExceptionCategory.UserError, fileName + " を読み込めませんでした"); } } }); }); } }); }
public FilterStatusId(long pivot, bool getStatus) { this.Range = LongRange.FromPivotValue(pivot); if (getStatus) { if (TweetStorage.Contains(pivot) != TweetExistState.Exists) { Task.Factory.StartNew(() => { try { var status = ApiHelper.ExecApi(() => AccountStorage.GetRandom().GetStatus(pivot)); if (status != null) { TweetStorage.Register(status); RaisePartialRequireReaccept(status); } } catch { } }); } } }
public static bool IsMentionedThis(TweetViewModel tweetViewModel) { return(TweetStorage.GetAll(t => TwitterHelper.IsMyTweet(t)) .OfType <TwitterStatus>() .Any(t => t.InReplyToStatusId == tweetViewModel.bindingId)); }
public MainWindow() { InitializeComponent(); var askForKeywords = new InputDialog(); askForKeywords.Content = "Schlüsselwörter ?"; askForKeywords.WindowTitle = "Bitte Schlüsselwörter eingaben!"; askForKeywords.MainInstruction = "Bitte Schlüsselwörter eingeben einzelne mit , trennen!"; if (askForKeywords.ShowDialog() == System.Windows.Forms.DialogResult.OK) { var keywords = askForKeywords.Input; if (string.IsNullOrWhiteSpace(keywords)) { _keywords.Add("twitter"); } else { var split = keywords.Split(','); foreach (var str in split) { _keywords.Add(str.Trim()); } } } else { Thread.CurrentThread.Abort(); } _tweetStorage = new TweetStorage(); _twitterWrk = new TwitterWorker(_tweetStorage); _twitterWrk.SetCredentials(Twitter_userAccessToken, Twitter_userAccessSecret, Twitter_consumerKey, Twitter_consumerSecret); foreach (var keyword in _keywords) { _twitterWrk.AddTrack(keyword); } _datumBoxWrks = new List <ClassifyWorker>(); initViewModel(); _twitterWrk.StartStream(); for (var i = 0; i < 1; i++) { var worker = new ClassifyWorker(new StanfordCoreNLP(), _tweetStorage); worker.StartWorkAsync(_appClosingToken.Token); _datumBoxWrks.Add(worker); } DataContext = this; WindowStartupLocation = System.Windows.WindowStartupLocation.CenterScreen; WindowState = System.Windows.WindowState.Maximized; _guiTimer = new Timer(UpdateGui, null, 1000, 1000); }