private async Task FavAddAsyncInternal(IProgress<string> p, CancellationToken ct, long statusId, TabModel tab)
{
if (ct.IsCancellationRequested)
return;
if (!CheckAccountValid())
throw new WebApiException("Auth error. Check your account");
PostClass post;
if (!tab.Posts.TryGetValue(statusId, out post))
return;
if (post.IsFav)
return;
await Task.Run(async () =>
{
p.Report(string.Format(Properties.Resources.GetTimelineWorker_RunWorkerCompletedText15, 0, 1, 0));
try
{
await this.twitterApi.FavoritesCreate(post.RetweetedId ?? post.StatusId)
.IgnoreResponse()
.ConfigureAwait(false);
if (this._cfgCommon.RestrictFavCheck)
{
var status = await this.twitterApi.StatusesShow(post.RetweetedId ?? post.StatusId)
.ConfigureAwait(false);
if (status.Favorited != true)
throw new WebApiException("NG(Restricted?)");
}
this._favTimestamps.Add(DateTime.Now);
// TLでも取得済みならfav反映
if (this._statuses.ContainsKey(statusId))
{
var postTl = this._statuses[statusId];
postTl.IsFav = true;
var favTab = this._statuses.GetTabByType(MyCommon.TabUsageType.Favorites);
favTab.AddPostQueue(postTl);
}
// 検索,リスト,UserTimeline,Relatedの各タブに反映
foreach (var tb in this._statuses.GetTabsInnerStorageType())
{
if (tb.Contains(statusId))
tb.Posts[statusId].IsFav = true;
}
p.Report(string.Format(Properties.Resources.GetTimelineWorker_RunWorkerCompletedText15, 1, 1, 0));
}
catch (WebApiException)
{
p.Report(string.Format(Properties.Resources.GetTimelineWorker_RunWorkerCompletedText15, 1, 1, 1));
throw;
}
// 時速表示用
var oneHour = DateTime.Now - TimeSpan.FromHours(1);
foreach (var i in MyCommon.CountDown(this._favTimestamps.Count - 1, 0))
{
if (this._favTimestamps[i] < oneHour)
this._favTimestamps.RemoveAt(i);
}
this._statuses.DistributePosts();
});
if (ct.IsCancellationRequested)
return;
this.RefreshTimeline();
if (this._curList != null && this._curTab != null && this._curTab.Text == tab.TabName)
{
using (ControlTransaction.Update(this._curList))
{
var idx = tab.IndexOf(statusId);
if (idx != -1)
this.ChangeCacheStyleRead(post.IsRead, idx);
}
if (statusId == this._curPost.StatusId)
await this.DispSelectedPost(true); // 選択アイテム再表示
}
}