diff --git a/player-counter/plugin.json b/player-counter/plugin.json index d5865054..c89a9053 100644 --- a/player-counter/plugin.json +++ b/player-counter/plugin.json @@ -2,7 +2,7 @@ "id": "player-counter", "name": "Player Counter", "author": "Boy132", - "version": "1.1.0", + "version": "1.2.0", "description": "Show the amount of connected players to the server", "category": "plugin", "url": "https://hub.pelican.dev/plugins/player-counter", @@ -19,4 +19,4 @@ "xpaw/php-minecraft-query": "^5.0.0", "xpaw/php-source-query-class": "^6.0.0" } -} \ No newline at end of file +} diff --git a/player-counter/src/Extensions/Query/Schemas/MinecraftBedrockQueryTypeSchema.php b/player-counter/src/Extensions/Query/Schemas/MinecraftBedrockQueryTypeSchema.php index 946dcdf5..cf00b5bd 100644 --- a/player-counter/src/Extensions/Query/Schemas/MinecraftBedrockQueryTypeSchema.php +++ b/player-counter/src/Extensions/Query/Schemas/MinecraftBedrockQueryTypeSchema.php @@ -5,6 +5,7 @@ use App\Models\Server; use Boy132\PlayerCounter\Extensions\Query\QueryTypeSchemaInterface; use Exception; +use Illuminate\Support\Facades\Http; use xPaw\MinecraftQuery; class MinecraftBedrockQueryTypeSchema implements QueryTypeSchemaInterface @@ -21,12 +22,56 @@ public function getName(): string /** @return ?array{hostname: string, map: string, current_players: int, max_players: int, players: ?array} */ public function process(Server $server, string $ip, int $port): ?array + { + return $this->tryQueryNetherNet($ip, $port) ?? $this->tryQueryRakNet($ip, $port); + } + + /** @return ?array{hostname: string, map: string, current_players: int, max_players: int, players: null} */ + private function tryQueryNetherNet(string $ip, int $port): ?array + { + try { + $response = Http::acceptJson() + ->connectTimeout(2) + ->timeout(5) + ->get("http://{$ip}:{$port}/v1/join"); + + if (!$response->successful()) { + return null; + } + + $info = $response->json(); + + if ( + !is_array($info) + || !isset( + $info['name'], + $info['level'], + $info['players'], + $info['maxPlayers'], + ) + ) { + return null; + } + + return [ + 'hostname' => $info['name'], + 'map' => $info['level'], + 'current_players' => $info['players'], + 'max_players' => $info['maxPlayers'], + 'players' => null, // Bedrock has no player list + ]; + } catch (Exception) { + return null; // Either invalid or server may use RakNet + } + } + + /** @return ?array{hostname: string, map: string, current_players: int, max_players: int, players: null} */ + private function tryQueryRakNet(string $ip, int $port): ?array { $query = new MinecraftQuery(); try { $query->ConnectBedrock($ip, $port, 5, true); - $info = $query->GetInfo(); if (!is_array($info)) { @@ -42,8 +87,8 @@ public function process(Server $server, string $ip, int $port): ?array ]; } catch (Exception $exception) { report($exception); - } - return null; + return null; + } } }