Ejemplo n.º 1
0
        private void GetTimelineWorker_DoWork(object sender, DoWorkEventArgs e)
        {
            BackgroundWorker bw = (BackgroundWorker)sender;
            if (bw.CancellationPending || MyCommon._endingFlag)
            {
                e.Cancel = true;
                return;
            }

            Thread.CurrentThread.Priority = ThreadPriority.BelowNormal;

            MyApplication.InitCulture();

            string ret = "";
            GetWorkerResult rslt = new GetWorkerResult();

            bool read = !this._cfgCommon.UnreadManage;
            if (_initial && this._cfgCommon.UnreadManage) read = this._cfgCommon.Read;

            GetWorkerArg args = (GetWorkerArg)e.Argument;

            if (!CheckAccountValid())
            {
                rslt.retMsg = "Auth error. Check your account";
                rslt.type = MyCommon.WORKERTYPE.ErrorState;  //エラー表示のみ行ない、後処理キャンセル
                rslt.tName = args.tName;
                e.Result = rslt;
                return;
            }

            bw.ReportProgress(0, ""); //Notifyアイコンアニメーション開始

            switch (args.type)
            {
                case MyCommon.WORKERTYPE.Timeline:
                case MyCommon.WORKERTYPE.Reply:
                    bw.ReportProgress(50, MakeStatusMessage(args, false));
                    ret = tw.GetTimelineApi(read, args.type, args.page == -1, _initial);
                    //新着時未読クリア
                    if (string.IsNullOrEmpty(ret) && args.type == MyCommon.WORKERTYPE.Timeline && this._cfgCommon.ReadOldPosts)
                        _statuses.SetRead();
                    //振り分け
                    rslt.addCount = _statuses.DistributePosts();
                    break;
                case MyCommon.WORKERTYPE.DirectMessegeRcv:    //送信分もまとめて取得
                    bw.ReportProgress(50, MakeStatusMessage(args, false));
                    ret = tw.GetDirectMessageApi(read, MyCommon.WORKERTYPE.DirectMessegeRcv, args.page == -1);
                    if (string.IsNullOrEmpty(ret)) ret = tw.GetDirectMessageApi(read, MyCommon.WORKERTYPE.DirectMessegeSnt, args.page == -1);
                    rslt.addCount = _statuses.DistributePosts();
                    break;

                case MyCommon.WORKERTYPE.FavAdd:
                {
                    //スレッド処理はしない
                    TabClass tab;
                    if (_statuses.Tabs.TryGetValue(args.tName, out tab))
                    {
                        for (int i = 0; i <= args.ids.Count - 1; i++)
                        {
                            var post = tab.Posts[args.ids[i]];

                            args.page = i + 1;
                            bw.ReportProgress(50, MakeStatusMessage(args, false));
                            if (!post.IsFav)
                            {
                                if (post.RetweetedId == null)
                                    ret = tw.PostFavAdd(post.StatusId);
                                else
                                    ret = tw.PostFavAdd(post.RetweetedId.Value);

                                if (ret.Length == 0)
                                {
                                    args.sIds.Add(post.StatusId);
                                    post.IsFav = true;    //リスト再描画必要
                                    _favTimestamps.Add(DateTime.Now);
                                    if (string.IsNullOrEmpty(post.RelTabName))
                                    {
                                        //検索,リストUserTimeline.Relatedタブからのfavは、favタブへ追加せず。それ以外は追加
                                        _statuses.GetTabByType(MyCommon.TabUsageType.Favorites).Add(post.StatusId, post.IsRead, false);
                                    }
                                    else
                                    {
                                        //検索,リスト,UserTimeline.Relatedタブからのfavで、TLでも取得済みならfav反映
                                        if (_statuses.ContainsKey(post.StatusId))
                                        {
                                            PostClass postTl = _statuses[post.StatusId];
                                            postTl.IsFav = true;
                                            _statuses.GetTabByType(MyCommon.TabUsageType.Favorites).Add(postTl.StatusId, postTl.IsRead, false);
                                        }
                                    }
                                    //検索,リスト,UserTimeline,Relatedの各タブに反映
                                    foreach (TabClass tb in _statuses.GetTabsByType(MyCommon.TabUsageType.PublicSearch | MyCommon.TabUsageType.Lists | MyCommon.TabUsageType.UserTimeline | MyCommon.TabUsageType.Related))
                                    {
                                        if (tb.Contains(post.StatusId)) tb.Posts[post.StatusId].IsFav = true;
                                    }
                                }
                            }
                        }
                    }
                    rslt.sIds = args.sIds;
                    break;
                }

                case MyCommon.WORKERTYPE.FavRemove:
                {
                    //スレッド処理はしない
                    TabClass tab;
                    if (_statuses.Tabs.TryGetValue(args.tName, out tab))
                    {
                        for (int i = 0; i <= args.ids.Count - 1; i++)
                        {
                            var post = tab.Posts[args.ids[i]];

                            args.page = i + 1;
                            bw.ReportProgress(50, MakeStatusMessage(args, false));
                            if (post.IsFav)
                            {
                                if (post.RetweetedId == null)
                                    ret = tw.PostFavRemove(post.StatusId);
                                else
                                    ret = tw.PostFavRemove(post.RetweetedId.Value);

                                if (ret.Length == 0)
                                {
                                    args.sIds.Add(post.StatusId);
                                    post.IsFav = false;    //リスト再描画必要
                                    if (_statuses.ContainsKey(post.StatusId)) _statuses[post.StatusId].IsFav = false;
                                    //検索,リスト,UserTimeline,Relatedの各タブに反映
                                    foreach (TabClass tb in _statuses.GetTabsByType(MyCommon.TabUsageType.PublicSearch | MyCommon.TabUsageType.Lists | MyCommon.TabUsageType.UserTimeline | MyCommon.TabUsageType.Related))
                                    {
                                        if (tb.Contains(post.StatusId)) tb.Posts[post.StatusId].IsFav = false;
                                    }
                                }
                            }
                        }
                    }
                    rslt.sIds = args.sIds;
                    break;
                }

                case MyCommon.WORKERTYPE.PostMessage:
                    bw.ReportProgress(200);
                    if (args.status.imagePath == null || args.status.imagePath.Length == 0 || string.IsNullOrEmpty(args.status.imagePath[0]))
                    {
                        ret = tw.PostStatus(args.status.status, args.status.inReplyToId);
                    }
                    else
                    {
                        var service = ImageSelector.GetService(args.status.imageService);
                        try
                        {
                            service.PostStatusAsync(args.status.status, args.status.inReplyToId, args.status.imagePath)
                                .Wait();
                        }
                        catch (AggregateException ex)
                        {
                            ret = ex.InnerException.Message;
                        }
                    }
                    bw.ReportProgress(300);
                    rslt.status = args.status;
                    break;
                case MyCommon.WORKERTYPE.Retweet:
                    bw.ReportProgress(200);
                    for (int i = 0; i <= args.ids.Count - 1; i++)
                    {
                        ret = tw.PostRetweet(args.ids[i], read);
                    }
                    bw.ReportProgress(300);
                    break;
                case MyCommon.WORKERTYPE.Follower:
                    bw.ReportProgress(50, Properties.Resources.UpdateFollowersMenuItem1_ClickText1);
                    try
                    {
                        tw.RefreshFollowerIds();
                    }
                    catch (WebApiException ex) { ret = ex.Message; }
                    break;
                case MyCommon.WORKERTYPE.NoRetweetIds:
                    try
                    {
                        tw.RefreshNoRetweetIds();
                    }
                    catch (WebApiException ex) { ret = ex.Message; }
                    break;
                case MyCommon.WORKERTYPE.Configuration:
                    try
                    {
                        this.tw.RefreshConfiguration();
                    }
                    catch (WebApiException ex) { ret = ex.Message; }
                    break;
                case MyCommon.WORKERTYPE.Favorites:
                    bw.ReportProgress(50, MakeStatusMessage(args, false));
                    ret = tw.GetFavoritesApi(read, args.type, args.page == -1);
                    rslt.addCount = _statuses.DistributePosts();
                    break;
                case MyCommon.WORKERTYPE.PublicSearch:
                    bw.ReportProgress(50, MakeStatusMessage(args, false));
                    if (string.IsNullOrEmpty(args.tName))
                    {
                        foreach (TabClass tb in _statuses.GetTabsByType(MyCommon.TabUsageType.PublicSearch))
                        {
                            //if (!string.IsNullOrEmpty(tb.SearchWords)) ret = tw.GetPhoenixSearch(read, tb, false);
                            if (!string.IsNullOrEmpty(tb.SearchWords)) ret = tw.GetSearch(read, tb, false);
                        }
                    }
                    else
                    {
                        TabClass tb = _statuses.GetTabByName(args.tName);
                        if (tb != null)
                        {
                            //ret = tw.GetPhoenixSearch(read, tb, false);
                            ret = tw.GetSearch(read, tb, false);
                            if (string.IsNullOrEmpty(ret) && args.page == -1)
                            {
                                //ret = tw.GetPhoenixSearch(read, tb, true)
                                ret = tw.GetSearch(read, tb, true);
                            }
                        }
                    }
                    //振り分け
                    rslt.addCount = _statuses.DistributePosts();
                    break;
                case MyCommon.WORKERTYPE.UserTimeline:
                    bw.ReportProgress(50, MakeStatusMessage(args, false));
                    int count = 20;
                    if (this._cfgCommon.UseAdditionalCount) count = this._cfgCommon.UserTimelineCountApi;
                    if (string.IsNullOrEmpty(args.tName))
                    {
                        foreach (TabClass tb in _statuses.GetTabsByType(MyCommon.TabUsageType.UserTimeline))
                        {
                            if (!string.IsNullOrEmpty(tb.User)) ret = tw.GetUserTimelineApi(read, count, tb.User, tb, false);
                        }
                    }
                    else
                    {
                        TabClass tb = _statuses.GetTabByName(args.tName);
                        if (tb != null)
                        {
                            ret = tw.GetUserTimelineApi(read, count, tb.User, tb, args.page == -1);
                        }
                    }
                    //振り分け
                    rslt.addCount = _statuses.DistributePosts();
                    break;
                case MyCommon.WORKERTYPE.List:
                    bw.ReportProgress(50, MakeStatusMessage(args, false));
                    if (string.IsNullOrEmpty(args.tName))
                    {
                        //定期更新
                        foreach (TabClass tb in _statuses.GetTabsByType(MyCommon.TabUsageType.Lists))
                        {
                            if (tb.ListInfo != null && tb.ListInfo.Id != 0) ret = tw.GetListStatus(read, tb, false, _initial);
                        }
                    }
                    else
                    {
                        //手動更新(特定タブのみ更新)
                        TabClass tb = _statuses.GetTabByName(args.tName);
                        if (tb != null)
                        {
                            ret = tw.GetListStatus(read, tb, args.page == -1, _initial);
                        }
                    }
                    //振り分け
                    rslt.addCount = _statuses.DistributePosts();
                    break;

                case MyCommon.WORKERTYPE.Related:
                {
                    bw.ReportProgress(50, MakeStatusMessage(args, false));
                    TabClass tab = _statuses.GetTabByName(args.tName);
                    ret = tw.GetRelatedResult(read, tab);
                    rslt.addCount = _statuses.DistributePosts();
                    break;
                }

                case MyCommon.WORKERTYPE.BlockIds:
                    bw.ReportProgress(50, Properties.Resources.UpdateBlockUserText1);
                    try
                    {
                        tw.RefreshBlockIds();
                    }
                    catch (WebApiException ex) { ret = ex.Message; }
                    break;
            }
            //キャンセル要求
            if (bw.CancellationPending)
            {
                e.Cancel = true;
                return;
            }

            //時速表示用
            if (args.type == MyCommon.WORKERTYPE.FavAdd)
            {
                DateTime oneHour = DateTime.Now.Subtract(new TimeSpan(1, 0, 0));
                for (int i = _favTimestamps.Count - 1; i >= 0; i--)
                {
                    if (_favTimestamps[i].CompareTo(oneHour) < 0)
                    {
                        _favTimestamps.RemoveAt(i);
                    }
                }
            }
            if (args.type == MyCommon.WORKERTYPE.Timeline && !_initial)
            {
                lock (_syncObject)
                {
                    DateTime tm = DateTime.Now;
                    if (_tlTimestamps.ContainsKey(tm))
                        _tlTimestamps[tm] += rslt.addCount;
                    else
                        _tlTimestamps.Add(tm, rslt.addCount);

                    DateTime oneHour = DateTime.Now.Subtract(new TimeSpan(1, 0, 0));
                    List<DateTime> keys = new List<DateTime>();
                    _tlCount = 0;
                    foreach (DateTime key in _tlTimestamps.Keys)
                    {
                        if (key.CompareTo(oneHour) < 0)
                        {
                            keys.Add(key);
                        }
                        else
                        {
                            _tlCount += _tlTimestamps[key];
                        }
                    }
                    foreach (DateTime key in keys)
                    {
                        _tlTimestamps.Remove(key);
                    }
                    keys.Clear();
                }
            }

            //終了ステータス
            bw.ReportProgress(100, MakeStatusMessage(args, true)); //ステータス書き換え、Notifyアイコンアニメーション開始

            rslt.retMsg = ret;
            rslt.type = args.type;
            rslt.tName = args.tName;

            e.Result = rslt;
        }
Ejemplo n.º 2
0
        private void GetTimelineWorker_DoWork(object sender, DoWorkEventArgs e)
        {
            BackgroundWorker bw = (BackgroundWorker)sender;
            if (bw.CancellationPending || MyCommon._endingFlag)
            {
                e.Cancel = true;
                return;
            }

            Thread.CurrentThread.Priority = ThreadPriority.BelowNormal;

            MyApplication.InitCulture();

            string ret = "";
            GetWorkerResult rslt = new GetWorkerResult();

            bool read = !SettingDialog.UnreadManage;
            if (_initial && SettingDialog.UnreadManage) read = SettingDialog.Readed;

            GetWorkerArg args = (GetWorkerArg)e.Argument;

            if (!CheckAccountValid())
            {
                rslt.retMsg = "Auth error. Check your account";
                rslt.type = MyCommon.WORKERTYPE.ErrorState;  //エラー表示のみ行ない、後処理キャンセル
                rslt.tName = args.tName;
                e.Result = rslt;
                return;
            }

            if (args.type != MyCommon.WORKERTYPE.OpenUri) bw.ReportProgress(0, ""); //Notifyアイコンアニメーション開始
            switch (args.type)
            {
                case MyCommon.WORKERTYPE.Timeline:
                case MyCommon.WORKERTYPE.Reply:
                    bw.ReportProgress(50, MakeStatusMessage(args, false));
                    ret = tw.GetTimelineApi(read, args.type, args.page == -1, _initial);
                    //新着時未読クリア
                    if (string.IsNullOrEmpty(ret) && args.type == MyCommon.WORKERTYPE.Timeline && SettingDialog.ReadOldPosts)
                        _statuses.SetRead();
                    //振り分け
                    rslt.addCount = _statuses.DistributePosts();
                    break;
                case MyCommon.WORKERTYPE.DirectMessegeRcv:    //送信分もまとめて取得
                    bw.ReportProgress(50, MakeStatusMessage(args, false));
                    ret = tw.GetDirectMessageApi(read, MyCommon.WORKERTYPE.DirectMessegeRcv, args.page == -1);
                    if (string.IsNullOrEmpty(ret)) ret = tw.GetDirectMessageApi(read, MyCommon.WORKERTYPE.DirectMessegeSnt, args.page == -1);
                    rslt.addCount = _statuses.DistributePosts();
                    break;
                case MyCommon.WORKERTYPE.FavAdd:
                    //スレッド処理はしない
                    if (_statuses.Tabs.ContainsKey(args.tName))
                    {
                        TabClass tbc = _statuses.Tabs[args.tName];
                        for (int i = 0; i <= args.ids.Count - 1; i++)
                        {
                            PostClass post = null;
                            if (tbc.IsInnerStorageTabType)
                                post = tbc.Posts[args.ids[i]];
                            else
                                post = _statuses[args.ids[i]];

                            args.page = i + 1;
                            bw.ReportProgress(50, MakeStatusMessage(args, false));
                            if (!post.IsFav)
                            {
                                if (post.RetweetedId == 0)
                                    ret = tw.PostFavAdd(post.StatusId);
                                else
                                    ret = tw.PostFavAdd(post.RetweetedId);

                                if (ret.Length == 0)
                                {
                                    args.sIds.Add(post.StatusId);
                                    post.IsFav = true;    //リスト再描画必要
                                    _favTimestamps.Add(DateTime.Now);
                                    if (string.IsNullOrEmpty(post.RelTabName))
                                    {
                                        //検索,リストUserTimeline.Relatedタブからのfavは、favタブへ追加せず。それ以外は追加
                                        _statuses.GetTabByType(MyCommon.TabUsageType.Favorites).Add(post.StatusId, post.IsRead, false);
                                    }
                                    else
                                    {
                                        //検索,リスト,UserTimeline.Relatedタブからのfavで、TLでも取得済みならfav反映
                                        if (_statuses.ContainsKey(post.StatusId))
                                        {
                                            PostClass postTl = _statuses[post.StatusId];
                                            postTl.IsFav = true;
                                            _statuses.GetTabByType(MyCommon.TabUsageType.Favorites).Add(postTl.StatusId, postTl.IsRead, false);
                                        }
                                    }
                                    //検索,リスト,UserTimeline,Relatedの各タブに反映
                                    foreach (TabClass tb in _statuses.GetTabsByType(MyCommon.TabUsageType.PublicSearch | MyCommon.TabUsageType.Lists | MyCommon.TabUsageType.UserTimeline | MyCommon.TabUsageType.Related))
                                    {
                                        if (tb.Contains(post.StatusId)) tb.Posts[post.StatusId].IsFav = true;
                                    }
                                }
                            }
                        }
                    }
                    rslt.sIds = args.sIds;
                    break;
                case MyCommon.WORKERTYPE.FavRemove:
                    //スレッド処理はしない
                    if (_statuses.Tabs.ContainsKey(args.tName))
                    {
                        TabClass tbc = _statuses.Tabs[args.tName];
                        for (int i = 0; i <= args.ids.Count - 1; i++)
                        {
                            PostClass post = null;
                            if (tbc.IsInnerStorageTabType)
                                post = tbc.Posts[args.ids[i]];
                            else
                                post = _statuses[args.ids[i]];

                            args.page = i + 1;
                            bw.ReportProgress(50, MakeStatusMessage(args, false));
                            if (post.IsFav)
                            {
                                if (post.RetweetedId == 0)
                                    ret = tw.PostFavRemove(post.StatusId);
                                else
                                    ret = tw.PostFavRemove(post.RetweetedId);

                                if (ret.Length == 0)
                                {
                                    args.sIds.Add(post.StatusId);
                                    post.IsFav = false;    //リスト再描画必要
                                    if (_statuses.ContainsKey(post.StatusId)) _statuses[post.StatusId].IsFav = false;
                                    //検索,リスト,UserTimeline,Relatedの各タブに反映
                                    foreach (TabClass tb in _statuses.GetTabsByType(MyCommon.TabUsageType.PublicSearch | MyCommon.TabUsageType.Lists | MyCommon.TabUsageType.UserTimeline | MyCommon.TabUsageType.Related))
                                    {
                                        if (tb.Contains(post.StatusId)) tb.Posts[post.StatusId].IsFav = false;
                                    }
                                }
                            }
                        }
                    }
                    rslt.sIds = args.sIds;
                    break;
                case MyCommon.WORKERTYPE.PostMessage:
                    bw.ReportProgress(200);
                    if (string.IsNullOrEmpty(args.status.imagePath))
                    {
                        for (int i = 0; i <= 1; i++)
                        {
                            ret = tw.PostStatus(args.status.status, args.status.inReplyToId);
                            if (string.IsNullOrEmpty(ret) ||
                                ret.StartsWith("OK:") ||
                                ret.StartsWith("Outputz:") ||
                                ret.StartsWith("Warn:") ||
                                ret == "Err:Status is a duplicate." ||
                                args.status.status.StartsWith("D", StringComparison.OrdinalIgnoreCase) ||
                                args.status.status.StartsWith("DM", StringComparison.OrdinalIgnoreCase) ||
                                Twitter.AccountState != MyCommon.ACCOUNT_STATE.Valid)
                                break;
                        }
                    }
                    else
                    {
                        ret = this.pictureService[args.status.imageService].Upload(ref args.status.imagePath,
                                                                                   ref args.status.status,
                                                                                   args.status.inReplyToId);
                    }
                    bw.ReportProgress(300);
                    rslt.status = args.status;
                    break;
                case MyCommon.WORKERTYPE.Retweet:
                    bw.ReportProgress(200);
                    for (int i = 0; i <= args.ids.Count - 1; i++)
                    {
                        ret = tw.PostRetweet(args.ids[i], read);
                    }
                    bw.ReportProgress(300);
                    break;
                case MyCommon.WORKERTYPE.Follower:
                    bw.ReportProgress(50, Properties.Resources.UpdateFollowersMenuItem1_ClickText1);
                    ret = tw.GetFollowersApi();
                    if (string.IsNullOrEmpty(ret))
                    {
                        ret = tw.GetNoRetweetIdsApi();
                    }
                    break;
                case MyCommon.WORKERTYPE.Configuration:
                    ret = tw.ConfigurationApi();
                    break;
                case MyCommon.WORKERTYPE.OpenUri:
                    string myPath = Convert.ToString(args.url);

                    try
                    {
                        if (!string.IsNullOrEmpty(SettingDialog.BrowserPath))
                        {
                            if (SettingDialog.BrowserPath.StartsWith("\"") && SettingDialog.BrowserPath.Length > 2 && SettingDialog.BrowserPath.IndexOf("\"", 2) > -1)
                            {
                                int sep = SettingDialog.BrowserPath.IndexOf("\"", 2);
                                string browserPath = SettingDialog.BrowserPath.Substring(1, sep - 1);
                                string arg = "";
                                if (sep < SettingDialog.BrowserPath.Length - 1)
                                {
                                    arg = SettingDialog.BrowserPath.Substring(sep + 1);
                                }
                                myPath = arg + " " + myPath;
                                System.Diagnostics.Process.Start(browserPath, myPath);
                            }
                            else
                            {
                                System.Diagnostics.Process.Start(SettingDialog.BrowserPath, myPath);
                            }
                        }
                        else
                        {
                            System.Diagnostics.Process.Start(myPath);
                        }
                    }
                    catch (Exception)
                    {
            //                  MessageBox.Show("ブラウザの起動に失敗、またはタイムアウトしました。" + ex.ToString());
                    }
                    break;
                case MyCommon.WORKERTYPE.Favorites:
                    bw.ReportProgress(50, MakeStatusMessage(args, false));
                    ret = tw.GetFavoritesApi(read, args.type, args.page == -1);
                    rslt.addCount = _statuses.DistributePosts();
                    break;
                case MyCommon.WORKERTYPE.PublicSearch:
                    bw.ReportProgress(50, MakeStatusMessage(args, false));
                    if (string.IsNullOrEmpty(args.tName))
                    {
                        foreach (TabClass tb in _statuses.GetTabsByType(MyCommon.TabUsageType.PublicSearch))
                        {
                            //if (!string.IsNullOrEmpty(tb.SearchWords)) ret = tw.GetPhoenixSearch(read, tb, false);
                            if (!string.IsNullOrEmpty(tb.SearchWords)) ret = tw.GetSearch(read, tb, false);
                        }
                    }
                    else
                    {
                        TabClass tb = _statuses.GetTabByName(args.tName);
                        if (tb != null)
                        {
                            //ret = tw.GetPhoenixSearch(read, tb, false);
                            ret = tw.GetSearch(read, tb, false);
                            if (string.IsNullOrEmpty(ret) && args.page == -1)
                            {
                                //ret = tw.GetPhoenixSearch(read, tb, true)
                                ret = tw.GetSearch(read, tb, true);
                            }
                        }
                    }
                    //振り分け
                    rslt.addCount = _statuses.DistributePosts();
                    break;
                case MyCommon.WORKERTYPE.UserTimeline:
                    bw.ReportProgress(50, MakeStatusMessage(args, false));
                    int count = 20;
                    if (SettingDialog.UseAdditionalCount) count = SettingDialog.UserTimelineCountApi;
                    if (string.IsNullOrEmpty(args.tName))
                    {
                        foreach (TabClass tb in _statuses.GetTabsByType(MyCommon.TabUsageType.UserTimeline))
                        {
                            if (!string.IsNullOrEmpty(tb.User)) ret = tw.GetUserTimelineApi(read, count, tb.User, tb, false);
                        }
                    }
                    else
                    {
                        TabClass tb = _statuses.GetTabByName(args.tName);
                        if (tb != null)
                        {
                            ret = tw.GetUserTimelineApi(read, count, tb.User, tb, args.page == -1);
                        }
                    }
                    //振り分け
                    rslt.addCount = _statuses.DistributePosts();
                    break;
                case MyCommon.WORKERTYPE.List:
                    bw.ReportProgress(50, MakeStatusMessage(args, false));
                    if (string.IsNullOrEmpty(args.tName))
                    {
                        //定期更新
                        foreach (TabClass tb in _statuses.GetTabsByType(MyCommon.TabUsageType.Lists))
                        {
                            if (tb.ListInfo != null && tb.ListInfo.Id != 0) ret = tw.GetListStatus(read, tb, false, _initial);
                        }
                    }
                    else
                    {
                        //手動更新(特定タブのみ更新)
                        TabClass tb = _statuses.GetTabByName(args.tName);
                        if (tb != null)
                        {
                            ret = tw.GetListStatus(read, tb, args.page == -1, _initial);
                        }
                    }
                    //振り分け
                    rslt.addCount = _statuses.DistributePosts();
                    break;
                case MyCommon.WORKERTYPE.Related:
                    bw.ReportProgress(50, MakeStatusMessage(args, false));
                    TabClass tab = _statuses.GetTabByName(args.tName);
                    ret = tw.GetRelatedResult(read, tab);
                    rslt.addCount = _statuses.DistributePosts();
                    break;
                case MyCommon.WORKERTYPE.BlockIds:
                    bw.ReportProgress(50, Properties.Resources.UpdateBlockUserText1);
                    ret = tw.GetBlockUserIds();
                    if (TabInformations.GetInstance().BlockIds.Count == 0)
                    {
                        tw.GetBlockUserIds();
                    }
                    break;
            }
            //キャンセル要求
            if (bw.CancellationPending)
            {
                e.Cancel = true;
                return;
            }

            //時速表示用
            if (args.type == MyCommon.WORKERTYPE.FavAdd)
            {
                DateTime oneHour = DateTime.Now.Subtract(new TimeSpan(1, 0, 0));
                for (int i = _favTimestamps.Count - 1; i >= 0; i--)
                {
                    if (_favTimestamps[i].CompareTo(oneHour) < 0)
                    {
                        _favTimestamps.RemoveAt(i);
                    }
                }
            }
            if (args.type == MyCommon.WORKERTYPE.Timeline && !_initial)
            {
                lock (_syncObject)
                {
                    DateTime tm = DateTime.Now;
                    if (_tlTimestamps.ContainsKey(tm))
                        _tlTimestamps[tm] += rslt.addCount;
                    else
                        _tlTimestamps.Add(tm, rslt.addCount);

                    DateTime oneHour = DateTime.Now.Subtract(new TimeSpan(1, 0, 0));
                    List<DateTime> keys = new List<DateTime>();
                    _tlCount = 0;
                    foreach (DateTime key in _tlTimestamps.Keys)
                    {
                        if (key.CompareTo(oneHour) < 0)
                        {
                            keys.Add(key);
                        }
                        else
                        {
                            _tlCount += _tlTimestamps[key];
                        }
                    }
                    foreach (DateTime key in keys)
                    {
                        _tlTimestamps.Remove(key);
                    }
                    keys.Clear();
                }
            }

            //終了ステータス
            if (args.type != MyCommon.WORKERTYPE.OpenUri) bw.ReportProgress(100, MakeStatusMessage(args, true)); //ステータス書き換え、Notifyアイコンアニメーション開始

            rslt.retMsg = ret;
            rslt.type = args.type;
            rslt.tName = args.tName;
            if (args.type == MyCommon.WORKERTYPE.DirectMessegeRcv ||
                args.type == MyCommon.WORKERTYPE.DirectMessegeSnt ||
                args.type == MyCommon.WORKERTYPE.Reply ||
                args.type == MyCommon.WORKERTYPE.Timeline ||
                args.type == MyCommon.WORKERTYPE.Favorites)
            {
                rslt.page = args.page - 1;   //値が正しいか後でチェック。10ページ毎の継続確認
            }

            e.Result = rslt;
        }
Ejemplo n.º 3
0
        private void GetTimelineWorker_DoWork(object sender, DoWorkEventArgs e)
        {
            var bw = (BackgroundWorker)sender;
            if (bw.CancellationPending || MyCommon.IsEnding)
            {
                e.Cancel = true;
                return;
            }

            Thread.CurrentThread.Priority = ThreadPriority.BelowNormal;
            //// Tween.My.MyProject.Application.InitCulture(); // TODO: Need this here?
            string ret = string.Empty;
            var rslt = new GetWorkerResult();
            bool read = !_configs.UnreadManage;
            if (_isInitializing && _configs.UnreadManage)
            {
                read = _configs.Readed;
            }

            var args = (GetWorkerArg)e.Argument;
            if (!CheckAccountValid())
            {
                // エラー表示のみ行ない、後処理キャンセル
                rslt.RetMsg = "Auth error. Check your account";
                rslt.WorkerType = WorkerType.ErrorState;
                rslt.TabName = args.TabName;
                e.Result = rslt;
                return;
            }

            if (args.WorkerType != WorkerType.OpenUri)
            {
                bw.ReportProgress(0, string.Empty);
            }

            // Notifyアイコンアニメーション開始
            switch (args.WorkerType)
            {
                case WorkerType.Timeline:
                case WorkerType.Reply:
                    bw.ReportProgress(50, MakeStatusMessage(args, false));
                    ret = _tw.GetTimelineApi(read, args.WorkerType, args.Page == -1, _isInitializing);
                    if (string.IsNullOrEmpty(ret) && args.WorkerType == WorkerType.Timeline && _configs.ReadOldPosts)
                    {
                        // 新着時未読クリア
                        _statuses.SetRead();
                    }

                    rslt.AddCount = _statuses.DistributePosts();                    // 振り分け
                    break;

                case WorkerType.DirectMessegeRcv:

                    // 送信分もまとめて取得
                    bw.ReportProgress(50, MakeStatusMessage(args, false));
                    ret = _tw.GetDirectMessageApi(read, WorkerType.DirectMessegeRcv, args.Page == -1);
                    if (string.IsNullOrEmpty(ret))
                    {
                        ret = _tw.GetDirectMessageApi(read, WorkerType.DirectMessegeSnt, args.Page == -1);
                    }

                    rslt.AddCount = _statuses.DistributePosts();
                    break;

                case WorkerType.FavAdd:

                    // スレッド処理はしない
                    if (_statuses.Tabs.ContainsKey(args.TabName))
                    {
                        TabClass tbc = _statuses.Tabs[args.TabName];
                        for (int i = 0; i < args.Ids.Count; i++)
                        {
                            PostClass post = tbc.IsInnerStorageTabType ?
                                                 tbc.Posts[args.Ids[i]] :
                                                 _statuses.Item(args.Ids[i]);

                            args.Page = i + 1;
                            bw.ReportProgress(50, MakeStatusMessage(args, false));
                            if (!post.IsFav)
                            {
                                ret = _tw.PostFavAdd(post.OriginalStatusId);
                                if (ret.Length == 0)
                                {
                                    // リスト再描画必要
                                    args.SIds.Add(post.StatusId);
                                    post.IsFav = true;
                                    _favTimestamps.Add(DateTime.Now);
                                    if (string.IsNullOrEmpty(post.RelTabName))
                                    {
                                        // 検索,リストUserTimeline.Relatedタブからのfavは、favタブへ追加せず。それ以外は追加
                                        _statuses.GetTabByType(TabUsageType.Favorites).Add(post.StatusId, post.IsRead, false);
                                    }
                                    else
                                    {
                                        // 検索,リスト,UserTimeline.Relatedタブからのfavで、TLでも取得済みならfav反映
                                        if (_statuses.ContainsKey(post.StatusId))
                                        {
                                            PostClass postTl = _statuses.Item(post.StatusId);
                                            postTl.IsFav = true;
                                            _statuses.GetTabByType(TabUsageType.Favorites).Add(postTl.StatusId, postTl.IsRead, false);
                                        }
                                    }

                                    // 検索,リスト,UserTimeline,Relatedの各タブに反映
                                    foreach (TabClass tb in _statuses.GetTabsByType(TabUsageType.PublicSearch | TabUsageType.Lists | TabUsageType.UserTimeline | TabUsageType.Related))
                                    {
                                        if (tb.Contains(post.StatusId))
                                        {
                                            tb.Posts[post.StatusId].IsFav = true;
                                        }
                                    }
                                }
                            }
                        }
                    }

                    rslt.SIds = args.SIds;
                    break;

                case WorkerType.FavRemove:

                    // スレッド処理はしない
                    if (_statuses.Tabs.ContainsKey(args.TabName))
                    {
                        TabClass tbc = _statuses.Tabs[args.TabName];
                        for (int i = 0; i < args.Ids.Count; i++)
                        {
                            PostClass post = tbc.IsInnerStorageTabType ? tbc.Posts[args.Ids[i]] : _statuses.Item(args.Ids[i]);
                            args.Page = i + 1;
                            bw.ReportProgress(50, MakeStatusMessage(args, false));
                            if (post.IsFav)
                            {
                                ret = _tw.PostFavRemove(post.OriginalStatusId);
                                if (ret.Length == 0)
                                {
                                    args.SIds.Add(post.StatusId);
                                    post.IsFav = false;

                                    // リスト再描画必要
                                    if (_statuses.ContainsKey(post.StatusId))
                                    {
                                        _statuses.Item(post.StatusId).IsFav = false;
                                    }

                                    // 検索,リスト,UserTimeline,Relatedの各タブに反映
                                    foreach (TabClass tb in _statuses.GetTabsByType(TabUsageType.PublicSearch | TabUsageType.Lists | TabUsageType.UserTimeline | TabUsageType.Related))
                                    {
                                        if (tb.Contains(post.StatusId))
                                        {
                                            tb.Posts[post.StatusId].IsFav = false;
                                        }
                                    }
                                }
                            }
                        }
                    }

                    rslt.SIds = args.SIds;
                    break;

                case WorkerType.PostMessage:
                    bw.ReportProgress(200);
                    if (string.IsNullOrEmpty(args.PStatus.ImagePath))
                    {
                        for (int i = 0; i <= 1; i++)
                        {
                            ret = _tw.PostStatus(args.PStatus.Status, args.PStatus.InReplyToId);
                            if (string.IsNullOrEmpty(ret) || ret.StartsWith("OK:") || ret.StartsWith("Outputz:") || ret.StartsWith("Warn:") || ret == "Err:Status is a duplicate." || args.PStatus.Status.StartsWith("D", StringComparison.OrdinalIgnoreCase) || args.PStatus.Status.StartsWith("DM", StringComparison.OrdinalIgnoreCase) || Twitter.AccountState != AccountState.Valid)
                            {
                                break;
                            }
                        }
                    }
                    else
                    {
                        ret = _pictureServices[args.PStatus.ImageService].Upload(ref args.PStatus.ImagePath, ref args.PStatus.Status, args.PStatus.InReplyToId);
                    }

                    bw.ReportProgress(300);
                    rslt.PStatus = args.PStatus;
                    break;

                case WorkerType.Retweet:
                    bw.ReportProgress(200);
                    foreach (long t in args.Ids)
                    {
                        ret = _tw.PostRetweet(t, read);
                    }

                    bw.ReportProgress(300);
                    break;

                case WorkerType.Follower:
                    bw.ReportProgress(50, R.UpdateFollowersMenuItem1_ClickText1);
                    ret = _tw.GetFollowersApi();
                    if (string.IsNullOrEmpty(ret))
                    {
                        ret = _tw.GetNoRetweetIdsApi();
                    }

                    break;

                case WorkerType.Configuration:
                    ret = _tw.ConfigurationApi();
                    break;

                case WorkerType.OpenUri:
                    string myPath = args.Url;
                    string browserPath = _configs.BrowserPath;
                    MyCommon.TryOpenUrl(myPath, browserPath);
                    break;

                case WorkerType.Favorites:
                    bw.ReportProgress(50, MakeStatusMessage(args, false));
                    ret = _tw.GetFavoritesApi(read, args.WorkerType, args.Page == -1);
                    rslt.AddCount = _statuses.DistributePosts();
                    break;

                case WorkerType.PublicSearch:
                    bw.ReportProgress(50, MakeStatusMessage(args, false));
                    if (string.IsNullOrEmpty(args.TabName))
                    {
                        foreach (TabClass tb in _statuses.GetTabsByType(TabUsageType.PublicSearch))
                        {
                            if (!string.IsNullOrEmpty(tb.SearchWords))
                            {
                                ret = _tw.GetSearch(read, tb, false);
                            }
                        }
                    }
                    else
                    {
                        TabClass tb = _statuses.GetTabByName(args.TabName);
                        if (tb != null)
                        {
                            ret = _tw.GetSearch(read, tb, false);
                            if (string.IsNullOrEmpty(ret) && args.Page == -1)
                            {
                                ret = _tw.GetSearch(read, tb, true);
                            }
                        }
                    }

                    rslt.AddCount = _statuses.DistributePosts();                    // 振り分け
                    break;

                case WorkerType.UserTimeline:
                    bw.ReportProgress(50, MakeStatusMessage(args, false));
                    int count = 20;
                    if (_configs.UseAdditionalCount)
                    {
                        count = _configs.UserTimelineCountApi;
                    }

                    if (string.IsNullOrEmpty(args.TabName))
                    {
                        foreach (TabClass tb in _statuses.GetTabsByType(TabUsageType.UserTimeline))
                        {
                            if (!string.IsNullOrEmpty(tb.User))
                            {
                                ret = _tw.GetUserTimelineApi(read, count, tb.User, tb, false);
                            }
                        }
                    }
                    else
                    {
                        TabClass tb = _statuses.GetTabByName(args.TabName);
                        if (tb != null)
                        {
                            ret = _tw.GetUserTimelineApi(read, count, tb.User, tb, args.Page == -1);
                        }
                    }

                    rslt.AddCount = _statuses.DistributePosts();                     // 振り分け
                    break;

                case WorkerType.List:
                    bw.ReportProgress(50, MakeStatusMessage(args, false));
                    if (string.IsNullOrEmpty(args.TabName))
                    {
                        // 定期更新
                        foreach (TabClass tb in _statuses.GetTabsByType(TabUsageType.Lists))
                        {
                            if (tb.ListInfo != null && tb.ListInfo.Id != 0)
                            {
                                ret = _tw.GetListStatus(read, tb, false, _isInitializing);
                            }
                        }
                    }
                    else
                    {
                        // 手動更新(特定タブのみ更新)
                        TabClass tb = _statuses.GetTabByName(args.TabName);
                        if (tb != null)
                        {
                            ret = _tw.GetListStatus(read, tb, args.Page == -1, _isInitializing);
                        }
                    }

                    rslt.AddCount = _statuses.DistributePosts(); // 振り分け
                    break;

                case WorkerType.Related:
                    bw.ReportProgress(50, MakeStatusMessage(args, false));
                    ret = _tw.GetRelatedResult(read, _statuses.GetTabByName(args.TabName));
                    rslt.AddCount = _statuses.DistributePosts();
                    break;

                case WorkerType.BlockIds:
                    bw.ReportProgress(50, R.UpdateBlockUserText1);
                    ret = _tw.GetBlockUserIds();
                    if (TabInformations.Instance.BlockIds.Count == 0)
                    {
                        _tw.GetBlockUserIds();
                    }

                    break;
            }

            // キャンセル要求
            if (bw.CancellationPending)
            {
                e.Cancel = true;
                return;
            }

            // 時速表示用
            if (args.WorkerType == WorkerType.FavAdd)
            {
                DateTime oneHour = DateTime.Now.Subtract(new TimeSpan(1, 0, 0));
                for (int i = _favTimestamps.Count - 1; i >= 0; i += -1)
                {
                    if (_favTimestamps[i].CompareTo(oneHour) < 0)
                    {
                        _favTimestamps.RemoveAt(i);
                    }
                }
            }

            if (args.WorkerType == WorkerType.Timeline && !_isInitializing)
            {
                lock (_syncObject)
                {
                    DateTime tm = DateTime.Now;
                    if (_timeLineTimestamps.ContainsKey(tm))
                    {
                        _timeLineTimestamps[tm] += rslt.AddCount;
                    }
                    else
                    {
                        _timeLineTimestamps.Add(tm, rslt.AddCount);
                    }

                    DateTime oneHour = DateTime.Now.Subtract(new TimeSpan(1, 0, 0));
                    var keys = new List<DateTime>();
                    _timeLineCount = 0;
                    foreach (DateTime key in _timeLineTimestamps.Keys)
                    {
                        if (key.CompareTo(oneHour) < 0)
                        {
                            keys.Add(key);
                        }
                        else
                        {
                            _timeLineCount += _timeLineTimestamps[key];
                        }
                    }

                    foreach (DateTime key in keys)
                    {
                        _timeLineTimestamps.Remove(key);
                    }

                    keys.Clear();
                }
            }

            // 終了ステータス
            if (args.WorkerType != WorkerType.OpenUri)
            {
                bw.ReportProgress(100, MakeStatusMessage(args, true));
            }

            // ステータス書き換え、Notifyアイコンアニメーション開始
            rslt.RetMsg = ret;
            rslt.WorkerType = args.WorkerType;
            rslt.TabName = args.TabName;
            if (args.WorkerType == WorkerType.DirectMessegeRcv
                || args.WorkerType == WorkerType.DirectMessegeSnt
                || args.WorkerType == WorkerType.Reply
                || args.WorkerType == WorkerType.Timeline
                || args.WorkerType == WorkerType.Favorites)
            {
                // 値が正しいか後でチェック。10ページ毎の継続確認
                rslt.Page = args.Page - 1;
            }

            e.Result = rslt;
        }