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 }