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; }
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; }
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; }