diff --git a/StoPasswordBook/StoPasswordBook/Extern/AutoUpdate.cs b/StoPasswordBook/StoPasswordBook/Extern/AutoUpdate.cs index 339a0da..1659d72 100644 --- a/StoPasswordBook/StoPasswordBook/Extern/AutoUpdate.cs +++ b/StoPasswordBook/StoPasswordBook/Extern/AutoUpdate.cs @@ -1,5 +1,6 @@ using System.Diagnostics; using System.IO; +using System.Windows; using log4net; using StoPasswordBook; using StoPasswordBook.Generic; @@ -44,6 +45,7 @@ public static void CheckAndUpdate() if (!File.Exists(commonUpdaterPath)) { Log.Info("There's no CommonUpdater in the folder. Failed to update."); + MessageBox.Show("There's no CommonUpdater in the folder. Failed to update.\nIf you want get more supports, Please use the AutoUpdate feature"); return; } diff --git a/StoPasswordBook/StoPasswordBook/Generic/Api.cs b/StoPasswordBook/StoPasswordBook/Generic/Api.cs index 0a07c06..5467c1c 100644 --- a/StoPasswordBook/StoPasswordBook/Generic/Api.cs +++ b/StoPasswordBook/StoPasswordBook/Generic/Api.cs @@ -1,6 +1,8 @@ using System.ComponentModel; using System.Diagnostics; using System.IO; +using System.Net; +using System.Net.Sockets; using System.Reflection; using System.Text.RegularExpressions; using System.Windows.Media; @@ -187,14 +189,14 @@ private static void AppendElement(XmlDocument doc, XmlNode root, string name, st root.AppendChild(element); } - private static async Task Locate() + private static async Task Locate() { try { if (BrowserManager.Browser == null) { Log.Error("Browser is null."); - return; + throw new UnreachableException(); } var page = await BrowserManager.Browser.NewPageAsync(); @@ -204,7 +206,7 @@ private static async Task Locate() await pageHandler.NavigateTo(GlobalVariables.DebugUrl); Log.Debug($"Attempting accessing {GlobalVariables.DebugUrl}"); - MainWindow.UpdateText($"Attempting accessing {GlobalVariables.DebugUrl}"); + MainWindow.UpdateText("Attempting accessing STO Launcher"); var linkElement = await pageHandler.QuerySelector("a[title='Cryptic Launcher | Star Trek']"); if (linkElement != null) @@ -214,7 +216,7 @@ private static async Task Locate() GlobalVariables.DebugUrl = hrefJson.ToString(); await page.GoToAsync(GlobalVariables.DebugUrl); Log.Debug(GlobalVariables.DebugUrl); - MainWindow.UpdateText($"Attempting accessing {GlobalVariables.DebugUrl}"); + MainWindow.UpdateText("Attempting accessing STO Launcher"); } string pattern = @"ws=127\.0\.0\.1:\d+/devtools/page/([A-F0-9]{32})"; @@ -226,15 +228,13 @@ private static async Task Locate() } else { - MainWindow.UpdateText("Launcher timed out."); - KillExistingInstances("Star Trek Online.exe"); + throw new UnreachableException(); } if (pageId == "null") { Log.Error("PageId is null."); - MainWindow.UpdateText("Please try again."); - return; + throw new UnreachableException(); } string webSocketUrl = $"ws://localhost:{GlobalVariables.DebugPort}/devtools/page/{pageId}"; @@ -244,7 +244,7 @@ private static async Task Locate() WebSocketManager.InitWebSocket(GlobalVariables.WebSocketUrl); - MainWindow.UpdateText("Done.", Brushes.Green); + MainWindow.UpdateText("Done! Please choose a Account for login.", Brushes.Green); Log.Info("Api initialized."); await page.CloseAsync(); @@ -254,8 +254,20 @@ private static async Task Locate() catch (Exception ex) { Log.Error(ex.Message + ex.StackTrace); + throw new UnreachableException(); } } + + private static int GetAvailablePort() + { + using TcpListener listener = new TcpListener(IPAddress.Loopback, 0); + + listener.Start(); + IPEndPoint endpoint = (IPEndPoint)listener.LocalEndpoint; + listener.Stop(); + + return endpoint.Port; + } public static async Task InitApi() { @@ -282,9 +294,8 @@ public static async Task InitApi() SaveSettings(); Log.Debug(GlobalVariables.LauncherPath); - Random random = new Random(); - int randomNum = random.Next(500, 65535); - GlobalVariables.DebugPort = randomNum; + int availablePort = GetAvailablePort(); + GlobalVariables.DebugPort = availablePort; Log.Debug(GlobalVariables.DebugPort); if (!File.Exists(GlobalVariables.LauncherPath)) @@ -301,9 +312,21 @@ public static async Task InitApi() Process.Start(processStartInfo); Log.Debug($"Trying to start launcher with {processStartInfo.Arguments}"); - await Task.Delay(TimeSpan.FromSeconds(GlobalVariables.WaitInterval)); await BrowserManager.InitBrowser(); - await Locate(); + await RetryLocate(); + } + + private static async Task RetryLocate() + { + try + { + await Locate(); + } + catch (UnreachableException ex) + { + Log.Error($"Locate failed. Retrying..."); + await RetryLocate(); + } } } } \ No newline at end of file diff --git a/StoPasswordBook/StoPasswordBook/Generic/GlobalVariables.cs b/StoPasswordBook/StoPasswordBook/Generic/GlobalVariables.cs index 8bcf346..0bd5d72 100644 --- a/StoPasswordBook/StoPasswordBook/Generic/GlobalVariables.cs +++ b/StoPasswordBook/StoPasswordBook/Generic/GlobalVariables.cs @@ -19,8 +19,5 @@ public class GlobalVariables [IgnoreSetting] public static string WebSocketUrl { get; set; } = "null"; - - [Description("How many seconds the program will wait. \nDefault value: 5")] - public static int WaitInterval { get; set; } = 10; } } \ No newline at end of file diff --git a/StoPasswordBook/StoPasswordBook/Generic/PageHandler.cs b/StoPasswordBook/StoPasswordBook/Generic/PageHandler.cs index da1cef6..59f044a 100644 --- a/StoPasswordBook/StoPasswordBook/Generic/PageHandler.cs +++ b/StoPasswordBook/StoPasswordBook/Generic/PageHandler.cs @@ -38,26 +38,5 @@ public async Task NavigateTo(string url) return null; } } - - public async Task FillInputField(string selector, string value) - { - try - { - var element = await QuerySelector(selector); - if (element != null) - { - await element.EvaluateFunctionAsync("el => el.value = arguments[0]", value); - Console.WriteLine($"{selector} filled with {value}."); - } - else - { - Console.WriteLine($"Element {selector} not found."); - } - } - catch (Exception e) - { - Console.WriteLine($"Error filling input field {selector}: {e.Message}"); - } - } } } \ No newline at end of file diff --git a/StoPasswordBook/StoPasswordBook/Generic/WebSocketManager.cs b/StoPasswordBook/StoPasswordBook/Generic/WebSocketManager.cs index c68fec4..c1d8cd1 100644 --- a/StoPasswordBook/StoPasswordBook/Generic/WebSocketManager.cs +++ b/StoPasswordBook/StoPasswordBook/Generic/WebSocketManager.cs @@ -45,6 +45,8 @@ private static void OnMessage(object? sender, MessageEventArgs ev) { rst = rst.Replace(LastAccount[0], "ACCOUNT_HIDDEN_DUE_TO_PRIVACY"); Log.Info($"Response From Username Column: {rst}"); + + MainWindow.UpdateText("Sent account and passwords to Launcher.", Brushes.CornflowerBlue); return; } @@ -52,6 +54,8 @@ private static void OnMessage(object? sender, MessageEventArgs ev) { rst = rst.Replace(LastAccount[1], "PASSWORD_HIDDEN_DUE_TO_PRIVACY"); Log.Info($"Response From Password Column: {rst}"); + + MainWindow.UpdateText("Sent account and passwords to Launcher.", Brushes.CornflowerBlue); return; } } @@ -65,10 +69,22 @@ private static void OnMessage(object? sender, MessageEventArgs ev) } } - public static bool SetUsernameAndPassword(WebSocket webSocket, string userStr, string pwdStr) + public static bool SetUsernameAndPassword(WebSocket? webSocket, string? userStr, string? pwdStr) { try { + if (webSocket == null) + { + MainWindow.UpdateText("Websocket is null. Please try again."); + return false; + } + + if (string.IsNullOrEmpty(userStr) || string.IsNullOrEmpty(pwdStr)) + { + MainWindow.UpdateText("Account or Password is null or empty. Please check Shadow.xml"); + return false; + } + Random random = new Random(); int random0 = random.Next(1, 10000); int random1 = random.Next(1, 10000); @@ -96,7 +112,6 @@ public static bool SetUsernameAndPassword(WebSocket webSocket, string userStr, s } }; webSocket.Send(JsonConvert.SerializeObject(setPassword)); - MainWindow.UpdateText("Sent account and passwords to Launcher.", Brushes.CornflowerBlue); return true; } diff --git a/StoPasswordBook/StoPasswordBook/MainWindow.xaml.cs b/StoPasswordBook/StoPasswordBook/MainWindow.xaml.cs index 7a3ee8e..894aa71 100644 --- a/StoPasswordBook/StoPasswordBook/MainWindow.xaml.cs +++ b/StoPasswordBook/StoPasswordBook/MainWindow.xaml.cs @@ -16,7 +16,7 @@ namespace StoPasswordBook; /// </summary> public partial class MainWindow : FluentWindow { - public static readonly string Version = "1.0.1"; + public static readonly string Version = "1.0.2"; private static readonly ILog Log = LogManager.GetLogger(typeof(MainWindow)); @@ -98,7 +98,7 @@ private async void SubmitButton_Click(object sender, RoutedEventArgs e) { var selectedAccount = AccountComboBox.SelectedItem as KeyValuePair<string, string>?; - if (selectedAccount.HasValue) + if (selectedAccount != null && selectedAccount.HasValue) { var accountName = selectedAccount.Value.Key; var selectedPassword = selectedAccount.Value.Value;