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..b358bb9f --- /dev/null +++ b/player-counter/src/Extensions/Query/Schemas/PalworldQueryTypeSchema.php @@ -0,0 +1,72 @@ +variables() + ->where('env_variable', 'ADMIN_PASSWORD') + ->first()?->server_value; + + if (!$adminPassword) { + return null; + } + + try { + $response = Http::timeout(5) + ->withBasicAuth('admin', $adminPassword) + ->get("http://{$ip}:{$port}/v1/api/players"); + + if (!$response->ok()) { + return null; + } + + $data = $response->json(); + $players = array_map(fn ($p) => [ + 'id' => $p['playeruid'] ?? $p['steamid'] ?? '', + 'name' => $p['name'] ?? '', + ], $data['players'] ?? []); + + // Fetch metrics for max_players + $metricsResponse = Http::timeout(5) + ->withBasicAuth('admin', $adminPassword) + ->get("http://{$ip}:{$port}/v1/api/metrics"); + + $maxPlayers = $metricsResponse->ok() ? ($metricsResponse->json()['maxplayernum'] ?? 32) : 32; + + return [ + 'hostname' => $server->name, + 'map' => 'Palpagos Islands', + 'current_players' => count($players), + 'max_players' => $maxPlayers, + 'players' => $players, + ]; + } catch (\Throwable $e) { + report($e); + + return null; + } + } +} diff --git a/player-counter/src/Extensions/Query/ServerAwareQueryTypeSchemaInterface.php b/player-counter/src/Extensions/Query/ServerAwareQueryTypeSchemaInterface.php new file mode 100644 index 00000000..9b222e5d --- /dev/null +++ b/player-counter/src/Extensions/Query/ServerAwareQueryTypeSchemaInterface.php @@ -0,0 +1,11 @@ +} */ + public function processWithServer(Server $server, string $ip, int $port): ?array; +} diff --git a/player-counter/src/Models/GameQuery.php b/player-counter/src/Models/GameQuery.php index a284b016..463b1a8f 100644 --- a/player-counter/src/Models/GameQuery.php +++ b/player-counter/src/Models/GameQuery.php @@ -6,6 +6,7 @@ use App\Models\Egg; use App\Models\Server; use Boy132\PlayerCounter\Extensions\Query\QueryTypeService; +use Boy132\PlayerCounter\Extensions\Query\ServerAwareQueryTypeSchemaInterface; use Illuminate\Database\Eloquent\Collection; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsToMany; @@ -59,7 +60,12 @@ public function runQuery(Server $server): ?array /** @var QueryTypeService $service */ $service = app(QueryTypeService::class); - return $service->get($this->query_type)?->process($ip, $port); + $schema = $service->get($this->query_type); + if ($schema instanceof ServerAwareQueryTypeSchemaInterface) { + return $schema->processWithServer($server, $ip, $port); + } + + return $schema?->process($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; });