Beispiel #1
0
        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;
        }
Beispiel #4
0
 private void RemoveOldTweets()
 {
     Task.Factory.StartNew(() =>
     {
         TweetStorage.GetAll(tvm => (DateTime.Now - tvm.CreatedAt).TotalHours > 12)
         .ForEach(t => TweetStorage.Remove(t.bindingId));
     });
 }
Beispiel #5
0
 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));
 }
Beispiel #6
0
 public void Apply()
 {
     Setting.Instance.TimelineFilteringProperty.MuteFilterCluster =
         new FilterCluster()
     {
         Filters = this._filterEditorViewModel.RootFilters
     };
     TweetStorage.UpdateMute();
     Setting.Instance.TimelineFilteringProperty.MuteBlockedUsers = this._muteBlockedUsers;
 }
Beispiel #7
0
        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)));
        }
Beispiel #8
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.FavoredUsers.Count()));
        }
Beispiel #9
0
        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);
            }
        }
Beispiel #10
0
 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();
 }
Beispiel #11
0
        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();
            }
        }
Beispiel #12
0
        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);
        }
Beispiel #13
0
        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);
            }
        }
Beispiel #14
0
        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);
        }
Beispiel #15
0
        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);
        }
Beispiel #16
0
        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();
            }
        }
Beispiel #17
0
        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);
        }
Beispiel #18
0
        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();
        }
Beispiel #19
0
 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);
 }
Beispiel #20
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);
            }
        }
Beispiel #21
0
 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, "ステータス受信時に内部エラーが発生しました。");
     }
 }
Beispiel #22
0
 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);
 }
Beispiel #23
0
        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));
        }
Beispiel #24
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);
                }
            }
        }
Beispiel #25
0
        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 + ")");
            }
        }
Beispiel #26
0
        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));
            }
        }
Beispiel #27
0
 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 + " を読み込めませんでした");
                         }
                     }
                 });
             });
         }
     });
 }
Beispiel #28
0
        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 { }
                    });
                }
            }
        }
Beispiel #29
0
 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);
        }