using CapchaLibrary; using OOO_WriteAndClear.DBModels; using OOO_WriteAndClear.EventBus.Signals; using OOO_WriteAndClear.MVP.MVPInterfaces; using OOO_WriteAndClear.MVP.Presenters; using System; using System.Collections.Generic; using System.Drawing; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; using System.Windows.Threading; namespace OOO_WriteAndClear.MVP.Views { /// /// Логика взаимодействия для AuthorizationUserControl.xaml /// public partial class AuthorizationUserControl : UserControl, IAuthorizationContract.IView { public AuthorizationUserControl() { InitializeComponent(); _presenter = new AuthorizationUserControlPresenter(this); _dispatcherTimer = new DispatcherTimer(); _dispatcherTimer.Tick += EnableButton; _dispatcherTimer.Interval = new TimeSpan(0, 0, 10); } #region Реализация IAuthorizationContract.IView /// /// Вывести сообщение о провале авторизации /// public void ShowFailureAuthorizeMessage() { MessageBox.Show("Провал авторизации!", "Пользователя не существует, проверьте правильность написания логина и пароля", MessageBoxButton.OK, MessageBoxImage.Error); Dispatcher.BeginInvoke(new Action(() => { if (_capchaCode is not null) DisableButtonAndStartTimer(); UpdateCapcha(); CapchaStackPanel.Visibility = Visibility.Visible; })).Wait(); } /// /// Выполняет действия необходимые для входа пользователя в систему /// /// Авторизованный пользователь public void LetInAuthorizedUser(User user) { Dispatcher.BeginInvoke(new Action(() => { EventBus.EventBus.GetService().Invoke(new UserWasLoggedSignal(user)); })); } #endregion public string Login { get => LoginField.Text; set => LoginField.Text = value; } public string Password { get => PasswordField.Password; set => PasswordField.Password = value; } private readonly IAuthorizationContract.IPresenter _presenter; private string? _capchaCode = null; private readonly DispatcherTimer _dispatcherTimer; #region Обработчики событий разметки /// /// Обработчик события нажатия на кнопку авторизации /// /// Кнопка /// Аргументы события private void LoginButton_Click(object sender, RoutedEventArgs e) { if (_capchaCode is not null && _capchaCode != CapchaCodeTextBox.Text) { MessageBox.Show("Капча введена не верно!", "Капча", MessageBoxButton.OK); UpdateCapcha(); DisableButtonAndStartTimer(); return; } string login = Login; string password = Password; Task.Run(() => { _presenter.CheckTheUser(login, password); }); } /// /// Обработчик события нажатия на ссылку входа как гость /// /// Ссылка /// Аргументы события private void LoginAsGuestLink_Click(object sender, RoutedEventArgs e) { EventBus.EventBus.GetService().Invoke(new UserWasLoggedSignal(new User() { UserId = -1 })); //ID = -1, так как пользователь не авторизован } private void RefreshCapcha_Click(object sender, RoutedEventArgs e) { UpdateCapcha(); } #endregion private void UpdateCapcha() { CapchaData capchaData = new CapchaGenerator().GenerateCapcha(); _capchaCode = capchaData.Code; BitmapImage bitmapimage = new BitmapImage(); using (MemoryStream memory = new MemoryStream()) { capchaData.CapchaImage.Save(memory, System.Drawing.Imaging.ImageFormat.Bmp); memory.Position = 0; bitmapimage.BeginInit(); bitmapimage.StreamSource = memory; bitmapimage.CacheOption = BitmapCacheOption.OnLoad; bitmapimage.EndInit(); } CapchaImage.Source = bitmapimage; } private void DisableButtonAndStartTimer() { AuthButton.IsEnabled = false; _dispatcherTimer.Start(); } private void EnableButton(object sender, EventArgs e) { AuthButton.IsEnabled = true; } } }