using System.Text; using System.Text.Json; using System.Web; using Pterodactyl.NETSDK.Helper; using Pterodactyl.NETSDK.Models.Application.Locations; using Pterodactyl.NETSDK.Models.Application.Nests; using Pterodactyl.NETSDK.Models.Application.Nests.Eggs; using Pterodactyl.NETSDK.Models.Application.Nodes; using Pterodactyl.NETSDK.Models.Application.Servers; using Pterodactyl.NETSDK.Models.Application.Users; using Pterodactyl.NETSDK.Models.Common; using Pterodactyl.NETSDK.Models.Common.Allocations; using Pterodactyl.NETSDK.Request; namespace Pterodactyl.NETSDK; public class Application(string baseUrl, string apiKey) : PterodactylClient(baseUrl, apiKey) { #region Application API #region Users public async Task> ListUsers() { var response = await HttpClient.GetAsync($"{BaseUrl}/api/application/users"); var result = await HttpHelper.HandleResponse>(response); return result?.Data.Select(r => r.User).ToList() ?? []; } public async Task GetUser(int userId) { var response = await HttpClient.GetAsync($"{BaseUrl}/api/application/users/{userId}"); var result = await HttpHelper.HandleResponse(response); return result?.User; } public async Task GetUserByExternalId(string externalId) { var response = await HttpClient.GetAsync($"{BaseUrl}/api/application/users/external/{externalId}"); var result = await HttpHelper.HandleResponse(response); return result?.User; } public async Task CreateUser(UserCreateRequest request) { var content = new StringContent(JsonSerializer.Serialize(request), Encoding.UTF8, "application/json"); var response = await HttpClient.PostAsync($"{BaseUrl}/api/application/users", content); var result = await HttpHelper.HandleResponse(response); return result?.User; } public async Task UpdateUser(int userId, Action updateAction) { var currentUser = await GetUser(userId); var request = new UserUpdateRequest { Email = currentUser?.Email, Username = currentUser?.Username, FirstName = currentUser?.FirstName, LastName = currentUser?.LastName, Language = currentUser?.Language }; updateAction(request); var content = new StringContent(JsonSerializer.Serialize(request), Encoding.UTF8, "application/json"); var response = await HttpClient.PatchAsync($"{BaseUrl}/api/application/users/{userId}", content); var result = await HttpHelper.HandleResponse(response); return result?.User; } public async Task DeleteUser(int userId) { var response = await HttpClient.DeleteAsync($"{BaseUrl}/api/application/users/{userId}"); await HttpHelper.HandleResponse(response); } #endregion #region Nodes public async Task?> ListNodes() { var response = await HttpClient.GetAsync($"{BaseUrl}/api/application/nodes"); var result = await HttpHelper.HandleResponse>(response); return result?.Data.Select(n => n.Node).ToList() ?? []; } public async Task GetNode(int nodeId) { var response = await HttpClient.GetAsync($"{BaseUrl}/api/application/nodes/{nodeId}"); var result = await HttpHelper.HandleResponse(response); return result?.Node; } public async Task GetNodeConfiguration(int nodeId) { var response = await HttpClient.GetAsync($"{BaseUrl}/api/application/nodes/{nodeId}/configuration"); return await HttpHelper.HandleResponse(response); } public async Task CreateNode(NodeCreateRequest request) { var content = new StringContent(JsonSerializer.Serialize(request), Encoding.UTF8, "application/json"); var response = await HttpClient.PostAsync($"{BaseUrl}/api/application/nodes", content); var result = await HttpHelper.HandleResponse(response); return result?.Node; } public async Task UpdateNode(int nodeId, NodeUpdateRequest request) { var content = new StringContent(JsonSerializer.Serialize(request), Encoding.UTF8, "application/json"); var response = await HttpClient.PatchAsync($"{BaseUrl}/api/application/nodes/{nodeId}", content); var result = await HttpHelper.HandleResponse(response); return result?.Node; } public async Task DeleteNode(int nodeId) { var response = await HttpClient.DeleteAsync($"{BaseUrl}/api/application/nodes/{nodeId}"); await HttpHelper.HandleResponse(response); } public async Task?> GetNodeAllocations(int nodeId) { var response = await HttpClient.GetAsync($"{BaseUrl}/api/application/nodes/{nodeId}/allocations"); var result = await HttpHelper.HandleResponse>(response); return result?.Data.Select(r => r.Allocation).ToList(); } #endregion #region Servers public async Task?> ListServers() { var response = await HttpClient.GetAsync($"{BaseUrl}/api/application/servers"); var result = await HttpHelper.HandleResponse>(response); return result?.Data.Select(r => r.Server).ToList() ?? []; } public async Task GetServer(int serverId) { var response = await HttpClient.GetAsync($"{BaseUrl}/api/application/servers/{serverId}"); var result = await HttpHelper.HandleResponse(response); return result?.Server; } public async Task GetServerByExternalId(string externalId) { var response = await HttpClient.GetAsync($"{BaseUrl}/api/application/servers/external/{externalId}"); var result = await HttpHelper.HandleResponse(response); return result?.Server; } public async Task CreateServer(ServerCreateRequest request) { var content = new StringContent(JsonSerializer.Serialize(request), Encoding.UTF8, "application/json"); var response = await HttpClient.PostAsync($"{BaseUrl}/api/application/servers", content); var result = await HttpHelper.HandleResponse(response); return result?.Server; } public async Task UpdateServerDetails(int serverId, ServerDetailsUpdateRequest request) { var content = new StringContent(JsonSerializer.Serialize(request), Encoding.UTF8, "application/json"); var response = await HttpClient.PatchAsync($"{BaseUrl}/api/application/servers/{serverId}/details", content); var result = await HttpHelper.HandleResponse(response); return result?.Server; } public async Task SuspendServer(int serverId) { var response = await HttpClient.PostAsync($"{BaseUrl}/api/application/servers/{serverId}/suspend", null); await HttpHelper.HandleResponse(response); } public async Task UnSuspendServer(int serverId) { var response = await HttpClient.PostAsync($"{BaseUrl}/api/application/servers/{serverId}/unsuspend", null); await HttpHelper.HandleResponse(response); } public async Task ReinstallServer(int serverId) { var response = await HttpClient.PostAsync($"{BaseUrl}/api/application/servers/{serverId}/reinstall", null); await HttpHelper.HandleResponse(response); } public async Task DeleteServer(int serverId, bool force = false) { var url = $"{BaseUrl}/api/application/servers/{serverId}" + (force ? "/force" : ""); var response = await HttpClient.DeleteAsync(url); await HttpHelper.HandleResponse(response); } #endregion #region Locations public async Task?> ListLocations() { var response = await HttpClient.GetAsync($"{BaseUrl}/api/application/locations"); var result = await HttpHelper.HandleResponse>(response); return result?.Data.Select(r => r.Location).ToList() ?? []; } public async Task CreateLocation(LocationCreateRequest request) { var content = new StringContent(JsonSerializer.Serialize(request), Encoding.UTF8, "application/json"); var response = await HttpClient.PostAsync($"{BaseUrl}/api/application/locations", content); var result = await HttpHelper.HandleResponse(response); return result?.Location; } public async Task UpdateLocation(int locationId, LocationUpdateRequest request) { var content = new StringContent(JsonSerializer.Serialize(request), Encoding.UTF8, "application/json"); var response = await HttpClient.PatchAsync($"{BaseUrl}/api/application/locations/{locationId}", content); var result = await HttpHelper.HandleResponse(response); return result?.Location; } public async Task DeleteLocation(int locationId) { var response = await HttpClient.DeleteAsync($"{BaseUrl}/api/application/locations/{locationId}"); await HttpHelper.HandleResponse(response); } #endregion #region Databases 一般弃用 暂不进行适配 public async Task?> ListServerDatabases(int serverId) { var response = await HttpClient.GetAsync($"{BaseUrl}/api/application/servers/{serverId}/databases"); return await HttpHelper.HandleResponse>(response); } public async Task CreateServerDatabase(int serverId, DatabaseCreateRequest request) { var content = new StringContent(JsonSerializer.Serialize(request), Encoding.UTF8, "application/json"); var response = await HttpClient.PostAsync($"{BaseUrl}/api/application/servers/{serverId}/databases", content); return await HttpHelper.HandleResponse(response); } public async Task ResetDatabasePassword(int serverId, int databaseId) { var response = await HttpClient.PostAsync( $"{BaseUrl}/api/application/servers/{serverId}/databases/{databaseId}/reset-password", null); await HttpHelper.HandleResponse(response); } public async Task DeleteServerDatabase(int serverId, int databaseId) { var response = await HttpClient.DeleteAsync( $"{BaseUrl}/api/application/servers/{serverId}/databases/{databaseId}"); await HttpHelper.HandleResponse(response); } #endregion #region Nests public async Task?> ListNests() { var response = await HttpClient.GetAsync($"{BaseUrl}/api/application/nests"); var result = await HttpHelper.HandleResponse>(response); return result?.Data.Select(n => n.Nest).ToList() ?? []; } public async Task GetNest(int nestId) { var response = await HttpClient.GetAsync($"{BaseUrl}/api/application/nests/{nestId}"); var result = await HttpHelper.HandleResponse(response); return result?.Nest; } public async Task> ListNestEggs(int nestId, bool includeNest = false, bool includeServers = false) { var includes = new List(); if (includeNest) includes.Add("nest"); if (includeServers) includes.Add("servers"); var query = includes.Any() ? $"?include={string.Join(",", includes)}" : string.Empty; var response = await HttpClient.GetAsync($"{BaseUrl}/api/application/nests/{nestId}/eggs{query}"); var result = await HttpHelper.HandleResponse>(response); return result?.Data.Select(r => r.Egg).ToList() ?? []; } public async Task GetEgg(int nestId, int eggId) { var response = await HttpClient.GetAsync($"{BaseUrl}/api/application/nests/{nestId}/eggs/{eggId}"); var result = await HttpHelper.HandleResponse(response); return result?.Egg; } #endregion #endregion }