using qtc_net_client_2.ClientModel; using qtc_net_client_2.Services; using QtCNETAPI.Services; using QtCNETAPI.Services.ApiService; using QtCNETAPI.Services.GatewayService; using System.Text.Json; using System.Threading.Tasks; namespace qtc_net_client_2 { internal static class Program { /// /// The main entry point for the application. /// [STAThread] static async Task Main() { // first thing, create a new log LoggingService loggingService = new(); Config clientConfig = new Config(); if(System.Diagnostics.Debugger.IsAttached) { // use localhost clientConfig.ServerUrl = "http://localhost:5268"; } // find config file if(!File.Exists("./config.json")) { // create it using default config model string configJson = JsonSerializer.Serialize(clientConfig, options: new JsonSerializerOptions { WriteIndented = true }); File.WriteAllText("./config.json", configJson); } else { try { // use config in file Config? fileConfig = JsonSerializer.Deserialize(File.ReadAllText("./config.json")); if (fileConfig != null) { clientConfig = fileConfig; } } catch (JsonException) { // there was a missing property, reset config to default string configJson = JsonSerializer.Serialize(clientConfig, options: new JsonSerializerOptions { WriteIndented = true }); File.WriteAllText("./config.json", configJson); } } // instantiate new ApiService and GatewayService for this session // this will keep the gateway thread in the main thread (i think) IApiService api = new ApiService($"{clientConfig.ServerUrl}/api"); IGatewayService gateway = new GatewayService($"{clientConfig.ServerUrl}/chat", api, loggingService); // ping api var pingResult = await api.PingServerAsync(); if (!pingResult.Success) { MessageBox.Show("The Server Specified In The Config Could Not Be Reached.\nCheck The URL Specified, Otherwise Contact The Server Admin.", "Uh Oh.", MessageBoxButtons.OK, MessageBoxIcon.Error); Environment.Exit(1); } // check for updates UpdateService updateService = new(); await updateService.CheckForUpdatesAsync(); // To customize application configuration such as set high DPI settings or default font, // see https://aka.ms/applicationconfiguration. ApplicationConfiguration.Initialize(); Application.Run(new Main(api, gateway, clientConfig, loggingService)); // if application loop is exited, dispose everything await gateway.DisposeAsync(); loggingService.Dispose(); api = null!; // shut up compiler >:( gateway = null!; Environment.Exit(0); } } }