public void Retweet(IEnumerable<TwitterAccount> infos, bool add)
{
if (IsDirectMessage)
{
// disable on direct messages
return;
}
Task.Run(() =>
{
Action<TwitterAccount> expected;
Action<TwitterAccount> onFail;
if (add)
{
expected = a => Model.AddRetweetedUser(a.GetPseudoUser());
onFail = a => Model.RemoveRetweetedUser(a.Id);
}
else
{
expected = a => Model.RemoveRetweetedUser(a.Id);
onFail = a => Model.AddRetweetedUser(a.GetPseudoUser());
}
var request = new RetweetRequest(Status, add);
// define working task
Func<TwitterAccount, Task> workTask = account => Task.Run(async () =>
{
expected(account);
try
{
await RequestQueue.EnqueueAsync(account, request).ConfigureAwait(false);
}
catch (Exception ex)
{
onFail(account);
var desc = add
? MainAreaTimelineResources.MsgRetweetFailed
: MainAreaTimelineResources.MsgUnretweetFailed;
BackstageModel.RegisterEvent(new OperationFailedEvent(
desc + "(" + account.UnreliableScreenName + " -> " +
Status.User.ScreenName + ")", ex));
}
});
// dispatch actions
Task.WaitAll(infos.Select(workTask).ToArray());
// notify changed
RaisePropertyChanged(() => IsRetweeted);
});
}