From 8d3d4207146e87012b710321ea62fd596807fd40 Mon Sep 17 00:00:00 2001 From: Nikolay Date: Tue, 17 Oct 2023 09:44:54 +0400 Subject: [PATCH 1/9] More correct handling of tags in the game Rust --- src/GameQ/Protocols/Rust.php | 101 ++++++++++++++++++++++++++++++++--- 1 file changed, 95 insertions(+), 6 deletions(-) diff --git a/src/GameQ/Protocols/Rust.php b/src/GameQ/Protocols/Rust.php index 356cc19f..54dd2342 100644 --- a/src/GameQ/Protocols/Rust.php +++ b/src/GameQ/Protocols/Rust.php @@ -25,9 +25,44 @@ * * @package GameQ\Protocols * @author Austin Bischoff + * @author Nikolay Ipanyuk */ class Rust extends Source { + /** + * Server keywords + * + * mp - Max players + * cp - Current players + * qp - Queue players + * born - Time to create a new save / Wipe time (unixtime) + * pt - Protocol type (rak - RakNet, sw - SteamNetworking) + * h - Hash Assembly-CSharp.dll + * v - Protocol version + * cs - Build version + * st - Status server (ok - Normal work, rst - Server restarting) + * gm - Game mode + * oxide - Oxide/uMod (https://umod.org/) + * carbon - Carbon (https://carbonmod.gg/) + * modded - Modded flag + * + * @type array + */ + private $server_keywords = ['mp', 'cp', 'qp', 'born', 'pt', 'h', 'v', 'cs', 'st', 'gm', 'oxide', 'carbon', 'modded']; + + /** + * Server tags (https://wiki.facepunch.com/rust/server-browser-tags) + * + * @type array + */ + private $server_tags = ['monthly', 'biweekly', 'weekly', 'vanilla', 'hardcore', 'softcore', 'pve', 'roleplay', 'creative', 'minigame', 'training', 'battlefield', 'broyale', 'builds']; + + /** + * Region tags (https://wiki.facepunch.com/rust/server-browser-tags) + * + * @type array + */ + private $region_tags = ['NA', 'SA', 'EU', 'WA', 'EA', 'OC', 'AF']; /** * String name of this protocol class @@ -44,7 +79,7 @@ class Rust extends Source protected $name_long = "Rust"; /** - * Overload so we can get max players from mp of keywords and num players from cp keyword + * Processing of server tags and more correct indication of the current number of players and the maximum number of players * * @param Buffer $buffer */ @@ -52,11 +87,65 @@ protected function processDetails(Buffer $buffer) { $results = parent::processDetails($buffer); - if ($results['keywords']) { - //get max players from mp of keywords and num players from cp keyword - preg_match_all('/(mp|cp)([\d]+)/', $results['keywords'], $matches); - $results['max_players'] = intval($matches[2][0]); - $results['num_players'] = intval($matches[2][1]); + if (isset($results['keywords']) AND strlen($results['keywords']) > 0) + { + $keywords = explode(',', $results['keywords']); + if (sizeof($keywords) > 0) + { + $results['server.keywords'] = []; + $results['unhandled.tags'] = []; + $results['server.tags'] = []; + + foreach ($keywords as $gametag) + { + $parsed = FALSE; + + if (in_array($gametag, $this->server_tags)) + { + $parsed = TRUE; + + $results['server.tags'][] = $gametag; + } + elseif (in_array($gametag, $this->region_tags)) + { + $parsed = TRUE; + + $results['region'] = $gametag; + } + else + { + foreach ($this->server_keywords as $server_keyword) + { + if (strpos($gametag, $server_keyword) === 0) + { + $parsed = TRUE; + + if ($gametag == $server_keyword) + { + $results['server.keywords'][$gametag] = TRUE; + } + else + { + $results['server.keywords'][$server_keyword] = mb_substr($gametag, mb_strlen($server_keyword)); + } + } + } + } + + if (!$parsed) + { + $results['unhandled.tags'][] = $gametag; + } + } + + foreach (['cp' => 'num_players', 'mp' => 'max_players'] as $keyword => $key) + { + if (isset($results['server.keywords'][$keyword])) + { + $results[$key] = intval($results['server.keywords'][$keyword]); + } + } + } } return $results; From 1facb0e09194bbaf3db36922bc0619ff067936d7 Mon Sep 17 00:00:00 2001 From: Nikolay Date: Tue, 17 Oct 2023 10:19:41 +0400 Subject: [PATCH 2/9] Update detect region --- src/GameQ/Protocols/Rust.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/GameQ/Protocols/Rust.php b/src/GameQ/Protocols/Rust.php index 54dd2342..cafe7834 100644 --- a/src/GameQ/Protocols/Rust.php +++ b/src/GameQ/Protocols/Rust.php @@ -62,7 +62,7 @@ class Rust extends Source * * @type array */ - private $region_tags = ['NA', 'SA', 'EU', 'WA', 'EA', 'OC', 'AF']; + private $region_tags = ['na', 'sa', 'eu', 'wa', 'ea', 'oc', 'af']; /** * String name of this protocol class @@ -106,11 +106,11 @@ protected function processDetails(Buffer $buffer) $results['server.tags'][] = $gametag; } - elseif (in_array($gametag, $this->region_tags)) + elseif (in_array(mb_strtolower($gametag), $this->region_tags)) { $parsed = TRUE; - $results['region'] = $gametag; + $results['region'] = mb_strtoupper($gametag); } else { From 8281b37d35ed34f654258234148cfb01ac4fa71c Mon Sep 17 00:00:00 2001 From: Nikolay Date: Tue, 17 Oct 2023 10:56:28 +0400 Subject: [PATCH 3/9] Improved tag detection --- src/GameQ/Protocols/Rust.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/GameQ/Protocols/Rust.php b/src/GameQ/Protocols/Rust.php index cafe7834..af5cfad8 100644 --- a/src/GameQ/Protocols/Rust.php +++ b/src/GameQ/Protocols/Rust.php @@ -99,6 +99,7 @@ protected function processDetails(Buffer $buffer) foreach ($keywords as $gametag) { $parsed = FALSE; + $gametag = trim(mb_strtolower($gametag)); if (in_array($gametag, $this->server_tags)) { @@ -106,7 +107,7 @@ protected function processDetails(Buffer $buffer) $results['server.tags'][] = $gametag; } - elseif (in_array(mb_strtolower($gametag), $this->region_tags)) + elseif (in_array($gametag, $this->region_tags)) { $parsed = TRUE; From 601b818a22cfcb5fa546909e7de74050d062192a Mon Sep 17 00:00:00 2001 From: Nikolay Date: Tue, 17 Oct 2023 21:26:40 +0400 Subject: [PATCH 4/9] Fix code style --- src/GameQ/Protocols/Rust.php | 89 ++++++++++++++++++++++++------------ 1 file changed, 59 insertions(+), 30 deletions(-) diff --git a/src/GameQ/Protocols/Rust.php b/src/GameQ/Protocols/Rust.php index af5cfad8..5280a920 100644 --- a/src/GameQ/Protocols/Rust.php +++ b/src/GameQ/Protocols/Rust.php @@ -48,21 +48,61 @@ class Rust extends Source * * @type array */ - private $server_keywords = ['mp', 'cp', 'qp', 'born', 'pt', 'h', 'v', 'cs', 'st', 'gm', 'oxide', 'carbon', 'modded']; + private $server_keywords = + [ + 'mp', + 'cp', + 'qp', + 'born', + 'pt', + 'h', + 'v', + 'cs', + 'st', + 'gm', + 'oxide', + 'carbon', + 'modded' + ]; /** * Server tags (https://wiki.facepunch.com/rust/server-browser-tags) * * @type array */ - private $server_tags = ['monthly', 'biweekly', 'weekly', 'vanilla', 'hardcore', 'softcore', 'pve', 'roleplay', 'creative', 'minigame', 'training', 'battlefield', 'broyale', 'builds']; + private $server_tags = + [ + 'monthly', + 'biweekly', + 'weekly', + 'vanilla', + 'hardcore', + 'softcore', + 'pve', + 'roleplay', + 'creative', + 'minigame', + 'training', + 'battlefield', + 'broyale', + 'builds' + ]; /** * Region tags (https://wiki.facepunch.com/rust/server-browser-tags) * * @type array */ - private $region_tags = ['na', 'sa', 'eu', 'wa', 'ea', 'oc', 'af']; + private $region_tags = + [ + 'na', + 'sa', + 'eu', + 'wa', + 'ea', + 'oc', + 'af' + ]; /** * String name of this protocol class @@ -87,62 +127,51 @@ protected function processDetails(Buffer $buffer) { $results = parent::processDetails($buffer); - if (isset($results['keywords']) AND strlen($results['keywords']) > 0) - { + if (isset($results['keywords']) and strlen($results['keywords']) > 0) { $keywords = explode(',', $results['keywords']); - if (sizeof($keywords) > 0) - { + if (sizeof($keywords) > 0) { $results['server.keywords'] = []; $results['unhandled.tags'] = []; $results['server.tags'] = []; - foreach ($keywords as $gametag) - { - $parsed = FALSE; + foreach ($keywords as $gametag) { + $parsed = false; $gametag = trim(mb_strtolower($gametag)); - if (in_array($gametag, $this->server_tags)) - { - $parsed = TRUE; + if (in_array($gametag, $this->server_tags)) { + $parsed = true; $results['server.tags'][] = $gametag; } - elseif (in_array($gametag, $this->region_tags)) - { - $parsed = TRUE; + elseif (in_array($gametag, $this->region_tags)) { + $parsed = true; $results['region'] = mb_strtoupper($gametag); } - else - { + else { foreach ($this->server_keywords as $server_keyword) { if (strpos($gametag, $server_keyword) === 0) { - $parsed = TRUE; + $parsed = true; - if ($gametag == $server_keyword) - { - $results['server.keywords'][$gametag] = TRUE; + if ($gametag == $server_keyword) { + $results['server.keywords'][$gametag] = true; } - else - { + else { $results['server.keywords'][$server_keyword] = mb_substr($gametag, mb_strlen($server_keyword)); } } } } - if (!$parsed) - { + if (!$parsed) { $results['unhandled.tags'][] = $gametag; } } - foreach (['cp' => 'num_players', 'mp' => 'max_players'] as $keyword => $key) - { - if (isset($results['server.keywords'][$keyword])) - { + foreach (['cp' => 'num_players', 'mp' => 'max_players'] as $keyword => $key) { + if (isset($results['server.keywords'][$keyword])) { $results[$key] = intval($results['server.keywords'][$keyword]); } } From 0bb24cb6da961fe18ad7f3be50edd8912c3d1707 Mon Sep 17 00:00:00 2001 From: Nikolay Date: Tue, 17 Oct 2023 21:30:22 +0400 Subject: [PATCH 5/9] Fix code style #2 --- src/GameQ/Protocols/Rust.php | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/src/GameQ/Protocols/Rust.php b/src/GameQ/Protocols/Rust.php index 5280a920..2fdefe08 100644 --- a/src/GameQ/Protocols/Rust.php +++ b/src/GameQ/Protocols/Rust.php @@ -48,8 +48,7 @@ class Rust extends Source * * @type array */ - private $server_keywords = - [ + private $server_keywords = [ 'mp', 'cp', 'qp', @@ -70,8 +69,7 @@ class Rust extends Source * * @type array */ - private $server_tags = - [ + private $server_tags = [ 'monthly', 'biweekly', 'weekly', @@ -93,8 +91,7 @@ class Rust extends Source * * @type array */ - private $region_tags = - [ + private $region_tags = [ 'na', 'sa', 'eu', @@ -142,13 +139,11 @@ protected function processDetails(Buffer $buffer) $parsed = true; $results['server.tags'][] = $gametag; - } - elseif (in_array($gametag, $this->region_tags)) { + } elseif (in_array($gametag, $this->region_tags)) { $parsed = true; $results['region'] = mb_strtoupper($gametag); - } - else { + } else { foreach ($this->server_keywords as $server_keyword) { if (strpos($gametag, $server_keyword) === 0) From b6236dac05fde373154c04115795af001ea295bd Mon Sep 17 00:00:00 2001 From: Nikolay Date: Tue, 17 Oct 2023 21:32:19 +0400 Subject: [PATCH 6/9] Fix code style #3 --- src/GameQ/Protocols/Rust.php | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/src/GameQ/Protocols/Rust.php b/src/GameQ/Protocols/Rust.php index 2fdefe08..b45c6b79 100644 --- a/src/GameQ/Protocols/Rust.php +++ b/src/GameQ/Protocols/Rust.php @@ -134,26 +134,19 @@ protected function processDetails(Buffer $buffer) foreach ($keywords as $gametag) { $parsed = false; $gametag = trim(mb_strtolower($gametag)); - if (in_array($gametag, $this->server_tags)) { $parsed = true; - $results['server.tags'][] = $gametag; } elseif (in_array($gametag, $this->region_tags)) { $parsed = true; - $results['region'] = mb_strtoupper($gametag); } else { - foreach ($this->server_keywords as $server_keyword) - { - if (strpos($gametag, $server_keyword) === 0) - { + foreach ($this->server_keywords as $server_keyword) { + if (strpos($gametag, $server_keyword) === 0) { $parsed = true; - if ($gametag == $server_keyword) { $results['server.keywords'][$gametag] = true; - } - else { + } else { $results['server.keywords'][$server_keyword] = mb_substr($gametag, mb_strlen($server_keyword)); } } From d94b53f7304e193834dd1b69fbf2683b13d53161 Mon Sep 17 00:00:00 2001 From: Nikolay Date: Tue, 17 Oct 2023 21:39:18 +0400 Subject: [PATCH 7/9] Code style... --- src/GameQ/Protocols/Rust.php | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/GameQ/Protocols/Rust.php b/src/GameQ/Protocols/Rust.php index b45c6b79..bbcb4c08 100644 --- a/src/GameQ/Protocols/Rust.php +++ b/src/GameQ/Protocols/Rust.php @@ -114,7 +114,7 @@ class Rust extends Source * @type string */ protected $name_long = "Rust"; - + /** * Processing of server tags and more correct indication of the current number of players and the maximum number of players * @@ -158,10 +158,12 @@ protected function processDetails(Buffer $buffer) } } - foreach (['cp' => 'num_players', 'mp' => 'max_players'] as $keyword => $key) { - if (isset($results['server.keywords'][$keyword])) { - $results[$key] = intval($results['server.keywords'][$keyword]); - } + if (isset($results['server.keywords']['cp'])) { + $results['num_players'] = intval($results['server.keywords']['cp']); + } + + if (isset($results['server.keywords']['mp'])) { + $results['max_players'] = intval($results['server.keywords']['mp']); } } } From 51b190e01115ec9ced966f97412b1db51c24d7dc Mon Sep 17 00:00:00 2001 From: Nikolay Date: Tue, 17 Oct 2023 22:07:01 +0400 Subject: [PATCH 8/9] Code, style --- src/GameQ/Protocols/Rust.php | 78 ++++++++++++++++++++---------------- 1 file changed, 44 insertions(+), 34 deletions(-) diff --git a/src/GameQ/Protocols/Rust.php b/src/GameQ/Protocols/Rust.php index bbcb4c08..f9ead452 100644 --- a/src/GameQ/Protocols/Rust.php +++ b/src/GameQ/Protocols/Rust.php @@ -123,51 +123,61 @@ class Rust extends Source protected function processDetails(Buffer $buffer) { $results = parent::processDetails($buffer); - if (isset($results['keywords']) and strlen($results['keywords']) > 0) { $keywords = explode(',', $results['keywords']); if (sizeof($keywords) > 0) { - $results['server.keywords'] = []; - $results['unhandled.tags'] = []; - $results['server.tags'] = []; + $results = array_merge($results, $this->parseKeywords($keywords)); + foreach (['cp' => 'num_players', 'mp' => 'max_players'] as $keyword => $key) { + if (isset($results['server.keywords'][$keyword])) { + $results[$key] = intval($results['server.keywords'][$keyword]); + } + } + } + } - foreach ($keywords as $gametag) { - $parsed = false; - $gametag = trim(mb_strtolower($gametag)); - if (in_array($gametag, $this->server_tags)) { - $parsed = true; - $results['server.tags'][] = $gametag; - } elseif (in_array($gametag, $this->region_tags)) { + return $results; + } + + /** + * Parse keywords + * + * @param array $keywords + */ + protected function parseKeywords(array $keywords = []) + { + $result = [ + 'server.keywords' => [], + 'unhandled.tags' => [], + 'server.tags' = [] + ]; + + foreach ($keywords as $gametag) { + $parsed = false; + $gametag = trim(mb_strtolower($gametag)); + if (in_array($gametag, $this->server_tags)) { + $parsed = true; + $result['server.tags'][] = $gametag; + } elseif (in_array($gametag, $this->region_tags)) { + $parsed = true; + $result['region'] = mb_strtoupper($gametag); + } else { + foreach ($this->server_keywords as $server_keyword) { + if (strpos($gametag, $server_keyword) === 0) { $parsed = true; - $results['region'] = mb_strtoupper($gametag); - } else { - foreach ($this->server_keywords as $server_keyword) { - if (strpos($gametag, $server_keyword) === 0) { - $parsed = true; - if ($gametag == $server_keyword) { - $results['server.keywords'][$gametag] = true; - } else { - $results['server.keywords'][$server_keyword] = mb_substr($gametag, mb_strlen($server_keyword)); - } - } + if ($gametag == $server_keyword) { + $result['server.keywords'][$gametag] = true; + } else { + $result['server.keywords'][$server_keyword] = mb_substr($gametag, mb_strlen($server_keyword)); } } - - if (!$parsed) { - $results['unhandled.tags'][] = $gametag; - } - } - - if (isset($results['server.keywords']['cp'])) { - $results['num_players'] = intval($results['server.keywords']['cp']); } + } - if (isset($results['server.keywords']['mp'])) { - $results['max_players'] = intval($results['server.keywords']['mp']); - } + if (!$parsed) { + $result['unhandled.tags'][] = $gametag; } } - return $results; + return $result; } } From cae336e38ab6acb94aed574bbc826d0da342899c Mon Sep 17 00:00:00 2001 From: Nikolay Date: Tue, 17 Oct 2023 22:07:49 +0400 Subject: [PATCH 9/9] Update Rust.php --- src/GameQ/Protocols/Rust.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/GameQ/Protocols/Rust.php b/src/GameQ/Protocols/Rust.php index f9ead452..dfbc45f7 100644 --- a/src/GameQ/Protocols/Rust.php +++ b/src/GameQ/Protocols/Rust.php @@ -148,7 +148,7 @@ protected function parseKeywords(array $keywords = []) $result = [ 'server.keywords' => [], 'unhandled.tags' => [], - 'server.tags' = [] + 'server.tags' => [] ]; foreach ($keywords as $gametag) {