diff --git a/player-counter/src/Extensions/Query/QueryTypeSchemaInterface.php b/player-counter/src/Extensions/Query/QueryTypeSchemaInterface.php index 439adb7f..041139e3 100644 --- a/player-counter/src/Extensions/Query/QueryTypeSchemaInterface.php +++ b/player-counter/src/Extensions/Query/QueryTypeSchemaInterface.php @@ -2,6 +2,8 @@ namespace Boy132\PlayerCounter\Extensions\Query; +use App\Models\Server; + interface QueryTypeSchemaInterface { public function getId(): string; @@ -9,5 +11,5 @@ public function getId(): string; public function getName(): string; /** @return ?array{hostname: string, map: string, current_players: int, max_players: int, players: ?array} */ - public function process(string $ip, int $port): ?array; + public function process(Server $server, string $ip, int $port): ?array; } diff --git a/player-counter/src/Extensions/Query/Schemas/CitizenFXQueryTypeSchema.php b/player-counter/src/Extensions/Query/Schemas/CitizenFXQueryTypeSchema.php index ac4226c0..63828d52 100644 --- a/player-counter/src/Extensions/Query/Schemas/CitizenFXQueryTypeSchema.php +++ b/player-counter/src/Extensions/Query/Schemas/CitizenFXQueryTypeSchema.php @@ -2,6 +2,7 @@ namespace Boy132\PlayerCounter\Extensions\Query\Schemas; +use App\Models\Server; use Boy132\PlayerCounter\Extensions\Query\QueryTypeSchemaInterface; use Exception; use Illuminate\Support\Facades\Http; @@ -19,7 +20,7 @@ public function getName(): string } /** @return ?array{hostname: string, map: string, current_players: int, max_players: int, players: array} */ - public function process(string $ip, int $port): ?array + public function process(Server $server, string $ip, int $port): ?array { try { $this->resolveSRV($ip, $port); diff --git a/player-counter/src/Extensions/Query/Schemas/GoldSourceQueryTypeSchema.php b/player-counter/src/Extensions/Query/Schemas/GoldSourceQueryTypeSchema.php index 19295cfe..59a5f628 100644 --- a/player-counter/src/Extensions/Query/Schemas/GoldSourceQueryTypeSchema.php +++ b/player-counter/src/Extensions/Query/Schemas/GoldSourceQueryTypeSchema.php @@ -2,6 +2,7 @@ namespace Boy132\PlayerCounter\Extensions\Query\Schemas; +use App\Models\Server; use xPaw\SourceQuery\SourceQuery; class GoldSourceQueryTypeSchema extends SourceQueryTypeSchema @@ -17,7 +18,7 @@ public function getName(): string } /** @return ?array{hostname: string, map: string, current_players: int, max_players: int, players: array} */ - public function process(string $ip, int $port): ?array + public function process(Server $server, string $ip, int $port): ?array { return $this->run($ip, $port, SourceQuery::GOLDSOURCE); } diff --git a/player-counter/src/Extensions/Query/Schemas/MinecraftBedrockQueryTypeSchema.php b/player-counter/src/Extensions/Query/Schemas/MinecraftBedrockQueryTypeSchema.php index 6afe0560..946dcdf5 100644 --- a/player-counter/src/Extensions/Query/Schemas/MinecraftBedrockQueryTypeSchema.php +++ b/player-counter/src/Extensions/Query/Schemas/MinecraftBedrockQueryTypeSchema.php @@ -2,6 +2,7 @@ namespace Boy132\PlayerCounter\Extensions\Query\Schemas; +use App\Models\Server; use Boy132\PlayerCounter\Extensions\Query\QueryTypeSchemaInterface; use Exception; use xPaw\MinecraftQuery; @@ -19,7 +20,7 @@ public function getName(): string } /** @return ?array{hostname: string, map: string, current_players: int, max_players: int, players: ?array} */ - public function process(string $ip, int $port): ?array + public function process(Server $server, string $ip, int $port): ?array { $query = new MinecraftQuery(); diff --git a/player-counter/src/Extensions/Query/Schemas/MinecraftJavaQueryTypeSchema.php b/player-counter/src/Extensions/Query/Schemas/MinecraftJavaQueryTypeSchema.php index 9d78c97d..ea4d6857 100644 --- a/player-counter/src/Extensions/Query/Schemas/MinecraftJavaQueryTypeSchema.php +++ b/player-counter/src/Extensions/Query/Schemas/MinecraftJavaQueryTypeSchema.php @@ -2,6 +2,7 @@ namespace Boy132\PlayerCounter\Extensions\Query\Schemas; +use App\Models\Server; use Boy132\PlayerCounter\Extensions\Query\QueryTypeSchemaInterface; use Exception; use xPaw\MinecraftPing; @@ -20,7 +21,7 @@ public function getName(): string } /** @return ?array{hostname: string, map: string, current_players: int, max_players: int, players: array} */ - public function process(string $ip, int $port): ?array + public function process(Server $server, string $ip, int $port): ?array { $query = $this->tryQuery($ip, $port); if ($query) { diff --git a/player-counter/src/Extensions/Query/Schemas/PalworldQueryTypeSchema.php b/player-counter/src/Extensions/Query/Schemas/PalworldQueryTypeSchema.php new file mode 100644 index 00000000..d8b5ba8f --- /dev/null +++ b/player-counter/src/Extensions/Query/Schemas/PalworldQueryTypeSchema.php @@ -0,0 +1,65 @@ +variables() + ->where('env_variable', 'ADMIN_PASSWORD') + ->first()?->server_value; + + if (!$adminPassword) { + return null; + } + + try { + $base = "http://{$ip}:{$port}"; + [$playersResp, $metricsResp] = Http::pool(fn ($pool) => [ + $pool->timeout(5)->withBasicAuth('admin', $adminPassword)->get("{$base}/v1/api/players"), + $pool->timeout(5)->withBasicAuth('admin', $adminPassword)->get("{$base}/v1/api/metrics"), + ]); + + if (!$playersResp->ok()) { + return null; + } + + $data = $playersResp->json(); + $players = array_map(fn ($p) => [ + 'id' => $p['playeruid'] ?? $p['steamid'] ?? '', + 'name' => $p['name'] ?? '', + ], $data['players'] ?? []); + + $maxPlayers = $metricsResp->ok() ? ($metricsResp->json()['maxplayernum'] ?? 32) : 32; + + return [ + 'hostname' => $server->name, + 'map' => 'Palpagos Islands', + 'current_players' => count($players), + 'max_players' => $maxPlayers, + 'players' => $players, + ]; + + } catch (Exception $exception) { + report($exception); + + return null; + } + } +} diff --git a/player-counter/src/Extensions/Query/Schemas/SourceQueryTypeSchema.php b/player-counter/src/Extensions/Query/Schemas/SourceQueryTypeSchema.php index 0a20cee0..5d4902fd 100644 --- a/player-counter/src/Extensions/Query/Schemas/SourceQueryTypeSchema.php +++ b/player-counter/src/Extensions/Query/Schemas/SourceQueryTypeSchema.php @@ -2,6 +2,7 @@ namespace Boy132\PlayerCounter\Extensions\Query\Schemas; +use App\Models\Server; use Boy132\PlayerCounter\Extensions\Query\QueryTypeSchemaInterface; use Exception; use xPaw\SourceQuery\SourceQuery; @@ -19,7 +20,7 @@ public function getName(): string } /** @return ?array{hostname: string, map: string, current_players: int, max_players: int, players: array} */ - public function process(string $ip, int $port): ?array + public function process(Server $server, string $ip, int $port): ?array { return $this->run($ip, $port, SourceQuery::SOURCE); } diff --git a/player-counter/src/Models/GameQuery.php b/player-counter/src/Models/GameQuery.php index a284b016..b2619eea 100644 --- a/player-counter/src/Models/GameQuery.php +++ b/player-counter/src/Models/GameQuery.php @@ -59,7 +59,7 @@ public function runQuery(Server $server): ?array /** @var QueryTypeService $service */ $service = app(QueryTypeService::class); - return $service->get($this->query_type)?->process($ip, $port); + return $service->get($this->query_type)?->process($server, $ip, $port); } public static function canRunQuery(?Allocation $allocation): bool diff --git a/player-counter/src/Providers/PlayerCounterPluginProvider.php b/player-counter/src/Providers/PlayerCounterPluginProvider.php index 0f90c67d..5ee32eab 100644 --- a/player-counter/src/Providers/PlayerCounterPluginProvider.php +++ b/player-counter/src/Providers/PlayerCounterPluginProvider.php @@ -11,6 +11,7 @@ use Boy132\PlayerCounter\Extensions\Query\Schemas\GoldSourceQueryTypeSchema; use Boy132\PlayerCounter\Extensions\Query\Schemas\MinecraftBedrockQueryTypeSchema; use Boy132\PlayerCounter\Extensions\Query\Schemas\MinecraftJavaQueryTypeSchema; +use Boy132\PlayerCounter\Extensions\Query\Schemas\PalworldQueryTypeSchema; use Boy132\PlayerCounter\Extensions\Query\Schemas\SourceQueryTypeSchema; use Boy132\PlayerCounter\Filament\Server\Widgets\ServerPlayerWidget; use Boy132\PlayerCounter\Models\EggGameQuery; @@ -35,6 +36,7 @@ public function register(): void $service->register(new MinecraftJavaQueryTypeSchema()); $service->register(new MinecraftBedrockQueryTypeSchema()); $service->register(new CitizenFXQueryTypeSchema()); + $service->register(new PalworldQueryTypeSchema()); return $service; });