From 6699819b0de122cc94c89dd9cc6f476ab52b4a2b Mon Sep 17 00:00:00 2001 From: Johnluke Francis <77365955+SxmplyJythyy@users.noreply.github.com> Date: Fri, 23 Oct 2026 18:20:45 -0400 Subject: [PATCH 1/6] plugin.json version bump Bumped the version of the plugin from 1.1.0 to 1.2.0 to reflect changes of bedrock query types --- player-counter/plugin.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 +} From 0dd1a44e59b17d3a0bba4d1a52b9d6a973c66195 Mon Sep 17 00:00:00 2001 From: Johnluke Francis <77365955+SxmplyJythyy@users.noreply.github.com> Date: Fri, 23 Oct 2026 18:22:01 -0400 Subject: [PATCH 2/6] Add both RakNet and NetherNet for Bedrock Query Implemented a method to query the NetherNet API for Minecraft Bedrock server information, if not fall back to RakNet --- .../MinecraftBedrockQueryTypeSchema.php | 50 +++++++++++++++++-- 1 file changed, 47 insertions(+), 3 deletions(-) diff --git a/player-counter/src/Extensions/Query/Schemas/MinecraftBedrockQueryTypeSchema.php b/player-counter/src/Extensions/Query/Schemas/MinecraftBedrockQueryTypeSchema.php index 946dcdf5..5d774393 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,7 @@ public function process(Server $server, string $ip, int $port): ?array ]; } catch (Exception $exception) { report($exception); + return null; } - - return null; } } From d22b7cdd477c2c0adc83ff4f910712b60c1fec48 Mon Sep 17 00:00:00 2001 From: Johnluke Francis <77365955+SxmplyJythyy@users.noreply.github.com> Date: Fri, 23 Oct 2026 18:28:52 -0400 Subject: [PATCH 3/6] Fix formatting issues in MinecraftBedrockQueryTypeSchema Fixed whitespace issues --- .../Query/Schemas/MinecraftBedrockQueryTypeSchema.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/player-counter/src/Extensions/Query/Schemas/MinecraftBedrockQueryTypeSchema.php b/player-counter/src/Extensions/Query/Schemas/MinecraftBedrockQueryTypeSchema.php index 5d774393..cf00b5bd 100644 --- a/player-counter/src/Extensions/Query/Schemas/MinecraftBedrockQueryTypeSchema.php +++ b/player-counter/src/Extensions/Query/Schemas/MinecraftBedrockQueryTypeSchema.php @@ -34,7 +34,7 @@ private function tryQueryNetherNet(string $ip, int $port): ?array ->connectTimeout(2) ->timeout(5) ->get("http://{$ip}:{$port}/v1/join"); - + if (!$response->successful()) { return null; } @@ -87,6 +87,7 @@ private function tryQueryRakNet(string $ip, int $port): ?array ]; } catch (Exception $exception) { report($exception); + return null; } } From 7f1126f7df90b49b5136619d74b16380b581eae8 Mon Sep 17 00:00:00 2001 From: Johnluke Francis Date: Mon, 9 Nov 2026 17:56:58 -0500 Subject: [PATCH 4/6] Add withoutRedirecting to HTTP request --- .../Extensions/Query/Schemas/MinecraftBedrockQueryTypeSchema.php | 1 + 1 file changed, 1 insertion(+) diff --git a/player-counter/src/Extensions/Query/Schemas/MinecraftBedrockQueryTypeSchema.php b/player-counter/src/Extensions/Query/Schemas/MinecraftBedrockQueryTypeSchema.php index cf00b5bd..f3a41546 100644 --- a/player-counter/src/Extensions/Query/Schemas/MinecraftBedrockQueryTypeSchema.php +++ b/player-counter/src/Extensions/Query/Schemas/MinecraftBedrockQueryTypeSchema.php @@ -33,6 +33,7 @@ private function tryQueryNetherNet(string $ip, int $port): ?array $response = Http::acceptJson() ->connectTimeout(2) ->timeout(5) + ->withoutRedirecting() ->get("http://{$ip}:{$port}/v1/join"); if (!$response->successful()) { From 5d18949b961198a3af6d64f8758291f28fffe4b2 Mon Sep 17 00:00:00 2001 From: Johnluke Francis Date: Mon, 9 Nov 2026 17:57:24 -0500 Subject: [PATCH 5/6] Don't increase ver in PR --- player-counter/plugin.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/player-counter/plugin.json b/player-counter/plugin.json index c89a9053..a38ae3a0 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.2.0", + "version": "1.1.0", "description": "Show the amount of connected players to the server", "category": "plugin", "url": "https://hub.pelican.dev/plugins/player-counter", From 0506deb87b8cd85375632e1fd20d09b4ad0c1886 Mon Sep 17 00:00:00 2001 From: Johnluke Francis Date: Mon, 9 Nov 2026 18:03:02 -0500 Subject: [PATCH 6/6] Refactor MinecraftBedrockQueryTypeSchema methods --- .../MinecraftBedrockQueryTypeSchema.php | 32 +++++++------------ 1 file changed, 12 insertions(+), 20 deletions(-) diff --git a/player-counter/src/Extensions/Query/Schemas/MinecraftBedrockQueryTypeSchema.php b/player-counter/src/Extensions/Query/Schemas/MinecraftBedrockQueryTypeSchema.php index f3a41546..f7a448d7 100644 --- a/player-counter/src/Extensions/Query/Schemas/MinecraftBedrockQueryTypeSchema.php +++ b/player-counter/src/Extensions/Query/Schemas/MinecraftBedrockQueryTypeSchema.php @@ -23,11 +23,11 @@ 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 $this->tryQueryNetherNet($server, $ip, $port) ?? $this->tryQueryRakNet($server, $ip, $port); } /** @return ?array{hostname: string, map: string, current_players: int, max_players: int, players: null} */ - private function tryQueryNetherNet(string $ip, int $port): ?array + private function tryQueryNetherNet(Server $server, string $ip, int $port): ?array { try { $response = Http::acceptJson() @@ -42,23 +42,15 @@ private function tryQueryNetherNet(string $ip, int $port): ?array $info = $response->json(); - if ( - !is_array($info) - || !isset( - $info['name'], - $info['level'], - $info['players'], - $info['maxPlayers'], - ) - ) { + if (!is_array($info)) { return null; } return [ - 'hostname' => $info['name'], - 'map' => $info['level'], - 'current_players' => $info['players'], - 'max_players' => $info['maxPlayers'], + 'hostname' => is_string($info['name']) ? $info['name'] : $server->name, + 'map' => is_string($info['level']) ? $info['level'] : 'world', + 'current_players' => is_int($info['players']) ? $info['players'] : 0, + 'max_players' => is_int($info['maxPlayers']) ? $info['maxPlayers'] : 0, 'players' => null, // Bedrock has no player list ]; } catch (Exception) { @@ -67,7 +59,7 @@ private function tryQueryNetherNet(string $ip, int $port): ?array } /** @return ?array{hostname: string, map: string, current_players: int, max_players: int, players: null} */ - private function tryQueryRakNet(string $ip, int $port): ?array + private function tryQueryRakNet(Server $server, string $ip, int $port): ?array { $query = new MinecraftQuery(); @@ -80,10 +72,10 @@ private function tryQueryRakNet(string $ip, int $port): ?array } return [ - 'hostname' => $info['HostName'], - 'map' => $info['Map'], - 'current_players' => $info['Players'], - 'max_players' => $info['MaxPlayers'], + 'hostname' => is_string($info['HostName']) ? $info['HostName'] : 'Unknown', + 'map' => is_string($info['Map']) ? $info['Map'] : 'world', + 'current_players' => is_int($info['Players']) ? $info['Players'] : 0, + 'max_players' => is_int($info['MaxPlayers']) ? $info['MaxPlayers'] : 0, 'players' => null, // Bedrock has no player list ]; } catch (Exception $exception) {