sr&5fcAqCwVV}=Y4V6jWWX@}gR19aPhAy%DC
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 styles;
+
+ public UIStyler()
+ {
+ styles = new Dictionary>();
+ }
+
+ public void LoadFromYaml(string yamlFilePath)
+ {
+ try
+ {
+ using (StreamReader reader = new StreamReader(yamlFilePath))
+ {
+ var deserializer = new DeserializerBuilder().Build();
+ styles = deserializer.Deserialize>>(reader);
+ }
+ }
+ catch (Exception ex)
+ {
+ Program.logger.Log(LogType.Error, "[UI] Failed to apply UI modification: \n" + ex.ToString());
+ }
+ }
+
+ public void ApplyStyles(Control control)
+ {
+ try
+ {
+ string controlName = control.Name;
+ if (styles.ContainsKey(controlName))
+ {
+ Dictionary controlStyles = styles[controlName];
+
+ foreach (KeyValuePair style in controlStyles)
+ {
+ ApplyStyle(control, style.Key, style.Value);
+ }
+ }
+
+ foreach (Control childControl in control.Controls)
+ {
+ ApplyStyles(childControl);
+ }
+ }
+ catch (Exception ex)
+ {
+ Program.logger.Log(LogType.Error, "[UI] Failed to apply UI modification: \n" + ex.ToString());
+
+ }
+ }
+
+ private void ApplyStyle(Control control, string property, string value)
+ {
+ PropertyInfo prop = control.GetType().GetProperty(property);
+ if (prop != null)
+ {
+ if (prop.PropertyType == typeof(Color))
+ {
+ prop.SetValue(control, Color.FromName(value));
+ }
+ else if (prop.PropertyType == typeof(Size))
+ {
+ string[] sizeParts = value.Split(',');
+ if (sizeParts.Length == 2 && int.TryParse(sizeParts[0], out int width) && int.TryParse(sizeParts[1], out int height))
+ {
+ prop.SetValue(control, new Size(width, height));
+ }
+ }
+ else if (prop.PropertyType == typeof(Point))
+ {
+ string[] pointParts = value.Split(',');
+ if (pointParts.Length == 2 && int.TryParse(pointParts[0], out int x) && int.TryParse(pointParts[1], out int y))
+ {
+ prop.SetValue(control, new Point(x, y));
+ }
+ }
+ else if (prop.PropertyType == typeof(DockStyle))
+ {
+ DockStyle dockStyle;
+ if (Enum.TryParse(value, out dockStyle))
+ {
+ prop.SetValue(control, dockStyle);
+ }
+ }
+ else if (prop.PropertyType == typeof(bool))
+ {
+ bool boolValue;
+ if (bool.TryParse(value, out boolValue))
+ {
+ prop.SetValue(control, boolValue);
+ }
+ }
+ else
+ {
+ prop.SetValue(control, Convert.ChangeType(value, prop.PropertyType));
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/Program.cs b/Program.cs
index 227d95c..498ffec 100644
--- a/Program.cs
+++ b/Program.cs
@@ -10,25 +10,25 @@ internal static class Program
///
public static string AppVersion = "1.0.0";
public static LoggerManager logger = new LoggerManager();
- public static string themes = Application.StartupPath + @"\themes\theme.ini";
public static string osVersion;
public static string osDescription;
public static string cpuArchitecture;
public static string osArchitecture;
public static string mcascii = @"
- _____ _ _____ _ _ _
- | __ \| | / ____| | | | | |
- | |__) | |_ ___ _ __ ___ | | ___ _ __ | |_ _ __ ___ | | | ___ _ __
- | ___/| __/ _ \ '__/ _ \| | / _ \| '_ \| __| '__/ _ \| | |/ _ \ '__|
- | | | || __/ | | (_) | |___| (_) | | | | |_| | | (_) | | | __/ |
- |_| \__\___|_| \___/ \_____\___/|_| |_|\__|_| \___/|_|_|\___|_|
-
+
+ _____ _ _ _ _
+ | __ \| | | | | | | |
+ | |__) | |_ ___ _ __ ___ __| | __ _ ___| |_ _ _| |
+ | ___/| __/ _ \ '__/ _ \ / _` |/ _` |/ __| __| | | | |
+ | | | || __/ | | (_) | (_| | (_| | (__| |_| |_| | |
+ |_| \__\___|_| \___/ \__,_|\__,_|\___|\__|\__, |_|
+ __/ |
+ |___/
";
[STAThread]
public static void Main()
{
ApplicationConfiguration.Initialize();
- ThemeManager.initThemes();
osVersion = System.Environment.OSVersion.Version.ToString();
osDescription = System.Runtime.InteropServices.RuntimeInformation.OSDescription;
cpuArchitecture = System.Runtime.InteropServices.RuntimeInformation.ProcessArchitecture.ToString();
@@ -38,6 +38,17 @@ public static void Main()
logger.Log(LogType.Error, "We are sorry, but we blocked this app from running on any other OS than Windows!");
Application.Exit();
}
+ if (!File.Exists(Application.StartupPath+ @"\styles.yaml"))
+ {
+ string yamlContent = @"
+lblappname:
+ Text: Pterodactyl Panel
+";
+
+ File.AppendAllText(Application.StartupPath + @"\styles.yaml", yamlContent);
+
+ Application.Restart();
+ }
if (!File.Exists(Application.StartupPath + @"\PteroConsole.exe") && !File.Exists(Application.StartupPath + @"\WinSCP.exe"))
{
Application.Run(new FrmInstallTools());
diff --git a/Pterodactyl.csproj b/Pterodactyl.csproj
index 7d2c215..434b145 100644
--- a/Pterodactyl.csproj
+++ b/Pterodactyl.csproj
@@ -2,11 +2,11 @@
Exe
- net7.0-windows
+ net8.0-windows8.0
enable
true
enable
-
+ Pterodactyl.Program
pterry.ico
False
True
@@ -19,11 +19,17 @@
https://github.com/MythicalLTD/Pterodactyl
Pterodactyl
- 2023
+ 2023-2024
MythicalSystems LTD
MythicalSystems LTD
true
$(MSBuildProjectName) Desktop
+ 8.0
+ False
+ Pterodactyl Desktop
+ The pterodactyl desktop app to manage multiple pterodactyl panels in a single place!
+ README.md
+ git
@@ -37,16 +43,29 @@
0
+
+
+
+
+
+
+
+ Always
+
+
+
-
+
+
+
@@ -70,12 +89,31 @@
Always
+
+ True
+ \
+
True
+
+
+ PreserveNewest
+
+
+
+
+
+ Libs\ConsoleControl.dll
+
+
+ Libs\ConsoleControlAPI.dll
+
+
+
True
diff --git a/Pterodactyl/Server/Power.cs b/Pterodactyl/Server/Power.cs
new file mode 100644
index 0000000..44503a8
--- /dev/null
+++ b/Pterodactyl/Server/Power.cs
@@ -0,0 +1,139 @@
+using Pterodactyl.Forms;
+using Pterodactyl.Handlers;
+using RestSharp;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Pterodactyl.Pterodactyl.Server
+{
+ public static class Power
+ {
+ public static void Start(string serverIdentifier)
+ {
+ try
+ {
+ var client = new RestClient(Pterodactyl.User.Info.panel_url);
+ var request = new RestRequest($"/api/client/servers/{serverIdentifier}/power", Method.POST);
+ request.AddHeader("Authorization", $"Bearer {Pterodactyl.User.Info.panel_api_key}");
+ request.AddHeader("Content-Type", "application/json");
+ request.AddHeader("Accept", "Application/vnd.pterodactyl.v1+json");
+ request.AddHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.93 Safari/537.36");
+ request.AddParameter("application/json", "{ \"signal\": \"start\" }", ParameterType.RequestBody);
+ var response = client.Execute(request);
+
+ if (response.IsSuccessful)
+ {
+ Program.Alert("Server is starting", FrmAlert.enmType.Succes);
+ }
+ else
+ {
+ Program.logger.Log(Managers.LogType.Error, "[Forms.FrmServerController.cs]: \n" + response.Content);
+ Program.Alert("Failed to start the server", FrmAlert.enmType.Warning);
+ }
+ }
+ catch (Exception ex)
+ {
+ ProblemHandler.Warning("FrmServerController", ex.ToString());
+ Program.logger.Log(Managers.LogType.Error, "[Forms.FrmServerController.cs]: \n" + ex.ToString());
+ Program.Alert("Failed to start the server", FrmAlert.enmType.Warning);
+ }
+ }
+
+ public static void Stop(string serverIdentifier)
+ {
+ try
+ {
+ var client = new RestClient(Pterodactyl.User.Info.panel_url);
+ var request = new RestRequest($"/api/client/servers/{serverIdentifier}/power", Method.POST);
+ request.AddHeader("Authorization", $"Bearer {Pterodactyl.User.Info.panel_api_key}");
+ request.AddHeader("Content-Type", "application/json");
+ request.AddHeader("Accept", "Application/vnd.pterodactyl.v1+json");
+ request.AddHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.93 Safari/537.36");
+ request.AddParameter("application/json", "{ \"signal\": \"stop\" }", ParameterType.RequestBody);
+ var response = client.Execute(request);
+
+ if (response.IsSuccessful)
+ {
+ Program.Alert("Server is stopping", FrmAlert.enmType.Succes);
+ }
+ else
+ {
+ Program.logger.Log(Managers.LogType.Error, "[Forms.FrmServerController.cs]: \n" + response.Content);
+ Program.Alert("Failed to stop the server", FrmAlert.enmType.Warning);
+ }
+ }
+ catch (Exception ex)
+ {
+ ProblemHandler.Warning("FrmServerController", ex.ToString());
+ Program.logger.Log(Managers.LogType.Error, "[Forms.FrmServerController.cs]: \n" + ex.ToString());
+ Program.Alert("Failed to stop the server", FrmAlert.enmType.Warning);
+ }
+ }
+
+ public static void Kill(string serverIdentifier)
+ {
+ try
+ {
+ var client = new RestClient(Pterodactyl.User.Info.panel_url);
+ var request = new RestRequest($"/api/client/servers/{serverIdentifier}/power", Method.POST);
+ request.AddHeader("Authorization", $"Bearer {Pterodactyl.User.Info.panel_api_key}");
+ request.AddHeader("Content-Type", "application/json");
+ request.AddHeader("Accept", "Application/vnd.pterodactyl.v1+json");
+ request.AddHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.93 Safari/537.36");
+ request.AddParameter("application/json", "{ \"signal\": \"kill\" }", ParameterType.RequestBody);
+ var response = client.Execute(request);
+
+ if (response.IsSuccessful)
+ {
+ Program.Alert("Server killed", FrmAlert.enmType.Succes);
+ }
+ else
+ {
+
+ Program.logger.Log(Managers.LogType.Error, "[Forms.FrmServerController.cs]: \n" + response.Content);
+ Program.Alert("Failed to kill the server", FrmAlert.enmType.Warning);
+ }
+ }
+ catch (Exception ex)
+ {
+ ProblemHandler.Warning("FrmServerController", ex.ToString());
+ Program.logger.Log(Managers.LogType.Error, "[Forms.FrmServerController.cs]: \n" + ex.ToString());
+ Program.Alert("Failed to kill the server", FrmAlert.enmType.Warning);
+ }
+ }
+
+ public static void Restart(string serverIdentifier)
+ {
+ try
+ {
+ var client = new RestClient(Pterodactyl.User.Info.panel_url);
+ var request = new RestRequest($"/api/client/servers/{serverIdentifier}/power", Method.POST);
+ request.AddHeader("Authorization", $"Bearer {Pterodactyl.User.Info.panel_api_key}");
+ request.AddHeader("Content-Type", "application/json");
+ request.AddHeader("Accept", "Application/vnd.pterodactyl.v1+json");
+ request.AddHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.93 Safari/537.36");
+ request.AddParameter("application/json", "{ \"signal\": \"restart\" }", ParameterType.RequestBody);
+ var response = client.Execute(request);
+
+ if (response.IsSuccessful)
+ {
+ Program.Alert("Server is restarting", FrmAlert.enmType.Succes);
+ }
+ else
+ {
+ Program.logger.Log(Managers.LogType.Error, "[Forms.FrmServerController.cs]: \n" + response.Content);
+ Program.Alert("Failed to restart the server", FrmAlert.enmType.Warning);
+ }
+ }
+ catch (Exception ex)
+ {
+ ProblemHandler.Warning("FrmServerController", ex.ToString());
+ Program.logger.Log(Managers.LogType.Error, "[Forms.FrmServerController.cs]: \n" + ex.ToString());
+ Program.Alert("Failed to start the server", FrmAlert.enmType.Warning);
+ }
+ }
+ }
+}
diff --git a/pterry.png b/pterry.png
new file mode 100644
index 0000000000000000000000000000000000000000..00a76da79c482586982dc0bae8580763ee2bb6a3
GIT binary patch
literal 111013
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