From a3b215f6eeeb1afe965f0abe6e262f563c9659aa Mon Sep 17 00:00:00 2001 From: AoShinHo Date: Sat, 4 Apr 2026 20:51:22 -0300 Subject: [PATCH 1/5] add tracking to processes on program crashes, and reopen kill it properly, adjust some robrowser commands and change compile mode to recompile on msbuild --- AoShinhoServ-Monitor.csproj | 20 ++++++++- AoShinhoServ-Monitor.sln | 16 ++++---- App.config | 13 +++--- Consts.cs | 2 +- Forms/OptionsWnd.xaml.cs | 36 ++++++++-------- ILogging.cs | 10 ++--- IProcess.cs | 67 ++++++++++++++++++++++-------- IText.cs | 8 ++-- MainWindow.xaml | 2 +- MainWindow.xaml.cs | 70 ++++++++++++++++---------------- Properties/Resources.Designer.cs | 2 +- Properties/Settings.Designer.cs | 14 ++++++- Properties/Settings.settings | 3 ++ 13 files changed, 167 insertions(+), 96 deletions(-) diff --git a/AoShinhoServ-Monitor.csproj b/AoShinhoServ-Monitor.csproj index b91d847..875d45f 100644 --- a/AoShinhoServ-Monitor.csproj +++ b/AoShinhoServ-Monitor.csproj @@ -8,12 +8,13 @@ WinExe AoShinhoServ_Monitor AoShinhoServ-Monitor - v4.8.1 + v4.8 512 {60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} 4 true true + AnyCPU @@ -43,6 +44,23 @@ true + + bin\x64\Debug\ + DEBUG;TRACE + x64 + 7.3 + prompt + true + + + bin\x64\Release\ + TRACE + true + x64 + 7.3 + prompt + true + diff --git a/AoShinhoServ-Monitor.sln b/AoShinhoServ-Monitor.sln index 9bc60d9..31ae6de 100644 --- a/AoShinhoServ-Monitor.sln +++ b/AoShinhoServ-Monitor.sln @@ -1,20 +1,20 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 17 -VisualStudioVersion = 17.8.34525.116 +# Visual Studio Version 18 +VisualStudioVersion = 18.4.11612.150 stable MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AoShinhoServ-Monitor", "AoShinhoServ-Monitor.csproj", "{803C0EF4-7706-4E81-908D-69FD4905E48E}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU + Debug|x64 = Debug|x64 + Release|x64 = Release|x64 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {803C0EF4-7706-4E81-908D-69FD4905E48E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {803C0EF4-7706-4E81-908D-69FD4905E48E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {803C0EF4-7706-4E81-908D-69FD4905E48E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {803C0EF4-7706-4E81-908D-69FD4905E48E}.Release|Any CPU.Build.0 = Release|Any CPU + {803C0EF4-7706-4E81-908D-69FD4905E48E}.Debug|x64.ActiveCfg = Debug|x64 + {803C0EF4-7706-4E81-908D-69FD4905E48E}.Debug|x64.Build.0 = Debug|x64 + {803C0EF4-7706-4E81-908D-69FD4905E48E}.Release|x64.ActiveCfg = Release|x64 + {803C0EF4-7706-4E81-908D-69FD4905E48E}.Release|x64.Build.0 = Release|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/App.config b/App.config index f95eed0..06856fd 100644 --- a/App.config +++ b/App.config @@ -1,12 +1,12 @@ - + - -
+ +
- + @@ -55,6 +55,9 @@ 12 + + + - \ No newline at end of file + diff --git a/Consts.cs b/Consts.cs index a884420..9e6dc2b 100644 --- a/Consts.cs +++ b/Consts.cs @@ -2,7 +2,7 @@ namespace AoShinhoServ_Monitor { - public class rAthena + public class ROServers { public enum Type { diff --git a/Forms/OptionsWnd.xaml.cs b/Forms/OptionsWnd.xaml.cs index 8063c56..eb374a8 100644 --- a/Forms/OptionsWnd.xaml.cs +++ b/Forms/OptionsWnd.xaml.cs @@ -20,10 +20,10 @@ public OptionsWnd() #region Btn_Related - public string OpenPathDialogBox(rAthena.Type type) + public string OpenPathDialogBox(ROServers.Type type) { - if (type == rAthena.Type.ROBrowser) + if (type == ROServers.Type.ROBrowser) { using (var dialog = new System.Windows.Forms.FolderBrowserDialog()) { @@ -40,15 +40,15 @@ public string OpenPathDialogBox(rAthena.Type type) OpenFileDialog box; switch (type) { - case rAthena.Type.Login: + case ROServers.Type.Login: box = new OpenFileDialog { Filter = @"login-server (*.exe)|*.exe|All files (*.*)|*.*" }; break; - case rAthena.Type.Char: + case ROServers.Type.Char: box = new OpenFileDialog { Filter = @"char-server (*.exe)|*.exe|All files (*.*)|*.*" }; break; - case rAthena.Type.Web: + case ROServers.Type.Web: box = new OpenFileDialog { Filter = @"web-server (*.exe)|*.exe|All files (*.*)|*.*" }; break; @@ -63,9 +63,9 @@ public string OpenPathDialogBox(rAthena.Type type) switch (type) { - case rAthena.Type.Login: return Configuration.LoginPath; - case rAthena.Type.Char: return Configuration.CharPath; - case rAthena.Type.Web: return Configuration.WebPath; + case ROServers.Type.Login: return Configuration.LoginPath; + case ROServers.Type.Char: return Configuration.CharPath; + case ROServers.Type.Web: return Configuration.WebPath; default: return Configuration.MapPath; } } @@ -85,33 +85,33 @@ private void WhiteMode_Unchecked(object sender, RoutedEventArgs e) { } - private void MapExePath_Click(object sender, RoutedEventArgs e) => SaverAthenaFilePath(MapPath, rAthena.Type.Map); + private void MapExePath_Click(object sender, RoutedEventArgs e) => SaveServerFilePath(MapPath, ROServers.Type.Map); - private void WebExePath_Click(object sender, RoutedEventArgs e) => SaverAthenaFilePath(WebPath, rAthena.Type.Web); + private void WebExePath_Click(object sender, RoutedEventArgs e) => SaveServerFilePath(WebPath, ROServers.Type.Web); - private void LoginExePath_Click(object sender, RoutedEventArgs e) => SaverAthenaFilePath(LoginPath, rAthena.Type.Login); + private void LoginExePath_Click(object sender, RoutedEventArgs e) => SaveServerFilePath(LoginPath, ROServers.Type.Login); - private void CharExePath_Click(object sender, RoutedEventArgs e) => SaverAthenaFilePath(CharPath, rAthena.Type.Char); + private void CharExePath_Click(object sender, RoutedEventArgs e) => SaveServerFilePath(CharPath, ROServers.Type.Char); - private void ROBExePath_Click(object sender, RoutedEventArgs e) => SaverAthenaFilePath(ROBPath, rAthena.Type.ROBrowser); + private void ROBExePath_Click(object sender, RoutedEventArgs e) => SaveServerFilePath(ROBPath, ROServers.Type.ROBrowser); - private void SaverAthenaFilePath(TextBox Box,rAthena.Type Types) + private void SaveServerFilePath(TextBox Box,ROServers.Type Types) { Box.Text = OpenPathDialogBox(Types); switch (Types) { - case rAthena.Type.Login: + case ROServers.Type.Login: Configuration.LoginPath = Box.Text; break; - case rAthena.Type.Char: + case ROServers.Type.Char: Configuration.CharPath = Box.Text; break; - case rAthena.Type.Web: + case ROServers.Type.Web: Configuration.WebPath = Box.Text; break; - case rAthena.Type.ROBrowser: + case ROServers.Type.ROBrowser: Configuration.RobPath = Box.Text; break; default: diff --git a/ILogging.cs b/ILogging.cs index 63aaade..6beb320 100644 --- a/ILogging.cs +++ b/ILogging.cs @@ -30,11 +30,11 @@ internal class ILogging public static Thickness BuildROBMargin { set; get; } public static Thickness OptionSaveMargin { set; get; } public static Thickness OptionCancelMargin { set; get; } - public static rAthena.Data LastErrorLog { set; get; } + public static ROServers.Data LastErrorLog { set; get; } - public static List processesInfos = new List(); + public static List processesInfos = new List(); - public static readonly List errorLogs = new List(); + public static readonly List errorLogs = new List(); public static OptionsWnd OptWin = new OptionsWnd(); @@ -42,9 +42,9 @@ internal class ILogging #region LogWinRelated - public static void Add_ErrorLog(rAthena.Data Data) + public static void Add_ErrorLog(ROServers.Data Data) { - errorLogs.Add(new rAthena.Error { Header = Data.Header, Body = Data.Body }); + errorLogs.Add(new ROServers.Error { Header = Data.Header, Body = Data.Body }); Task.Run(() => UpdateContextMenu()); } diff --git a/IProcess.cs b/IProcess.cs index 22eb500..b3e448e 100644 --- a/IProcess.cs +++ b/IProcess.cs @@ -12,15 +12,15 @@ namespace AoShinhoServ_Monitor public class IProcess { - public static bool KillAll(int ProcessId, rAthena.Type type) + public static bool KillAll(int ProcessId, ROServers.Type type) { try { switch (type) { - case rAthena.Type.WSproxy: - case rAthena.Type.DevConsole: - case rAthena.Type.ROBrowser: + case ROServers.Type.WSproxy: + case ROServers.Type.DevConsole: + case ROServers.Type.ROBrowser: Process.Start(new ProcessStartInfo { FileName = "taskkill", @@ -54,9 +54,9 @@ public static bool Do_Kill_All(bool is_serv = false) { switch (it.type) { - case rAthena.Type.WSproxy: - case rAthena.Type.DevConsole: - case rAthena.Type.ROBrowser: + case ROServers.Type.WSproxy: + case ROServers.Type.DevConsole: + case ROServers.Type.ROBrowser: break; default: ILogging.processesInfos.Remove(it); @@ -68,6 +68,39 @@ public static bool Do_Kill_All(bool is_serv = false) return true; } + public static void SaveTrackedPIDs() + { + var pids = string.Join(",", ILogging.processesInfos.Select(p => $"{p.pID}:{p.type}")); + Properties.Settings.Default.TrackedPIDs = pids; + Properties.Settings.Default.Save(); + } + + public static void KillOrphanProcesses() + { + string tracked = Properties.Settings.Default.TrackedPIDs; + if (string.IsNullOrEmpty(tracked)) return; + + foreach (var entry in tracked.Split(',')) + { + var parts = entry.Split(':'); + if (parts.Length == 2 + && int.TryParse(parts[0], out int pid) + && Enum.TryParse(parts[1], out ROServers.Type type)) + { + try + { + var p = Process.GetProcessById(pid); + if (!p.HasExited) + KillAll(pid, type); + } + catch { } + } + } + + Properties.Settings.Default.TrackedPIDs = ""; + Properties.Settings.Default.Save(); + } + public static string GetFileName(string FilePath) => System.IO.Path.GetFileNameWithoutExtension(FilePath); #region ValidatePathConfig @@ -98,30 +131,30 @@ public static bool CheckMissingFile(string file, string mes) #endregion ValidatePathConfig - public static rAthena.Type GetProcessType(Process rAthenaProcess) + public static ROServers.Type GetProcessType(Process ROProcess) { - rAthena.Type type = rAthena.Type.DevConsole; + ROServers.Type type = ROServers.Type.DevConsole; Parallel.ForEach(ILogging.processesInfos, it => { - if (it.pID == rAthenaProcess.Id) + if (it.pID == ROProcess.Id) type = it.type; }); - if (type != rAthena.Type.DevConsole) + if (type != ROServers.Type.DevConsole) return type; - switch (rAthenaProcess.ProcessName.ToLowerInvariant()) + switch (ROProcess.ProcessName.ToLowerInvariant()) { case var n when n == GetFileName(Configuration.LoginPath).ToLowerInvariant(): - return rAthena.Type.Login; + return ROServers.Type.Login; case var n when n == GetFileName(Configuration.CharPath).ToLowerInvariant(): - return rAthena.Type.Char; + return ROServers.Type.Char; case var n when n == GetFileName(Configuration.WebPath).ToLowerInvariant(): - return rAthena.Type.Web; + return ROServers.Type.Web; case var n when n == GetFileName(Configuration.MapPath).ToLowerInvariant(): - return rAthena.Type.Map; + return ROServers.Type.Map; default: - return rAthena.Type.DevConsole; + return ROServers.Type.DevConsole; } } } diff --git a/IText.cs b/IText.cs index dc1de69..6b45420 100644 --- a/IText.cs +++ b/IText.cs @@ -19,7 +19,7 @@ public static Run RunColoredText(string text, Brush typeColor) return typeRun; } - public static Paragraph AppendColoredText(rAthena.Data Data) + public static Paragraph AppendColoredText(ROServers.Data Data) { Paragraph paragraph = new Paragraph(); paragraph.Inlines.Add(RunColoredText(Data.Header, Data.Paint)); @@ -27,7 +27,7 @@ public static Paragraph AppendColoredText(rAthena.Data Data) return paragraph; } - public static Brush GetMessageTypeColor(rAthena.Data Data) + public static Brush GetMessageTypeColor(ROServers.Data Data) { switch (Data.Header) { @@ -64,7 +64,7 @@ public static void Do_Starting_Message( { Brush color = GetWhiteModeColor(); - rAthena.Data Data = new rAthena.Data + ROServers.Data Data = new ROServers.Data { Header = "[Info]: ", Paint = color, @@ -91,7 +91,7 @@ public static void Do_Starting_Message( Starting_Message_sub(wsproxy, Data); } - private static void Starting_Message_sub(System.Windows.Controls.RichTextBox Box, rAthena.Data Data) => Box.Document.Blocks.Add(AppendColoredText(Data)); + private static void Starting_Message_sub(System.Windows.Controls.RichTextBox Box, ROServers.Data Data) => Box.Document.Blocks.Add(AppendColoredText(Data)); } } \ No newline at end of file diff --git a/MainWindow.xaml b/MainWindow.xaml index c6cec36..c279d05 100644 --- a/MainWindow.xaml +++ b/MainWindow.xaml @@ -127,7 +127,7 @@