81 lines
2.8 KiB
C#
81 lines
2.8 KiB
C#
using System.Diagnostics;
|
|
using System.Diagnostics.CodeAnalysis;
|
|
using System.Text.RegularExpressions;
|
|
|
|
namespace LeagueAPI.Utils;
|
|
|
|
internal partial class PortTokenWithProcessList : IPortTokenBehavior
|
|
{
|
|
[GeneratedRegex("--remoting-auth-token=([\\w-]*)")]
|
|
private static partial Regex AuthTokenRegex();
|
|
[GeneratedRegex("--app-port=([0-9]*)")]
|
|
private static partial Regex AppPortRegex();
|
|
|
|
public bool TryGet(Process process, out string remotingAuthToken, out int appPort, [NotNullWhen(false)] out Exception? exception)
|
|
{
|
|
try
|
|
{
|
|
ProcessStartInfo startInfo;
|
|
if (OperatingSystem.IsWindows())
|
|
{
|
|
startInfo = new ProcessStartInfo
|
|
{
|
|
FileName = "powershell.exe",
|
|
Arguments = "Get-CimInstance Win32_Process -Filter \"\"\"name = 'LeagueClientUx.exe'\"\"\" | Select-Object -ExpandProperty CommandLine",
|
|
WindowStyle = ProcessWindowStyle.Hidden,
|
|
CreateNoWindow = true,
|
|
RedirectStandardOutput = true,
|
|
RedirectStandardError = true
|
|
};
|
|
}
|
|
else
|
|
{
|
|
if (!OperatingSystem.IsMacOS())
|
|
{
|
|
throw new PlatformNotSupportedException("This behavior is only supported on Windows or MacOS.");
|
|
}
|
|
|
|
startInfo = new ProcessStartInfo
|
|
{
|
|
FileName = "/bin/bash",
|
|
Arguments = "-c \"ps x -o args | grep 'LeagueClientUx'\"",
|
|
WindowStyle = ProcessWindowStyle.Hidden,
|
|
CreateNoWindow = true,
|
|
RedirectStandardOutput = true,
|
|
RedirectStandardError = true
|
|
};
|
|
}
|
|
|
|
using Process process2 = new()
|
|
{
|
|
StartInfo = startInfo
|
|
};
|
|
process2.Start();
|
|
process2.WaitForExit();
|
|
string text = process2.StandardOutput.ReadToEnd();
|
|
string text2 = process2.StandardError.ReadToEnd();
|
|
if (string.IsNullOrEmpty(text))
|
|
{
|
|
if (!string.IsNullOrEmpty(text2))
|
|
{
|
|
throw new Exception(text2);
|
|
}
|
|
|
|
throw new FormatException("The output string is empty.");
|
|
}
|
|
|
|
remotingAuthToken = AuthTokenRegex().Match(text).Groups[1].Value;
|
|
appPort = int.Parse(AppPortRegex().Match(text).Groups[1].Value);
|
|
exception = null;
|
|
return true;
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
remotingAuthToken = string.Empty;
|
|
appPort = 0;
|
|
exception = ex;
|
|
return false;
|
|
}
|
|
}
|
|
}
|