Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Collections.Generic;
- using System.ComponentModel;
- using System.Linq;
- using System.Runtime.CompilerServices;
- using System.Text;
- using System.Threading.Tasks;
- using ShikiDesk;
- using ShikiApiLib;
- using System.Windows.Input;
- //using Microsoft.TeamFoundation.MVVM; //не смог найти dll для подключения пространства имён, поэтому закомментировано
- namespace ShikiDeskVM
- {
- class VM : INotifyPropertyChanged
- {
- protected bool Set<T>(ref T field, T value, [CallerMemberName] string propertyName = null)
- {
- if (EqualityComparer<T>.Default.Equals(field, value))
- return false;
- field = value;
- RaisePropertyChanged(propertyName);
- return true;
- }
- protected void RaisePropertyChanged([CallerMemberName] string propertyName = null) =>
- PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
- public event PropertyChangedEventHandler PropertyChanged;
- }
- class MainVM : VM
- {
- public MainVM() //при инициализации сразу пытаемся получить авторизацию из сохранённых данных
- {
- if (!String.IsNullOrWhiteSpace(ShikiDesk.Properties.Settings.Default.nickname) &&
- !String.IsNullOrWhiteSpace(ShikiDesk.Properties.Settings.Default.access_token) &&
- ShikiDesk.Properties.Settings.Default.curren_user_id != -1)
- {
- User = new ShikiApi(ShikiDesk.Properties.Settings.Default.nickname,
- ShikiDesk.Properties.Settings.Default.access_token,
- ShikiDesk.Properties.Settings.Default.curren_user_id);
- }
- }
- ShikiApi _user;
- public ShikiApi User //инициализированный экземпляр данного класса = авторизованный пользователь
- {
- get { return _user; }
- set { Set(ref _user, value); }
- }
- ProgressBar _progressBar;
- public ProgressBar ProgressBar //для прослеживания прогресса загрузки данных
- {
- get { return _progressBar; }
- set { Set(ref _progressBar, value); }
- }
- public bool HasCredentials() //Если переменная не получила значение в конструкторе MainVM, значит нет авторизации
- {
- return (User != null);
- }
- public void SetCredentials(AutorizationVM autorizationVM)
- {
- User = autorizationVM.User;
- }
- public void DownloadData()
- {
- ProgressBar = new ProgressBar();
- ProgressBar.Set(0, "Ожидайте. Идёт первоначальная загрузка.");
- if (ShikiDesk.Properties.Settings.Default.firstStart) //решил, что данный метод можно будет использовать и для интервальных
- { //обновлений с сервера, поэтому отдельно выделил запросы, которые
- User.GetUserInfo(); //нужны лишь при первом входе
- }
- ProgressBar.Set(30, "Идёт загрузка аниме листа. Продолжительность ожидания зависит от количества аниме в вашем списке.");
- User.GetAnimeRates();
- ProgressBar.Set(50, "Идёт загрузка манга листа. Продолжительность ожидания зависит от количества манги в вашем списке.");
- User.GetMangaRates();
- ProgressBar.Set(80, "Кэширование данных на диск. Ещё пара секунд..");
- DBMethods.FillDataDB(User.anime_rates); //Поля anime_rate и manga_rate сохраняют в себя последний результат соответствующих
- //методов выше
- DBMethods.FillDataDB(User.manga_rates); //сделано так, чтобы не отправлять лишний раз запросов на сервер, а лишь при
- //необходимости самых свежих. Своего рода кэширование результатов запроса.
- //доступны только для чтения.
- ProgressBar.Set(100, "Загрузка завершена. Запуск приложения.");
- }
- }
- class AutorizationVM : VM
- {
- public AutorizationVM()
- {
- Nickname = ShikiDesk.Properties.Settings.Default.nickname;
- //TryLogin = new RelayCommand(onTryLogin); //RelayCommand не существует, без подключения пространства выше
- }
- string _nickname;
- public string Nickname
- {
- get { return _nickname; }
- set { Set(ref _nickname, value); }
- }
- string _password;
- public string Password
- {
- get { return _password; }
- set { Set(ref _password, value); }
- }
- ShikiApi _user;
- public ShikiApi User
- {
- get { return _user; }
- set { Set(ref _user, value); }
- }
- string _errorString;
- public string ErrorString //Разве не надо сделать так, чтобы изменять поле можно было только внутри класса?
- {
- get { return _errorString; }
- set { Set(ref _errorString, value); }
- }
- bool _savePassword;
- public bool SavePassword //тут по идее должно храниться значение CheckBox "Запомнить пароль"
- {
- get { return _savePassword; }
- set { Set(ref _savePassword, value); }
- }
- TaskCompletionSource<int> taskCompletionSource;
- public ICommand TryLogin { get; }
- public async Task RunAuthorization()
- {
- if (taskCompletionSource != null)
- {
- throw new InvalidOperationException("Авторизация уже идёт.");
- }
- taskCompletionSource = new TaskCompletionSource<int>();
- await taskCompletionSource.Task;
- taskCompletionSource = null;
- }
- void onTryLogin()
- {
- if (string.IsNullOrEmpty(Nickname) || string.IsNullOrEmpty(Password))
- {
- ErrorString = "Пожалуйста введите логин/пароль!";
- return;
- }
- try
- {
- User = new ShikiApi(Nickname, Password);
- }
- catch (Exception ex)
- {
- ErrorString = "Ошибка авторизации: " + ex.Message;
- return;
- }
- if (SavePassword)
- {
- ShikiDesk.Properties.Settings.Default.nickname = User.nickname;
- ShikiDesk.Properties.Settings.Default.access_token = User.access_token;
- ShikiDesk.Properties.Settings.Default.curren_user_id = User.current_user_id;
- ShikiDesk.Properties.Settings.Default.firstStart = false; //Если сохранили пароль, то следующий вход уже не первый.
- ShikiDesk.Properties.Settings.Default.Save();
- }
- taskCompletionSource.SetResult(0); // только если всё прошло успешно, завершить задачу, что приведёт к возврату управления главному окну.
- }
- }
- class ProgressBar
- {
- public ProgressBar()
- {
- Percent = 0;
- Log = "Загрузка...";
- }
- int _percent;
- public int Percent
- {
- get { return (_percent > 100) ? 100 : _percent; }
- set { _percent = (value > 100) ? 100 : value; }
- }
- string _log;
- public string Log
- {
- get { return "[" + _percent + "] " + _log; }
- set { _log = value; }
- }
- public void Set(int percent, string log)
- {
- Percent = percent;
- Log = log;
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement