SimpleMessagingService

Log | Files | Refs | README

MainWindow.xaml.cs (7172B)


      1 using Client.Utilities;
      2 using Shared.Contracts;
      3 using System.Linq.Expressions;
      4 using System.Net;
      5 using System.Text.Json;
      6 using System.Windows;
      7 using System.Windows.Controls;
      8 using System.Windows.Threading;
      9 
     10 namespace Client;
     11 
     12 public partial class MainWindow : Window
     13 {
     14     private IApiInterface _apiInterface;
     15     private ISettingsInterface _settingsInterface = new SettingsInterface();
     16     private Settings _settings { get; set; }
     17     private DispatcherTimer _timer;
     18 
     19     private Server? _selectedServer => _settings?.Servers?.FirstOrDefault(x => x.serverId == _settings.SelectedServer);
     20 
     21     public MainWindow()
     22     {
     23         InitializeComponent();
     24     }
     25 
     26     private async void Window_Loaded(object sender, RoutedEventArgs e)
     27     {
     28         await LoadSettings();
     29 
     30         _timer = new DispatcherTimer { Interval = TimeSpan.FromMilliseconds(_settings.PollingInterval) };
     31         _timer.Tick += PollingCallback;
     32         _timer.Start();
     33     }
     34 
     35     private async void PollingCallback(object sender, EventArgs e)
     36     {
     37         await LoadMessages();
     38         await LoadUsers();
     39     }
     40 
     41     private async Task LoadSettings()
     42     {
     43         _settings = await _settingsInterface.LoadSettingsAsync<Settings>();
     44 
     45         if (_settings == null)
     46         {
     47             _settings = new Settings();
     48             await _settingsInterface.SaveSettingsAsync(_settings);
     49         }
     50 
     51         await LoadServers();
     52     }
     53 
     54     private async Task LoadServers()
     55     {
     56         var itemsToRemove = new List<MenuItem>();
     57 
     58         foreach (var item in ServerMenu.Items)
     59         {
     60             if (item is MenuItem menuItem && menuItem.Name == "server_item")
     61             {
     62                 itemsToRemove.Add(menuItem);
     63             }
     64         }
     65 
     66         foreach (var item in itemsToRemove)
     67         {
     68             ServerMenu.Items.Remove(item);
     69         }
     70 
     71         foreach (var server in _settings.Servers)
     72         {
     73             var newServerItem = new MenuItem { Header = server.Name, Name = "server_item", IsChecked = server.serverId == _settings.SelectedServer ? true : false };
     74             newServerItem.Click += (s, args) => ConnectToServer(server.serverId);
     75             ServerMenu.Items.Insert(ServerMenu.Items.Count, newServerItem);
     76         }
     77 
     78 
     79         var selectedServerUrl = _settings.Servers.FirstOrDefault(s => s.serverId == _settings.SelectedServer)?.Url;
     80         if (selectedServerUrl != null)
     81         {
     82             MainHeading.Text = $"Connecting to {_selectedServer.Name}";
     83             _apiInterface = new ApiInterface(selectedServerUrl);
     84 
     85             Register(_selectedServer.User);
     86             _apiInterface.ServerKey = (Guid)_selectedServer.Key;
     87             await LoadMessages();
     88             await LoadUsers();
     89         }
     90     }
     91 
     92     private async Task LoadMessages()
     93     {
     94         var messages = await _apiInterface.GetMessagesAsync();
     95 
     96         Dispatcher.Invoke(() => MessageList.Items.Clear());
     97 
     98         if (messages?.messages == null)
     99         {
    100             return;
    101         }
    102 
    103         Dispatcher.Invoke(() => MainHeading.Text = $"Connected to {_selectedServer.Name}");
    104 
    105         foreach (var message in messages?.messages)
    106         {
    107             var timeStamp = message.TimeStamp.ToString("g");
    108             Dispatcher.Invoke(() => MessageList.Items.Add($"{timeStamp} - {message.Sender}: {message.Content}"));
    109         }
    110     }
    111 
    112     private async Task LoadUsers()
    113     {
    114         var users = await _apiInterface.GetUsersAsync();
    115         Dispatcher.Invoke(() => UserList.Items.Clear());
    116 
    117         if (users?.users == null)
    118         {
    119             return;
    120         }
    121 
    122         foreach (var user in users?.users)
    123         {
    124             Dispatcher.Invoke(() => UserList.Items.Add(user.Username));
    125         }
    126     }
    127 
    128     private async void Server_Add_Click(object sender, RoutedEventArgs e)
    129     {
    130         AddServerWindow addServerWindow = new AddServerWindow();
    131         if (addServerWindow.ShowDialog() == true)
    132         {
    133             string serverName = addServerWindow.ServerName;
    134             string username = addServerWindow.Username;
    135             Uri serverUri;
    136             try
    137             {
    138                 serverUri = new Uri(addServerWindow.ServerUrl);
    139             } 
    140             catch (UriFormatException)
    141             {
    142                 MessageBox.Show("Invalid Url");
    143                 return;
    144             }
    145 
    146             var newServer = new Server { Name = serverName, User = username, Url = serverUri };
    147             _settings.Servers.Add(newServer);
    148             _settings.SelectedServer = newServer.serverId;
    149             await _settingsInterface.SaveSettingsAsync(_settings);
    150             await LoadServers();
    151         }
    152     }
    153 
    154     private async void ConnectToServer(Guid key)
    155     {
    156         Dispatcher.Invoke(() => UserList.Items.Clear());
    157         Dispatcher.Invoke(() => MessageList.Items.Clear());
    158         _settings.SelectedServer = key;
    159         await _settingsInterface.SaveSettingsAsync(_settings);
    160         await LoadServers();
    161         var server = _settings.Servers.FirstOrDefault(s => s.serverId == key);
    162     }
    163 
    164     private async void Register(string newUserName)
    165     {
    166         if (_selectedServer?.Key != null && _selectedServer?.Key != Guid.Empty)
    167         {
    168             return;
    169         }
    170 
    171         var response = await _apiInterface.PostUserAsync(newUserName);
    172         if (response == null || !response.IsSuccessStatusCode)
    173         {
    174             MessageBox.Show("Failed to register");
    175             return;
    176         } 
    177         else
    178         {
    179             var test = await response.Content.ReadAsStringAsync();
    180             var newUserContract = JsonSerializer.Deserialize<NewUserContract>(await response.Content.ReadAsStringAsync(), new JsonSerializerOptions { PropertyNameCaseInsensitive = true });
    181             var index = _settings.Servers.FindIndex(x => x.serverId == _selectedServer.serverId);
    182             _settings.Servers[index].Key = newUserContract?.Key;
    183             await _settingsInterface.SaveSettingsAsync(_settings);
    184         }
    185     }
    186 
    187     private async void SendButton_Click(object sender, RoutedEventArgs e)
    188     {
    189         var response = await _apiInterface.PostMessageAsync(MessageInput.Text);
    190         if (!response.IsSuccessStatusCode)
    191         {
    192             var errorMessage = await response.Content.ReadAsStringAsync();
    193             switch (response.StatusCode)
    194             {
    195                 case HttpStatusCode.BadRequest:
    196                     MessageBox.Show($"Bad request.\n{errorMessage}");
    197                     break;
    198                 case HttpStatusCode.InternalServerError:
    199                     MessageBox.Show("Internal server error");
    200                     break;
    201                 default:
    202                     MessageBox.Show("Unknown error");
    203                     break;
    204             }
    205         } 
    206         else
    207         {
    208             MessageInput.Text = "";
    209             await LoadMessages();
    210         }
    211     }
    212 
    213     private void Server_Remove_Click(object sender, RoutedEventArgs e)
    214     {
    215         var index = _settings.Servers.FindIndex(x => x.serverId == _settings.SelectedServer);
    216         _settings.Servers.RemoveAt(index);
    217         _settings.SelectedServer = _settings.Servers.FirstOrDefault()?.serverId;
    218         _settingsInterface.SaveSettingsAsync(_settings);
    219         LoadSettings();
    220     }
    221 }