Beispiel #1
0
        public TwitterDraft CreateDraft()
        {
            var draft = new TwitterDraft();

            draft.Text = TweetText;

            if (IsScheduled == true)
            {
                draft.Scheduled = new DateTime(
                    ScheduledDate.Year,
                    ScheduledDate.Month,
                    ScheduledDate.Day,
                    ScheduledTime.Hour,
                    ScheduledTime.Minute,
                    0);
            }
            else
            {
                draft.Scheduled = null;
            }

            draft.CreatedAt = DateTime.Now;
            draft.Accounts  = new List <UserToken>();

            foreach (var acc in SelectedAccounts.OfType <UserToken>())
            {
                draft.Accounts.Add(acc as UserToken);
            }

            draft.ReplyId = DataTransfer.ReplyId;

            return(draft);
        }
Beispiel #2
0
        void ScheduleWithServer(DateTime scheduleTime)
        {
            requestsLeft = 0;
            error        = false;
            foreach (var user in SelectedAccounts.OfType <UserToken>())
            {
                IsLoading = true;
                requestsLeft++;

                var scheduler = new Scheduler(user.Key, user.Secret);

                scheduler.ScheduleTweet(TweetText, scheduleTime, (sender, response) =>
                {
                    requestsLeft--;
                    if (response.StatusCode != HttpStatusCode.OK && response.StatusCode != HttpStatusCode.NoContent)
                    {
                        error = true;
                        MessageService.ShowError(string.Format(Resources.ScheduleError, user.ScreenName));
                    }

                    if (requestsLeft <= 0)
                    {
                        IsLoading = false;
                        if (!error)
                        {
                            MessageService.ShowMessage(Resources.MessageScheduled);
                            GoBack();
                        }
                    }
                });
            }
        }
Beispiel #3
0
        private void ScheduleWithBackgroundAgent(DateTime scheduleTime)
        {
            TwitterStatusTask task = new TwitterStatusTask
            {
                InReplyTo = DataTransfer.ReplyId
            };

            task.Text = TweetText;

            if (ScheduledDate == null || ScheduledTime == null)
            {
                MessageService.ShowError(Resources.SelectDateTimeToSchedule);
                return;
            }

            task.Scheduled = scheduleTime;

            task.Accounts = new List <UserToken>();

            foreach (var user in SelectedAccounts.OfType <UserToken>())
            {
                task.Accounts.Add(user);
            }

            Config.TweetTasks.Add(task);
            Config.SaveTweetTasks();

            MessageService.ShowMessage(Resources.MessageScheduled, "");
            GoBack();
        }
Beispiel #4
0
        void SendBufferUpdate(object param)
        {
            if (!TrialInformation.IsFullFeatured)
            {
                TrialInformation.ShowBuyDialog();
                return;
            }

            if (Config.BufferProfiles.Count == 0)
            {
                AskBufferLogin();
                return;
            }

            List <string> profiles = new List <string>();

            foreach (var account in SelectedAccounts.Cast <UserToken>())
            {
                var profile = Config.BufferProfiles.Where(x => x.ServiceUsername == account.ScreenName).FirstOrDefault();

                if (profile != null)
                {
                    profiles.Add(profile.Id);
                }
            }

            var service = ServiceDispatcher.GetBufferService();

            if (service != null)
            {
                IsLoading = true;
                service.PostUpdate(TweetText, profiles, ReceiveBufferResponse);
            }
        }
Beispiel #5
0
        bool CheckProtectedAccounts()
        {
            foreach (var user in SelectedAccounts.OfType <UserToken>())
            {
                if (user != null && ProtectedAccounts.IsProtected(user))
                {
                    var result = MessageService.AskYesNoQuestion(String.Format(Resources.AskTweetProtectedAccount, user.ScreenName), "");
                    if (!result)
                    {
                        return(false);
                    }
                }
            }

            return(true);
        }
        public TweetAreaViewModel(ReadOnlyReactiveCollection <AccountViewModel> accounts)
        {
            Model = new TweetAreaModel();

            Accounts         = accounts;
            SelectedAccounts = Accounts.ObserveElementObservableProperty(x => x.IsTweetEnabled)
                               .Select(y => accounts.Where(z => z.IsTweetEnabled.Value)).ToReactiveProperty();

            SelectionStart = Model.ToReactivePropertyAsSynchronized(x => x.SelectionStart);
            Text           = Model.ToReactivePropertyAsSynchronized(x => x.Text);
            CharacterCount = Model.ObserveProperty(x => x.CharacterCount)
                             .Select(x => x.ToString())
                             .ToReactiveProperty();

            Message       = Model.ObserveProperty(x => x.Message).ToReactiveProperty();
            ToolTipIsOpen = Model.ToReactivePropertyAsSynchronized(x => x.ToolTipIsOpen);

            LockingHashTagsSymbol = Model.ObserveProperty(x => x.LockingHashTags)
                                    .Select(x => x ? Symbol.UnPin : Symbol.Pin)
                                    .ToReactiveProperty();

            StateSymbol = Model.ObserveProperty(x => x.State)
                          .Select(x =>
            {
                switch (x)
                {
                case "Accept":
                    return(Symbol.Accept);

                case "Cancel":
                    return(Symbol.Cancel);

                default:
                    return(Symbol.Accept);
                }
            })
                          .ToReactiveProperty();

            Updating = Model.ObserveProperty(x => x.Updating).ToReactiveProperty();

            ReplyOrQuotedStatus = new ReactiveProperty <StatusViewModel>();
            IsQuotedRetweet     = Model.ObserveProperty(x => x.IsQuotedRetweet).ToReactiveProperty();
            IsReply             = Model.ObserveProperty(x => x.IsReply).ToReactiveProperty();

            Notice  = Notice.Instance;
            Setting = SettingService.Setting;

            SuggestionMessenger       = new Messenger();
            Model.SuggestionMessenger = SuggestionMessenger;
            TextBoxFocusMessenger     = new Messenger();

            Pictures = Model.ReadonlyPictures.ToReadOnlyReactiveCollection(x => new PictureViewModel(x));

            AccountImageSize = Observable.Merge(
                WindowSizeHelper.Instance.ObserveProperty(x => x.ClientWidth).Select(x => (object)null),
                SelectedAccounts.Select(x => (object)null)
                ).Select(_ =>
            {
                if (WindowSizeHelper.Instance.ClientWidth <= 700)
                {
                    if (SelectedAccounts.Value.Count() < 2)
                    {
                        return(40.0);
                    }
                    else
                    {
                        return(20.0);
                    }
                }
                else
                {
                    if (SelectedAccounts.Value.Count() < 2)
                    {
                        return(60.0);
                    }
                    else
                    {
                        return(30.0);
                    }
                }
            }
                         ).ToReactiveProperty();

            Model.ObserveProperty(x => x.ReplyOrQuotedStatus)
            .Subscribe(x =>
            {
                var status = x;
                if (status == null)
                {
                    ReplyOrQuotedStatus.Value = null;
                }
            });

            MessageShowCommand = new ReactiveCommand();
            MessageShowCommand.SubscribeOn(ThreadPoolScheduler.Default)
            .Subscribe(x => { Model.ToolTipIsOpen = !Model.ToolTipIsOpen; });

            ChangeLockHashTagsCommand = new ReactiveCommand();
            ChangeLockHashTagsCommand.SubscribeOn(ThreadPoolScheduler.Default)
            .Subscribe(x => { Model.LockingHashTags = !Model.LockingHashTags; });

            AddPictureCommand = new ReactiveCommand();
            AddPictureCommand.SubscribeOn(ThreadPoolScheduler.Default)
            .Subscribe(async x =>
            {
                var result = await Notice.ShowFilePickerMessenger.Raise(new FileOpenPickerNotification
                {
                    FileTypeFilter = new[] { ".jpg", ".jpeg", ".png", ".gif", ".mp4", ".mov" },
                    IsMultiple     = true
                });

                Notice.Instance.TweetAreaOpenCommand.Execute(true);

                foreach (var pic in result.Result)
                {
                    await Model.AddPicture(pic);
                }
            });

            TweetCommand = Model.ObserveProperty(x => x.CharacterCount).Select(x => x >= 0).ToReactiveCommand();
            TweetCommand.SubscribeOn(ThreadPoolScheduler.Default)
            .Subscribe(async x =>
            {
                await Model.Tweet(SelectedAccounts.Value.Select(y => y.Model));

                if (SettingService.Setting.CloseAppBarAfterTweet)
                {
                    Notice.Instance.TweetAreaOpenCommand.Execute(false);
                }
                else
                {
                    await Task.Delay(50);
                    await TextBoxFocusMessenger.Raise(new Notification());
                }

                if (SettingService.Setting.RefreshTimelineAfterTweet)
                {
                    foreach (var account in accounts)
                    {
                        var column =
                            account.Columns.First(
                                y => y.Model.Action == SettingSupport.ColumnTypeEnum.Home);
                        if (!column.Model.Streaming)
                        {
                            column.RefreshCommand.Execute();
                        }
                    }
                }
            });

            SuggestSelectedCommand = new ReactiveCommand();
            SuggestSelectedCommand.SubscribeOn(ThreadPoolScheduler.Default)
            .Subscribe(x => { Model.SuggestionSelected((string)x); });

            DeleteReplyOrQuotedStatusCommand = new ReactiveCommand();
            DeleteReplyOrQuotedStatusCommand.SubscribeOn(ThreadPoolScheduler.Default)
            .Subscribe(async x =>
            {
                ReplyOrQuotedStatus.Value = null;

                Model.IsQuotedRetweet     = false;
                Model.IsReply             = false;
                Model.ReplyOrQuotedStatus = null;

                Model.Text = string.Empty;

                await Task.Delay(50);
                await TextBoxFocusMessenger.Raise(new Notification());
            });

            PasteClipbordPictureCommand = new ReactiveCommand();
            PasteClipbordPictureCommand.SubscribeOn(ThreadPoolScheduler.Default)
            .Subscribe(async x => { await Model.AddPictureFromClipboard(); });

            Notice.Instance.TweetAreaDeletePictureCommand.SubscribeOn(ThreadPoolScheduler.Default)
            .Subscribe(x =>
            {
                var pictureViewModel = x as PictureViewModel;
                Model.DeletePicture(pictureViewModel.PictureModel);
            });

            Notice.Instance.ReplyCommand.SubscribeOn(ThreadPoolScheduler.Default)
            .Subscribe(async x =>
            {
                var statusViewModel = x as StatusViewModel;
                var screenName      = x as string;
                if (statusViewModel != null)
                {
                    ReplyOrQuotedStatus.Value = statusViewModel;

                    Model.IsQuotedRetweet     = false;
                    Model.IsReply             = true;
                    Model.ReplyOrQuotedStatus = statusViewModel.Model;

                    Model.Text = "@" + statusViewModel.Model.User.ScreenName + " ";

                    Notice.Instance.TweetAreaOpenCommand.Execute(true);

                    await Task.Delay(50);

                    Model.SelectionStart = Model.Text.Length;
                }
                else if (!string.IsNullOrWhiteSpace(screenName))
                {
                    Model.Text = "@" + screenName + " ";

                    Notice.Instance.TweetAreaOpenCommand.Execute(true);

                    await Task.Delay(50);

                    Model.SelectionStart = Model.Text.Length;
                }

                if (Setting.ResetPostingAccountBeforeTweetAreaOpening)
                {
                    foreach (var account in Accounts)
                    {
                        account.IsTweetEnabled.Value = account.Model.IsEnabled;
                    }
                }
            });

            Notice.Instance.ReplyToAllCommand.SubscribeOn(ThreadPoolScheduler.Default)
            .Subscribe(async x =>
            {
                var statusViewModel = x as StatusViewModel;
                if (statusViewModel == null)
                {
                    return;
                }

                ReplyOrQuotedStatus.Value = statusViewModel;

                Model.IsQuotedRetweet     = false;
                Model.IsReply             = true;
                Model.ReplyOrQuotedStatus = statusViewModel.Model;

                var userList = new List <string>();

                Model.Text = "@" + statusViewModel.Model.User.ScreenName + " ";
                userList.Add(statusViewModel.Model.User.ScreenName);

                if (statusViewModel.Model.Entities?.UserMentions != null)
                {
                    foreach (var user in statusViewModel.Model.Entities.UserMentions)
                    {
                        if (userList.Contains(user.ScreenName) ||
                            SelectedAccounts.Value.Select(y => y.ScreenName.Value).Contains(user.ScreenName))
                        {
                            continue;
                        }

                        Model.Text += "@" + user.ScreenName + " ";
                        userList.Add(user.ScreenName);
                    }
                }

                Notice.Instance.TweetAreaOpenCommand.Execute(true);

                await Task.Delay(50);

                Model.SelectionStart = Model.Text.Length;
            });

            Notice.Instance.ReplyToStatusesCommand.SubscribeOn(ThreadPoolScheduler.Default)
            .Subscribe(async x =>
            {
                var items = x as IEnumerable;
                if (items == null)
                {
                    return;
                }

                var statusViewModels = items.Cast <StatusViewModel>();
                if (!statusViewModels.Any())
                {
                    return;
                }

                var statusViewModel = statusViewModels.First();

                ReplyOrQuotedStatus.Value = statusViewModels.First();

                Model.IsQuotedRetweet     = false;
                Model.IsReply             = true;
                Model.ReplyOrQuotedStatus = statusViewModel.Model;

                var userList = new List <string>();
                foreach (var sVm in statusViewModels)
                {
                    if (userList.Contains(sVm.ScreenName) ||
                        SelectedAccounts.Value.Select(y => y.ScreenName.Value).Contains(sVm.ScreenName))
                    {
                        continue;
                    }

                    userList.Add(sVm.Model.User.ScreenName);

                    foreach (var user in sVm.Model.Entities.UserMentions)
                    {
                        if (userList.Contains(user.ScreenName) ||
                            SelectedAccounts.Value.Select(y => y.ScreenName.Value).Contains(user.ScreenName))
                        {
                            continue;
                        }

                        Model.Text += "@" + user.ScreenName + " ";
                        userList.Add(user.ScreenName);
                    }
                }

                Model.Text = string.Join(" ", userList.Select(screenName => "@" + screenName)) + " ";

                Notice.Instance.TweetAreaOpenCommand.Execute(true);

                await Task.Delay(50);

                Model.SelectionStart = Model.Text.Length;
            });

            Notice.Instance.UrlQuoteRetweetCommand.SubscribeOn(ThreadPoolScheduler.Default)
            .Subscribe(async x =>
            {
                var statusViewModel = x as StatusViewModel;
                if (statusViewModel == null)
                {
                    return;
                }

                ReplyOrQuotedStatus.Value = statusViewModel;

                Model.IsQuotedRetweet     = true;
                Model.IsReply             = false;
                Model.ReplyOrQuotedStatus = statusViewModel.Model;

                Model.Text = "";

                Notice.Instance.TweetAreaOpenCommand.Execute(true);

                await Task.Delay(50);

                Model.SelectionStart = 0;
            });
        }
Beispiel #7
0
 public void AccountUnchecked(AccountViewModel account)
 {
     SelectedAccounts.Remove(account);
     OnPropertyChanged(() => FilteredEvents);
     OnPropertyChanged(() => ThisMonthEvents);
 }
Beispiel #8
0
        void Send(object param)
        {
            if (!CheckProtectedAccounts())
            {
                return;
            }

            requestsLeft = 0;

            if (SelectedAccounts.Count == 0)
            {
                MessageService.ShowError(Resources.SelectAccount);
                return;
            }

            BarText   = Resources.SendingTweet;
            IsLoading = true;

            if (IsDM)
            {
                ServiceDispatcher.GetService(DataTransfer.CurrentAccount).SendDirectMessage(new SendDirectMessageOptions {
                    UserId = (int)DataTransfer.DMDestinationId, Text = TweetText
                }, ReceiveDM);
            }
            else
            {
                if (UsesTwitlonger)
                {
                    if (!EnsureTwitlonger())
                    {
                        IsLoading = false;
                        return;
                    }

                    BarText = Resources.UploadingTwitlonger;
                    foreach (UserToken account in SelectedAccounts.Cast <UserToken>())
                    {
                        ServiceDispatcher.GetTwitlongerService(account).PostUpdate(TweetText, ReceiveTLResponse);
                        requestsLeft++;
                    }
                }
                else
                {
                    if (IsGeotagged)
                    {
                        var location = geoWatcher.Position.Location;

                        foreach (UserToken account in SelectedAccounts.Cast <UserToken>())
                        {
                            ServiceDispatcher.GetService(account).SendTweet(new SendTweetOptions
                            {
                                Status            = TweetText,
                                InReplyToStatusId = DataTransfer.ReplyId,
                                Lat  = location.Latitude,
                                Long = location.Longitude
                            }, ReceiveResponse);
                            requestsLeft++;
                        }
                    }
                    else
                    {
                        foreach (UserToken account in SelectedAccounts.Cast <UserToken>())
                        {
                            ServiceDispatcher.GetService(account).SendTweet(new SendTweetOptions {
                                Status = TweetText, InReplyToStatusId = DataTransfer.ReplyId
                            }, ReceiveResponse);
                            requestsLeft++;
                        }
                    }
                }
            }

            if (DataTransfer.Draft != null)
            {
                if (Config.Drafts.Contains(DataTransfer.Draft))
                {
                    Config.Drafts.Remove(DataTransfer.Draft);
                }

                DataTransfer.Draft = null;
                Config.SaveDrafts();
            }
        }