diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..62b0155 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +TEST +test + diff --git a/GameQ/expansion.php b/GameQ/expansion.php index fb9100b..e15eae2 100644 --- a/GameQ/expansion.php +++ b/GameQ/expansion.php @@ -4,7 +4,7 @@ set_time_limit ( 4 ); // Max execution time is set to 4 seconds // Read JSON file -$readjson = file_get_contents('../statserver_expansion.json'); +$readjson = file_get_contents('../statserver.json'); // Load auto loader require_once(__DIR__ . '/src/GameQ/Autoloader.php'); diff --git a/GameQ/livonia.php b/GameQ/index.php similarity index 90% rename from GameQ/livonia.php rename to GameQ/index.php index 81fc802..2dccf42 100644 --- a/GameQ/livonia.php +++ b/GameQ/index.php @@ -1,10 +1,8 @@ addServer([ 'type' => 'dayz', - 'host' => '82.64.214.194:3202', + 'host' => '82.64.214.194:3222', 'options' => [ 'query_port' => 27022, ], @@ -26,17 +25,6 @@ $GameQ->addServer([ $GameQ->setOption('timeout', 3); // 3 seconds $results = $GameQ->process(); -//print_r($results); - //echo "

// var dump

"; - //var_dump(json_decode($readjson, true)); -//echo "

// echo

"; -// echo $readjson
"; - //$data1 = json_decode("$readjson", true); -//echo "

//Print data1

" ; - //print_r($data1); -//echo "
"; - - $data = json_decode($readjson); // class $name = $data->{'name'}; diff --git a/GameQ/status_expansion.php b/GameQ/status_expansion.php index 510bd8c..dca5ef2 100644 --- a/GameQ/status_expansion.php +++ b/GameQ/status_expansion.php @@ -5,9 +5,6 @@ error_reporting(E_ALL); // Display all types of error set_time_limit ( 4 ); // Max execution time is set to 4 seconds -// Read JSON file -//$readjson = file_get_contents('./statserver_expansion.json'); - // Load auto loader require_once(__DIR__ . '/src/GameQ/Autoloader.php'); // Define the protocols path diff --git a/README.md b/README.md index 06bd09e..9652717 100644 --- a/README.md +++ b/README.md @@ -29,7 +29,8 @@ Inspired by Omega namager for the template. - put *statserverjson.sh* in crontab like this for mysql insert & creation of json file: > */5 * * * * /bin/sh /your/path/statserver_json.sh - + OR + > */5 * * * * /usr/local/bin/php -f /your/path/dayz2json.php ### Library used: diff --git a/config.inc.php b/config.inc.php index f2393ba..581f2e7 100755 --- a/config.inc.php +++ b/config.inc.php @@ -4,19 +4,16 @@ // https://github.com/Austinb/GameQ/wiki/Examples-v3#different-client-and-query-ports $servers = [ [ - 'id' => 'DAYZ', + 'id' => 'server1', 'type' => 'dayz', - 'host' => '103.58.149.102:2302', + 'host' => '82.64.214.194:3201', 'options' => [ - 'query_port' => 27016 + 'query_port' => 27022 ] ] - //[ - //'id' => 'Arma 2 OA Test', - //'type' => 'armedassault2oa', - //'host' => '107.191.44.98:2302' - //], -// [ + + +// ,[ // 'id' => 'DayZ Test', // 'type' => 'dayz', // 'host' => '51.91.61.15:7217', diff --git a/config.php b/config.php index 2832ad4..5f74c7b 100644 --- a/config.php +++ b/config.php @@ -1,76 +1,27 @@ - - - $ipserv = "103.58.149.102" ; // IP server game - /* - $portserv = "2402" ; // Game Server Port - $modport = "2412" ; // Mod port omega (+10) - $queryport= "27017" ; // Queryport -*/ + $ipserv = "103.58.149.102" ; // IP server game $portserv = "2302" ; // Game Server Port $modport = "2312" ; // Mod port omega (+10) $queryport= "27016" ; // Queryport -/* - - $ipserv = "82.64.214.194" ; // IP server game - $portserv = "3222" ; // Game Server Port - $modport = "3232" ; // Mod port omega (+10) - $queryport= "27022" ; // Queryport */ + + $ipserv = "82.64.214.194" ; // IP server game + $portserv = "3201" ; // Game Server Port + $modport = "3211" ; // Mod port omega (+10) + $queryport= "27001" ; // Queryport*/ + + $title = "DayZ Stat SERVER Clan | by TOX" ; // Web title page $descript = "Your Clan/server desciption"; // Your clan/server description - $namemap = "MAP CHERNARUS"; // you can put what you want. + $namemap = "chernarusplus"; // choose between: chernarusplus / livonia / namalsk/ $logoteam = "logoteam.png"; $imagemap = "chernarus.jpg"; - - - // Don't touch below (or you know what you do) - - $urlserv = $ipserv.":".$portserv ; - // need to fix if mod = 0 - $json = file_get_contents("http://".$ipserv.":".$modport."/"); - $objhigher=json_decode($json); //converts to an object - $objlower = $objhigher[0]; // if the json response its multidimensional this lowers it - $objlower=json_decode($json); //converts to an array of objects - - - - // librarie SQ - info serv game - require 'SQ_/bootstrap.php'; - use xPaw\SourceQuery\SourceQuery; - - define( 'SQ_SERVER_ADDR', "${ipserv}" ); // IP server - define( 'SQ_SERVER_PORT', "${queryport}" ); // YOUR QUERY PORT - define( 'SQ_TIMEOUT', 3 ); - define( 'SQ_ENGINE', SourceQuery::SOURCE ); - - $Timer = MicroTime( true ); - $Query = new SourceQuery( ); - - $Info = Array( ); - $Players = Array( ); - - try - { - $Query->Connect( SQ_SERVER_ADDR, SQ_SERVER_PORT, SQ_TIMEOUT, SQ_ENGINE ); - - $Info = $Query->GetInfo( ); - $Players = $Query->GetPlayers( ); - } - catch( Exception $e ) - { - $Exception = $e; - } - - $Query->Disconnect( ); - - $Timer = Number_Format( MicroTime( true ) - $Timer, 4, '.', '' ); - $InfoGT = $Info['GameTags']; + ?> diff --git a/consql.php b/consql.php index db7e120..08b95d5 100644 --- a/consql.php +++ b/consql.php @@ -1,9 +1,9 @@ connect_error) { - // echo (" SQL not active // Function not ready yet "); - echo (" ...Connection failed with MYSQL
"); - echo $servdb; echo "
"; - echo $userdb; echo "
"; - echo $table; echo "
"; - - // die("Connection failed: " . $con->connect_error); + // Display the alert box +// echo ''; + echo "
...Connection failed with MYSQL
"; + // die("Connection failed: " . $con->connect_error); } else { - // echo ("Connect Successfully"); + // echo "Connect Successfully"; } diff --git a/dayz2json.php b/dayz2json.php new file mode 100755 index 0000000..5cf1cc9 --- /dev/null +++ b/dayz2json.php @@ -0,0 +1,40 @@ +
"; +//$results = json_decode($_GET["x"], false); + +ini_set('display_errors', 'on'); +//error_reporting(E_ALL); // Display all types of error + +require_once('GameQ/Autoloader.php'); +$GameQ = new \GameQ\GameQ(); +$GameQ->addServer([ + 'id' => 'server1', + 'type' => 'dayz', + 'host' => $urlserv, + 'options' => [ + 'query_port' => $queryport, + ], +]); +$GameQ->setOption('timeout', 5); // seconds +$GameQ->addFilter('normalize'); +$results = $GameQ->process(); + +$expansion_gq = json_encode($results, JSON_INVALID_UTF8_IGNORE | JSON_INVALID_UTF8_SUBSTITUTE | JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_QUOT | JSON_HEX_AMP | JSON_UNESCAPED_UNICODE | JSON_THROW_ON_ERROR); +echo $expansion_gq; + +//$myJSON = json_decode(utf8_encode($results), true); +//echo $expansion_gq['gq_numplayers']; +//echo "
"; +//print_r($results); + + +?> + diff --git a/dayz2jsonTOX.php b/dayz2jsonTOX.php new file mode 100755 index 0000000..76e15c5 --- /dev/null +++ b/dayz2jsonTOX.php @@ -0,0 +1,44 @@ +
"; +//$results = json_decode($_GET["x"], false); + +ini_set('display_errors', 'on'); +//error_reporting(E_ALL); // Display all types of error + +require_once('GameQ/Autoloader.php'); +$GameQ = new \GameQ\GameQ(); +$GameQ->addServer([ + 'id' => 'server1', + 'type' => 'dayz', + 'host' => $urlserv, + 'options' => [ + 'query_port' => $queryport, + ], +]); +$GameQ->setOption('timeout', 5); // seconds +$GameQ->addFilter('normalize'); +$results = $GameQ->process(); + +$expansion_gq = json_encode($results, JSON_INVALID_UTF8_IGNORE | JSON_INVALID_UTF8_SUBSTITUTE | JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_QUOT | JSON_HEX_AMP | JSON_UNESCAPED_UNICODE | JSON_THROW_ON_ERROR); +echo $expansion_gq; + +//$myJSON = json_decode(utf8_encode($results), true); +//echo $expansion_gq['gq_numplayers']; +//echo "
"; +//print_r($results); + + +?> + diff --git a/gameq/.coveralls.yml b/gameq/.coveralls.yml new file mode 100644 index 0000000..dc54b92 --- /dev/null +++ b/gameq/.coveralls.yml @@ -0,0 +1,8 @@ +# .coveralls.yml example configuration + +# service name +service_name: travis-ci + +# for php-coveralls +coverage_clover: build/logs/clover.xml +json_path: build/logs/coveralls-upload.json diff --git a/gameq/.gitattributes b/gameq/.gitattributes new file mode 100644 index 0000000..69f6917 --- /dev/null +++ b/gameq/.gitattributes @@ -0,0 +1,12 @@ +* text=auto + +/build export-ignore +/tests export-ignore +/.coveralls.yml export-ignore +/.scrutinizer.yml export-ignore +/.gitattributes export-ignore +/.gitignore export-ignore +/.travis.yml export-ignore +/phpunit.xml export-ignore +/phpunit.xml.dist export-ignore +/README.md export-ignore diff --git a/gameq/.gitignore b/gameq/.gitignore new file mode 100644 index 0000000..90acae5 --- /dev/null +++ b/gameq/.gitignore @@ -0,0 +1,12 @@ + +/.buildpath +/.project +/.settings/* +vendor +/.idea +composer.lock +composer.phar +coverage/ +build/logs/ +test.php +*.iml diff --git a/gameq/.scrutinizer.yml b/gameq/.scrutinizer.yml new file mode 100644 index 0000000..f4812e8 --- /dev/null +++ b/gameq/.scrutinizer.yml @@ -0,0 +1,91 @@ +filter: + excluded_paths: [vendor/*, examples/*, tests/*] +before_commands: + - 'composer --prefer-source install' + - 'cp phpunit.xml.dist phpunit.xml' +coding_style: + php: + indentation: + general: + use_tabs: false + switch: + indent_case: true + spaces: + before_parentheses: + closure_definition: true + array_initializer: false + around_operators: + concatenation: true + within: + array_initializer: true + ternary_operator: + in_short_version: true + upper_lower_casing: + keywords: + general: lower + constants: + true_false_null: lower +tools: + external_code_coverage: + enabled: true + timeout: 1800 # Timeout in seconds. + php_mess_detector: + config: + ruleset: build/config/phpmd.xml + php_analyzer: + config: + parameter_reference_check: { enabled: false } + checkstyle: { enabled: false, no_trailing_whitespace: true } + unreachable_code: { enabled: true } + check_access_control: { enabled: false } + typo_checks: { enabled: true } + check_variables: { enabled: true } + suspicious_code: { enabled: false, overriding_parameter: false, overriding_closure_use: false, parameter_closure_use_conflict: false, parameter_multiple_times: false, non_existent_class_in_instanceof_check: false, non_existent_class_in_catch_clause: false, assignment_of_null_return: false, non_commented_switch_fallthrough: false, non_commented_empty_catch_block: false, overriding_private_members: false, use_statement_alias_conflict: false, precedence_in_condition_assignment: false } + dead_assignments: { enabled: true } + verify_php_doc_comments: { enabled: true, parameters: true, return: true, suggest_more_specific_types: true, ask_for_return_if_not_inferrable: true, ask_for_param_type_annotation: true } + loops_must_use_braces: { enabled: true } + check_usage_context: { enabled: true, method_call_on_non_object: { enabled: true, ignore_null_pointer: true }, foreach: { value_as_reference: true, traversable: true }, missing_argument: true, argument_type_checks: lenient } + simplify_boolean_return: { enabled: true } + phpunit_checks: { enabled: true } + reflection_checks: { enabled: false } + precedence_checks: { enabled: true, assignment_in_condition: true, comparison_of_bit_result: true } + basic_semantic_checks: { enabled: true } + doc_comment_fixes: { enabled: true } + reflection_fixes: { enabled: false } + use_statement_fixes: { enabled: true, remove_unused: true, preserve_multiple: false, order_alphabetically: false } + php_code_sniffer: + config: + ruleset: build/config/phpcs.xml + php_cs_fixer: + enabled: false + config: + level: psr2 + fixers: + indentation: false + linefeed: true + trailing_spaces: true + unused_use: true + phpdoc_params: false + visibility: true + return: false + short_tag: true + braces: false + include: true + php_closing_tag: true + extra_empty_lines: true + controls_spaces: true + elseif: true + eof_ending: true + php_code_coverage: + enabled: true + config_path: phpunit.xml.dist + php_pdepend: true + php_loc: + enabled: true + excluded_dirs: [vendor, tests, examples] + php_cpd: + enabled: true + excluded_dirs: [vendor, tests, examples] + php_sim: false + sensiolabs_security_checker: + enabled: true \ No newline at end of file diff --git a/gameq/.travis.yml b/gameq/.travis.yml new file mode 100644 index 0000000..31bda8d --- /dev/null +++ b/gameq/.travis.yml @@ -0,0 +1,30 @@ +language: php + +php: + - 5.4.45 + - 5.5.38 + - 5.6.36 + - 7.0.31 + - 7.1.21 + - 7.2.9 + +matrix: + allow_failures: + +before_script: + - travis_retry composer self-update + - travis_retry composer install --no-interaction --prefer-source + +script: + - mkdir -p build/logs + - vendor/bin/phpcs src tests --extensions=php --ignore=bootstrap --report=checkstyle --report-file=build/logs/checkstyle.xml --standard=build/config/phpcs.xml -v + - vendor/bin/phpmd src,tests xml build/config/phpmd.xml --reportfile build/logs/pmd.xml + - vendor/bin/phpunit -c phpunit.xml --verbose + +after_script: + - php vendor/bin/coveralls -v + - wget https://scrutinizer-ci.com/ocular.phar + - php ocular.phar code-coverage:upload --format=php-clover build/logs/clover.xml + +after_success: + - travis_retry php vendor/bin/coveralls -v diff --git a/gameq/CONTRIBUTING.md b/gameq/CONTRIBUTING.md new file mode 100644 index 0000000..c504042 --- /dev/null +++ b/gameq/CONTRIBUTING.md @@ -0,0 +1,39 @@ +# Contributing + +Contributions are **welcome** and will be fully **credited**. + +## Pull Requests + +- **Document any change in behavior** - Make sure the `README.md` and any other relevant documentation are kept up-to-date. + +- **Create feature branches** - Don't ask us to pull from your master branch. + +- **One pull request per feature** - If you want to do more than one thing, send multiple pull requests. + +## Coding Standard + +- The **[PSR-2 Coding Standard](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-2-coding-style-guide.md)** is to be used for all code. +- **[PHPMD](http://phpmd.org/)** is used to help keep the code clean but exceptions can exist. + +- Use the following commands to check your code before committing it: + +```sh +$ vendor/bin/phpcs src tests --extensions=php --ignore=bootstrap --report=checkstyle --report-file=build/logs/checkstyle.xml --standard=build/config/phpcs.xml -v +$ vendor/bin/phpmd src,tests xml build/config/phpmd.xml +``` + + +## Tests + +- **Add tests!** - Your patch won't be accepted if it doesn't have tests. + +- Run tests by calling `phpunit` +```sh +$ vendor/bin/phpunit +``` + +The coding standard, mess detection and tests are validated by [Travis CI](.travis.yml). + +# Can't Contribute? +If you do not feel comfortable writing your own changes feel free open up a [new issue](https://github.com/Austinb/GameQ/issues/new) for +to add a game or feature. \ No newline at end of file diff --git a/gameq/LICENSE.lgpl b/gameq/LICENSE.lgpl new file mode 100644 index 0000000..02bbb60 --- /dev/null +++ b/gameq/LICENSE.lgpl @@ -0,0 +1,165 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + + This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. + + 0. Additional Definitions. + + As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the GNU +General Public License. + + "The Library" refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + + An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + + A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + + The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + + The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + + 1. Exception to Section 3 of the GNU GPL. + + You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + + 2. Conveying Modified Versions. + + If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + + a) under this License, provided that you make a good faith effort to + ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + + 3. Object Code Incorporating Material from Library Header Files. + + The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + + a) Give prominent notice with each copy of the object code that the + Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the object code with a copy of the GNU GPL and this license + document. + + 4. Combined Works. + + You may convey a Combined Work under terms of your choice that, +taken together, effectively do not restrict modification of the +portions of the Library contained in the Combined Work and reverse +engineering for debugging such modifications, if you also do each of +the following: + + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the Combined Work with a copy of the GNU GPL and this license + document. + + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + + d) Do one of the following: + + 0) Convey the Minimal Corresponding Source under the terms of this + License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + + 1) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (a) uses at run time + a copy of the Library already present on the user's computer + system, and (b) will operate properly with a modified version + of the Library that is interface-compatible with the Linked + Version. + + e) Provide Installation Information, but only if you would otherwise + be required to provide such information under section 6 of the + GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the + Application with a modified version of the Linked Version. (If + you use option 4d0, the Installation Information must accompany + the Minimal Corresponding Source and Corresponding Application + Code. If you use option 4d1, you must provide the Installation + Information in the manner specified by section 6 of the GNU GPL + for conveying Corresponding Source.) + + 5. Combined Libraries. + + You may place library facilities that are a work based on the +Library side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + + a) Accompany the combined library with a copy of the same work based + on the Library, uncombined with any other library facilities, + conveyed under the terms of this License. + + b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + + 6. Revised Versions of the GNU Lesser General Public License. + + The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the +Library as you received it specifies that a certain numbered version +of the GNU Lesser General Public License "or any later version" +applies to it, you have the option of following the terms and +conditions either of that published version or of any later version +published by the Free Software Foundation. If the Library as you +received it does not specify a version number of the GNU Lesser +General Public License, you may choose any version of the GNU Lesser +General Public License ever published by the Free Software Foundation. + + If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. \ No newline at end of file diff --git a/gameq/README.md b/gameq/README.md new file mode 100644 index 0000000..c719a79 --- /dev/null +++ b/gameq/README.md @@ -0,0 +1,53 @@ +# GameQ Version 3 +[![Build Status](https://travis-ci.org/Austinb/GameQ.svg?branch=v3&style=flat-square)](https://travis-ci.org/Austinb/GameQ) +[![Code Coverage](https://scrutinizer-ci.com/g/Austinb/GameQ/badges/coverage.png?b=v3)](https://scrutinizer-ci.com/g/Austinb/GameQ/?branch=v3) +[![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/Austinb/GameQ/badges/quality-score.png?b=v3&style=flat-square)](https://scrutinizer-ci.com/g/Austinb/GameQ/?branch=v3) +[![License](https://img.shields.io/badge/license-LGPL-blue.svg?style=flat)](https://packagist.org/packages/austinb/gameq) +[![paypal](https://www.paypalobjects.com/en_US/i/btn/btn_donateCC_LG.gif)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=VAU2KADATP5PU) + +[![Testing status](http://php-eye.com/badge/austinb/gameq/tested.svg?branch=v3.x-dev&style=flat)](http://php-eye.com/package/austinb/gameq) + +GameQ is a PHP library that allows you to query multiple types of multiplayer game & voice servers at the same time. + +## Requirements +* PHP 5.4.14+ - [Tested](https://travis-ci.org/Austinb/GameQ) in PHP 5.4, 5.5, 5.6, 7.0, 7.1 & 7.2 +* [Bzip2](http://www.php.net/manual/en/book.bzip2.php) - Used for A2S Compressed responses + +## Installation +#### [Composer](https://getcomposer.org/) +This method assumes you already have composer [installed](https://getcomposer.org/doc/00-intro.md) and working properly. Add `austinb/gameq` as a requirement to composer.json by using `composer require austinb/gameq:~3.0` or by manually adding the following to the *composer.json* file in the **require** section: + +```javascript +"austinb/gameq": "~3.0" +``` + +Update your packages with `composer update` or install with `composer install`. + +#### Standalone Library +Download the [latest version](https://github.com/Austinb/GameQ/releases) of the library and unpack it into your project. Add the following to your bootstrap file: +```php +require_once('/path/to/src/GameQ/Autoloader.php'); +``` +The Autoloader.php file provides the same auto loading functionality as the Composer install. + +## Example +```php +$GameQ = new \GameQ\GameQ(); +$GameQ->addServer([ + 'type' => 'css', + 'host' => '127.0.0.1:27015', +]); +$results = $GameQ->process(); +``` +Need more? See [Examples](https://github.com/Austinb/GameQ/wiki/Examples-v3). + +## Contributing + +Please see [CONTRIBUTING](CONTRIBUTING.md) for details. + +## License +See [LICENSE](LICENSE.lgpl) for more information + +Donations +========= +[![paypal](https://www.paypalobjects.com/en_US/i/btn/btn_donateCC_LG.gif)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=VAU2KADATP5PU) diff --git a/gameq/build/config/phpcs.xml b/gameq/build/config/phpcs.xml new file mode 100644 index 0000000..82a58e1 --- /dev/null +++ b/gameq/build/config/phpcs.xml @@ -0,0 +1,31 @@ + + + The coding standard for standard PHP application + */img/* + */images/* + */less/* + */css/* + */js/* + *.html + *.twig + *.yml + *.xml + *.txt + *.less + *.css + *.js + *.jpg + *.jpeg + *.png + *.gif + + + + + + + + + + + diff --git a/gameq/build/config/phpmd.xml b/gameq/build/config/phpmd.xml new file mode 100644 index 0000000..6cb8921 --- /dev/null +++ b/gameq/build/config/phpmd.xml @@ -0,0 +1,58 @@ + + + + GameQ v3 mess detector rule set + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/gameq/cmds.md b/gameq/cmds.md new file mode 100644 index 0000000..61c4996 --- /dev/null +++ b/gameq/cmds.md @@ -0,0 +1,6 @@ + +### PHPUnit testing +`./vendor/bin/phpunit` + +### Update API Files +`apigen generate -s src -d ../gameqpages/api --todo --tree --deprecated --download` \ No newline at end of file diff --git a/gameq/composer.json b/gameq/composer.json new file mode 100644 index 0000000..f26bcd1 --- /dev/null +++ b/gameq/composer.json @@ -0,0 +1,71 @@ +{ + "name": "austinb/gameq", + "description": "GameQ Gameserver Library", + "keywords": ["gameq","serverstatus"], + "version": "v3.0.14", + "license": "LGPL-3.0+", + "authors": [ + { + "name": "Austin Bischoff", + "email": "austin.bischoff@gmail.com", + "role": "Packagist/Composer Maintainer, Developer", + "homepage": "https://github.com/Austinb" + }, + { + "name": "Christoph Kretzschmar", + "email": "blackskyliner@googlemail.com", + "role": "Developer", + "homepage": "https://github.com/Blackskyliner" + }, + { + "name": "Marcel Bößendörfer", + "email": "m.boessendoerfer@marbis.net", + "role": "Developer", + "homepage": "https://github.com/nitrado" + }, + { + "name": "Alexander Hambalgo", + "role": "Developer", + "homepage": "http://balgo.users.sourceforge.net/" + }, + { + "name": "Holger", + "role": "Developer", + "homepage": "http://icet33.users.sourceforge.net/" + }, + { + "name": "Sebastian Weidenbach", + "role": "Developer", + "homepage": "http://sebastianwe.users.sourceforge.net/" + } + ], + "support": { + "source": "https://github.com/Austinb/GameQ/v3", + "issues": "https://github.com/Austinb/GameQ/issues", + "wiki": "https://github.com/Austinb/GameQ/wiki" + }, + "require": { + "php": ">=5.4.14", + "ext-bz2": "*", + "ext-xml": "*" + }, + "require-dev": { + "ext-curl": "*", + "phpunit/phpunit": "^4.8 || ^6.0", + "phpunit/php-invoker": "*", + "phpmd/phpmd" : "@stable", + "squizlabs/php_codesniffer": "3.*@stable", + "satooshi/php-coveralls": "~1.0", + "corneltek/getoptionkit": "~2" + }, + "autoload": { + "psr-4": { + "GameQ\\": "src/GameQ/" + } + }, + "autoload-dev": { + "psr-4": { + "GameQ\\Tests\\": "tests" + } + } +} diff --git a/gameq/examples/list.php b/gameq/examples/list.php new file mode 100644 index 0000000..6d143cf --- /dev/null +++ b/gameq/examples/list.php @@ -0,0 +1,131 @@ +read())) { + if (!is_file($protocols_path . $entry)) { + continue; + } + + // Lets get some info on the class + $reflection = new ReflectionClass('\\GameQ\\Protocols\\' . pathinfo($entry, PATHINFO_FILENAME)); + + // Check to make sure we can actually load the class + if (!$reflection->IsInstantiable()) { + continue; + } + + // Load up the class so we can get info + $class = $reflection->newInstance(); + + // Add it to the list + $protocols[ $class->name() ] = [ + 'name' => $class->nameLong(), + 'state' => $class->state(), + ]; + + // Unset the class + unset($class); +} + +// Close the directory +unset($dir); + +ksort($protocols); + +?> + + + + GameQ v3 - Supported Games + + + + +

GameQ v3 - Supported Games ()

+ + + + + + + + + + $info) { + + + switch ($info['state']) { + case 1: + $state = 'Testing'; + break; + + case 2: + $state = 'Beta'; + break; + + case 3: + $state = 'Stable'; + break; + + case 4: + $state = 'Deprecated'; + break; + } + + $cls = empty($cls) ? ' class="uneven"' : ''; + printf("\n", $cls, + htmlentities($info['name']), + $gameq, + $state + ); + } + ?> + +
Game NameGameQ IdentifierState
%s%s%s
+ + diff --git a/gameq/index.php b/gameq/index.php new file mode 100644 index 0000000..6beea67 --- /dev/null +++ b/gameq/index.php @@ -0,0 +1,197 @@ +addServer([ + 'type' => 'dayz', + 'host' => '82.64.214.194:3201', + 'options' => [ + 'query_port' => 27001, + ], +]); + +// Define the servers you wish you query +//$GameQ = new \GameQ\GameQ(); +// or //$GameQ = \GameQ\GameQ::factory(); + +$GameQ->setOption('timeout', 3); // 3 seconds +$results = $GameQ->process(); + +print_r($results); +echo "
"; + +//Decode JSON +//var_dump(json_decode("$readjson")); +//$data = json_decode("$readjson", true); +//print_r($data); + +// +// receive the JSON Post data +//$data = json_decode( file_get_contents('../server.json'), true); +//print_r($data); + +// Read JSON file +$readjson = file_get_contents('../server.json'); +$data = json_decode("$readjson", true); + +// class +$name = $data->{'gp_name'}; +$map = $data->{'gp_map'}; +$password = $data->{'password'}; +$game = $data->{'raw'}->{'game'}; +$secure = $data->{'raw'}->{'secure'}; +$numplayers = $data->{'raw'}->{'numplayers'}; +$version = $data->{'raw'}->{'version'}; +$tags = $data->{'raw'}->{'tags'}; +$dedicated = $data->{'raw'}->{'rules'}->{'dedicated'}; +$island = $data->{'raw'}->{'rules'}->{'island'}; +$connect = $data->{'connect'}; +$ping = $data->{'ping'}; +$time = "$tags[38]$tags[39]:$tags[41]$tags[42]"; +$battleye = substr($tags,0,8); +$hive = substr($tags,18,8); +$players = $data->{'players'}; + +//if(empty($players)) +// $players = "0"; +//if (empty($players)) { "0"; } +//$playersuser = substr($players,0,8); +//$players = $data->{'array_filter($players)'}; +//$player = $data->{'players'}; +?> + + + + + + Dayz ToX Server: <?php echo"${name}"; ?> + + + + + +
+

+ + + + + + +
+
+ + + + + + + + + + + + + + + + +
+ Server Name IP server Ping Time Player Info Joueurs Version Battleye
+
+
+ + + + + + + + + + + +
Players Info Debug
Nameprint_r ";print_r($players); + +?> +
+ +"; +//echo "
Resultat
"; +echo "
Server Name: ${name} \n";echo "
"; +echo "Map: ${map}
"; +echo "Game: ${game}
"; +echo "IP: ${connect}
"; +//echo "Secure: ${secure}
"; +echo "Version: ${version}
"; +echo "Island: ${island}
"; +//echo "dedicated: ${dedicated}
"; +echo "Ping: ${ping}
"; +echo "Time: $time
"; +echo "Nombre Joueurs: ${numplayers}
"; +echo "Players: "; if(count($players) == 1) {echo "il y a des joueurs"; } else {echo "0 player" ;} +echo "
"; +echo "Tags: ($tags)"; //printf("[%0.45s]
",$tags); //print_r($tags); +echo "
hive: ${hive}
"; +echo "Battleye: ${battleye}"; +echo "
"; +?> + + + + + diff --git a/gameq/phpunit.xml b/gameq/phpunit.xml new file mode 100644 index 0000000..11bf35a --- /dev/null +++ b/gameq/phpunit.xml @@ -0,0 +1,27 @@ + + + + + ./tests/ + + + + + ./src + + + + + + + + diff --git a/gameq/phpunit.xml.dist b/gameq/phpunit.xml.dist new file mode 100644 index 0000000..11bf35a --- /dev/null +++ b/gameq/phpunit.xml.dist @@ -0,0 +1,27 @@ + + + + + ./tests/ + + + + + ./src + + + + + + + + diff --git a/gameq/src/GameQ/Autoloader.php b/gameq/src/GameQ/Autoloader.php new file mode 100644 index 0000000..7c8eb41 --- /dev/null +++ b/gameq/src/GameQ/Autoloader.php @@ -0,0 +1,60 @@ +. + * + * + */ + +/** + * A simple PSR-4 spec auto loader to allow GameQ to function the same as if it were loaded via Composer + * + * To use this just include this file in your script and the GameQ namespace will be made available + * + * i.e. require_once('/path/to/src/GameQ/Autoloader.php'); + * + * See: https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-4-autoloader-examples.md + * + * @codeCoverageIgnore + */ +spl_autoload_register(function ($class) { + + // project-specific namespace prefix + $prefix = 'GameQ\\'; + + // base directory for the namespace prefix + $base_dir = __DIR__ . DIRECTORY_SEPARATOR; + + // does the class use the namespace prefix? + $len = strlen($prefix); + + if (strncmp($prefix, $class, $len) !== 0) { + // no, move to the next registered autoloader + return; + } + + // get the relative class name + $relative_class = substr($class, $len); + + // replace the namespace prefix with the base directory, replace namespace + // separators with directory separators in the relative class name, append + // with .php + $file = $base_dir . str_replace('\\', '/', $relative_class) . '.php'; + + // if the file exists, require it + if (file_exists($file)) { + require $file; + } +}); diff --git a/gameq/src/GameQ/Buffer.php b/gameq/src/GameQ/Buffer.php new file mode 100644 index 0000000..b7b1a15 --- /dev/null +++ b/gameq/src/GameQ/Buffer.php @@ -0,0 +1,501 @@ +. + * + * + */ + +namespace GameQ; + +use GameQ\Exception\Protocol as Exception; + +/** + * Class Buffer + * + * Read specific byte sequences from a provided string or Buffer + * + * @package GameQ + * + * @author Austin Bischoff + * @author Aidan Lister + * @author Tom Buskens + */ +class Buffer +{ + + /** + * Constants for the byte code types we need to read as + */ + const NUMBER_TYPE_BIGENDIAN = 'be', + NUMBER_TYPE_LITTLEENDIAN = 'le', + NUMBER_TYPE_MACHINE = 'm'; + + /** + * The number type we use for reading integers. Defaults to little endian + * + * @type string + */ + private $number_type = self::NUMBER_TYPE_LITTLEENDIAN; + + /** + * The original data + * + * @type string + */ + private $data; + + /** + * The original data + * + * @type int + */ + private $length; + + /** + * Position of pointer + * + * @type int + */ + private $index = 0; + + /** + * Constructor + * + * @param string $data + * @param string $number_type + */ + public function __construct($data, $number_type = self::NUMBER_TYPE_LITTLEENDIAN) + { + + $this->number_type = $number_type; + $this->data = $data; + $this->length = strlen($data); + } + + /** + * Return all the data + * + * @return string The data + */ + public function getData() + { + + return $this->data; + } + + /** + * Return data currently in the buffer + * + * @return string The data currently in the buffer + */ + public function getBuffer() + { + + return substr($this->data, $this->index); + } + + /** + * Returns the number of bytes in the buffer + * + * @return int Length of the buffer + */ + public function getLength() + { + + return max($this->length - $this->index, 0); + } + + /** + * Read from the buffer + * + * @param int $length + * + * @return string + * @throws \GameQ\Exception\Protocol + */ + public function read($length = 1) + { + + if (($length + $this->index) > $this->length) { + throw new Exception("Unable to read length={$length} from buffer. Bad protocol format or return?"); + } + + $string = substr($this->data, $this->index, $length); + $this->index += $length; + + return $string; + } + + /** + * Read the last character from the buffer + * + * Unlike the other read functions, this function actually removes + * the character from the buffer. + * + * @return string + */ + public function readLast() + { + + $len = strlen($this->data); + $string = $this->data{strlen($this->data) - 1}; + $this->data = substr($this->data, 0, $len - 1); + $this->length -= 1; + + return $string; + } + + /** + * Look at the buffer, but don't remove + * + * @param int $length + * + * @return string + */ + public function lookAhead($length = 1) + { + + return substr($this->data, $this->index, $length); + } + + /** + * Skip forward in the buffer + * + * @param int $length + */ + public function skip($length = 1) + { + + $this->index += $length; + } + + /** + * Jump to a specific position in the buffer, + * will not jump past end of buffer + * + * @param $index + */ + public function jumpto($index) + { + + $this->index = min($index, $this->length - 1); + } + + /** + * Get the current pointer position + * + * @return int + */ + public function getPosition() + { + + return $this->index; + } + + /** + * Read from buffer until delimiter is reached + * + * If not found, return everything + * + * @param string $delim + * + * @return string + * @throws \GameQ\Exception\Protocol + */ + public function readString($delim = "\x00") + { + + // Get position of delimiter + $len = strpos($this->data, $delim, min($this->index, $this->length)); + + // If it is not found then return whole buffer + if ($len === false) { + return $this->read(strlen($this->data) - $this->index); + } + + // Read the string and remove the delimiter + $string = $this->read($len - $this->index); + ++$this->index; + + return $string; + } + + /** + * Reads a pascal string from the buffer + * + * @param int $offset Number of bits to cut off the end + * @param bool $read_offset True if the data after the offset is to be read + * + * @return string + * @throws \GameQ\Exception\Protocol + */ + public function readPascalString($offset = 0, $read_offset = false) + { + + // Get the proper offset + $len = $this->readInt8(); + $offset = max($len - $offset, 0); + + // Read the data + if ($read_offset) { + return $this->read($offset); + } else { + return substr($this->read($len), 0, $offset); + } + } + + /** + * Read from buffer until any of the delimiters is reached + * + * If not found, return everything + * + * @param $delims + * @param null $delimfound + * + * @return string + * @throws \GameQ\Exception\Protocol + * + * @todo: Check to see if this is even used anymore + */ + public function readStringMulti($delims, &$delimfound = null) + { + + // Get position of delimiters + $pos = []; + foreach ($delims as $delim) { + if ($p = strpos($this->data, $delim, min($this->index, $this->length))) { + $pos[] = $p; + } + } + + // If none are found then return whole buffer + if (empty($pos)) { + return $this->read(strlen($this->data) - $this->index); + } + + // Read the string and remove the delimiter + sort($pos); + $string = $this->read($pos[0] - $this->index); + $delimfound = $this->read(); + + return $string; + } + + /** + * Read an 8-bit unsigned integer + * + * @return int + * @throws \GameQ\Exception\Protocol + */ + public function readInt8() + { + + $int = unpack('Cint', $this->read(1)); + + return $int['int']; + } + + /** + * Read and 8-bit signed integer + * + * @return int + * @throws \GameQ\Exception\Protocol + */ + public function readInt8Signed() + { + + $int = unpack('cint', $this->read(1)); + + return $int['int']; + } + + /** + * Read a 16-bit unsigned integer + * + * @return int + * @throws \GameQ\Exception\Protocol + */ + public function readInt16() + { + + // Change the integer type we are looking up + switch ($this->number_type) { + case self::NUMBER_TYPE_BIGENDIAN: + $type = 'nint'; + break; + + case self::NUMBER_TYPE_LITTLEENDIAN: + $type = 'vint'; + break; + + default: + $type = 'Sint'; + } + + $int = unpack($type, $this->read(2)); + + return $int['int']; + } + + /** + * Read a 16-bit signed integer + * + * @return int + * @throws \GameQ\Exception\Protocol + */ + public function readInt16Signed() + { + + // Read the data into a string + $string = $this->read(2); + + // For big endian we need to reverse the bytes + if ($this->number_type == self::NUMBER_TYPE_BIGENDIAN) { + $string = strrev($string); + } + + $int = unpack('sint', $string); + + unset($string); + + return $int['int']; + } + + /** + * Read a 32-bit unsigned integer + * + * @return int + * @throws \GameQ\Exception\Protocol + */ + public function readInt32() + { + + // Change the integer type we are looking up + switch ($this->number_type) { + case self::NUMBER_TYPE_BIGENDIAN: + $type = 'Nint'; + break; + + case self::NUMBER_TYPE_LITTLEENDIAN: + $type = 'Vint'; + break; + + default: + $type = 'Lint'; + } + + // Unpack the number + $int = unpack($type, $this->read(4)); + + return $int['int']; + } + + /** + * Read a 32-bit signed integer + * + * @return int + * @throws \GameQ\Exception\Protocol + */ + public function readInt32Signed() + { + + // Read the data into a string + $string = $this->read(4); + + // For big endian we need to reverse the bytes + if ($this->number_type == self::NUMBER_TYPE_BIGENDIAN) { + $string = strrev($string); + } + + $int = unpack('lint', $string); + + unset($string); + + return $int['int']; + } + + /** + * Read a 64-bit unsigned integer + * + * @return int + * @throws \GameQ\Exception\Protocol + */ + public function readInt64() + { + + // We have the pack 64-bit codes available. See: http://php.net/manual/en/function.pack.php + if (version_compare(PHP_VERSION, '5.6.3') >= 0 && PHP_INT_SIZE == 8) { + // Change the integer type we are looking up + switch ($this->number_type) { + case self::NUMBER_TYPE_BIGENDIAN: + $type = 'Jint'; + break; + + case self::NUMBER_TYPE_LITTLEENDIAN: + $type = 'Pint'; + break; + + default: + $type = 'Qint'; + } + + $int64 = unpack($type, $this->read(8)); + + $int = $int64['int']; + + unset($int64); + } else { + if ($this->number_type == self::NUMBER_TYPE_BIGENDIAN) { + $high = $this->readInt32(); + $low = $this->readInt32(); + } else { + $low = $this->readInt32(); + $high = $this->readInt32(); + } + + // We have to determine the number via bitwise + $int = ($high << 32) | $low; + + unset($low, $high); + } + + return $int; + } + + /** + * Read a 32-bit float + * + * @return float + * @throws \GameQ\Exception\Protocol + */ + public function readFloat32() + { + + // Read the data into a string + $string = $this->read(4); + + // For big endian we need to reverse the bytes + if ($this->number_type == self::NUMBER_TYPE_BIGENDIAN) { + $string = strrev($string); + } + + $float = unpack('ffloat', $string); + + unset($string); + + return $float['float']; + } +} diff --git a/gameq/src/GameQ/Exception/Protocol.php b/gameq/src/GameQ/Exception/Protocol.php new file mode 100644 index 0000000..035fc6d --- /dev/null +++ b/gameq/src/GameQ/Exception/Protocol.php @@ -0,0 +1,30 @@ +. + * + * + */ + +namespace GameQ\Exception; + +/** + * Exception + * + * @author Austin Bischoff + */ +class Protocol extends \Exception +{ +} diff --git a/gameq/src/GameQ/Exception/Query.php b/gameq/src/GameQ/Exception/Query.php new file mode 100644 index 0000000..cc69f39 --- /dev/null +++ b/gameq/src/GameQ/Exception/Query.php @@ -0,0 +1,30 @@ +. + * + * + */ + +namespace GameQ\Exception; + +/** + * Exception + * + * @author Austin Bischoff + */ +class Query extends \Exception +{ +} diff --git a/gameq/src/GameQ/Exception/Server.php b/gameq/src/GameQ/Exception/Server.php new file mode 100644 index 0000000..4024551 --- /dev/null +++ b/gameq/src/GameQ/Exception/Server.php @@ -0,0 +1,30 @@ +. + * + * + */ + +namespace GameQ\Exception; + +/** + * Exception + * + * @author Austin Bischoff + */ +class Server extends \Exception +{ +} diff --git a/gameq/src/GameQ/Filters/Base.php b/gameq/src/GameQ/Filters/Base.php new file mode 100644 index 0000000..1a3f4e5 --- /dev/null +++ b/gameq/src/GameQ/Filters/Base.php @@ -0,0 +1,58 @@ +. + */ + +namespace GameQ\Filters; + +use GameQ\Server; + +/** + * Abstract base class which all filters must inherit + * + * @author Austin Bischoff + */ +abstract class Base +{ + + /** + * Holds the options for this instance of the filter + * + * @type array + */ + protected $options = []; + + /** + * Construct + * + * @param array $options + */ + public function __construct(array $options = []) + { + + $this->options = $options; + } + + /** + * Apply the filter to the data + * + * @param array $result + * @param \GameQ\Server $server + * + * @return mixed + */ + abstract public function apply(array $result, Server $server); +} diff --git a/gameq/src/GameQ/Filters/Normalize.php b/gameq/src/GameQ/Filters/Normalize.php new file mode 100644 index 0000000..5771c92 --- /dev/null +++ b/gameq/src/GameQ/Filters/Normalize.php @@ -0,0 +1,133 @@ +. + */ + +namespace GameQ\Filters; + +use GameQ\Server; + +/** + * Class Normalize + * + * @package GameQ\Filters + */ +class Normalize extends Base +{ + + /** + * Holds the protocol specific normalize information + * + * @type array + */ + protected $normalize = []; + + /** + * Apply this filter + * + * @param array $result + * @param \GameQ\Server $server + * + * @return array + */ + public function apply(array $result, Server $server) + { + + // No result passed so just return + if (empty($result)) { + return $result; + } + + //$data = [ ]; + //$data['raw'][$server->id()] = $result; + + // Grab the normalize for this protocol for the specific server + $this->normalize = $server->protocol()->getNormalize(); + + // Do general information + $result = array_merge($result, $this->check('general', $result)); + + // Do player information + if (isset($result['players']) && count($result['players']) > 0) { + // Iterate + foreach ($result['players'] as $key => $player) { + $result['players'][$key] = array_merge($player, $this->check('player', $player)); + } + } else { + $result['players'] = []; + } + + // Do team information + if (isset($result['teams']) && count($result['teams']) > 0) { + // Iterate + foreach ($result['teams'] as $key => $team) { + $result['teams'][$key] = array_merge($team, $this->check('team', $team)); + } + } else { + $result['teams'] = []; + } + + //$data['filtered'][$server->id()] = $result; + /*file_put_contents( + sprintf('%s/../../../tests/Filters/Providers/Normalize/%s_1.json', __DIR__, $server->protocol()->getProtocol()), + json_encode($data, JSON_UNESCAPED_UNICODE | JSON_PARTIAL_OUTPUT_ON_ERROR) + );*/ + + // Return the normalized result + return $result; + } + + /** + * Check a section for normalization + * + * @param $section + * @param $data + * + * @return array + */ + protected function check($section, $data) + { + + // Normalized return array + $normalized = []; + + if (isset($this->normalize[$section]) && !empty($this->normalize[$section])) { + foreach ($this->normalize[$section] as $property => $raw) { + // Default the value for the new key as null + $value = null; + + if (is_array($raw)) { + // Iterate over the raw property we want to use + foreach ($raw as $check) { + if (array_key_exists($check, $data)) { + $value = $data[$check]; + break; + } + } + } else { + // String + if (array_key_exists($raw, $data)) { + $value = $data[$raw]; + } + } + + $normalized['gq_' . $property] = $value; + } + } + + return $normalized; + } +} diff --git a/gameq/src/GameQ/Filters/Secondstohuman.php b/gameq/src/GameQ/Filters/Secondstohuman.php new file mode 100644 index 0000000..5de7269 --- /dev/null +++ b/gameq/src/GameQ/Filters/Secondstohuman.php @@ -0,0 +1,119 @@ +. + */ + +namespace GameQ\Filters; + +use GameQ\Server; + +/** + * Class Secondstohuman + * + * This class converts seconds into a human readable time string 'hh:mm:ss'. This is mainly for converting + * a player's connected time into a readable string. Note that most game servers DO NOT return a player's connected + * time. Source (A2S) based games generally do but not always. This class can also be used to convert other time + * responses into readable time + * + * @package GameQ\Filters + * @author Austin Bischoff + */ +class Secondstohuman extends Base +{ + + /** + * The options key for setting the data key(s) to look for to convert + */ + const OPTION_TIMEKEYS = 'timekeys'; + + /** + * The result key added when applying this filter to a result + */ + const RESULT_KEY = 'gq_%s_human'; + + /** + * Holds the default 'time' keys from the response array. This is key is usually 'time' from A2S responses + * + * @var array + */ + protected $timeKeysDefault = ['time']; + + /** + * Secondstohuman constructor. + * + * @param array $options + */ + public function __construct(array $options = []) + { + // Check for passed keys + if (!array_key_exists(self::OPTION_TIMEKEYS, $options)) { + // Use default + $options[self::OPTION_TIMEKEYS] = $this->timeKeysDefault; + } else { + // Used passed key(s) and make sure it is an array + $options[self::OPTION_TIMEKEYS] = (!is_array($options[self::OPTION_TIMEKEYS])) ? + [$options[self::OPTION_TIMEKEYS]] : $options[self::OPTION_TIMEKEYS]; + } + + parent::__construct($options); + } + + /** + * Apply this filter to the result data + * + * @param array $result + * @param Server $server + * + * @return array + */ + public function apply(array $result, Server $server) + { + // Send the results off to be iterated and return the updated result + return $this->iterate($result); + } + + /** + * Home grown iterate function. Would like to replace this with an internal PHP method(s) but could not find a way + * to make the iterate classes add new keys to the response. They all seemed to be read-only. + * + * @todo: See if there is a more internal way of handling this instead of foreach looping and recursive calling + * + * @param array $result + * + * @return array + */ + protected function iterate(array &$result) + { + // Iterate over the results + foreach ($result as $key => $value) { + // Offload to itself if we have another array + if (is_array($value)) { + // Iterate and update the result + $result[$key] = $this->iterate($value); + } elseif (in_array($key, $this->options[self::OPTION_TIMEKEYS])) { + // We match one of the keys we are wanting to convert so add it and move on + $result[sprintf(self::RESULT_KEY, $key)] = sprintf( + "%02d:%02d:%02d", + floor($value / 3600), + ($value / 60) % 60, + $value % 60 + ); + } + } + + return $result; + } +} diff --git a/gameq/src/GameQ/Filters/Stripcolors.php b/gameq/src/GameQ/Filters/Stripcolors.php new file mode 100644 index 0000000..7efb97a --- /dev/null +++ b/gameq/src/GameQ/Filters/Stripcolors.php @@ -0,0 +1,101 @@ +. + */ + +namespace GameQ\Filters; + +use GameQ\Server; + +/** + * Class Strip Colors + * + * Strip color codes from UT and Quake based games + * + * @package GameQ\Filters + */ +class Stripcolors extends Base +{ + + /** + * Apply this filter + * + * @param array $result + * @param \GameQ\Server $server + * + * @return array + */ + public function apply(array $result, Server $server) + { + + // No result passed so just return + if (empty($result)) { + return $result; + } + + //$data = []; + //$data['raw'][ $server->id() ] = $result; + + // Switch based on the base (not game) protocol + switch ($server->protocol()->getProtocol()) { + case 'quake2': + case 'quake3': + case 'doom3': + array_walk_recursive($result, [$this, 'stripQuake']); + break; + case 'unreal2': + case 'ut3': + case 'gamespy3': //not sure if gamespy3 supports ut colors but won't hurt + case 'gamespy2': + array_walk_recursive($result, [$this, 'stripUnreal']); + break; + } + + /*$data['filtered'][ $server->id() ] = $result; + file_put_contents( + sprintf( + '%s/../../../tests/Filters/Providers/Stripcolors\%s_1.json', + __DIR__, + $server->protocol()->getProtocol() + ), + json_encode($data, JSON_UNESCAPED_UNICODE | JSON_PARTIAL_OUTPUT_ON_ERROR) + );*/ + + // Return the stripped result + return $result; + } + + /** + * Strip color codes from quake based games + * + * @param string $string + */ + protected function stripQuake(&$string) + { + $string = preg_replace('#(\^.)#', '', $string); + } + + /** + * Strip color codes from Unreal based games + * + * @param string $string + */ + protected function stripUnreal(&$string) + { +/* $string = preg_replace('/\x1b.../', '', $string);*/ + $string = utf8_encode(preg_replace('/\x1b.../', '', utf8_decode($string))); + } +} diff --git a/gameq/src/GameQ/Filters/Test.php b/gameq/src/GameQ/Filters/Test.php new file mode 100644 index 0000000..836ddf3 --- /dev/null +++ b/gameq/src/GameQ/Filters/Test.php @@ -0,0 +1,47 @@ +. + */ + +namespace GameQ\Filters; + +use GameQ\Server; + +/** + * Class Test + * + * This is a test filter to be used for testing purposes only. + * + * @package GameQ\Filters + */ +class Test extends Base +{ + /** + * Apply the filter. For this we just return whatever is sent + * + * @SuppressWarnings(PHPMD) + * + * @param array $result + * @param \GameQ\Server $server + * + * @return array + */ + public function apply(array $result, Server $server) + { + + return $result; + } +} diff --git a/gameq/src/GameQ/GameQ.php b/gameq/src/GameQ/GameQ.php new file mode 100644 index 0000000..0165dab --- /dev/null +++ b/gameq/src/GameQ/GameQ.php @@ -0,0 +1,672 @@ +. + */ +namespace GameQ; + +use GameQ\Exception\Protocol as ProtocolException; +use GameQ\Exception\Query as QueryException; + +/** + * Base GameQ Class + * + * This class should be the only one that is included when you use GameQ to query + * any games servers. + * + * Requirements: See wiki or README for more information on the requirements + * - PHP 5.4.14+ + * * Bzip2 - http://www.php.net/manual/en/book.bzip2.php + * + * @author Austin Bischoff + * + * @property bool $debug + * @property string $capture_packets_file + * @property int $stream_timeout + * @property int $timeout + * @property int $write_wait + */ +class GameQ +{ + /* + * Constants + */ + + /* Static Section */ + + /** + * Holds the instance of itself + * + * @type self + */ + protected static $instance = null; + + /** + * Create a new instance of this class + * + * @return \GameQ\GameQ + */ + public static function factory() + { + + // Create a new instance + self::$instance = new self(); + + // Return this new instance + return self::$instance; + } + + /* Dynamic Section */ + + /** + * Default options + * + * @type array + */ + protected $options = [ + 'debug' => false, + 'timeout' => 3, // Seconds + 'filters' => [ + // Default normalize + 'normalize_d751713988987e9331980363e24189ce' => [ + 'filter' => 'normalize', + 'options' => [], + ], + ], + // Advanced settings + 'stream_timeout' => 200000, // See http://www.php.net/manual/en/function.stream-select.php for more info + 'write_wait' => 500, + // How long (in micro-seconds) to pause between writing to server sockets, helps cpu usage + + // Used for generating protocol test data + 'capture_packets_file' => null, + ]; + + /** + * Array of servers being queried + * + * @type array + */ + protected $servers = []; + + /** + * The query library to use. Default is Native + * + * @type string + */ + protected $queryLibrary = 'GameQ\\Query\\Native'; + + /** + * Holds the instance of the queryLibrary + * + * @type \GameQ\Query\Core|null + */ + protected $query = null; + + /** + * GameQ constructor. + * + * Do some checks as needed so this will operate + */ + public function __construct() + { + // Check for missing utf8_encode function + if (!function_exists('utf8_encode')) { + throw new \Exception("PHP's utf8_encode() function is required - " + . "http://php.net/manual/en/function.utf8-encode.php. Check your php installation."); + } + } + + /** + * Get an option's value + * + * @param mixed $option + * + * @return mixed|null + */ + public function __get($option) + { + + return isset($this->options[$option]) ? $this->options[$option] : null; + } + + /** + * Set an option's value + * + * @param mixed $option + * @param mixed $value + * + * @return bool + */ + public function __set($option, $value) + { + + $this->options[$option] = $value; + + return true; + } + + /** + * Chainable call to __set, uses set as the actual setter + * + * @param mixed $var + * @param mixed $value + * + * @return $this + */ + public function setOption($var, $value) + { + + // Use magic + $this->{$var} = $value; + + return $this; // Make chainable + } + + /** + * Add a single server + * + * @param array $server_info + * + * @return $this + */ + public function addServer(array $server_info = []) + { + + // Add and validate the server + $this->servers[uniqid()] = new Server($server_info); + + return $this; // Make calls chainable + } + + /** + * Add multiple servers in a single call + * + * @param array $servers + * + * @return $this + */ + public function addServers(array $servers = []) + { + + // Loop through all the servers and add them + foreach ($servers as $server_info) { + $this->addServer($server_info); + } + + return $this; // Make calls chainable + } + + /** + * Add a set of servers from a file or an array of files. + * Supported formats: + * JSON + * + * @param array $files + * + * @return $this + * @throws \Exception + */ + public function addServersFromFiles($files = []) + { + + // Since we expect an array let us turn a string (i.e. single file) into an array + if (!is_array($files)) { + $files = [$files]; + } + + // Iterate over the file(s) and add them + foreach ($files as $file) { + // Check to make sure the file exists and we can read it + if (!file_exists($file) || !is_readable($file)) { + continue; + } + + // See if this file is JSON + if (($servers = json_decode(file_get_contents($file), true)) === null + && json_last_error() !== JSON_ERROR_NONE + ) { + // Type not supported + continue; + } + + // Add this list of servers + $this->addServers($servers); + } + + return $this; + } + + /** + * Clear all of the defined servers + * + * @return $this + */ + public function clearServers() + { + + // Reset all the servers + $this->servers = []; + + return $this; // Make Chainable + } + + /** + * Add a filter to the processing list + * + * @param string $filterName + * @param array $options + * + * @return $this + */ + +public function isCsServerOnline($server, $port = 7117) +{ + $socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP); + + // timeout 1.5 seconds + $timeout = array('sec' => 1, 'usec' => 500000); + socket_set_option($socket, SOL_SOCKET, SO_SNDTIMEO, $timeout); + socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, $timeout); + + @socket_connect($socket, $server, $port); + @socket_write($socket, "\xFF\xFF\xFF\xFF\x69"); + + $isOnline = @socket_read($socket, 5) == "\xFF\xFF\xFF\xFF\x6A"; + @socket_close($socket); + + return $isOnline; +} + + + + + public function addFilter($filterName, $options = []) + { + // Create the filter hash so we can run multiple versions of the same filter + $filterHash = sprintf('%s_%s', strtolower($filterName), md5(json_encode($options))); + + // Add the filter + $this->options['filters'][$filterHash] = [ + 'filter' => strtolower($filterName), + 'options' => $options, + ]; + + unset($filterHash); + + return $this; + } + + /** + * Remove an added filter + * + * @param string $filterHash + * + * @return $this + */ + public function removeFilter($filterHash) + { + // Make lower case + $filterHash = strtolower($filterHash); + + // Remove this filter if it has been defined + if (array_key_exists($filterHash, $this->options['filters'])) { + unset($this->options['filters'][$filterHash]); + } + + unset($filterHash); + + return $this; + } + + /** + * Return the list of applied filters + * + * @return array + */ + public function listFilters() + { + return $this->options['filters']; + } + + /** + * Main method used to actually process all of the added servers and return the information + * + * @return array + * @throws \Exception + */ + public function process() + { + + // Initialize the query library we are using + $class = new \ReflectionClass($this->queryLibrary); + + // Set the query pointer to the new instance of the library + $this->query = $class->newInstance(); + + unset($class); + + // Define the return + $results = []; + + // @todo: Add break up into loop to split large arrays into smaller chunks + + // Do server challenge(s) first, if any + $this->doChallenges(); + + // Do packets for server(s) and get query responses + $this->doQueries(); + + // Now we should have some information to process for each server + foreach ($this->servers as $server) { + /* @var $server \GameQ\Server */ + + // Parse the responses for this server + $result = $this->doParseResponse($server); + + // Apply the filters + $result = array_merge($result, $this->doApplyFilters($result, $server)); + + // Sort the keys so they are alphabetical and nicer to look at + ksort($result); + + // Add the result to the results array + $results[$server->id()] = $result; + } + + return $results; + } + + /** + * Do server challenges, where required + */ + protected function doChallenges() + { + + // Initialize the sockets for reading + $sockets = []; + + // By default we don't have any challenges to process + $server_challenge = false; + + // Do challenge packets + foreach ($this->servers as $server_id => $server) { + /* @var $server \GameQ\Server */ + + // This protocol has a challenge packet that needs to be sent + if ($server->protocol()->hasChallenge()) { + // We have a challenge, set the flag + $server_challenge = true; + + // Let's make a clone of the query class + $socket = clone $this->query; + + // Set the information for this query socket + $socket->set( + $server->protocol()->transport(), + $server->ip, + $server->port_query, + $this->timeout + ); + + try { + // Now write the challenge packet to the socket. + $socket->write($server->protocol()->getPacket(Protocol::PACKET_CHALLENGE)); + + // Add the socket information so we can reference it easily + $sockets[(int)$socket->get()] = [ + 'server_id' => $server_id, + 'socket' => $socket, + ]; + } catch (QueryException $e) { + // Check to see if we are in debug, if so bubble up the exception + if ($this->debug) { + throw new \Exception($e->getMessage(), $e->getCode(), $e); + } + } + + unset($socket); + + // Let's sleep shortly so we are not hammering out calls rapid fire style hogging cpu + usleep($this->write_wait); + } + } + + // We have at least one server with a challenge, we need to listen for responses + if ($server_challenge) { + // Now we need to listen for and grab challenge response(s) + $responses = call_user_func_array( + [$this->query, 'getResponses'], + [$sockets, $this->timeout, $this->stream_timeout] + ); + + // Iterate over the challenge responses + foreach ($responses as $socket_id => $response) { + // Back out the server_id we need to update the challenge response for + $server_id = $sockets[$socket_id]['server_id']; + + // Make this into a buffer so it is easier to manipulate + $challenge = new Buffer(implode('', $response)); + + // Grab the server instance + /* @var $server \GameQ\Server */ + $server = $this->servers[$server_id]; + + // Apply the challenge + $server->protocol()->challengeParseAndApply($challenge); + + // Add this socket to be reused, has to be reused in GameSpy3 for example + $server->socketAdd($sockets[$socket_id]['socket']); + + // Clear + unset($server); + } + } + } + + /** + * Run the actual queries and get the response(s) + */ + protected function doQueries() + { + + // Initialize the array of sockets + $sockets = []; + + // Iterate over the server list + foreach ($this->servers as $server_id => $server) { + /* @var $server \GameQ\Server */ + + // Invoke the beforeSend method + $server->protocol()->beforeSend($server); + + // Get all the non-challenge packets we need to send + $packets = $server->protocol()->getPacket('!' . Protocol::PACKET_CHALLENGE); + + if (count($packets) == 0) { + // Skip nothing else to do for some reason. + continue; + } + + // Try to use an existing socket + if (($socket = $server->socketGet()) === null) { + // Let's make a clone of the query class + $socket = clone $this->query; + + // Set the information for this query socket + $socket->set( + $server->protocol()->transport(), + $server->ip, + $server->port_query, + $this->timeout + ); + } + + try { + // Iterate over all the packets we need to send + foreach ($packets as $packet_data) { + // Now write the packet to the socket. + $socket->write($packet_data); + + // Let's sleep shortly so we are not hammering out calls rapid fire style + usleep($this->write_wait); + } + + unset($packets); + + // Add the socket information so we can reference it easily + $sockets[(int)$socket->get()] = [ + 'server_id' => $server_id, + 'socket' => $socket, + ]; + } catch (QueryException $e) { + // Check to see if we are in debug, if so bubble up the exception + if ($this->debug) { + throw new \Exception($e->getMessage(), $e->getCode(), $e); + } + + break; + } + + // Clean up the sockets, if any left over + $server->socketCleanse(); + } + + // Now we need to listen for and grab response(s) + $responses = call_user_func_array( + [$this->query, 'getResponses'], + [$sockets, $this->timeout, $this->stream_timeout] + ); + + // Iterate over the responses + foreach ($responses as $socket_id => $response) { + // Back out the server_id + $server_id = $sockets[$socket_id]['server_id']; + + // Grab the server instance + /* @var $server \GameQ\Server */ + $server = $this->servers[$server_id]; + + // Save the response from this packet + $server->protocol()->packetResponse($response); + + unset($server); + } + + // Now we need to close all of the sockets + foreach ($sockets as $socketInfo) { + /* @var $socket \GameQ\Query\Core */ + $socket = $socketInfo['socket']; + + // Close the socket + $socket->close(); + + unset($socket); + } + + unset($sockets); + } + + /** + * Parse the response for a specific server + * + * @param \GameQ\Server $server + * + * @return array + * @throws \Exception + */ + protected function doParseResponse(Server $server) + { + + try { + // @codeCoverageIgnoreStart + // We want to save this server's response to a file (useful for unit testing) + if (!is_null($this->capture_packets_file)) { + file_put_contents( + $this->capture_packets_file, + implode(PHP_EOL . '||' . PHP_EOL, $server->protocol()->packetResponse()) + ); + } + // @codeCoverageIgnoreEnd + + // Get the server response + $results = $server->protocol()->processResponse(); + + // Check for online before we do anything else + $results['gq_online'] = (count($results) > 0); + } catch (ProtocolException $e) { + // Check to see if we are in debug, if so bubble up the exception + if ($this->debug) { + throw new \Exception($e->getMessage(), $e->getCode(), $e); + } + + // We ignore this server + $results = [ + 'gq_online' => false, + ]; + } + + // Now add some default stuff + $results['gq_address'] = (isset($results['gq_address'])) ? $results['gq_address'] : $server->ip(); + $results['gq_port_client'] = $server->portClient(); + $results['gq_port_query'] = (isset($results['gq_port_query'])) ? $results['gq_port_query'] : $server->portQuery(); + $results['gq_protocol'] = $server->protocol()->getProtocol(); + $results['gq_type'] = (string)$server->protocol(); + $results['gq_name'] = $server->protocol()->nameLong(); + $results['gq_transport'] = $server->protocol()->transport(); + + // Process the join link + if (!isset($results['gq_joinlink']) || empty($results['gq_joinlink'])) { + $results['gq_joinlink'] = $server->getJoinLink(); + } + + return $results; + } + + /** + * Apply any filters to the results + * + * @param array $results + * @param \GameQ\Server $server + * + * @return array + */ + + + + protected function doApplyFilters(array $results, Server $server) + { + + // Loop over the filters + foreach ($this->options['filters'] as $filterOptions) { + // Try to do this filter + try { + // Make a new reflection class + $class = new \ReflectionClass(sprintf('GameQ\\Filters\\%s', ucfirst($filterOptions['filter']))); + + // Create a new instance of the filter class specified + $filter = $class->newInstanceArgs([$filterOptions['options']]); + + // Apply the filter to the data + $results = $filter->apply($results, $server); + } catch (\ReflectionException $e) { + // Invalid, skip it + continue; + } + } + + return $results; + } +} diff --git a/gameq/src/GameQ/Protocol.php b/gameq/src/GameQ/Protocol.php new file mode 100644 index 0000000..6d94a45 --- /dev/null +++ b/gameq/src/GameQ/Protocol.php @@ -0,0 +1,500 @@ +. + * + * + */ + +namespace GameQ; + +/** + * Handles the core functionality for the protocols + * + * @SuppressWarnings(PHPMD.NumberOfChildren) + * + * @author Austin Bischoff + */ +abstract class Protocol +{ + + /** + * Constants for class states + */ + const STATE_TESTING = 1; + + const STATE_BETA = 2; + + const STATE_STABLE = 3; + + const STATE_DEPRECATED = 4; + + /** + * Constants for packet keys + */ + const PACKET_ALL = 'all'; // Some protocols allow all data to be sent back in one call. + + const PACKET_BASIC = 'basic'; + + const PACKET_CHALLENGE = 'challenge'; + + const PACKET_CHANNELS = 'channels'; // Voice servers + + const PACKET_DETAILS = 'details'; + + const PACKET_INFO = 'info'; + + const PACKET_PLAYERS = 'players'; + + const PACKET_STATUS = 'status'; + + const PACKET_RULES = 'rules'; + + const PACKET_VERSION = 'version'; + + /** + * Transport constants + */ + const TRANSPORT_UDP = 'udp'; + + const TRANSPORT_TCP = 'tcp'; + + const TRANSPORT_SSL = 'ssl'; + + const TRANSPORT_TLS = 'tls'; + + /** + * Short name of the protocol + * + * @type string + */ + protected $name = 'unknown'; + + /** + * The longer, fancier name for the protocol + * + * @type string + */ + protected $name_long = 'unknown'; + + /** + * The difference between the client port and query port + * + * @type int + */ + protected $port_diff = 0; + + /** + * The transport method to use to actually send the data + * Default is UDP + * + * @type string + */ + protected $transport = self::TRANSPORT_UDP; + + /** + * The protocol type used when querying the server + * + * @type string + */ + protected $protocol = 'unknown'; + + /** + * Holds the valid packet types this protocol has available. + * + * @type array + */ + protected $packets = []; + + /** + * Holds the response headers and the method to use to process them. + * + * @type array + */ + protected $responses = []; + + /** + * Holds the list of methods to run when parsing the packet response(s) data. These + * methods should provide all the return information. + * + * @type array + */ + protected $process_methods = []; + + /** + * The packet responses received + * + * @type array + */ + protected $packets_response = []; + + /** + * Holds the instance of the result class + * + * @type null + */ + protected $result = null; + + /** + * Options for this protocol + * + * @type array + */ + protected $options = []; + + /** + * Define the state of this class + * + * @type int + */ + protected $state = self::STATE_STABLE; + + /** + * Holds specific normalize settings + * + * @todo: Remove this ugly bulk by moving specific ones to their specific game(s) + * + * @type array + */ + protected $normalize = [ + // General + 'general' => [ + // target => source + 'dedicated' => [ + 'listenserver', + 'dedic', + 'bf2dedicated', + 'netserverdedicated', + 'bf2142dedicated', + 'dedicated', + ], + 'gametype' => ['ggametype', 'sigametype', 'matchtype'], + 'hostname' => ['svhostname', 'servername', 'siname', 'name'], + 'mapname' => ['map', 'simap'], + 'maxplayers' => ['svmaxclients', 'simaxplayers', 'maxclients', 'max_players'], + 'mod' => ['game', 'gamedir', 'gamevariant'], + 'numplayers' => ['clients', 'sinumplayers', 'num_players'], + 'password' => ['protected', 'siusepass', 'sineedpass', 'pswrd', 'gneedpass', 'auth', 'passsord'], + ], + // Indvidual + 'player' => [ + 'name' => ['nick', 'player', 'playername', 'name'], + 'kills' => ['kills'], + 'deaths' => ['deaths'], + 'score' => ['kills', 'frags', 'skill', 'score'], + 'ping' => ['ping'], + ], + // Team + 'team' => [ + 'name' => ['name', 'teamname', 'team_t'], + 'score' => ['score', 'score_t'], + ], + ]; + + /** + * Quick join link + * + * @type string + */ + protected $join_link = ''; + + /** + * @param array $options + */ + public function __construct(array $options = []) + { + + // Set the options for this specific instance of the class + $this->options = $options; + } + + /** + * String name of this class + * + * @return string + */ + public function __toString() + { + + return $this->name; + } + + /** + * Get the port difference between the server's client (game) and query ports + * + * @return int + */ + public function portDiff() + { + + return $this->port_diff; + } + + /** + * "Find" the query port based off of the client port and port_diff + * + * This method is meant to be overloaded for more complex maths or lookup tables + * + * @param int $clientPort + * + * @return int + */ + public function findQueryPort($clientPort) + { + + return $clientPort + $this->port_diff; + } + + /** + * Return the join_link as defined by the protocol class + * + * @return string + */ + public function joinLink() + { + + return $this->join_link; + } + + /** + * Short (callable) name of this class + * + * @return string + */ + public function name() + { + + return $this->name; + } + + /** + * Long name of this class + * + * @return string + */ + public function nameLong() + { + + return $this->name_long; + } + + /** + * Return the status of this Protocol Class + * + * @return int + */ + public function state() + { + + return $this->state; + } + + /** + * Return the protocol property + * + * @return string + */ + public function getProtocol() + { + + return $this->protocol; + } + + /** + * Get/set the transport type for this protocol + * + * @param string|null $type + * + * @return string + */ + public function transport($type = null) + { + + // Act as setter + if (!is_null($type)) { + $this->transport = $type; + } + + return $this->transport; + } + + /** + * Set the options for the protocol call + * + * @param array $options + * + * @return array + */ + public function options($options = []) + { + + // Act as setter + if (!empty($options)) { + $this->options = $options; + } + + return $this->options; + } + + + /* + * Packet Section + */ + + /** + * Return specific packet(s) + * + * @param array $type + * + * @return array + */ + public function getPacket($type = []) + { + + $packets = []; + + + // We want an array of packets back + if (is_array($type) && !empty($type)) { + // Loop the packets + foreach ($this->packets as $packet_type => $packet_data) { + // We want this packet + if (in_array($packet_type, $type)) { + $packets[$packet_type] = $packet_data; + } + } + } elseif ($type == '!challenge') { + // Loop the packets + foreach ($this->packets as $packet_type => $packet_data) { + // Dont want challenge packets + if ($packet_type != self::PACKET_CHALLENGE) { + $packets[$packet_type] = $packet_data; + } + } + } elseif (is_string($type)) { + // Return specific packet type + $packets = $this->packets[$type]; + } else { + // Return all packets + $packets = $this->packets; + } + + // Return the packets + return $packets; + } + + /** + * Get/set the packet response + * + * @param array|null $response + * + * @return array + */ + public function packetResponse(array $response = null) + { + + // Act as setter + if (!empty($response)) { + $this->packets_response = $response; + } + + return $this->packets_response; + } + + + /* + * Challenge section + */ + + /** + * Determine whether or not this protocol has a challenge needed before querying + * + * @return bool + */ + public function hasChallenge() + { + + return (isset($this->packets[self::PACKET_CHALLENGE]) && !empty($this->packets[self::PACKET_CHALLENGE])); + } + + /** + * Parse the challenge response and add it to the buffer items that need it. + * This should be overloaded by extending class + * + * @codeCoverageIgnore + * @SuppressWarnings(PHPMD.UnusedFormalParameter) + * + * @param \GameQ\Buffer $challenge_buffer + * + * @return bool + */ + public function challengeParseAndApply(Buffer $challenge_buffer) + { + + return true; + } + + /** + * Apply the challenge string to all the packets that need it. + * + * @param string $challenge_string + * + * @return bool + */ + protected function challengeApply($challenge_string) + { + + // Let's loop through all the packets and append the challenge where it is needed + foreach ($this->packets as $packet_type => $packet) { + $this->packets[$packet_type] = sprintf($packet, $challenge_string); + } + + return true; + } + + /** + * Get the normalize settings for the protocol + * + * @return array + */ + public function getNormalize() + { + + return $this->normalize; + } + + /* + * General + */ + + /** + * Generic method to allow protocol classes to do work right before the query is sent + * + * @codeCoverageIgnore + * @SuppressWarnings(PHPMD.UnusedFormalParameter) + * + * @param \GameQ\Server $server + */ + public function beforeSend(Server $server) + { + } + + /** + * Method called to process query response data. Each extending class has to have one of these functions. + * + * @return mixed + */ + abstract public function processResponse(); +} diff --git a/gameq/src/GameQ/Protocols/Aa3.php b/gameq/src/GameQ/Protocols/Aa3.php new file mode 100644 index 0000000..6ffd412 --- /dev/null +++ b/gameq/src/GameQ/Protocols/Aa3.php @@ -0,0 +1,53 @@ +. + */ + +namespace GameQ\Protocols; + +/** + * Class Aa3 + * + * @package GameQ\Protocols + * @author Austin Bischoff + */ +class Aa3 extends Source +{ + + /** + * String name of this protocol class + * + * @type string + */ + protected $name = 'aa3'; + + /** + * Longer string name of this protocol class + * + * @type string + */ + protected $name_long = "America's Army 3"; + + /** + * Query port = client_port + 18243 + * + * client_port default 8777 + * query_port default 27020 + * + * @type int + */ + protected $port_diff = 18243; +} diff --git a/gameq/src/GameQ/Protocols/Aapg.php b/gameq/src/GameQ/Protocols/Aapg.php new file mode 100644 index 0000000..a207d4f --- /dev/null +++ b/gameq/src/GameQ/Protocols/Aapg.php @@ -0,0 +1,42 @@ +. + */ + +namespace GameQ\Protocols; + +/** + * Class Aapg + * + * @package GameQ\Protocols + * @author Austin Bischoff + */ +class Aapg extends Aa3 +{ + /** + * String name of this protocol class + * + * @type string + */ + protected $name = 'aapg'; + + /** + * Longer string name of this protocol class + * + * @type string + */ + protected $name_long = "America's Army: Proving Grounds"; +} diff --git a/gameq/src/GameQ/Protocols/Arkse.php b/gameq/src/GameQ/Protocols/Arkse.php new file mode 100644 index 0000000..3193c5a --- /dev/null +++ b/gameq/src/GameQ/Protocols/Arkse.php @@ -0,0 +1,51 @@ +. + */ + +namespace GameQ\Protocols; + +/** + * Class ARK: Survival Evolved + * + * @package GameQ\Protocols + * @author Austin Bischoff + */ +class Arkse extends Source +{ + + /** + * String name of this protocol class + * + * @type string + */ + protected $name = 'arkse'; + + /** + * Longer string name of this protocol class + * + * @type string + */ + protected $name_long = "ARK: Survival Evolved"; + + /** + * query_port = client_port + 19238 + * 27015 = 7777 + 19238 + * + * @type int + */ + protected $port_diff = 19238; +} diff --git a/gameq/src/GameQ/Protocols/Arma3.php b/gameq/src/GameQ/Protocols/Arma3.php new file mode 100644 index 0000000..a272be8 --- /dev/null +++ b/gameq/src/GameQ/Protocols/Arma3.php @@ -0,0 +1,176 @@ +. + */ + +namespace GameQ\Protocols; + +use GameQ\Buffer; +use GameQ\Result; + +/** + * Class Armed Assault 3 + * + * Rules protocol reference: https://community.bistudio.com/wiki/Arma_3_ServerBrowserProtocol2 + * + * @package GameQ\Protocols + * @author Austin Bischoff + * @author Memphis017 + */ +class Arma3 extends Source +{ + /** + * Defines the names for the specific game DLCs + * + * @var array + */ + protected $dlcNames = [ + 'Karts', + 'Marksmen', + 'Helicopters', + 'Apex', + 'Jets', + 'Laws of War', + 'Tac-Ops', + 'Tanks', + ]; + + /** + * String name of this protocol class + * + * @type string + */ + protected $name = 'arma3'; + + /** + * Longer string name of this protocol class + * + * @type string + */ + protected $name_long = "Arma3"; + + /** + * Query port = client_port + 1 + * + * @type int + */ + protected $port_diff = 1; + + /** + * Process the rules since Arma3 changed their response for rules + * + * @param Buffer $buffer + * + * @return array + * @throws \GameQ\Exception\Protocol + */ + protected function processRules(Buffer $buffer) + { + // Total number of packets, burn it + $buffer->readInt16(); + + // Will hold the data string + $data = ''; + + // Loop until we run out of strings + while ($buffer->getLength()) { + // Burn the delimiters (i.e. \x01\x04\x00) + $buffer->readString(); + + // Add the data to the string, we are reassembling it + $data .= $buffer->readString(); + } + + // Restore escaped sequences + $data = str_replace(["\x01\x01", "\x01\x02", "\x01\x03"], ["\x01", "\x00", "\xFF"], $data); + + // Make a new buffer with the reassembled data + $responseBuffer = new Buffer($data); + + // Kill the old buffer, should be empty + unset($buffer, $data); + + // Set the result to a new result instance + $result = new Result(); + + // Get results + $result->add('rules_protocol_version', $responseBuffer->readInt8()); + $result->add('overflow', $responseBuffer->readInt8()); + $dlcBit = decbin($responseBuffer->readInt8()); // Grab DLC bit 1 and use it later + $dlcBit2 = decbin($responseBuffer->readInt8()); // Grab DLC bit 2 and use it later + $dlcCount = substr_count($dlcBit, '1') + substr_count($dlcBit2, '1'); // Count the DLCs + // Grab difficulty so we can man handle it... + $difficulty = $responseBuffer->readInt8(); + + // Process difficulty + $result->add('3rd_person', $difficulty >> 7); + $result->add('advanced_flight_mode', ($difficulty >> 6) & 1); + $result->add('difficulty_ai', ($difficulty >> 3) & 3); + $result->add('difficulty_level', $difficulty & 3); + + unset($difficulty); + + // Crosshair + $result->add('crosshair', $responseBuffer->readInt8()); + + // Loop over the DLC bit so we can pull in the infor for the DLC (if enabled) + for ($x = 0; $x < $dlcCount; $x++) { + $result->addSub('dlcs', 'name', $this->dlcNames[$x]); + $result->addSub('dlcs', 'hash', dechex($responseBuffer->readInt32())); + } + + // No longer needed + unset($dlcBit, $dlcBit2, $dlcCount); + + // Grab the mod count + $modCount = $responseBuffer->readInt8(); + + // Add mod count + $result->add('mod_count', $modCount); + + // Loop the mod count and add them + for ($x = 0; $x < $modCount; $x++) { + // Add the mod to the list + $result->addSub('mods', 'hash', dechex($responseBuffer->readInt32())); + $result->addSub('mods', 'steam_id', hexdec($responseBuffer->readPascalString(0, true))); + $result->addSub('mods', 'name', $responseBuffer->readPascalString(0, true)); + } + + unset($modCount, $x); + + // Burn the signatures count, we will just loop until we run out of strings + $responseBuffer->read(); + + // Make signatures array + $signatures = []; + + // Loop until we run out of strings + while ($responseBuffer->getLength()) { + //$result->addSub('signatures', 0, $responseBuffer->readPascalString(0, true)); + $signatures[] = $responseBuffer->readPascalString(0, true); + } + + // Add as a simple array + $result->add('signatures', $signatures); + + // Add signatures count + $result->add('signature_count', count($signatures)); + + unset($responseBuffer, $signatures); + + return $result->fetch(); + } +} diff --git a/gameq/src/GameQ/Protocols/Armedassault2oa.php b/gameq/src/GameQ/Protocols/Armedassault2oa.php new file mode 100644 index 0000000..e527a38 --- /dev/null +++ b/gameq/src/GameQ/Protocols/Armedassault2oa.php @@ -0,0 +1,50 @@ +. + */ + +namespace GameQ\Protocols; + +/** + * Class Armedassault2oa + * + * @package GameQ\Protocols + * @author Austin Bischoff + */ +class Armedassault2oa extends Source +{ + + /** + * String name of this protocol class + * + * @type string + */ + protected $name = "armedassault2oa"; + + /** + * Longer string name of this protocol class + * + * @type string + */ + protected $name_long = "Armed Assault 2: Operation Arrowhead"; + + /** + * Query port = client_port + 1 + * + * @type int + */ + protected $port_diff = 1; +} diff --git a/gameq/src/GameQ/Protocols/Armedassault3.php b/gameq/src/GameQ/Protocols/Armedassault3.php new file mode 100644 index 0000000..5bbca42 --- /dev/null +++ b/gameq/src/GameQ/Protocols/Armedassault3.php @@ -0,0 +1,32 @@ +. + */ + +namespace GameQ\Protocols; + +/** + * Armed assault 3 dummy Protocol Class + * + * Added for backward compatibility, please update to class arma3 + * + * @deprecated v3.0.10 + * @package GameQ\Protocols + * @author Austin Bischoff + */ +class Armedassault3 extends Arma3 +{ +} diff --git a/gameq/src/GameQ/Protocols/Ase.php b/gameq/src/GameQ/Protocols/Ase.php new file mode 100644 index 0000000..cb5c6a4 --- /dev/null +++ b/gameq/src/GameQ/Protocols/Ase.php @@ -0,0 +1,208 @@ +. + */ + +namespace GameQ\Protocols; + +use GameQ\Protocol; +use GameQ\Buffer; +use GameQ\Result; + +/** + * All-Seeing Eye Protocol class + * + * @author Marcel Bößendörfer + * @author Austin Bischoff + */ +class Ase extends Protocol +{ + + /** + * Array of packets we want to look up. + * Each key should correspond to a defined method in this or a parent class + * + * @type array + */ + protected $packets = [ + self::PACKET_ALL => "s", + ]; + + /** + * The query protocol used to make the call + * + * @type string + */ + protected $protocol = 'ase'; + + /** + * String name of this protocol class + * + * @type string + */ + protected $name = 'ase'; + + /** + * Longer string name of this protocol class + * + * @type string + */ + protected $name_long = "All-Seeing Eye"; + + /** + * The client join link + * + * @type string + */ + protected $join_link = null; + + /** + * Normalize settings for this protocol + * + * @type array + */ + protected $normalize = [ + // General + 'general' => [ + // target => source + 'dedicated' => 'dedicated', + 'gametype' => 'gametype', + 'hostname' => 'servername', + 'mapname' => 'map', + 'maxplayers' => 'max_players', + 'mod' => 'game_dir', + 'numplayers' => 'num_players', + 'password' => 'password', + ], + // Individual + 'player' => [ + 'name' => 'name', + 'score' => 'score', + 'team' => 'team', + 'ping' => 'ping', + 'time' => 'time', + ], + ]; + + /** + * Process the response + * + * @return array + * @throws \GameQ\Exception\Protocol + */ + public function processResponse() + { + + // Create a new buffer + $buffer = new Buffer(implode('', $this->packets_response)); + + // Burn the header + $buffer->skip(4); + + // Create a new result + $result = new Result(); + + // Variables + $result->add('gamename', $buffer->readPascalString(1, true)); + $result->add('port', $buffer->readPascalString(1, true)); + $result->add('servername', $buffer->readPascalString(1, true)); + $result->add('gametype', $buffer->readPascalString(1, true)); + $result->add('map', $buffer->readPascalString(1, true)); + $result->add('version', $buffer->readPascalString(1, true)); + $result->add('password', $buffer->readPascalString(1, true)); + $result->add('num_players', $buffer->readPascalString(1, true)); + $result->add('max_players', $buffer->readPascalString(1, true)); + $result->add('dedicated', 1); + + // Offload the key/value pair processing + $this->processKeyValuePairs($buffer, $result); + + // Offload processing player and team info + $this->processPlayersAndTeams($buffer, $result); + + unset($buffer); + + return $result->fetch(); + } + + /* + * Internal methods + */ + + /** + * Handles processing the extra key/value pairs for server settings + * + * @param \GameQ\Buffer $buffer + * @param \GameQ\Result $result + */ + protected function processKeyValuePairs(Buffer &$buffer, Result &$result) + { + + // Key / value pairs + while ($buffer->getLength()) { + $key = $buffer->readPascalString(1, true); + + // If we have an empty key, we've reached the end + if (empty($key)) { + break; + } + + // Otherwise, add the pair + $result->add( + $key, + $buffer->readPascalString(1, true) + ); + } + + unset($key); + } + + /** + * Handles processing the player and team data into a usable format + * + * @param \GameQ\Buffer $buffer + * @param \GameQ\Result $result + */ + protected function processPlayersAndTeams(Buffer &$buffer, Result &$result) + { + + // Players and team info + while ($buffer->getLength()) { + // Get the flags + $flags = $buffer->readInt8(); + + // Get data according to the flags + if ($flags & 1) { + $result->addPlayer('name', $buffer->readPascalString(1, true)); + } + if ($flags & 2) { + $result->addPlayer('team', $buffer->readPascalString(1, true)); + } + if ($flags & 4) { + $result->addPlayer('skin', $buffer->readPascalString(1, true)); + } + if ($flags & 8) { + $result->addPlayer('score', $buffer->readPascalString(1, true)); + } + if ($flags & 16) { + $result->addPlayer('ping', $buffer->readPascalString(1, true)); + } + if ($flags & 32) { + $result->addPlayer('time', $buffer->readPascalString(1, true)); + } + } + } +} diff --git a/gameq/src/GameQ/Protocols/Batt1944.php b/gameq/src/GameQ/Protocols/Batt1944.php new file mode 100644 index 0000000..f0ff38e --- /dev/null +++ b/gameq/src/GameQ/Protocols/Batt1944.php @@ -0,0 +1,68 @@ +. + */ + +namespace GameQ\Protocols; + +/** + * Class Battalion 1944 + * + * @package GameQ\Protocols + * @author TacTicToe66 + */ +class Batt1944 extends Source +{ + + /** + * String name of this protocol class + * + * @type string + */ + protected $name = 'batt1944'; + + /** + * Longer string name of this protocol class + * + * @type string + */ + protected $name_long = "Battalion 1944"; + + /** + * query_port = client_port + 3 + * + * @type int + */ + protected $port_diff = 3; + + /** + * Normalize main fields + * + * @var array + */ + protected $normalize = [ + // General + 'general' => [ + // target => source + 'gametype' => 'bat_gamemode_s', + 'hostname' => 'bat_name_s', + 'mapname' => 'bat_map_s', + 'maxplayers' => 'bat_max_players_i', + 'numplayers' => 'bat_player_count_s', + 'password' => 'bat_has_password_s', + ], + ]; +} diff --git a/gameq/src/GameQ/Protocols/Bf1942.php b/gameq/src/GameQ/Protocols/Bf1942.php new file mode 100644 index 0000000..4cf06c5 --- /dev/null +++ b/gameq/src/GameQ/Protocols/Bf1942.php @@ -0,0 +1,88 @@ +. + */ + +namespace GameQ\Protocols; + +/** + * Class Battlefield 1942 + * + * @package GameQ\Protocols + * @author Austin Bischoff + */ +class Bf1942 extends Gamespy +{ + + /** + * String name of this protocol class + * + * @type string + */ + protected $name = 'bf1942'; + + /** + * Longer string name of this protocol class + * + * @type string + */ + protected $name_long = "Battlefield 1942"; + + /** + * query_port = client_port + 8433 + * 23000 = 14567 + 8433 + * + * @type int + */ + protected $port_diff = 8433; + + /** + * The client join link + * + * @type string + */ + protected $join_link = "bf1942://%s:%d"; + + /** + * Normalize settings for this protocol + * + * @type array + */ + protected $normalize = [ + // General + 'general' => [ + // target => source + 'dedicated' => 'dedicated', + 'gametype' => 'gametype', + 'hostname' => 'hostname', + 'mapname' => 'mapname', + 'maxplayers' => 'maxplayers', + 'numplayers' => 'numplayers', + 'password' => 'password', + ], + // Individual + 'player' => [ + 'name' => 'playername', + 'kills' => 'kills', + 'deaths' => 'deaths', + 'ping' => 'ping', + 'score' => 'score', + ], + 'team' => [ + 'name' => 'teamname', + ], + ]; +} diff --git a/gameq/src/GameQ/Protocols/Bf2.php b/gameq/src/GameQ/Protocols/Bf2.php new file mode 100644 index 0000000..0610f9d --- /dev/null +++ b/gameq/src/GameQ/Protocols/Bf2.php @@ -0,0 +1,98 @@ +. + */ + +namespace GameQ\Protocols; + +/** + * Class Battlefield 2 + * + * @package GameQ\Protocols + * @author Austin Bischoff + */ +class Bf2 extends Gamespy3 +{ + + /** + * String name of this protocol class + * + * @type string + */ + protected $name = 'bf2'; + + /** + * Longer string name of this protocol class + * + * @type string + */ + protected $name_long = "Battlefield 2"; + + /** + * query_port = client_port + 8433 + * 29900 = 16567 + 13333 + * + * @type int + */ + protected $port_diff = 13333; + + /** + * The client join link + * + * @type string + */ + protected $join_link = "bf2://%s:%d"; + + /** + * BF2 has a different query packet to send than "normal" Gamespy 3 + * + * @var array + */ + protected $packets = [ + self::PACKET_ALL => "\xFE\xFD\x00\x10\x20\x30\x40\xFF\xFF\xFF\x01", + ]; + + /** + * Normalize settings for this protocol + * + * @type array + */ + protected $normalize = [ + // General + 'general' => [ + // target => source + 'dedicated' => 'dedicated', + 'gametype' => 'gametype', + 'hostname' => 'hostname', + 'mapname' => 'mapname', + 'maxplayers' => 'maxplayers', + 'numplayers' => 'numplayers', + 'password' => 'password', + ], + // Individual + 'player' => [ + 'name' => 'player', + 'kills' => 'score', + 'deaths' => 'deaths', + 'ping' => 'ping', + 'score' => 'score', + ], + 'team' => [ + 'name' => 'team', + 'score' => 'score', + ], + ]; +} diff --git a/gameq/src/GameQ/Protocols/Bf3.php b/gameq/src/GameQ/Protocols/Bf3.php new file mode 100644 index 0000000..9084515 --- /dev/null +++ b/gameq/src/GameQ/Protocols/Bf3.php @@ -0,0 +1,348 @@ +. + */ + +namespace GameQ\Protocols; + +use GameQ\Protocol; +use GameQ\Buffer; +use GameQ\Result; +use GameQ\Exception\Protocol as Exception; + +/** + * Battlefield 3 Protocol Class + * + * Good place for doc status and info is http://www.fpsadmin.com/forum/showthread.php?t=24134 + * + * @package GameQ\Protocols + * @author Austin Bischoff + */ +class Bf3 extends Protocol +{ + + /** + * Array of packets we want to query. + * + * @type array + */ + protected $packets = [ + self::PACKET_STATUS => "\x00\x00\x00\x21\x1b\x00\x00\x00\x01\x00\x00\x00\x0a\x00\x00\x00serverInfo\x00", + self::PACKET_VERSION => "\x00\x00\x00\x22\x18\x00\x00\x00\x01\x00\x00\x00\x07\x00\x00\x00version\x00", + self::PACKET_PLAYERS => + "\x00\x00\x00\x23\x24\x00\x00\x00\x02\x00\x00\x00\x0b\x00\x00\x00listPlayers\x00\x03\x00\x00\x00\x61ll\x00", + ]; + + /** + * Use the response flag to figure out what method to run + * + * @type array + */ + protected $responses = [ + 1627389952 => "processDetails", // a + 1644167168 => "processVersion", // b + 1660944384 => "processPlayers", // c + ]; + + /** + * The transport mode for this protocol is TCP + * + * @type string + */ + protected $transport = self::TRANSPORT_TCP; + + /** + * The query protocol used to make the call + * + * @type string + */ + protected $protocol = 'bf3'; + + /** + * String name of this protocol class + * + * @type string + */ + protected $name = 'bf3'; + + /** + * Longer string name of this protocol class + * + * @type string + */ + protected $name_long = "Battlefield 3"; + + /** + * The client join link + * + * @type string + */ + protected $join_link = null; + + /** + * query_port = client_port + 22000 + * 47200 = 25200 + 22000 + * + * @type int + */ + protected $port_diff = 22000; + + /** + * Normalize settings for this protocol + * + * @type array + */ + protected $normalize = [ + // General + 'general' => [ + // target => source + 'dedicated' => 'dedicated', + 'hostname' => 'hostname', + 'mapname' => 'map', + 'maxplayers' => 'max_players', + 'numplayers' => 'num_players', + 'password' => 'password', + ], + 'player' => [ + 'name' => 'name', + 'score' => 'score', + 'ping' => 'ping', + ], + 'team' => [ + 'score' => 'tickets', + ], + ]; + + /** + * Process the response for the StarMade server + * + * @return array + * @throws \GameQ\Exception\Protocol + */ + public function processResponse() + { + + // Holds the results sent back + $results = []; + + // Holds the processed packets after having been reassembled + $processed = []; + + // Start up the index for the processed + $sequence_id_last = 0; + + foreach ($this->packets_response as $packet) { + // Create a new buffer + $buffer = new Buffer($packet); + + // Each "good" packet begins with sequence_id (32-bit) + $sequence_id = $buffer->readInt32(); + + // Sequence id is a response + if (array_key_exists($sequence_id, $this->responses)) { + $processed[$sequence_id] = $buffer->getBuffer(); + $sequence_id_last = $sequence_id; + } else { + // This is a continuation of the previous packet, reset the buffer and append + $buffer->jumpto(0); + + // Append + $processed[$sequence_id_last] .= $buffer->getBuffer(); + } + } + + unset($buffer, $sequence_id_last, $sequence_id); + + // Iterate over the combined packets and do some work + foreach ($processed as $sequence_id => $data) { + // Create a new buffer + $buffer = new Buffer($data); + + // Get the length of the packet + $packetLength = $buffer->getLength(); + + // Check to make sure the expected length matches the real length + // Subtract 4 for the sequence_id pulled out earlier + if ($packetLength != ($buffer->readInt32() - 4)) { + throw new Exception(__METHOD__ . " packet length does not match expected length!"); + } + + // Now we need to call the proper method + $results = array_merge( + $results, + call_user_func_array([$this, $this->responses[$sequence_id]], [$buffer]) + ); + } + + return $results; + } + + /* + * Internal Methods + */ + + /** + * Decode the buffer into a usable format + * + * @param \GameQ\Buffer $buffer + * + * @return array + */ + protected function decode(Buffer $buffer) + { + + $items = []; + + // Get the number of words in this buffer + $itemCount = $buffer->readInt32(); + + // Loop over the number of items + for ($i = 0; $i < $itemCount; $i++) { + // Length of the string + $buffer->readInt32(); + + // Just read the string + $items[$i] = $buffer->readString(); + } + + return $items; + } + + /** + * Process the server details + * + * @param \GameQ\Buffer $buffer + * + * @return array + */ + protected function processDetails(Buffer $buffer) + { + + // Decode into items + $items = $this->decode($buffer); + + // Set the result to a new result instance + $result = new Result(); + + // Server is always dedicated + $result->add('dedicated', 1); + + // These are the same no matter what mode the server is in + $result->add('hostname', $items[1]); + $result->add('num_players', (int)$items[2]); + $result->add('max_players', (int)$items[3]); + $result->add('gametype', $items[4]); + $result->add('map', $items[5]); + $result->add('roundsplayed', (int)$items[6]); + $result->add('roundstotal', (int)$items[7]); + $result->add('num_teams', (int)$items[8]); + + // Set the current index + $index_current = 9; + + // Pull the team count + $teamCount = $result->get('num_teams'); + + // Loop for the number of teams found, increment along the way + for ($id = 1; $id <= $teamCount; $id++, $index_current++) { + // Shows the tickets + $result->addTeam('tickets', $items[$index_current]); + // We add an id so we know which team this is + $result->addTeam('id', $id); + } + + // Get and set the rest of the data points. + $result->add('targetscore', (int)$items[$index_current]); + $result->add('online', 1); // Forced true, it seems $words[$index_current + 1] is always empty + $result->add('ranked', (int)$items[$index_current + 2]); + $result->add('punkbuster', (int)$items[$index_current + 3]); + $result->add('password', (int)$items[$index_current + 4]); + $result->add('uptime', (int)$items[$index_current + 5]); + $result->add('roundtime', (int)$items[$index_current + 6]); + // Added in R9 + $result->add('ip_port', $items[$index_current + 7]); + $result->add('punkbuster_version', $items[$index_current + 8]); + $result->add('join_queue', (int)$items[$index_current + 9]); + $result->add('region', $items[$index_current + 10]); + $result->add('pingsite', $items[$index_current + 11]); + $result->add('country', $items[$index_current + 12]); + // Added in R29, No docs as of yet + $result->add('quickmatch', (int)$items[$index_current + 13]); // Guessed from research + + unset($items, $index_current, $teamCount, $buffer); + + return $result->fetch(); + } + + /** + * Process the server version + * + * @param \GameQ\Buffer $buffer + * + * @return array + */ + protected function processVersion(Buffer $buffer) + { + + // Decode into items + $items = $this->decode($buffer); + + // Set the result to a new result instance + $result = new Result(); + + $result->add('version', $items[2]); + + unset($buffer, $items); + + return $result->fetch(); + } + + /** + * Process the players + * + * @param \GameQ\Buffer $buffer + * + * @return array + */ + protected function processPlayers(Buffer $buffer) + { + + // Decode into items + $items = $this->decode($buffer); + + // Set the result to a new result instance + $result = new Result(); + + // Number of data points per player + $numTags = $items[1]; + + // Grab the tags for each player + $tags = array_slice($items, 2, $numTags); + + // Get the player count + $playerCount = $items[$numTags + 2]; + + // Iterate over the index until we run out of players + for ($i = 0, $x = $numTags + 3; $i < $playerCount; $i++, $x += $numTags) { + // Loop over the player tags and extract the info for that tag + foreach ($tags as $index => $tag) { + $result->addPlayer($tag, $items[($x + $index)]); + } + } + + return $result->fetch(); + } +} diff --git a/gameq/src/GameQ/Protocols/Bf4.php b/gameq/src/GameQ/Protocols/Bf4.php new file mode 100644 index 0000000..6951752 --- /dev/null +++ b/gameq/src/GameQ/Protocols/Bf4.php @@ -0,0 +1,114 @@ +. + */ + +namespace GameQ\Protocols; + +use GameQ\Buffer; +use GameQ\Result; + +/** + * Battlefield 4 Protocol class + * + * Good place for doc status and info is http://battlelog.battlefield.com/bf4/forum/view/2955064768683911198/ + * + * @package GameQ\Protocols + * @author Austin Bischoff + */ +class Bf4 extends Bf3 +{ + + /** + * String name of this protocol class + * + * @type string + */ + protected $name = 'bf4'; + + /** + * Longer string name of this protocol class + * + * @type string + */ + protected $name_long = "Battlefield 4"; + + /** + * Handle processing details since they are different than BF3 + * + * @param \GameQ\Buffer $buffer + * + * @return array + */ + protected function processDetails(Buffer $buffer) + { + + // Decode into items + $items = $this->decode($buffer); + + // Set the result to a new result instance + $result = new Result(); + + // Server is always dedicated + $result->add('dedicated', 1); + + // These are the same no matter what mode the server is in + $result->add('hostname', $items[1]); + $result->add('num_players', (int) $items[2]); + $result->add('max_players', (int) $items[3]); + $result->add('gametype', $items[4]); + $result->add('map', $items[5]); + $result->add('roundsplayed', (int) $items[6]); + $result->add('roundstotal', (int) $items[7]); + $result->add('num_teams', (int) $items[8]); + + // Set the current index + $index_current = 9; + + // Pull the team count + $teamCount = $result->get('num_teams'); + + // Loop for the number of teams found, increment along the way + for ($id = 1; $id <= $teamCount; $id++, $index_current++) { + // Shows the tickets + $result->addTeam('tickets', $items[$index_current]); + // We add an id so we know which team this is + $result->addTeam('id', $id); + } + + // Get and set the rest of the data points. + $result->add('targetscore', (int) $items[$index_current]); + $result->add('online', 1); // Forced true, it seems $words[$index_current + 1] is always empty + $result->add('ranked', (int) $items[$index_current + 2]); + $result->add('punkbuster', (int) $items[$index_current + 3]); + $result->add('password', (int) $items[$index_current + 4]); + $result->add('uptime', (int) $items[$index_current + 5]); + $result->add('roundtime', (int) $items[$index_current + 6]); + $result->add('ip_port', $items[$index_current + 7]); + $result->add('punkbuster_version', $items[$index_current + 8]); + $result->add('join_queue', (int) $items[$index_current + 9]); + $result->add('region', $items[$index_current + 10]); + $result->add('pingsite', $items[$index_current + 11]); + $result->add('country', $items[$index_current + 12]); + //$result->add('quickmatch', (int) $items[$index_current + 13]); Supposed to be here according to R42 but is not + $result->add('blaze_player_count', (int) $items[$index_current + 13]); + $result->add('blaze_game_state', (int) $items[$index_current + 14]); + + unset($items, $index_current, $teamCount, $buffer); + + return $result->fetch(); + } +} diff --git a/gameq/src/GameQ/Protocols/Bfbc2.php b/gameq/src/GameQ/Protocols/Bfbc2.php new file mode 100644 index 0000000..b7167a0 --- /dev/null +++ b/gameq/src/GameQ/Protocols/Bfbc2.php @@ -0,0 +1,326 @@ +. + */ + +namespace GameQ\Protocols; + +use GameQ\Protocol; +use GameQ\Buffer; +use GameQ\Result; +use GameQ\Exception\Protocol as Exception; + +/** + * Battlefield Bad Company 2 Protocol Class + * + * NOTE: There are no qualifiers to the response packets sent back from the server as to which response packet + * belongs to which query request. For now this class assumes the responses are in the same order as the order in + * which the packets were sent to the server. If this assumption turns out to be wrong there is easy way to tell which + * response belongs to which query. Hopefully this assumption will hold true as it has in my testing. + * + * @package GameQ\Protocols + * @author Austin Bischoff + */ +class Bfbc2 extends Protocol +{ + + /** + * Array of packets we want to query. + * + * @type array + */ + protected $packets = [ + self::PACKET_VERSION => "\x00\x00\x00\x00\x18\x00\x00\x00\x01\x00\x00\x00\x07\x00\x00\x00version\x00", + self::PACKET_STATUS => "\x00\x00\x00\x00\x1b\x00\x00\x00\x01\x00\x00\x00\x0a\x00\x00\x00serverInfo\x00", + self::PACKET_PLAYERS => "\x00\x00\x00\x00\x24\x00\x00\x00\x02\x00\x00\x00\x0b\x00\x00\x00listPlayers\x00\x03\x00\x00\x00\x61ll\x00", + ]; + + /** + * Use the response flag to figure out what method to run + * + * @type array + */ + protected $responses = [ + "processVersion", + "processDetails", + "processPlayers", + ]; + + /** + * The transport mode for this protocol is TCP + * + * @type string + */ + protected $transport = self::TRANSPORT_TCP; + + /** + * The query protocol used to make the call + * + * @type string + */ + protected $protocol = 'bfbc2'; + + /** + * String name of this protocol class + * + * @type string + */ + protected $name = 'bfbc2'; + + /** + * Longer string name of this protocol class + * + * @type string + */ + protected $name_long = "Battlefield Bad Company 2"; + + /** + * The client join link + * + * @type string + */ + protected $join_link = null; + + /** + * query_port = client_port + 29321 + * 48888 = 19567 + 29321 + * + * @type int + */ + protected $port_diff = 29321; + + /** + * Normalize settings for this protocol + * + * @type array + */ + protected $normalize = [ + // General + 'general' => [ + // target => source + 'dedicated' => 'dedicated', + 'hostname' => 'hostname', + 'mapname' => 'map', + 'maxplayers' => 'max_players', + 'numplayers' => 'num_players', + 'password' => 'password', + ], + 'player' => [ + 'name' => 'name', + 'score' => 'score', + 'ping' => 'ping', + ], + 'team' => [ + 'score' => 'tickets', + ], + ]; + + /** + * Process the response for the StarMade server + * + * @return array + * @throws \GameQ\Exception\Protocol + */ + public function processResponse() + { + + //print_r($this->packets_response); + + // Holds the results sent back + $results = []; + + // Iterate over the response packets + // @todo: This protocol has no packet ordering, ids or anyway to identify which packet coming back belongs to which initial call. + foreach ($this->packets_response as $i => $packet) { + // Create a new buffer + $buffer = new Buffer($packet); + + // Burn first 4 bytes, same across all packets + $buffer->skip(4); + + // Get the packet length + $packetLength = $buffer->getLength(); + + // Check to make sure the expected length matches the real length + // Subtract 4 for the header burn + if ($packetLength != ($buffer->readInt32() - 4)) { + throw new Exception(__METHOD__ . " packet length does not match expected length!"); + } + + // We assume the packets are coming back in the same order as sent, this maybe incorrect... + $results = array_merge( + $results, + call_user_func_array([$this, $this->responses[$i]], [$buffer]) + ); + } + + unset($buffer, $packetLength); + + return $results; + } + + /* + * Internal Methods + */ + + /** + * Decode the buffer into a usable format + * + * @param \GameQ\Buffer $buffer + * + * @return array + */ + protected function decode(Buffer $buffer) + { + + $items = []; + + // Get the number of words in this buffer + $itemCount = $buffer->readInt32(); + + // Loop over the number of items + for ($i = 0; $i < $itemCount; $i++) { + // Length of the string + $buffer->readInt32(); + + // Just read the string + $items[$i] = $buffer->readString(); + } + + return $items; + } + + /** + * Process the server details + * + * @param \GameQ\Buffer $buffer + * + * @return array + */ + protected function processDetails(Buffer $buffer) + { + + // Decode into items + $items = $this->decode($buffer); + + // Set the result to a new result instance + $result = new Result(); + + // Server is always dedicated + $result->add('dedicated', 1); + + // These are the same no matter what mode the server is in + $result->add('hostname', $items[1]); + $result->add('num_players', (int)$items[2]); + $result->add('max_players', (int)$items[3]); + $result->add('gametype', $items[4]); + $result->add('map', $items[5]); + $result->add('roundsplayed', (int)$items[6]); + $result->add('roundstotal', (int)$items[7]); + $result->add('num_teams', (int)$items[8]); + + // Set the current index + $index_current = 9; + + // Pull the team count + $teamCount = $result->get('num_teams'); + + // Loop for the number of teams found, increment along the way + for ($id = 1; $id <= $teamCount; $id++, $index_current++) { + // Shows the tickets + $result->addTeam('tickets', $items[$index_current]); + // We add an id so we know which team this is + $result->addTeam('id', $id); + } + + // Get and set the rest of the data points. + $result->add('targetscore', (int)$items[$index_current]); + $result->add('online', 1); // Forced true, shows accepting players + $result->add('ranked', (($items[$index_current + 2] == 'true') ? 1 : 0)); + $result->add('punkbuster', (($items[$index_current + 3] == 'true') ? 1 : 0)); + $result->add('password', (($items[$index_current + 4] == 'true') ? 1 : 0)); + $result->add('uptime', (int)$items[$index_current + 5]); + $result->add('roundtime', (int)$items[$index_current + 6]); + $result->add('mod', $items[$index_current + 7]); + + $result->add('ip_port', $items[$index_current + 9]); + $result->add('punkbuster_version', $items[$index_current + 10]); + $result->add('join_queue', (($items[$index_current + 11] == 'true') ? 1 : 0)); + $result->add('region', $items[$index_current + 12]); + + unset($items, $index_current, $teamCount, $buffer); + + return $result->fetch(); + } + + /** + * Process the server version + * + * @param \GameQ\Buffer $buffer + * + * @return array + */ + protected function processVersion(Buffer $buffer) + { + // Decode into items + $items = $this->decode($buffer); + + // Set the result to a new result instance + $result = new Result(); + + $result->add('version', $items[2]); + + unset($buffer, $items); + + return $result->fetch(); + } + + /** + * Process the players + * + * @param \GameQ\Buffer $buffer + * + * @return array + */ + protected function processPlayers(Buffer $buffer) + { + + // Decode into items + $items = $this->decode($buffer); + + // Set the result to a new result instance + $result = new Result(); + + // Number of data points per player + $numTags = $items[1]; + + // Grab the tags for each player + $tags = array_slice($items, 2, $numTags); + + // Get the player count + $playerCount = $items[$numTags + 2]; + + // Iterate over the index until we run out of players + for ($i = 0, $x = $numTags + 3; $i < $playerCount; $i++, $x += $numTags) { + // Loop over the player tags and extract the info for that tag + foreach ($tags as $index => $tag) { + $result->addPlayer($tag, $items[($x + $index)]); + } + } + + return $result->fetch(); + } +} diff --git a/gameq/src/GameQ/Protocols/Bfh.php b/gameq/src/GameQ/Protocols/Bfh.php new file mode 100644 index 0000000..067d77f --- /dev/null +++ b/gameq/src/GameQ/Protocols/Bfh.php @@ -0,0 +1,43 @@ +. + */ + +namespace GameQ\Protocols; + +/** + * Battlefield Hardline Protocol class + * + * @package GameQ\Protocols + * @author Austin Bischoff + */ +class Bfh extends Bf4 +{ + + /** + * String name of this protocol class + * + * @type string + */ + protected $name = 'bfh'; + + /** + * Longer string name of this protocol class + * + * @type string + */ + protected $name_long = "Battlefield Hardline"; +} diff --git a/gameq/src/GameQ/Protocols/Cod2.php b/gameq/src/GameQ/Protocols/Cod2.php new file mode 100644 index 0000000..79be7ca --- /dev/null +++ b/gameq/src/GameQ/Protocols/Cod2.php @@ -0,0 +1,42 @@ +. + */ + +namespace GameQ\Protocols; + +/** + * Call of Duty 2 Protocol Class + * + * @package GameQ\Protocols + * @author Austin Bischoff + */ +class Cod2 extends Quake3 +{ + /** + * String name of this protocol class + * + * @type string + */ + protected $name = 'cod2'; + + /** + * Longer string name of this protocol class + * + * @type string + */ + protected $name_long = "Call of Duty 2"; +} diff --git a/gameq/src/GameQ/Protocols/Cod4.php b/gameq/src/GameQ/Protocols/Cod4.php new file mode 100644 index 0000000..9838d9c --- /dev/null +++ b/gameq/src/GameQ/Protocols/Cod4.php @@ -0,0 +1,42 @@ +. + */ + +namespace GameQ\Protocols; + +/** + * Call of Duty 4 Protocol Class + * + * @package GameQ\Protocols + * @author Austin Bischoff + */ +class Cod4 extends Quake3 +{ + /** + * String name of this protocol class + * + * @type string + */ + protected $name = 'cod4'; + + /** + * Longer string name of this protocol class + * + * @type string + */ + protected $name_long = "Call of Duty 4"; +} diff --git a/gameq/src/GameQ/Protocols/Codmw3.php b/gameq/src/GameQ/Protocols/Codmw3.php new file mode 100644 index 0000000..1049b60 --- /dev/null +++ b/gameq/src/GameQ/Protocols/Codmw3.php @@ -0,0 +1,50 @@ +. + */ + +namespace GameQ\Protocols; + +/** + * Class Codmw3 + * + * @package GameQ\Protocols + * @author Austin Bischoff + */ +class Codmw3 extends Source +{ + + /** + * String name of this protocol class + * + * @type string + */ + protected $name = 'codmw3'; + + /** + * Longer string name of this protocol class + * + * @type string + */ + protected $name_long = "Call of Duty: Modern Warfare 3"; + + /** + * query_port = client_port + 2 + * + * @type int + */ + protected $port_diff = 2; +} diff --git a/gameq/src/GameQ/Protocols/Conanexiles.php b/gameq/src/GameQ/Protocols/Conanexiles.php new file mode 100644 index 0000000..a097e1d --- /dev/null +++ b/gameq/src/GameQ/Protocols/Conanexiles.php @@ -0,0 +1,42 @@ +. + */ + +namespace GameQ\Protocols; + +/** + * Class Conanexiles + * + * @package GameQ\Protocols + * @author Austin Bischoff + */ +class Conanexiles extends Source +{ + /** + * String name of this protocol class + * + * @type string + */ + protected $name = 'conanexiles'; + + /** + * Longer string name of this protocol class + * + * @type string + */ + protected $name_long = "Conan Exiles"; +} diff --git a/gameq/src/GameQ/Protocols/Crysiswars.php b/gameq/src/GameQ/Protocols/Crysiswars.php new file mode 100644 index 0000000..44dcdcf --- /dev/null +++ b/gameq/src/GameQ/Protocols/Crysiswars.php @@ -0,0 +1,43 @@ +. + */ + +namespace GameQ\Protocols; + +/** + * Class Crysiswars + * + * @package GameQ\Protocols + * + * @author Austin Bischoff + */ +class Crysiswars extends Gamespy3 +{ + /** + * String name of this protocol class + * + * @type string + */ + protected $name = 'crysiswars'; + + /** + * Longer string name of this protocol class + * + * @type string + */ + protected $name_long = "Crysis Wars"; +} diff --git a/gameq/src/GameQ/Protocols/Cs15.php b/gameq/src/GameQ/Protocols/Cs15.php new file mode 100644 index 0000000..ba37524 --- /dev/null +++ b/gameq/src/GameQ/Protocols/Cs15.php @@ -0,0 +1,45 @@ +. + */ + +namespace GameQ\Protocols; + +/** + * Counter-Strike 1.5 Protocol Class + * + * @author Nikolay Ipanyuk + * @author Austin Bischoff + * + * @package GameQ\Protocols + */ +class Cs15 extends Won +{ + + /** + * String name of this protocol class + * + * @type string + */ + protected $name = 'cs15'; + + /** + * Longer string name of this protocol class + * + * @type string + */ + protected $name_long = "Counter-Strike 1.5"; +} diff --git a/gameq/src/GameQ/Protocols/Cs16.php b/gameq/src/GameQ/Protocols/Cs16.php new file mode 100644 index 0000000..25a6602 --- /dev/null +++ b/gameq/src/GameQ/Protocols/Cs16.php @@ -0,0 +1,69 @@ +. + */ + +namespace GameQ\Protocols; + +/** + * Class Cs16 + * + * @package GameQ\Protocols + * @author Austin Bischoff + */ +class Cs16 extends Source +{ + + /** + * String name of this protocol class + * + * @type string + */ + protected $name = 'cs16'; + + /** + * Longer string name of this protocol class + * + * @type string + */ + protected $name_long = "Counter-Strike 1.6"; + + /** + * In the case of cs 1.6 we offload split packets here because the split packet response for rules is in + * the old gold source format + * + * @param $packet_id + * @param array $packets + * + * @return string + * @throws \GameQ\Exception\Protocol + */ + protected function processPackets($packet_id, array $packets = []) + { + + // The response is gold source if the packets are split + $this->source_engine = self::GOLDSOURCE_ENGINE; + + // Offload to the parent + $packs = parent::processPackets($packet_id, $packets); + + // Reset the engine + $this->source_engine = self::SOURCE_ENGINE; + + // Return the result + return $packs; + } +} diff --git a/gameq/src/GameQ/Protocols/Cscz.php b/gameq/src/GameQ/Protocols/Cscz.php new file mode 100644 index 0000000..b539128 --- /dev/null +++ b/gameq/src/GameQ/Protocols/Cscz.php @@ -0,0 +1,45 @@ +. + */ + +namespace GameQ\Protocols; + +/** + * Class Cscz + * + * Based off of CS 1.6 + * + * @package GameQ\Protocols + * @author Austin Bischoff + */ +class Cscz extends Cs16 +{ + + /** + * String name of this protocol class + * + * @type string + */ + protected $name = 'cscz'; + + /** + * Longer string name of this protocol class + * + * @type string + */ + protected $name_long = "Counter-Strike: Condition Zero"; +} diff --git a/gameq/src/GameQ/Protocols/Csgo.php b/gameq/src/GameQ/Protocols/Csgo.php new file mode 100644 index 0000000..41af735 --- /dev/null +++ b/gameq/src/GameQ/Protocols/Csgo.php @@ -0,0 +1,43 @@ +. + */ + +namespace GameQ\Protocols; + +/** + * Class Csgo + * + * @package GameQ\Protocols + * @author Austin Bischoff + */ +class Csgo extends Source +{ + + /** + * String name of this protocol class + * + * @type string + */ + protected $name = 'csgo'; + + /** + * Longer string name of this protocol class + * + * @type string + */ + protected $name_long = "Counter-Strike: Global Offensive"; +} diff --git a/gameq/src/GameQ/Protocols/Css.php b/gameq/src/GameQ/Protocols/Css.php new file mode 100644 index 0000000..be75da3 --- /dev/null +++ b/gameq/src/GameQ/Protocols/Css.php @@ -0,0 +1,42 @@ +. + */ + +namespace GameQ\Protocols; + +/** + * Class Css + * + * @package GameQ\Protocols + * @author Austin Bischoff + */ +class Css extends Source +{ + /** + * String name of this protocol class + * + * @type string + */ + protected $name = 'css'; + + /** + * Longer string name of this protocol class + * + * @type string + */ + protected $name_long = "Counter-Strike: Source"; +} diff --git a/gameq/src/GameQ/Protocols/Dayz.php b/gameq/src/GameQ/Protocols/Dayz.php new file mode 100644 index 0000000..521eb58 --- /dev/null +++ b/gameq/src/GameQ/Protocols/Dayz.php @@ -0,0 +1,68 @@ +. + */ + +namespace GameQ\Protocols; + +/** + * Class Dayz + * + * @package GameQ\Protocols + * @author Austin Bischoff + */ +class Dayz extends Source +{ + + /** + * String name of this protocol class + * + * @type string + */ + protected $name = 'dayz'; + + /** + * Longer string name of this protocol class + * + * @type string + */ + protected $name_long = "DayZ Standalone"; + + /** + * Overload the math used to guess at the Query Port + * + * @param int $clientPort + * + * @return int + */ + public function findQueryPort($clientPort) + { + + + /* + * Port layout: + * 2302 - 27016 + * 2402 - 27017 + * 2502 - 27018 + * 2602 - 27019 + * 2702 - 27020 + * ... + */ + +/* return 27016 + (($clientPort - 2302) / 100);*/ + return 27016 + (($clientPort - 7218) / 100); + } +} diff --git a/gameq/src/GameQ/Protocols/Dayzmod.php b/gameq/src/GameQ/Protocols/Dayzmod.php new file mode 100644 index 0000000..2ce1076 --- /dev/null +++ b/gameq/src/GameQ/Protocols/Dayzmod.php @@ -0,0 +1,44 @@ +. + */ + +namespace GameQ\Protocols; + +/** + * Class Dayzmod + * + * @package GameQ\Protocols + * @author Marcel Bößendörfer + * @author Austin Bischoff + */ +class Dayzmod extends Armedassault2oa +{ + + /** + * String name of this protocol class + * + * @type string + */ + protected $name = 'dayzmod'; + + /** + * Longer string name of this protocol class + * + * @type string + */ + protected $name_long = "DayZ Mod"; +} diff --git a/gameq/src/GameQ/Protocols/Dod.php b/gameq/src/GameQ/Protocols/Dod.php new file mode 100644 index 0000000..0c7baf6 --- /dev/null +++ b/gameq/src/GameQ/Protocols/Dod.php @@ -0,0 +1,45 @@ +. + */ + +namespace GameQ\Protocols; + +/** + * Class Dod + * + * Based off of CS 1.6 + * + * @package GameQ\Protocols + * @author Austin Bischoff + */ +class Dod extends Cs16 +{ + + /** + * String name of this protocol class + * + * @type string + */ + protected $name = 'dod'; + + /** + * Longer string name of this protocol class + * + * @type string + */ + protected $name_long = "Day of Defeat"; +} diff --git a/gameq/src/GameQ/Protocols/Dods.php b/gameq/src/GameQ/Protocols/Dods.php new file mode 100644 index 0000000..898d75b --- /dev/null +++ b/gameq/src/GameQ/Protocols/Dods.php @@ -0,0 +1,42 @@ +. + */ + +namespace GameQ\Protocols; + +/** + * Class Dods + * + * @package GameQ\Protocols + * @author Austin Bischoff + */ +class Dods extends Source +{ + /** + * String name of this protocol class + * + * @type string + */ + protected $name = 'dods'; + + /** + * Longer string name of this protocol class + * + * @type string + */ + protected $name_long = "Day of Defeat: Source"; +} diff --git a/gameq/src/GameQ/Protocols/Dow.php b/gameq/src/GameQ/Protocols/Dow.php new file mode 100644 index 0000000..b66512a --- /dev/null +++ b/gameq/src/GameQ/Protocols/Dow.php @@ -0,0 +1,69 @@ +. + */ + +namespace GameQ\Protocols; + +use GameQ\Buffer; + +/** + * Class Dow + * + * Apparently the player response is incomplete as there is no information being returned for that packet + * + * @package GameQ\Protocols + * @author Austin Bischoff + */ +class Dow extends Source +{ + /** + * String name of this protocol class + * + * @type string + */ + protected $name = 'dow'; + + /** + * Longer string name of this protocol class + * + * @type string + */ + protected $name_long = "Days of War"; + + /** + * Normalize main fields + * + * @var array + */ + protected $normalize = [ + // General + 'general' => [ + // target => source + 'gametype' => 'G_s', + 'hostname' => 'ONM_s', + 'mapname' => 'MPN_s', + 'maxplayers' => 'P_i', + 'numplayers' => 'N_i', + ], + // Individual + 'player' => [ + 'name' => 'name', + 'score' => 'score', + 'time' => 'time', + ], + ]; +} diff --git a/gameq/src/GameQ/Protocols/Eco.php b/gameq/src/GameQ/Protocols/Eco.php new file mode 100644 index 0000000..a2292e9 --- /dev/null +++ b/gameq/src/GameQ/Protocols/Eco.php @@ -0,0 +1,123 @@ +. + */ + +namespace GameQ\Protocols; + +use GameQ\Exception\Protocol as Exception; +use GameQ\Result; + +/** + * ECO Global Survival Protocol Class + * + * @author Austin Bischoff + */ +class Eco extends Http +{ + /** + * Packets to send + * + * @var array + */ + protected $packets = [ + self::PACKET_STATUS => "GET /frontpage HTTP/1.0\r\nAccept: */*\r\n\r\n", + ]; + + /** + * Http protocol is SSL + * + * @var string + */ + protected $transport = self::TRANSPORT_TCP; + + /** + * The protocol being used + * + * @var string + */ + protected $protocol = 'eco'; + + /** + * String name of this protocol class + * + * @var string + */ + protected $name = 'eco'; + + /** + * Longer string name of this protocol class + * + * @var string + */ + protected $name_long = "ECO Global Survival"; + + /** + * query_port = client_port + 1 + * + * @type int + */ + protected $port_diff = 1; + + /** + * Normalize some items + * + * @var array + */ + protected $normalize = [ + // General + 'general' => [ + // target => source + 'dedicated' => 'dedicated', + 'hostname' => 'description', + 'maxplayers' => 'totalplayers', + 'numplayers' => 'onlineplayers', + 'password' => 'haspassword', + ], + ]; + + /** + * Process the response + * + * @return array + * @throws Exception + */ + public function processResponse() + { + if (empty($this->packets_response)) { + return []; + } + + // Implode and rip out the JSON + preg_match('/\{(.*)\}/ms', implode('', $this->packets_response), $matches); + + // Return should be JSON, let's validate + if (!isset($matches[0]) || ($json = json_decode($matches[0])) === null) { + throw new Exception("JSON response from Eco server is invalid."); + } + + $result = new Result(); + + // Server is always dedicated + $result->add('dedicated', 1); + + foreach ($json->Info as $info => $setting) { + $result->add(strtolower($info), $setting); + } + + return $result->fetch(); + } +} diff --git a/gameq/src/GameQ/Protocols/Egs.php b/gameq/src/GameQ/Protocols/Egs.php new file mode 100644 index 0000000..4f82aa8 --- /dev/null +++ b/gameq/src/GameQ/Protocols/Egs.php @@ -0,0 +1,51 @@ +. + */ + +namespace GameQ\Protocols; + +/** + * Class Empyrion - Galactic Survival + * + * @package GameQ\Protocols + * @author Austin Bischoff + * @author TacTicToe66 + */ +class EgS extends Source +{ + + /** + * String name of this protocol class + * + * @type string + */ + protected $name = 'egs'; + + /** + * Longer string name of this protocol class + * + * @type string + */ + protected $name_long = "Empyrion - Galactic Survival"; + + /** + * query_port = client_port + 1 + * + * @type int + */ + protected $port_diff = 1; +} diff --git a/gameq/src/GameQ/Protocols/Etqw.php b/gameq/src/GameQ/Protocols/Etqw.php new file mode 100644 index 0000000..1f3a446 --- /dev/null +++ b/gameq/src/GameQ/Protocols/Etqw.php @@ -0,0 +1,234 @@ +. + */ + +namespace GameQ\Protocols; + +use GameQ\Buffer; +use GameQ\Exception\Protocol as Exception; +use GameQ\Protocol; +use GameQ\Result; + +/** + * Enemy Territory Quake Wars Protocol Class + * + * @author Austin Bischoff + */ +class Etqw extends Protocol +{ + + /** + * Array of packets we want to look up. + * Each key should correspond to a defined method in this or a parent class + * + * @type array + */ + protected $packets = [ + self::PACKET_STATUS => "\xFF\xFFgetInfoEx\x00\x00\x00\x00", + //self::PACKET_STATUS => "\xFF\xFFgetInfo\x00\x00\x00\x00\x00", + ]; + + /** + * Use the response flag to figure out what method to run + * + * @type array + */ + protected $responses = [ + "\xFF\xFFinfoExResponse" => "processStatus", + ]; + + /** + * The query protocol used to make the call + * + * @type string + */ + protected $protocol = 'etqw'; + + /** + * String name of this protocol class + * + * @type string + */ + protected $name = 'etqw'; + + /** + * Longer string name of this protocol class + * + * @type string + */ + protected $name_long = "Enemy Territory Quake Wars"; + + /** + * Normalize settings for this protocol + * + * @type array + */ + protected $normalize = [ + // General + 'general' => [ + // target => source + 'gametype' => 'campaign', + 'hostname' => 'name', + 'mapname' => 'map', + 'maxplayers' => 'maxPlayers', + 'mod' => 'gamename', + 'numplayers' => 'numplayers', + 'password' => 'privateClients', + ], + // Individual + 'player' => [ + 'name' => 'name', + 'score' => 'score', + 'time' => 'time', + ], + ]; + + /** + * Process the response + * + * @return array + * @throws \GameQ\Exception\Protocol + */ + public function processResponse() + { + // In case it comes back as multiple packets (it shouldn't) + $buffer = new Buffer(implode('', $this->packets_response)); + + // Figure out what packet response this is for + $response_type = $buffer->readString(); + + // Figure out which packet response this is + if (!array_key_exists($response_type, $this->responses)) { + throw new Exception(__METHOD__ . " response type '{$response_type}' is not valid"); + } + + // Offload the call + $results = call_user_func_array([$this, $this->responses[$response_type]], [$buffer]); + + return $results; + } + + /* + * Internal methods + */ + + /** + * Handle processing the status response + * + * @param Buffer $buffer + * + * @return array + */ + protected function processStatus(Buffer $buffer) + { + // Set the result to a new result instance + $result = new Result(); + + // Defaults + $result->add('dedicated', 1); + + // Now burn the challenge, version and size + $buffer->skip(16); + + // Key / value pairs + while ($buffer->getLength()) { + $var = str_replace('si_', '', $buffer->readString()); + $val = $buffer->readString(); + if (empty($var) && empty($val)) { + break; + } + // Add the server prop + $result->add($var, $val); + } + // Now let's do the basic player info + $this->parsePlayers($buffer, $result); + + // Now grab the rest of the server info + $result->add('osmask', $buffer->readInt32()); + $result->add('ranked', $buffer->readInt8()); + $result->add('timeleft', $buffer->readInt32()); + $result->add('gamestate', $buffer->readInt8()); + $result->add('servertype', $buffer->readInt8()); + + // 0: regular server + if ($result->get('servertype') == 0) { + $result->add('interested_clients', $buffer->readInt8()); + } else { + // 1: tv server + $result->add('connected_clients', $buffer->readInt32()); + $result->add('max_clients', $buffer->readInt32()); + } + + // Now let's parse the extended player info + $this->parsePlayersExtra($buffer, $result); + + unset($buffer); + + return $result->fetch(); + } + + /** + * Parse players out of the status ex response + * + * @param Buffer $buffer + * @param Result $result + */ + protected function parsePlayers(Buffer &$buffer, Result &$result) + { + // By default there are 0 players + $players = 0; + + // Iterate over the players until we run out + while (($id = $buffer->readInt8()) != 32) { + $result->addPlayer('id', $id); + $result->addPlayer('ping', $buffer->readInt16()); + $result->addPlayer('name', $buffer->readString()); + $result->addPlayer('clantag_pos', $buffer->readInt8()); + $result->addPlayer('clantag', $buffer->readString()); + $result->addPlayer('bot', $buffer->readInt8()); + $players++; + } + + // Let's add in the current players as a result + $result->add('numplayers', $players); + + // Free some memory + unset($id); + } + + /** + * Handle parsing extra player data + * + * @param Buffer $buffer + * @param Result $result + */ + protected function parsePlayersExtra(Buffer &$buffer, Result &$result) + { + // Iterate over the extra player info + while (($id = $buffer->readInt8()) != 32) { + $result->addPlayer('total_xp', $buffer->readFloat32()); + $result->addPlayer('teamname', $buffer->readString()); + $result->addPlayer('total_kills', $buffer->readInt32()); + $result->addPlayer('total_deaths', $buffer->readInt32()); + } + + // @todo: Add team stuff + + // Free some memory + unset($id); + } +} diff --git a/gameq/src/GameQ/Protocols/Ffe.php b/gameq/src/GameQ/Protocols/Ffe.php new file mode 100644 index 0000000..c0947bd --- /dev/null +++ b/gameq/src/GameQ/Protocols/Ffe.php @@ -0,0 +1,43 @@ +. + */ + +namespace GameQ\Protocols; + +/** + * Class Ffe - Fortress Forever + * + * @package GameQ\Protocols + * @author Austin Bischoff + */ +class Ffe extends Source +{ + + /** + * String name of this protocol class + * + * @type string + */ + protected $name = 'ffe'; + + /** + * Longer string name of this protocol class + * + * @type string + */ + protected $name_long = "Fortress Forever"; +} diff --git a/gameq/src/GameQ/Protocols/Ffow.php b/gameq/src/GameQ/Protocols/Ffow.php new file mode 100644 index 0000000..00c33d4 --- /dev/null +++ b/gameq/src/GameQ/Protocols/Ffow.php @@ -0,0 +1,243 @@ + "\xFF\xFF\xFF\xFF\x57", + self::PACKET_RULES => "\xFF\xFF\xFF\xFF\x56%s", + self::PACKET_PLAYERS => "\xFF\xFF\xFF\xFF\x55%s", + self::PACKET_INFO => "\xFF\xFF\xFF\xFF\x46\x4C\x53\x51", + ]; + + /** + * Use the response flag to figure out what method to run + * + * @type array + */ + protected $responses = [ + "\xFF\xFF\xFF\xFF\x49\x02" => 'processInfo', // I + "\xFF\xFF\xFF\xFF\x45\x00" => 'processRules', // E + "\xFF\xFF\xFF\xFF\x44\x00" => 'processPlayers', // D + ]; + + /** + * The query protocol used to make the call + * + * @type string + */ + protected $protocol = 'ffow'; + + /** + * String name of this protocol class + * + * @type string + */ + protected $name = 'ffow'; + + /** + * Longer string name of this protocol class + * + * @type string + */ + protected $name_long = "Frontlines Fuel of War"; + + /** + * The client join link + * + * @type string + */ + protected $join_link = null; + + /** + * query_port = client_port + 2 + * + * @type int + */ + protected $port_diff = 2; + + /** + * Normalize settings for this protocol + * + * @type array + */ + protected $normalize = [ + // General + 'general' => [ + // target => source + 'gametype' => 'gamemode', + 'hostname' => 'servername', + 'mapname' => 'mapname', + 'maxplayers' => 'max_players', + 'mod' => 'modname', + 'numplayers' => 'num_players', + 'password' => 'password', + ], + // Individual + 'player' => [ + 'name' => 'name', + 'ping' => 'ping', + 'score' => 'frags', + ], + ]; + + /** + * Parse the challenge response and apply it to all the packet types + * + * @param \GameQ\Buffer $challenge_buffer + * + * @return bool + * @throws \GameQ\Exception\Protocol + */ + public function challengeParseAndApply(Buffer $challenge_buffer) + { + // Burn padding + $challenge_buffer->skip(5); + + // Apply the challenge and return + return $this->challengeApply($challenge_buffer->read(4)); + } + + /** + * Handle response from the server + * + * @return mixed + * @throws Exception + */ + public function processResponse() + { + // Init results + $results = []; + + foreach ($this->packets_response as $response) { + $buffer = new Buffer($response); + + // Figure out what packet response this is for + $response_type = $buffer->read(6); + + // Figure out which packet response this is + if (!array_key_exists($response_type, $this->responses)) { + throw new Exception(__METHOD__ . " response type '" . bin2hex($response_type) . "' is not valid"); + } + + // Now we need to call the proper method + $results = array_merge( + $results, + call_user_func_array([$this, $this->responses[$response_type]], [$buffer]) + ); + + unset($buffer); + } + + return $results; + } + + /** + * Handle processing the server information + * + * @param Buffer $buffer + * + * @return array + */ + protected function processInfo(Buffer $buffer) + { + // Set the result to a new result instance + $result = new Result(); + + $result->add('servername', $buffer->readString()); + $result->add('mapname', $buffer->readString()); + $result->add('modname', $buffer->readString()); + $result->add('gamemode', $buffer->readString()); + $result->add('description', $buffer->readString()); + $result->add('version', $buffer->readString()); + $result->add('port', $buffer->readInt16()); + $result->add('num_players', $buffer->readInt8()); + $result->add('max_players', $buffer->readInt8()); + $result->add('dedicated', $buffer->readInt8()); + $result->add('os', $buffer->readInt8()); + $result->add('password', $buffer->readInt8()); + $result->add('anticheat', $buffer->readInt8()); + $result->add('average_fps', $buffer->readInt8()); + $result->add('round', $buffer->readInt8()); + $result->add('max_rounds', $buffer->readInt8()); + $result->add('time_left', $buffer->readInt16()); + + unset($buffer); + + return $result->fetch(); + } + + /** + * Handle processing the server rules + * + * @param Buffer $buffer + * + * @return array + */ + protected function processRules(Buffer $buffer) + { + // Set the result to a new result instance + $result = new Result(); + + // Burn extra header + $buffer->skip(1); + + // Read rules until we run out of buffer + while ($buffer->getLength()) { + $key = $buffer->readString(); + // Check for map + if (strstr($key, "Map:")) { + $result->addSub("maplist", "name", $buffer->readString()); + } else // Regular rule + { + $result->add($key, $buffer->readString()); + } + } + + unset($buffer); + + return $result->fetch(); + } + + /** + * Handle processing of player data + * + * @todo: Build this out when there is a server with players to test against + * + * @param Buffer $buffer + * + * @return array + */ + protected function processPlayers(Buffer $buffer) + { + // Set the result to a new result instance + $result = new Result(); + + unset($buffer); + + return $result->fetch(); + } +} diff --git a/gameq/src/GameQ/Protocols/Gamespy.php b/gameq/src/GameQ/Protocols/Gamespy.php new file mode 100644 index 0000000..37a951e --- /dev/null +++ b/gameq/src/GameQ/Protocols/Gamespy.php @@ -0,0 +1,178 @@ +. + */ + +namespace GameQ\Protocols; + +use GameQ\Protocol; +use GameQ\Buffer; +use GameQ\Result; +use \GameQ\Exception\Protocol as Exception; + +/** + * GameSpy Protocol class + * + * @author Austin Bischoff + */ +class Gamespy extends Protocol +{ + + /** + * Array of packets we want to look up. + * Each key should correspond to a defined method in this or a parent class + * + * @type array + */ + protected $packets = [ + self::PACKET_STATUS => "\x5C\x73\x74\x61\x74\x75\x73\x5C", + ]; + + /** + * The query protocol used to make the call + * + * @type string + */ + protected $protocol = 'gamespy'; + + /** + * String name of this protocol class + * + * @type string + */ + protected $name = 'gamespy'; + + /** + * Longer string name of this protocol class + * + * @type string + */ + protected $name_long = "GameSpy Server"; + + /** + * The client join link + * + * @type string + */ + protected $join_link = null; + + /** + * Process the response for this protocol + * + * @return array + * @throws Exception + */ + public function processResponse() + { + // Holds the processed packets so we can sort them in case they come in an unordered + $processed = []; + + // Iterate over the packets + foreach ($this->packets_response as $response) { + // Check to see if we had a preg_match error + if (($match = preg_match("#^(.*)\\\\queryid\\\\([^\\\\]+)(\\\\|$)#", $response, $matches)) === false + || $match != 1 + ) { + throw new Exception(__METHOD__ . " An error occurred while parsing the packets for 'queryid'"); + } + + // Multiply so we move the decimal point out of the way, if there is one + $key = (int)(floatval($matches[2]) * 1000); + + // Add this packet to the processed + $processed[$key] = $matches[1]; + } + + // Sort the new array to make sure the keys (query ids) are in the proper order + ksort($processed, SORT_NUMERIC); + + // Create buffer and offload processing + return $this->processStatus(new Buffer(implode('', $processed))); + } + + /* + * Internal methods + */ + + /** + * Handle processing the status buffer + * + * @param Buffer $buffer + * + * @return array + */ + protected function processStatus(Buffer $buffer) + { + // Set the result to a new result instance + $result = new Result(); + + // By default dedicted + $result->add('dedicated', 1); + + // Lets peek and see if the data starts with a \ + if ($buffer->lookAhead(1) == '\\') { + // Burn the first one + $buffer->skip(1); + } + + // Explode the data + $data = explode('\\', $buffer->getBuffer()); + + // No longer needed + unset($buffer); + + // Init some vars + $numPlayers = 0; + $numTeams = 0; + + $itemCount = count($data); + + // Now lets loop the array + for ($x = 0; $x < $itemCount; $x += 2) { + // Set some local vars + $key = $data[$x]; + $val = $data[$x + 1]; + + // Check for _ variable (i.e players) + if (($suffix = strrpos($key, '_')) !== false && is_numeric(substr($key, $suffix + 1))) { + // See if this is a team designation + if (substr($key, 0, $suffix) == 'teamname') { + $result->addTeam('teamname', $val); + $numTeams++; + } else { + // Its a player + if (substr($key, 0, $suffix) == 'playername') { + $numPlayers++; + } + $result->addPlayer(substr($key, 0, $suffix), utf8_encode($val)); + } + } else { + // Regular variable so just add the value. + $result->add($key, $val); + } + } + + // Add the player and team count + $result->add('num_players', $numPlayers); + $result->add('num_teams', $numTeams); + + // Unset some stuff to free up memory + unset($data, $key, $val, $suffix, $x, $itemCount); + + // Return the result + return $result->fetch(); + } +} diff --git a/gameq/src/GameQ/Protocols/Gamespy3.php b/gameq/src/GameQ/Protocols/Gamespy3.php new file mode 100644 index 0000000..ab74206 --- /dev/null +++ b/gameq/src/GameQ/Protocols/Gamespy3.php @@ -0,0 +1,335 @@ +. + */ + +namespace GameQ\Protocols; + +use GameQ\Protocol; +use GameQ\Buffer; +use GameQ\Result; + +/** + * GameSpy3 Protocol class + * + * Given the ability for non utf-8 characters to be used as hostnames, player names, etc... this + * version returns all strings utf-8 encoded (utf8_encode). To access the proper version of a + * string response you must use utf8_decode() on the specific response. + * + * @author Austin Bischoff + */ +class Gamespy3 extends Protocol +{ + + /** + * Array of packets we want to look up. + * Each key should correspond to a defined method in this or a parent class + * + * @type array + */ + protected $packets = [ + self::PACKET_CHALLENGE => "\xFE\xFD\x09\x10\x20\x30\x40", + self::PACKET_ALL => "\xFE\xFD\x00\x10\x20\x30\x40%s\xFF\xFF\xFF\x01", + ]; + + /** + * The query protocol used to make the call + * + * @type string + */ + protected $protocol = 'gamespy3'; + + /** + * String name of this protocol class + * + * @type string + */ + protected $name = 'gamespy3'; + + /** + * Longer string name of this protocol class + * + * @type string + */ + protected $name_long = "GameSpy3 Server"; + + /** + * The client join link + * + * @type string + */ + protected $join_link = null; + + /** + * This defines the split between the server info and player/team info. + * This value can vary by game. This value is the default split. + * + * @var string + */ + protected $packetSplit = "/\\x00\\x00\\x01/m"; + + /** + * Parse the challenge response and apply it to all the packet types + * + * @param \GameQ\Buffer $challenge_buffer + * + * @return bool + * @throws \GameQ\Exception\Protocol + */ + public function challengeParseAndApply(Buffer $challenge_buffer) + { + // Pull out the challenge + $challenge = substr(preg_replace("/[^0-9\-]/si", "", $challenge_buffer->getBuffer()), 1); + + // By default, no challenge result (see #197) + $challenge_result = ''; + + // Check for valid challenge (see #197) + if ($challenge) { + // Encode chellenge result + $challenge_result = sprintf( + "%c%c%c%c", + ($challenge >> 24), + ($challenge >> 16), + ($challenge >> 8), + ($challenge >> 0) + ); + } + + // Apply the challenge and return + return $this->challengeApply($challenge_result); + } + + /** + * Process the response + * + * @return array + */ + public function processResponse() + { + + // Holds the processed packets + $processed = []; + + // Iterate over the packets + foreach ($this->packets_response as $response) { + // Make a buffer + $buffer = new Buffer($response, Buffer::NUMBER_TYPE_BIGENDIAN); + + // Packet type = 0 + $buffer->readInt8(); + + // Session Id + $buffer->readInt32(); + + // We need to burn the splitnum\0 because it is not used + $buffer->skip(9); + + // Get the id + $id = $buffer->readInt8(); + + // Burn next byte not sure what it is used for + $buffer->skip(1); + + // Add this packet to the processed + $processed[$id] = $buffer->getBuffer(); + + unset($buffer, $id); + } + + // Sort packets, reset index + ksort($processed); + + // Offload cleaning up the packets if they happen to be split + $packets = $this->cleanPackets(array_values($processed)); + + // Split the packets by type general and the rest (i.e. players & teams) + $split = preg_split($this->packetSplit, implode('', $packets)); + + // Create a new result + $result = new Result(); + + // Assign variable due to pass by reference in PHP 7+ + $buffer = new Buffer($split[0], Buffer::NUMBER_TYPE_BIGENDIAN); + + // First key should be server details and rules + $this->processDetails($buffer, $result); + + // The rest should be the player and team information, if it exists + if (array_key_exists(1, $split)) { + $buffer = new Buffer($split[1], Buffer::NUMBER_TYPE_BIGENDIAN); + $this->processPlayersAndTeams($buffer, $result); + } + + unset($buffer); + + return $result->fetch(); + } + + /* + * Internal methods + */ + + /** + * Handles cleaning up packets since the responses can be a bit "dirty" + * + * @param array $packets + * + * @return array + */ + protected function cleanPackets(array $packets = []) + { + + // Get the number of packets + $packetCount = count($packets); + + // Compare last var of current packet with first var of next packet + // On a partial match, remove last var from current packet, + // variable header from next packet + for ($i = 0, $x = $packetCount; $i < $x - 1; $i++) { + // First packet + $fst = substr($packets[$i], 0, -1); + // Second packet + $snd = $packets[$i + 1]; + // Get last variable from first packet + $fstvar = substr($fst, strrpos($fst, "\x00") + 1); + // Get first variable from last packet + $snd = substr($snd, strpos($snd, "\x00") + 2); + $sndvar = substr($snd, 0, strpos($snd, "\x00")); + // Check if fstvar is a substring of sndvar + // If so, remove it from the first string + if (!empty($fstvar) && strpos($sndvar, $fstvar) !== false) { + $packets[$i] = preg_replace("#(\\x00[^\\x00]+\\x00)$#", "\x00", $packets[$i]); + } + } + + // Now let's loop the return and remove any dupe prefixes + for ($x = 1; $x < $packetCount; $x++) { + $buffer = new Buffer($packets[$x], Buffer::NUMBER_TYPE_BIGENDIAN); + + $prefix = $buffer->readString(); + + // Check to see if the return before has the same prefix present + if ($prefix != null && strstr($packets[($x - 1)], $prefix)) { + // Update the return by removing the prefix plus 2 chars + $packets[$x] = substr(str_replace($prefix, '', $packets[$x]), 2); + } + + unset($buffer); + } + + unset($x, $i, $snd, $sndvar, $fst, $fstvar); + + // Return cleaned packets + return $packets; + } + + /** + * Handles processing the details data into a usable format + * + * @param \GameQ\Buffer $buffer + * @param \GameQ\Result $result + */ + protected function processDetails(Buffer &$buffer, Result &$result) + { + + // We go until we hit an empty key + while ($buffer->getLength()) { + $key = $buffer->readString(); + if (strlen($key) == 0) { + break; + } + $result->add($key, utf8_encode($buffer->readString())); + } + } + + /** + * Handles processing the player and team data into a usable format + * + * @param \GameQ\Buffer $buffer + * @param \GameQ\Result $result + */ + protected function processPlayersAndTeams(Buffer &$buffer, Result &$result) + { + + /* + * Explode the data into groups. First is player, next is team (item_t) + * Each group should be as follows: + * + * [0] => item_ + * [1] => information for item_ + * ... + */ + $data = explode("\x00\x00", $buffer->getBuffer()); + + // By default item_group is blank, this will be set for each loop thru the data + $item_group = ''; + // By default the item_type is blank, this will be set on each loop + $item_type = ''; + // Loop through all of the $data for information and pull it out into the result + for ($x = 0; $x < count($data) - 1; $x++) { + // Pull out the item + $item = $data[$x]; + // If this is an empty item, move on + if ($item == '' || $item == "\x00") { + continue; + } + /* + * Left as reference: + * + * Each block of player_ and team_t have preceding junk chars + * + * player_ is actually \x01player_ + * team_t is actually \x00\x02team_t + * + * Probably a by-product of the change to exploding the data from the original. + * + * For now we just strip out these characters + */ + // Check to see if $item has a _ at the end, this is player info + if (substr($item, -1) == '_') { + // Set the item group + $item_group = 'players'; + // Set the item type, rip off any trailing stuff and bad chars + $item_type = rtrim(str_replace("\x01", '', $item), '_'); + } elseif (substr($item, -2) == '_t') { + // Check to see if $item has a _t at the end, this is team info + // Set the item group + $item_group = 'teams'; + // Set the item type, rip off any trailing stuff and bad chars + $item_type = rtrim(str_replace(["\x00", "\x02"], '', $item), '_t'); + } else { + // We can assume it is data belonging to a previously defined item + + // Make a temp buffer so we have easier access to the data + $buf_temp = new Buffer($item, Buffer::NUMBER_TYPE_BIGENDIAN); + // Get the values + while ($buf_temp->getLength()) { + // No value so break the loop, end of string + if (($val = $buf_temp->readString()) === '') { + break; + } + // Add the value to the proper item in the correct group + $result->addSub($item_group, $item_type, utf8_encode(trim($val))); + } + // Unset our buffer + unset($buf_temp); + } + } + // Free up some memory + unset($data, $item, $item_group, $item_type, $val); + } +} diff --git a/gameq/src/GameQ/Protocols/Gamespy4.php b/gameq/src/GameQ/Protocols/Gamespy4.php new file mode 100644 index 0000000..e28755f --- /dev/null +++ b/gameq/src/GameQ/Protocols/Gamespy4.php @@ -0,0 +1,34 @@ +. + */ + +namespace GameQ\Protocols; + +/** + * GameSpy4 Protocol Class + * + * By all accounts GameSpy 4 seems to be GameSpy 3. + * + * References: + * http://www.deletedscreen.com/?p=951 + * http://pastebin.com/2zZFDuTd + * + * @author Austin Bischoff + */ +class Gamespy4 extends Gamespy3 +{ +} diff --git a/gameq/src/GameQ/Protocols/Gmod.php b/gameq/src/GameQ/Protocols/Gmod.php new file mode 100644 index 0000000..6596724 --- /dev/null +++ b/gameq/src/GameQ/Protocols/Gmod.php @@ -0,0 +1,42 @@ +. + */ + +namespace GameQ\Protocols; + +/** + * Class Gmod + * + * @package GameQ\Protocols + * @author Austin Bischoff + */ +class Gmod extends Source +{ + /** + * String name of this protocol class + * + * @type string + */ + protected $name = 'gmod'; + + /** + * Longer string name of this protocol class + * + * @type string + */ + protected $name_long = "Garry's Mod"; +} diff --git a/gameq/src/GameQ/Protocols/Grav.php b/gameq/src/GameQ/Protocols/Grav.php new file mode 100644 index 0000000..e025075 --- /dev/null +++ b/gameq/src/GameQ/Protocols/Grav.php @@ -0,0 +1,42 @@ +. + */ + +namespace GameQ\Protocols; + +/** + * Grav Online Protocol Class + * + * @package GameQ\Protocols + * @author Austin Bischoff + */ +class Grav extends Source +{ + /** + * String name of this protocol class + * + * @type string + */ + protected $name = 'grav'; + + /** + * Longer string name of this protocol class + * + * @type string + */ + protected $name_long = "GRAV Online"; +} diff --git a/gameq/src/GameQ/Protocols/Gta5m.php b/gameq/src/GameQ/Protocols/Gta5m.php new file mode 100644 index 0000000..0f0c50a --- /dev/null +++ b/gameq/src/GameQ/Protocols/Gta5m.php @@ -0,0 +1,173 @@ +. + */ + +namespace GameQ\Protocols; + +use GameQ\Buffer; +use GameQ\Exception\Protocol as Exception; +use GameQ\Protocol; +use GameQ\Result; + +/** + * GTA Five M Protocol Class + * + * Server base can be found at https://fivem.net/ + * + * Based on code found at https://github.com/LiquidObsidian/fivereborn-query + * + * @author Austin Bischoff + */ +class Gta5m extends Protocol +{ + + /** + * Array of packets we want to look up. + * Each key should correspond to a defined method in this or a parent class + * + * @type array + */ + protected $packets = [ + self::PACKET_STATUS => "\xFF\xFF\xFF\xFFgetinfo xxx", + ]; + + /** + * Use the response flag to figure out what method to run + * + * @type array + */ + protected $responses = [ + "\xFF\xFF\xFF\xFFinfoResponse" => "processStatus", + ]; + + /** + * The query protocol used to make the call + * + * @type string + */ + protected $protocol = 'gta5m'; + + /** + * String name of this protocol class + * + * @type string + */ + protected $name = 'gta5m'; + + /** + * Longer string name of this protocol class + * + * @type string + */ + protected $name_long = "GTA Five M"; + + /** + * Normalize settings for this protocol + * + * @type array + */ + protected $normalize = [ + // General + 'general' => [ + // target => source + 'gametype' => 'gametype', + 'hostname' => 'hostname', + 'mapname' => 'mapname', + 'maxplayers' => 'sv_maxclients', + 'mod' => 'gamename', + 'numplayers' => 'clients', + 'password' => 'privateClients', + ], + ]; + + /** + * Process the response + * + * @return array + * @throws \GameQ\Exception\Protocol + */ + public function processResponse() + { + // In case it comes back as multiple packets (it shouldn't) + $buffer = new Buffer(implode('', $this->packets_response)); + + // Figure out what packet response this is for + $response_type = $buffer->readString(PHP_EOL); + + // Figure out which packet response this is + if (empty($response_type) || !array_key_exists($response_type, $this->responses)) { + throw new Exception(__METHOD__ . " response type '{$response_type}' is not valid"); + } + + // Offload the call + $results = call_user_func_array([$this, $this->responses[$response_type]], [$buffer]); + + return $results; + } + + /* + * Internal methods + */ + + /** + * Handle processing the status response + * + * @param Buffer $buffer + * + * @return array + */ + protected function processStatus(Buffer $buffer) + { + // Set the result to a new result instance + $result = new Result(); + + // Lets peek and see if the data starts with a \ + if ($buffer->lookAhead(1) == '\\') { + // Burn the first one + $buffer->skip(1); + } + + // Explode the data + $data = explode('\\', $buffer->getBuffer()); + + // No longer needed + unset($buffer); + + $itemCount = count($data); + + // Now lets loop the array + for ($x = 0; $x < $itemCount; $x += 2) { + // Set some local vars + $key = $data[$x]; + $val = $data[$x + 1]; + + if (in_array($key, ['challenge'])) { + continue; // skip + } + + // Regular variable so just add the value. + $result->add($key, $val); + } + + /*var_dump($data); + var_dump($result->fetch()); + + exit;*/ + + return $result->fetch(); + } +} diff --git a/gameq/src/GameQ/Protocols/Gtan.php b/gameq/src/GameQ/Protocols/Gtan.php new file mode 100644 index 0000000..f7b531e --- /dev/null +++ b/gameq/src/GameQ/Protocols/Gtan.php @@ -0,0 +1,163 @@ +. + */ +namespace GameQ\Protocols; + +use GameQ\Exception\Protocol as Exception; +use GameQ\Result; +use GameQ\Server; + +/** + * Grand Theft Auto Network Protocol Class + * https://stats.gtanet.work/ + * + * Result from this call should be a header + JSON response + * + * References: + * - https://master.gtanet.work/apiservers + * + * @author Austin Bischoff + */ +class Gtan extends Http +{ + /** + * Packets to send + * + * @var array + */ + protected $packets = [ + //self::PACKET_STATUS => "GET /apiservers HTTP/1.0\r\nHost: master.gtanet.work\r\nAccept: */*\r\n\r\n", + self::PACKET_STATUS => "GET /gtan/api.php?ip=%s&raw HTTP/1.0\r\nHost: multiplayerhosting.info\r\nAccept: */*\r\n\r\n", + ]; + + /** + * Http protocol is SSL + * + * @var string + */ + protected $transport = self::TRANSPORT_SSL; + + /** + * The protocol being used + * + * @var string + */ + protected $protocol = 'gtan'; + + /** + * String name of this protocol class + * + * @var string + */ + protected $name = 'gtan'; + + /** + * Longer string name of this protocol class + * + * @var string + */ + protected $name_long = "Grand Theft Auto Network"; + + /** + * Holds the real ip so we can overwrite it back + * + * @var string + */ + protected $realIp = null; + + protected $realPortQuery = null; + + /** + * Normalize some items + * + * @var array + */ + protected $normalize = [ + // General + 'general' => [ + // target => source + 'dedicated' => 'dedicated', + 'hostname' => 'hostname', + 'mapname' => 'map', + 'mod' => 'mod', + 'maxplayers' => 'maxplayers', + 'numplayers' => 'numplayers', + 'password' => 'password', + ], + ]; + + public function beforeSend(Server $server) + { + // Loop over the packets and update them + foreach ($this->packets as $packetType => $packet) { + // Fill out the packet with the server info + $this->packets[$packetType] = sprintf($packet, $server->ip . ':' . $server->port_query); + } + + $this->realIp = $server->ip; + $this->realPortQuery = $server->port_query; + + // Override the existing settings + //$server->ip = 'master.gtanet.work'; + $server->ip = 'multiplayerhosting.info'; + $server->port_query = 443; + } + + /** + * Process the response + * + * @return array + * @throws Exception + */ + public function processResponse() + { + // No response, assume offline + if (empty($this->packets_response)) { + return [ + 'gq_address' => $this->realIp, + 'gq_port_query' => $this->realPortQuery, + ]; + } + + // Implode and rip out the JSON + preg_match('/\{(.*)\}/ms', implode('', $this->packets_response), $matches); + + // Return should be JSON, let's validate + if (!isset($matches[0]) || ($json = json_decode($matches[0])) === null) { + throw new Exception("JSON response from Gtan protocol is invalid."); + } + + $result = new Result(); + + // Server is always dedicated + $result->add('dedicated', 1); + + $result->add('gq_address', $this->realIp); + $result->add('gq_port_query', $this->realPortQuery); + + // Add server items + $result->add('hostname', $json->ServerName); + $result->add('serverversion', $json->ServerVersion); + $result->add('map', ((!empty($json->Map)) ? $json->Map : 'Los Santos/Blaine Country')); + $result->add('mod', $json->Gamemode); + $result->add('password', (int)$json->Passworded); + $result->add('numplayers', $json->CurrentPlayers); + $result->add('maxplayers', $json->MaxPlayers); + + return $result->fetch(); + } +} diff --git a/gameq/src/GameQ/Protocols/Hl2dm.php b/gameq/src/GameQ/Protocols/Hl2dm.php new file mode 100644 index 0000000..15f881a --- /dev/null +++ b/gameq/src/GameQ/Protocols/Hl2dm.php @@ -0,0 +1,42 @@ +. + */ + +namespace GameQ\Protocols; + +/** + * Class Hl2dm + * + * @package GameQ\Protocols + * @author Austin Bischoff + */ +class Hl2dm extends Source +{ + /** + * String name of this protocol class + * + * @type string + */ + protected $name = 'hl2dm'; + + /** + * Longer string name of this protocol class + * + * @type string + */ + protected $name_long = "Half Life 2: Deathmatch"; +} diff --git a/gameq/src/GameQ/Protocols/Http.php b/gameq/src/GameQ/Protocols/Http.php new file mode 100644 index 0000000..2a86d8d --- /dev/null +++ b/gameq/src/GameQ/Protocols/Http.php @@ -0,0 +1,67 @@ +. + */ + +namespace GameQ\Protocols; + +use GameQ\Protocol; + +/** + * Class Http + * + * Generic HTTP protocol class. Useful for making http based requests + * + * @package GameQ\Protocols + * @author Austin Bischoff + */ +abstract class Http extends Protocol +{ + /** + * The query protocol used to make the call + * + * @type string + */ + protected $protocol = 'http'; + + /** + * String name of this protocol class + * + * @type string + */ + protected $name = 'http'; + + /** + * Longer string name of this protocol class + * + * @type string + */ + protected $name_long = "Generic HTTP protocol"; + + /** + * Http protocol is TCP + * + * @var string + */ + protected $transport = self::TRANSPORT_TCP; + + /** + * The client join link + * + * @type string + */ + protected $join_link = null; +} diff --git a/gameq/src/GameQ/Protocols/Insurgency.php b/gameq/src/GameQ/Protocols/Insurgency.php new file mode 100644 index 0000000..77b8329 --- /dev/null +++ b/gameq/src/GameQ/Protocols/Insurgency.php @@ -0,0 +1,42 @@ +. + */ + +namespace GameQ\Protocols; + +/** + * Class Insurgency + * + * @package GameQ\Protocols + * @author Austin Bischoff + */ +class Insurgency extends Source +{ + /** + * String name of this protocol class + * + * @type string + */ + protected $name = 'insurgency'; + + /** + * Longer string name of this protocol class + * + * @type string + */ + protected $name_long = "Insurgency"; +} diff --git a/gameq/src/GameQ/Protocols/Jediacademy.php b/gameq/src/GameQ/Protocols/Jediacademy.php new file mode 100644 index 0000000..a051a3a --- /dev/null +++ b/gameq/src/GameQ/Protocols/Jediacademy.php @@ -0,0 +1,42 @@ +. + */ + +namespace GameQ\Protocols; + +/** + * Jedi Academy Protocol Class + * + * @package GameQ\Protocols + * @author Austin Bischoff + */ +class Jediacademy extends Quake3 +{ + /** + * String name of this protocol class + * + * @type string + */ + protected $name = 'jediacademy'; + + /** + * Longer string name of this protocol class + * + * @type string + */ + protected $name_long = "Star Wars Jedi Knight: Jedi Academy"; +} diff --git a/gameq/src/GameQ/Protocols/Jedioutcast.php b/gameq/src/GameQ/Protocols/Jedioutcast.php new file mode 100644 index 0000000..1afd9af --- /dev/null +++ b/gameq/src/GameQ/Protocols/Jedioutcast.php @@ -0,0 +1,42 @@ +. + */ + +namespace GameQ\Protocols; + +/** + * Jedi Outcast Protocol Class + * + * @package GameQ\Protocols + * @author Austin Bischoff + */ +class Jedioutcast extends Quake3 +{ + /** + * String name of this protocol class + * + * @type string + */ + protected $name = 'jedioutcast'; + + /** + * Longer string name of this protocol class + * + * @type string + */ + protected $name_long = "Star Wars Jedi Knight II: Jedi Outcast"; +} diff --git a/gameq/src/GameQ/Protocols/Justcause2.php b/gameq/src/GameQ/Protocols/Justcause2.php new file mode 100644 index 0000000..648cb6d --- /dev/null +++ b/gameq/src/GameQ/Protocols/Justcause2.php @@ -0,0 +1,127 @@ +. + */ + +namespace GameQ\Protocols; + +use GameQ\Buffer; +use GameQ\Result; + +/** + * Just Cause 2 Multiplayer Protocol Class + * + * Special thanks to Woet for some insight on packing + * + * @package GameQ\Protocols + * @author Austin Bischoff + */ +class Justcause2 extends Gamespy4 +{ + /** + * String name of this protocol class + * + * @type string + */ + protected $name = 'justcause2'; + + /** + * Longer string name of this protocol class + * + * @type string + */ + protected $name_long = "Just Cause 2 Multiplayer"; + + /** + * The client join link + * + * @type string + */ + protected $join_link = "steam://connect/%s:%d/"; + + /** + * Change the packets used + * + * @var array + */ + protected $packets = [ + self::PACKET_CHALLENGE => "\xFE\xFD\x09\x10\x20\x30\x40", + self::PACKET_ALL => "\xFE\xFD\x00\x10\x20\x30\x40%s\xFF\xFF\xFF\x02", + ]; + + /** + * Override the packet split + * + * @var string + */ + protected $packetSplit = "/\\x00\\x00\\x00/m"; + + /** + * Normalize settings for this protocol + * + * @type array + */ + protected $normalize = [ + 'general' => [ + // target => source + 'dedicated' => 'dedicated', + 'gametype' => 'gametype', + 'hostname' => 'hostname', + 'mapname' => 'mapname', + 'maxplayers' => 'maxplayers', + 'numplayers' => 'numplayers', + 'password' => 'password', + ], + // Individual + 'player' => [ + 'name' => 'name', + 'ping' => 'ping', + ], + ]; + + /** + * Overload so we can add in some static data points + * + * @param Buffer $buffer + * @param Result $result + */ + protected function processDetails(Buffer &$buffer, Result &$result) + { + parent::processDetails($buffer, $result); + + // Add in map + $result->add('mapname', 'Panau'); + $result->add('dedicated', 'true'); + } + + /** + * Override the parent, this protocol is returned differently + * + * @param Buffer $buffer + * @param Result $result + * + * @see Gamespy3::processPlayersAndTeams() + */ + protected function processPlayersAndTeams(Buffer &$buffer, Result &$result) + { + // Loop until we run out of data + while ($buffer->getLength()) { + $result->addPlayer('name', $buffer->readString()); + $result->addPlayer('steamid', $buffer->readString()); + $result->addPlayer('ping', $buffer->readInt16()); + } + } +} diff --git a/gameq/src/GameQ/Protocols/Justcause3.php b/gameq/src/GameQ/Protocols/Justcause3.php new file mode 100644 index 0000000..c4e901d --- /dev/null +++ b/gameq/src/GameQ/Protocols/Justcause3.php @@ -0,0 +1,50 @@ +. + */ + +namespace GameQ\Protocols; + +/** + * Class Just Cause 3 + * + * @package GameQ\Protocols + * @author Austin Bischoff + */ +class Justcause3 extends Source +{ + + /** + * String name of this protocol class + * + * @type string + */ + protected $name = 'justcause3'; + + /** + * Longer string name of this protocol class + * + * @type string + */ + protected $name_long = "Just Cause 3"; + + /** + * Query port = client_port + 1 + * + * @type int + */ + protected $port_diff = 1; +} diff --git a/gameq/src/GameQ/Protocols/Killingfloor.php b/gameq/src/GameQ/Protocols/Killingfloor.php new file mode 100644 index 0000000..9cc1964 --- /dev/null +++ b/gameq/src/GameQ/Protocols/Killingfloor.php @@ -0,0 +1,96 @@ +. + */ + +namespace GameQ\Protocols; + +use GameQ\Buffer; +use GameQ\Result; + +/** + * Class Killing floor + * + * @package GameQ\Protocols + * @author Austin Bischoff + */ +class Killingfloor extends Unreal2 +{ + + /** + * String name of this protocol class + * + * @type string + */ + protected $name = 'killing floor'; + + /** + * Longer string name of this protocol class + * + * @type string + */ + protected $name_long = "Killing Floor"; + + /** + * query_port = client_port + 1 + * + * @type int + */ + protected $port_diff = 1; + + /** + * The client join link + * + * @type string + */ + protected $join_link = "steam://connect/%s:%d/"; + + /** + * Overload the default detail process since this version is different + * + * @param \GameQ\Buffer $buffer + * + * @return array + */ + protected function processDetails(Buffer $buffer) + { + + // Set the result to a new result instance + $result = new Result(); + + $result->add('serverid', $buffer->readInt32()); // 0 + $result->add('serverip', $buffer->readPascalString(1)); // empty + $result->add('gameport', $buffer->readInt32()); + $result->add('queryport', $buffer->readInt32()); // 0 + + // We burn the first char since it is not always correct with the hostname + $buffer->skip(1); + + // Read as a regular string since the length is incorrect (what we skipped earlier) + $result->add('servername', utf8_encode($buffer->readString())); + + // The rest is read as normal + $result->add('mapname', utf8_encode($buffer->readPascalString(1))); + $result->add('gametype', $buffer->readPascalString(1)); + $result->add('numplayers', $buffer->readInt32()); + $result->add('maxplayers', $buffer->readInt32()); + $result->add('currentwave', $buffer->readInt32()); + + unset($buffer); + + return $result->fetch(); + } +} diff --git a/gameq/src/GameQ/Protocols/Killingfloor2.php b/gameq/src/GameQ/Protocols/Killingfloor2.php new file mode 100644 index 0000000..a134f25 --- /dev/null +++ b/gameq/src/GameQ/Protocols/Killingfloor2.php @@ -0,0 +1,51 @@ +. + */ + +namespace GameQ\Protocols; + +/** + * Class Killing floor + * + * @package GameQ\Protocols + * @author Austin Bischoff + */ +class Killingfloor2 extends Source +{ + + /** + * String name of this protocol class + * + * @type string + */ + protected $name = 'killing floor 2'; + + /** + * Longer string name of this protocol class + * + * @type string + */ + protected $name_long = "Killing Floor 2"; + + /** + * query_port = client_port + 19238 + * 27015 = 7777 + 19238 + * + * @type int + */ + protected $port_diff = 19238; +} diff --git a/gameq/src/GameQ/Protocols/L4d.php b/gameq/src/GameQ/Protocols/L4d.php new file mode 100644 index 0000000..596452a --- /dev/null +++ b/gameq/src/GameQ/Protocols/L4d.php @@ -0,0 +1,42 @@ +. + */ + +namespace GameQ\Protocols; + +/** + * Class L4d + * + * @package GameQ\Protocols + * @author Austin Bischoff + */ +class L4d extends Source +{ + /** + * String name of this protocol class + * + * @type string + */ + protected $name = 'l4d'; + + /** + * Longer string name of this protocol class + * + * @type string + */ + protected $name_long = "Left 4 Dead"; +} diff --git a/gameq/src/GameQ/Protocols/L4d2.php b/gameq/src/GameQ/Protocols/L4d2.php new file mode 100644 index 0000000..475514c --- /dev/null +++ b/gameq/src/GameQ/Protocols/L4d2.php @@ -0,0 +1,42 @@ +. + */ + +namespace GameQ\Protocols; + +/** + * Class L4d2 + * + * @package GameQ\Protocols + * @author Austin Bischoff + */ +class L4d2 extends Source +{ + /** + * String name of this protocol class + * + * @type string + */ + protected $name = 'l4d2'; + + /** + * Longer string name of this protocol class + * + * @type string + */ + protected $name_long = "Left 4 Dead 2"; +} diff --git a/gameq/src/GameQ/Protocols/Lhmp.php b/gameq/src/GameQ/Protocols/Lhmp.php new file mode 100644 index 0000000..3d5e81f --- /dev/null +++ b/gameq/src/GameQ/Protocols/Lhmp.php @@ -0,0 +1,214 @@ +. + */ + +namespace GameQ\Protocols; + +use GameQ\Protocol; +use GameQ\Buffer; +use GameQ\Result; +use GameQ\Exception\Protocol as Exception; + +/** + * Lost Heaven Protocol class + * + * Reference: http://lh-mp.eu/wiki/index.php/Query_System + * + * @author Austin Bischoff + */ +class Lhmp extends Protocol +{ + + /** + * Array of packets we want to look up. + * Each key should correspond to a defined method in this or a parent class + * + * @type array + */ + protected $packets = [ + self::PACKET_DETAILS => "LHMPo", + self::PACKET_PLAYERS => "LHMPp", + ]; + + /** + * Use the response flag to figure out what method to run + * + * @type array + */ + protected $responses = [ + "LHMPo" => "processDetails", + "LHMPp" => "processPlayers", + ]; + + /** + * The query protocol used to make the call + * + * @type string + */ + protected $protocol = 'lhmp'; + + /** + * String name of this protocol class + * + * @type string + */ + protected $name = 'lhmp'; + + /** + * Longer string name of this protocol class + * + * @type string + */ + protected $name_long = "Lost Heaven"; + + /** + * query_port = client_port + 1 + * + * @type int + */ + protected $port_diff = 1; + + /** + * Normalize settings for this protocol + * + * @type array + */ + protected $normalize = [ + // General + 'general' => [ + // target => source + 'gametype' => 'gamemode', + 'hostname' => 'servername', + 'mapname' => 'mapname', + 'maxplayers' => 'maxplayers', + 'numplayers' => 'numplayers', + 'password' => 'password', + ], + // Individual + 'player' => [ + 'name' => 'name', + ], + ]; + + /** + * Process the response + * + * @return array + * @throws \GameQ\Exception\Protocol + */ + public function processResponse() + { + // Will hold the packets after sorting + $packets = []; + + // We need to pre-sort these for split packets so we can do extra work where needed + foreach ($this->packets_response as $response) { + $buffer = new Buffer($response); + + // Pull out the header + $header = $buffer->read(5); + + // Add the packet to the proper section, we will combine later + $packets[$header][] = $buffer->getBuffer(); + } + + unset($buffer); + + $results = []; + + // Now let's iterate and process + foreach ($packets as $header => $packetGroup) { + // Figure out which packet response this is + if (!array_key_exists($header, $this->responses)) { + throw new Exception(__METHOD__ . " response type '{$header}' is not valid"); + } + + // Now we need to call the proper method + $results = array_merge( + $results, + call_user_func_array([$this, $this->responses[$header]], [new Buffer(implode($packetGroup))]) + ); + } + + unset($packets); + + return $results; + } + + /* + * Internal methods + */ + + /** + * Handles processing the details data into a usable format + * + * @param Buffer $buffer + * + * @return array + * @throws Exception + */ + protected function processDetails(Buffer $buffer) + { + + // Set the result to a new result instance + $result = new Result(); + + $result->add('protocol', $buffer->readString()); + $result->add('password', $buffer->readString()); + $result->add('numplayers', $buffer->readInt16()); + $result->add('maxplayers', $buffer->readInt16()); + $result->add('servername', utf8_encode($buffer->readPascalString())); + $result->add('gamemode', $buffer->readPascalString()); + $result->add('website', utf8_encode($buffer->readPascalString())); + $result->add('mapname', utf8_encode($buffer->readPascalString())); + + unset($buffer); + + return $result->fetch(); + } + + /** + * Handles processing the player data into a usable format + * + * @param Buffer $buffer + * + * @return array + */ + protected function processPlayers(Buffer $buffer) + { + + // Set the result to a new result instance + $result = new Result(); + + // Get the number of players + $result->add('numplayers', $buffer->readInt16()); + + // Parse players + while ($buffer->getLength()) { + // Player id + if (($id = $buffer->readInt16()) !== 0) { + // Add the results + $result->addPlayer('id', $id); + $result->addPlayer('name', utf8_encode($buffer->readPascalString())); + } + } + + unset($buffer, $id); + + return $result->fetch(); + } +} diff --git a/gameq/src/GameQ/Protocols/Minecraft.php b/gameq/src/GameQ/Protocols/Minecraft.php new file mode 100644 index 0000000..a895cb8 --- /dev/null +++ b/gameq/src/GameQ/Protocols/Minecraft.php @@ -0,0 +1,87 @@ +. + */ + +namespace GameQ\Protocols; + +/** + * Minecraft Protocol Class + * + * Thanks to https://github.com/xPaw/PHP-Minecraft-Query for helping me realize this is + * Gamespy 3 Protocol. Make sure you enable the items below for it to work. + * + * Information from original author: + * Instructions + * + * Before using this class, you need to make sure that your server is running GS4 status listener. + * + * Look for those settings in server.properties: + * + * enable-query=true + * query.port=25565 + * + * @package GameQ\Protocols + * + * @author Austin Bischoff + */ +class Minecraft extends Gamespy3 +{ + + /** + * String name of this protocol class + * + * @type string + */ + protected $name = 'minecraft'; + + /** + * Longer string name of this protocol class + * + * @type string + */ + protected $name_long = "Minecraft"; + + /** + * The client join link + * + * @type string + */ + protected $join_link = "minecraft://%s:%d/"; + + /** + * Normalize settings for this protocol + * + * @type array + */ + protected $normalize = [ + // General + 'general' => [ + // target => source + 'dedicated' => 'dedicated', + 'gametype' => 'game_id', + 'hostname' => 'hostname', + 'mapname' => 'map', + 'maxplayers' => 'maxplayers', + 'numplayers' => 'numplayers', + 'password' => 'password', + ], + // Individual + 'player' => [ + 'name' => 'player', + ], + ]; +} diff --git a/gameq/src/GameQ/Protocols/Minecraftpe.php b/gameq/src/GameQ/Protocols/Minecraftpe.php new file mode 100644 index 0000000..21d1186 --- /dev/null +++ b/gameq/src/GameQ/Protocols/Minecraftpe.php @@ -0,0 +1,44 @@ +. + */ + +namespace GameQ\Protocols; + +/** + * Minecraft PE (BE) Protocol Class + * + * @package GameQ\Protocols + * + * @author Austin Bischoff + */ +class Minecraftpe extends Minecraft +{ + + /** + * String name of this protocol class + * + * @type string + */ + protected $name = 'minecraftpe'; + + /** + * Longer string name of this protocol class + * + * @type string + */ + protected $name_long = "MinecraftPE"; +} diff --git a/gameq/src/GameQ/Protocols/Mohaa.php b/gameq/src/GameQ/Protocols/Mohaa.php new file mode 100644 index 0000000..d4ebb5a --- /dev/null +++ b/gameq/src/GameQ/Protocols/Mohaa.php @@ -0,0 +1,79 @@ +. + */ + +namespace GameQ\Protocols; + +/** + * Medal of honor: Allied Assault Protocol Class + * + * @package GameQ\Protocols + * @author Bram + * @author Austin Bischoff + */ +class Mohaa extends Gamespy +{ + /** + * String name of this protocol class + * + * @type string + */ + protected $name = 'mohaa'; + + /** + * Longer string name of this protocol class + * + * @type string + */ + protected $name_long = "Medal of honor: Allied Assault"; + + /** + * Normalize settings for this protocol + * + * @type array + */ + protected $normalize = [ + 'general' => [ + // target => source + 'dedicated' => 'dedicated', + 'gametype' => 'gametype', + 'hostname' => 'hostname', + 'mapname' => 'mapname', + 'maxplayers' => 'maxplayers', + 'numplayers' => 'numplayers', + 'password' => 'password', + ], + // Individual + 'player' => [ + 'name' => 'player', + 'score' => 'frags', + 'ping' => 'ping', + ], + ]; + + /** + * Query port is always the client port + 97 in MOHAA + * + * @param int $clientPort + * + * @return int + */ + public function findQueryPort($clientPort) + { + return $clientPort+97; + } +} diff --git a/gameq/src/GameQ/Protocols/Mta.php b/gameq/src/GameQ/Protocols/Mta.php new file mode 100644 index 0000000..b95dc4c --- /dev/null +++ b/gameq/src/GameQ/Protocols/Mta.php @@ -0,0 +1,59 @@ +. + */ + +namespace GameQ\Protocols; + +/** + * Class Multi Theft Auto + * + * @package GameQ\Protocols + * + * @author Marcel Bößendörfer + * @author Austin Bischoff + */ +class Mta extends Ase +{ + + /** + * String name of this protocol class + * + * @type string + */ + protected $name = 'mta'; + + /** + * Longer string name of this protocol class + * + * @type string + */ + protected $name_long = "Multi Theft Auto"; + + /** + * query_port = client_port + 123 + * + * @type int + */ + protected $port_diff = 123; + + /** + * The client join link + * + * @type string + */ + protected $join_link = "mtasa://%s:%d/"; +} diff --git a/gameq/src/GameQ/Protocols/Mumble.php b/gameq/src/GameQ/Protocols/Mumble.php new file mode 100644 index 0000000..299389c --- /dev/null +++ b/gameq/src/GameQ/Protocols/Mumble.php @@ -0,0 +1,194 @@ +. + */ + +namespace GameQ\Protocols; + +use GameQ\Protocol; +use GameQ\Result; +use GameQ\Exception\Protocol as Exception; + +/** + * Mumble Protocol class + * + * References: + * https://github.com/edmundask/MurmurQuery - Thanks to skylord123 + * + * @author Austin Bischoff + */ +class Mumble extends Protocol +{ + + /** + * Array of packets we want to look up. + * Each key should correspond to a defined method in this or a parent class + * + * @type array + */ + protected $packets = [ + self::PACKET_ALL => "\x6A\x73\x6F\x6E", // JSON packet + ]; + + /** + * The transport mode for this protocol is TCP + * + * @type string + */ + protected $transport = self::TRANSPORT_TCP; + + /** + * The query protocol used to make the call + * + * @type string + */ + protected $protocol = 'mumble'; + + /** + * String name of this protocol class + * + * @type string + */ + protected $name = 'mumble'; + + /** + * Longer string name of this protocol class + * + * @type string + */ + protected $name_long = "Mumble Server"; + + /** + * The client join link + * + * @type string + */ + protected $join_link = "mumble://%s:%d/"; + + /** + * 27800 = 64738 - 36938 + * + * @type int + */ + protected $port_diff = -36938; + + /** + * Normalize settings for this protocol + * + * @type array + */ + protected $normalize = [ + // General + 'general' => [ + 'dedicated' => 'dedicated', + 'gametype' => 'gametype', + 'hostname' => 'name', + 'numplayers' => 'numplayers', + 'maxplayers' => 'x_gtmurmur_max_users', + ], + // Player + 'player' => [ + 'name' => 'name', + 'ping' => 'tcpPing', + 'team' => 'channel', + 'time' => 'onlinesecs', + ], + // Team + 'team' => [ + 'name' => 'name', + ], + ]; + + /** + * Process the response + * + * @return array + * @throws \GameQ\Exception\Protocol + */ + public function processResponse() + { + + // Try to json_decode, make it into an array + if (($data = json_decode(implode('', $this->packets_response), true)) === null) { + throw new Exception(__METHOD__ . " Unable to decode JSON data."); + } + + // Set the result to a new result instance + $result = new Result(); + + // Always dedicated + $result->add('dedicated', 1); + + // Let's iterate over the response items, there are a lot + foreach ($data as $key => $value) { + // Ignore root for now, that is where all of the channel/player info is housed + if (in_array($key, ['root'])) { + continue; + } + + // Add them as is + $result->add($key, $value); + } + + // Offload the channel and user parsing + $this->processChannelsAndUsers($data['root'], $result); + + unset($data); + + // Manually set the number of players + $result->add('numplayers', count($result->get('players'))); + + return $result->fetch(); + } + + /* + * Internal methods + */ + + /** + * Handles processing the the channels and user info + * + * @param array $data + * @param \GameQ\Result $result + */ + protected function processChannelsAndUsers(array $data, Result &$result) + { + + // Let's add all of the channel information + foreach ($data as $key => $value) { + // We will handle these later + if (in_array($key, ['channels', 'users'])) { + // skip + continue; + } + + // Add the channel property as a team + $result->addTeam($key, $value); + } + + // Itereate over the users in this channel + foreach ($data['users'] as $user) { + foreach ($user as $key => $value) { + $result->addPlayer($key, $value); + } + } + + // Offload more channels to parse + foreach ($data['channels'] as $channel) { + $this->processChannelsAndUsers($channel, $result); + } + } +} diff --git a/gameq/src/GameQ/Protocols/Ns2.php b/gameq/src/GameQ/Protocols/Ns2.php new file mode 100644 index 0000000..4c32392 --- /dev/null +++ b/gameq/src/GameQ/Protocols/Ns2.php @@ -0,0 +1,49 @@ +. + */ + +namespace GameQ\Protocols; + +/** + * Class Ns2 + * + * @package GameQ\Protocols + * @author Austin Bischoff + */ +class Ns2 extends Source +{ + /** + * String name of this protocol class + * + * @type string + */ + protected $name = 'ns2'; + + /** + * Longer string name of this protocol class + * + * @type string + */ + protected $name_long = "Natural Selection 2"; + + /** + * query_port = client_port + 1 + * + * @type int + */ + protected $port_diff = 1; +} diff --git a/gameq/src/GameQ/Protocols/Projectrealitybf2.php b/gameq/src/GameQ/Protocols/Projectrealitybf2.php new file mode 100644 index 0000000..6f4b5ce --- /dev/null +++ b/gameq/src/GameQ/Protocols/Projectrealitybf2.php @@ -0,0 +1,45 @@ +. + */ + +namespace GameQ\Protocols; + +/** + * Class Projectrealitybf2 + * + * Based off of BF2 + * + * @package GameQ\Protocols + * @author Austin Bischoff + */ +class Projectrealitybf2 extends Bf2 +{ + + /** + * String name of this protocol class + * + * @type string + */ + protected $name = 'projectrealitybf2'; + + /** + * Longer string name of this protocol class + * + * @type string + */ + protected $name_long = "Project Reality: Battlefield 2"; +} diff --git a/gameq/src/GameQ/Protocols/Quake2.php b/gameq/src/GameQ/Protocols/Quake2.php new file mode 100644 index 0000000..f0366c2 --- /dev/null +++ b/gameq/src/GameQ/Protocols/Quake2.php @@ -0,0 +1,219 @@ + "\xFF\xFF\xFF\xFFstatus\x00", + ]; + + /** + * Use the response flag to figure out what method to run + * + * @type array + */ + protected $responses = [ + "\xFF\xFF\xFF\xFF\x70\x72\x69\x6e\x74" => 'processStatus', + ]; + + /** + * The query protocol used to make the call + * + * @type string + */ + protected $protocol = 'quake2'; + + /** + * String name of this protocol class + * + * @type string + */ + protected $name = 'quake2'; + + /** + * Longer string name of this protocol class + * + * @type string + */ + protected $name_long = "Quake 2 Server"; + + /** + * The client join link + * + * @type string + */ + protected $join_link = null; + + /** + * Normalize settings for this protocol + * + * @type array + */ + protected $normalize = [ + // General + 'general' => [ + // target => source + 'gametype' => 'gamename', + 'hostname' => 'hostname', + 'mapname' => 'mapname', + 'maxplayers' => 'maxclients', + 'mod' => 'g_gametype', + 'numplayers' => 'clients', + 'password' => 'password', + ], + // Individual + 'player' => [ + 'name' => 'name', + 'ping' => 'ping', + 'score' => 'frags', + ], + ]; + + /** + * Handle response from the server + * + * @return mixed + * @throws Exception + */ + public function processResponse() + { + // Make a buffer + $buffer = new Buffer(implode('', $this->packets_response)); + + // Grab the header + $header = $buffer->readString("\x0A"); + + // Figure out which packet response this is + if (empty($header) || !array_key_exists($header, $this->responses)) { + throw new Exception(__METHOD__ . " response type '" . bin2hex($header) . "' is not valid"); + } + + return call_user_func_array([$this, $this->responses[$header]], [$buffer]); + } + + /** + * Process the status response + * + * @param Buffer $buffer + * + * @return array + */ + protected function processStatus(Buffer $buffer) + { + // We need to split the data and offload + $results = $this->processServerInfo(new Buffer($buffer->readString("\x0A"))); + + $results = array_merge_recursive( + $results, + $this->processPlayers(new Buffer($buffer->getBuffer())) + ); + + unset($buffer); + + // Return results + return $results; + } + + /** + * Handle processing the server information + * + * @param Buffer $buffer + * + * @return array + */ + protected function processServerInfo(Buffer $buffer) + { + // Set the result to a new result instance + $result = new Result(); + + // Burn leading \ if one exists + $buffer->readString('\\'); + + // Key / value pairs + while ($buffer->getLength()) { + // Add result + $result->add( + trim($buffer->readString('\\')), + utf8_encode(trim($buffer->readStringMulti(['\\', "\x0a"]))) + ); + } + + $result->add('password', 0); + $result->add('mod', 0); + + unset($buffer); + + return $result->fetch(); + } + + /** + * Handle processing of player data + * + * @param Buffer $buffer + * + * @return array + */ + protected function processPlayers(Buffer $buffer) + { + // Some games do not have a number of current players + $playerCount = 0; + + // Set the result to a new result instance + $result = new Result(); + + // Loop until we are out of data + while ($buffer->getLength()) { + // Make a new buffer with this block + $playerInfo = new Buffer($buffer->readString("\x0A")); + + // Add player info + $result->addPlayer('frags', $playerInfo->readString("\x20")); + $result->addPlayer('ping', $playerInfo->readString("\x20")); + + // Skip first " + $playerInfo->skip(1); + + // Add player name, encoded + $result->addPlayer('name', utf8_encode(trim(($playerInfo->readString('"'))))); + + // Skip first " + $playerInfo->skip(2); + + // Add address + $result->addPlayer('address', trim($playerInfo->readString('"'))); + + // Increment + $playerCount++; + + // Clear + unset($playerInfo); + } + + $result->add('clients', $playerCount); + + // Clear + unset($buffer, $playerCount); + + return $result->fetch(); + } +} diff --git a/gameq/src/GameQ/Protocols/Quake3.php b/gameq/src/GameQ/Protocols/Quake3.php new file mode 100644 index 0000000..3ed177b --- /dev/null +++ b/gameq/src/GameQ/Protocols/Quake3.php @@ -0,0 +1,203 @@ + "\xFF\xFF\xFF\xFF\x67\x65\x74\x73\x74\x61\x74\x75\x73\x0A", + ]; + + /** + * Use the response flag to figure out what method to run + * + * @type array + */ + protected $responses = [ + "\xFF\xFF\xFF\xFFstatusResponse" => 'processStatus', + ]; + + /** + * The query protocol used to make the call + * + * @type string + */ + protected $protocol = 'quake3'; + + /** + * String name of this protocol class + * + * @type string + */ + protected $name = 'quake3'; + + /** + * Longer string name of this protocol class + * + * @type string + */ + protected $name_long = "Quake 3 Server"; + + /** + * The client join link + * + * @type string + */ + protected $join_link = null; + + /** + * Normalize settings for this protocol + * + * @type array + */ + protected $normalize = [ + // General + 'general' => [ + // target => source + 'gametype' => 'gamename', + 'hostname' => 'sv_hostname', + 'mapname' => 'mapname', + 'maxplayers' => 'sv_maxclients', + 'mod' => 'g_gametype', + 'numplayers' => 'clients', + 'password' => ['g_needpass', 'pswrd'], + ], + // Individual + 'player' => [ + 'name' => 'name', + 'ping' => 'ping', + 'score' => 'frags', + ], + ]; + + /** + * Handle response from the server + * + * @return mixed + * @throws Exception + */ + public function processResponse() + { + // Make a buffer + $buffer = new Buffer(implode('', $this->packets_response)); + + // Grab the header + $header = $buffer->readString("\x0A"); + + // Figure out which packet response this is + if (empty($header) || !array_key_exists($header, $this->responses)) { + throw new Exception(__METHOD__ . " response type '" . bin2hex($header) . "' is not valid"); + } + + return call_user_func_array([$this, $this->responses[$header]], [$buffer]); + } + + protected function processStatus(Buffer $buffer) + { + // We need to split the data and offload + $results = $this->processServerInfo(new Buffer($buffer->readString("\x0A"))); + + $results = array_merge_recursive( + $results, + $this->processPlayers(new Buffer($buffer->getBuffer())) + ); + + unset($buffer); + + // Return results + return $results; + } + + /** + * Handle processing the server information + * + * @param Buffer $buffer + * + * @return array + */ + protected function processServerInfo(Buffer $buffer) + { + // Set the result to a new result instance + $result = new Result(); + + // Burn leading \ if one exists + $buffer->readString('\\'); + + // Key / value pairs + while ($buffer->getLength()) { + // Add result + $result->add( + trim($buffer->readString('\\')), + utf8_encode(trim($buffer->readStringMulti(['\\', "\x0a"]))) + ); + } + + unset($buffer); + + return $result->fetch(); + } + + /** + * Handle processing of player data + * + * @param Buffer $buffer + * + * @return array + */ + protected function processPlayers(Buffer $buffer) + { + // Some games do not have a number of current players + $playerCount = 0; + + // Set the result to a new result instance + $result = new Result(); + + // Loop until we are out of data + while ($buffer->getLength()) { + // Make a new buffer with this block + $playerInfo = new Buffer($buffer->readString("\x0A")); + + // Add player info + $result->addPlayer('frags', $playerInfo->readString("\x20")); + $result->addPlayer('ping', $playerInfo->readString("\x20")); + + // Skip first " + $playerInfo->skip(1); + + // Add player name, encoded + $result->addPlayer('name', utf8_encode(trim(($playerInfo->readString('"'))))); + + // Increment + $playerCount++; + + // Clear + unset($playerInfo); + } + + $result->add('clients', $playerCount); + + // Clear + unset($buffer, $playerCount); + + return $result->fetch(); + } +} diff --git a/gameq/src/GameQ/Protocols/Quakelive.php b/gameq/src/GameQ/Protocols/Quakelive.php new file mode 100644 index 0000000..d5df350 --- /dev/null +++ b/gameq/src/GameQ/Protocols/Quakelive.php @@ -0,0 +1,42 @@ +. + */ + +namespace GameQ\Protocols; + +/** + * Class Quake Live + * + * @package GameQ\Protocols + * @author Austin Bischoff + */ +class Quakelive extends Source +{ + /** + * String name of this protocol class + * + * @type string + */ + protected $name = 'quakelive'; + + /** + * Longer string name of this protocol class + * + * @type string + */ + protected $name_long = "Quake Live"; +} diff --git a/gameq/src/GameQ/Protocols/Redorchestra2.php b/gameq/src/GameQ/Protocols/Redorchestra2.php new file mode 100644 index 0000000..6733016 --- /dev/null +++ b/gameq/src/GameQ/Protocols/Redorchestra2.php @@ -0,0 +1,50 @@ +. + */ + +namespace GameQ\Protocols; + +/** + * Class Redorchestra2 + * + * @package GameQ\Protocols + * @author Austin Bischoff + */ +class Redorchestra2 extends Source +{ + /** + * String name of this protocol class + * + * @type string + */ + protected $name = 'redorchestra2'; + + /** + * Longer string name of this protocol class + * + * @type string + */ + protected $name_long = "Red Orchestra 2"; + + /** + * query_port = client_port + 19238 + * 27015 = 7777 + 19238 + * + * @type int + */ + protected $port_diff = 19238; +} diff --git a/gameq/src/GameQ/Protocols/Risingstorm2.php b/gameq/src/GameQ/Protocols/Risingstorm2.php new file mode 100644 index 0000000..ddb82a5 --- /dev/null +++ b/gameq/src/GameQ/Protocols/Risingstorm2.php @@ -0,0 +1,55 @@ +. + */ + +namespace GameQ\Protocols; + +/** + * Class Rising Storm 2 + * + * @package GameQ\Protocols + * @author Austin Bischoff + */ +class Risingstorm2 extends Source +{ + + /** + * String name of this protocol class + * + * @type string + */ + protected $name = 'rising storm 2'; + + /** + * Longer string name of this protocol class + * + * @type string + */ + protected $name_long = "Rising Storm 2"; + + /** + * Query port is always 27015 + * + * @param int $clientPort + * + * @return int + */ + public function findQueryPort($clientPort) + { + return 27015; + } +} diff --git a/gameq/src/GameQ/Protocols/Rust.php b/gameq/src/GameQ/Protocols/Rust.php new file mode 100644 index 0000000..81b0cce --- /dev/null +++ b/gameq/src/GameQ/Protocols/Rust.php @@ -0,0 +1,43 @@ +. + */ + +namespace GameQ\Protocols; + +/** + * Class Rust + * + * @package GameQ\Protocols + * @author Austin Bischoff + */ +class Rust extends Source +{ + + /** + * String name of this protocol class + * + * @type string + */ + protected $name = 'rust'; + + /** + * Longer string name of this protocol class + * + * @type string + */ + protected $name_long = "Rust"; +} diff --git a/gameq/src/GameQ/Protocols/Samp.php b/gameq/src/GameQ/Protocols/Samp.php new file mode 100644 index 0000000..e96358a --- /dev/null +++ b/gameq/src/GameQ/Protocols/Samp.php @@ -0,0 +1,272 @@ +. + */ + +namespace GameQ\Protocols; + +use GameQ\Protocol; +use GameQ\Buffer; +use GameQ\Result; +use GameQ\Server; +use GameQ\Exception\Protocol as Exception; + +/** + * San Andreas Multiplayer Protocol Class (samp) + * + * Note: + * Player information will not be returned if player count is over 256 + * + * @author Austin Bischoff + */ +class Samp extends Protocol +{ + + /** + * Array of packets we want to look up. + * Each key should correspond to a defined method in this or a parent class + * + * @type array + */ + protected $packets = [ + self::PACKET_STATUS => "SAMP%si", + self::PACKET_PLAYERS => "SAMP%sd", + self::PACKET_RULES => "SAMP%sr", + ]; + + /** + * Use the response flag to figure out what method to run + * + * @type array + */ + protected $responses = [ + "\x69" => "processStatus", // i + "\x64" => "processPlayers", // d + "\x72" => "processRules", // r + ]; + + /** + * The query protocol used to make the call + * + * @type string + */ + protected $protocol = 'samp'; + + /** + * String name of this protocol class + * + * @type string + */ + protected $name = 'samp'; + + /** + * Longer string name of this protocol class + * + * @type string + */ + protected $name_long = "San Andreas Multiplayer"; + + /** + * Holds the calculated server code that is passed when querying for information + * + * @type string + */ + protected $server_code = null; + + /** + * Normalize settings for this protocol + * + * @type array + */ + protected $normalize = [ + // General + 'general' => [ + // target => source + 'dedicated' => 'dedicated', + 'hostname' => ['hostname', 'servername'], + 'mapname' => 'mapname', + 'maxplayers' => 'max_players', + 'numplayers' => 'num_players', + 'password' => 'password', + ], + // Individual + 'player' => [ + 'name' => 'name', + 'score' => 'score', + 'ping' => 'ping', + ], + ]; + + /** + * Handle some work before sending the packets out to the server + * + * @param \GameQ\Server $server + */ + public function beforeSend(Server $server) + { + + // Build the server code + $this->server_code = implode('', array_map('chr', explode('.', $server->ip()))) . + pack("S", $server->portClient()); + + // Loop over the packets and update them + foreach ($this->packets as $packetType => $packet) { + // Fill out the packet with the server info + $this->packets[$packetType] = sprintf($packet, $this->server_code); + } + } + + /** + * Process the response + * + * @return array + * @throws \GameQ\Exception\Protocol + */ + public function processResponse() + { + + // Results that will be returned + $results = [ ]; + + // Get the length of the server code so we can figure out how much to read later + $serverCodeLength = strlen($this->server_code); + + // We need to pre-sort these for split packets so we can do extra work where needed + foreach ($this->packets_response as $response) { + // Make new buffer + $buffer = new Buffer($response); + + // Check the header, should be SAMP + if (($header = $buffer->read(4)) !== 'SAMP') { + throw new Exception(__METHOD__ . " header response '{$header}' is not valid"); + } + + // Check to make sure the server response code matches what we sent + if ($buffer->read($serverCodeLength) !== $this->server_code) { + throw new Exception(__METHOD__ . " code check failed."); + } + + // Figure out what packet response this is for + $response_type = $buffer->read(1); + + // Figure out which packet response this is + if (!array_key_exists($response_type, $this->responses)) { + throw new Exception(__METHOD__ . " response type '{$response_type}' is not valid"); + } + + // Now we need to call the proper method + $results = array_merge( + $results, + call_user_func_array([ $this, $this->responses[$response_type] ], [ $buffer ]) + ); + + unset($buffer); + } + + return $results; + } + + /* + * Internal methods + */ + + /** + * Handles processing the server status data + * + * @param \GameQ\Buffer $buffer + * + * @return array + * @throws \GameQ\Exception\Protocol + */ + protected function processStatus(Buffer $buffer) + { + + // Set the result to a new result instance + $result = new Result(); + + // Always dedicated + $result->add('dedicated', 1); + + // Pull out the server information + $result->add('password', $buffer->readInt8()); + $result->add('num_players', $buffer->readInt16()); + $result->add('max_players', $buffer->readInt16()); + + // These are read differently for these last 3 + $result->add('servername', $buffer->read($buffer->readInt32())); + $result->add('gametype', $buffer->read($buffer->readInt32())); + $result->add('language', $buffer->read($buffer->readInt32())); + + unset($buffer); + + return $result->fetch(); + } + + /** + * Handles processing the player data into a usable format + * + * @param \GameQ\Buffer $buffer + * + * @return array + */ + protected function processPlayers(Buffer $buffer) + { + + // Set the result to a new result instance + $result = new Result(); + + // Number of players + $result->add('num_players', $buffer->readInt16()); + + // Run until we run out of buffer + while ($buffer->getLength()) { + $result->addPlayer('id', $buffer->readInt8()); + $result->addPlayer('name', $buffer->readPascalString()); + $result->addPlayer('score', $buffer->readInt32()); + $result->addPlayer('ping', $buffer->readInt32()); + } + + unset($buffer); + + return $result->fetch(); + } + + /** + * Handles processing the rules data into a usable format + * + * @param \GameQ\Buffer $buffer + * + * @return array + */ + protected function processRules(Buffer $buffer) + { + + // Set the result to a new result instance + $result = new Result(); + + // Number of rules + $result->add('num_rules', $buffer->readInt16()); + + // Run until we run out of buffer + while ($buffer->getLength()) { + $result->add($buffer->readPascalString(), $buffer->readPascalString()); + } + + unset($buffer); + + return $result->fetch(); + } +} diff --git a/gameq/src/GameQ/Protocols/Sevendaystodie.php b/gameq/src/GameQ/Protocols/Sevendaystodie.php new file mode 100644 index 0000000..a5ddbf2 --- /dev/null +++ b/gameq/src/GameQ/Protocols/Sevendaystodie.php @@ -0,0 +1,49 @@ +. + */ + +namespace GameQ\Protocols; + +/** + * Class 7 Days to Die + * + * @package GameQ\Protocols + * @author Austin Bischoff + */ +class Sevendaystodie extends Source +{ + /** + * String name of this protocol class + * + * @type string + */ + protected $name = 'sevendaystodie'; + + /** + * Longer string name of this protocol class + * + * @type string + */ + protected $name_long = "7 Days to Die"; + + /** + * query_port = client_port + 1 + * + * @type int + */ + protected $port_diff = 1; +} diff --git a/gameq/src/GameQ/Protocols/Ship.php b/gameq/src/GameQ/Protocols/Ship.php new file mode 100644 index 0000000..9c3bee9 --- /dev/null +++ b/gameq/src/GameQ/Protocols/Ship.php @@ -0,0 +1,95 @@ +. + */ + +namespace GameQ\Protocols; + +use GameQ\Buffer; +use GameQ\Result; + +/** + * Class Ship + * + * @package GameQ\Protocols + * + * @author Nikolay Ipanyuk + * @author Austin Bischoff + */ +class Ship extends Source +{ + + /** + * String name of this protocol class + * + * @type string + */ + protected $name = 'ship'; + + /** + * Longer string name of this protocol class + * + * @type string + */ + protected $name_long = "The Ship"; + + /** + * Specific player parse for The Ship + * + * Player response has unknown data after the last real player + * + * @param \GameQ\Buffer $buffer + * + * @return array + */ + protected function processPlayers(Buffer $buffer) + { + + // Set the result to a new result instance + $result = new Result(); + + // We need to read the number of players because this response has other data at the end usually + $num_players = $buffer->readInt8(); + + // Player count + $result->add('num_players', $num_players); + + // No players, no work + if ($num_players == 0) { + return $result->fetch(); + } + + // Players list + for ($player = 0; $player < $num_players; $player++) { + $result->addPlayer('id', $buffer->readInt8()); + $result->addPlayer('name', $buffer->readString()); + $result->addPlayer('score', $buffer->readInt32Signed()); + $result->addPlayer('time', $buffer->readFloat32()); + } + + // Extra data + if ($buffer->getLength() > 0) { + for ($player = 0; $player < $num_players; $player++) { + $result->addPlayer('deaths', $buffer->readInt32Signed()); + $result->addPlayer('money', $buffer->readInt32Signed()); + } + } + + unset($buffer); + + return $result->fetch(); + } +} diff --git a/gameq/src/GameQ/Protocols/Soldat.php b/gameq/src/GameQ/Protocols/Soldat.php new file mode 100644 index 0000000..a9dbbc4 --- /dev/null +++ b/gameq/src/GameQ/Protocols/Soldat.php @@ -0,0 +1,59 @@ +. + */ + +namespace GameQ\Protocols; + +/** + * Class Soldat + * + * @package GameQ\Protocols + * + * @author Marcel Bößendörfer + * @author Austin Bischoff + */ +class Soldat extends Ase +{ + + /** + * String name of this protocol class + * + * @type string + */ + protected $name = 'soldat'; + + /** + * Longer string name of this protocol class + * + * @type string + */ + protected $name_long = "Soldat"; + + /** + * query_port = client_port + 123 + * + * @type int + */ + protected $port_diff = 123; + + /** + * The client join link + * + * @type string + */ + protected $join_link = "soldat://%s:%d/"; +} diff --git a/gameq/src/GameQ/Protocols/Source.php b/gameq/src/GameQ/Protocols/Source.php new file mode 100644 index 0000000..9e4cb5d --- /dev/null +++ b/gameq/src/GameQ/Protocols/Source.php @@ -0,0 +1,522 @@ +. + */ + +namespace GameQ\Protocols; + +use GameQ\Buffer; +use GameQ\Exception\Protocol as Exception; +use GameQ\Protocol; +use GameQ\Result; + +/** + * Valve Source Engine Protocol Class (A2S) + * + * This class is used as the basis for all other source based servers + * that rely on the source protocol for game querying. + * + * @SuppressWarnings(PHPMD.NumberOfChildren) + * + * @author Austin Bischoff + */ +class Source extends Protocol +{ + + /* + * Source engine type constants + */ + const SOURCE_ENGINE = 0, + GOLDSOURCE_ENGINE = 1; + + /** + * Array of packets we want to look up. + * Each key should correspond to a defined method in this or a parent class + * + * @type array + */ + protected $packets = [ + self::PACKET_CHALLENGE => "\xFF\xFF\xFF\xFF\x56\x00\x00\x00\x00", + self::PACKET_DETAILS => "\xFF\xFF\xFF\xFFTSource Engine Query\x00", + self::PACKET_PLAYERS => "\xFF\xFF\xFF\xFF\x55%s", + self::PACKET_RULES => "\xFF\xFF\xFF\xFF\x56%s", + ]; + + /** + * Use the response flag to figure out what method to run + * + * @type array + */ + protected $responses = [ + "\x49" => "processDetails", // I + "\x6d" => "processDetailsGoldSource", // m, goldsource + "\x44" => "processPlayers", // D + "\x45" => "processRules", // E + ]; + + /** + * The query protocol used to make the call + * + * @type string + */ + protected $protocol = 'source'; + + /** + * String name of this protocol class + * + * @type string + */ + protected $name = 'source'; + + /** + * Longer string name of this protocol class + * + * @type string + */ + protected $name_long = "Source Server"; + + /** + * Define the Source engine type. By default it is assumed to be Source + * + * @type int + */ + protected $source_engine = self::SOURCE_ENGINE; + + /** + * The client join link + * + * @type string + */ + protected $join_link = "steam://connect/%s:%d/"; + + /** + * Normalize settings for this protocol + * + * @type array + */ + protected $normalize = [ + // General + 'general' => [ + // target => source + 'dedicated' => 'dedicated', + 'gametype' => 'game_descr', + 'hostname' => 'hostname', + 'mapname' => 'map', + 'maxplayers' => 'max_players', + 'mod' => 'game_dir', + 'numplayers' => 'num_players', + 'password' => 'password', + ], + // Individual + 'player' => [ + 'name' => 'name', + 'score' => 'score', + 'time' => 'time', + ], + ]; + + /** + * Parse the challenge response and apply it to all the packet types + * + * @param \GameQ\Buffer $challenge_buffer + * + * @return bool + * @throws \GameQ\Exception\Protocol + */ + public function challengeParseAndApply(Buffer $challenge_buffer) + { + + // Skip the header + $challenge_buffer->skip(5); + + // Apply the challenge and return + return $this->challengeApply($challenge_buffer->read(4)); + } + + /** + * Process the response + * + * @return array + * @throws \GameQ\Exception\Protocol + */ + public function processResponse() + { + // Will hold the results when complete + $results = []; + + // Holds sorted response packets + $packets = []; + + // We need to pre-sort these for split packets so we can do extra work where needed + foreach ($this->packets_response as $response) { + $buffer = new Buffer($response); + + // Get the header of packet (long) + $header = $buffer->readInt32Signed(); + + // Single packet + if ($header == -1) { + // We need to peek and see what kind of engine this is for later processing + if ($buffer->lookAhead(1) == "\x6d") { + $this->source_engine = self::GOLDSOURCE_ENGINE; + } + + $packets[] = $buffer->getBuffer(); + continue; + } else { + // Split packet + + // Packet Id (long) + $packet_id = $buffer->readInt32Signed() + 10; + + // Add the buffer to the packet as another array + $packets[$packet_id][] = $buffer->getBuffer(); + } + } + + // Free up memory + unset($response, $packet_id, $buffer, $header); + + // Now that we have the packets sorted we need to iterate and process them + foreach ($packets as $packet_id => $packet) { + // We first need to off load split packets to combine them + if (is_array($packet)) { + $buffer = new Buffer($this->processPackets($packet_id, $packet)); + } else { + $buffer = new Buffer($packet); + } + + // Figure out what packet response this is for + $response_type = $buffer->read(1); + + // Figure out which packet response this is + if (!array_key_exists($response_type, $this->responses)) { + throw new Exception(__METHOD__ . " response type '{$response_type}' is not valid"); + } + + // Now we need to call the proper method + $results = array_merge( + $results, + call_user_func_array([$this, $this->responses[$response_type]], [$buffer]) + ); + + unset($buffer); + } + + // Free up memory + unset($packets, $packet, $packet_id, $response_type); + + return $results; + } + + /* + * Internal methods + */ + + /** + * Process the split packets and decompress if necessary + * + * @SuppressWarnings(PHPMD.UnusedLocalVariable) + * + * @param $packet_id + * @param array $packets + * + * @return string + * @throws \GameQ\Exception\Protocol + */ + protected function processPackets($packet_id, array $packets = []) + { + + // Init array so we can order + $packs = []; + + // We have multiple packets so we need to get them and order them + foreach ($packets as $i => $packet) { + // Make a buffer so we can read this info + $buffer = new Buffer($packet); + + // Gold source + if ($this->source_engine == self::GOLDSOURCE_ENGINE) { + // Grab the packet number (byte) + $packet_number = $buffer->readInt8(); + + // We need to burn the extra header (\xFF\xFF\xFF\xFF) on first loop + if ($i == 0) { + $buffer->read(4); + } + + // Now add the rest of the packet to the new array with the packet_number as the id so we can order it + $packs[$packet_number] = $buffer->getBuffer(); + } else { + // Number of packets in this set (byte) + $buffer->readInt8(); + + // The current packet number (byte) + $packet_number = $buffer->readInt8(); + + // Check to see if this is compressed + // @todo: Check to make sure these decompress correctly, new changes may affect this loop. + if ($packet_id & 0x80000000) { + // Check to see if we have Bzip2 installed + if (!function_exists('bzdecompress')) { + // @codeCoverageIgnoreStart + throw new Exception( + 'Bzip2 is not installed. See http://www.php.net/manual/en/book.bzip2.php for more info.', + 0 + ); + // @codeCoverageIgnoreEnd + } + + // Get the length of the packet (long) + $packet_length = $buffer->readInt32Signed(); + + // Checksum for the decompressed packet (long), burn it - doesnt work in split responses + $buffer->readInt32Signed(); + + // Try to decompress + $result = bzdecompress($buffer->getBuffer()); + + // Now verify the length + if (strlen($result) != $packet_length) { + // @codeCoverageIgnoreStart + throw new Exception( + "Checksum for compressed packet failed! Length expected: {$packet_length}, length + returned: " . strlen($result) + ); + // @codeCoverageIgnoreEnd + } + + // We need to burn the extra header (\xFF\xFF\xFF\xFF) on first loop + if ($i == 0) { + $result = substr($result, 4); + } + } else { + // Get the packet length (short), burn it + $buffer->readInt16Signed(); + + // We need to burn the extra header (\xFF\xFF\xFF\xFF) on first loop + if ($i == 0) { + $buffer->read(4); + } + + // Grab the rest of the buffer as a result + $result = $buffer->getBuffer(); + } + + // Add this packet to the list + $packs[$packet_number] = $result; + } + + unset($buffer); + } + + // Free some memory + unset($packets, $packet); + + // Sort the packets by packet number + ksort($packs); + + // Now combine the packs into one and return + return implode("", $packs); + } + + /** + * Handles processing the details data into a usable format + * + * @param \GameQ\Buffer $buffer + * + * @return mixed + * @throws \GameQ\Exception\Protocol + */ + protected function processDetails(Buffer $buffer) + { + + // Set the result to a new result instance + $result = new Result(); + + $result->add('protocol', $buffer->readInt8()); + $result->add('hostname', $buffer->readString()); + $result->add('map', $buffer->readString()); + $result->add('game_dir', $buffer->readString()); + $result->add('game_descr', $buffer->readString()); + $result->add('steamappid', $buffer->readInt16()); + $result->add('num_players', $buffer->readInt8()); + $result->add('max_players', $buffer->readInt8()); + $result->add('num_bots', $buffer->readInt8()); + $result->add('dedicated', $buffer->read()); + $result->add('os', $buffer->read()); + $result->add('password', $buffer->readInt8()); + $result->add('secure', $buffer->readInt8()); + + // Special result for The Ship only (appid=2400) + if ($result->get('steamappid') == 2400) { + $result->add('game_mode', $buffer->readInt8()); + $result->add('witness_count', $buffer->readInt8()); + $result->add('witness_time', $buffer->readInt8()); + } + + $result->add('version', $buffer->readString()); + + // Because of php 5.4... + $edfCheck = $buffer->lookAhead(1); + + // Extra data flag + if (!empty($edfCheck)) { + $edf = $buffer->readInt8(); + + if ($edf & 0x80) { + $result->add('port', $buffer->readInt16Signed()); + } + + if ($edf & 0x10) { + $result->add('steam_id', $buffer->readInt64()); + } + + if ($edf & 0x40) { + $result->add('sourcetv_port', $buffer->readInt16Signed()); + $result->add('sourcetv_name', $buffer->readString()); + } + + if ($edf & 0x20) { + $result->add('keywords', $buffer->readString()); + } + + if ($edf & 0x01) { + $result->add('game_id', $buffer->readInt64()); + } + + unset($edf); + } + + unset($buffer); + + return $result->fetch(); + } + + /** + * Handles processing the server details from goldsource response + * + * @param \GameQ\Buffer $buffer + * + * @return array + * @throws \GameQ\Exception\Protocol + */ + protected function processDetailsGoldSource(Buffer $buffer) + { + + // Set the result to a new result instance + $result = new Result(); + + $result->add('address', $buffer->readString()); + $result->add('hostname', $buffer->readString()); + $result->add('map', $buffer->readString()); + $result->add('game_dir', $buffer->readString()); + $result->add('game_descr', $buffer->readString()); + $result->add('num_players', $buffer->readInt8()); + $result->add('max_players', $buffer->readInt8()); + $result->add('version', $buffer->readInt8()); + $result->add('dedicated', $buffer->read()); + $result->add('os', $buffer->read()); + $result->add('password', $buffer->readInt8()); + + // Mod section + $result->add('ismod', $buffer->readInt8()); + + // We only run these if ismod is 1 (true) + if ($result->get('ismod') == 1) { + $result->add('mod_urlinfo', $buffer->readString()); + $result->add('mod_urldl', $buffer->readString()); + $buffer->skip(); + $result->add('mod_version', $buffer->readInt32Signed()); + $result->add('mod_size', $buffer->readInt32Signed()); + $result->add('mod_type', $buffer->readInt8()); + $result->add('mod_cldll', $buffer->readInt8()); + } + + $result->add('secure', $buffer->readInt8()); + $result->add('num_bots', $buffer->readInt8()); + + unset($buffer); + + return $result->fetch(); + } + + /** + * Handles processing the player data into a usable format + * + * @param \GameQ\Buffer $buffer + * + * @return mixed + */ + protected function processPlayers(Buffer $buffer) + { + + // Set the result to a new result instance + $result = new Result(); + + // Pull out the number of players + $num_players = $buffer->readInt8(); + + // Player count + $result->add('num_players', $num_players); + + // No players so no need to look any further + if ($num_players == 0) { + return $result->fetch(); + } + + // Players list + while ($buffer->getLength()) { + $result->addPlayer('id', $buffer->readInt8()); + $result->addPlayer('name', $buffer->readString()); + $result->addPlayer('score', $buffer->readInt32Signed()); + $result->addPlayer('time', $buffer->readFloat32()); + } + + unset($buffer); + + return $result->fetch(); + } + + /** + * Handles processing the rules data into a usable format + * + * @param \GameQ\Buffer $buffer + * + * @return mixed + */ + protected function processRules(Buffer $buffer) + { + + // Set the result to a new result instance + $result = new Result(); + + // Count the number of rules + $num_rules = $buffer->readInt16Signed(); + + // Add the count of the number of rules this server has + $result->add('num_rules', $num_rules); + + // Rules + while ($buffer->getLength()) { + $result->add($buffer->readString(), $buffer->readString()); + } + + unset($buffer); + + return $result->fetch(); + } +} diff --git a/gameq/src/GameQ/Protocols/Spaceengineers.php b/gameq/src/GameQ/Protocols/Spaceengineers.php new file mode 100644 index 0000000..ddf8567 --- /dev/null +++ b/gameq/src/GameQ/Protocols/Spaceengineers.php @@ -0,0 +1,42 @@ +. + */ + +namespace GameQ\Protocols; + +/** + * Space Engineers Protocol Class + * + * @package GameQ\Protocols + * @author Austin Bischoff + */ +class Spaceengineers extends Source +{ + /** + * String name of this protocol class + * + * @type string + */ + protected $name = 'spaceengineers'; + + /** + * Longer string name of this protocol class + * + * @type string + */ + protected $name_long = "Space Engineers"; +} diff --git a/gameq/src/GameQ/Protocols/Squad.php b/gameq/src/GameQ/Protocols/Squad.php new file mode 100644 index 0000000..3c02188 --- /dev/null +++ b/gameq/src/GameQ/Protocols/Squad.php @@ -0,0 +1,53 @@ +. + */ + +namespace GameQ\Protocols; + +/** + * Class Squad + * + * Port reference: http://forums.joinsquad.com/topic/9559-query-ports/ + * + * @package GameQ\Protocols + * @author Austin Bischoff + */ +class Squad extends Source +{ + + /** + * String name of this protocol class + * + * @type string + */ + protected $name = 'squad'; + + /** + * Longer string name of this protocol class + * + * @type string + */ + protected $name_long = "Squad"; + + /** + * query_port = client_port + 19378 + * 27165 = 7787 + 19378 + * + * @type int + */ + protected $port_diff = 19378; +} diff --git a/gameq/src/GameQ/Protocols/Starmade.php b/gameq/src/GameQ/Protocols/Starmade.php new file mode 100644 index 0000000..09a033f --- /dev/null +++ b/gameq/src/GameQ/Protocols/Starmade.php @@ -0,0 +1,226 @@ +. + */ + +namespace GameQ\Protocols; + +use GameQ\Protocol; +use GameQ\Buffer; +use GameQ\Result; +use GameQ\Exception\Protocol as Exception; + +/** + * StarMade Protocol Class + * + * StarMade server query protocol class + * + * Credit to Robin Promesberger for providing Java based querying as a roadmap + * + * @author Austin Bischoff + */ +class Starmade extends Protocol +{ + + /** + * Array of packets we want to query. + * + * @type array + */ + protected $packets = [ + self::PACKET_STATUS => "\x00\x00\x00\x09\x2a\xff\xff\x01\x6f\x00\x00\x00\x00", + ]; + + /** + * The transport mode for this protocol is TCP + * + * @type string + */ + protected $transport = self::TRANSPORT_TCP; + + /** + * The query protocol used to make the call + * + * @type string + */ + protected $protocol = 'starmade'; + + /** + * String name of this protocol class + * + * @type string + */ + protected $name = 'starmade'; + + /** + * Longer string name of this protocol class + * + * @type string + */ + protected $name_long = "StarMade"; + + /** + * The client join link + * + * @type string + */ + protected $join_link = null; + + /** + * Normalize settings for this protocol + * + * @type array + */ + protected $normalize = [ + // General + 'general' => [ + // target => source + 'dedicated' => 'dedicated', + 'hostname' => 'hostname', + 'maxplayers' => 'max_players', + 'numplayers' => 'num_players', + 'password' => 'password', + ], + ]; + + /** + * Process the response for the StarMade server + * + * @return array + * @throws \GameQ\Exception\Protocol + */ + public function processResponse() + { + + // Implode the packets, not sure if there is any split logic for multiple packets + $buffer = new Buffer(implode('', $this->packets_response), Buffer::NUMBER_TYPE_BIGENDIAN); + + // Get the passed length in the data side of the packet + $buffer->readInt32Signed(); + + // Read off the timestamp (in milliseconds) + $buffer->readInt64(); + + // Burn the check id == 42 + $buffer->readInt8(); + + // Read packetId, unused + $buffer->readInt16Signed(); + + // Read commandId, unused + $buffer->readInt8Signed(); + + // Read type, unused + $buffer->readInt8Signed(); + + $parsed = $this->parseServerParameters($buffer); + + // Set the result to a new result instance + $result = new Result(); + + // Best guess info version is the type of response to expect. As of this commit the version is "2". + $result->add('info_version', $parsed[0]); + $result->add('version', $parsed[1]); + $result->add('hostname', $parsed[2]); + $result->add('game_descr', $parsed[3]); + $result->add('start_time', $parsed[4]); + $result->add('num_players', $parsed[5]); + $result->add('max_players', $parsed[6]); + $result->add('dedicated', 1); // All servers are dedicated as far as I can tell + $result->add('password', 0); // Unsure if you can password servers, cant read that value + //$result->add('map', 'Unknown'); + + unset($parsed); + + return $result->fetch(); + } + + /** + * Parse the server response parameters + * + * @SuppressWarnings(PHPMD.CyclomaticComplexity) + * + * @param \GameQ\Buffer $buffer + * + * @return array + * @throws \GameQ\Exception\Protocol + */ + protected function parseServerParameters(Buffer &$buffer) + { + + // Init the parsed data array + $parsed = []; + + // Read the number of parameters to parse + $parameterSize = $buffer->readInt32Signed(); + + // Iterate over the parameter size + for ($i = 0; $i < $parameterSize; $i++) { + // Read the type of return this is + $dataType = $buffer->readInt8Signed(); + + switch ($dataType) { + // 32-bit int + case 1: + $parsed[$i] = $buffer->readInt32Signed(); + break; + + // 64-bit int + case 2: + $parsed[$i] = $buffer->readInt64(); + break; + + // Float + case 3: + $parsed[$i] = $buffer->readFloat32(); + break; + + // String + case 4: + // The first 2 bytes are the string length + $strLength = $buffer->readInt16Signed(); + + // Read the above length from the buffer + $parsed[$i] = $buffer->read($strLength); + + unset($strLength); + break; + + // Boolean + case 5: + $parsed[$i] = (bool)$buffer->readInt8Signed(); + break; + + // 8-bit int + case 6: + $parsed[$i] = $buffer->readInt8Signed(); + break; + + // 16-bit int + case 7: + $parsed[$i] = $buffer->readInt16Signed(); + break; + + // Array + case 8: + // Not implemented + throw new Exception("StarMade array parsing is not implemented!"); + } + } + + return $parsed; + } +} diff --git a/gameq/src/GameQ/Protocols/Teamspeak2.php b/gameq/src/GameQ/Protocols/Teamspeak2.php new file mode 100644 index 0000000..df0d59a --- /dev/null +++ b/gameq/src/GameQ/Protocols/Teamspeak2.php @@ -0,0 +1,290 @@ +. + */ + +namespace GameQ\Protocols; + +use GameQ\Protocol; +use GameQ\Buffer; +use GameQ\Result; +use GameQ\Server; +use GameQ\Exception\Protocol as Exception; + +/** + * Teamspeak 2 Protocol Class + * + * All values are utf8 encoded upon processing + * + * This code ported from GameQ v1/v2. Credit to original author(s) as I just updated it to + * work within this new system. + * + * @author Austin Bischoff + */ +class Teamspeak2 extends Protocol +{ + + /** + * Array of packets we want to look up. + * Each key should correspond to a defined method in this or a parent class + * + * @type array + */ + protected $packets = [ + self::PACKET_DETAILS => "sel %d\x0asi\x0a", + self::PACKET_CHANNELS => "sel %d\x0acl\x0a", + self::PACKET_PLAYERS => "sel %d\x0apl\x0a", + ]; + + /** + * The transport mode for this protocol is TCP + * + * @type string + */ + protected $transport = self::TRANSPORT_TCP; + + /** + * The query protocol used to make the call + * + * @type string + */ + protected $protocol = 'teamspeak2'; + + /** + * String name of this protocol class + * + * @type string + */ + protected $name = 'teamspeak2'; + + /** + * Longer string name of this protocol class + * + * @type string + */ + protected $name_long = "Teamspeak 2"; + + /** + * The client join link + * + * @type string + */ + protected $join_link = "teamspeak://%s:%d/"; + + /** + * Normalize settings for this protocol + * + * @type array + */ + protected $normalize = [ + // General + 'general' => [ + 'dedicated' => 'dedicated', + 'hostname' => 'server_name', + 'password' => 'server_password', + 'numplayers' => 'server_currentusers', + 'maxplayers' => 'server_maxusers', + ], + // Player + 'player' => [ + 'id' => 'p_id', + 'team' => 'c_id', + 'name' => 'nick', + ], + // Team + 'team' => [ + 'id' => 'id', + 'name' => 'name', + ], + ]; + + /** + * Before we send off the queries we need to update the packets + * + * @param \GameQ\Server $server + * + * @throws \GameQ\Exception\Protocol + */ + public function beforeSend(Server $server) + { + + // Check to make sure we have a query_port because it is required + if (!isset($this->options[Server::SERVER_OPTIONS_QUERY_PORT]) + || empty($this->options[Server::SERVER_OPTIONS_QUERY_PORT]) + ) { + throw new Exception(__METHOD__ . " Missing required setting '" . Server::SERVER_OPTIONS_QUERY_PORT . "'."); + } + + // Let's loop the packets and set the proper pieces + foreach ($this->packets as $packet_type => $packet) { + // Update with the client port for the server + $this->packets[$packet_type] = sprintf($packet, $server->portClient()); + } + } + + /** + * Process the response + * + * @return array + * @throws \GameQ\Exception\Protocol + */ + public function processResponse() + { + + // Make a new buffer out of all of the packets + $buffer = new Buffer(implode('', $this->packets_response)); + + // Check the header [TS] + if (($header = trim($buffer->readString("\n"))) !== '[TS]') { + throw new Exception(__METHOD__ . " Expected header '{$header}' does not match expected '[TS]'."); + } + + // Split this buffer as the data blocks are bound by "OK" and drop any empty values + $sections = array_filter(explode("OK", $buffer->getBuffer()), function ($value) { + + $value = trim($value); + + return !empty($value); + }); + + // Trim up the values to remove extra whitespace + $sections = array_map('trim', $sections); + + // Set the result to a new result instance + $result = new Result(); + + // Now we need to iterate over the sections and off load the processing + foreach ($sections as $section) { + // Grab a snip of the data so we can figure out what it is + $check = substr($section, 0, 7); + + // Offload to the proper method + if ($check == 'server_') { + // Server settings and info + $this->processDetails($section, $result); + } elseif ($check == "id\tcode") { + // Channel info + $this->processChannels($section, $result); + } elseif ($check == "p_id\tc_") { + // Player info + $this->processPlayers($section, $result); + } + } + + unset($buffer, $sections, $section, $check); + + return $result->fetch(); + } + + /* + * Internal methods + */ + + + /** + * Handles processing the details data into a usable format + * + * @param string $data + * @param \GameQ\Result $result + */ + protected function processDetails($data, Result &$result) + { + + // Create a buffer + $buffer = new Buffer($data); + + // Always dedicated + $result->add('dedicated', 1); + + // Let's loop until we run out of data + while ($buffer->getLength()) { + // Grab the row, which is an item + $row = trim($buffer->readString("\n")); + + // Split out the information + list($key, $value) = explode('=', $row, 2); + + // Add this to the result + $result->add($key, utf8_encode($value)); + } + + unset($data, $buffer, $row, $key, $value); + } + + /** + * Process the channel listing + * + * @param string $data + * @param \GameQ\Result $result + */ + protected function processChannels($data, Result &$result) + { + + // Create a buffer + $buffer = new Buffer($data); + + // The first line holds the column names, data returned is in column/row format + $columns = explode("\t", trim($buffer->readString("\n")), 9); + + // Loop through the rows until we run out of information + while ($buffer->getLength()) { + // Grab the row, which is a tabbed list of items + $row = trim($buffer->readString("\n")); + + // Explode and merge the data with the columns, then parse + $data = array_combine($columns, explode("\t", $row, 9)); + + foreach ($data as $key => $value) { + // Now add the data to the result + $result->addTeam($key, utf8_encode($value)); + } + } + + unset($data, $buffer, $row, $columns, $key, $value); + } + + /** + * Process the user listing + * + * @param string $data + * @param \GameQ\Result $result + */ + protected function processPlayers($data, Result &$result) + { + + // Create a buffer + $buffer = new Buffer($data); + + // The first line holds the column names, data returned is in column/row format + $columns = explode("\t", trim($buffer->readString("\n")), 16); + + // Loop through the rows until we run out of information + while ($buffer->getLength()) { + // Grab the row, which is a tabbed list of items + $row = trim($buffer->readString("\n")); + + // Explode and merge the data with the columns, then parse + $data = array_combine($columns, explode("\t", $row, 16)); + + foreach ($data as $key => $value) { + // Now add the data to the result + $result->addPlayer($key, utf8_encode($value)); + } + } + + unset($data, $buffer, $row, $columns, $key, $value); + } +} diff --git a/gameq/src/GameQ/Protocols/Teamspeak3.php b/gameq/src/GameQ/Protocols/Teamspeak3.php new file mode 100644 index 0000000..c66f6a4 --- /dev/null +++ b/gameq/src/GameQ/Protocols/Teamspeak3.php @@ -0,0 +1,328 @@ +. + */ + +namespace GameQ\Protocols; + +use GameQ\Protocol; +use GameQ\Buffer; +use GameQ\Result; +use GameQ\Server; +use GameQ\Exception\Protocol as Exception; + +/** + * Teamspeak 3 Protocol Class + * + * All values are utf8 encoded upon processing + * + * This code ported from GameQ v1/v2. Credit to original author(s) as I just updated it to + * work within this new system. + * + * @author Austin Bischoff + */ +class Teamspeak3 extends Protocol +{ + + /** + * Array of packets we want to look up. + * Each key should correspond to a defined method in this or a parent class + * + * @type array + */ + protected $packets = [ + self::PACKET_DETAILS => "use port=%d\x0Aserverinfo\x0A", + self::PACKET_PLAYERS => "use port=%d\x0Aclientlist\x0A", + self::PACKET_CHANNELS => "use port=%d\x0Achannellist -topic\x0A", + ]; + + /** + * The transport mode for this protocol is TCP + * + * @type string + */ + protected $transport = self::TRANSPORT_TCP; + + /** + * The query protocol used to make the call + * + * @type string + */ + protected $protocol = 'teamspeak3'; + + /** + * String name of this protocol class + * + * @type string + */ + protected $name = 'teamspeak3'; + + /** + * Longer string name of this protocol class + * + * @type string + */ + protected $name_long = "Teamspeak 3"; + + /** + * The client join link + * + * @type string + */ + protected $join_link = "ts3server://%s?port=%d"; + + /** + * Normalize settings for this protocol + * + * @type array + */ + protected $normalize = [ + // General + 'general' => [ + 'dedicated' => 'dedicated', + 'hostname' => 'virtualserver_name', + 'password' => 'virtualserver_flag_password', + 'numplayers' => 'numplayers', + 'maxplayers' => 'virtualserver_maxclients', + ], + // Player + 'player' => [ + 'id' => 'clid', + 'team' => 'cid', + 'name' => 'client_nickname', + ], + // Team + 'team' => [ + 'id' => 'cid', + 'name' => 'channel_name', + ], + ]; + + /** + * Before we send off the queries we need to update the packets + * + * @param \GameQ\Server $server + * + * @throws \GameQ\Exception\Protocol + */ + public function beforeSend(Server $server) + { + + // Check to make sure we have a query_port because it is required + if (!isset($this->options[Server::SERVER_OPTIONS_QUERY_PORT]) + || empty($this->options[Server::SERVER_OPTIONS_QUERY_PORT]) + ) { + throw new Exception(__METHOD__ . " Missing required setting '" . Server::SERVER_OPTIONS_QUERY_PORT . "'."); + } + + // Let's loop the packets and set the proper pieces + foreach ($this->packets as $packet_type => $packet) { + // Update with the client port for the server + $this->packets[$packet_type] = sprintf($packet, $server->portClient()); + } + } + + /** + * Process the response + * + * @return array + * @throws \GameQ\Exception\Protocol + */ + public function processResponse() + { + + // Make a new buffer out of all of the packets + $buffer = new Buffer(implode('', $this->packets_response)); + + // Check the header TS3 + if (($header = trim($buffer->readString("\n"))) !== 'TS3') { + throw new Exception(__METHOD__ . " Expected header '{$header}' does not match expected 'TS3'."); + } + + // Convert all the escaped characters + $raw = str_replace( + [ + '\\\\', // Translate escaped \ + '\\/', // Translate escaped / + ], + [ + '\\', + '/', + ], + $buffer->getBuffer() + ); + + // Explode the sections and filter to remove empty, junk ones + $sections = array_filter(explode("\n", $raw), function ($value) { + + $value = trim($value); + + // Not empty string or a message response for "error id=\d" + return !empty($value) && substr($value, 0, 5) !== 'error'; + }); + + // Trim up the values to remove extra whitespace + $sections = array_map('trim', $sections); + + // Set the result to a new result instance + $result = new Result(); + + // Iterate over the sections and offload the parsing + foreach ($sections as $section) { + // Grab a snip of the data so we can figure out what it is + $check = substr(trim($section), 0, 4); + + // Use the first part of the response to figure out where we need to go + if ($check == 'virt') { + // Server info + $this->processDetails($section, $result); + } elseif ($check == 'cid=') { + // Channels + $this->processChannels($section, $result); + } elseif ($check == 'clid') { + // Clients (players) + $this->processPlayers($section, $result); + } + } + + unset($buffer, $sections, $section, $check); + + return $result->fetch(); + } + + /* + * Internal methods + */ + + /** + * Process the properties of the data. + * + * Takes data in "key1=value1 key2=value2 ..." and processes it into a usable format + * + * @param $data + * + * @return array + */ + protected function processProperties($data) + { + + // Will hold the properties we are sending back + $properties = []; + + // All of these are split on space + $items = explode(' ', $data); + + // Iterate over the items + foreach ($items as $item) { + // Explode and make sure we always have 2 items in the array + list($key, $value) = array_pad(explode('=', $item, 2), 2, ''); + + // Convert spaces and other character changes + $properties[$key] = utf8_encode(str_replace( + [ + '\\s', // Translate spaces + ], + [ + ' ', + ], + $value + )); + } + + return $properties; + } + + /** + * Handles processing the details data into a usable format + * + * @param string $data + * @param \GameQ\Result $result + */ + protected function processDetails($data, Result &$result) + { + + // Offload the parsing for these values + $properties = $this->processProperties($data); + + // Always dedicated + $result->add('dedicated', 1); + + // Iterate over the properties + foreach ($properties as $key => $value) { + $result->add($key, $value); + } + + // We need to manually figure out the number of players + $result->add( + 'numplayers', + ($properties['virtualserver_clientsonline'] - $properties['virtualserver_queryclientsonline']) + ); + + unset($data, $properties, $key, $value); + } + + /** + * Process the channel listing + * + * @param string $data + * @param \GameQ\Result $result + */ + protected function processChannels($data, Result &$result) + { + + // We need to split the data at the pipe + $channels = explode('|', $data); + + // Iterate over the channels + foreach ($channels as $channel) { + // Offload the parsing for these values + $properties = $this->processProperties($channel); + + // Iterate over the properties + foreach ($properties as $key => $value) { + $result->addTeam($key, $value); + } + } + + unset($data, $channel, $channels, $properties, $key, $value); + } + + /** + * Process the user listing + * + * @param string $data + * @param \GameQ\Result $result + */ + protected function processPlayers($data, Result &$result) + { + + // We need to split the data at the pipe + $players = explode('|', $data); + + // Iterate over the channels + foreach ($players as $player) { + // Offload the parsing for these values + $properties = $this->processProperties($player); + + // Iterate over the properties + foreach ($properties as $key => $value) { + $result->addPlayer($key, $value); + } + } + + unset($data, $player, $players, $properties, $key, $value); + } +} diff --git a/gameq/src/GameQ/Protocols/Teeworlds.php b/gameq/src/GameQ/Protocols/Teeworlds.php new file mode 100644 index 0000000..1bdaa47 --- /dev/null +++ b/gameq/src/GameQ/Protocols/Teeworlds.php @@ -0,0 +1,181 @@ +. + */ + +namespace GameQ\Protocols; + +use GameQ\Protocol; +use GameQ\Buffer; +use GameQ\Result; +use GameQ\Exception\Protocol as Exception; + +/** + * Teeworlds Protocol class + * + * Only supports versions > 0.5 + * + * @author Austin Bischoff + * @author Marcel Bößendörfer + */ +class Teeworlds extends Protocol +{ + + /** + * Array of packets we want to look up. + * Each key should correspond to a defined method in this or a parent class + * + * @type array + */ + protected $packets = [ + self::PACKET_ALL => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x67\x69\x65\x33\x05", + // 0.5 Packet (not compatible, maybe some wants to implement "Teeworldsold") + //self::PACKET_STATUS => "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFFgief", + ]; + + /** + * Use the response flag to figure out what method to run + * + * @type array + */ + protected $responses = [ + "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xffinf35" => "processAll", + ]; + + /** + * The query protocol used to make the call + * + * @type string + */ + protected $protocol = 'teeworlds'; + + /** + * String name of this protocol class + * + * @type string + */ + protected $name = 'teeworlds'; + + /** + * Longer string name of this protocol class + * + * @type string + */ + protected $name_long = "Teeworlds Server"; + + /** + * The client join link + * + * @type string + */ + protected $join_link = "steam://connect/%s:%d/"; + + /** + * Normalize settings for this protocol + * + * @type array + */ + protected $normalize = [ + // General + 'general' => [ + // target => source + 'dedicated' => 'dedicated', + 'hostname' => 'hostname', + 'mapname' => 'map', + 'maxplayers' => 'num_players_total', + ], + // Individual + 'player' => [ + 'name' => 'name', + 'score' => 'score', + ], + ]; + + /** + * Process the response + * + * @return array + * @throws Exception + */ + public function processResponse() + { + // Holds the results + $results = []; + + // Iterate over the packets + foreach ($this->packets_response as $response) { + // Make a buffer + $buffer = new Buffer($response); + + // Grab the header + $header = $buffer->readString(); + + // Figure out which packet response this is + if (!array_key_exists($header, $this->responses)) { + throw new Exception(__METHOD__ . " response type '" . bin2hex($header) . "' is not valid"); + } + + // Now we need to call the proper method + $results = array_merge( + $results, + call_user_func_array([$this, $this->responses[$header]], [$buffer]) + ); + } + + unset($buffer); + + return $results; + } + + /** + * Handle processing all of the data returned + * + * @param Buffer $buffer + * + * @return array + */ + protected function processAll(Buffer $buffer) + { + // Set the result to a new result instance + $result = new Result(); + + // Always dedicated + $result->add('dedicated', 1); + + $result->add('version', $buffer->readString()); + $result->add('hostname', $buffer->readString()); + $result->add('map', $buffer->readString()); + $result->add('game_descr', $buffer->readString()); + $result->add('flags', $buffer->readString()); // not sure about that + $result->add('num_players', $buffer->readString()); + $result->add('maxplayers', $buffer->readString()); + $result->add('num_players_total', $buffer->readString()); + $result->add('maxplayers_total', $buffer->readString()); + + // Players + while ($buffer->getLength()) { + $result->addPlayer('name', $buffer->readString()); + $result->addPlayer('clan', $buffer->readString()); + $result->addPlayer('flag', $buffer->readString()); + $result->addPlayer('score', $buffer->readString()); + $result->addPlayer('team', $buffer->readString()); + } + + unset($buffer); + + return $result->fetch(); + } +} diff --git a/gameq/src/GameQ/Protocols/Terraria.php b/gameq/src/GameQ/Protocols/Terraria.php new file mode 100644 index 0000000..d9455ef --- /dev/null +++ b/gameq/src/GameQ/Protocols/Terraria.php @@ -0,0 +1,59 @@ +. + */ + +namespace GameQ\Protocols; + +/** + * Class Terraria + * + * @package GameQ\Protocols + * + * @author Austin Bischoff + */ +class Terraria extends Tshock +{ + + /** + * String name of this protocol class + * + * @type string + */ + protected $name = 'terraria'; + + /** + * Longer string name of this protocol class + * + * @type string + */ + protected $name_long = "Terraria"; + + /** + * query_port = client_port + 101 + * 7878 = 7777 + 101 + * + * @type int + */ + protected $port_diff = 101; + + /** + * The client join link + * + * @type string + */ + protected $join_link = "steam://connect/%s:%d/"; +} diff --git a/gameq/src/GameQ/Protocols/Tf2.php b/gameq/src/GameQ/Protocols/Tf2.php new file mode 100644 index 0000000..e08411b --- /dev/null +++ b/gameq/src/GameQ/Protocols/Tf2.php @@ -0,0 +1,42 @@ +. + */ + +namespace GameQ\Protocols; + +/** + * Class Tf2 + * + * @package GameQ\Protocols + * @author Austin Bischoff + */ +class Tf2 extends Source +{ + /** + * String name of this protocol class + * + * @type string + */ + protected $name = 'tf2'; + + /** + * Longer string name of this protocol class + * + * @type string + */ + protected $name_long = "Team Fortress 2"; +} diff --git a/gameq/src/GameQ/Protocols/Theforrest.php b/gameq/src/GameQ/Protocols/Theforrest.php new file mode 100644 index 0000000..975c3f6 --- /dev/null +++ b/gameq/src/GameQ/Protocols/Theforrest.php @@ -0,0 +1,50 @@ +. + */ + +namespace GameQ\Protocols; + +/** + * Class Theforrest + * + * @package GameQ\Protocols + * @author Austin Bischoff + */ +class Theforrest extends Source +{ + + /** + * String name of this protocol class + * + * @type string + */ + protected $name = 'theforrest'; + + /** + * Longer string name of this protocol class + * + * @type string + */ + protected $name_long = "The Forrest"; + + /** + * query_port = client_port + 1 + * + * @type int + */ + protected $port_diff = 1; +} diff --git a/gameq/src/GameQ/Protocols/Tibia.php b/gameq/src/GameQ/Protocols/Tibia.php new file mode 100644 index 0000000..8702bfa --- /dev/null +++ b/gameq/src/GameQ/Protocols/Tibia.php @@ -0,0 +1,142 @@ +. + */ + +namespace GameQ\Protocols; + +use GameQ\Protocol; +use GameQ\Buffer; +use GameQ\Result; +use GameQ\Exception\Protocol as Exception; + +/** + * Tibia Protocol Class + * + * Tibia server query protocol class + * + * Credit to Ahmad Fatoum for providing Perl based querying as a roadmap + * + * @author Yive + * @author Austin Bischoff + */ +class Tibia extends Protocol +{ + + /** + * Array of packets we want to query. + * + * @type array + */ + protected $packets = [ + self::PACKET_STATUS => "\x06\x00\xFF\xFF\x69\x6E\x66\x6F", + ]; + + /** + * The transport mode for this protocol is TCP + * + * @type string + */ + protected $transport = self::TRANSPORT_TCP; + + /** + * The query protocol used to make the call + * + * @type string + */ + protected $protocol = 'tibia'; + + /** + * String name of this protocol class + * + * @type string + */ + protected $name = 'tibia'; + + /** + * Longer string name of this protocol class + * + * @type string + */ + protected $name_long = "Tibia"; + + /** + * The client join link + * + * @type string + */ + protected $join_link = "otserv://%s/%d/"; + + /** + * Normalize settings for this protocol + * + * @type array + */ + protected $normalize = [ + // General + 'general' => [ + // target => source + 'dedicated' => 'dedicated', + 'gametype' => 'server', + 'hostname' => 'servername', + 'motd' => 'motd', + 'maxplayers' => 'players_max', + 'numplayers' => 'players_online', + 'map' => 'map_name', + ], + ]; + + /** + * Process the response for the Tibia server + * + * @return array + * @throws \GameQ\Exception\Protocol + */ + public function processResponse() + { + // Merge the response packets + $xmlString = implode('', $this->packets_response); + + // Check to make sure this is will decode into a valid XML Document + if (($xmlDoc = @simplexml_load_string($xmlString)) === false) { + throw new Exception(__METHOD__ . " Unable to load XML string."); + } + + // Set the result to a new result instance + $result = new Result(); + + // All servers are dedicated as far as I can tell + $result->add('dedicated', 1); + + // Iterate over the info + foreach (['serverinfo', 'owner', 'map', 'npcs', 'monsters', 'players'] as $property) { + foreach ($xmlDoc->{$property}->attributes() as $key => $value) { + if (!in_array($property, ['serverinfo'])) { + $key = $property . '_' . $key; + } + + // Add the result + $result->add($key, (string)$value); + } + } + + $result->add("motd", (string)$xmlDoc->motd); + + unset($xmlDoc, $xmlDoc); + + return $result->fetch(); + } +} diff --git a/gameq/src/GameQ/Protocols/Tshock.php b/gameq/src/GameQ/Protocols/Tshock.php new file mode 100644 index 0000000..551a09e --- /dev/null +++ b/gameq/src/GameQ/Protocols/Tshock.php @@ -0,0 +1,157 @@ +. + */ +namespace GameQ\Protocols; + +use GameQ\Exception\Protocol as Exception; +use GameQ\Result; + +/** + * Tshock Protocol Class + * + * Result from this call should be a header + JSON response + * + * References: + * - https://tshock.atlassian.net/wiki/display/TSHOCKPLUGINS/REST+API+Endpoints#RESTAPIEndpoints-/status + * - http://tshock.co/xf/index.php?threads/rest-tshock-server-status-image.430/ + * + * Special thanks to intradox and Ruok2bu for game & protocol references + * + * @author Austin Bischoff + */ +class Tshock extends Http +{ + /** + * Packets to send + * + * @var array + */ + protected $packets = [ + self::PACKET_STATUS => "GET /v2/server/status?players=true&rules=true HTTP/1.0\r\nAccept: */*\r\n\r\n", + ]; + + /** + * The protocol being used + * + * @var string + */ + protected $protocol = 'tshock'; + + /** + * String name of this protocol class + * + * @var string + */ + protected $name = 'tshock'; + + /** + * Longer string name of this protocol class + * + * @var string + */ + protected $name_long = "Tshock"; + + /** + * Normalize some items + * + * @var array + */ + protected $normalize = [ + // General + 'general' => [ + // target => source + 'dedicated' => 'dedicated', + 'hostname' => 'hostname', + 'mapname' => 'world', + 'maxplayers' => 'maxplayers', + 'numplayers' => 'numplayers', + 'password' => 'password', + ], + // Individual + 'player' => [ + 'name' => 'nickname', + 'team' => 'team', + ], + ]; + + /** + * Process the response + * + * @return array + * @throws Exception + */ + public function processResponse() + { + if (empty($this->packets_response)) { + return []; + } + + // Implode and rip out the JSON + preg_match('/\{(.*)\}/ms', implode('', $this->packets_response), $matches); + + // Return should be JSON, let's validate + if (!isset($matches[0]) || ($json = json_decode($matches[0])) === null) { + throw new Exception("JSON response from Tshock protocol is invalid."); + } + + // Check the status response + if ($json->status != 200) { + throw new Exception("JSON status from Tshock protocol response was '{$json->status}', expected '200'."); + } + + $result = new Result(); + + // Server is always dedicated + $result->add('dedicated', 1); + + // Add server items + $result->add('hostname', $json->name); + $result->add('game_port', $json->port); + $result->add('serverversion', $json->serverversion); + $result->add('world', $json->world); + $result->add('uptime', $json->uptime); + $result->add('password', (int)$json->serverpassword); + $result->add('numplayers', $json->playercount); + $result->add('maxplayers', $json->maxplayers); + + // Parse players + foreach ($json->players as $player) { + $result->addPlayer('nickname', $player->nickname); + $result->addPlayer('username', $player->username); + $result->addPlayer('group', $player->group); + $result->addPlayer('active', (int)$player->active); + $result->addPlayer('state', $player->state); + $result->addPlayer('team', $player->team); + } + + // Make rules into simple array + $rules = []; + + // Parse rules + foreach ($json->rules as $rule => $value) { + // Add rule but convert boolean into int (0|1) + $rules[$rule] = (is_bool($value)) ? (int)$value : $value; + } + + // Add rules + $result->add('rules', $rules); + + unset($rules, $rule, $player, $value); + + return $result->fetch(); + } +} diff --git a/gameq/src/GameQ/Protocols/Unreal2.php b/gameq/src/GameQ/Protocols/Unreal2.php new file mode 100644 index 0000000..0ef0675 --- /dev/null +++ b/gameq/src/GameQ/Protocols/Unreal2.php @@ -0,0 +1,246 @@ +. + */ + +namespace GameQ\Protocols; + +use GameQ\Protocol; +use GameQ\Buffer; +use GameQ\Result; +use GameQ\Exception\Protocol as Exception; + +/** + * Unreal 2 Protocol class + * + * @author Austin Bischoff + */ +class Unreal2 extends Protocol +{ + + /** + * Array of packets we want to look up. + * Each key should correspond to a defined method in this or a parent class + * + * @type array + */ + protected $packets = [ + self::PACKET_DETAILS => "\x79\x00\x00\x00\x00", + self::PACKET_RULES => "\x79\x00\x00\x00\x01", + self::PACKET_PLAYERS => "\x79\x00\x00\x00\x02", + ]; + + /** + * Use the response flag to figure out what method to run + * + * @type array + */ + protected $responses = [ + "\x80\x00\x00\x00\x00" => "processDetails", // 0 + "\x80\x00\x00\x00\x01" => "processRules", // 1 + "\x80\x00\x00\x00\x02" => "processPlayers", // 2 + ]; + + /** + * The query protocol used to make the call + * + * @type string + */ + protected $protocol = 'unreal2'; + + /** + * String name of this protocol class + * + * @type string + */ + protected $name = 'unreal2'; + + /** + * Longer string name of this protocol class + * + * @type string + */ + protected $name_long = "Unreal 2"; + + /** + * Normalize settings for this protocol + * + * @type array + */ + protected $normalize = [ + // General + 'general' => [ + // target => source + 'dedicated' => 'ServerMode', + 'gametype' => 'gametype', + 'hostname' => 'servername', + 'mapname' => 'mapname', + 'maxplayers' => 'maxplayers', + 'numplayers' => 'numplayers', + 'password' => 'password', + ], + // Individual + 'player' => [ + 'name' => 'name', + 'score' => 'score', + ], + ]; + + /** + * Process the response + * + * @return array + * @throws \GameQ\Exception\Protocol + */ + public function processResponse() + { + + // Will hold the packets after sorting + $packets = []; + + // We need to pre-sort these for split packets so we can do extra work where needed + foreach ($this->packets_response as $response) { + $buffer = new Buffer($response); + + // Pull out the header + $header = $buffer->read(5); + + // Add the packet to the proper section, we will combine later + $packets[$header][] = $buffer->getBuffer(); + } + + unset($buffer); + + $results = []; + + // Now let's iterate and process + foreach ($packets as $header => $packetGroup) { + // Figure out which packet response this is + if (!array_key_exists($header, $this->responses)) { + throw new Exception(__METHOD__ . " response type '" . bin2hex($header) . "' is not valid"); + } + + // Now we need to call the proper method + $results = array_merge( + $results, + call_user_func_array([$this, $this->responses[$header]], [new Buffer(implode($packetGroup))]) + ); + } + + unset($packets); + + return $results; + } + + /* + * Internal methods + */ + + /** + * Handles processing the details data into a usable format + * + * @param \GameQ\Buffer $buffer + * + * @return mixed + * @throws \GameQ\Exception\Protocol + */ + protected function processDetails(Buffer $buffer) + { + + // Set the result to a new result instance + $result = new Result(); + + $result->add('serverid', $buffer->readInt32()); // 0 + $result->add('serverip', $buffer->readPascalString(1)); // empty + $result->add('gameport', $buffer->readInt32()); + $result->add('queryport', $buffer->readInt32()); // 0 + $result->add('servername', utf8_encode($buffer->readPascalString(1))); + $result->add('mapname', utf8_encode($buffer->readPascalString(1))); + $result->add('gametype', $buffer->readPascalString(1)); + $result->add('numplayers', $buffer->readInt32()); + $result->add('maxplayers', $buffer->readInt32()); + $result->add('ping', $buffer->readInt32()); // 0 + + unset($buffer); + + return $result->fetch(); + } + + /** + * Handles processing the player data into a usable format + * + * @param \GameQ\Buffer $buffer + * + * @return mixed + */ + protected function processPlayers(Buffer $buffer) + { + + // Set the result to a new result instance + $result = new Result(); + + // Parse players + while ($buffer->getLength()) { + // Player id + if (($id = $buffer->readInt32()) !== 0) { + // Add the results + $result->addPlayer('id', $id); + $result->addPlayer('name', utf8_encode($buffer->readPascalString(1))); + $result->addPlayer('ping', $buffer->readInt32()); + $result->addPlayer('score', $buffer->readInt32()); + + // Skip the next 4, unsure what they are for + $buffer->skip(4); + } + } + + unset($buffer, $id); + + return $result->fetch(); + } + + /** + * Handles processing the rules data into a usable format + * + * @param \GameQ\Buffer $buffer + * + * @return mixed + */ + protected function processRules(Buffer $buffer) + { + + // Set the result to a new result instance + $result = new Result(); + + // Named values + $inc = -1; + while ($buffer->getLength()) { + // Grab the key + $key = $buffer->readPascalString(1); + + // Make sure mutators don't overwrite each other + if ($key === 'Mutator') { + $key .= ++$inc; + } + + $result->add(strtolower($key), utf8_encode($buffer->readPascalString(1))); + } + + unset($buffer); + + return $result->fetch(); + } +} diff --git a/gameq/src/GameQ/Protocols/Unturned.php b/gameq/src/GameQ/Protocols/Unturned.php new file mode 100644 index 0000000..4829b37 --- /dev/null +++ b/gameq/src/GameQ/Protocols/Unturned.php @@ -0,0 +1,49 @@ +. + */ + +namespace GameQ\Protocols; + +/** + * Unturned Protocol Class + * + * @package GameQ\Protocols + * @author Austin Bischoff + */ +class Unturned extends Source +{ + /** + * String name of this protocol class + * + * @type string + */ + protected $name = 'unturned'; + + /** + * Longer string name of this protocol class + * + * @type string + */ + protected $name_long = "Unturned"; + + /** + * query_port = client_port + 1 + * + * @type int + */ + protected $port_diff = 1; +} diff --git a/gameq/src/GameQ/Protocols/Ut.php b/gameq/src/GameQ/Protocols/Ut.php new file mode 100644 index 0000000..75722ce --- /dev/null +++ b/gameq/src/GameQ/Protocols/Ut.php @@ -0,0 +1,73 @@ +. + */ + +namespace GameQ\Protocols; + +/** + * Unreal Tournament Protocol Class + * + * @author Austin Bischoff + */ +class Ut extends Gamespy +{ + + /** + * String name of this protocol class + * + * @type string + */ + protected $name = 'ut'; + + /** + * Longer string name of this protocol class + * + * @type string + */ + protected $name_long = "Unreal Tournament"; + + /** + * query_port = client_port + 1 + * + * @type int + */ + protected $port_diff = 1; + + /** + * Normalize settings for this protocol + * + * @type array + */ + protected $normalize = [ + // General + 'general' => [ + // target => source + 'dedicated' => 'dedicated', + 'gametype' => 'gametype', + 'hostname' => 'hostname', + 'mapname' => 'mapname', + 'maxplayers' => 'maxplayers', + 'numplayers' => 'numplayers', + 'password' => 'password', + ], + // Individual + 'player' => [ + 'name' => 'name', + 'score' => 'frags', + ], + ]; +} diff --git a/gameq/src/GameQ/Protocols/Ut2004.php b/gameq/src/GameQ/Protocols/Ut2004.php new file mode 100644 index 0000000..953089f --- /dev/null +++ b/gameq/src/GameQ/Protocols/Ut2004.php @@ -0,0 +1,42 @@ +. + */ + +namespace GameQ\Protocols; + +/** + * Unreal Tournament 2004 Protocol Class + * + * @author Austin Bischoff + */ +class Ut2004 extends Unreal2 +{ + + /** + * String name of this protocol class + * + * @type string + */ + protected $name = 'ut2004'; + + /** + * Longer string name of this protocol class + * + * @type string + */ + protected $name_long = "Unreal Tournament 2004"; +} diff --git a/gameq/src/GameQ/Protocols/Ut3.php b/gameq/src/GameQ/Protocols/Ut3.php new file mode 100644 index 0000000..b55cc34 --- /dev/null +++ b/gameq/src/GameQ/Protocols/Ut3.php @@ -0,0 +1,133 @@ +. + */ + +namespace GameQ\Protocols; + +/** + * Unreal Tournament 3 Protocol Class + * + * Note: The response from UT3 appears to not be consistent. Many times packets are incomplete or there are extra + * "echoes" in the responses. This may cause issues like odd characters showing up in the keys for the player and team + * array responses. Not sure much can be done about it. + * + * @author Austin Bischoff + */ +class Ut3 extends Gamespy3 +{ + + /** + * String name of this protocol class + * + * @type string + */ + protected $name = 'ut3'; + + /** + * Longer string name of this protocol class + * + * @type string + */ + protected $name_long = "Unreal Tournament 3"; + + /** + * Normalize settings for this protocol + * + * @type array + */ + protected $normalize = [ + // General + 'general' => [ + 'dedicated' => 'bIsDedicated', + 'hostname' => 'hostname', + 'numplayers' => 'numplayers', + ], + ]; + + /** + * Overload the response process so we can make some changes + * + * @return array + */ + public function processResponse() + { + + // Grab the result from the parent + /** @type array $result */ + $result = parent::processResponse(); + + // Move some stuff around + $this->renameResult($result, 'OwningPlayerName', 'hostname'); + $this->renameResult($result, 'p1073741825', 'mapname'); + $this->renameResult($result, 'p1073741826', 'gametype'); + $this->renameResult($result, 'p1073741827', 'servername'); + $this->renameResult($result, 'p1073741828', 'custom_mutators'); + $this->renameResult($result, 'gamemode', 'open'); + $this->renameResult($result, 's32779', 'gamemode'); + $this->renameResult($result, 's0', 'bot_skill'); + $this->renameResult($result, 's6', 'pure_server'); + $this->renameResult($result, 's7', 'password'); + $this->renameResult($result, 's8', 'vs_bots'); + $this->renameResult($result, 's10', 'force_respawn'); + $this->renameResult($result, 'p268435704', 'frag_limit'); + $this->renameResult($result, 'p268435705', 'time_limit'); + $this->renameResult($result, 'p268435703', 'numbots'); + $this->renameResult($result, 'p268435717', 'stock_mutators'); + + // Put custom mutators into an array + if (isset($result['custom_mutators'])) { + $result['custom_mutators'] = explode("\x1c", $result['custom_mutators']); + } + + // Delete some unknown stuff + $this->deleteResult($result, ['s1', 's9', 's11', 's12', 's13', 's14']); + + // Return the result + return $result; + } + + /** + * Dirty hack to rename result entries into something more useful + * + * @param array $result + * @param string $old + * @param string $new + */ + protected function renameResult(array &$result, $old, $new) + { + + // Check to see if the old item is there + if (isset($result[$old])) { + $result[$new] = $result[$old]; + unset($result[$old]); + } + } + + /** + * Dirty hack to delete result items + * + * @param array $result + * @param array $array + */ + protected function deleteResult(array &$result, array $array) + { + + foreach ($array as $key) { + unset($result[$key]); + } + } +} diff --git a/gameq/src/GameQ/Protocols/Ventrilo.php b/gameq/src/GameQ/Protocols/Ventrilo.php new file mode 100644 index 0000000..8a1e0e8 --- /dev/null +++ b/gameq/src/GameQ/Protocols/Ventrilo.php @@ -0,0 +1,877 @@ +. + */ + +namespace GameQ\Protocols; + +use GameQ\Protocol; +use GameQ\Result; +use GameQ\Exception\Protocol as Exception; + +/** + * Ventrilo Protocol Class + * + * Note that a password is not required for versions >= 3.0.3 + * + * All values are utf8 encoded upon processing + * + * This code ported from GameQ v1/v2. Credit to original author(s) as I just updated it to + * work within this new system. + * + * @author Austin Bischoff + */ +class Ventrilo extends Protocol +{ + + /** + * Array of packets we want to look up. + * Each key should correspond to a defined method in this or a parent class + * + * @type array + */ + protected $packets = [ + self::PACKET_ALL => + "V\xc8\xf4\xf9`\xa2\x1e\xa5M\xfb\x03\xccQN\xa1\x10\x95\xaf\xb2g\x17g\x812\xfbW\xfd\x8e\xd2\x22r\x034z\xbb\x98", + ]; + + /** + * The query protocol used to make the call + * + * @type string + */ + protected $protocol = 'ventrilo'; + + /** + * String name of this protocol class + * + * @type string + */ + protected $name = 'ventrilo'; + + /** + * Longer string name of this protocol class + * + * @type string + */ + protected $name_long = "Ventrilo"; + + /** + * The client join link + * + * @type string + */ + protected $join_link = "ventrilo://%s:%d/"; + + /** + * Normalize settings for this protocol + * + * @type array + */ + protected $normalize = [ + // General + 'general' => [ + 'dedicated' => 'dedicated', + 'password' => 'auth', + 'hostname' => 'name', + 'numplayers' => 'clientcount', + 'maxplayers' => 'maxclients', + ], + // Player + 'player' => [ + 'team' => 'cid', + 'name' => 'name', + ], + // Team + 'team' => [ + 'id' => 'cid', + 'name' => 'name', + ], + ]; + + /** + * Encryption table for the header + * + * @type array + */ + private $head_encrypt_table = [ + 0x80, + 0xe5, + 0x0e, + 0x38, + 0xba, + 0x63, + 0x4c, + 0x99, + 0x88, + 0x63, + 0x4c, + 0xd6, + 0x54, + 0xb8, + 0x65, + 0x7e, + 0xbf, + 0x8a, + 0xf0, + 0x17, + 0x8a, + 0xaa, + 0x4d, + 0x0f, + 0xb7, + 0x23, + 0x27, + 0xf6, + 0xeb, + 0x12, + 0xf8, + 0xea, + 0x17, + 0xb7, + 0xcf, + 0x52, + 0x57, + 0xcb, + 0x51, + 0xcf, + 0x1b, + 0x14, + 0xfd, + 0x6f, + 0x84, + 0x38, + 0xb5, + 0x24, + 0x11, + 0xcf, + 0x7a, + 0x75, + 0x7a, + 0xbb, + 0x78, + 0x74, + 0xdc, + 0xbc, + 0x42, + 0xf0, + 0x17, + 0x3f, + 0x5e, + 0xeb, + 0x74, + 0x77, + 0x04, + 0x4e, + 0x8c, + 0xaf, + 0x23, + 0xdc, + 0x65, + 0xdf, + 0xa5, + 0x65, + 0xdd, + 0x7d, + 0xf4, + 0x3c, + 0x4c, + 0x95, + 0xbd, + 0xeb, + 0x65, + 0x1c, + 0xf4, + 0x24, + 0x5d, + 0x82, + 0x18, + 0xfb, + 0x50, + 0x86, + 0xb8, + 0x53, + 0xe0, + 0x4e, + 0x36, + 0x96, + 0x1f, + 0xb7, + 0xcb, + 0xaa, + 0xaf, + 0xea, + 0xcb, + 0x20, + 0x27, + 0x30, + 0x2a, + 0xae, + 0xb9, + 0x07, + 0x40, + 0xdf, + 0x12, + 0x75, + 0xc9, + 0x09, + 0x82, + 0x9c, + 0x30, + 0x80, + 0x5d, + 0x8f, + 0x0d, + 0x09, + 0xa1, + 0x64, + 0xec, + 0x91, + 0xd8, + 0x8a, + 0x50, + 0x1f, + 0x40, + 0x5d, + 0xf7, + 0x08, + 0x2a, + 0xf8, + 0x60, + 0x62, + 0xa0, + 0x4a, + 0x8b, + 0xba, + 0x4a, + 0x6d, + 0x00, + 0x0a, + 0x93, + 0x32, + 0x12, + 0xe5, + 0x07, + 0x01, + 0x65, + 0xf5, + 0xff, + 0xe0, + 0xae, + 0xa7, + 0x81, + 0xd1, + 0xba, + 0x25, + 0x62, + 0x61, + 0xb2, + 0x85, + 0xad, + 0x7e, + 0x9d, + 0x3f, + 0x49, + 0x89, + 0x26, + 0xe5, + 0xd5, + 0xac, + 0x9f, + 0x0e, + 0xd7, + 0x6e, + 0x47, + 0x94, + 0x16, + 0x84, + 0xc8, + 0xff, + 0x44, + 0xea, + 0x04, + 0x40, + 0xe0, + 0x33, + 0x11, + 0xa3, + 0x5b, + 0x1e, + 0x82, + 0xff, + 0x7a, + 0x69, + 0xe9, + 0x2f, + 0xfb, + 0xea, + 0x9a, + 0xc6, + 0x7b, + 0xdb, + 0xb1, + 0xff, + 0x97, + 0x76, + 0x56, + 0xf3, + 0x52, + 0xc2, + 0x3f, + 0x0f, + 0xb6, + 0xac, + 0x77, + 0xc4, + 0xbf, + 0x59, + 0x5e, + 0x80, + 0x74, + 0xbb, + 0xf2, + 0xde, + 0x57, + 0x62, + 0x4c, + 0x1a, + 0xff, + 0x95, + 0x6d, + 0xc7, + 0x04, + 0xa2, + 0x3b, + 0xc4, + 0x1b, + 0x72, + 0xc7, + 0x6c, + 0x82, + 0x60, + 0xd1, + 0x0d, + ]; + + /** + * Encryption table for the data + * + * @type array + */ + private $data_encrypt_table = [ + 0x82, + 0x8b, + 0x7f, + 0x68, + 0x90, + 0xe0, + 0x44, + 0x09, + 0x19, + 0x3b, + 0x8e, + 0x5f, + 0xc2, + 0x82, + 0x38, + 0x23, + 0x6d, + 0xdb, + 0x62, + 0x49, + 0x52, + 0x6e, + 0x21, + 0xdf, + 0x51, + 0x6c, + 0x76, + 0x37, + 0x86, + 0x50, + 0x7d, + 0x48, + 0x1f, + 0x65, + 0xe7, + 0x52, + 0x6a, + 0x88, + 0xaa, + 0xc1, + 0x32, + 0x2f, + 0xf7, + 0x54, + 0x4c, + 0xaa, + 0x6d, + 0x7e, + 0x6d, + 0xa9, + 0x8c, + 0x0d, + 0x3f, + 0xff, + 0x6c, + 0x09, + 0xb3, + 0xa5, + 0xaf, + 0xdf, + 0x98, + 0x02, + 0xb4, + 0xbe, + 0x6d, + 0x69, + 0x0d, + 0x42, + 0x73, + 0xe4, + 0x34, + 0x50, + 0x07, + 0x30, + 0x79, + 0x41, + 0x2f, + 0x08, + 0x3f, + 0x42, + 0x73, + 0xa7, + 0x68, + 0xfa, + 0xee, + 0x88, + 0x0e, + 0x6e, + 0xa4, + 0x70, + 0x74, + 0x22, + 0x16, + 0xae, + 0x3c, + 0x81, + 0x14, + 0xa1, + 0xda, + 0x7f, + 0xd3, + 0x7c, + 0x48, + 0x7d, + 0x3f, + 0x46, + 0xfb, + 0x6d, + 0x92, + 0x25, + 0x17, + 0x36, + 0x26, + 0xdb, + 0xdf, + 0x5a, + 0x87, + 0x91, + 0x6f, + 0xd6, + 0xcd, + 0xd4, + 0xad, + 0x4a, + 0x29, + 0xdd, + 0x7d, + 0x59, + 0xbd, + 0x15, + 0x34, + 0x53, + 0xb1, + 0xd8, + 0x50, + 0x11, + 0x83, + 0x79, + 0x66, + 0x21, + 0x9e, + 0x87, + 0x5b, + 0x24, + 0x2f, + 0x4f, + 0xd7, + 0x73, + 0x34, + 0xa2, + 0xf7, + 0x09, + 0xd5, + 0xd9, + 0x42, + 0x9d, + 0xf8, + 0x15, + 0xdf, + 0x0e, + 0x10, + 0xcc, + 0x05, + 0x04, + 0x35, + 0x81, + 0xb2, + 0xd5, + 0x7a, + 0xd2, + 0xa0, + 0xa5, + 0x7b, + 0xb8, + 0x75, + 0xd2, + 0x35, + 0x0b, + 0x39, + 0x8f, + 0x1b, + 0x44, + 0x0e, + 0xce, + 0x66, + 0x87, + 0x1b, + 0x64, + 0xac, + 0xe1, + 0xca, + 0x67, + 0xb4, + 0xce, + 0x33, + 0xdb, + 0x89, + 0xfe, + 0xd8, + 0x8e, + 0xcd, + 0x58, + 0x92, + 0x41, + 0x50, + 0x40, + 0xcb, + 0x08, + 0xe1, + 0x15, + 0xee, + 0xf4, + 0x64, + 0xfe, + 0x1c, + 0xee, + 0x25, + 0xe7, + 0x21, + 0xe6, + 0x6c, + 0xc6, + 0xa6, + 0x2e, + 0x52, + 0x23, + 0xa7, + 0x20, + 0xd2, + 0xd7, + 0x28, + 0x07, + 0x23, + 0x14, + 0x24, + 0x3d, + 0x45, + 0xa5, + 0xc7, + 0x90, + 0xdb, + 0x77, + 0xdd, + 0xea, + 0x38, + 0x59, + 0x89, + 0x32, + 0xbc, + 0x00, + 0x3a, + 0x6d, + 0x61, + 0x4e, + 0xdb, + 0x29, + ]; + + /** + * Process the response + * + * @return array + * @throws \GameQ\Exception\Protocol + */ + public function processResponse() + { + + // We need to decrypt the packets + $decrypted = $this->decryptPackets($this->packets_response); + + // Now let us convert special characters from hex to ascii all at once + $decrypted = preg_replace_callback( + '|%([0-9A-F]{2})|', + function ($matches) { + + // Pack this into ascii + return pack('H*', $matches[1]); + }, + $decrypted + ); + + // Explode into lines + $lines = explode("\n", $decrypted); + + // Set the result to a new result instance + $result = new Result(); + + // Always dedicated + $result->add('dedicated', 1); + + // Defaults + $channelFields = 5; + $playerFields = 7; + + // Iterate over the lines + foreach ($lines as $line) { + // Trim all the outlying space + $line = trim($line); + + // We dont have anything in this line + if (strlen($line) == 0) { + continue; + } + + /** + * Everything is in this format: ITEM: VALUE + * + * Example: + * ... + * MAXCLIENTS: 175 + * VOICECODEC: 3,Speex + * VOICEFORMAT: 31,32 KHz%2C 16 bit%2C 9 Qlty + * UPTIME: 9167971 + * PLATFORM: Linux-i386 + * VERSION: 3.0.6 + * ... + */ + + // Check to see if we have a colon, every line should + if (($colon_pos = strpos($line, ":")) !== false && $colon_pos > 0) { + // Split the line into key/value pairs + list($key, $value) = explode(':', $line, 2); + + // Lower the font of the key + $key = strtolower($key); + + // Trim the value of extra space + $value = trim($value); + + // Switch and offload items as needed + switch ($key) { + case 'client': + $this->processPlayer($value, $playerFields, $result); + break; + + case 'channel': + $this->processChannel($value, $channelFields, $result); + break; + + // Find the number of fields for the channels + case 'channelfields': + $channelFields = count(explode(',', $value)); + break; + + // Find the number of fields for the players + case 'clientfields': + $playerFields = count(explode(',', $value)); + break; + + // By default we just add they key as an item + default: + $result->add($key, utf8_encode($value)); + break; + } + } + } + + unset($decrypted, $line, $lines, $colon_pos, $key, $value); + + return $result->fetch(); + } + + /* + * Internal methods + */ + + /** + * Decrypt the incoming packets + * + * @codeCoverageIgnore + * + * @param array $packets + * + * @return string + * @throws \GameQ\Exception\Protocol + */ + protected function decryptPackets(array $packets = []) + { + + // This will be returned + $decrypted = []; + + foreach ($packets as $packet) { + # Header : + $header = substr($packet, 0, 20); + + $header_items = []; + + $header_key = unpack("n1", $header); + + $key = array_shift($header_key); + + $chars = unpack("C*", substr($header, 2)); + + $a1 = $key & 0xFF; + $a2 = $key >> 8; + + if ($a1 == 0) { + throw new Exception(__METHOD__ . ": Header key is invalid"); + } + + $table = $this->head_encrypt_table; + + $characterCount = count($chars); + + $key = 0; + for ($i = 1; $i <= $characterCount; $i++) { + $chars[$i] -= ($table[$a2] + (($i - 1) % 5)) & 0xFF; + $a2 = ($a2 + $a1) & 0xFF; + if (($i % 2) == 0) { + $short_array = unpack("n1", pack("C2", $chars[$i - 1], $chars[$i])); + $header_items[$key] = $short_array[1]; + ++$key; + } + } + + $header_items = array_combine([ + 'zero', + 'cmd', + 'id', + 'totlen', + 'len', + 'totpck', + 'pck', + 'datakey', + 'crc', + ], $header_items); + + // Check to make sure the number of packets match + if ($header_items['totpck'] != count($packets)) { + throw new Exception(__METHOD__ . ": Too few packets received"); + } + + # Data : + $table = $this->data_encrypt_table; + $a1 = $header_items['datakey'] & 0xFF; + $a2 = $header_items['datakey'] >> 8; + + if ($a1 == 0) { + throw new Exception(__METHOD__ . ": Data key is invalid"); + } + + $chars = unpack("C*", substr($packet, 20)); + $data = ""; + $characterCount = count($chars); + + for ($i = 1; $i <= $characterCount; $i++) { + $chars[$i] -= ($table[$a2] + (($i - 1) % 72)) & 0xFF; + $a2 = ($a2 + $a1) & 0xFF; + $data .= chr($chars[$i]); + } + //@todo: Check CRC ??? + $decrypted[$header_items['pck']] = $data; + } + + // Return the decrypted packets as one string + return implode('', $decrypted); + } + + /** + * Process the channel listing + * + * @param string $data + * @param int $fieldCount + * @param \GameQ\Result $result + */ + protected function processChannel($data, $fieldCount, Result &$result) + { + + // Split the items on the comma + $items = explode(",", $data, $fieldCount); + + // Iterate over the items for this channel + foreach ($items as $item) { + // Split the key=value pair + list($key, $value) = explode("=", $item, 2); + + $result->addTeam(strtolower($key), utf8_encode($value)); + } + } + + /** + * Process the user listing + * + * @param string $data + * @param int $fieldCount + * @param \GameQ\Result $result + */ + protected function processPlayer($data, $fieldCount, Result &$result) + { + + // Split the items on the comma + $items = explode(",", $data, $fieldCount); + + // Iterate over the items for this player + foreach ($items as $item) { + // Split the key=value pair + list($key, $value) = explode("=", $item, 2); + + $result->addPlayer(strtolower($key), utf8_encode($value)); + } + } +} diff --git a/gameq/src/GameQ/Protocols/Warsow.php b/gameq/src/GameQ/Protocols/Warsow.php new file mode 100644 index 0000000..f1d629a --- /dev/null +++ b/gameq/src/GameQ/Protocols/Warsow.php @@ -0,0 +1,96 @@ +. + */ + +namespace GameQ\Protocols; + +use GameQ\Buffer; +use GameQ\Result; + +/** + * Warsow Protocol Class + * + * @package GameQ\Protocols + * @author Austin Bischoff + */ +class Warsow extends Quake3 +{ + /** + * String name of this protocol class + * + * @type string + */ + protected $name = 'warsow'; + + /** + * Longer string name of this protocol class + * + * @type string + */ + protected $name_long = "Warsow"; + + /** + * The client join link + * + * @type string + */ + protected $join_link = "warsow://%s:%d/"; + + /** + * Handle player info, different than quake3 base + * + * @param Buffer $buffer + * + * @return array + * @throws \GameQ\Exception\Protocol + */ + protected function processPlayers(Buffer $buffer) + { + // Set the result to a new result instance + $result = new Result(); + + // Loop until we are out of data + while ($buffer->getLength()) { + // Make a new buffer with this block + $playerInfo = new Buffer($buffer->readString("\x0A")); + + // Add player info + $result->addPlayer('frags', $playerInfo->readString("\x20")); + $result->addPlayer('ping', $playerInfo->readString("\x20")); + + // Skip first " + $playerInfo->skip(1); + + // Add player name, encoded + $result->addPlayer('name', utf8_encode(trim(($playerInfo->readString('"'))))); + + // Skip space + $playerInfo->skip(1); + + // Add team + $result->addPlayer('team', $playerInfo->read()); + + // Clear + unset($playerInfo); + } + + // Clear + unset($buffer); + + return $result->fetch(); + } +} diff --git a/gameq/src/GameQ/Protocols/Won.php b/gameq/src/GameQ/Protocols/Won.php new file mode 100644 index 0000000..bef0984 --- /dev/null +++ b/gameq/src/GameQ/Protocols/Won.php @@ -0,0 +1,66 @@ +. + */ + +namespace GameQ\Protocols; + +/** + * World Opponent Network (WON) class + * + * Pre-cursor to the A2S (source) protocol system + * + * @author Nikolay Ipanyuk + * @author Austin Bischoff + * + * @package GameQ\Protocols + */ +class Won extends Source +{ + + /** + * Array of packets we want to look up. + * Each key should correspond to a defined method in this or a parent class + * + * @type array + */ + protected $packets = [ + self::PACKET_DETAILS => "\xFF\xFF\xFF\xFFdetails\x00", + self::PACKET_PLAYERS => "\xFF\xFF\xFF\xFFplayers", + self::PACKET_RULES => "\xFF\xFF\xFF\xFFrules", + ]; + + /** + * The query protocol used to make the call + * + * @type string + */ + protected $protocol = 'won'; + + /** + * String name of this protocol class + * + * @type string + */ + protected $name = 'won'; + + /** + * Longer string name of this protocol class + * + * @type string + */ + protected $name_long = "World Opponent Network"; +} diff --git a/gameq/src/GameQ/Protocols/Wurm.php b/gameq/src/GameQ/Protocols/Wurm.php new file mode 100644 index 0000000..c593652 --- /dev/null +++ b/gameq/src/GameQ/Protocols/Wurm.php @@ -0,0 +1,42 @@ +. + */ + +namespace GameQ\Protocols; + +/** + * Wurm Unlimited Protocol Class + * + * @package GameQ\Protocols + * @author Austin Bischoff + */ +class Wurm extends Source +{ + /** + * String name of this protocol class + * + * @type string + */ + protected $name = 'wurm'; + + /** + * Longer string name of this protocol class + * + * @type string + */ + protected $name_long = "Wurm Unlimited"; +} diff --git a/gameq/src/GameQ/Query/Core.php b/gameq/src/GameQ/Query/Core.php new file mode 100644 index 0000000..5eb08ad --- /dev/null +++ b/gameq/src/GameQ/Query/Core.php @@ -0,0 +1,164 @@ +. + */ + +namespace GameQ\Query; + +/** + * Core for the query mechanisms + * + * @author Austin Bischoff + */ +abstract class Core +{ + + /** + * The socket used by this resource + * + * @type null|resource + */ + public $socket = null; + + /** + * The transport type (udp, tcp, etc...) + * See http://php.net/manual/en/transports.php for the supported list + * + * @type string + */ + protected $transport = null; + + /** + * Connection IP address + * + * @type string + */ + protected $ip = null; + + /** + * Connection port + * + * @type int + */ + protected $port = null; + + /** + * The time in seconds to wait before timing out while connecting to the socket + * + * @type int + */ + protected $timeout = 3; // Seconds + + /** + * Socket is blocking? + * + * @type bool + */ + protected $blocking = false; + + /** + * Called when the class is cloned + */ + public function __clone() + { + + // Reset the properties for this class when cloned + $this->reset(); + } + + /** + * Set the connection information for the socket + * + * @param string $transport + * @param string $ip + * @param int $port + * @param int $timeout seconds + * @param bool $blocking + */ + public function set($transport, $ip, $port, $timeout = 3, $blocking = false) + { + + $this->transport = $transport; + + $this->ip = $ip; + + $this->port = $port; + + $this->timeout = $timeout; + + $this->blocking = $blocking; + } + + /** + * Reset this instance's properties + */ + public function reset() + { + + $this->transport = null; + + $this->ip = null; + + $this->port = null; + + $this->timeout = 3; + + $this->blocking = false; + } + + /** + * Create a new socket + * + * @return void + */ + abstract protected function create(); + + /** + * Get the socket + * + * @return mixed + */ + abstract public function get(); + + /** + * Write data to the socket + * + * @param string $data + * + * @return int The number of bytes written + */ + abstract public function write($data); + + /** + * Close the socket + * + * @return void + */ + abstract public function close(); + + /** + * Read the responses from the socket(s) + * + * @SuppressWarnings(PHPMD.UnusedFormalParameter) + * + * @param array $sockets + * @param int $timeout + * @param int $stream_timeout + * + * @return array + */ + abstract public function getResponses(array $sockets, $timeout, $stream_timeout); +} diff --git a/gameq/src/GameQ/Query/Native.php b/gameq/src/GameQ/Query/Native.php new file mode 100644 index 0000000..b078c9c --- /dev/null +++ b/gameq/src/GameQ/Query/Native.php @@ -0,0 +1,221 @@ +. + */ + +namespace GameQ\Query; + +use GameQ\Exception\Query as Exception; + +/** + * Native way of querying servers + * + * @author Austin Bischoff + */ +class Native extends Core +{ + /** + * Get the current socket or create one and return + * + * @return resource|null + * @throws \GameQ\Exception\Query + */ + public function get() + { + + // No socket for this server, make one + if (is_null($this->socket)) { + $this->create(); + } + + return $this->socket; + } + + /** + * Write data to the socket + * + * @param string $data + * + * @return int The number of bytes written + * @throws \GameQ\Exception\Query + */ + public function write($data) + { + + try { + // No socket for this server, make one + if (is_null($this->socket)) { + $this->create(); + } + + // Send the packet + return fwrite($this->socket, $data); + } catch (\Exception $e) { + throw new Exception($e->getMessage(), $e->getCode(), $e); + } + } + + /** + * Close the current socket + */ + public function close() + { + + if ($this->socket) { + fclose($this->socket); + $this->socket = null; + } + } + + /** + * Create a new socket for this query + * + * @throws \GameQ\Exception\Query + */ + protected function create() + { + + // Create the remote address + $remote_addr = sprintf("%s://%s:%d", $this->transport, $this->ip, $this->port); + + // Create context + $context = stream_context_create([ + 'socket' => [ + 'bindto' => '0:0', // Bind to any available IP and OS decided port + ], + ]); + + // Define these first + $errno = null; + $errstr = null; + + // Create the socket + if (($this->socket = + @stream_socket_client($remote_addr, $errno, $errstr, $this->timeout, STREAM_CLIENT_CONNECT, $context)) + !== false + ) { + // Set the read timeout on the streams + stream_set_timeout($this->socket, $this->timeout); + + // Set blocking mode + stream_set_blocking($this->socket, $this->blocking); + } else { + // Reset socket + $this->socket = null; + + // Something bad happened, throw query exception + throw new Exception( + __METHOD__ . " - Error creating socket to server {$this->ip}:{$this->port}. Error: " . $errstr, + $errno + ); + } + } + + /** + * Pull the responses out of the stream + * + * @SuppressWarnings(PHPMD.CyclomaticComplexity) + * @SuppressWarnings(PHPMD.NPathComplexity) + * + * @param array $sockets + * @param int $timeout + * @param int $stream_timeout + * + * @return array Raw responses + */ + public function getResponses(array $sockets, $timeout, $stream_timeout) + { + + // Set the loop to active + $loop_active = true; + + // Will hold the responses read from the sockets + $responses = []; + + // To store the sockets + $sockets_tmp = []; + + // Loop and pull out all the actual sockets we need to listen on + foreach ($sockets as $socket_id => $socket_data) { + // Get the socket + /* @var $socket \GameQ\Query\Core */ + $socket = $socket_data['socket']; + + // Append the actual socket we are listening to + $sockets_tmp[$socket_id] = $socket->get(); + + unset($socket); + } + + // Init some variables + $read = $sockets_tmp; + $write = null; + $except = null; + + // Check to see if $read is empty, if so stream_select() will throw a warning + if (empty($read)) { + return $responses; + } + + // This is when it should stop + $time_stop = microtime(true) + $timeout; + + // Let's loop until we break something. + while ($loop_active && microtime(true) < $time_stop) { + // Check to make sure $read is not empty, if so we are done + if (empty($read)) { + break; + } + + // Now lets listen for some streams, but do not cross the streams! + $streams = stream_select($read, $write, $except, 0, $stream_timeout); + + // We had error or no streams left, kill the loop + if ($streams === false || ($streams <= 0)) { + break; + } + + // Loop the sockets that received data back + foreach ($read as $socket) { + /* @var $socket resource */ + + // See if we have a response + if (($response = fread($socket, 8192)) === false) { + continue; // No response yet so lets continue. + } + + // Check to see if the response is empty, if so we are done with this server + if (strlen($response) == 0) { + // Remove this server from any future read loops + unset($sockets_tmp[(int)$socket]); + continue; + } + + // Add the response we got back + $responses[(int)$socket][] = $response; + } + + // Because stream_select modifies read we need to reset it each time to the original array of sockets + $read = $sockets_tmp; + } + + // Free up some memory + unset($streams, $read, $write, $except, $sockets_tmp, $time_stop, $response); + + // Return all of the responses, may be empty if something went wrong + return $responses; + } +} diff --git a/gameq/src/GameQ/Result.php b/gameq/src/GameQ/Result.php new file mode 100644 index 0000000..1fe33d8 --- /dev/null +++ b/gameq/src/GameQ/Result.php @@ -0,0 +1,127 @@ +. + */ + +namespace GameQ; + +/** + * Provide an interface for easy storage of a parsed server response + * + * @author Aidan Lister + * @author Tom Buskens + */ +class Result +{ + + /** + * Formatted server response + * + * @var array + */ + protected $result = []; + + /** + * Adds variable to results + * + * @param string $name Variable name + * @param string $value Variable value + */ + public function add($name, $value) + { + + $this->result[$name] = $value; + } + + /** + * Adds player variable to output + * + * @param string $name Variable name + * @param string $value Variable value + */ + public function addPlayer($name, $value) + { + + $this->addSub('players', $name, $value); + } + + /** + * Adds player variable to output + * + * @param string $name Variable name + * @param string $value Variable value + */ + public function addTeam($name, $value) + { + + $this->addSub('teams', $name, $value); + } + + /** + * Add a variable to a category + * + * @param $sub string The category + * @param $key string The variable name + * @param $value string The variable value + */ + public function addSub($sub, $key, $value) + { + + // Nothing of this type yet, set an empty array + if (!isset($this->result[$sub]) or !is_array($this->result[$sub])) { + $this->result[$sub] = []; + } + + // Find the first entry that doesn't have this variable + $found = false; + for ($i = 0; $i != count($this->result[$sub]); $i++) { + if (!isset($this->result[$sub][$i][$key])) { + $this->result[$sub][$i][$key] = $value; + $found = true; + break; + } + } + + // Not found, create a new entry + if (!$found) { + $this->result[$sub][][$key] = $value; + } + } + + /** + * Return all stored results + * + * @return array All results + */ + public function fetch() + { + + return $this->result; + } + + /** + * Return a single variable + * + * @param string $var The variable name + * + * @return mixed The variable value + */ + public function get($var) + { + + return isset($this->result[$var]) ? $this->result[$var] : null; + } +} diff --git a/gameq/src/GameQ/Server.php b/gameq/src/GameQ/Server.php new file mode 100644 index 0000000..dff8f77 --- /dev/null +++ b/gameq/src/GameQ/Server.php @@ -0,0 +1,380 @@ +. + */ + +namespace GameQ; + +use GameQ\Exception\Server as Exception; + +/** + * Server class to represent each server entity + * + * @author Austin Bischoff + */ +class Server +{ + + /* + * Server array keys + */ + const SERVER_TYPE = 'type'; + + const SERVER_HOST = 'host'; + + const SERVER_ID = 'id'; + + const SERVER_OPTIONS = 'options'; + + /* + * Server options keys + */ + + /* + * Use this option when the query_port and client connect ports are different + */ + const SERVER_OPTIONS_QUERY_PORT = 'query_port'; + + /** + * The protocol class for this server + * + * @type \GameQ\Protocol + */ + protected $protocol = null; + + /** + * Id of this server + * + * @type string + */ + public $id = null; + + /** + * IP Address of this server + * + * @type string + */ + public $ip = null; + + /** + * The server's client port (connect port) + * + * @type int + */ + public $port_client = null; + + /** + * The server's query port + * + * @type int + */ + public $port_query = null; + + /** + * Holds other server specific options + * + * @type array + */ + protected $options = []; + + /** + * Holds the sockets already open for this server + * + * @type array + */ + protected $sockets = []; + + /** + * Construct the class with the passed options + * + * @param array $server_info + * + * @throws \GameQ\Exception\Server + */ + public function __construct(array $server_info = []) + { + + // Check for server type + if (!array_key_exists(self::SERVER_TYPE, $server_info) || empty($server_info[self::SERVER_TYPE])) { + throw new Exception("Missing server info key '" . self::SERVER_TYPE . "'!"); + } + + // Check for server host + if (!array_key_exists(self::SERVER_HOST, $server_info) || empty($server_info[self::SERVER_HOST])) { + throw new Exception("Missing server info key '" . self::SERVER_HOST . "'!"); + } + + // IP address and port check + $this->checkAndSetIpPort($server_info[self::SERVER_HOST]); + + // Check for server id + if (array_key_exists(self::SERVER_ID, $server_info) && !empty($server_info[self::SERVER_ID])) { + // Set the server id + $this->id = $server_info[self::SERVER_ID]; + } else { + // Make an id so each server has an id when returned + $this->id = sprintf('%s:%d', $this->ip, $this->port_client); + } + + // Check and set server options + if (array_key_exists(self::SERVER_OPTIONS, $server_info)) { + // Set the options + $this->options = $server_info[self::SERVER_OPTIONS]; + } + + try { + // Make the protocol class for this type + $class = new \ReflectionClass( + sprintf('GameQ\\Protocols\\%s', ucfirst(strtolower($server_info[self::SERVER_TYPE]))) + ); + + $this->protocol = $class->newInstanceArgs([$this->options]); + } catch (\ReflectionException $e) { + throw new Exception("Unable to locate Protocols class for '{$server_info[self::SERVER_TYPE]}'!"); + } + + // Check and set any server options + $this->checkAndSetServerOptions(); + + unset($server_info, $class); + } + + /** + * Check and set the ip address for this server + * + * @param $ip_address + * + * @throws \GameQ\Exception\Server + */ + protected function checkAndSetIpPort($ip_address) + { + + // Test for IPv6 + if (substr_count($ip_address, ':') > 1) { + // See if we have a port, input should be in the format [::1]:27015 or similar + if (strstr($ip_address, ']:')) { + // Explode to get port + $server_addr = explode(':', $ip_address); + + // Port is the last item in the array, remove it and save + $this->port_client = (int)array_pop($server_addr); + + // The rest is the address, recombine + $this->ip = implode(':', $server_addr); + + unset($server_addr); + } else { + // Just the IPv6 address, no port defined, fail + throw new Exception( + "The host address '{$ip_address}' is missing the port. All " + . "servers must have a port defined!" + ); + } + + // Now let's validate the IPv6 value sent, remove the square brackets ([]) first + if (!filter_var(trim($this->ip, '[]'), FILTER_VALIDATE_IP, ['flags' => FILTER_FLAG_IPV6,])) { + throw new Exception("The IPv6 address '{$this->ip}' is invalid."); + } + } else { + // We have IPv4 with a port defined + if (strstr($ip_address, ':')) { + list($this->ip, $this->port_client) = explode(':', $ip_address); + + // Type case the port + $this->port_client = (int)$this->port_client; + } else { + // No port, fail + throw new Exception( + "The host address '{$ip_address}' is missing the port. All " + . "servers must have a port defined!" + ); + } + + // Validate the IPv4 value, if FALSE is not a valid IP, maybe a hostname. Try to resolve + if (!filter_var($this->ip, FILTER_VALIDATE_IP, ['flags' => FILTER_FLAG_IPV4,]) + && $this->ip === gethostbyname($this->ip) + ) { + // When gethostbyname() fails it returns the original string + // so if ip and the result from gethostbyname() are equal this failed. + throw new Exception("Unable to resolve the host '{$this->ip}' to an IP address."); + } + } + } + + /** + * Check and set any server specific options + */ + protected function checkAndSetServerOptions() + { + + // Specific query port defined + if (array_key_exists(self::SERVER_OPTIONS_QUERY_PORT, $this->options)) { + $this->port_query = (int)$this->options[self::SERVER_OPTIONS_QUERY_PORT]; + } else { + // Do math based on the protocol class + $this->port_query = $this->protocol->findQueryPort($this->port_client); + } + } + + /** + * Set an option for this server + * + * @param $key + * @param $value + * + * @return $this + */ + public function setOption($key, $value) + { + + $this->options[$key] = $value; + + return $this; // Make chainable + } + + /** + * Return set option value + * + * @param mixed $key + * + * @return mixed + */ + public function getOption($key) + { + + return (array_key_exists($key, $this->options)) ? $this->options[$key] : null; + } + + /** + * Get the ID for this server + * + * @return string + */ + public function id() + { + + return $this->id; + } + + /** + * Get the IP address for this server + * + * @return string + */ + public function ip() + { + + return $this->ip; + } + + /** + * Get the client port for this server + * + * @return int + */ + public function portClient() + { + + return $this->port_client; + } + + /** + * Get the query port for this server + * + * @return int + */ + public function portQuery() + { + + return $this->port_query; + } + + /** + * Return the protocol class for this server + * + * @return \GameQ\Protocol + */ + public function protocol() + { + + return $this->protocol; + } + + /** + * Get the join link for this server + * + * @return string + */ + public function getJoinLink() + { + + return sprintf($this->protocol->joinLink(), $this->ip, $this->portClient()); + } + + /* + * Socket holding + */ + + /** + * Add a socket for this server to be reused + * + * @codeCoverageIgnore + * + * @param \GameQ\Query\Core $socket + */ + public function socketAdd(Query\Core $socket) + { + + $this->sockets[] = $socket; + } + + /** + * Get a socket from the list to reuse, if any are available + * + * @codeCoverageIgnore + * + * @return \GameQ\Query\Core|null + */ + public function socketGet() + { + + $socket = null; + + if (count($this->sockets) > 0) { + $socket = array_pop($this->sockets); + } + + return $socket; + } + + /** + * Clear any sockets still listed and attempt to close them + * + * @codeCoverageIgnore + */ + public function socketCleanse() + { + + // Close all of the sockets available + foreach ($this->sockets as $socket) { + /* @var $socket \GameQ\Query\Core */ + $socket->close(); + } + + // Reset the sockets list + $this->sockets = []; + } +} diff --git a/gameq/stat.php b/gameq/stat.php new file mode 100644 index 0000000..bbd13a0 --- /dev/null +++ b/gameq/stat.php @@ -0,0 +1,157 @@ + // echo "; +// echo $readjson
"; + //$data1 = json_decode("$readjson", true); +//echo "

//Print data1

" ; + //print_r($data1); +///echo "
"; + +$data = json_decode($readjson); +// class +$name = $data->{'name'}; +$map = $data->{'map'}; +$password = $data->{'password'}; +$game = $data->{'raw'}->{'game'}; +$secure = $data->{'raw'}->{'secure'}; +$numplayers = $data->{'raw'}->{'numplayers'}; +$numplayersText = "☠ $numplayers "; +$version = $data->{'raw'}->{'version'}; +$tags = $data->{'raw'}->{'tags'}; +$dedicated = $data->{'raw'}->{'rules'}->{'dedicated'}; +$island = $data->{'raw'}->{'rules'}->{'island'}; +$connect = $data->{'connect'}; +$ping = $data->{'ping'}; +$time = "$tags[38]$tags[39]:$tags[41]$tags[42]"; +$battleye = substr($tags,0,8); +$batlecheck = "ACTIF"; +$hive = substr($tags,18,8); +$players = $data->{'players'}; + + +//if(empty($players)) +// $players = "0"; +//if (empty($players)) { "0"; } +//$players = $data->{'array_filter($players)'}; + +?> + + + + + Dayz ToX Server: <?php echo"${name}"; ?> + + + + + + + + + + + + + + + + + + + + + +
+ Server Name IP server Ping Time Player Info Joueurs Version Battleye
+
+
+ + + + + + + + + + + +
Players Info Debug
Nameprint_r ";print_r($players); + +?> +
+ + + + + diff --git a/gameq/tests/Buffer.php b/gameq/tests/Buffer.php new file mode 100644 index 0000000..8dd7ff9 --- /dev/null +++ b/gameq/tests/Buffer.php @@ -0,0 +1,257 @@ +. + */ + +namespace GameQ\Tests; + +/** + * Buffer test class + * + * @package GameQ\Tests + */ +class Buffer extends TestBase +{ + /** + * Build a mock Buffer + * + * @param string $data + * @param string $number_type + * + * @return \GameQ\Buffer + */ + protected function buildBuffer($data, $number_type = 'm') + { + + return new \GameQ\Buffer($data, $number_type); + } + + /** + * Data provider for all of the integer testing. Loads external files since the file format has to be in + * ascii format for the tests to work correctly + * + * @return array + */ + public function integerDataProvider() + { + + // Make the base path for the data to test since it has to be in ascii form + $basePath = sprintf('%s/Providers/Buffer', __DIR__); + + // Build the result array + $dataSet = [ + [ 'readInt8', 'm', sprintf('%s/8bitunsigned_1.txt', $basePath), 214 ], + [ 'readInt8', 'm', sprintf('%s/8bitunsigned_2.txt', $basePath), 14 ], + [ 'readInt8', 'le', sprintf('%s/8bitunsigned_1.txt', $basePath), 214 ], + [ 'readInt8', 'le', sprintf('%s/8bitunsigned_2.txt', $basePath), 14 ], + [ 'readInt8Signed', 'm', sprintf('%s/8bitsigned_1.txt', $basePath), 56 ], + [ 'readInt8Signed', 'm', sprintf('%s/8bitsigned_2.txt', $basePath), -47 ], + [ 'readInt8Signed', 'le', sprintf('%s/8bitsigned_1.txt', $basePath), 56 ], + [ 'readInt8Signed', 'le', sprintf('%s/8bitsigned_2.txt', $basePath), -47 ], + [ 'readInt16', 'm', sprintf('%s/16bitunsigned_1.txt', $basePath), 54844 ], + [ 'readInt16', 'm', sprintf('%s/16bitunsigned_2.txt', $basePath), 1474 ], + [ 'readInt16', 'le', sprintf('%s/16bitunsigned_1.txt', $basePath), 54844 ], + [ 'readInt16', 'le', sprintf('%s/16bitunsigned_2.txt', $basePath), 1474 ], + [ 'readInt16', 'be', sprintf('%s/16bitunsigned_be_1.txt', $basePath), 54844 ], + [ 'readInt16', 'be', sprintf('%s/16bitunsigned_be_2.txt', $basePath), 1474 ], + [ 'readInt16Signed', 'm', sprintf('%s/16bitsigned_1.txt', $basePath), 24574 ], + [ 'readInt16Signed', 'm', sprintf('%s/16bitsigned_2.txt', $basePath), -5478 ], + [ 'readInt16Signed', 'le', sprintf('%s/16bitsigned_1.txt', $basePath), 24574 ], + [ 'readInt16Signed', 'le', sprintf('%s/16bitsigned_2.txt', $basePath), -5478 ], + [ 'readInt16Signed', 'be', sprintf('%s/16bitsigned_be_1.txt', $basePath), 24574 ], + [ 'readInt16Signed', 'be', sprintf('%s/16bitsigned_be_2.txt', $basePath), -5478 ], + [ 'readInt32', 'm', sprintf('%s/32bitunsigned_1.txt', $basePath), 3248547147 ], + [ 'readInt32', 'm', sprintf('%s/32bitunsigned_2.txt', $basePath), 1247612474 ], + [ 'readInt32', 'le', sprintf('%s/32bitunsigned_1.txt', $basePath), 3248547147 ], + [ 'readInt32', 'le', sprintf('%s/32bitunsigned_2.txt', $basePath), 1247612474 ], + [ 'readInt32', 'be', sprintf('%s/32bitunsigned_be_1.txt', $basePath), 3248547147 ], + [ 'readInt32', 'be', sprintf('%s/32bitunsigned_be_2.txt', $basePath), 1247612474 ], + [ 'readInt32Signed', 'm', sprintf('%s/32bitsigned_1.txt', $basePath), 1247965816 ], + [ 'readInt32Signed', 'm', sprintf('%s/32bitsigned_2.txt', $basePath), -1547872147 ], + [ 'readInt32Signed', 'le', sprintf('%s/32bitsigned_1.txt', $basePath), 1247965816 ], + [ 'readInt32Signed', 'le', sprintf('%s/32bitsigned_2.txt', $basePath), -1547872147 ], + [ 'readInt32Signed', 'be', sprintf('%s/32bitsigned_be_1.txt', $basePath), 1247965816 ], + [ 'readInt32Signed', 'be', sprintf('%s/32bitsigned_be_2.txt', $basePath), -1547872147 ], + [ 'readFloat32', 'm', sprintf('%s/32float_1.txt', $basePath), 0.15474000573158264 ], + [ 'readFloat32', 'm', sprintf('%s/32float_2.txt', $basePath), -254.01409912109375 ], + [ 'readFloat32', 'le', sprintf('%s/32float_1.txt', $basePath), 0.15474000573158264 ], + [ 'readFloat32', 'le', sprintf('%s/32float_2.txt', $basePath), -254.01409912109375 ], + [ 'readFloat32', 'be', sprintf('%s/32float_be_1.txt', $basePath), 0.15474000573158264 ], + [ 'readFloat32', 'be', sprintf('%s/32float_be_2.txt', $basePath), -254.01409912109375 ], + ]; + + // We are on 64-bit os + if (PHP_INT_SIZE == 8) { + // Add 64-bit tests + $dataSet[] = [ 'readInt64', 'm', sprintf('%s/64bitunsigned_1.txt', $basePath), 90094348778156039 ]; + $dataSet[] = [ 'readInt64', 'm', sprintf('%s/64bitunsigned_2.txt', $basePath), 240 ]; + $dataSet[] = [ 'readInt64', 'le', sprintf('%s/64bitunsigned_1.txt', $basePath), 90094348778156039 ]; + $dataSet[] = [ 'readInt64', 'le', sprintf('%s/64bitunsigned_2.txt', $basePath), 240 ]; + $dataSet[] = [ 'readInt64', 'be', sprintf('%s/64bitunsigned_be_1.txt', $basePath), 90094348778156039 ]; + $dataSet[] = [ 'readInt64', 'be', sprintf('%s/64bitunsigned_be_2.txt', $basePath), 240 ]; + } + + return $dataSet; + } + + /** + * Test general methods for the Buffer class + */ + public function testGeneral() + { + + $data = "Some Kind of buffer"; + + $buffer = $this->buildBuffer($data); + + // Test buffer and string are equal + $this->assertEquals($data, $buffer->getData(), 'Test string and buffer are not the same'); + + // Test length is set correctly + $this->assertEquals(strlen($data), $buffer->getLength(), 'Test string and buffer length do not match'); + } + + /** + * Test various buffer reads + * + * @depends testGeneral + */ + public function testRead() + { + + $data = "Buffer of data"; + + $buffer = $this->buildBuffer($data); + + // Test look ahead default + $this->assertEquals(substr($data, 0, 1), $buffer->lookAhead()); + + // Test longer look ahead + $this->assertEquals(substr($data, 0, 4), $buffer->lookAhead(4)); + + // Test default is one character + $this->assertEquals(substr($data, 0, 1), $buffer->read()); + + // Test multiple character read + $this->assertEquals(substr($data, 1, 5), $buffer->read(5)); + + // Read last character out of the buffer + $this->assertEquals(substr($data, -1, 1), $buffer->readLast()); + + // Get the remainder of the buffer + $this->assertEquals(substr($data, 6, -1), $buffer->getBuffer()); + } + + /** + * Test for index positions + * + * @depends testRead + */ + public function testPosition() + { + + $data = "Some like My Strings..."; + + $buffer = $this->buildBuffer($data); + + // Test basic index position + $this->assertEquals(0, $buffer->getPosition()); + + // Jump in the index + $buffer->jumpto(8); + + // Make sure the index is correct returned + $this->assertEquals(8, $buffer->getPosition()); + + // Reset + $buffer->jumpto(0); + + // Test skip default + $buffer->skip(); + + $this->assertEquals(substr($data, 1), $buffer->getBuffer()); + + // Skip multiple + $buffer->skip(3); + + $this->assertEquals(substr($data, 4), $buffer->getBuffer()); + } + + /** + * Test for proper read exception + * + * @depends testRead + * + * @expectedException \Exception + * @expectedExceptionMessage Unable to read length=6 from buffer. Bad protocol format or return? + */ + public function testReadException() + { + + $buffer = $this->buildBuffer("12345"); + + // Try to read a longer length than the buffer has in it + $buffer->read(6); + } + + /** + * Test reading some strings + * + * @depends testRead + */ + public function testReadString() + { + + $data = "This is string 1\x00This is string 2\x00"; + + $buffer = $this->buildBuffer($data); + + // Read first + $this->assertEquals('This is string 1', $buffer->readString()); + + // Read again + $this->assertEquals('This is string 2', $buffer->readString()); + + // Reset the index + $buffer->jumpto(0); + + // Test the read using non-default, this should return the whole string + $this->assertEquals($data, $buffer->readString("\xFF")); + } + + /** + * Test number reads reads + * + * @depends testRead + * @dataProvider integerDataProvider + * + * @param $method + * @param $number_type + * @param $file + * @param $expected + */ + public function testNumberReads($method, $number_type, $file, $expected) + { + + // Make the buffer + $buffer = $this->buildBuffer(file_get_contents($file), $number_type); + + // Run the test + $this->assertEquals($expected, call_user_func_array([ $buffer, $method ], [ ])); + + unset($buffer); + } +} diff --git a/gameq/tests/Filters/Base.php b/gameq/tests/Filters/Base.php new file mode 100644 index 0000000..999d247 --- /dev/null +++ b/gameq/tests/Filters/Base.php @@ -0,0 +1,104 @@ +. + */ + +namespace GameQ\Tests\Filters; + +use GameQ\Tests\TestBase; + +/** + * Class for testing Filters Base + * + * @package GameQ\Tests\Filters + */ +class Base extends TestBase +{ + + /** + * Load up the provider data for the specific filter type + * + * @return array + */ + public function loadData() + { + + // Explode the class that called to avoid strict error + $class = explode('\\', get_called_class()); + + // Determine the folder to grab the provider files and results from + $providersLookup = sprintf('%s/Providers/%s/', __DIR__, array_pop($class)); + + // Init the return array + $providers = [ ]; + + // Grab all of the test files for this filter + $files = new \DirectoryIterator($providersLookup); + + // Iterate over the files in this path + foreach ($files as $fileinfo) { + // Skip if we can't read or is dotfile + if (!$fileinfo->isReadable() || !$fileinfo->isFile()) { + continue; + } + + // Split the filename + list($protocol, $index) = explode('_', $fileinfo->getFilename()); + + unset($index); + + // Get the data + if (($data = json_decode(file_get_contents($fileinfo->getRealPath()), true)) === null + && json_last_error() !== JSON_ERROR_NONE + ) { + // Skip + continue; + } + + // Add the provider + $providers[] = [ + $protocol, + $data['raw'], + $data['filtered'] + ]; + } + + // Clear some memory + unset($files, $fileinfo, $providersLookup); + + return $providers; + } + + /* + * Real Base tests here + */ + + /** + * Test options setting on construct + */ + public function testOptions() + { + + $options = [ + 'option1' => 'value1', + 'option2' => 'value2', + ]; + + $mock = $this->getMockForAbstractClass('\GameQ\Filters\Base', [ $options ]); + + $this->assertEquals($options, \PHPUnit\Framework\Assert::readAttribute($mock, 'options')); + } +} diff --git a/gameq/tests/Filters/Normalize.php b/gameq/tests/Filters/Normalize.php new file mode 100644 index 0000000..ee884cd --- /dev/null +++ b/gameq/tests/Filters/Normalize.php @@ -0,0 +1,87 @@ +. + */ + +namespace GameQ\Tests\Filters; + +/** + * Class for testing Normalize filter + * + * @package GameQ\Tests\Filters + */ +class Normalize extends Base +{ + + /** + * Test the filter for Normalize + * + * @dataProvider loadData + * + * @param $protocol + * @param $raw + * @param $filtered + */ + public function testFiltered($protocol, $raw, $filtered) + { + + // Pop the key from the raw response + $host = key($raw); + + // Create a mock server + $server = $this->getMockBuilder('\GameQ\Server') + ->setConstructorArgs([ + [ + \GameQ\Server::SERVER_HOST => $host, + \GameQ\Server::SERVER_TYPE => $protocol, + ], + ]) + ->enableProxyingToOriginalMethods() + ->getMock(); + + // Create a mock filter + $filter = $this->getMockBuilder('\GameQ\Filters\Normalize') + ->enableProxyingToOriginalMethods() + ->getMock(); + + $this->assertEquals($filtered[$host], $filter->apply($raw[$host], $server)); + } + + /** + * Test for empty data pass to filter + */ + public function testEmpty() + { + + // Create a mock server + $server = $this->getMockBuilder('\GameQ\Server') + ->setConstructorArgs([ + [ + \GameQ\Server::SERVER_HOST => '127.0.0.1:27015', + \GameQ\Server::SERVER_TYPE => 'css', + ], + ]) + ->enableProxyingToOriginalMethods() + ->getMock(); + + // Create a mock filter + $filter = $this->getMockBuilder('\GameQ\Filters\Normalize') + ->enableProxyingToOriginalMethods() + ->getMock(); + + $this->assertEmpty($filter->apply([], $server)); + } +} diff --git a/gameq/tests/Filters/Providers/Normalize/css_1.json b/gameq/tests/Filters/Providers/Normalize/css_1.json new file mode 100644 index 0000000..c8e0d5d --- /dev/null +++ b/gameq/tests/Filters/Providers/Normalize/css_1.json @@ -0,0 +1 @@ +{"raw":{"64.74.97.72:27017":{"protocol":17,"hostname":"[GFLClan.com]24\/7 ZOMBIE ESCAPE |Rank|NoBlock|FastDL|Chicago","map":"ze_random_v9","game_dir":"cstrike","game_descr":"Counter-Strike: Source","steamappid":240,"num_players":64,"max_players":64,"num_bots":0,"dedicated":"d","os":"l","password":0,"secure":1,"version":"2230303","port":27017,"steam_id":90094317945771013,"keywords":"alltalk,awesome,bunnyhopping,escape,games,gfl,gl,increased_maxplayers,life,startmoney,ze,zm,zombie,zombie escape","game_id":240,"players":[{"id":0,"name":"Dream","score":0,"time":10867.557617188},{"id":0,"name":"CrystallizedSilver_Pleb","score":0,"time":10491.5234375},{"id":0,"name":"apple199644","score":0,"time":7855.0639648438},{"id":0,"name":"ANGRY SOCCER MOM","score":0,"time":6247.0698242188},{"id":0,"name":"Bossy","score":0,"time":5925.1157226562},{"id":0,"name":"Blue Ribbon","score":0,"time":5687.9028320312},{"id":0,"name":"Noriega","score":0,"time":5406.3828125},{"id":0,"name":"I LOVE MY PENIS","score":0,"time":5237.578125},{"id":0,"name":"down autism tourettes syndrome","score":0,"time":5232.1577148438},{"id":0,"name":"Big Cheese","score":0,"time":5043.2509765625},{"id":0,"name":"kaz","score":0,"time":5002.6684570312},{"id":0,"name":"[SCP] Virgil","score":0,"time":4821.17578125},{"id":0,"name":"Peaches the Disgruntled Mailman","score":-1,"time":4622.4829101562},{"id":0,"name":"MAX::PAIN","score":0,"time":4519.4067382812},{"id":0,"name":"Vigy Le Buns","score":0,"time":3683.5932617188},{"id":0,"name":"Jake, from State Farm","score":0,"time":2863.3615722656},{"id":0,"name":"Bassroyt","score":0,"time":2858.7358398438},{"id":0,"name":"nature born 12","score":0,"time":2857.3688964844},{"id":0,"name":"RA1NFIRE","score":0,"time":2804.4636230469},{"id":0,"name":"GFL's Human Resources Dept.","score":4,"time":2771.5388183594},{"id":0,"name":"xXLADIESMANXx","score":0,"time":2752.7136230469},{"id":0,"name":"Ice","score":0,"time":2671.4287109375},{"id":0,"name":"BaronAmbrosia","score":0,"time":2487.18359375},{"id":0,"name":"\u8ad6 jovem. \u604b\u6b21","score":0,"time":2314.0942382812},{"id":0,"name":"Oreo","score":0,"time":2239.8923339844},{"id":0,"name":"Mu Alpha Theta","score":0,"time":2224.9987792969},{"id":0,"name":"KBz | ClockTic","score":0,"time":2057.365234375},{"id":0,"name":"secnoc","score":0,"time":2026.4367675781},{"id":0,"name":"Joey Jay twitch.tv\/kaceytron","score":0,"time":1938.3646240234},{"id":0,"name":"GemsZ","score":0,"time":1938.1203613281},{"id":0,"name":"\u011e\u03a3\u0160 | Backstab","score":0,"time":1916.6658935547},{"id":0,"name":"I 8 PP","score":0,"time":1915.6157226562},{"id":0,"name":"\u1d3e\u1d3f\u1d3c\u1d34\u1d47\u1d35\u1d3e\u2668","score":0,"time":1890.4490966797},{"id":0,"name":"Big Lebowski","score":0,"time":1839.5908203125},{"id":0,"name":"Jayhowz","score":0,"time":1837.4183349609},{"id":0,"name":"konkution114","score":0,"time":1440.4700927734},{"id":0,"name":"dot","score":0,"time":1335.9624023438},{"id":0,"name":"rainmaker","score":0,"time":1288.1291503906},{"id":0,"name":"Lightning","score":-1,"time":1093.7681884766},{"id":0,"name":"burritoe","score":0,"time":967.53167724609},{"id":0,"name":"Ackhome","score":0,"time":938.69952392578},{"id":0,"name":"(\u0332\u0305\u03b6 \u25e3\u0332\u0305o\u0332\u0305\u25e2 (\u0332\u0305\u03b6","score":5,"time":867.86059570312},{"id":0,"name":"miggisworld","score":0,"time":864.10357666016},{"id":0,"name":"r\u00e4v","score":0,"time":738.83343505859},{"id":0,"name":"","score":0,"time":733.31182861328},{"id":0,"name":"Chucky BigBucks","score":0,"time":701.44464111328},{"id":0,"name":"muphin58","score":0,"time":694.20233154297},{"id":0,"name":"odb as u kan c","score":0,"time":693.70538330078},{"id":0,"name":"eZ Mode","score":0,"time":670.27862548828},{"id":0,"name":"Mobile Lawnmower","score":0,"time":586.36859130859},{"id":0,"name":"A$AP","score":0,"time":549.76513671875},{"id":0,"name":":)","score":1,"time":537.99011230469},{"id":0,"name":"QUE RICAS TETAS QUE ELA TENHE E","score":0,"time":515.41882324219},{"id":0,"name":"Primora","score":0,"time":440.26904296875},{"id":0,"name":"Reimu Hakurei","score":0,"time":429.22897338867},{"id":0,"name":"\u010e\u03a6\u1e85\u0418_Hi\u0141L","score":0,"time":340.4348449707},{"id":0,"name":"Horny Fish Sword","score":0,"time":241.94573974609},{"id":0,"name":"Nylocke!","score":0,"time":232.70875549316},{"id":0,"name":"N\u00c9oKar\u00a5\u00e5PPle","score":0,"time":221.02757263184},{"id":0,"name":"Wu-Tang Dynasty","score":0,"time":162.3059387207},{"id":0,"name":"Red Apophis","score":0,"time":147.11943054199},{"id":0,"name":"pLatinUm tw3nty 0n3s","score":0,"time":135.58245849609},{"id":0,"name":"Billy Ruben","score":0,"time":76.073677062988},{"id":0,"name":"","score":0,"time":4.4352440834045}],"num_rules":130,"ban_disconnected_ver":"1.04","bot_quota":"0","cd_announcer_version":"2.3","connect_version":"1.2.0","coop":"0","deathmatch":"1","decalfrequency":"10","entwatch_version":"3.0.3","forlix_floodcheck_version":"1.71","gs_zombiereloaded_version":"3.1.1","hlxce_plugin_version":"1.6.19","hlxce_version":"1.6.19","hlxce_webpage":"http:\/\/stats.gflclan.com\/","infinite-jumping_version":"3.0","mce_version":"1.9.3","metamod_version":"1.11.0-devV","mp_allowNPCs":"1","mp_autocrosshair":"1","mp_autoteambalance":"0","mp_c4timer":"45","mp_disable_respawn_times":"0","mp_fadetoblack":"0","mp_falldamage":"0","mp_flashlight":"1","mp_footsteps":"1","mp_forceautoteam":"0","mp_forcerespawn":"1","mp_fraglimit":"0","mp_freezetime":"0","mp_friendlyfire":"0","mp_holiday_nogifts":"0","mp_hostagepenalty":"5","mp_limitteams":"0","mp_match_end_at_timelimit":"0","mp_maxrounds":"0","mp_respawnwavetime":"10.0","mp_roundtime":"9","mp_scrambleteams_auto":"1","mp_scrambleteams_auto_windifference":"2","mp_stalemate_enable":"0","mp_stalemate_meleeonly":"0","mp_startmoney":"16000","mp_teamlist":"hgrunt;scientist","mp_teamplay":"0","mp_teams_unbalance_limit":"0","mp_timelimit":"40","mp_tournament":"0","mp_weaponstay":"0","mp_winlimit":"0","nextlevel":"","ne_version":"1.9.2","rtve_version":"1.9.2","r_AirboatViewDampenDamp":"1.0","r_AirboatViewDampenFreq":"7.0","r_AirboatViewZHeight":"0.0","r_JeepViewDampenDamp":"1.0","r_JeepViewDampenFreq":"7.0","r_JeepViewZHeight":"10.0","r_VehicleViewDampen":"1","sb_version":"1.4.11.TOG_EDIT_g","scc_version":"2.0.0","sc_core_version":"1.0.1","sm_advertisements_version":"0.5.5","sm_afkm_version":"3.5.0","sm_allchat_version":"1.1.1","sm_countrytags_version":"1.2.0","sm_downloader_version":"1.4","sm_extendedcomm_version":"3.0.8b_togedit_c","sm_extend_version":"1.3","sm_grenplayer_noblock_version":"2.0","sm_irs_version":"2.0.8","sm_napalmlagfix_version":"1.0.2","sm_nextmap":"ze_shroomforest_v3","sm_selfmute_version":"1.0","sm_show_damage_version":"1.0.7","sm_spawntools7_version":"0.9","sm_spray_version":"5.8a TOGEDIT_nomenu","sm_stopsound_version":"1.0.0","sm_tracker_version":"1.6","sm_updateradar_version":"fix","sourcemod_version":"1.5.3","sv_accelerate":"5","sv_airaccelerate":"10","sv_allowminmodels":"1","sv_alltalk":"1","sv_bounce":"0","sv_cheats":"0","sv_competitive_minspec":"0","sv_contact":"","sv_enableboost":"0","sv_enablebunnyhopping":"1","sv_footsteps":"1","sv_friction":"4","sv_gravity":"800","sv_maxspeed":"500","sv_maxusrcmdprocessticks":"24","sv_noclipaccelerate":"5","sv_noclipspeed":"5","sv_nostats":"0","sv_password":"0","sv_pausable":"0","sv_rollangle":"0","sv_rollspeed":"200","sv_specaccelerate":"5","sv_specnoclip":"1","sv_specspeed":"8","sv_steamgroup":"","sv_stepsize":"18","sv_stopspeed":"75","sv_tags":"alltalk,awesome,bunnyhopping,escape,games,gfl,gl,increased_maxplayers,life,startmoney,ze,zm,zombie,zombie escape","sv_voiceenable":"1","sv_wateraccelerate":"10","sv_waterfriction":"1","tal_version":"1.5","tbc_version":"1.0","teamswitch_version":"1.3 togedit","tfc_version":"4.0","tf_arena_max_streak":"3","tf_arena_preround_time":"10","tf_arena_round_time":"0","tf_arena_use_queue":"1","tjs_version":"1.7","togadmintargeting_version":"1.0","togreload_version":"1.0","tv_enable":"0","tv_password":"0","tv_relaypassword":"0","zombiereloaded_revision":"733:d57da587271c+","zr_greneffect_version":"2.0","zr_repeatkill_version":"1.0.2","gq_joinlink":"steam:\/\/connect\/64.74.97.72:27017\/"}},"filtered":{"64.74.97.72:27017":{"protocol":17,"hostname":"[GFLClan.com]24\/7 ZOMBIE ESCAPE |Rank|NoBlock|FastDL|Chicago","map":"ze_random_v9","game_dir":"cstrike","game_descr":"Counter-Strike: Source","steamappid":240,"num_players":64,"max_players":64,"num_bots":0,"dedicated":"d","os":"l","password":0,"secure":1,"version":"2230303","port":27017,"steam_id":90094317945771013,"keywords":"alltalk,awesome,bunnyhopping,escape,games,gfl,gl,increased_maxplayers,life,startmoney,ze,zm,zombie,zombie escape","game_id":240,"players":[{"id":0,"name":"Dream","score":0,"time":10867.557617188,"gq_name":"Dream","gq_score":0,"gq_time":10867.557617188},{"id":0,"name":"CrystallizedSilver_Pleb","score":0,"time":10491.5234375,"gq_name":"CrystallizedSilver_Pleb","gq_score":0,"gq_time":10491.5234375},{"id":0,"name":"apple199644","score":0,"time":7855.0639648438,"gq_name":"apple199644","gq_score":0,"gq_time":7855.0639648438},{"id":0,"name":"ANGRY SOCCER MOM","score":0,"time":6247.0698242188,"gq_name":"ANGRY SOCCER MOM","gq_score":0,"gq_time":6247.0698242188},{"id":0,"name":"Bossy","score":0,"time":5925.1157226562,"gq_name":"Bossy","gq_score":0,"gq_time":5925.1157226562},{"id":0,"name":"Blue Ribbon","score":0,"time":5687.9028320312,"gq_name":"Blue Ribbon","gq_score":0,"gq_time":5687.9028320312},{"id":0,"name":"Noriega","score":0,"time":5406.3828125,"gq_name":"Noriega","gq_score":0,"gq_time":5406.3828125},{"id":0,"name":"I LOVE MY PENIS","score":0,"time":5237.578125,"gq_name":"I LOVE MY PENIS","gq_score":0,"gq_time":5237.578125},{"id":0,"name":"down autism tourettes syndrome","score":0,"time":5232.1577148438,"gq_name":"down autism tourettes syndrome","gq_score":0,"gq_time":5232.1577148438},{"id":0,"name":"Big Cheese","score":0,"time":5043.2509765625,"gq_name":"Big Cheese","gq_score":0,"gq_time":5043.2509765625},{"id":0,"name":"kaz","score":0,"time":5002.6684570312,"gq_name":"kaz","gq_score":0,"gq_time":5002.6684570312},{"id":0,"name":"[SCP] Virgil","score":0,"time":4821.17578125,"gq_name":"[SCP] Virgil","gq_score":0,"gq_time":4821.17578125},{"id":0,"name":"Peaches the Disgruntled Mailman","score":-1,"time":4622.4829101562,"gq_name":"Peaches the Disgruntled Mailman","gq_score":-1,"gq_time":4622.4829101562},{"id":0,"name":"MAX::PAIN","score":0,"time":4519.4067382812,"gq_name":"MAX::PAIN","gq_score":0,"gq_time":4519.4067382812},{"id":0,"name":"Vigy Le Buns","score":0,"time":3683.5932617188,"gq_name":"Vigy Le Buns","gq_score":0,"gq_time":3683.5932617188},{"id":0,"name":"Jake, from State Farm","score":0,"time":2863.3615722656,"gq_name":"Jake, from State Farm","gq_score":0,"gq_time":2863.3615722656},{"id":0,"name":"Bassroyt","score":0,"time":2858.7358398438,"gq_name":"Bassroyt","gq_score":0,"gq_time":2858.7358398438},{"id":0,"name":"nature born 12","score":0,"time":2857.3688964844,"gq_name":"nature born 12","gq_score":0,"gq_time":2857.3688964844},{"id":0,"name":"RA1NFIRE","score":0,"time":2804.4636230469,"gq_name":"RA1NFIRE","gq_score":0,"gq_time":2804.4636230469},{"id":0,"name":"GFL's Human Resources Dept.","score":4,"time":2771.5388183594,"gq_name":"GFL's Human Resources Dept.","gq_score":4,"gq_time":2771.5388183594},{"id":0,"name":"xXLADIESMANXx","score":0,"time":2752.7136230469,"gq_name":"xXLADIESMANXx","gq_score":0,"gq_time":2752.7136230469},{"id":0,"name":"Ice","score":0,"time":2671.4287109375,"gq_name":"Ice","gq_score":0,"gq_time":2671.4287109375},{"id":0,"name":"BaronAmbrosia","score":0,"time":2487.18359375,"gq_name":"BaronAmbrosia","gq_score":0,"gq_time":2487.18359375},{"id":0,"name":"\u8ad6 jovem. \u604b\u6b21","score":0,"time":2314.0942382812,"gq_name":"\u8ad6 jovem. \u604b\u6b21","gq_score":0,"gq_time":2314.0942382812},{"id":0,"name":"Oreo","score":0,"time":2239.8923339844,"gq_name":"Oreo","gq_score":0,"gq_time":2239.8923339844},{"id":0,"name":"Mu Alpha Theta","score":0,"time":2224.9987792969,"gq_name":"Mu Alpha Theta","gq_score":0,"gq_time":2224.9987792969},{"id":0,"name":"KBz | ClockTic","score":0,"time":2057.365234375,"gq_name":"KBz | ClockTic","gq_score":0,"gq_time":2057.365234375},{"id":0,"name":"secnoc","score":0,"time":2026.4367675781,"gq_name":"secnoc","gq_score":0,"gq_time":2026.4367675781},{"id":0,"name":"Joey Jay twitch.tv\/kaceytron","score":0,"time":1938.3646240234,"gq_name":"Joey Jay twitch.tv\/kaceytron","gq_score":0,"gq_time":1938.3646240234},{"id":0,"name":"GemsZ","score":0,"time":1938.1203613281,"gq_name":"GemsZ","gq_score":0,"gq_time":1938.1203613281},{"id":0,"name":"\u011e\u03a3\u0160 | Backstab","score":0,"time":1916.6658935547,"gq_name":"\u011e\u03a3\u0160 | Backstab","gq_score":0,"gq_time":1916.6658935547},{"id":0,"name":"I 8 PP","score":0,"time":1915.6157226562,"gq_name":"I 8 PP","gq_score":0,"gq_time":1915.6157226562},{"id":0,"name":"\u1d3e\u1d3f\u1d3c\u1d34\u1d47\u1d35\u1d3e\u2668","score":0,"time":1890.4490966797,"gq_name":"\u1d3e\u1d3f\u1d3c\u1d34\u1d47\u1d35\u1d3e\u2668","gq_score":0,"gq_time":1890.4490966797},{"id":0,"name":"Big Lebowski","score":0,"time":1839.5908203125,"gq_name":"Big Lebowski","gq_score":0,"gq_time":1839.5908203125},{"id":0,"name":"Jayhowz","score":0,"time":1837.4183349609,"gq_name":"Jayhowz","gq_score":0,"gq_time":1837.4183349609},{"id":0,"name":"konkution114","score":0,"time":1440.4700927734,"gq_name":"konkution114","gq_score":0,"gq_time":1440.4700927734},{"id":0,"name":"dot","score":0,"time":1335.9624023438,"gq_name":"dot","gq_score":0,"gq_time":1335.9624023438},{"id":0,"name":"rainmaker","score":0,"time":1288.1291503906,"gq_name":"rainmaker","gq_score":0,"gq_time":1288.1291503906},{"id":0,"name":"Lightning","score":-1,"time":1093.7681884766,"gq_name":"Lightning","gq_score":-1,"gq_time":1093.7681884766},{"id":0,"name":"burritoe","score":0,"time":967.53167724609,"gq_name":"burritoe","gq_score":0,"gq_time":967.53167724609},{"id":0,"name":"Ackhome","score":0,"time":938.69952392578,"gq_name":"Ackhome","gq_score":0,"gq_time":938.69952392578},{"id":0,"name":"(\u0332\u0305\u03b6 \u25e3\u0332\u0305o\u0332\u0305\u25e2 (\u0332\u0305\u03b6","score":5,"time":867.86059570312,"gq_name":"(\u0332\u0305\u03b6 \u25e3\u0332\u0305o\u0332\u0305\u25e2 (\u0332\u0305\u03b6","gq_score":5,"gq_time":867.86059570312},{"id":0,"name":"miggisworld","score":0,"time":864.10357666016,"gq_name":"miggisworld","gq_score":0,"gq_time":864.10357666016},{"id":0,"name":"r\u00e4v","score":0,"time":738.83343505859,"gq_name":"r\u00e4v","gq_score":0,"gq_time":738.83343505859},{"id":0,"name":"","score":0,"time":733.31182861328,"gq_name":"","gq_score":0,"gq_time":733.31182861328},{"id":0,"name":"Chucky BigBucks","score":0,"time":701.44464111328,"gq_name":"Chucky BigBucks","gq_score":0,"gq_time":701.44464111328},{"id":0,"name":"muphin58","score":0,"time":694.20233154297,"gq_name":"muphin58","gq_score":0,"gq_time":694.20233154297},{"id":0,"name":"odb as u kan c","score":0,"time":693.70538330078,"gq_name":"odb as u kan c","gq_score":0,"gq_time":693.70538330078},{"id":0,"name":"eZ Mode","score":0,"time":670.27862548828,"gq_name":"eZ Mode","gq_score":0,"gq_time":670.27862548828},{"id":0,"name":"Mobile Lawnmower","score":0,"time":586.36859130859,"gq_name":"Mobile Lawnmower","gq_score":0,"gq_time":586.36859130859},{"id":0,"name":"A$AP","score":0,"time":549.76513671875,"gq_name":"A$AP","gq_score":0,"gq_time":549.76513671875},{"id":0,"name":":)","score":1,"time":537.99011230469,"gq_name":":)","gq_score":1,"gq_time":537.99011230469},{"id":0,"name":"QUE RICAS TETAS QUE ELA TENHE E","score":0,"time":515.41882324219,"gq_name":"QUE RICAS TETAS QUE ELA TENHE E","gq_score":0,"gq_time":515.41882324219},{"id":0,"name":"Primora","score":0,"time":440.26904296875,"gq_name":"Primora","gq_score":0,"gq_time":440.26904296875},{"id":0,"name":"Reimu Hakurei","score":0,"time":429.22897338867,"gq_name":"Reimu Hakurei","gq_score":0,"gq_time":429.22897338867},{"id":0,"name":"\u010e\u03a6\u1e85\u0418_Hi\u0141L","score":0,"time":340.4348449707,"gq_name":"\u010e\u03a6\u1e85\u0418_Hi\u0141L","gq_score":0,"gq_time":340.4348449707},{"id":0,"name":"Horny Fish Sword","score":0,"time":241.94573974609,"gq_name":"Horny Fish Sword","gq_score":0,"gq_time":241.94573974609},{"id":0,"name":"Nylocke!","score":0,"time":232.70875549316,"gq_name":"Nylocke!","gq_score":0,"gq_time":232.70875549316},{"id":0,"name":"N\u00c9oKar\u00a5\u00e5PPle","score":0,"time":221.02757263184,"gq_name":"N\u00c9oKar\u00a5\u00e5PPle","gq_score":0,"gq_time":221.02757263184},{"id":0,"name":"Wu-Tang Dynasty","score":0,"time":162.3059387207,"gq_name":"Wu-Tang Dynasty","gq_score":0,"gq_time":162.3059387207},{"id":0,"name":"Red Apophis","score":0,"time":147.11943054199,"gq_name":"Red Apophis","gq_score":0,"gq_time":147.11943054199},{"id":0,"name":"pLatinUm tw3nty 0n3s","score":0,"time":135.58245849609,"gq_name":"pLatinUm tw3nty 0n3s","gq_score":0,"gq_time":135.58245849609},{"id":0,"name":"Billy Ruben","score":0,"time":76.073677062988,"gq_name":"Billy Ruben","gq_score":0,"gq_time":76.073677062988},{"id":0,"name":"","score":0,"time":4.4352440834045,"gq_name":"","gq_score":0,"gq_time":4.4352440834045}],"num_rules":130,"ban_disconnected_ver":"1.04","bot_quota":"0","cd_announcer_version":"2.3","connect_version":"1.2.0","coop":"0","deathmatch":"1","decalfrequency":"10","entwatch_version":"3.0.3","forlix_floodcheck_version":"1.71","gs_zombiereloaded_version":"3.1.1","hlxce_plugin_version":"1.6.19","hlxce_version":"1.6.19","hlxce_webpage":"http:\/\/stats.gflclan.com\/","infinite-jumping_version":"3.0","mce_version":"1.9.3","metamod_version":"1.11.0-devV","mp_allowNPCs":"1","mp_autocrosshair":"1","mp_autoteambalance":"0","mp_c4timer":"45","mp_disable_respawn_times":"0","mp_fadetoblack":"0","mp_falldamage":"0","mp_flashlight":"1","mp_footsteps":"1","mp_forceautoteam":"0","mp_forcerespawn":"1","mp_fraglimit":"0","mp_freezetime":"0","mp_friendlyfire":"0","mp_holiday_nogifts":"0","mp_hostagepenalty":"5","mp_limitteams":"0","mp_match_end_at_timelimit":"0","mp_maxrounds":"0","mp_respawnwavetime":"10.0","mp_roundtime":"9","mp_scrambleteams_auto":"1","mp_scrambleteams_auto_windifference":"2","mp_stalemate_enable":"0","mp_stalemate_meleeonly":"0","mp_startmoney":"16000","mp_teamlist":"hgrunt;scientist","mp_teamplay":"0","mp_teams_unbalance_limit":"0","mp_timelimit":"40","mp_tournament":"0","mp_weaponstay":"0","mp_winlimit":"0","nextlevel":"","ne_version":"1.9.2","rtve_version":"1.9.2","r_AirboatViewDampenDamp":"1.0","r_AirboatViewDampenFreq":"7.0","r_AirboatViewZHeight":"0.0","r_JeepViewDampenDamp":"1.0","r_JeepViewDampenFreq":"7.0","r_JeepViewZHeight":"10.0","r_VehicleViewDampen":"1","sb_version":"1.4.11.TOG_EDIT_g","scc_version":"2.0.0","sc_core_version":"1.0.1","sm_advertisements_version":"0.5.5","sm_afkm_version":"3.5.0","sm_allchat_version":"1.1.1","sm_countrytags_version":"1.2.0","sm_downloader_version":"1.4","sm_extendedcomm_version":"3.0.8b_togedit_c","sm_extend_version":"1.3","sm_grenplayer_noblock_version":"2.0","sm_irs_version":"2.0.8","sm_napalmlagfix_version":"1.0.2","sm_nextmap":"ze_shroomforest_v3","sm_selfmute_version":"1.0","sm_show_damage_version":"1.0.7","sm_spawntools7_version":"0.9","sm_spray_version":"5.8a TOGEDIT_nomenu","sm_stopsound_version":"1.0.0","sm_tracker_version":"1.6","sm_updateradar_version":"fix","sourcemod_version":"1.5.3","sv_accelerate":"5","sv_airaccelerate":"10","sv_allowminmodels":"1","sv_alltalk":"1","sv_bounce":"0","sv_cheats":"0","sv_competitive_minspec":"0","sv_contact":"","sv_enableboost":"0","sv_enablebunnyhopping":"1","sv_footsteps":"1","sv_friction":"4","sv_gravity":"800","sv_maxspeed":"500","sv_maxusrcmdprocessticks":"24","sv_noclipaccelerate":"5","sv_noclipspeed":"5","sv_nostats":"0","sv_password":"0","sv_pausable":"0","sv_rollangle":"0","sv_rollspeed":"200","sv_specaccelerate":"5","sv_specnoclip":"1","sv_specspeed":"8","sv_steamgroup":"","sv_stepsize":"18","sv_stopspeed":"75","sv_tags":"alltalk,awesome,bunnyhopping,escape,games,gfl,gl,increased_maxplayers,life,startmoney,ze,zm,zombie,zombie escape","sv_voiceenable":"1","sv_wateraccelerate":"10","sv_waterfriction":"1","tal_version":"1.5","tbc_version":"1.0","teamswitch_version":"1.3 togedit","tfc_version":"4.0","tf_arena_max_streak":"3","tf_arena_preround_time":"10","tf_arena_round_time":"0","tf_arena_use_queue":"1","tjs_version":"1.7","togadmintargeting_version":"1.0","togreload_version":"1.0","tv_enable":"0","tv_password":"0","tv_relaypassword":"0","zombiereloaded_revision":"733:d57da587271c+","zr_greneffect_version":"2.0","zr_repeatkill_version":"1.0.2","gq_joinlink":"steam:\/\/connect\/64.74.97.72:27017\/","gq_dedicated":"d","gq_gametype":"Counter-Strike: Source","gq_hostname":"[GFLClan.com]24\/7 ZOMBIE ESCAPE |Rank|NoBlock|FastDL|Chicago","gq_mapname":"ze_random_v9","gq_maxplayers":64,"gq_mod":"cstrike","gq_numplayers":64,"gq_password":0,"teams":[]}}} \ No newline at end of file diff --git a/gameq/tests/Filters/Providers/Normalize/css_2.json b/gameq/tests/Filters/Providers/Normalize/css_2.json new file mode 100644 index 0000000..1264050 --- /dev/null +++ b/gameq/tests/Filters/Providers/Normalize/css_2.json @@ -0,0 +1 @@ +{"raw":{"204.11.234.116:27015":{"protocol":17,"hostname":"Multiplay :: Match Server","map":"aim_scoutzknivez","game_dir":"cstrike","game_descr":"Counter-Strike: Source","steamappid":240,"num_players":0,"max_players":10,"num_bots":0,"dedicated":"d","os":"w","password":0,"secure":1,"version":"2230303","port":27015,"steam_id":90094348778156039,"sourcetv_port":27025,"sourcetv_name":"Multiplay :: Match Server TV","keywords":"compspec,friendlyfire,nostats,sv_pure1,zb_warmode,zblock","game_id":240,"num_rules":88,"bot_quota":"0","decalfrequency":"60","esl_active":"1","esl_allowwebserver":"1","esl_cashback":"1","esl_gasearch":"1","esl_version":"3.0.4","host_framerate":"0","metamod_version":"1.11.0-devV","mp_autocrosshair":"0","mp_autoteambalance":"0","mp_buytime":".25","mp_c4timer":"35","mp_disable_respawn_times":"0","mp_fadetoblack":"0","mp_falldamage":"0","mp_flashlight":"1","mp_footsteps":"1","mp_forceautoteam":"0","mp_forcecamera":"1","mp_forcerespawn":"1","mp_fraglimit":"0","mp_freezetime":"10","mp_friendlyfire":"1","mp_holiday_nogifts":"0","mp_hostagepenalty":"0","mp_limitteams":"0","mp_match_end_at_timelimit":"0","mp_maxrounds":"0","mp_respawnwavetime":"10.0","mp_roundtime":"1.75","mp_scrambleteams_auto":"1","mp_scrambleteams_auto_windifference":"2","mp_stalemate_enable":"0","mp_stalemate_meleeonly":"0","mp_startmoney":"800","mp_teamplay":"0","mp_teams_unbalance_limit":"1","mp_timelimit":"0","mp_tournament":"0","mp_weaponstay":"0","mp_winlimit":"0","nextlevel":"","sv_accelerate":"5","sv_airaccelerate":"10","sv_allowminmodels":"1","sv_alltalk":"0","sv_bounce":"0","sv_cheats":"0","sv_competitive_minspec":"1","sv_contact":"","sv_enableboost":"0","sv_enablebunnyhopping":"0","sv_footsteps":"1","sv_friction":"4","sv_gravity":"800","sv_maxcmdrate":"66","sv_maxrate":"30000","sv_maxspeed":"320","sv_maxupdaterate":"66","sv_maxusrcmdprocessticks":"24","sv_mincmdrate":"66","sv_minrate":"15000","sv_minupdaterate":"66","sv_noclipaccelerate":"5","sv_noclipspeed":"5","sv_nostats":"1","sv_password":"0","sv_pausable":"1","sv_rollangle":"0","sv_rollspeed":"200","sv_specaccelerate":"5","sv_specnoclip":"1","sv_specspeed":"3","sv_steamgroup":"","sv_stepsize":"18","sv_stopspeed":"75","sv_tags":"compspec,friendlyfire,nostats,sv_pure1,zb_warmode,zblock","sv_voiceenable":"1","sv_wateraccelerate":"10","sv_waterfriction":"1","tf_arena_use_queue":"1","tv_delay":"90","tv_enable":"1","tv_password":"0","tv_relaypassword":"0","zb_status":"1","zb_version":"4.72","gq_online":true,"gq_address":"204.11.234.116","gq_port_client":27015,"gq_port_query":27015,"gq_protocol":"source","gq_type":"css","gq_name":"Counter-Strike: Source","gq_transport":"udp","gq_joinlink":"steam:\/\/connect\/204.11.234.116:27015\/"}},"filtered":{"204.11.234.116:27015":{"protocol":17,"hostname":"Multiplay :: Match Server","map":"aim_scoutzknivez","game_dir":"cstrike","game_descr":"Counter-Strike: Source","steamappid":240,"num_players":0,"max_players":10,"num_bots":0,"dedicated":"d","os":"w","password":0,"secure":1,"version":"2230303","port":27015,"steam_id":90094348778156039,"sourcetv_port":27025,"sourcetv_name":"Multiplay :: Match Server TV","keywords":"compspec,friendlyfire,nostats,sv_pure1,zb_warmode,zblock","game_id":240,"num_rules":88,"bot_quota":"0","decalfrequency":"60","esl_active":"1","esl_allowwebserver":"1","esl_cashback":"1","esl_gasearch":"1","esl_version":"3.0.4","host_framerate":"0","metamod_version":"1.11.0-devV","mp_autocrosshair":"0","mp_autoteambalance":"0","mp_buytime":".25","mp_c4timer":"35","mp_disable_respawn_times":"0","mp_fadetoblack":"0","mp_falldamage":"0","mp_flashlight":"1","mp_footsteps":"1","mp_forceautoteam":"0","mp_forcecamera":"1","mp_forcerespawn":"1","mp_fraglimit":"0","mp_freezetime":"10","mp_friendlyfire":"1","mp_holiday_nogifts":"0","mp_hostagepenalty":"0","mp_limitteams":"0","mp_match_end_at_timelimit":"0","mp_maxrounds":"0","mp_respawnwavetime":"10.0","mp_roundtime":"1.75","mp_scrambleteams_auto":"1","mp_scrambleteams_auto_windifference":"2","mp_stalemate_enable":"0","mp_stalemate_meleeonly":"0","mp_startmoney":"800","mp_teamplay":"0","mp_teams_unbalance_limit":"1","mp_timelimit":"0","mp_tournament":"0","mp_weaponstay":"0","mp_winlimit":"0","nextlevel":"","sv_accelerate":"5","sv_airaccelerate":"10","sv_allowminmodels":"1","sv_alltalk":"0","sv_bounce":"0","sv_cheats":"0","sv_competitive_minspec":"1","sv_contact":"","sv_enableboost":"0","sv_enablebunnyhopping":"0","sv_footsteps":"1","sv_friction":"4","sv_gravity":"800","sv_maxcmdrate":"66","sv_maxrate":"30000","sv_maxspeed":"320","sv_maxupdaterate":"66","sv_maxusrcmdprocessticks":"24","sv_mincmdrate":"66","sv_minrate":"15000","sv_minupdaterate":"66","sv_noclipaccelerate":"5","sv_noclipspeed":"5","sv_nostats":"1","sv_password":"0","sv_pausable":"1","sv_rollangle":"0","sv_rollspeed":"200","sv_specaccelerate":"5","sv_specnoclip":"1","sv_specspeed":"3","sv_steamgroup":"","sv_stepsize":"18","sv_stopspeed":"75","sv_tags":"compspec,friendlyfire,nostats,sv_pure1,zb_warmode,zblock","sv_voiceenable":"1","sv_wateraccelerate":"10","sv_waterfriction":"1","tf_arena_use_queue":"1","tv_delay":"90","tv_enable":"1","tv_password":"0","tv_relaypassword":"0","zb_status":"1","zb_version":"4.72","gq_online":true,"gq_address":"204.11.234.116","gq_port_client":27015,"gq_port_query":27015,"gq_protocol":"source","gq_type":"css","gq_name":"Counter-Strike: Source","gq_transport":"udp","gq_joinlink":"steam:\/\/connect\/204.11.234.116:27015\/","gq_dedicated":"d","gq_gametype":"Counter-Strike: Source","gq_hostname":"Multiplay :: Match Server","gq_mapname":"aim_scoutzknivez","gq_maxplayers":10,"gq_mod":"cstrike","gq_numplayers":0,"gq_password":0,"players":[],"teams":[]}}} \ No newline at end of file diff --git a/gameq/tests/Filters/Providers/Normalize/mumble_1.json b/gameq/tests/Filters/Providers/Normalize/mumble_1.json new file mode 100644 index 0000000..909f927 --- /dev/null +++ b/gameq/tests/Filters/Providers/Normalize/mumble_1.json @@ -0,0 +1 @@ +{"raw":{"95.130.64.232:64738":{"dedicated":1,"id":1,"name":"Skyttegrav & SweClockers Mumble","x_connecturl":"mumble:\/\/mumble.skyttegrav.se\/?version=1.2.0","x_gtmurmur_connectport":"64738","x_gtmurmur_max_users":"250","x_gtmurmur_server_version":"1.2.8","x_gtmurmur_doclen":224093,"teams":[{"description":"Welcome! <\/b>\n

This server requires registration<\/span> in order to move from Root.Please register yourself by selecting Self --> Register in the menu bar, or right-clicking on your nick and choose Register.<\/b><\/p>","id":0,"name":"Root","parent":-1,"position":0,"temporary":false},{"description":"","id":1,"name":"AFK","parent":0,"position":0,"temporary":false},{"description":"","id":8,"name":"Utl\u00e5nade Kanaler","parent":0,"position":100,"temporary":false},{"description":"Endast F\u00f6r Skyttegrav admins!<\/b>","id":9,"name":"Admins Corner (private)","parent":0,"position":200,"temporary":false},{"description":"","id":38,"name":"Admins","parent":9,"position":11,"temporary":false},{"description":"","id":43,"name":"Headadmins Corner","parent":9,"position":60,"temporary":false},{"description":"","id":44,"name":"Supervisors Corner - Polska Riksdagen","parent":9,"position":70,"temporary":false},{"description":"Spelf\u00f6reningen bakom Skyttegrav.se","id":150,"name":"United Gaming","parent":9,"position":0,"temporary":false},{"description":"","id":151,"name":"M\u00f6te","parent":150,"position":0,"temporary":false},{"description":"","id":152,"name":"Styrelsem\u00f6te","parent":150,"position":0,"temporary":false},{"description":"Endast F\u00f6r SweClockers.com admins!<\/b>","id":187,"name":"Sweclockers","parent":9,"position":0,"temporary":false},{"description":"","id":188,"name":"Allm\u00e4n Admin","parent":187,"position":0,"temporary":false},{"description":"","id":189,"name":"Privat Admin (Endast inbjudan)","parent":187,"position":0,"temporary":false},{"description":"","id":214,"name":"Allm\u00e4n Admin (Delad)","parent":9,"position":10,"temporary":false},{"description":"","id":183,"name":"SweClockers","parent":0,"position":10,"temporary":false},{"description":"H\u00e4r kommer v\u00e5ra stream och webtv att s\u00e4ndas! \n

\n

Bes\u00f6k www.swec.tv och avnjut s\u00e4ndningen, vill du deltaga s\u00e5 skicka ett meddelande i mumble till en admin som antingen kan flytta dig eller ge dig l\u00f6senordet. Vi kommer att b\u00e5de casta och spela olika spel l\u00f6pande.<\/p>\n

\n

I kanalen g\u00e4ller strikt ljud och informationskontroll, akta er allts\u00e5 f\u00f6r att inte s\u00e4ga f\u00f6r mycket.<\/p>","id":358,"name":"SweC TV Studio (private)","parent":183,"position":100,"temporary":false},{"description":"Vill ni deltaga i SweC TV? \n

\n

S\u00e4tt er i detta rummet s\u00e5 kommer vi att dra in er i cast rummet vid tillf\u00e4lle, ni \u00e4r varmt v\u00e4lkomna att titta p\u00e5 www.swec.tv<\/a> medan ni v\u00e4ntar! <\/p>\n

\n

N\u00e4r ni kommer in i cast kanalen \u00e4r ni automatiskt satta till "mute", vi kommer att \u00e4ndra det n\u00e4r ni kommer in.<\/p>\n

\n

\n

","id":402,"name":"SweC TV lobby (wait for invite to cast room)","parent":183,"position":200,"temporary":false},{"description":"Hj\u00e4lp med Mumble? L\u00e4s h\u00e4r -> Mumble tr\u00e5d p\u00e5 SweClockers<\/a>","id":421,"name":"Spelkv\u00e4llar","parent":183,"position":300,"temporary":false},{"description":"H\u00e4r har ni nyttig information om spelkv\u00e4llarna! \n

SpelClockers<\/a> Spelkv\u00e4llar<\/p>\n

Sweclockers Steam chat grupp<\/a><\/p>\n

<\/p>","id":426,"name":"Allm\u00e4n samlingskanal - Kom hit f\u00f6r r\u00e5d och v\u00e4gledning","parent":421,"position":0,"temporary":false},{"description":"","id":427,"name":"Reserv #2","parent":421,"position":20,"temporary":false},{"description":"","id":429,"name":"Grupp 1","parent":427,"position":10,"temporary":false},{"description":"","id":430,"name":"Grupp 2","parent":427,"position":20,"temporary":false},{"description":"","id":449,"name":"Grupp 3","parent":427,"position":30,"temporary":false},{"description":"","id":450,"name":"Grupp 4","parent":427,"position":40,"temporary":false},{"description":"","id":453,"name":"Rematch och rekryt Lobby","parent":427,"position":0,"temporary":false},{"description":"","id":455,"name":"Grupp 5","parent":427,"position":50,"temporary":false},{"description":"","id":456,"name":"Grupp 6","parent":427,"position":60,"temporary":false},{"description":"","id":428,"name":"12h stream med SpelClockers - L\u00f6rdag 28 feb","parent":421,"position":10,"temporary":false},{"description":"","id":432,"name":"MechWarrior Online","parent":428,"position":10,"temporary":false},{"description":"","id":433,"name":"Grupp 2","parent":428,"position":20,"temporary":false},{"description":"","id":434,"name":"Grupp 3","parent":428,"position":30,"temporary":false},{"description":"","id":443,"name":"Grupp 4","parent":428,"position":40,"temporary":false},{"description":"","id":444,"name":"Grupp 5","parent":428,"position":50,"temporary":false},{"description":"","id":451,"name":"Samlingsal","parent":428,"position":0,"temporary":false},{"description":"","id":459,"name":"Grupp 6","parent":428,"position":60,"temporary":false},{"description":"","id":436,"name":"Reserv #3","parent":421,"position":30,"temporary":false},{"description":"","id":437,"name":"Grupp 1","parent":436,"position":10,"temporary":false},{"description":"","id":438,"name":"Grupp 2","parent":436,"position":20,"temporary":false},{"description":"","id":439,"name":"Grupp 3","parent":436,"position":30,"temporary":false},{"description":"","id":440,"name":"Grupp 4","parent":436,"position":40,"temporary":false},{"description":"","id":441,"name":"Grupp 5","parent":436,"position":50,"temporary":false},{"description":"","id":442,"name":"Grupp 6","parent":436,"position":60,"temporary":false},{"description":"","id":452,"name":"Rematch och rekryt Lobby","parent":436,"position":0,"temporary":false},{"description":"","id":190,"name":"Snack-kanaler","parent":0,"position":20,"temporary":false},{"description":"","id":2,"name":"Allm\u00e4nt Snack","parent":190,"position":100,"temporary":false},{"description":"","id":10,"name":"Allm\u00e4nt Snack - Rum #1","parent":2,"position":0,"temporary":false},{"description":"","id":11,"name":"Allm\u00e4nt Snack - Rum #2","parent":2,"position":0,"temporary":false},{"description":"","id":12,"name":"Allm\u00e4nt Snack - Rum #3","parent":2,"position":0,"temporary":false},{"description":"","id":13,"name":"Allm\u00e4nt Snack - Rum #4","parent":2,"position":0,"temporary":false},{"description":"","id":14,"name":"Utvisningsb\u00e5set","parent":2,"position":1000,"temporary":false},{"description":"","id":84,"name":"Allm\u00e4nt Snack - Rum #5","parent":2,"position":0,"temporary":false},{"description":"","id":85,"name":"Allm\u00e4nt Snack - Rum #6","parent":2,"position":0,"temporary":false},{"description":"","id":86,"name":"Allm\u00e4nt Snack - Vuxenkanal #1","parent":2,"position":0,"temporary":false},{"description":"","id":87,"name":"Allm\u00e4nt Snack - Vuxenkanal #2","parent":2,"position":0,"temporary":false},{"description":"","id":88,"name":"Allm\u00e4nt Snack - Vuxenkanal #3 30 Plus","parent":2,"position":0,"temporary":false},{"description":"","id":205,"name":"V\u00e4lkommen in - Allm\u00e4n samlingskanal","parent":190,"position":0,"temporary":false},{"description":"","id":193,"name":"Startbanan (registrera er sj\u00e4lva)","parent":0,"position":999,"temporary":false},{"description":"","id":542,"name":"Spelkanaler","parent":0,"position":30,"temporary":false},{"description":"H\u00e4r spelar vi Battlefield och Project Reality.<\/span>\n

Foruml\u00e4nk: http:\/\/www.skyttegrav.se\/viewforum.php?f=8<\/a><\/p>","id":3,"name":"Battlefield","parent":542,"position":10,"temporary":false},{"description":"","id":119,"name":"Battlefield 3","parent":3,"position":0,"temporary":false},{"description":"","id":479,"name":"Grupp 1","parent":119,"position":0,"temporary":false},{"description":"","id":480,"name":"Grupp 2","parent":119,"position":0,"temporary":false},{"description":"","id":122,"name":"Battlefield 2","parent":3,"position":0,"temporary":false},{"description":"","id":16,"name":"Skyttegrav #2 Project Reality Coop","parent":122,"position":0,"temporary":false},{"description":"","id":47,"name":"Team #1","parent":16,"position":10,"temporary":false},{"description":"","id":54,"name":"Team #2","parent":16,"position":20,"temporary":false},{"description":"","id":17,"name":"Skyttegrav #1 BF2 Ranked","parent":122,"position":0,"temporary":false},{"description":"","id":384,"name":"Skyttegrav #3 Project Reality","parent":122,"position":0,"temporary":false},{"description":"","id":385,"name":"Team #1","parent":384,"position":0,"temporary":false},{"description":"","id":386,"name":"Team #2","parent":384,"position":0,"temporary":false},{"description":"SweClockers.com 64 HC Conquest:<\/b> \n

http:\/\/battlelog.battlefield.com\/bf4\/servers\/show\/pc\/dc5cdf97-7b5b-4b4f-962f-e6b74b7a9ad5\/SweClockers-com-64-HC-Conquest\/<\/a><\/a>SweClockers.com 32 Custom Rush\/Obliteration:<\/span><\/b> <\/p>\n

http:\/\/battlelog.battlefield.com\/bf4\/servers\/show\/pc\/b7c21efd-25ab-4306-a2ff-4342f41850bc\/SweClockers-com-32-Custom-Rush-Obliteration\/<\/a><\/p>","id":389,"name":"Battlefield 4","parent":3,"position":0,"temporary":false},{"description":"http:\/\/www.sweclockers.com\/forum\/149-spelclockers\/1247307-bf4-sweclockers-battlefield-servrar\/<\/a>","id":148,"name":"SweClockers 64 HC Conquest","parent":389,"position":10,"temporary":false},{"description":"","id":149,"name":"Team #1","parent":148,"position":0,"temporary":false},{"description":"","id":198,"name":"Squad #1","parent":149,"position":0,"temporary":false},{"description":"","id":199,"name":"Squad #2","parent":149,"position":0,"temporary":false},{"description":"","id":202,"name":"Squad #3","parent":149,"position":0,"temporary":false},{"description":"","id":194,"name":"Team #2","parent":148,"position":10,"temporary":false},{"description":"","id":200,"name":"Squad #1","parent":194,"position":0,"temporary":false},{"description":"","id":201,"name":"Squad #2","parent":194,"position":0,"temporary":false},{"description":"","id":203,"name":"Squad #3","parent":194,"position":0,"temporary":false},{"description":"","id":390,"name":"Grupp 1","parent":389,"position":110,"temporary":false},{"description":"","id":391,"name":"Grupp 2","parent":389,"position":120,"temporary":false},{"description":"","id":392,"name":"Grupp 3","parent":389,"position":130,"temporary":false},{"description":"","id":393,"name":"S\u00f6ker spelare","parent":389,"position":0,"temporary":false},{"description":"http:\/\/www.sweclockers.com\/forum\/149-spelclockers\/1247307-bf4-sweclockers-battlefield-servrar\/<\/a>","id":472,"name":"SweClockers 32 Vanilla maps","parent":389,"position":20,"temporary":false},{"description":"","id":473,"name":"Team #1","parent":472,"position":0,"temporary":false},{"description":"","id":475,"name":"Squad #1","parent":473,"position":0,"temporary":false},{"description":"","id":476,"name":"Squad #2","parent":473,"position":0,"temporary":false},{"description":"","id":474,"name":"Team #2","parent":472,"position":0,"temporary":false},{"description":"","id":477,"name":"Squad #1","parent":474,"position":0,"temporary":false},{"description":"","id":478,"name":"Squad #2","parent":474,"position":0,"temporary":false},{"description":"","id":560,"name":"Battlefield Hardline Beta","parent":3,"position":4,"temporary":false},{"description":"","id":561,"name":"Grupp 1","parent":560,"position":1,"temporary":false},{"description":"","id":562,"name":"Grupp 2","parent":560,"position":2,"temporary":false},{"description":"","id":563,"name":"Grupp 3","parent":560,"position":3,"temporary":false},{"description":"","id":564,"name":"S\u00f6ker spelare","parent":560,"position":0,"temporary":false},{"description":"","id":569,"name":"Bad Company 2","parent":3,"position":0,"temporary":false},{"description":"","id":570,"name":"Grupp 1","parent":569,"position":1,"temporary":false},{"description":"","id":571,"name":"Grupp 2","parent":569,"position":2,"temporary":false},{"description":"","id":4,"name":"Call of Duty","parent":542,"position":20,"temporary":false},{"description":"","id":23,"name":"Call of Duty 4","parent":4,"position":30,"temporary":false},{"description":"","id":25,"name":"Call of Duty - Modern Warfare 2","parent":4,"position":50,"temporary":false},{"description":"","id":95,"name":"Party 1","parent":25,"position":100,"temporary":false},{"description":"","id":96,"name":"Party 2","parent":25,"position":200,"temporary":false},{"description":"","id":139,"name":"Call of Duty - Modern Warfare 3","parent":4,"position":0,"temporary":false},{"description":"","id":140,"name":"Party 1","parent":139,"position":0,"temporary":false},{"description":"","id":212,"name":"Party 2","parent":139,"position":0,"temporary":false},{"description":"","id":246,"name":"Call of Duty - Black Ops 2","parent":4,"position":0,"temporary":false},{"description":"","id":254,"name":"Party 1","parent":246,"position":0,"temporary":false},{"description":"","id":255,"name":"Party 2","parent":246,"position":0,"temporary":false},{"description":"","id":395,"name":"Call of Duty - Ghosts","parent":4,"position":0,"temporary":false},{"description":"","id":396,"name":"Hardcore","parent":395,"position":0,"temporary":false},{"description":"","id":398,"name":"Party 1","parent":396,"position":0,"temporary":false},{"description":"","id":399,"name":"Party 2","parent":396,"position":0,"temporary":false},{"description":"","id":397,"name":"Softcore","parent":395,"position":0,"temporary":false},{"description":"","id":554,"name":"Call of Duty - Advance Warfare","parent":4,"position":0,"temporary":false},{"description":"","id":555,"name":"Party 1","parent":554,"position":0,"temporary":false},{"description":"","id":556,"name":"Party 2","parent":554,"position":0,"temporary":false},{"description":"","id":5,"name":"Counter-Strike","parent":542,"position":30,"temporary":false},{"description":"","id":28,"name":"Skyttegrav #1 - D2 INF Nuke","parent":5,"position":10,"temporary":false},{"description":"","id":30,"name":"Skyttegrav #3 - WC3FT ","parent":5,"position":30,"temporary":false},{"description":"","id":178,"name":"Global Offensive","parent":5,"position":0,"temporary":false},{"description":"","id":179,"name":"Competitive","parent":178,"position":20,"temporary":false},{"description":"","id":483,"name":"Rum #1","parent":179,"position":10,"temporary":false},{"description":"","id":484,"name":"Rum #2","parent":179,"position":20,"temporary":false},{"description":"","id":180,"name":"Rum #2","parent":178,"position":200,"temporary":false},{"description":"","id":181,"name":"Skyttegrav #3 Classic Competitive","parent":178,"position":0,"temporary":false},{"description":"","id":527,"name":"Rum #1","parent":178,"position":100,"temporary":false},{"description":"","id":7,"name":"\u00d6vriga spel","parent":542,"position":60,"temporary":false},{"description":"","id":345,"name":"Bilspel och racingsims (F1 Dirt ETS mm)","parent":7,"position":0,"temporary":false},{"description":"","id":537,"name":"Euro Truck Sim","parent":345,"position":0,"temporary":false},{"description":"","id":485,"name":"Voxel Spel","parent":7,"position":0,"temporary":false},{"description":"","id":486,"name":"7 days to die ","parent":485,"position":0,"temporary":false},{"description":"","id":487,"name":"Space Engineers","parent":485,"position":0,"temporary":false},{"description":"","id":536,"name":"Everquest landmark","parent":485,"position":0,"temporary":false},{"description":"","id":488,"name":"MMO","parent":7,"position":0,"temporary":false},{"description":"","id":394,"name":"Final Fantasy XIV - A Realm Reborn","parent":488,"position":0,"temporary":false},{"description":"","id":418,"name":"Rum #1","parent":394,"position":0,"temporary":false},{"description":"","id":419,"name":"Rum #2","parent":394,"position":0,"temporary":false},{"description":"","id":489,"name":"Mortal Online","parent":488,"position":0,"temporary":false},{"description":"","id":490,"name":"World of Warcraft","parent":488,"position":0,"temporary":false},{"description":"","id":491,"name":"Party 1","parent":490,"position":0,"temporary":false},{"description":"","id":492,"name":"Party 2","parent":490,"position":0,"temporary":false},{"description":"","id":495,"name":"Guild Wars 2","parent":488,"position":0,"temporary":false},{"description":"","id":513,"name":"Planetside 2","parent":488,"position":0,"temporary":false},{"description":"","id":529,"name":"Aion","parent":488,"position":0,"temporary":false},{"description":"First-person shooter & Third-person shooter","id":498,"name":"FPS och TPS","parent":7,"position":0,"temporary":false},{"description":"","id":207,"name":"Borderlands 2","parent":498,"position":0,"temporary":false},{"description":"","id":218,"name":"Portal 2","parent":498,"position":0,"temporary":false},{"description":"","id":232,"name":"Infestation Survivor Stories","parent":498,"position":0,"temporary":false},{"description":"Clanen vi har till Wipe heter \n

SKYTTEGRAV<\/p>\n

\n

Joina denna f\u00f6r att teama up.<\/p>","id":240,"name":"Grupp 1","parent":232,"position":0,"temporary":false},{"description":"","id":241,"name":"Grupp 2","parent":232,"position":1,"temporary":false},{"description":"","id":376,"name":"Skyttegrav KLAN SPEL","parent":232,"position":1,"temporary":false},{"description":"","id":499,"name":"ArmA","parent":498,"position":0,"temporary":false},{"description":"","id":500,"name":"Natural Selection 2","parent":498,"position":0,"temporary":false},{"description":"","id":502,"name":"Left 4 Dead","parent":498,"position":0,"temporary":false},{"description":"","id":514,"name":"Red Orchestra 2","parent":498,"position":0,"temporary":false},{"description":"","id":515,"name":"Allies","parent":514,"position":0,"temporary":false},{"description":"","id":516,"name":"Axis","parent":514,"position":0,"temporary":false},{"description":"","id":518,"name":"Mount and Blade - Warband","parent":498,"position":0,"temporary":false},{"description":"","id":519,"name":"Persistent World","parent":518,"position":0,"temporary":false},{"description":"","id":520,"name":"Mount and blade Vanilla","parent":518,"position":0,"temporary":false},{"description":"","id":541,"name":"Insurgency","parent":498,"position":0,"temporary":false},{"description":"","id":567,"name":"Evolve","parent":498,"position":0,"temporary":false},{"description":"","id":504,"name":"RTS och grand strategy","parent":7,"position":0,"temporary":false},{"description":"","id":356,"name":"Starcraft","parent":504,"position":0,"temporary":false},{"description":"","id":505,"name":"Company of Heroes","parent":504,"position":0,"temporary":false},{"description":"","id":506,"name":"Europa Universalis ","parent":504,"position":0,"temporary":false},{"description":"","id":534,"name":"Rum #1","parent":506,"position":0,"temporary":false},{"description":"","id":535,"name":"Rum #2","parent":506,"position":0,"temporary":false},{"description":"","id":523,"name":"Age of Empires","parent":504,"position":0,"temporary":false},{"description":"h\u00e4r spelar man Civilization<\/span><\/b> V<\/span><\/a>","id":533,"name":"Civilization V","parent":504,"position":0,"temporary":false},{"description":"Spel som \u00e4r gratis att k\u00f6ra.","id":510,"name":"Free to play","parent":7,"position":0,"temporary":false},{"description":"","id":375,"name":"Mechwarrior Online","parent":510,"position":0,"temporary":false},{"description":"","id":511,"name":"War Thunder","parent":510,"position":0,"temporary":false},{"description":"","id":526,"name":"Tank","parent":511,"position":0,"temporary":false},{"description":"","id":538,"name":"Flyg","parent":511,"position":0,"temporary":false},{"description":"","id":512,"name":"World of Tanks","parent":510,"position":0,"temporary":false},{"description":"","id":530,"name":"Town of salem","parent":510,"position":0,"temporary":false},{"description":"","id":521,"name":"Hack and slash","parent":7,"position":0,"temporary":false},{"description":"","id":167,"name":"Diablo 3","parent":521,"position":0,"temporary":false},{"description":"","id":336,"name":"Path of Exile","parent":521,"position":0,"temporary":false},{"description":"","id":383,"name":"Torchlight II","parent":521,"position":0,"temporary":false},{"description":"","id":522,"name":"MOBA","parent":7,"position":0,"temporary":false},{"description":"","id":6,"name":"League of Legends","parent":522,"position":0,"temporary":false},{"description":"","id":565,"name":"Grupp 1","parent":6,"position":5,"temporary":false},{"description":"","id":566,"name":"Grupp 2","parent":6,"position":10,"temporary":false},{"description":"","id":153,"name":"Dota 2","parent":522,"position":0,"temporary":false},{"description":"","id":236,"name":"Grupp 1","parent":153,"position":0,"temporary":false},{"description":"","id":237,"name":"Grupp 2","parent":153,"position":0,"temporary":false},{"description":"","id":532,"name":"Smite","parent":522,"position":0,"temporary":false},{"description":"","id":528,"name":"Tabletop Simulator","parent":7,"position":0,"temporary":false},{"description":"","id":559,"name":"Kerbal Space Program","parent":7,"position":0,"temporary":false},{"description":"","id":156,"name":"Minecraft","parent":542,"position":50,"temporary":false},{"description":"Serverip: mc.hemligastugan.com Dynmap \/ Regler: http:\/\/www.hemligastugan.com\/minecraft\/# <\/a>","id":157,"name":"Hemligastugan","parent":156,"position":0,"temporary":false},{"description":"L\u00e5st till admins f\u00f6r Hemligastugan.","id":388,"name":"Admin","parent":157,"position":2,"temporary":false},{"description":"","id":416,"name":"Grupp 1","parent":157,"position":0,"temporary":false},{"description":"","id":417,"name":"Grupp 2","parent":157,"position":0,"temporary":false},{"description":"Inte bara en samling moddar.. \u00c4ven med egenutvecklade MODS!<\/b> \n

MC Version 1.7.10 \/ Skyttegrav Modpack 2.0<\/p>\n

Hemsida: http:\/\/mc.skyttegrav.se<\/a><\/p>\n

Info & registrering: http:\/\/www.skyttegrav.se\/index.php?\/topic\/5-skyttegravse-custom-modpack<\/a><\/p>\n

Server IP: mc.skyttegrav.se<\/p>\n

Dynmap: http:\/\/mc.skyttegrav.se\/dynmap<\/a><\/p>","id":158,"name":"Skyttegrav Modpack","parent":156,"position":0,"temporary":false},{"description":"","id":539,"name":"Rum 1","parent":158,"position":0,"temporary":false},{"description":"","id":540,"name":"Rum 2","parent":158,"position":0,"temporary":false},{"description":"","id":170,"name":"Day Z","parent":542,"position":40,"temporary":false},{"description":"","id":176,"name":"Grupp 1","parent":170,"position":10,"temporary":false},{"description":"","id":177,"name":"Grupp 2","parent":170,"position":20,"temporary":false},{"description":"","id":196,"name":"Grupp 3","parent":170,"position":30,"temporary":false},{"description":"","id":197,"name":"Grupp 4","parent":170,"position":40,"temporary":false},{"description":"H\u00e4r s\u00f6ker ni spelare f\u00f6r ert spel.\n

\n

Skapa en egen kanal i denna med speltitel.<\/p>","id":192,"name":"S\u00f6ker spelare","parent":542,"position":0,"temporary":false},{"description":"H\u00e4r kan man sitta och titta p\u00e5 streams, E-evenemang eller liknande. Subkanaler kommer att skapas av admins men du f\u00e5r g\u00e4rna tipsa om ett evenemang.","id":543,"name":"Event-kanaler","parent":0,"position":11,"temporary":false},{"description":"","id":544,"name":"MS Presskonferens","parent":543,"position":10,"temporary":false},{"description":"","id":546,"name":"Titta och diskutera","parent":544,"position":5,"temporary":false},{"description":"","id":547,"name":"Tysta rummet","parent":544,"position":10,"temporary":false},{"description":"","id":548,"name":"Skyttegrav Free-2-Play Spelkv\u00e4llar","parent":543,"position":50,"temporary":false},{"description":"","id":553,"name":"Trackmania 29 Okt","parent":548,"position":0,"temporary":false},{"description":"","id":549,"name":"Rum #1","parent":553,"position":0,"temporary":false},{"description":"","id":550,"name":"Rum #2","parent":553,"position":0,"temporary":false},{"description":"","id":558,"name":"DreamHack","parent":543,"position":100,"temporary":false}],"players":[{"bytespersec":0,"channel":1,"comment":"","context":"","deaf":false,"identity":"","idlesecs":24306,"mute":false,"name":"pyootr","onlinesecs":24306,"os":"Win","osversion":"6.1.7601.1","release":"1.2.5","selfDeaf":true,"selfMute":true,"session":96,"suppress":true,"tcponly":false,"userid":66,"version":66053,"udpPing":51.1,"tcpPing":62.3},{"bytespersec":0,"channel":1,"comment":"Serveransvarig & Admin<\/b> f\u00f6r Skyttegrav.se\/Sweclockers.com spelservrar. \n

Supervisor<\/b> hos Skyttegrav.se<\/a>.<\/p>","context":"","deaf":false,"identity":"","idlesecs":29126,"mute":false,"name":"[SG-SUP]Gix","onlinesecs":29154,"os":"X11","osversion":"Linux Mint 17 Qiana","release":"1.2.8-1~ppa1~trusty1","selfDeaf":false,"selfMute":false,"session":124,"suppress":true,"tcponly":false,"userid":47,"version":66056,"udpPing":29.21,"tcpPing":28.47},{"bytespersec":0,"channel":1,"comment":"JAG TROR DIG URKEL!\n

<\/p>","context":"","deaf":false,"identity":"","idlesecs":22621,"mute":false,"name":"Eyem-_-","onlinesecs":24847,"os":"Win","osversion":"6.1.7601.1","release":"1.2.4","selfDeaf":false,"selfMute":false,"session":176,"suppress":true,"tcponly":false,"userid":1001,"version":66052,"udpPing":17.33,"tcpPing":20.11},{"bytespersec":0,"channel":1,"comment":"","context":"","deaf":false,"identity":"","idlesecs":1721,"mute":false,"name":"[SG-HA]Relemy","onlinesecs":29128,"os":"Win","osversion":"6.2.9200.1","release":"1.2.8","selfDeaf":true,"selfMute":true,"session":232,"suppress":true,"tcponly":false,"userid":1926,"version":66056,"udpPing":37.94,"tcpPing":42.24},{"bytespersec":0,"channel":1,"comment":"","context":"","deaf":false,"identity":"","idlesecs":28863,"mute":false,"name":"TheLikus","onlinesecs":29008,"os":"Win","osversion":"6.1.7601.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":269,"suppress":true,"tcponly":false,"userid":4120,"version":66056,"udpPing":11.01,"tcpPing":13.72},{"bytespersec":0,"channel":1,"comment":"","context":"","deaf":false,"identity":"","idlesecs":29137,"mute":false,"name":"Legoo","onlinesecs":29139,"os":"Win","osversion":"6.1.7601.1","release":"1.2.5","selfDeaf":false,"selfMute":false,"session":473,"suppress":true,"tcponly":false,"userid":1657,"version":66053,"udpPing":8.45,"tcpPing":23.04},{"bytespersec":0,"channel":432,"comment":"http:\/\/www.twitch.tv\/tobbbe__<\/a>","context":"","deaf":false,"identity":"","idlesecs":841,"mute":false,"name":"[SweC]Tobbbe__","onlinesecs":29138,"os":"Win","osversion":"6.2.9200.1","release":"1.2.8","selfDeaf":true,"selfMute":true,"session":5,"suppress":false,"tcponly":false,"userid":3769,"version":66056,"udpPing":22.64,"tcpPing":24.04},{"bytespersec":6870,"channel":432,"comment":"

<\/p>","context":"","deaf":false,"identity":"","idlesecs":0,"mute":false,"name":"Vilse(SWE)","onlinesecs":16399,"os":"Win","osversion":"6.1.7601.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":110,"suppress":false,"tcponly":false,"userid":4124,"version":66056,"udpPing":13.83,"tcpPing":16.21},{"bytespersec":0,"channel":432,"comment":"","context":"","deaf":false,"identity":"","idlesecs":23,"mute":false,"name":"Th3MadPanda","onlinesecs":29137,"os":"Win","osversion":"6.1.7601.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":236,"suppress":false,"tcponly":false,"userid":2099,"version":66056,"udpPing":8.86,"tcpPing":11.72},{"bytespersec":0,"channel":432,"comment":"","context":"","deaf":false,"identity":"","idlesecs":12,"mute":false,"name":"Mumin","onlinesecs":9347,"os":"Win","osversion":"6.1.7601.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":306,"suppress":false,"tcponly":false,"userid":4125,"version":66056,"udpPing":19.05,"tcpPing":22.56},{"bytespersec":0,"channel":432,"comment":"Greetinx Programs!<\/a> \n

\n

V\u00e4lkommen till SweClockers och Skyttegravs gemensamma Mumble!<\/p>\n

\n

Ni kan fr\u00e5ga mig om administrativa saker p\u00e5 servers eller mumble, jag \u00e4r huvudadmin f\u00f6r SweC g\u00e4nget och dessutom forumledare f\u00f6r SweClockers.com. H\u00e4r \u00e4r reglerna f\u00f6r mumble och SweC forum.<\/a><\/p>\n

<\/p>\n

Vi satsar p\u00e5 en trevlig st\u00e4mning online! :)<\/p>\n

","context":"","deaf":false,"identity":"","idlesecs":127,"mute":false,"name":"[SweC-H]Lan","onlinesecs":29132,"os":"Win","osversion":"6.1.7601.1","release":"1.2.5","selfDeaf":false,"selfMute":false,"session":353,"suppress":false,"tcponly":false,"userid":56,"version":66053,"udpPing":15.76,"tcpPing":35.22},{"bytespersec":6865,"channel":433,"comment":"","context":"","deaf":false,"identity":"","idlesecs":0,"mute":false,"name":"Gson","onlinesecs":4023,"os":"Win","osversion":"6.2.9200.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":146,"suppress":false,"tcponly":false,"userid":4123,"version":66056,"udpPing":51.51,"tcpPing":57.29},{"bytespersec":0,"channel":433,"comment":"","context":"","deaf":false,"identity":"","idlesecs":15,"mute":false,"name":"lampan","onlinesecs":19196,"os":"Win","osversion":"6.2.9200.1","release":"1.2.5","selfDeaf":false,"selfMute":false,"session":463,"suppress":false,"tcponly":false,"userid":3404,"version":66053,"udpPing":13.6,"tcpPing":16.66},{"bytespersec":0,"channel":451,"comment":"","context":"","deaf":false,"identity":"","idlesecs":773,"mute":false,"name":"[SweC-T]Grabbengr\u00e5","onlinesecs":28304,"os":"Win","osversion":"6.2.9200.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":53,"suppress":false,"tcponly":false,"userid":1952,"version":66056,"udpPing":20.4,"tcpPing":22.68},{"bytespersec":0,"channel":451,"comment":"","context":"","deaf":false,"identity":"","idlesecs":1299,"mute":false,"name":"[SweC-H]Kinekin","onlinesecs":29134,"os":"Win","osversion":"6.2.9200.1","release":"1.2.8","selfDeaf":true,"selfMute":true,"session":180,"suppress":false,"tcponly":false,"userid":2426,"version":66056,"udpPing":49.78,"tcpPing":52.22},{"bytespersec":0,"channel":451,"comment":"Det h\u00e4nder att jag spelar spel ibland.\n

<\/p>\n

<\/p>\n

<\/p>\n

<\/p>","context":"","deaf":false,"identity":"","idlesecs":13,"mute":false,"name":"[SweC-T]DavidtheDoom","onlinesecs":29086,"os":"Win","osversion":"6.2.9200.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":203,"suppress":false,"tcponly":false,"userid":3030,"version":66056,"udpPing":3.96,"tcpPing":5.61},{"bytespersec":0,"channel":451,"comment":"SweC spelservrar finns ocks\u00e5 p\u00e5 Facebook<\/a>","context":"","deaf":false,"identity":"","idlesecs":155,"mute":false,"name":"[SweC-H]Raven_cc","onlinesecs":21915,"os":"Win","osversion":"6.1.7600.1","release":"1.2.7","selfDeaf":false,"selfMute":false,"session":264,"suppress":false,"tcponly":true,"userid":78,"version":66055,"udpPing":19.73,"tcpPing":25.93},{"bytespersec":0,"channel":451,"comment":"","context":"","deaf":false,"identity":"","idlesecs":1628,"mute":false,"name":"OskarWallin","onlinesecs":12269,"os":"Win","osversion":"6.1.7601.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":272,"suppress":false,"tcponly":false,"userid":3783,"version":66056,"udpPing":11.97,"tcpPing":31.09},{"bytespersec":6658,"channel":451,"comment":"","context":"","deaf":false,"identity":"","idlesecs":0,"mute":false,"name":"[SweC-A]Hitman","onlinesecs":29130,"os":"Win","osversion":"6.1.7601.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":485,"suppress":false,"tcponly":true,"userid":76,"version":66056,"udpPing":21.36,"tcpPing":28},{"bytespersec":7223,"channel":451,"comment":"","context":"","deaf":false,"identity":"","idlesecs":0,"mute":false,"name":"[SG-A]bl0m1","onlinesecs":29107,"os":"Win","osversion":"6.2.9200.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":488,"suppress":false,"tcponly":false,"userid":3447,"version":66056,"udpPing":40.3,"tcpPing":43.52},{"bytespersec":0,"channel":390,"comment":"","context":"","deaf":false,"identity":"","idlesecs":385,"mute":false,"name":"shifted","onlinesecs":385,"os":"Win","osversion":"6.2.9200.1","release":"1.2.7","selfDeaf":false,"selfMute":false,"session":294,"suppress":false,"tcponly":false,"userid":4065,"version":66055,"udpPing":21.16,"tcpPing":21.38},{"bytespersec":0,"channel":391,"comment":"","context":"","deaf":false,"identity":"","idlesecs":10201,"mute":false,"name":"Tennethe","onlinesecs":19638,"os":"Win","osversion":"6.2.9200.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":152,"suppress":false,"tcponly":false,"userid":4081,"version":66056,"udpPing":28.6,"tcpPing":32.91},{"bytespersec":0,"channel":95,"comment":"","context":"","deaf":false,"identity":"","idlesecs":97,"mute":false,"name":"Figge86","onlinesecs":4319,"os":"Win","osversion":"6.2.9200.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":259,"suppress":false,"tcponly":false,"userid":3459,"version":66056,"udpPing":15.4,"tcpPing":17.42},{"bytespersec":0,"channel":95,"comment":"","context":"","deaf":false,"identity":"","idlesecs":99,"mute":false,"name":"sterner007","onlinesecs":9667,"os":"Win","osversion":"6.1.7601.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":312,"suppress":false,"tcponly":false,"userid":3836,"version":66056,"udpPing":33.4,"tcpPing":36.36},{"bytespersec":0,"channel":555,"comment":"","context":"","deaf":false,"identity":"","idlesecs":183,"mute":false,"name":"[SG]K\u00e5Be","onlinesecs":29128,"os":"Win","osversion":"6.1.7601.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":12,"suppress":false,"tcponly":false,"userid":27,"version":66056,"udpPing":20.87,"tcpPing":24.01},{"bytespersec":0,"channel":555,"comment":"beh\u00f6ver ni mig kalla\n

","context":"","deaf":false,"identity":"","idlesecs":188,"mute":false,"name":"[SG-SUP]strike","onlinesecs":5637,"os":"Win","osversion":"5.1.2600.1","release":"1.2.3","selfDeaf":false,"selfMute":false,"session":314,"suppress":false,"tcponly":false,"userid":19,"version":66051,"udpPing":21.27,"tcpPing":26.18},{"bytespersec":0,"channel":492,"comment":"","context":"","deaf":false,"identity":"","idlesecs":35,"mute":false,"name":"Widoxz","onlinesecs":28334,"os":"Win","osversion":"6.1.7601.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":24,"suppress":false,"tcponly":false,"userid":4058,"version":66056,"udpPing":35.75,"tcpPing":55.55},{"bytespersec":6890,"channel":492,"comment":"","context":"","deaf":false,"identity":"","idlesecs":0,"mute":false,"name":"FourO","onlinesecs":3421,"os":"Win","osversion":"6.1.7601.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":131,"suppress":false,"tcponly":false,"userid":4111,"version":66056,"udpPing":9.7,"tcpPing":15.63},{"bytespersec":0,"channel":492,"comment":"","context":"","deaf":false,"identity":"","idlesecs":3444,"mute":false,"name":"lemurtacos","onlinesecs":3445,"os":"Win","osversion":"6.1.7601.1","release":"1.2.8","selfDeaf":false,"selfMute":true,"session":185,"suppress":false,"tcponly":false,"userid":3827,"version":66056,"udpPing":9.85,"tcpPing":13.46},{"bytespersec":8833,"channel":492,"comment":"","context":"","deaf":false,"identity":"","idlesecs":0,"mute":false,"name":"kaviar","onlinesecs":23142,"os":"Win","osversion":"6.1.7601.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":349,"suppress":false,"tcponly":false,"userid":3759,"version":66056,"udpPing":11.66,"tcpPing":14.67},{"bytespersec":9083,"channel":492,"comment":"","context":"","deaf":false,"identity":"","idlesecs":0,"mute":false,"name":"LillaEmma","onlinesecs":3957,"os":"Win","osversion":"6.1.7601.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":419,"suppress":false,"tcponly":false,"userid":3758,"version":66056,"udpPing":10.31,"tcpPing":13.45},{"bytespersec":0,"channel":218,"comment":"","context":"","deaf":false,"identity":"","idlesecs":1698,"mute":false,"name":"Maichopalami","onlinesecs":4899,"os":"Win","osversion":"6.2.9200.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":157,"suppress":false,"tcponly":false,"userid":1563,"version":66056,"udpPing":12.86,"tcpPing":15.14},{"bytespersec":0,"channel":512,"comment":"","context":"","deaf":false,"identity":"","idlesecs":2640,"mute":false,"name":"[SG]Binge","onlinesecs":11586,"os":"Win","osversion":"6.1.7601.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":333,"suppress":false,"tcponly":false,"userid":1837,"version":66056,"udpPing":22.69,"tcpPing":26},{"bytespersec":9014,"channel":167,"comment":"","context":"","deaf":false,"identity":"","idlesecs":0,"mute":false,"name":"shimmerghost","onlinesecs":17161,"os":"Win","osversion":"6.1.7601.1","release":"1.2.4","selfDeaf":false,"selfMute":false,"session":144,"suppress":false,"tcponly":false,"userid":2347,"version":66052,"udpPing":30.95,"tcpPing":33.04},{"bytespersec":8874,"channel":167,"comment":"","context":"","deaf":false,"identity":"","idlesecs":0,"mute":false,"name":"Lankfisher","onlinesecs":17163,"os":"Win","osversion":"6.2.9200.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":186,"suppress":false,"tcponly":false,"userid":4106,"version":66056,"udpPing":21.28,"tcpPing":23.3},{"bytespersec":0,"channel":167,"comment":"","context":"","deaf":false,"identity":"","idlesecs":1,"mute":false,"name":"AndreasLindgren","onlinesecs":5267,"os":"Win","osversion":"6.2.9200.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":235,"suppress":false,"tcponly":false,"userid":2439,"version":66056,"udpPing":31.59,"tcpPing":17.07},{"bytespersec":0,"channel":167,"comment":"","context":"","deaf":false,"identity":"","idlesecs":5210,"mute":false,"name":"Emmag","onlinesecs":5229,"os":"Win","osversion":"6.1.7601.1","release":"1.2.4","selfDeaf":false,"selfMute":true,"session":300,"suppress":false,"tcponly":false,"userid":2438,"version":66052,"udpPing":24.04,"tcpPing":25.43},{"bytespersec":0,"channel":383,"comment":"","context":"","deaf":false,"identity":"","idlesecs":3961,"mute":false,"name":"Tobias","onlinesecs":8817,"os":"Win","osversion":"6.1.7601.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":325,"suppress":false,"tcponly":false,"userid":3788,"version":66056,"udpPing":15.74,"tcpPing":22.28}],"numplayers":38,"gq_online":true,"gq_address":"95.130.64.232","gq_port_client":64738,"gq_port_query":27800,"gq_protocol":"mumble","gq_type":"mumble","gq_name":"Mumble Server","gq_transport":"tcp","gq_joinlink":"mumble:\/\/95.130.64.232:64738\/"}},"filtered":{"95.130.64.232:64738":{"dedicated":1,"id":1,"name":"Skyttegrav & SweClockers Mumble","x_connecturl":"mumble:\/\/mumble.skyttegrav.se\/?version=1.2.0","x_gtmurmur_connectport":"64738","x_gtmurmur_max_users":"250","x_gtmurmur_server_version":"1.2.8","x_gtmurmur_doclen":224093,"teams":[{"description":"Welcome! <\/b>\n

This server requires registration<\/span> in order to move from Root.Please register yourself by selecting Self --> Register in the menu bar, or right-clicking on your nick and choose Register.<\/b><\/p>","id":0,"name":"Root","parent":-1,"position":0,"temporary":false,"gq_name":"Root"},{"description":"","id":1,"name":"AFK","parent":0,"position":0,"temporary":false,"gq_name":"AFK"},{"description":"","id":8,"name":"Utl\u00e5nade Kanaler","parent":0,"position":100,"temporary":false,"gq_name":"Utl\u00e5nade Kanaler"},{"description":"Endast F\u00f6r Skyttegrav admins!<\/b>","id":9,"name":"Admins Corner (private)","parent":0,"position":200,"temporary":false,"gq_name":"Admins Corner (private)"},{"description":"","id":38,"name":"Admins","parent":9,"position":11,"temporary":false,"gq_name":"Admins"},{"description":"","id":43,"name":"Headadmins Corner","parent":9,"position":60,"temporary":false,"gq_name":"Headadmins Corner"},{"description":"","id":44,"name":"Supervisors Corner - Polska Riksdagen","parent":9,"position":70,"temporary":false,"gq_name":"Supervisors Corner - Polska Riksdagen"},{"description":"Spelf\u00f6reningen bakom Skyttegrav.se","id":150,"name":"United Gaming","parent":9,"position":0,"temporary":false,"gq_name":"United Gaming"},{"description":"","id":151,"name":"M\u00f6te","parent":150,"position":0,"temporary":false,"gq_name":"M\u00f6te"},{"description":"","id":152,"name":"Styrelsem\u00f6te","parent":150,"position":0,"temporary":false,"gq_name":"Styrelsem\u00f6te"},{"description":"Endast F\u00f6r SweClockers.com admins!<\/b>","id":187,"name":"Sweclockers","parent":9,"position":0,"temporary":false,"gq_name":"Sweclockers"},{"description":"","id":188,"name":"Allm\u00e4n Admin","parent":187,"position":0,"temporary":false,"gq_name":"Allm\u00e4n Admin"},{"description":"","id":189,"name":"Privat Admin (Endast inbjudan)","parent":187,"position":0,"temporary":false,"gq_name":"Privat Admin (Endast inbjudan)"},{"description":"","id":214,"name":"Allm\u00e4n Admin (Delad)","parent":9,"position":10,"temporary":false,"gq_name":"Allm\u00e4n Admin (Delad)"},{"description":"","id":183,"name":"SweClockers","parent":0,"position":10,"temporary":false,"gq_name":"SweClockers"},{"description":"H\u00e4r kommer v\u00e5ra stream och webtv att s\u00e4ndas! \n

\n

Bes\u00f6k www.swec.tv och avnjut s\u00e4ndningen, vill du deltaga s\u00e5 skicka ett meddelande i mumble till en admin som antingen kan flytta dig eller ge dig l\u00f6senordet. Vi kommer att b\u00e5de casta och spela olika spel l\u00f6pande.<\/p>\n

\n

I kanalen g\u00e4ller strikt ljud och informationskontroll, akta er allts\u00e5 f\u00f6r att inte s\u00e4ga f\u00f6r mycket.<\/p>","id":358,"name":"SweC TV Studio (private)","parent":183,"position":100,"temporary":false,"gq_name":"SweC TV Studio (private)"},{"description":"Vill ni deltaga i SweC TV? \n

\n

S\u00e4tt er i detta rummet s\u00e5 kommer vi att dra in er i cast rummet vid tillf\u00e4lle, ni \u00e4r varmt v\u00e4lkomna att titta p\u00e5 www.swec.tv<\/a> medan ni v\u00e4ntar! <\/p>\n

\n

N\u00e4r ni kommer in i cast kanalen \u00e4r ni automatiskt satta till "mute", vi kommer att \u00e4ndra det n\u00e4r ni kommer in.<\/p>\n

\n

\n

","id":402,"name":"SweC TV lobby (wait for invite to cast room)","parent":183,"position":200,"temporary":false,"gq_name":"SweC TV lobby (wait for invite to cast room)"},{"description":"Hj\u00e4lp med Mumble? L\u00e4s h\u00e4r -> Mumble tr\u00e5d p\u00e5 SweClockers<\/a>","id":421,"name":"Spelkv\u00e4llar","parent":183,"position":300,"temporary":false,"gq_name":"Spelkv\u00e4llar"},{"description":"H\u00e4r har ni nyttig information om spelkv\u00e4llarna! \n

SpelClockers<\/a> Spelkv\u00e4llar<\/p>\n

Sweclockers Steam chat grupp<\/a><\/p>\n

<\/p>","id":426,"name":"Allm\u00e4n samlingskanal - Kom hit f\u00f6r r\u00e5d och v\u00e4gledning","parent":421,"position":0,"temporary":false,"gq_name":"Allm\u00e4n samlingskanal - Kom hit f\u00f6r r\u00e5d och v\u00e4gledning"},{"description":"","id":427,"name":"Reserv #2","parent":421,"position":20,"temporary":false,"gq_name":"Reserv #2"},{"description":"","id":429,"name":"Grupp 1","parent":427,"position":10,"temporary":false,"gq_name":"Grupp 1"},{"description":"","id":430,"name":"Grupp 2","parent":427,"position":20,"temporary":false,"gq_name":"Grupp 2"},{"description":"","id":449,"name":"Grupp 3","parent":427,"position":30,"temporary":false,"gq_name":"Grupp 3"},{"description":"","id":450,"name":"Grupp 4","parent":427,"position":40,"temporary":false,"gq_name":"Grupp 4"},{"description":"","id":453,"name":"Rematch och rekryt Lobby","parent":427,"position":0,"temporary":false,"gq_name":"Rematch och rekryt Lobby"},{"description":"","id":455,"name":"Grupp 5","parent":427,"position":50,"temporary":false,"gq_name":"Grupp 5"},{"description":"","id":456,"name":"Grupp 6","parent":427,"position":60,"temporary":false,"gq_name":"Grupp 6"},{"description":"","id":428,"name":"12h stream med SpelClockers - L\u00f6rdag 28 feb","parent":421,"position":10,"temporary":false,"gq_name":"12h stream med SpelClockers - L\u00f6rdag 28 feb"},{"description":"","id":432,"name":"MechWarrior Online","parent":428,"position":10,"temporary":false,"gq_name":"MechWarrior Online"},{"description":"","id":433,"name":"Grupp 2","parent":428,"position":20,"temporary":false,"gq_name":"Grupp 2"},{"description":"","id":434,"name":"Grupp 3","parent":428,"position":30,"temporary":false,"gq_name":"Grupp 3"},{"description":"","id":443,"name":"Grupp 4","parent":428,"position":40,"temporary":false,"gq_name":"Grupp 4"},{"description":"","id":444,"name":"Grupp 5","parent":428,"position":50,"temporary":false,"gq_name":"Grupp 5"},{"description":"","id":451,"name":"Samlingsal","parent":428,"position":0,"temporary":false,"gq_name":"Samlingsal"},{"description":"","id":459,"name":"Grupp 6","parent":428,"position":60,"temporary":false,"gq_name":"Grupp 6"},{"description":"","id":436,"name":"Reserv #3","parent":421,"position":30,"temporary":false,"gq_name":"Reserv #3"},{"description":"","id":437,"name":"Grupp 1","parent":436,"position":10,"temporary":false,"gq_name":"Grupp 1"},{"description":"","id":438,"name":"Grupp 2","parent":436,"position":20,"temporary":false,"gq_name":"Grupp 2"},{"description":"","id":439,"name":"Grupp 3","parent":436,"position":30,"temporary":false,"gq_name":"Grupp 3"},{"description":"","id":440,"name":"Grupp 4","parent":436,"position":40,"temporary":false,"gq_name":"Grupp 4"},{"description":"","id":441,"name":"Grupp 5","parent":436,"position":50,"temporary":false,"gq_name":"Grupp 5"},{"description":"","id":442,"name":"Grupp 6","parent":436,"position":60,"temporary":false,"gq_name":"Grupp 6"},{"description":"","id":452,"name":"Rematch och rekryt Lobby","parent":436,"position":0,"temporary":false,"gq_name":"Rematch och rekryt Lobby"},{"description":"","id":190,"name":"Snack-kanaler","parent":0,"position":20,"temporary":false,"gq_name":"Snack-kanaler"},{"description":"","id":2,"name":"Allm\u00e4nt Snack","parent":190,"position":100,"temporary":false,"gq_name":"Allm\u00e4nt Snack"},{"description":"","id":10,"name":"Allm\u00e4nt Snack - Rum #1","parent":2,"position":0,"temporary":false,"gq_name":"Allm\u00e4nt Snack - Rum #1"},{"description":"","id":11,"name":"Allm\u00e4nt Snack - Rum #2","parent":2,"position":0,"temporary":false,"gq_name":"Allm\u00e4nt Snack - Rum #2"},{"description":"","id":12,"name":"Allm\u00e4nt Snack - Rum #3","parent":2,"position":0,"temporary":false,"gq_name":"Allm\u00e4nt Snack - Rum #3"},{"description":"","id":13,"name":"Allm\u00e4nt Snack - Rum #4","parent":2,"position":0,"temporary":false,"gq_name":"Allm\u00e4nt Snack - Rum #4"},{"description":"","id":14,"name":"Utvisningsb\u00e5set","parent":2,"position":1000,"temporary":false,"gq_name":"Utvisningsb\u00e5set"},{"description":"","id":84,"name":"Allm\u00e4nt Snack - Rum #5","parent":2,"position":0,"temporary":false,"gq_name":"Allm\u00e4nt Snack - Rum #5"},{"description":"","id":85,"name":"Allm\u00e4nt Snack - Rum #6","parent":2,"position":0,"temporary":false,"gq_name":"Allm\u00e4nt Snack - Rum #6"},{"description":"","id":86,"name":"Allm\u00e4nt Snack - Vuxenkanal #1","parent":2,"position":0,"temporary":false,"gq_name":"Allm\u00e4nt Snack - Vuxenkanal #1"},{"description":"","id":87,"name":"Allm\u00e4nt Snack - Vuxenkanal #2","parent":2,"position":0,"temporary":false,"gq_name":"Allm\u00e4nt Snack - Vuxenkanal #2"},{"description":"","id":88,"name":"Allm\u00e4nt Snack - Vuxenkanal #3 30 Plus","parent":2,"position":0,"temporary":false,"gq_name":"Allm\u00e4nt Snack - Vuxenkanal #3 30 Plus"},{"description":"","id":205,"name":"V\u00e4lkommen in - Allm\u00e4n samlingskanal","parent":190,"position":0,"temporary":false,"gq_name":"V\u00e4lkommen in - Allm\u00e4n samlingskanal"},{"description":"","id":193,"name":"Startbanan (registrera er sj\u00e4lva)","parent":0,"position":999,"temporary":false,"gq_name":"Startbanan (registrera er sj\u00e4lva)"},{"description":"","id":542,"name":"Spelkanaler","parent":0,"position":30,"temporary":false,"gq_name":"Spelkanaler"},{"description":"H\u00e4r spelar vi Battlefield och Project Reality.<\/span>\n

Foruml\u00e4nk: http:\/\/www.skyttegrav.se\/viewforum.php?f=8<\/a><\/p>","id":3,"name":"Battlefield","parent":542,"position":10,"temporary":false,"gq_name":"Battlefield"},{"description":"","id":119,"name":"Battlefield 3","parent":3,"position":0,"temporary":false,"gq_name":"Battlefield 3"},{"description":"","id":479,"name":"Grupp 1","parent":119,"position":0,"temporary":false,"gq_name":"Grupp 1"},{"description":"","id":480,"name":"Grupp 2","parent":119,"position":0,"temporary":false,"gq_name":"Grupp 2"},{"description":"","id":122,"name":"Battlefield 2","parent":3,"position":0,"temporary":false,"gq_name":"Battlefield 2"},{"description":"","id":16,"name":"Skyttegrav #2 Project Reality Coop","parent":122,"position":0,"temporary":false,"gq_name":"Skyttegrav #2 Project Reality Coop"},{"description":"","id":47,"name":"Team #1","parent":16,"position":10,"temporary":false,"gq_name":"Team #1"},{"description":"","id":54,"name":"Team #2","parent":16,"position":20,"temporary":false,"gq_name":"Team #2"},{"description":"","id":17,"name":"Skyttegrav #1 BF2 Ranked","parent":122,"position":0,"temporary":false,"gq_name":"Skyttegrav #1 BF2 Ranked"},{"description":"","id":384,"name":"Skyttegrav #3 Project Reality","parent":122,"position":0,"temporary":false,"gq_name":"Skyttegrav #3 Project Reality"},{"description":"","id":385,"name":"Team #1","parent":384,"position":0,"temporary":false,"gq_name":"Team #1"},{"description":"","id":386,"name":"Team #2","parent":384,"position":0,"temporary":false,"gq_name":"Team #2"},{"description":"SweClockers.com 64 HC Conquest:<\/b> \n

http:\/\/battlelog.battlefield.com\/bf4\/servers\/show\/pc\/dc5cdf97-7b5b-4b4f-962f-e6b74b7a9ad5\/SweClockers-com-64-HC-Conquest\/<\/a><\/a>SweClockers.com 32 Custom Rush\/Obliteration:<\/span><\/b> <\/p>\n

http:\/\/battlelog.battlefield.com\/bf4\/servers\/show\/pc\/b7c21efd-25ab-4306-a2ff-4342f41850bc\/SweClockers-com-32-Custom-Rush-Obliteration\/<\/a><\/p>","id":389,"name":"Battlefield 4","parent":3,"position":0,"temporary":false,"gq_name":"Battlefield 4"},{"description":"http:\/\/www.sweclockers.com\/forum\/149-spelclockers\/1247307-bf4-sweclockers-battlefield-servrar\/<\/a>","id":148,"name":"SweClockers 64 HC Conquest","parent":389,"position":10,"temporary":false,"gq_name":"SweClockers 64 HC Conquest"},{"description":"","id":149,"name":"Team #1","parent":148,"position":0,"temporary":false,"gq_name":"Team #1"},{"description":"","id":198,"name":"Squad #1","parent":149,"position":0,"temporary":false,"gq_name":"Squad #1"},{"description":"","id":199,"name":"Squad #2","parent":149,"position":0,"temporary":false,"gq_name":"Squad #2"},{"description":"","id":202,"name":"Squad #3","parent":149,"position":0,"temporary":false,"gq_name":"Squad #3"},{"description":"","id":194,"name":"Team #2","parent":148,"position":10,"temporary":false,"gq_name":"Team #2"},{"description":"","id":200,"name":"Squad #1","parent":194,"position":0,"temporary":false,"gq_name":"Squad #1"},{"description":"","id":201,"name":"Squad #2","parent":194,"position":0,"temporary":false,"gq_name":"Squad #2"},{"description":"","id":203,"name":"Squad #3","parent":194,"position":0,"temporary":false,"gq_name":"Squad #3"},{"description":"","id":390,"name":"Grupp 1","parent":389,"position":110,"temporary":false,"gq_name":"Grupp 1"},{"description":"","id":391,"name":"Grupp 2","parent":389,"position":120,"temporary":false,"gq_name":"Grupp 2"},{"description":"","id":392,"name":"Grupp 3","parent":389,"position":130,"temporary":false,"gq_name":"Grupp 3"},{"description":"","id":393,"name":"S\u00f6ker spelare","parent":389,"position":0,"temporary":false,"gq_name":"S\u00f6ker spelare"},{"description":"http:\/\/www.sweclockers.com\/forum\/149-spelclockers\/1247307-bf4-sweclockers-battlefield-servrar\/<\/a>","id":472,"name":"SweClockers 32 Vanilla maps","parent":389,"position":20,"temporary":false,"gq_name":"SweClockers 32 Vanilla maps"},{"description":"","id":473,"name":"Team #1","parent":472,"position":0,"temporary":false,"gq_name":"Team #1"},{"description":"","id":475,"name":"Squad #1","parent":473,"position":0,"temporary":false,"gq_name":"Squad #1"},{"description":"","id":476,"name":"Squad #2","parent":473,"position":0,"temporary":false,"gq_name":"Squad #2"},{"description":"","id":474,"name":"Team #2","parent":472,"position":0,"temporary":false,"gq_name":"Team #2"},{"description":"","id":477,"name":"Squad #1","parent":474,"position":0,"temporary":false,"gq_name":"Squad #1"},{"description":"","id":478,"name":"Squad #2","parent":474,"position":0,"temporary":false,"gq_name":"Squad #2"},{"description":"","id":560,"name":"Battlefield Hardline Beta","parent":3,"position":4,"temporary":false,"gq_name":"Battlefield Hardline Beta"},{"description":"","id":561,"name":"Grupp 1","parent":560,"position":1,"temporary":false,"gq_name":"Grupp 1"},{"description":"","id":562,"name":"Grupp 2","parent":560,"position":2,"temporary":false,"gq_name":"Grupp 2"},{"description":"","id":563,"name":"Grupp 3","parent":560,"position":3,"temporary":false,"gq_name":"Grupp 3"},{"description":"","id":564,"name":"S\u00f6ker spelare","parent":560,"position":0,"temporary":false,"gq_name":"S\u00f6ker spelare"},{"description":"","id":569,"name":"Bad Company 2","parent":3,"position":0,"temporary":false,"gq_name":"Bad Company 2"},{"description":"","id":570,"name":"Grupp 1","parent":569,"position":1,"temporary":false,"gq_name":"Grupp 1"},{"description":"","id":571,"name":"Grupp 2","parent":569,"position":2,"temporary":false,"gq_name":"Grupp 2"},{"description":"","id":4,"name":"Call of Duty","parent":542,"position":20,"temporary":false,"gq_name":"Call of Duty"},{"description":"","id":23,"name":"Call of Duty 4","parent":4,"position":30,"temporary":false,"gq_name":"Call of Duty 4"},{"description":"","id":25,"name":"Call of Duty - Modern Warfare 2","parent":4,"position":50,"temporary":false,"gq_name":"Call of Duty - Modern Warfare 2"},{"description":"","id":95,"name":"Party 1","parent":25,"position":100,"temporary":false,"gq_name":"Party 1"},{"description":"","id":96,"name":"Party 2","parent":25,"position":200,"temporary":false,"gq_name":"Party 2"},{"description":"","id":139,"name":"Call of Duty - Modern Warfare 3","parent":4,"position":0,"temporary":false,"gq_name":"Call of Duty - Modern Warfare 3"},{"description":"","id":140,"name":"Party 1","parent":139,"position":0,"temporary":false,"gq_name":"Party 1"},{"description":"","id":212,"name":"Party 2","parent":139,"position":0,"temporary":false,"gq_name":"Party 2"},{"description":"","id":246,"name":"Call of Duty - Black Ops 2","parent":4,"position":0,"temporary":false,"gq_name":"Call of Duty - Black Ops 2"},{"description":"","id":254,"name":"Party 1","parent":246,"position":0,"temporary":false,"gq_name":"Party 1"},{"description":"","id":255,"name":"Party 2","parent":246,"position":0,"temporary":false,"gq_name":"Party 2"},{"description":"","id":395,"name":"Call of Duty - Ghosts","parent":4,"position":0,"temporary":false,"gq_name":"Call of Duty - Ghosts"},{"description":"","id":396,"name":"Hardcore","parent":395,"position":0,"temporary":false,"gq_name":"Hardcore"},{"description":"","id":398,"name":"Party 1","parent":396,"position":0,"temporary":false,"gq_name":"Party 1"},{"description":"","id":399,"name":"Party 2","parent":396,"position":0,"temporary":false,"gq_name":"Party 2"},{"description":"","id":397,"name":"Softcore","parent":395,"position":0,"temporary":false,"gq_name":"Softcore"},{"description":"","id":554,"name":"Call of Duty - Advance Warfare","parent":4,"position":0,"temporary":false,"gq_name":"Call of Duty - Advance Warfare"},{"description":"","id":555,"name":"Party 1","parent":554,"position":0,"temporary":false,"gq_name":"Party 1"},{"description":"","id":556,"name":"Party 2","parent":554,"position":0,"temporary":false,"gq_name":"Party 2"},{"description":"","id":5,"name":"Counter-Strike","parent":542,"position":30,"temporary":false,"gq_name":"Counter-Strike"},{"description":"","id":28,"name":"Skyttegrav #1 - D2 INF Nuke","parent":5,"position":10,"temporary":false,"gq_name":"Skyttegrav #1 - D2 INF Nuke"},{"description":"","id":30,"name":"Skyttegrav #3 - WC3FT ","parent":5,"position":30,"temporary":false,"gq_name":"Skyttegrav #3 - WC3FT "},{"description":"","id":178,"name":"Global Offensive","parent":5,"position":0,"temporary":false,"gq_name":"Global Offensive"},{"description":"","id":179,"name":"Competitive","parent":178,"position":20,"temporary":false,"gq_name":"Competitive"},{"description":"","id":483,"name":"Rum #1","parent":179,"position":10,"temporary":false,"gq_name":"Rum #1"},{"description":"","id":484,"name":"Rum #2","parent":179,"position":20,"temporary":false,"gq_name":"Rum #2"},{"description":"","id":180,"name":"Rum #2","parent":178,"position":200,"temporary":false,"gq_name":"Rum #2"},{"description":"","id":181,"name":"Skyttegrav #3 Classic Competitive","parent":178,"position":0,"temporary":false,"gq_name":"Skyttegrav #3 Classic Competitive"},{"description":"","id":527,"name":"Rum #1","parent":178,"position":100,"temporary":false,"gq_name":"Rum #1"},{"description":"","id":7,"name":"\u00d6vriga spel","parent":542,"position":60,"temporary":false,"gq_name":"\u00d6vriga spel"},{"description":"","id":345,"name":"Bilspel och racingsims (F1 Dirt ETS mm)","parent":7,"position":0,"temporary":false,"gq_name":"Bilspel och racingsims (F1 Dirt ETS mm)"},{"description":"","id":537,"name":"Euro Truck Sim","parent":345,"position":0,"temporary":false,"gq_name":"Euro Truck Sim"},{"description":"","id":485,"name":"Voxel Spel","parent":7,"position":0,"temporary":false,"gq_name":"Voxel Spel"},{"description":"","id":486,"name":"7 days to die ","parent":485,"position":0,"temporary":false,"gq_name":"7 days to die "},{"description":"","id":487,"name":"Space Engineers","parent":485,"position":0,"temporary":false,"gq_name":"Space Engineers"},{"description":"","id":536,"name":"Everquest landmark","parent":485,"position":0,"temporary":false,"gq_name":"Everquest landmark"},{"description":"","id":488,"name":"MMO","parent":7,"position":0,"temporary":false,"gq_name":"MMO"},{"description":"","id":394,"name":"Final Fantasy XIV - A Realm Reborn","parent":488,"position":0,"temporary":false,"gq_name":"Final Fantasy XIV - A Realm Reborn"},{"description":"","id":418,"name":"Rum #1","parent":394,"position":0,"temporary":false,"gq_name":"Rum #1"},{"description":"","id":419,"name":"Rum #2","parent":394,"position":0,"temporary":false,"gq_name":"Rum #2"},{"description":"","id":489,"name":"Mortal Online","parent":488,"position":0,"temporary":false,"gq_name":"Mortal Online"},{"description":"","id":490,"name":"World of Warcraft","parent":488,"position":0,"temporary":false,"gq_name":"World of Warcraft"},{"description":"","id":491,"name":"Party 1","parent":490,"position":0,"temporary":false,"gq_name":"Party 1"},{"description":"","id":492,"name":"Party 2","parent":490,"position":0,"temporary":false,"gq_name":"Party 2"},{"description":"","id":495,"name":"Guild Wars 2","parent":488,"position":0,"temporary":false,"gq_name":"Guild Wars 2"},{"description":"","id":513,"name":"Planetside 2","parent":488,"position":0,"temporary":false,"gq_name":"Planetside 2"},{"description":"","id":529,"name":"Aion","parent":488,"position":0,"temporary":false,"gq_name":"Aion"},{"description":"First-person shooter & Third-person shooter","id":498,"name":"FPS och TPS","parent":7,"position":0,"temporary":false,"gq_name":"FPS och TPS"},{"description":"","id":207,"name":"Borderlands 2","parent":498,"position":0,"temporary":false,"gq_name":"Borderlands 2"},{"description":"","id":218,"name":"Portal 2","parent":498,"position":0,"temporary":false,"gq_name":"Portal 2"},{"description":"","id":232,"name":"Infestation Survivor Stories","parent":498,"position":0,"temporary":false,"gq_name":"Infestation Survivor Stories"},{"description":"Clanen vi har till Wipe heter \n

SKYTTEGRAV<\/p>\n

\n

Joina denna f\u00f6r att teama up.<\/p>","id":240,"name":"Grupp 1","parent":232,"position":0,"temporary":false,"gq_name":"Grupp 1"},{"description":"","id":241,"name":"Grupp 2","parent":232,"position":1,"temporary":false,"gq_name":"Grupp 2"},{"description":"","id":376,"name":"Skyttegrav KLAN SPEL","parent":232,"position":1,"temporary":false,"gq_name":"Skyttegrav KLAN SPEL"},{"description":"","id":499,"name":"ArmA","parent":498,"position":0,"temporary":false,"gq_name":"ArmA"},{"description":"","id":500,"name":"Natural Selection 2","parent":498,"position":0,"temporary":false,"gq_name":"Natural Selection 2"},{"description":"","id":502,"name":"Left 4 Dead","parent":498,"position":0,"temporary":false,"gq_name":"Left 4 Dead"},{"description":"","id":514,"name":"Red Orchestra 2","parent":498,"position":0,"temporary":false,"gq_name":"Red Orchestra 2"},{"description":"","id":515,"name":"Allies","parent":514,"position":0,"temporary":false,"gq_name":"Allies"},{"description":"","id":516,"name":"Axis","parent":514,"position":0,"temporary":false,"gq_name":"Axis"},{"description":"","id":518,"name":"Mount and Blade - Warband","parent":498,"position":0,"temporary":false,"gq_name":"Mount and Blade - Warband"},{"description":"","id":519,"name":"Persistent World","parent":518,"position":0,"temporary":false,"gq_name":"Persistent World"},{"description":"","id":520,"name":"Mount and blade Vanilla","parent":518,"position":0,"temporary":false,"gq_name":"Mount and blade Vanilla"},{"description":"","id":541,"name":"Insurgency","parent":498,"position":0,"temporary":false,"gq_name":"Insurgency"},{"description":"","id":567,"name":"Evolve","parent":498,"position":0,"temporary":false,"gq_name":"Evolve"},{"description":"","id":504,"name":"RTS och grand strategy","parent":7,"position":0,"temporary":false,"gq_name":"RTS och grand strategy"},{"description":"","id":356,"name":"Starcraft","parent":504,"position":0,"temporary":false,"gq_name":"Starcraft"},{"description":"","id":505,"name":"Company of Heroes","parent":504,"position":0,"temporary":false,"gq_name":"Company of Heroes"},{"description":"","id":506,"name":"Europa Universalis ","parent":504,"position":0,"temporary":false,"gq_name":"Europa Universalis "},{"description":"","id":534,"name":"Rum #1","parent":506,"position":0,"temporary":false,"gq_name":"Rum #1"},{"description":"","id":535,"name":"Rum #2","parent":506,"position":0,"temporary":false,"gq_name":"Rum #2"},{"description":"","id":523,"name":"Age of Empires","parent":504,"position":0,"temporary":false,"gq_name":"Age of Empires"},{"description":"h\u00e4r spelar man Civilization<\/span><\/b> V<\/span><\/a>","id":533,"name":"Civilization V","parent":504,"position":0,"temporary":false,"gq_name":"Civilization V"},{"description":"Spel som \u00e4r gratis att k\u00f6ra.","id":510,"name":"Free to play","parent":7,"position":0,"temporary":false,"gq_name":"Free to play"},{"description":"","id":375,"name":"Mechwarrior Online","parent":510,"position":0,"temporary":false,"gq_name":"Mechwarrior Online"},{"description":"","id":511,"name":"War Thunder","parent":510,"position":0,"temporary":false,"gq_name":"War Thunder"},{"description":"","id":526,"name":"Tank","parent":511,"position":0,"temporary":false,"gq_name":"Tank"},{"description":"","id":538,"name":"Flyg","parent":511,"position":0,"temporary":false,"gq_name":"Flyg"},{"description":"","id":512,"name":"World of Tanks","parent":510,"position":0,"temporary":false,"gq_name":"World of Tanks"},{"description":"","id":530,"name":"Town of salem","parent":510,"position":0,"temporary":false,"gq_name":"Town of salem"},{"description":"","id":521,"name":"Hack and slash","parent":7,"position":0,"temporary":false,"gq_name":"Hack and slash"},{"description":"","id":167,"name":"Diablo 3","parent":521,"position":0,"temporary":false,"gq_name":"Diablo 3"},{"description":"","id":336,"name":"Path of Exile","parent":521,"position":0,"temporary":false,"gq_name":"Path of Exile"},{"description":"","id":383,"name":"Torchlight II","parent":521,"position":0,"temporary":false,"gq_name":"Torchlight II"},{"description":"","id":522,"name":"MOBA","parent":7,"position":0,"temporary":false,"gq_name":"MOBA"},{"description":"","id":6,"name":"League of Legends","parent":522,"position":0,"temporary":false,"gq_name":"League of Legends"},{"description":"","id":565,"name":"Grupp 1","parent":6,"position":5,"temporary":false,"gq_name":"Grupp 1"},{"description":"","id":566,"name":"Grupp 2","parent":6,"position":10,"temporary":false,"gq_name":"Grupp 2"},{"description":"","id":153,"name":"Dota 2","parent":522,"position":0,"temporary":false,"gq_name":"Dota 2"},{"description":"","id":236,"name":"Grupp 1","parent":153,"position":0,"temporary":false,"gq_name":"Grupp 1"},{"description":"","id":237,"name":"Grupp 2","parent":153,"position":0,"temporary":false,"gq_name":"Grupp 2"},{"description":"","id":532,"name":"Smite","parent":522,"position":0,"temporary":false,"gq_name":"Smite"},{"description":"","id":528,"name":"Tabletop Simulator","parent":7,"position":0,"temporary":false,"gq_name":"Tabletop Simulator"},{"description":"","id":559,"name":"Kerbal Space Program","parent":7,"position":0,"temporary":false,"gq_name":"Kerbal Space Program"},{"description":"","id":156,"name":"Minecraft","parent":542,"position":50,"temporary":false,"gq_name":"Minecraft"},{"description":"Serverip: mc.hemligastugan.com Dynmap \/ Regler: http:\/\/www.hemligastugan.com\/minecraft\/# <\/a>","id":157,"name":"Hemligastugan","parent":156,"position":0,"temporary":false,"gq_name":"Hemligastugan"},{"description":"L\u00e5st till admins f\u00f6r Hemligastugan.","id":388,"name":"Admin","parent":157,"position":2,"temporary":false,"gq_name":"Admin"},{"description":"","id":416,"name":"Grupp 1","parent":157,"position":0,"temporary":false,"gq_name":"Grupp 1"},{"description":"","id":417,"name":"Grupp 2","parent":157,"position":0,"temporary":false,"gq_name":"Grupp 2"},{"description":"Inte bara en samling moddar.. \u00c4ven med egenutvecklade MODS!<\/b> \n

MC Version 1.7.10 \/ Skyttegrav Modpack 2.0<\/p>\n

Hemsida: http:\/\/mc.skyttegrav.se<\/a><\/p>\n

Info & registrering: http:\/\/www.skyttegrav.se\/index.php?\/topic\/5-skyttegravse-custom-modpack<\/a><\/p>\n

Server IP: mc.skyttegrav.se<\/p>\n

Dynmap: http:\/\/mc.skyttegrav.se\/dynmap<\/a><\/p>","id":158,"name":"Skyttegrav Modpack","parent":156,"position":0,"temporary":false,"gq_name":"Skyttegrav Modpack"},{"description":"","id":539,"name":"Rum 1","parent":158,"position":0,"temporary":false,"gq_name":"Rum 1"},{"description":"","id":540,"name":"Rum 2","parent":158,"position":0,"temporary":false,"gq_name":"Rum 2"},{"description":"","id":170,"name":"Day Z","parent":542,"position":40,"temporary":false,"gq_name":"Day Z"},{"description":"","id":176,"name":"Grupp 1","parent":170,"position":10,"temporary":false,"gq_name":"Grupp 1"},{"description":"","id":177,"name":"Grupp 2","parent":170,"position":20,"temporary":false,"gq_name":"Grupp 2"},{"description":"","id":196,"name":"Grupp 3","parent":170,"position":30,"temporary":false,"gq_name":"Grupp 3"},{"description":"","id":197,"name":"Grupp 4","parent":170,"position":40,"temporary":false,"gq_name":"Grupp 4"},{"description":"H\u00e4r s\u00f6ker ni spelare f\u00f6r ert spel.\n

\n

Skapa en egen kanal i denna med speltitel.<\/p>","id":192,"name":"S\u00f6ker spelare","parent":542,"position":0,"temporary":false,"gq_name":"S\u00f6ker spelare"},{"description":"H\u00e4r kan man sitta och titta p\u00e5 streams, E-evenemang eller liknande. Subkanaler kommer att skapas av admins men du f\u00e5r g\u00e4rna tipsa om ett evenemang.","id":543,"name":"Event-kanaler","parent":0,"position":11,"temporary":false,"gq_name":"Event-kanaler"},{"description":"","id":544,"name":"MS Presskonferens","parent":543,"position":10,"temporary":false,"gq_name":"MS Presskonferens"},{"description":"","id":546,"name":"Titta och diskutera","parent":544,"position":5,"temporary":false,"gq_name":"Titta och diskutera"},{"description":"","id":547,"name":"Tysta rummet","parent":544,"position":10,"temporary":false,"gq_name":"Tysta rummet"},{"description":"","id":548,"name":"Skyttegrav Free-2-Play Spelkv\u00e4llar","parent":543,"position":50,"temporary":false,"gq_name":"Skyttegrav Free-2-Play Spelkv\u00e4llar"},{"description":"","id":553,"name":"Trackmania 29 Okt","parent":548,"position":0,"temporary":false,"gq_name":"Trackmania 29 Okt"},{"description":"","id":549,"name":"Rum #1","parent":553,"position":0,"temporary":false,"gq_name":"Rum #1"},{"description":"","id":550,"name":"Rum #2","parent":553,"position":0,"temporary":false,"gq_name":"Rum #2"},{"description":"","id":558,"name":"DreamHack","parent":543,"position":100,"temporary":false,"gq_name":"DreamHack"}],"players":[{"bytespersec":0,"channel":1,"comment":"","context":"","deaf":false,"identity":"","idlesecs":24306,"mute":false,"name":"pyootr","onlinesecs":24306,"os":"Win","osversion":"6.1.7601.1","release":"1.2.5","selfDeaf":true,"selfMute":true,"session":96,"suppress":true,"tcponly":false,"userid":66,"version":66053,"udpPing":51.1,"tcpPing":62.3,"gq_name":"pyootr","gq_ping":62.3,"gq_team":1,"gq_time":24306},{"bytespersec":0,"channel":1,"comment":"Serveransvarig & Admin<\/b> f\u00f6r Skyttegrav.se\/Sweclockers.com spelservrar. \n

Supervisor<\/b> hos Skyttegrav.se<\/a>.<\/p>","context":"","deaf":false,"identity":"","idlesecs":29126,"mute":false,"name":"[SG-SUP]Gix","onlinesecs":29154,"os":"X11","osversion":"Linux Mint 17 Qiana","release":"1.2.8-1~ppa1~trusty1","selfDeaf":false,"selfMute":false,"session":124,"suppress":true,"tcponly":false,"userid":47,"version":66056,"udpPing":29.21,"tcpPing":28.47,"gq_name":"[SG-SUP]Gix","gq_ping":28.47,"gq_team":1,"gq_time":29154},{"bytespersec":0,"channel":1,"comment":"JAG TROR DIG URKEL!\n

<\/p>","context":"","deaf":false,"identity":"","idlesecs":22621,"mute":false,"name":"Eyem-_-","onlinesecs":24847,"os":"Win","osversion":"6.1.7601.1","release":"1.2.4","selfDeaf":false,"selfMute":false,"session":176,"suppress":true,"tcponly":false,"userid":1001,"version":66052,"udpPing":17.33,"tcpPing":20.11,"gq_name":"Eyem-_-","gq_ping":20.11,"gq_team":1,"gq_time":24847},{"bytespersec":0,"channel":1,"comment":"","context":"","deaf":false,"identity":"","idlesecs":1721,"mute":false,"name":"[SG-HA]Relemy","onlinesecs":29128,"os":"Win","osversion":"6.2.9200.1","release":"1.2.8","selfDeaf":true,"selfMute":true,"session":232,"suppress":true,"tcponly":false,"userid":1926,"version":66056,"udpPing":37.94,"tcpPing":42.24,"gq_name":"[SG-HA]Relemy","gq_ping":42.24,"gq_team":1,"gq_time":29128},{"bytespersec":0,"channel":1,"comment":"","context":"","deaf":false,"identity":"","idlesecs":28863,"mute":false,"name":"TheLikus","onlinesecs":29008,"os":"Win","osversion":"6.1.7601.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":269,"suppress":true,"tcponly":false,"userid":4120,"version":66056,"udpPing":11.01,"tcpPing":13.72,"gq_name":"TheLikus","gq_ping":13.72,"gq_team":1,"gq_time":29008},{"bytespersec":0,"channel":1,"comment":"","context":"","deaf":false,"identity":"","idlesecs":29137,"mute":false,"name":"Legoo","onlinesecs":29139,"os":"Win","osversion":"6.1.7601.1","release":"1.2.5","selfDeaf":false,"selfMute":false,"session":473,"suppress":true,"tcponly":false,"userid":1657,"version":66053,"udpPing":8.45,"tcpPing":23.04,"gq_name":"Legoo","gq_ping":23.04,"gq_team":1,"gq_time":29139},{"bytespersec":0,"channel":432,"comment":"http:\/\/www.twitch.tv\/tobbbe__<\/a>","context":"","deaf":false,"identity":"","idlesecs":841,"mute":false,"name":"[SweC]Tobbbe__","onlinesecs":29138,"os":"Win","osversion":"6.2.9200.1","release":"1.2.8","selfDeaf":true,"selfMute":true,"session":5,"suppress":false,"tcponly":false,"userid":3769,"version":66056,"udpPing":22.64,"tcpPing":24.04,"gq_name":"[SweC]Tobbbe__","gq_ping":24.04,"gq_team":432,"gq_time":29138},{"bytespersec":6870,"channel":432,"comment":"

<\/p>","context":"","deaf":false,"identity":"","idlesecs":0,"mute":false,"name":"Vilse(SWE)","onlinesecs":16399,"os":"Win","osversion":"6.1.7601.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":110,"suppress":false,"tcponly":false,"userid":4124,"version":66056,"udpPing":13.83,"tcpPing":16.21,"gq_name":"Vilse(SWE)","gq_ping":16.21,"gq_team":432,"gq_time":16399},{"bytespersec":0,"channel":432,"comment":"","context":"","deaf":false,"identity":"","idlesecs":23,"mute":false,"name":"Th3MadPanda","onlinesecs":29137,"os":"Win","osversion":"6.1.7601.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":236,"suppress":false,"tcponly":false,"userid":2099,"version":66056,"udpPing":8.86,"tcpPing":11.72,"gq_name":"Th3MadPanda","gq_ping":11.72,"gq_team":432,"gq_time":29137},{"bytespersec":0,"channel":432,"comment":"","context":"","deaf":false,"identity":"","idlesecs":12,"mute":false,"name":"Mumin","onlinesecs":9347,"os":"Win","osversion":"6.1.7601.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":306,"suppress":false,"tcponly":false,"userid":4125,"version":66056,"udpPing":19.05,"tcpPing":22.56,"gq_name":"Mumin","gq_ping":22.56,"gq_team":432,"gq_time":9347},{"bytespersec":0,"channel":432,"comment":"Greetinx Programs!<\/a> \n

\n

V\u00e4lkommen till SweClockers och Skyttegravs gemensamma Mumble!<\/p>\n

\n

Ni kan fr\u00e5ga mig om administrativa saker p\u00e5 servers eller mumble, jag \u00e4r huvudadmin f\u00f6r SweC g\u00e4nget och dessutom forumledare f\u00f6r SweClockers.com. H\u00e4r \u00e4r reglerna f\u00f6r mumble och SweC forum.<\/a><\/p>\n

<\/p>\n

Vi satsar p\u00e5 en trevlig st\u00e4mning online! :)<\/p>\n

","context":"","deaf":false,"identity":"","idlesecs":127,"mute":false,"name":"[SweC-H]Lan","onlinesecs":29132,"os":"Win","osversion":"6.1.7601.1","release":"1.2.5","selfDeaf":false,"selfMute":false,"session":353,"suppress":false,"tcponly":false,"userid":56,"version":66053,"udpPing":15.76,"tcpPing":35.22,"gq_name":"[SweC-H]Lan","gq_ping":35.22,"gq_team":432,"gq_time":29132},{"bytespersec":6865,"channel":433,"comment":"","context":"","deaf":false,"identity":"","idlesecs":0,"mute":false,"name":"Gson","onlinesecs":4023,"os":"Win","osversion":"6.2.9200.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":146,"suppress":false,"tcponly":false,"userid":4123,"version":66056,"udpPing":51.51,"tcpPing":57.29,"gq_name":"Gson","gq_ping":57.29,"gq_team":433,"gq_time":4023},{"bytespersec":0,"channel":433,"comment":"","context":"","deaf":false,"identity":"","idlesecs":15,"mute":false,"name":"lampan","onlinesecs":19196,"os":"Win","osversion":"6.2.9200.1","release":"1.2.5","selfDeaf":false,"selfMute":false,"session":463,"suppress":false,"tcponly":false,"userid":3404,"version":66053,"udpPing":13.6,"tcpPing":16.66,"gq_name":"lampan","gq_ping":16.66,"gq_team":433,"gq_time":19196},{"bytespersec":0,"channel":451,"comment":"","context":"","deaf":false,"identity":"","idlesecs":773,"mute":false,"name":"[SweC-T]Grabbengr\u00e5","onlinesecs":28304,"os":"Win","osversion":"6.2.9200.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":53,"suppress":false,"tcponly":false,"userid":1952,"version":66056,"udpPing":20.4,"tcpPing":22.68,"gq_name":"[SweC-T]Grabbengr\u00e5","gq_ping":22.68,"gq_team":451,"gq_time":28304},{"bytespersec":0,"channel":451,"comment":"","context":"","deaf":false,"identity":"","idlesecs":1299,"mute":false,"name":"[SweC-H]Kinekin","onlinesecs":29134,"os":"Win","osversion":"6.2.9200.1","release":"1.2.8","selfDeaf":true,"selfMute":true,"session":180,"suppress":false,"tcponly":false,"userid":2426,"version":66056,"udpPing":49.78,"tcpPing":52.22,"gq_name":"[SweC-H]Kinekin","gq_ping":52.22,"gq_team":451,"gq_time":29134},{"bytespersec":0,"channel":451,"comment":"Det h\u00e4nder att jag spelar spel ibland.\n

<\/p>\n

<\/p>\n

<\/p>\n

<\/p>","context":"","deaf":false,"identity":"","idlesecs":13,"mute":false,"name":"[SweC-T]DavidtheDoom","onlinesecs":29086,"os":"Win","osversion":"6.2.9200.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":203,"suppress":false,"tcponly":false,"userid":3030,"version":66056,"udpPing":3.96,"tcpPing":5.61,"gq_name":"[SweC-T]DavidtheDoom","gq_ping":5.61,"gq_team":451,"gq_time":29086},{"bytespersec":0,"channel":451,"comment":"SweC spelservrar finns ocks\u00e5 p\u00e5 Facebook<\/a>","context":"","deaf":false,"identity":"","idlesecs":155,"mute":false,"name":"[SweC-H]Raven_cc","onlinesecs":21915,"os":"Win","osversion":"6.1.7600.1","release":"1.2.7","selfDeaf":false,"selfMute":false,"session":264,"suppress":false,"tcponly":true,"userid":78,"version":66055,"udpPing":19.73,"tcpPing":25.93,"gq_name":"[SweC-H]Raven_cc","gq_ping":25.93,"gq_team":451,"gq_time":21915},{"bytespersec":0,"channel":451,"comment":"","context":"","deaf":false,"identity":"","idlesecs":1628,"mute":false,"name":"OskarWallin","onlinesecs":12269,"os":"Win","osversion":"6.1.7601.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":272,"suppress":false,"tcponly":false,"userid":3783,"version":66056,"udpPing":11.97,"tcpPing":31.09,"gq_name":"OskarWallin","gq_ping":31.09,"gq_team":451,"gq_time":12269},{"bytespersec":6658,"channel":451,"comment":"","context":"","deaf":false,"identity":"","idlesecs":0,"mute":false,"name":"[SweC-A]Hitman","onlinesecs":29130,"os":"Win","osversion":"6.1.7601.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":485,"suppress":false,"tcponly":true,"userid":76,"version":66056,"udpPing":21.36,"tcpPing":28,"gq_name":"[SweC-A]Hitman","gq_ping":28,"gq_team":451,"gq_time":29130},{"bytespersec":7223,"channel":451,"comment":"","context":"","deaf":false,"identity":"","idlesecs":0,"mute":false,"name":"[SG-A]bl0m1","onlinesecs":29107,"os":"Win","osversion":"6.2.9200.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":488,"suppress":false,"tcponly":false,"userid":3447,"version":66056,"udpPing":40.3,"tcpPing":43.52,"gq_name":"[SG-A]bl0m1","gq_ping":43.52,"gq_team":451,"gq_time":29107},{"bytespersec":0,"channel":390,"comment":"","context":"","deaf":false,"identity":"","idlesecs":385,"mute":false,"name":"shifted","onlinesecs":385,"os":"Win","osversion":"6.2.9200.1","release":"1.2.7","selfDeaf":false,"selfMute":false,"session":294,"suppress":false,"tcponly":false,"userid":4065,"version":66055,"udpPing":21.16,"tcpPing":21.38,"gq_name":"shifted","gq_ping":21.38,"gq_team":390,"gq_time":385},{"bytespersec":0,"channel":391,"comment":"","context":"","deaf":false,"identity":"","idlesecs":10201,"mute":false,"name":"Tennethe","onlinesecs":19638,"os":"Win","osversion":"6.2.9200.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":152,"suppress":false,"tcponly":false,"userid":4081,"version":66056,"udpPing":28.6,"tcpPing":32.91,"gq_name":"Tennethe","gq_ping":32.91,"gq_team":391,"gq_time":19638},{"bytespersec":0,"channel":95,"comment":"","context":"","deaf":false,"identity":"","idlesecs":97,"mute":false,"name":"Figge86","onlinesecs":4319,"os":"Win","osversion":"6.2.9200.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":259,"suppress":false,"tcponly":false,"userid":3459,"version":66056,"udpPing":15.4,"tcpPing":17.42,"gq_name":"Figge86","gq_ping":17.42,"gq_team":95,"gq_time":4319},{"bytespersec":0,"channel":95,"comment":"","context":"","deaf":false,"identity":"","idlesecs":99,"mute":false,"name":"sterner007","onlinesecs":9667,"os":"Win","osversion":"6.1.7601.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":312,"suppress":false,"tcponly":false,"userid":3836,"version":66056,"udpPing":33.4,"tcpPing":36.36,"gq_name":"sterner007","gq_ping":36.36,"gq_team":95,"gq_time":9667},{"bytespersec":0,"channel":555,"comment":"","context":"","deaf":false,"identity":"","idlesecs":183,"mute":false,"name":"[SG]K\u00e5Be","onlinesecs":29128,"os":"Win","osversion":"6.1.7601.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":12,"suppress":false,"tcponly":false,"userid":27,"version":66056,"udpPing":20.87,"tcpPing":24.01,"gq_name":"[SG]K\u00e5Be","gq_ping":24.01,"gq_team":555,"gq_time":29128},{"bytespersec":0,"channel":555,"comment":"beh\u00f6ver ni mig kalla\n

","context":"","deaf":false,"identity":"","idlesecs":188,"mute":false,"name":"[SG-SUP]strike","onlinesecs":5637,"os":"Win","osversion":"5.1.2600.1","release":"1.2.3","selfDeaf":false,"selfMute":false,"session":314,"suppress":false,"tcponly":false,"userid":19,"version":66051,"udpPing":21.27,"tcpPing":26.18,"gq_name":"[SG-SUP]strike","gq_ping":26.18,"gq_team":555,"gq_time":5637},{"bytespersec":0,"channel":492,"comment":"","context":"","deaf":false,"identity":"","idlesecs":35,"mute":false,"name":"Widoxz","onlinesecs":28334,"os":"Win","osversion":"6.1.7601.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":24,"suppress":false,"tcponly":false,"userid":4058,"version":66056,"udpPing":35.75,"tcpPing":55.55,"gq_name":"Widoxz","gq_ping":55.55,"gq_team":492,"gq_time":28334},{"bytespersec":6890,"channel":492,"comment":"","context":"","deaf":false,"identity":"","idlesecs":0,"mute":false,"name":"FourO","onlinesecs":3421,"os":"Win","osversion":"6.1.7601.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":131,"suppress":false,"tcponly":false,"userid":4111,"version":66056,"udpPing":9.7,"tcpPing":15.63,"gq_name":"FourO","gq_ping":15.63,"gq_team":492,"gq_time":3421},{"bytespersec":0,"channel":492,"comment":"","context":"","deaf":false,"identity":"","idlesecs":3444,"mute":false,"name":"lemurtacos","onlinesecs":3445,"os":"Win","osversion":"6.1.7601.1","release":"1.2.8","selfDeaf":false,"selfMute":true,"session":185,"suppress":false,"tcponly":false,"userid":3827,"version":66056,"udpPing":9.85,"tcpPing":13.46,"gq_name":"lemurtacos","gq_ping":13.46,"gq_team":492,"gq_time":3445},{"bytespersec":8833,"channel":492,"comment":"","context":"","deaf":false,"identity":"","idlesecs":0,"mute":false,"name":"kaviar","onlinesecs":23142,"os":"Win","osversion":"6.1.7601.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":349,"suppress":false,"tcponly":false,"userid":3759,"version":66056,"udpPing":11.66,"tcpPing":14.67,"gq_name":"kaviar","gq_ping":14.67,"gq_team":492,"gq_time":23142},{"bytespersec":9083,"channel":492,"comment":"","context":"","deaf":false,"identity":"","idlesecs":0,"mute":false,"name":"LillaEmma","onlinesecs":3957,"os":"Win","osversion":"6.1.7601.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":419,"suppress":false,"tcponly":false,"userid":3758,"version":66056,"udpPing":10.31,"tcpPing":13.45,"gq_name":"LillaEmma","gq_ping":13.45,"gq_team":492,"gq_time":3957},{"bytespersec":0,"channel":218,"comment":"","context":"","deaf":false,"identity":"","idlesecs":1698,"mute":false,"name":"Maichopalami","onlinesecs":4899,"os":"Win","osversion":"6.2.9200.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":157,"suppress":false,"tcponly":false,"userid":1563,"version":66056,"udpPing":12.86,"tcpPing":15.14,"gq_name":"Maichopalami","gq_ping":15.14,"gq_team":218,"gq_time":4899},{"bytespersec":0,"channel":512,"comment":"","context":"","deaf":false,"identity":"","idlesecs":2640,"mute":false,"name":"[SG]Binge","onlinesecs":11586,"os":"Win","osversion":"6.1.7601.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":333,"suppress":false,"tcponly":false,"userid":1837,"version":66056,"udpPing":22.69,"tcpPing":26,"gq_name":"[SG]Binge","gq_ping":26,"gq_team":512,"gq_time":11586},{"bytespersec":9014,"channel":167,"comment":"","context":"","deaf":false,"identity":"","idlesecs":0,"mute":false,"name":"shimmerghost","onlinesecs":17161,"os":"Win","osversion":"6.1.7601.1","release":"1.2.4","selfDeaf":false,"selfMute":false,"session":144,"suppress":false,"tcponly":false,"userid":2347,"version":66052,"udpPing":30.95,"tcpPing":33.04,"gq_name":"shimmerghost","gq_ping":33.04,"gq_team":167,"gq_time":17161},{"bytespersec":8874,"channel":167,"comment":"","context":"","deaf":false,"identity":"","idlesecs":0,"mute":false,"name":"Lankfisher","onlinesecs":17163,"os":"Win","osversion":"6.2.9200.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":186,"suppress":false,"tcponly":false,"userid":4106,"version":66056,"udpPing":21.28,"tcpPing":23.3,"gq_name":"Lankfisher","gq_ping":23.3,"gq_team":167,"gq_time":17163},{"bytespersec":0,"channel":167,"comment":"","context":"","deaf":false,"identity":"","idlesecs":1,"mute":false,"name":"AndreasLindgren","onlinesecs":5267,"os":"Win","osversion":"6.2.9200.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":235,"suppress":false,"tcponly":false,"userid":2439,"version":66056,"udpPing":31.59,"tcpPing":17.07,"gq_name":"AndreasLindgren","gq_ping":17.07,"gq_team":167,"gq_time":5267},{"bytespersec":0,"channel":167,"comment":"","context":"","deaf":false,"identity":"","idlesecs":5210,"mute":false,"name":"Emmag","onlinesecs":5229,"os":"Win","osversion":"6.1.7601.1","release":"1.2.4","selfDeaf":false,"selfMute":true,"session":300,"suppress":false,"tcponly":false,"userid":2438,"version":66052,"udpPing":24.04,"tcpPing":25.43,"gq_name":"Emmag","gq_ping":25.43,"gq_team":167,"gq_time":5229},{"bytespersec":0,"channel":383,"comment":"","context":"","deaf":false,"identity":"","idlesecs":3961,"mute":false,"name":"Tobias","onlinesecs":8817,"os":"Win","osversion":"6.1.7601.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":325,"suppress":false,"tcponly":false,"userid":3788,"version":66056,"udpPing":15.74,"tcpPing":22.28,"gq_name":"Tobias","gq_ping":22.28,"gq_team":383,"gq_time":8817}],"numplayers":38,"gq_online":true,"gq_address":"95.130.64.232","gq_port_client":64738,"gq_port_query":27800,"gq_protocol":"mumble","gq_type":"mumble","gq_name":"Mumble Server","gq_transport":"tcp","gq_joinlink":"mumble:\/\/95.130.64.232:64738\/","gq_dedicated":1,"gq_gametype":null,"gq_hostname":"Skyttegrav & SweClockers Mumble","gq_numplayers":38,"gq_maxplayers":"250"}}} \ No newline at end of file diff --git a/gameq/tests/Filters/Providers/Stripcolors/cod4_1.json b/gameq/tests/Filters/Providers/Stripcolors/cod4_1.json new file mode 100644 index 0000000..d0a5bc8 --- /dev/null +++ b/gameq/tests/Filters/Providers/Stripcolors/cod4_1.json @@ -0,0 +1 @@ +{"raw":{"66.150.121.164:28931":{"type":"0","sv_maxclients":"50","version":"CoD4 X 1.7a win_mingw-x86-testing build 3325 Jan 3 2015","shortversion":"1.7a","build":"3325","sv_floodprotect":"1","sv_maxRate":"25000","sv_voice":"0","sv_maxPing":"0","sv_minPing":"0","sv_hostname":"=^5|h4x|^7=^2War ^724\/7 ^2Server COD4","_CoD4 X Creator":"Ninjaman, TheKelm @ http:\/\/iceops.in","protocol":"6","sv_privateClients":"0","sv_disableClientConsole":"0","g_mapStartTime":"Sat Feb 20 18:32:12 2016","uptime":"7 hours","g_gametype":"war","mapname":"mp_farm","sv_pure":"1","_Admin":"Admin","_admins_xfire":"= ghash1985,somal007","_Apply_Clan":"http:\/\/classic.xfire.com\/communities\/cod4h4x\/","_Email":"clanh4x@yahoo.com","_Website":"http:\/\/www.clanh4x.tk","_clanh4x_forums":"http:\/\/forum.clanh4x.tk","_clanh4x_facebook":"www.facebook.com\/clanh4x","_Recruiting":"_On http:\/\/classic.xfire.com\/communities\/cod4h4x\/","_Location":"U.S.","_Mod":"N\/A","_ModVer":"N\/A","g_compassShowEnemies":"0","gamename":"Call of Duty 4","players":[{"frags":"144","ping":"152","name":"theozsz","gq_name":"theozsz","gq_ping":"152","gq_score":"144"},{"frags":"30","ping":"150","name":"BeReKeTDeDe","gq_name":"BeReKeTDeDe","gq_ping":"150","gq_score":"30"},{"frags":"70","ping":"109","name":"ALFHA SNIPER","gq_name":"ALFHA SNIPER","gq_ping":"109","gq_score":"70"},{"frags":"20","ping":"172","name":"RODRIGOVI18C3","gq_name":"RODRIGOVI18C3","gq_ping":"172","gq_score":"20"},{"frags":"40","ping":"16","name":"Chazzzz","gq_name":"Chazzzz","gq_ping":"16","gq_score":"40"},{"frags":"102","ping":"111","name":"my name is jef","gq_name":"my name is jef","gq_ping":"111","gq_score":"102"},{"frags":"20","ping":"31","name":"Coolguy","gq_name":"Coolguy","gq_ping":"31","gq_score":"20"},{"frags":"12","ping":"74","name":"OhRobbie","gq_name":"OhRobbie","gq_ping":"74","gq_score":"12"},{"frags":"10","ping":"529","name":"david","gq_name":"david","gq_ping":"529","gq_score":"10"},{"frags":"70","ping":"343","name":"julian( CARP)","gq_name":"julian( CARP)","gq_ping":"343","gq_score":"70"},{"frags":"40","ping":"146","name":"Reuspect","gq_name":"Reuspect","gq_ping":"146","gq_score":"40"},{"frags":"150","ping":"161","name":"jirimun","gq_name":"jirimun","gq_ping":"161","gq_score":"150"},{"frags":"0","ping":"-1","name":"Nader","gq_name":"Nader","gq_ping":"-1","gq_score":"0"},{"frags":"40","ping":"243","name":"AdenPartin","gq_name":"AdenPartin","gq_ping":"243","gq_score":"40"},{"frags":"10","ping":"328","name":"bardzero","gq_name":"bardzero","gq_ping":"328","gq_score":"10"},{"frags":"70","ping":"140","name":"{h4x} Browly","gq_name":"{h4x} Browly","gq_ping":"140","gq_score":"70"},{"frags":"20","ping":"179","name":"PC07","gq_name":"PC07","gq_ping":"179","gq_score":"20"},{"frags":"54","ping":"30","name":"Killowatt","gq_name":"Killowatt","gq_ping":"30","gq_score":"54"},{"frags":"114","ping":"77","name":"DeChosenWon","gq_name":"DeChosenWon","gq_ping":"77","gq_score":"114"},{"frags":"150","ping":"31","name":"PatrickStar","gq_name":"PatrickStar","gq_ping":"31","gq_score":"150"},{"frags":"0","ping":"261","name":"patrik","gq_name":"patrik","gq_ping":"261","gq_score":"0"},{"frags":"0","ping":"119","name":"=|h4x|=essekiel","gq_name":"=|h4x|=essekiel","gq_ping":"119","gq_score":"0"},{"frags":"0","ping":"155","name":"uchache","gq_name":"uchache","gq_ping":"155","gq_score":"0"},{"frags":"10","ping":"114","name":"ANONYMOUS","gq_name":"ANONYMOUS","gq_ping":"114","gq_score":"10"},{"frags":"32","ping":"91","name":"la calabera","gq_name":"la calabera","gq_ping":"91","gq_score":"32"},{"frags":"0","ping":"54","name":"^4=|h4x|=Pred","gq_name":"^4=|h4x|=Pred","gq_ping":"54","gq_score":"0"},{"frags":"132","ping":"204","name":"Dead_shoot","gq_name":"Dead_shoot","gq_ping":"204","gq_score":"132"},{"frags":"26","ping":"99","name":"KRATOS","gq_name":"KRATOS","gq_ping":"99","gq_score":"26"},{"frags":"72","ping":"117","name":"Fuhrer","gq_name":"Fuhrer","gq_ping":"117","gq_score":"72"}],"clients":29,"gq_online":true,"gq_address":"66.150.121.164","gq_port_client":28931,"gq_port_query":28931,"gq_protocol":"quake3","gq_type":"cod4","gq_name":"Call of Duty 4","gq_transport":"udp","gq_joinlink":"","gq_gametype":"Call of Duty 4","gq_hostname":"=^5|h4x|^7=^2War ^724\/7 ^2Server COD4","gq_mapname":"mp_farm","gq_maxplayers":"50","gq_mod":"war","gq_numplayers":29,"gq_password":null,"teams":[]}},"filtered":{"66.150.121.164:28931":{"type":"0","sv_maxclients":"50","version":"CoD4 X 1.7a win_mingw-x86-testing build 3325 Jan 3 2015","shortversion":"1.7a","build":"3325","sv_floodprotect":"1","sv_maxRate":"25000","sv_voice":"0","sv_maxPing":"0","sv_minPing":"0","sv_hostname":"=|h4x|=War 24\/7 Server COD4","_CoD4 X Creator":"Ninjaman, TheKelm @ http:\/\/iceops.in","protocol":"6","sv_privateClients":"0","sv_disableClientConsole":"0","g_mapStartTime":"Sat Feb 20 18:32:12 2016","uptime":"7 hours","g_gametype":"war","mapname":"mp_farm","sv_pure":"1","_Admin":"Admin","_admins_xfire":"= ghash1985,somal007","_Apply_Clan":"http:\/\/classic.xfire.com\/communities\/cod4h4x\/","_Email":"clanh4x@yahoo.com","_Website":"http:\/\/www.clanh4x.tk","_clanh4x_forums":"http:\/\/forum.clanh4x.tk","_clanh4x_facebook":"www.facebook.com\/clanh4x","_Recruiting":"_On http:\/\/classic.xfire.com\/communities\/cod4h4x\/","_Location":"U.S.","_Mod":"N\/A","_ModVer":"N\/A","g_compassShowEnemies":"0","gamename":"Call of Duty 4","players":[{"frags":"144","ping":"152","name":"theozsz","gq_name":"theozsz","gq_ping":"152","gq_score":"144"},{"frags":"30","ping":"150","name":"BeReKeTDeDe","gq_name":"BeReKeTDeDe","gq_ping":"150","gq_score":"30"},{"frags":"70","ping":"109","name":"ALFHA SNIPER","gq_name":"ALFHA SNIPER","gq_ping":"109","gq_score":"70"},{"frags":"20","ping":"172","name":"RODRIGOVI18C3","gq_name":"RODRIGOVI18C3","gq_ping":"172","gq_score":"20"},{"frags":"40","ping":"16","name":"Chazzzz","gq_name":"Chazzzz","gq_ping":"16","gq_score":"40"},{"frags":"102","ping":"111","name":"my name is jef","gq_name":"my name is jef","gq_ping":"111","gq_score":"102"},{"frags":"20","ping":"31","name":"Coolguy","gq_name":"Coolguy","gq_ping":"31","gq_score":"20"},{"frags":"12","ping":"74","name":"OhRobbie","gq_name":"OhRobbie","gq_ping":"74","gq_score":"12"},{"frags":"10","ping":"529","name":"david","gq_name":"david","gq_ping":"529","gq_score":"10"},{"frags":"70","ping":"343","name":"julian( CARP)","gq_name":"julian( CARP)","gq_ping":"343","gq_score":"70"},{"frags":"40","ping":"146","name":"Reuspect","gq_name":"Reuspect","gq_ping":"146","gq_score":"40"},{"frags":"150","ping":"161","name":"jirimun","gq_name":"jirimun","gq_ping":"161","gq_score":"150"},{"frags":"0","ping":"-1","name":"Nader","gq_name":"Nader","gq_ping":"-1","gq_score":"0"},{"frags":"40","ping":"243","name":"AdenPartin","gq_name":"AdenPartin","gq_ping":"243","gq_score":"40"},{"frags":"10","ping":"328","name":"bardzero","gq_name":"bardzero","gq_ping":"328","gq_score":"10"},{"frags":"70","ping":"140","name":"{h4x} Browly","gq_name":"{h4x} Browly","gq_ping":"140","gq_score":"70"},{"frags":"20","ping":"179","name":"PC07","gq_name":"PC07","gq_ping":"179","gq_score":"20"},{"frags":"54","ping":"30","name":"Killowatt","gq_name":"Killowatt","gq_ping":"30","gq_score":"54"},{"frags":"114","ping":"77","name":"DeChosenWon","gq_name":"DeChosenWon","gq_ping":"77","gq_score":"114"},{"frags":"150","ping":"31","name":"PatrickStar","gq_name":"PatrickStar","gq_ping":"31","gq_score":"150"},{"frags":"0","ping":"261","name":"patrik","gq_name":"patrik","gq_ping":"261","gq_score":"0"},{"frags":"0","ping":"119","name":"=|h4x|=essekiel","gq_name":"=|h4x|=essekiel","gq_ping":"119","gq_score":"0"},{"frags":"0","ping":"155","name":"uchache","gq_name":"uchache","gq_ping":"155","gq_score":"0"},{"frags":"10","ping":"114","name":"ANONYMOUS","gq_name":"ANONYMOUS","gq_ping":"114","gq_score":"10"},{"frags":"32","ping":"91","name":"la calabera","gq_name":"la calabera","gq_ping":"91","gq_score":"32"},{"frags":"0","ping":"54","name":"=|h4x|=Pred","gq_name":"=|h4x|=Pred","gq_ping":"54","gq_score":"0"},{"frags":"132","ping":"204","name":"Dead_shoot","gq_name":"Dead_shoot","gq_ping":"204","gq_score":"132"},{"frags":"26","ping":"99","name":"KRATOS","gq_name":"KRATOS","gq_ping":"99","gq_score":"26"},{"frags":"72","ping":"117","name":"Fuhrer","gq_name":"Fuhrer","gq_ping":"117","gq_score":"72"}],"clients":"29","gq_online":"1","gq_address":"66.150.121.164","gq_port_client":"28931","gq_port_query":"28931","gq_protocol":"quake3","gq_type":"cod4","gq_name":"Call of Duty 4","gq_transport":"udp","gq_joinlink":"","gq_gametype":"Call of Duty 4","gq_hostname":"=|h4x|=War 24\/7 Server COD4","gq_mapname":"mp_farm","gq_maxplayers":"50","gq_mod":"war","gq_numplayers":"29","gq_password":"","teams":[]}}} \ No newline at end of file diff --git a/gameq/tests/Filters/Providers/Stripcolors/cod4_2.json b/gameq/tests/Filters/Providers/Stripcolors/cod4_2.json new file mode 100644 index 0000000..4f63375 --- /dev/null +++ b/gameq/tests/Filters/Providers/Stripcolors/cod4_2.json @@ -0,0 +1 @@ +{"raw":{"192.99.12.215:28960":{"type":"0","sv_maxclients":"52","sv_privateclients":"4","sv_punkbuster":"0","version":"CoD4 X 1.7a linux-i386-custom_debug-gauth build 3483 Jan 26 2016","shortversion":"1.7a","build":"3483","sv_hostname":"^2N^1i^2NJA|^5HighJump ^3TDM","sv_minPing":"0","sv_maxPing":"0","sv_voice":"0","g_gametype":"war","sv_maxRate":"100000","sv_floodprotect":"1","_CoD4 X Creator":"Ninjaman, TheKelm @ http:\/\/iceops.in","protocol":"6","sv_disableClientConsole":"0","g_mapStartTime":"Sat Feb 20 18:27:13 2016","uptime":"4 hours","mapname":"mp_backlot","sv_pure":"1","_Admin":"i-G.Admin Team","_Website":"www.NiNJA-Gaming.org","_Location":"Canada","gamename":"Call of Duty 4","g_compassShowEnemies":"0","_ModVer":"6.7","_ModBuild":"1530","_ModBuildTime":"02-17-2016 07:35 PM","_MapInfo":"Showdown,Backlot,Broadcast","players":[{"frags":"282","ping":"33","name":"crazychick","gq_name":"crazychick","gq_ping":"33","gq_score":"282"},{"frags":"110","ping":"106","name":"JLG-NoWar","gq_name":"JLG-NoWar","gq_ping":"106","gq_score":"110"},{"frags":"20","ping":"170","name":"Cav92","gq_name":"Cav92","gq_ping":"170","gq_score":"20"},{"frags":"90","ping":"161","name":"EL-PANADERO","gq_name":"EL-PANADERO","gq_ping":"161","gq_score":"90"},{"frags":"64","ping":"29","name":"grayson","gq_name":"grayson","gq_ping":"29","gq_score":"64"},{"frags":"0","ping":"0","name":"Yourself","gq_name":"Yourself","gq_ping":"0","gq_score":"0"},{"frags":"20","ping":"47","name":"Blake","gq_name":"Blake","gq_ping":"47","gq_score":"20"},{"frags":"0","ping":"0","name":"A Baby","gq_name":"A Baby","gq_ping":"0","gq_score":"0"},{"frags":"0","ping":"0","name":"LOL!!!","gq_name":"LOL!!!","gq_ping":"0","gq_score":"0"},{"frags":"312","ping":"44","name":"Red-Rider","gq_name":"Red-Rider","gq_ping":"44","gq_score":"312"},{"frags":"82","ping":"129","name":"Mylloca","gq_name":"Mylloca","gq_ping":"129","gq_score":"82"},{"frags":"0","ping":"91","name":"Brannn","gq_name":"Brannn","gq_ping":"91","gq_score":"0"},{"frags":"20","ping":"33","name":"OldMan","gq_name":"OldMan","gq_ping":"33","gq_score":"20"},{"frags":"296","ping":"146","name":"GATITOBROSXD","gq_name":"GATITOBROSXD","gq_ping":"146","gq_score":"296"},{"frags":"150","ping":"32","name":"THENOOB","gq_name":"THENOOB","gq_ping":"32","gq_score":"150"},{"frags":"180","ping":"30","name":"Megatron","gq_name":"Megatron","gq_ping":"30","gq_score":"180"},{"frags":"60","ping":"90","name":"USS_MY_DICK","gq_name":"USS_MY_DICK","gq_ping":"90","gq_score":"60"},{"frags":"0","ping":"47","name":"Bellmore","gq_name":"Bellmore","gq_ping":"47","gq_score":"0"},{"frags":"292","ping":"91","name":"redwhite","gq_name":"redwhite","gq_ping":"91","gq_score":"292"},{"frags":"50","ping":"114","name":"Rambo_DZ","gq_name":"Rambo_DZ","gq_ping":"114","gq_score":"50"},{"frags":"770","ping":"106","name":"^3^1^3^4Vkk.","gq_name":"^3^1^3^4Vkk.","gq_ping":"106","gq_score":"770"},{"frags":"0","ping":"212","name":"Tal3aT Ghosts","gq_name":"Tal3aT Ghosts","gq_ping":"212","gq_score":"0"},{"frags":"560","ping":"88","name":"La Barbie","gq_name":"La Barbie","gq_ping":"88","gq_score":"560"},{"frags":"120","ping":"51","name":"JOHN","gq_name":"JOHN","gq_ping":"51","gq_score":"120"},{"frags":"200","ping":"86","name":"Donkanyar","gq_name":"Donkanyar","gq_ping":"86","gq_score":"200"},{"frags":"380","ping":"119","name":"**[FY]**Danny..","gq_name":"**[FY]**Danny..","gq_ping":"119","gq_score":"380"},{"frags":"240","ping":"170","name":"kyo","gq_name":"kyo","gq_ping":"170","gq_score":"240"},{"frags":"82","ping":"138","name":"Agar__DZ","gq_name":"Agar__DZ","gq_ping":"138","gq_score":"82"},{"frags":"664","ping":"44","name":"DigitalKaos","gq_name":"DigitalKaos","gq_ping":"44","gq_score":"664"}],"clients":29,"gq_online":true,"gq_address":"192.99.12.215","gq_port_client":28960,"gq_port_query":28960,"gq_protocol":"quake3","gq_type":"cod4","gq_name":"Call of Duty 4","gq_transport":"udp","gq_joinlink":"","gq_gametype":"Call of Duty 4","gq_hostname":"^2N^1i^2NJA|^5HighJump ^3TDM","gq_mapname":"mp_backlot","gq_maxplayers":"52","gq_mod":"war","gq_numplayers":29,"gq_password":null,"teams":[]}},"filtered":{"192.99.12.215:28960":{"type":"0","sv_maxclients":"52","sv_privateclients":"4","sv_punkbuster":"0","version":"CoD4 X 1.7a linux-i386-custom_debug-gauth build 3483 Jan 26 2016","shortversion":"1.7a","build":"3483","sv_hostname":"NiNJA|HighJump TDM","sv_minPing":"0","sv_maxPing":"0","sv_voice":"0","g_gametype":"war","sv_maxRate":"100000","sv_floodprotect":"1","_CoD4 X Creator":"Ninjaman, TheKelm @ http:\/\/iceops.in","protocol":"6","sv_disableClientConsole":"0","g_mapStartTime":"Sat Feb 20 18:27:13 2016","uptime":"4 hours","mapname":"mp_backlot","sv_pure":"1","_Admin":"i-G.Admin Team","_Website":"www.NiNJA-Gaming.org","_Location":"Canada","gamename":"Call of Duty 4","g_compassShowEnemies":"0","_ModVer":"6.7","_ModBuild":"1530","_ModBuildTime":"02-17-2016 07:35 PM","_MapInfo":"Showdown,Backlot,Broadcast","players":[{"frags":"282","ping":"33","name":"crazychick","gq_name":"crazychick","gq_ping":"33","gq_score":"282"},{"frags":"110","ping":"106","name":"JLG-NoWar","gq_name":"JLG-NoWar","gq_ping":"106","gq_score":"110"},{"frags":"20","ping":"170","name":"Cav92","gq_name":"Cav92","gq_ping":"170","gq_score":"20"},{"frags":"90","ping":"161","name":"EL-PANADERO","gq_name":"EL-PANADERO","gq_ping":"161","gq_score":"90"},{"frags":"64","ping":"29","name":"grayson","gq_name":"grayson","gq_ping":"29","gq_score":"64"},{"frags":"0","ping":"0","name":"Yourself","gq_name":"Yourself","gq_ping":"0","gq_score":"0"},{"frags":"20","ping":"47","name":"Blake","gq_name":"Blake","gq_ping":"47","gq_score":"20"},{"frags":"0","ping":"0","name":"A Baby","gq_name":"A Baby","gq_ping":"0","gq_score":"0"},{"frags":"0","ping":"0","name":"LOL!!!","gq_name":"LOL!!!","gq_ping":"0","gq_score":"0"},{"frags":"312","ping":"44","name":"Red-Rider","gq_name":"Red-Rider","gq_ping":"44","gq_score":"312"},{"frags":"82","ping":"129","name":"Mylloca","gq_name":"Mylloca","gq_ping":"129","gq_score":"82"},{"frags":"0","ping":"91","name":"Brannn","gq_name":"Brannn","gq_ping":"91","gq_score":"0"},{"frags":"20","ping":"33","name":"OldMan","gq_name":"OldMan","gq_ping":"33","gq_score":"20"},{"frags":"296","ping":"146","name":"GATITOBROSXD","gq_name":"GATITOBROSXD","gq_ping":"146","gq_score":"296"},{"frags":"150","ping":"32","name":"THENOOB","gq_name":"THENOOB","gq_ping":"32","gq_score":"150"},{"frags":"180","ping":"30","name":"Megatron","gq_name":"Megatron","gq_ping":"30","gq_score":"180"},{"frags":"60","ping":"90","name":"USS_MY_DICK","gq_name":"USS_MY_DICK","gq_ping":"90","gq_score":"60"},{"frags":"0","ping":"47","name":"Bellmore","gq_name":"Bellmore","gq_ping":"47","gq_score":"0"},{"frags":"292","ping":"91","name":"redwhite","gq_name":"redwhite","gq_ping":"91","gq_score":"292"},{"frags":"50","ping":"114","name":"Rambo_DZ","gq_name":"Rambo_DZ","gq_ping":"114","gq_score":"50"},{"frags":"770","ping":"106","name":"Vkk.","gq_name":"Vkk.","gq_ping":"106","gq_score":"770"},{"frags":"0","ping":"212","name":"Tal3aT Ghosts","gq_name":"Tal3aT Ghosts","gq_ping":"212","gq_score":"0"},{"frags":"560","ping":"88","name":"La Barbie","gq_name":"La Barbie","gq_ping":"88","gq_score":"560"},{"frags":"120","ping":"51","name":"JOHN","gq_name":"JOHN","gq_ping":"51","gq_score":"120"},{"frags":"200","ping":"86","name":"Donkanyar","gq_name":"Donkanyar","gq_ping":"86","gq_score":"200"},{"frags":"380","ping":"119","name":"**[FY]**Danny..","gq_name":"**[FY]**Danny..","gq_ping":"119","gq_score":"380"},{"frags":"240","ping":"170","name":"kyo","gq_name":"kyo","gq_ping":"170","gq_score":"240"},{"frags":"82","ping":"138","name":"Agar__DZ","gq_name":"Agar__DZ","gq_ping":"138","gq_score":"82"},{"frags":"664","ping":"44","name":"DigitalKaos","gq_name":"DigitalKaos","gq_ping":"44","gq_score":"664"}],"clients":"29","gq_online":"1","gq_address":"192.99.12.215","gq_port_client":"28960","gq_port_query":"28960","gq_protocol":"quake3","gq_type":"cod4","gq_name":"Call of Duty 4","gq_transport":"udp","gq_joinlink":"","gq_gametype":"Call of Duty 4","gq_hostname":"NiNJA|HighJump TDM","gq_mapname":"mp_backlot","gq_maxplayers":"52","gq_mod":"war","gq_numplayers":"29","gq_password":"","teams":[]}}} \ No newline at end of file diff --git a/gameq/tests/Filters/Providers/Stripcolors/minecraft_1.json b/gameq/tests/Filters/Providers/Stripcolors/minecraft_1.json new file mode 100644 index 0000000..a528673 --- /dev/null +++ b/gameq/tests/Filters/Providers/Stripcolors/minecraft_1.json @@ -0,0 +1 @@ +{"raw":{"64.34.190.101:28965":{"hostname":"TotalFreedom - for Minecraft 1.8.3","gametype":"SMP","game_id":"MINECRAFT","version":"1.8.8","plugins":"CraftBukkit on Bukkit 1.8.8-R0.1-SNAPSHOT: Chairs 4.6; WorldEdit 6.0.2-TF,no_git_id; BookExploitFix 0.6; PlayerParticles 2.7; PortalGun 3.0.1; BukkitTelnet 4.1; ProtocolLib 3.6.3-SNAPSHOT; AcidFreedom 1.6.1; EchoPet 2.8.1-SNAPSHOT-b70; Lift 51; Essentials TeamCity; EssentialsSpawn TeamCity; SkinsRestorer 10.2; Movecraft 4.0.1; TotalFreedomMod 4.3","map":"TsuchiIwa","numplayers":"34","maxplayers":"45","hostport":"28965","hostip":"64.34.190.101","players":[{"player":"BerserkCreepah","gq_name":"BerserkCreepah"},{"player":"TheBigProBG","gq_name":"TheBigProBG"},{"player":"Musebrat2","gq_name":"Musebrat2"},{"player":"SansLeSk3leton","gq_name":"SansLeSk3leton"},{"player":"xXBrownieXx","gq_name":"xXBrownieXx"},{"player":"rovertdude","gq_name":"rovertdude"},{"player":"xXElectricMCXx","gq_name":"xXElectricMCXx"},{"player":"TaahThePhoenix","gq_name":"TaahThePhoenix"},{"player":"xXSpiritAnimalXx","gq_name":"xXSpiritAnimalXx"},{"player":"slyfox13","gq_name":"slyfox13"},{"player":"ElementalDreamer","gq_name":"ElementalDreamer"},{"player":"mirandacosgrove","gq_name":"mirandacosgrove"},{"player":"xNotCreater","gq_name":"xNotCreater"},{"player":"CodFish48","gq_name":"CodFish48"},{"player":"camron315","gq_name":"camron315"},{"player":"looky556","gq_name":"looky556"},{"player":"MC_SparkieGaming","gq_name":"MC_SparkieGaming"},{"player":"NebelCan_","gq_name":"NebelCan_"},{"player":"monkeyaom","gq_name":"monkeyaom"},{"player":"InsideOutMcJr","gq_name":"InsideOutMcJr"},{"player":"Codanator_1","gq_name":"Codanator_1"},{"player":"Player","gq_name":"Player"},{"player":"HoneydewHolt","gq_name":"HoneydewHolt"},{"player":"XGreenPlayz12","gq_name":"XGreenPlayz12"},{"player":"Error","gq_name":"Error"},{"player":"PolarShotgun","gq_name":"PolarShotgun"},{"player":"CmanX312","gq_name":"CmanX312"},{"player":"Bloody_Zombie23","gq_name":"Bloody_Zombie23"},{"player":"CheerioCrumpets","gq_name":"CheerioCrumpets"},{"player":"PikasX","gq_name":"PikasX"},{"player":"Dakota7413","gq_name":"Dakota7413"},{"player":"GalaxyGirl2203","gq_name":"GalaxyGirl2203"},{"player":"DanTDM","gq_name":"DanTDM"},{"player":"zCyberrr","gq_name":"zCyberrr"}],"dedicated":1,"password":0,"gq_online":true,"gq_address":"64.34.190.101","gq_port_client":28965,"gq_port_query":28965,"gq_protocol":"gamespy3","gq_type":"minecraft","gq_name":"Minecraft","gq_transport":"udp","gq_joinlink":"minecraft:\/\/64.34.190.101:28965\/","gq_dedicated":1,"gq_gametype":"MINECRAFT","gq_hostname":"TotalFreedom - for Minecraft 1.8.3","gq_mapname":"TsuchiIwa","gq_maxplayers":"45","gq_numplayers":"34","gq_password":0,"teams":[]}},"filtered":{"64.34.190.101:28965":{"hostname":"TotalFreedom - for Minecraft 1.8.3","gametype":"SMP","game_id":"MINECRAFT","version":"1.8.8","plugins":"CraftBukkit on Bukkit 1.8.8-R0.1-SNAPSHOT: Chairs 4.6; WorldEdit 6.0.2-TF,no_git_id; BookExploitFix 0.6; PlayerParticles 2.7; PortalGun 3.0.1; BukkitTelnet 4.1; ProtocolLib 3.6.3-SNAPSHOT; AcidFreedom 1.6.1; EchoPet 2.8.1-SNAPSHOT-b70; Lift 51; Essentials TeamCity; EssentialsSpawn TeamCity; SkinsRestorer 10.2; Movecraft 4.0.1; TotalFreedomMod 4.3","map":"TsuchiIwa","numplayers":"34","maxplayers":"45","hostport":"28965","hostip":"64.34.190.101","players":[{"player":"BerserkCreepah","gq_name":"BerserkCreepah"},{"player":"TheBigProBG","gq_name":"TheBigProBG"},{"player":"Musebrat2","gq_name":"Musebrat2"},{"player":"SansLeSk3leton","gq_name":"SansLeSk3leton"},{"player":"xXBrownieXx","gq_name":"xXBrownieXx"},{"player":"rovertdude","gq_name":"rovertdude"},{"player":"xXElectricMCXx","gq_name":"xXElectricMCXx"},{"player":"TaahThePhoenix","gq_name":"TaahThePhoenix"},{"player":"xXSpiritAnimalXx","gq_name":"xXSpiritAnimalXx"},{"player":"slyfox13","gq_name":"slyfox13"},{"player":"ElementalDreamer","gq_name":"ElementalDreamer"},{"player":"mirandacosgrove","gq_name":"mirandacosgrove"},{"player":"xNotCreater","gq_name":"xNotCreater"},{"player":"CodFish48","gq_name":"CodFish48"},{"player":"camron315","gq_name":"camron315"},{"player":"looky556","gq_name":"looky556"},{"player":"MC_SparkieGaming","gq_name":"MC_SparkieGaming"},{"player":"NebelCan_","gq_name":"NebelCan_"},{"player":"monkeyaom","gq_name":"monkeyaom"},{"player":"InsideOutMcJr","gq_name":"InsideOutMcJr"},{"player":"Codanator_1","gq_name":"Codanator_1"},{"player":"Player","gq_name":"Player"},{"player":"HoneydewHolt","gq_name":"HoneydewHolt"},{"player":"XGreenPlayz12","gq_name":"XGreenPlayz12"},{"player":"Error","gq_name":"Error"},{"player":"PolarShotgun","gq_name":"PolarShotgun"},{"player":"CmanX312","gq_name":"CmanX312"},{"player":"Bloody_Zombie23","gq_name":"Bloody_Zombie23"},{"player":"CheerioCrumpets","gq_name":"CheerioCrumpets"},{"player":"PikasX","gq_name":"PikasX"},{"player":"Dakota7413","gq_name":"Dakota7413"},{"player":"GalaxyGirl2203","gq_name":"GalaxyGirl2203"},{"player":"DanTDM","gq_name":"DanTDM"},{"player":"zCyberrr","gq_name":"zCyberrr"}],"dedicated":"1","password":"0","gq_online":"1","gq_address":"64.34.190.101","gq_port_client":"28965","gq_port_query":"28965","gq_protocol":"gamespy3","gq_type":"minecraft","gq_name":"Minecraft","gq_transport":"udp","gq_joinlink":"minecraft:\/\/64.34.190.101:28965\/","gq_dedicated":"1","gq_gametype":"MINECRAFT","gq_hostname":"TotalFreedom - for Minecraft 1.8.3","gq_mapname":"TsuchiIwa","gq_maxplayers":"45","gq_numplayers":"34","gq_password":"0","teams":[]}}} \ No newline at end of file diff --git a/gameq/tests/Filters/Secondstohuman.php b/gameq/tests/Filters/Secondstohuman.php new file mode 100644 index 0000000..36b171c --- /dev/null +++ b/gameq/tests/Filters/Secondstohuman.php @@ -0,0 +1,142 @@ +. + */ + +namespace GameQ\Tests\Filters; + +/** + * Class for testing Secondstohuman filter + * + * @package GameQ\Tests\Filters + */ +class Secondstohuman extends Base +{ + + /** + * Test default filter settings + */ + public function testFilteredDefault() + { + $data = [ + 'time' => 8634.0791015625, //02:23:54 + 'players' => [ + [ + 'name' => 'fake_player1', + 'time' => 7650.4604492188 //02:07:30 + ], + [ + 'name' => 'fake_player2', + 'time_conn' => 1333.1260986328 //00:22:13 + ], + ], + ]; + + $dataAfter = [ + 'time' => 8634.0791015625, //02:23:54 + 'gq_time_human' => '02:23:54', + 'players' => [ + [ + 'name' => 'fake_player1', + 'time' => 7650.4604492188, //02:07:30 + 'gq_time_human' => '02:07:30', + ], + [ + 'name' => 'fake_player2', + 'time_conn' => 1333.1260986328, //00:22:13 + ], + ], + ]; + + // Create a mock server + $server = $this->getMockBuilder('\GameQ\Server') + ->setConstructorArgs([ + [ + \GameQ\Server::SERVER_HOST => '127.0.0.1:27015', + \GameQ\Server::SERVER_TYPE => 'css', + ], + ]) + ->enableProxyingToOriginalMethods() + ->getMock(); + + // Create a mock filter + $filter = $this->getMockBuilder('\GameQ\Filters\Secondstohuman') + ->enableProxyingToOriginalMethods() + ->getMock(); + + $this->assertEquals($dataAfter, $filter->apply($data, $server)); + } + + /** + * Test the filter for Seconds to human using custom keys + */ + public function testFilteredCustom() + { + $data = [ + 'time' => 8634.0791015625, //02:23:54 + 'players' => [ + [ + 'name' => 'fake_player1', + 'time' => 7650.4604492188 //02:07:30 + ], + [ + 'name' => 'fake_player2', + 'time_conn' => 1333.1260986328 //00:22:13 + ], + ], + ]; + + $dataAfter = [ + 'time' => 8634.0791015625, //02:23:54 + 'gq_time_human' => '02:23:54', + 'players' => [ + [ + 'name' => 'fake_player1', + 'time' => 7650.4604492188, //02:07:30 + 'gq_time_human' => '02:07:30', + ], + [ + 'name' => 'fake_player2', + 'time_conn' => 1333.1260986328, //00:22:13 + 'gq_time_conn_human' => '00:22:13', + ], + ], + ]; + + // Create a mock server + $server = $this->getMockBuilder('\GameQ\Server') + ->setConstructorArgs([ + [ + \GameQ\Server::SERVER_HOST => '127.0.0.1:27015', + \GameQ\Server::SERVER_TYPE => 'css', + ], + ]) + ->enableProxyingToOriginalMethods() + ->getMock(); + + // Create a mock filter + $filter = $this->getMockBuilder('\GameQ\Filters\Secondstohuman') + ->setConstructorArgs([ + [ + \GameQ\Filters\Secondstohuman::OPTION_TIMEKEYS => ['time', 'time_conn'], + ], + ]) + ->enableProxyingToOriginalMethods() + ->getMock(); + + $this->assertEquals($dataAfter, $filter->apply($data, $server)); + } +} diff --git a/gameq/tests/Filters/Stripcolors.php b/gameq/tests/Filters/Stripcolors.php new file mode 100644 index 0000000..54c93c9 --- /dev/null +++ b/gameq/tests/Filters/Stripcolors.php @@ -0,0 +1,86 @@ +. + */ + +namespace GameQ\Tests\Filters; + +/** + * Class for testing Stripcolors filter + * + * @package GameQ\Tests\Filters + */ +class Stripcolors extends Base +{ + + /** + * Test the filter for Stripcolors + * + * @dataProvider loadData + * + * @param $protocol + * @param $raw + * @param $filtered + */ + public function testFiltered($protocol, $raw, $filtered) + { + + // Pop the key from the raw response + $host = key($raw); + + // Create a mock server + $server = $this->getMockBuilder('\GameQ\Server') + ->setConstructorArgs([ + [ + \GameQ\Server::SERVER_HOST => $host, + \GameQ\Server::SERVER_TYPE => $protocol, + ], + ]) + ->enableProxyingToOriginalMethods() + ->getMock(); + + // Create a mock filter + $filter = $this->getMockBuilder('\GameQ\Filters\Stripcolors') + ->enableProxyingToOriginalMethods() + ->getMock(); + + $this->assertEquals($filtered[$host], $filter->apply($raw[$host], $server)); + } + + /** + * Test for empty data pass to filter + */ + public function testEmpty() + { + // Create a mock server + $server = $this->getMockBuilder('\GameQ\Server') + ->setConstructorArgs([ + [ + \GameQ\Server::SERVER_HOST => '127.0.0.1:28960', + \GameQ\Server::SERVER_TYPE => 'quake3', + ], + ]) + ->enableProxyingToOriginalMethods() + ->getMock(); + + // Create a mock filter + $filter = $this->getMockBuilder('\GameQ\Filters\Stripcolors') + ->enableProxyingToOriginalMethods() + ->getMock(); + + $this->assertEmpty($filter->apply([], $server)); + } +} diff --git a/gameq/tests/GameQ.php b/gameq/tests/GameQ.php new file mode 100644 index 0000000..f69b272 --- /dev/null +++ b/gameq/tests/GameQ.php @@ -0,0 +1,280 @@ +. + */ + +namespace GameQ\Tests; + +/** + * GameQ tests class + * + * @package GameQ\Tests + */ +class GameQ extends TestBase +{ + + /** + * Holds stub on setup + * + * @type \GameQ\GameQ + */ + protected $stub; + + /** + * Setup to create our stub + */ + public function setUp() + { + $this->stub = $this->getMockBuilder('\GameQ\GameQ') + ->enableProxyingToOriginalMethods() + ->setMethods(['__get', '__set']) + ->getMock(); + } + + /** + * Test factory + */ + public function testFactory() + { + + $this->assertInstanceOf('\GameQ\GameQ', \GameQ\GameQ::factory()); + } + + /** + * Test getters and setters + */ + public function testGetSetOptions() + { + // Test null return for missing option + $this->assertNull($this->stub->invalidoption); + + $this->stub->option1 = 'value1'; + + // Verify the pull is correct + $this->assertEquals('value1', $this->stub->option1); + + // Use set option chainable + $this->stub->setOption('option1', 'value2'); + + // Verify the pull is correct + $this->assertEquals('value2', $this->stub->option1); + } + + /** + * Test adding/removing servers + */ + public function testAddServer() + { + + // Define some servers + $servers = [ + [ + \GameQ\Server::SERVER_HOST => '127.0.0.1:27015', + \GameQ\Server::SERVER_TYPE => 'css', + ], + [ + \GameQ\Server::SERVER_HOST => '127.0.0.1:27016', + \GameQ\Server::SERVER_TYPE => 'css', + ], + [ + \GameQ\Server::SERVER_HOST => '127.0.0.1:27017', + \GameQ\Server::SERVER_TYPE => 'css', + ], + ]; + + // Test single add server + $this->stub->addServer($servers[0]); + + $this->assertCount(1, \PHPUnit\Framework\Assert::readAttribute($this->stub, 'servers')); + + // Clear the servers + $this->stub->clearServers(); + + $this->assertCount(0, \PHPUnit\Framework\Assert::readAttribute($this->stub, 'servers')); + + // Add multiple servers + $this->stub->addServers($servers); + + $this->assertCount(3, \PHPUnit\Framework\Assert::readAttribute($this->stub, 'servers')); + + $this->stub->clearServers(); + } + + /** + * Test adding servers from files + * + * @depends testAddServer + */ + public function testAddServersFromFiles() + { + + // Test single file + $this->stub->addServersFromFiles(__DIR__ . '/Protocols/Providers/server_list1.json'); + + $this->assertCount(2, \PHPUnit\Framework\Assert::readAttribute($this->stub, 'servers')); + + $this->stub->clearServers(); + + // Test adding from json array of files + $this->stub->addServersFromFiles([ + __DIR__ . '/Protocols/Providers/server_list1.json', + ]); + + $this->assertCount(2, \PHPUnit\Framework\Assert::readAttribute($this->stub, 'servers')); + + $this->stub->clearServers(); + + // Test adding bad file + $this->stub->addServersFromFiles([ + __DIR__ . '/Protocols/Providers/server_list_bad.json', + ]); + + // No servers should exist + $this->assertCount(0, \PHPUnit\Framework\Assert::readAttribute($this->stub, 'servers')); + + $this->stub->clearServers(); + + // Test inaccessible file + $this->stub->addServersFromFiles(__DIR__ . '/Protocols/Providers/server_listDoesnotexist.json'); + + // No servers should exist + $this->assertCount(0, \PHPUnit\Framework\Assert::readAttribute($this->stub, 'servers')); + + $this->stub->clearServers(); + } + + /** + * Test adding/removing filters + */ + public function testFiltersAddRemove() + { + + // Add filter + $this->stub->addFilter('test_filter'); + + $this->assertArrayHasKey( + 'test_filter_d751713988987e9331980363e24189ce', + \PHPUnit\Framework\Assert::readAttribute($this->stub, 'options')['filters'] + ); + + // Remove filter + $this->stub->removeFilter('test_filter_d751713988987e9331980363e24189ce'); + + $this->assertArrayNotHasKey( + 'test_filter_d751713988987e9331980363e24189ce', + \PHPUnit\Framework\Assert::readAttribute($this->stub, 'options')['filters'] + ); + + // Test for lower case always + $this->stub->addFilter('tEst_fiLTEr'); + + $this->assertArrayHasKey( + 'test_filter_d751713988987e9331980363e24189ce', + \PHPUnit\Framework\Assert::readAttribute($this->stub, 'options')['filters'] + ); + + // Remove filter always lower case + $this->stub->removeFilter('tEst_fiLTEr_d751713988987e9331980363e24189ce'); + + $this->assertArrayNotHasKey( + 'test_filter_d751713988987e9331980363e24189ce', + \PHPUnit\Framework\Assert::readAttribute($this->stub, 'options')['filters'] + ); + } + + /** + * Test filter application + */ + public function testFilterApply() + { + + // Define some fake results + $fakeResults = [ + 'key1' => 'val1', + 'key2' => 'val2', + ]; + + // Create a mock server + $server = $this->getMockBuilder('\GameQ\Server') + ->setConstructorArgs([ + [ + \GameQ\Server::SERVER_HOST => '127.0.0.1:27015', + \GameQ\Server::SERVER_TYPE => 'css', + ], + ]) + ->enableProxyingToOriginalMethods() + ->getMock(); + + $this->stub->setOption('debug', false); + $this->stub->removeFilter('normalize_d751713988987e9331980363e24189ce'); + $this->stub->addFilter('test'); + + // Reflect on GameQ class so we can parse + $gameq = new \ReflectionClass($this->stub); + + // Get the parse method so we can call it + $method = $gameq->getMethod('doApplyFilters'); + + // Set the method to accessible + $method->setAccessible(true); + + $testResult = $method->invoke($this->stub, $fakeResults, $server); + + $this->assertEquals($fakeResults, $testResult); + } + + /** + * Test for bad filter and no exception is thrown + */ + public function testBadFilterException() + { + + // Define some fake results + $fakeResults = [ + 'key1' => 'val1', + 'key2' => 'val2', + ]; + + // Create a mock server + $server = $this->getMockBuilder('\GameQ\Server') + ->setConstructorArgs([ + [ + \GameQ\Server::SERVER_HOST => '127.0.0.1:27015', + \GameQ\Server::SERVER_TYPE => 'css', + ], + ]) + ->enableProxyingToOriginalMethods() + ->getMock(); + + $this->stub->setOption('debug', false); + $this->stub->removeFilter('normalize_d751713988987e9331980363e24189ce'); + $this->stub->addFilter('some_bad_filter'); + + // Reflect on GameQ class so we can parse + $gameq = new \ReflectionClass($this->stub); + + // Get the parse method so we can call it + $method = $gameq->getMethod('doApplyFilters'); + + // Set the method to accessible + $method->setAccessible(true); + + // No changes should be made + $testResult = $method->invoke($this->stub, $fakeResults, $server); + + $this->assertEquals($fakeResults, $testResult); + } +} diff --git a/gameq/tests/Issues/Issue307.php b/gameq/tests/Issues/Issue307.php new file mode 100644 index 0000000..3ef2bc6 --- /dev/null +++ b/gameq/tests/Issues/Issue307.php @@ -0,0 +1,80 @@ +. + */ + +namespace GameQ\Tests\Issues; + +use GameQ\Tests\TestBase; + +/** + * Class Issue307 + * + * Test for issue #307 - https://github.com/Austinb/GameQ/issues/307 + * Thanks to @vimishor for the testable response + * + * @package GameQ\Tests\Issues + */ +class Issue307 extends TestBase +{ + /** + * Test for issue with colliding packet ids in Source Protocol + * + * PHP Fatal error: [] operator not supported for strings in ./src/GameQ/Protocols/Source.php on line 185 + */ + public function test1() + { + + $filePath = sprintf('%s/Providers/307.txt', __DIR__); + + // Create a mock server + $server = // Create a mock server + $this->getMockBuilder('\GameQ\Server') + ->setConstructorArgs([ + [ + \GameQ\Server::SERVER_HOST => '127.0.0.1:27015', + \GameQ\Server::SERVER_TYPE => 'csgo', + ], + ]) + ->enableProxyingToOriginalMethods() + ->getMock(); + + // Invoke beforeSend function + $server->protocol()->beforeSend($server); + + // Set the packet response as if we have really queried it + $server->protocol()->packetResponse(explode(PHP_EOL . '||' . PHP_EOL, file_get_contents($filePath))); + + // Create a mock GameQ + $gq_mock = $this->getMockBuilder('\GameQ\GameQ') + ->enableProxyingToOriginalMethods() + ->getMock(); + $gq_mock->setOption('debug', false); + + // Reflect on GameQ class so we can parse + $gameq = new \ReflectionClass($gq_mock); + + // Get the parse method so we can call it + $method = $gameq->getMethod('doParseResponse'); + + // Set the method to accessible + $method->setAccessible(true); + + $testResult = $method->invoke($gq_mock, $server); + + $this->assertEquals($testResult['gq_online'], 1); + } +} diff --git a/gameq/tests/Issues/Issue382.php b/gameq/tests/Issues/Issue382.php new file mode 100644 index 0000000..b801543 --- /dev/null +++ b/gameq/tests/Issues/Issue382.php @@ -0,0 +1,83 @@ +. + */ + +namespace GameQ\Tests\Issues; + +use GameQ\Tests\TestBase; + +/** + * Class Issue382 + * + * Test for issue #382 - https://github.com/Austinb/GameQ/issues/382 + * [ARMA 3] New Jets DLC Support + * + * @package GameQ\Tests\Issues + */ +class Issue382 extends TestBase +{ + /** + * Test for issue where if a server has the jets DLC, GameQ would throw exception: + * + * ErrorException (E_NOTICE) + * Undefined offset: 32 + */ + public function test1() + { + /** + * Test Response Data provided by AAF - https://australianarmedforces.org/ + */ + $filePath = sprintf('%s/Providers/382.txt', __DIR__); + + // Create a mock server + $server = + $this->getMockBuilder('\GameQ\Server') + ->setConstructorArgs([ + [ + \GameQ\Server::SERVER_HOST => '58.162.184.102:2302', + \GameQ\Server::SERVER_TYPE => 'arma3', + ], + ]) + ->enableProxyingToOriginalMethods() + ->getMock(); + + // Invoke beforeSend function + $server->protocol()->beforeSend($server); + + // Set the packet response as if we have really queried it + $server->protocol()->packetResponse(explode(PHP_EOL . '||' . PHP_EOL, file_get_contents($filePath))); + + // Create a mock GameQ + $gq_mock = $this->getMockBuilder('\GameQ\GameQ') + ->enableProxyingToOriginalMethods() + ->getMock(); + $gq_mock->setOption('debug', false); + + // Reflect on GameQ class so we can parse + $gameq = new \ReflectionClass($gq_mock); + + // Get the parse method so we can call it + $method = $gameq->getMethod('doParseResponse'); + + // Set the method to accessible + $method->setAccessible(true); + + $testResult = $method->invoke($gq_mock, $server); + + $this->assertEquals($testResult['gq_online'], true); + } +} diff --git a/gameq/tests/Issues/Providers/307.txt b/gameq/tests/Issues/Providers/307.txt new file mode 100644 index 0000000..127f702 Binary files /dev/null and b/gameq/tests/Issues/Providers/307.txt differ diff --git a/gameq/tests/Issues/Providers/382.txt b/gameq/tests/Issues/Providers/382.txt new file mode 100644 index 0000000..6e37ac6 Binary files /dev/null and b/gameq/tests/Issues/Providers/382.txt differ diff --git a/gameq/tests/Protocol.php b/gameq/tests/Protocol.php new file mode 100644 index 0000000..fcceb50 --- /dev/null +++ b/gameq/tests/Protocol.php @@ -0,0 +1,162 @@ +. + */ + +namespace GameQ\Tests; + +/** + * Protocol test class + * + * @package GameQ\Tests + */ +class Protocol extends TestBase +{ + + /** + * Holds stub on setup + * + * @type \GameQ\Protocol + */ + protected $stub; + + /** + * Some dummy options + * + * @type array + */ + protected $options = [ + 'key1' => 'var1', + ]; + + /** + * Setup to create our stub + */ + public function setUp() + { + + $this->stub = $this->getMockForAbstractClass('\GameQ\Protocol', [ $this->options ]); + } + + /** + * Random assortment of general tests for completeness + */ + public function testGeneral() + { + + $name = 'Test name'; + $nameLong = 'Test name bigger, longer'; + $portDiff = 5454; + + $reflection = new \ReflectionClass($this->stub); + $reflection_property_name = $reflection->getProperty('name'); + $reflection_property_name->setAccessible(true); + + $reflection_property_name->setValue($this->stub, $name); + + $this->assertEquals($name, $this->stub->name()); + + $reflection_property_namelong = $reflection->getProperty('name_long'); + $reflection_property_namelong->setAccessible(true); + + $reflection_property_namelong->setValue($this->stub, $nameLong); + + $this->assertEquals($nameLong, $this->stub->nameLong()); + + // Test transport + $this->assertEquals(\GameQ\Protocol::TRANSPORT_UDP, $this->stub->transport()); + + // Test transport setting + $this->stub->transport(\GameQ\Protocol::TRANSPORT_TCP); + $this->assertEquals(\GameQ\Protocol::TRANSPORT_TCP, $this->stub->transport()); + + // Test protocol state + $this->assertEquals(\GameQ\Protocol::STATE_STABLE, $this->stub->state()); + + // Test port diff + $reflection_property_portdiff = $reflection->getProperty('port_diff'); + $reflection_property_portdiff->setAccessible(true); + + $reflection_property_portdiff->setValue($this->stub, $portDiff); + + $this->assertEquals($portDiff, $this->stub->portDiff()); + } + + /** + * Test packet setter/getter and some other packet methods + */ + public function testPackets() + { + + $packets = [ + \GameQ\Protocol::PACKET_CHALLENGE => 'Do you even lift?', + \GameQ\Protocol::PACKET_RULES => 'There are no rules!!', + ]; + + $reflection = new \ReflectionClass($this->stub); + $reflection_property = $reflection->getProperty('packets'); + $reflection_property->setAccessible(true); + + $reflection_property->setValue($this->stub, $packets); + + // Test all return + $this->assertEquals($packets, $this->stub->getPacket()); + + // Test multiple selected + $this->assertEquals($packets, $this->stub->getPacket([ + \GameQ\Protocol::PACKET_CHALLENGE, + \GameQ\Protocol::PACKET_RULES, + ])); + + // Test single selected + $this->assertEquals( + $packets[\GameQ\Protocol::PACKET_CHALLENGE], + $this->stub->getPacket(\GameQ\Protocol::PACKET_CHALLENGE) + ); + + // Drop challenge and test for !challenge + unset($packets[\GameQ\Protocol::PACKET_CHALLENGE]); + + $reflection_property->setValue($this->stub, $packets); + + $this->assertEquals($packets, $this->stub->getPacket('!challenge')); + + // test hasChallenge + $this->assertFalse($this->stub->hasChallenge()); + } + + /** + * Test options methods + */ + public function testOptions() + { + + // Test the options attribute + $this->assertEquals($this->options, \PHPUnit\Framework\Assert::readAttribute($this->stub, 'options')); + + // Check the options getter + $this->assertEquals($this->options, $this->stub->options()); + + // Set new options and then check + $new_options = [ + 'key2' => 'value2', + ]; + + $this->stub->options($new_options); + + $this->assertEquals($new_options, $this->stub->options()); + } +} diff --git a/gameq/tests/Protocols/Aa3.php b/gameq/tests/Protocols/Aa3.php new file mode 100644 index 0000000..04b9496 --- /dev/null +++ b/gameq/tests/Protocols/Aa3.php @@ -0,0 +1,50 @@ +. + */ + +namespace GameQ\Tests\Protocols; + +/** + * Test Class for America's Army 3 + * + * @package GameQ\Tests\Protocols + */ +class Aa3 extends Base +{ + /** + * Test responses for Aa3 + * + * @dataProvider loadData + * + * @param $responses + * @param $result + */ + public function testResponses($responses, $result) + { + + // Pull the first key off the array this is the server ip:port + $server = key($result); + + $testResult = $this->queryTest( + $server, + 'aa3', + $responses + ); + + $this->assertEquals($result[$server], $testResult); + } +} diff --git a/gameq/tests/Protocols/Aapg.php b/gameq/tests/Protocols/Aapg.php new file mode 100644 index 0000000..61524f5 --- /dev/null +++ b/gameq/tests/Protocols/Aapg.php @@ -0,0 +1,50 @@ +. + */ + +namespace GameQ\Tests\Protocols; + +/** + * Test Class for America's Army: Proving Grounds + * + * @package GameQ\Tests\Protocols + */ +class Aapg extends Base +{ + /** + * Test responses for Aapg + * + * @dataProvider loadData + * + * @param $responses + * @param $result + */ + public function testResponses($responses, $result) + { + + // Pull the first key off the array this is the server ip:port + $server = key($result); + + $testResult = $this->queryTest( + $server, + 'aapg', + $responses + ); + + $this->assertEquals($result[$server], $testResult); + } +} diff --git a/gameq/tests/Protocols/Arkse.php b/gameq/tests/Protocols/Arkse.php new file mode 100644 index 0000000..b465f62 --- /dev/null +++ b/gameq/tests/Protocols/Arkse.php @@ -0,0 +1,50 @@ +. + */ + +namespace GameQ\Tests\Protocols; + +/** + * Test Class for ARK: Survival Evolved + * + * @package GameQ\Tests\Protocols + */ +class Arkse extends Base +{ + /** + * Test responses for ARK: Survival Evolved + * + * @dataProvider loadData + * + * @param $responses + * @param $result + */ + public function testResponses($responses, $result) + { + + // Pull the first key off the array this is the server ip:port + $server = key($result); + + $testResult = $this->queryTest( + $server, + 'arkse', + $responses + ); + + $this->assertEquals($result[$server], $testResult, '', 0.00000001); + } +} diff --git a/gameq/tests/Protocols/Arma3.php b/gameq/tests/Protocols/Arma3.php new file mode 100644 index 0000000..a8b1d42 --- /dev/null +++ b/gameq/tests/Protocols/Arma3.php @@ -0,0 +1,50 @@ +. + */ + +namespace GameQ\Tests\Protocols; + +/** + * Test Class for Armed Assault 3 + * + * @package GameQ\Tests\Protocols + */ +class Arma3 extends Base +{ + /** + * Test responses for Arma 3 + * + * @dataProvider loadData + * + * @param $responses + * @param $result + */ + public function testResponses($responses, $result) + { + + // Pull the first key off the array this is the server ip:port + $server = key($result); + + $testResult = $this->queryTest( + $server, + 'arma3', + $responses + ); + + $this->assertEquals($result[$server], $testResult, '', 0.0000001); + } +} diff --git a/gameq/tests/Protocols/Armedassault2oa.php b/gameq/tests/Protocols/Armedassault2oa.php new file mode 100644 index 0000000..8b746b4 --- /dev/null +++ b/gameq/tests/Protocols/Armedassault2oa.php @@ -0,0 +1,50 @@ +. + */ + +namespace GameQ\Tests\Protocols; + +/** + * Test Class for Armed Assault 2: Operation Arrowhead + * + * @package GameQ\Tests\Protocols + */ +class Armedassault2oa extends Base +{ + /** + * Test responses for Armedassault2oa + * + * @dataProvider loadData + * + * @param $responses + * @param $result + */ + public function testResponses($responses, $result) + { + + // Pull the first key off the array this is the server ip:port + $server = key($result); + + $testResult = $this->queryTest( + $server, + 'armedassault2oa', + $responses + ); + + $this->assertEquals($result[$server], $testResult, '', 0.0000001); + } +} diff --git a/gameq/tests/Protocols/Ase.php b/gameq/tests/Protocols/Ase.php new file mode 100644 index 0000000..9ab4d1c --- /dev/null +++ b/gameq/tests/Protocols/Ase.php @@ -0,0 +1,61 @@ +. + */ + +namespace GameQ\Tests\Protocols; + +class Ase extends Base +{ + + /** + * Holds stub on setup + * + * @type \GameQ\Protocols\Ase + */ + protected $stub; + + /** + * Holds the expected packets for this protocol class + * + * @type array + */ + protected $packets = [ + \GameQ\Protocol::PACKET_ALL => "s", + ]; + + /** + * Setup + */ + public function setUp() + { + + // Create the stub class + $this->stub = $this->getMockBuilder('\GameQ\Protocols\Ase') + ->enableProxyingToOriginalMethods() + ->getMock(); + } + + /** + * Test the packets to make sure they are correct for source + */ + public function testPackets() + { + + // Test to make sure packets are defined properly + $this->assertEquals($this->packets, \PHPUnit\Framework\Assert::readAttribute($this->stub, 'packets')); + } +} diff --git a/gameq/tests/Protocols/Base.php b/gameq/tests/Protocols/Base.php new file mode 100644 index 0000000..4b0bb71 --- /dev/null +++ b/gameq/tests/Protocols/Base.php @@ -0,0 +1,130 @@ +. + */ + +namespace GameQ\Tests\Protocols; + +use GameQ\Tests\TestBase; + +/** + * Class Base for protocol tests + * + * @SuppressWarnings(PHPMD.NumberOfChildren) + * + * @package GameQ\Tests\Protocols + */ +abstract class Base extends TestBase +{ + + /** + * Shared provider to give protocols the data to test with + * + * @return array + */ + public function loadData() + { + + // Explode the class that called to avoid strict error + $class = explode('\\', get_called_class()); + + // Determine the folder to grab the provider files and results from + $providersLookup = sprintf('%s/Providers/%s/', __DIR__, array_pop($class)); + + // Init the return array + $providers = []; + + // Do a glob lookup just for the responses + $files = new \GlobIterator($providersLookup . '*_response.txt'); + + // Iterate over the list of response files that exists + foreach ($files as $fileinfo) { + if (!$fileinfo->isReadable() || !$fileinfo->isFile()) { + continue; + } + + list($index, $type) = explode('_', $fileinfo->getFilename()); + + unset($type); + + // Append this data to the providers return + $providers[] = [ + explode(PHP_EOL . '||' . PHP_EOL, file_get_contents($fileinfo->getRealPath())), + json_decode(file_get_contents(sprintf('%s%d_result.json', $providersLookup, $index)), true), + ]; + } + + // Clear some memory + unset($files, $fileinfo, $providersLookup); + + return $providers; + } + + /** + * Generic query test function to simulate testing of protocol classes + * + * @param string $host + * @param string $protocol + * @param array $responses + * @param bool $debug + * @param array $server_options + * + * @return mixed + */ + protected function queryTest($host, $protocol, $responses, $debug = false, $server_options = []) + { + + // Create a mock server + $server = $this->getMockBuilder('\GameQ\Server') + ->setConstructorArgs([ + [ + \GameQ\Server::SERVER_HOST => $host, + \GameQ\Server::SERVER_TYPE => $protocol, + \GameQ\Server::SERVER_OPTIONS => $server_options, + ], + ]) + ->enableProxyingToOriginalMethods() + ->getMock(); + + // Invoke beforeSend function + $server->protocol()->beforeSend($server); + + // Set the packet response as if we have really queried it + $server->protocol()->packetResponse($responses); + + // Create a mock GameQ + $gq_mock = $this->getMockBuilder('\GameQ\GameQ') + ->enableProxyingToOriginalMethods() + ->getMock(); + $gq_mock->setOption('debug', $debug); + $gq_mock->removeFilter('normalize'); + + // Reflect on GameQ class so we can parse + $gameq = new \ReflectionClass($gq_mock); + + // Get the parse method so we can call it + $method = $gameq->getMethod('doParseResponse'); + + // Set the method to accessible + $method->setAccessible(true); + + $testResult = $method->invoke($gq_mock, $server); + + unset($server, $gq_mock, $gameq, $method); + + return $testResult; + } +} diff --git a/gameq/tests/Protocols/Batt1944.php b/gameq/tests/Protocols/Batt1944.php new file mode 100644 index 0000000..6273162 --- /dev/null +++ b/gameq/tests/Protocols/Batt1944.php @@ -0,0 +1,50 @@ +. + */ + +namespace GameQ\Tests\Protocols; + +/** + * Test Class for Battalion 1944 + * + * @package GameQ\Tests\Protocols + */ +class Batt1944 extends Base +{ + /** + * Test responses for Battalion 1944l + * + * @dataProvider loadData + * + * @param $responses + * @param $result + */ + public function testResponses($responses, $result) + { + + // Pull the first key off the array this is the server ip:port + $server = key($result); + + $testResult = $this->queryTest( + $server, + 'batt1944', + $responses + ); + + $this->assertEquals($result[$server], $testResult); + } +} diff --git a/gameq/tests/Protocols/Bf1942.php b/gameq/tests/Protocols/Bf1942.php new file mode 100644 index 0000000..73c4709 --- /dev/null +++ b/gameq/tests/Protocols/Bf1942.php @@ -0,0 +1,46 @@ +. + */ + +namespace GameQ\Tests\Protocols; + +class Bf1942 extends Base +{ + + /** + * Test responses for Battlefield 1942 + * + * @dataProvider loadData + * + * @param $responses + * @param $result + */ + public function testResponses($responses, $result) + { + + // Pull the first key off the array this is the server ip:port + $server = key($result); + + $testResult = $this->queryTest( + $server, + 'bf1942', + $responses + ); + + $this->assertEquals($result[$server], $testResult); + } +} diff --git a/gameq/tests/Protocols/Bf2.php b/gameq/tests/Protocols/Bf2.php new file mode 100644 index 0000000..dda1225 --- /dev/null +++ b/gameq/tests/Protocols/Bf2.php @@ -0,0 +1,46 @@ +. + */ + +namespace GameQ\Tests\Protocols; + +class Bf2 extends Base +{ + + /** + * Test responses for Battlefield 2 + * + * @dataProvider loadData + * + * @param $responses + * @param $result + */ + public function testResponses($responses, $result) + { + + // Pull the first key off the array this is the server ip:port + $server = key($result); + + $testResult = $this->queryTest( + $server, + 'bf2', + $responses + ); + + $this->assertEquals($result[$server], $testResult); + } +} diff --git a/gameq/tests/Protocols/Bf3.php b/gameq/tests/Protocols/Bf3.php new file mode 100644 index 0000000..6699fa5 --- /dev/null +++ b/gameq/tests/Protocols/Bf3.php @@ -0,0 +1,106 @@ +. + */ + +namespace GameQ\Tests\Protocols; + +class Bf3 extends Base +{ + + /** + * Holds stub on setup + * + * @type \GameQ\Protocols\Bf3 + */ + protected $stub; + + /** + * Holds the expected packets for this protocol class + * + * @type array + */ + protected $packets = [ + \GameQ\Protocol::PACKET_STATUS => "\x00\x00\x00\x21\x1b\x00\x00\x00\x01\x00\x00\x00\x0a\x00\x00\x00serverInfo\x00", + \GameQ\Protocol::PACKET_VERSION => "\x00\x00\x00\x22\x18\x00\x00\x00\x01\x00\x00\x00\x07\x00\x00\x00version\x00", + \GameQ\Protocol::PACKET_PLAYERS => + "\x00\x00\x00\x23\x24\x00\x00\x00\x02\x00\x00\x00\x0b\x00\x00\x00listPlayers\x00\x03\x00\x00\x00\x61ll\x00", + ]; + + /** + * Setup + */ + public function setUp() + { + + // Create the stub class + $this->stub = $this->getMockBuilder('\GameQ\Protocols\Bf3') + ->enableProxyingToOriginalMethods() + ->getMock(); + } + + /** + * Test the packets to make sure they are correct for source + */ + public function testPackets() + { + + // Test to make sure packets are defined properly + $this->assertEquals($this->packets, \PHPUnit\Framework\Assert::readAttribute($this->stub, 'packets')); + } + + /** + * Test for invalid packet length + * + * @expectedException \Exception + * @expectedExceptionMessage GameQ\Protocols\Bf3::processResponse packet length does not match expected length! + */ + public function testInvalidPacketLengthDebug() + { + + // Read in a css source file + $source = file_get_contents(sprintf('%s/Providers/Bf3/1_response.txt', __DIR__)); + + // Change the first packet to some unknown header + $source = str_replace("\x00\x00\x00a%", "\x00\x00\x00a!", $source); + + // Should fail out + $this->queryTest('127.0.0.1:27015', 'bf3', explode(PHP_EOL . '||' . PHP_EOL, $source), true); + } + + /** + * Test responses for Battlefield 3 + * + * @dataProvider loadData + * + * @param $responses + * @param $result + */ + public function testResponses($responses, $result) + { + + // Pull the first key off the array this is the server ip:port + $server = key($result); + + $testResult = $this->queryTest( + $server, + 'bf3', + $responses + ); + + $this->assertEquals($result[$server], $testResult); + } +} diff --git a/gameq/tests/Protocols/Bf4.php b/gameq/tests/Protocols/Bf4.php new file mode 100644 index 0000000..6c91687 --- /dev/null +++ b/gameq/tests/Protocols/Bf4.php @@ -0,0 +1,46 @@ +. + */ + +namespace GameQ\Tests\Protocols; + +class Bf4 extends Base +{ + + /** + * Test responses for Battlefield 4 + * + * @dataProvider loadData + * + * @param $responses + * @param $result + */ + public function testResponses($responses, $result) + { + + // Pull the first key off the array this is the server ip:port + $server = key($result); + + $testResult = $this->queryTest( + $server, + 'bf4', + $responses + ); + + $this->assertEquals($result[$server], $testResult); + } +} diff --git a/gameq/tests/Protocols/Bfbc2.php b/gameq/tests/Protocols/Bfbc2.php new file mode 100644 index 0000000..af4dfbb --- /dev/null +++ b/gameq/tests/Protocols/Bfbc2.php @@ -0,0 +1,106 @@ +. + */ + +namespace GameQ\Tests\Protocols; + +class Bfbc2 extends Base +{ + + /** + * Holds stub on setup + * + * @type \GameQ\Protocols\Bfbc2 + */ + protected $stub; + + /** + * Holds the expected packets for this protocol class + * + * @type array + */ + protected $packets = [ + \GameQ\Protocol::PACKET_VERSION => "\x00\x00\x00\x00\x18\x00\x00\x00\x01\x00\x00\x00\x07\x00\x00\x00version\x00", + \GameQ\Protocol::PACKET_STATUS => "\x00\x00\x00\x00\x1b\x00\x00\x00\x01\x00\x00\x00\x0a\x00\x00\x00serverInfo\x00", + \GameQ\Protocol::PACKET_PLAYERS => + "\x00\x00\x00\x00\x24\x00\x00\x00\x02\x00\x00\x00\x0b\x00\x00\x00listPlayers\x00\x03\x00\x00\x00\x61ll\x00", + ]; + + /** + * Setup + */ + public function setUp() + { + + // Create the stub class + $this->stub = $this->getMockBuilder('\GameQ\Protocols\Bfbc2') + ->enableProxyingToOriginalMethods() + ->getMock(); + } + + /** + * Test the packets to make sure they are correct for source + */ + public function testPackets() + { + + // Test to make sure packets are defined properly + $this->assertEquals($this->packets, \PHPUnit\Framework\Assert::readAttribute($this->stub, 'packets')); + } + + /** + * Test for invalid packet length + * + * @expectedException \Exception + * @expectedExceptionMessage GameQ\Protocols\Bfbc2::processResponse packet length does not match expected length! + */ + public function testInvalidPacketLengthDebug() + { + + // Read in a css source file + $source = file_get_contents(sprintf('%s/Providers/Bfbc2/1_response.txt', __DIR__)); + + // Change the first packet to some unknown header + $source = str_replace("\x00\x00\x00\x40\x28", "\x00\x00\x00\x40\x29", $source); + + // Should fail out + $this->queryTest('127.0.0.1:27015', 'bfbc2', explode(PHP_EOL . '||' . PHP_EOL, $source), true); + } + + /** + * Test responses for Battlefield Bad Company 2 + * + * @dataProvider loadData + * + * @param $responses + * @param $result + */ + public function testResponses($responses, $result) + { + + // Pull the first key off the array this is the server ip:port + $server = key($result); + + $testResult = $this->queryTest( + $server, + 'bfbc2', + $responses + ); + + $this->assertEquals($result[$server], $testResult); + } +} diff --git a/gameq/tests/Protocols/Bfh.php b/gameq/tests/Protocols/Bfh.php new file mode 100644 index 0000000..e099f47 --- /dev/null +++ b/gameq/tests/Protocols/Bfh.php @@ -0,0 +1,46 @@ +. + */ + +namespace GameQ\Tests\Protocols; + +class Bfh extends Base +{ + + /** + * Test responses for Battlefield Hardline + * + * @dataProvider loadData + * + * @param $responses + * @param $result + */ + public function testResponses($responses, $result) + { + + // Pull the first key off the array this is the server ip:port + $server = key($result); + + $testResult = $this->queryTest( + $server, + 'bfh', + $responses + ); + + $this->assertEquals($result[$server], $testResult); + } +} diff --git a/gameq/tests/Protocols/Cod2.php b/gameq/tests/Protocols/Cod2.php new file mode 100644 index 0000000..eff4258 --- /dev/null +++ b/gameq/tests/Protocols/Cod2.php @@ -0,0 +1,50 @@ +. + */ + +namespace GameQ\Tests\Protocols; + +/** + * Test Class for Call of Duty 2 + * + * @package GameQ\Tests\Protocols + */ +class Cod2 extends Base +{ + /** + * Test responses for Call of Duty 2 + * + * @dataProvider loadData + * + * @param $responses + * @param $result + */ + public function testResponses($responses, $result) + { + + // Pull the first key off the array this is the server ip:port + $server = key($result); + + $testResult = $this->queryTest( + $server, + 'cod2', + $responses + ); + + $this->assertEquals($result[$server], $testResult); + } +} diff --git a/gameq/tests/Protocols/Cod4.php b/gameq/tests/Protocols/Cod4.php new file mode 100644 index 0000000..7b0050e --- /dev/null +++ b/gameq/tests/Protocols/Cod4.php @@ -0,0 +1,50 @@ +. + */ + +namespace GameQ\Tests\Protocols; + +/** + * Test Class for Call of Duty 4 + * + * @package GameQ\Tests\Protocols + */ +class Cod4 extends Base +{ + /** + * Test responses for Call of Duty 4 + * + * @dataProvider loadData + * + * @param $responses + * @param $result + */ + public function testResponses($responses, $result) + { + + // Pull the first key off the array this is the server ip:port + $server = key($result); + + $testResult = $this->queryTest( + $server, + 'cod4', + $responses + ); + + $this->assertEquals($result[$server], $testResult); + } +} diff --git a/gameq/tests/Protocols/Codmw3.php b/gameq/tests/Protocols/Codmw3.php new file mode 100644 index 0000000..63ec075 --- /dev/null +++ b/gameq/tests/Protocols/Codmw3.php @@ -0,0 +1,50 @@ +. + */ + +namespace GameQ\Tests\Protocols; + +/** + * Test Class for Call of Duty: Modern Warfare 3 + * + * @package GameQ\Tests\Protocols + */ +class Codmw3 extends Base +{ + /** + * Test responses for Codmw3 + * + * @dataProvider loadData + * + * @param $responses + * @param $result + */ + public function testResponses($responses, $result) + { + + // Pull the first key off the array this is the server ip:port + $server = key($result); + + $testResult = $this->queryTest( + $server, + 'codmw3', + $responses + ); + + $this->assertEquals($result[$server], $testResult); + } +} diff --git a/gameq/tests/Protocols/Conanexiles.php b/gameq/tests/Protocols/Conanexiles.php new file mode 100644 index 0000000..28a50c0 --- /dev/null +++ b/gameq/tests/Protocols/Conanexiles.php @@ -0,0 +1,54 @@ +. + */ + +namespace GameQ\Tests\Protocols; + +/** + * Test Class for Conanexiles + * + * @package GameQ\Tests\Protocols + */ +class Conanexiles extends Base +{ + /** + * Test responses for Dods + * + * @dataProvider loadData + * + * @param $responses + * @param $result + */ + public function testResponses($responses, $result) + { + + // Pull the first key off the array this is the server ip:port + $server = key($result); + + $testResult = $this->queryTest( + $server, + 'conanexiles', + $responses, + false, + [ + \GameQ\Server::SERVER_OPTIONS_QUERY_PORT => $result[ $server ]['gq_port_query'], + ] + ); + + $this->assertEquals($result[$server], $testResult, '', 0.00000001); + } +} diff --git a/gameq/tests/Protocols/Crysiswars.php b/gameq/tests/Protocols/Crysiswars.php new file mode 100644 index 0000000..fbba3ef --- /dev/null +++ b/gameq/tests/Protocols/Crysiswars.php @@ -0,0 +1,50 @@ +. + */ + +namespace GameQ\Tests\Protocols; + +/** + * Test Class for Crysis wars + * + * @package GameQ\Tests\Protocols + */ +class Crysiswars extends Base +{ + /** + * Test responses for Crysis wars + * + * @dataProvider loadData + * + * @param $responses + * @param $result + */ + public function testResponses($responses, $result) + { + + // Pull the first key off the array this is the server ip:port + $server = key($result); + + $testResult = $this->queryTest( + $server, + 'crysiswars', + $responses + ); + + $this->assertEquals($result[$server], $testResult); + } +} diff --git a/gameq/tests/Protocols/Cs15.php b/gameq/tests/Protocols/Cs15.php new file mode 100644 index 0000000..723dcea --- /dev/null +++ b/gameq/tests/Protocols/Cs15.php @@ -0,0 +1,50 @@ +. + */ + +namespace GameQ\Tests\Protocols; + +/** + * Test Class for CS 1.5 + * + * @package GameQ\Tests\Protocols + */ +class Cs15 extends Base +{ + /** + * Test server responses for Cs 1.5 + * + * @dataProvider loadData + * + * @param $responses + * @param $result + */ + public function testResponses($responses, $result) + { + + // Pull the first key off the array this is the server ip:port + $server = key($result); + + $testResult = $this->queryTest( + $server, + 'cs15', + $responses + ); + + $this->assertEquals($result[$server], $testResult); + } +} diff --git a/gameq/tests/Protocols/Cs16.php b/gameq/tests/Protocols/Cs16.php new file mode 100644 index 0000000..a87525a --- /dev/null +++ b/gameq/tests/Protocols/Cs16.php @@ -0,0 +1,50 @@ +. + */ + +namespace GameQ\Tests\Protocols; + +/** + * Test Class for CS 1.6 + * + * @package GameQ\Tests\Protocols + */ +class Cs16 extends Base +{ + /** + * Test responses for Cs 1.6 + * + * @dataProvider loadData + * + * @param $responses + * @param $result + */ + public function testResponses($responses, $result) + { + + // Pull the first key off the array this is the server ip:port + $server = key($result); + + $testResult = $this->queryTest( + $server, + 'cs16', + $responses + ); + + $this->assertEquals($result[$server], $testResult); + } +} diff --git a/gameq/tests/Protocols/Cscz.php b/gameq/tests/Protocols/Cscz.php new file mode 100644 index 0000000..76b12d9 --- /dev/null +++ b/gameq/tests/Protocols/Cscz.php @@ -0,0 +1,50 @@ +. + */ + +namespace GameQ\Tests\Protocols; + +/** + * Test Class for CS Condition Zero + * + * @package GameQ\Tests\Protocols + */ +class Cscz extends Base +{ + /** + * Test responses for Cscz + * + * @dataProvider loadData + * + * @param $responses + * @param $result + */ + public function testResponses($responses, $result) + { + + // Pull the first key off the array this is the server ip:port + $server = key($result); + + $testResult = $this->queryTest( + $server, + 'cscz', + $responses + ); + + $this->assertEquals($result[$server], $testResult); + } +} diff --git a/gameq/tests/Protocols/Csgo.php b/gameq/tests/Protocols/Csgo.php new file mode 100644 index 0000000..93344db --- /dev/null +++ b/gameq/tests/Protocols/Csgo.php @@ -0,0 +1,50 @@ +. + */ + +namespace GameQ\Tests\Protocols; + +/** + * Test Class for CS Source + * + * @package GameQ\Tests\Protocols + */ +class Csgo extends Base +{ + /** + * Test responses for Csgo + * + * @dataProvider loadData + * + * @param $responses + * @param $result + */ + public function testResponses($responses, $result) + { + + // Pull the first key off the array this is the server ip:port + $server = key($result); + + $testResult = $this->queryTest( + $server, + 'csgo', + $responses + ); + + $this->assertEquals($result[$server], $testResult); + } +} diff --git a/gameq/tests/Protocols/Css.php b/gameq/tests/Protocols/Css.php new file mode 100644 index 0000000..d232e0b --- /dev/null +++ b/gameq/tests/Protocols/Css.php @@ -0,0 +1,50 @@ +. + */ + +namespace GameQ\Tests\Protocols; + +/** + * Test Class for CS Source + * + * @package GameQ\Tests\Protocols + */ +class Css extends Base +{ + /** + * Test responses for Css + * + * @dataProvider loadData + * + * @param $responses + * @param $result + */ + public function testResponses($responses, $result) + { + + // Pull the first key off the array this is the server ip:port + $server = key($result); + + $testResult = $this->queryTest( + $server, + 'css', + $responses + ); + + $this->assertEquals($result[$server], $testResult); + } +} diff --git a/gameq/tests/Protocols/Dayz.php b/gameq/tests/Protocols/Dayz.php new file mode 100644 index 0000000..861141d --- /dev/null +++ b/gameq/tests/Protocols/Dayz.php @@ -0,0 +1,50 @@ +. + */ + +namespace GameQ\Tests\Protocols; + +/** + * Test Class for DayZ Standalone + * + * @package GameQ\Tests\Protocols + */ +class Dayz extends Base +{ + /** + * Test responses for Dayz + * + * @dataProvider loadData + * + * @param $responses + * @param $result + */ + public function testResponses($responses, $result) + { + + // Pull the first key off the array this is the server ip:port + $server = key($result); + + $testResult = $this->queryTest( + $server, + 'dayz', + $responses + ); + + $this->assertEquals($result[$server], $testResult); + } +} diff --git a/gameq/tests/Protocols/Dayzmod.php b/gameq/tests/Protocols/Dayzmod.php new file mode 100644 index 0000000..a2c8f77 --- /dev/null +++ b/gameq/tests/Protocols/Dayzmod.php @@ -0,0 +1,50 @@ +. + */ + +namespace GameQ\Tests\Protocols; + +/** + * Test Class for Dayz Mod + * + * @package GameQ\Tests\Protocols + */ +class Dayzmod extends Base +{ + /** + * Test responses for Dayzmod + * + * @dataProvider loadData + * + * @param $responses + * @param $result + */ + public function testResponses($responses, $result) + { + + // Pull the first key off the array this is the server ip:port + $server = key($result); + + $testResult = $this->queryTest( + $server, + 'dayzmod', + $responses + ); + + $this->assertEquals($result[$server], $testResult, '', 0.0000001); + } +} diff --git a/gameq/tests/Protocols/Dod.php b/gameq/tests/Protocols/Dod.php new file mode 100644 index 0000000..ac2104f --- /dev/null +++ b/gameq/tests/Protocols/Dod.php @@ -0,0 +1,50 @@ +. + */ + +namespace GameQ\Tests\Protocols; + +/** + * Test Class for Dod + * + * @package GameQ\Tests\Protocols + */ +class Dod extends Base +{ + /** + * Test responses for Dod + * + * @dataProvider loadData + * + * @param $responses + * @param $result + */ + public function testResponses($responses, $result) + { + + // Pull the first key off the array this is the server ip:port + $server = key($result); + + $testResult = $this->queryTest( + $server, + 'dod', + $responses + ); + + $this->assertEquals($result[$server], $testResult); + } +} diff --git a/gameq/tests/Protocols/Dods.php b/gameq/tests/Protocols/Dods.php new file mode 100644 index 0000000..e2e0298 --- /dev/null +++ b/gameq/tests/Protocols/Dods.php @@ -0,0 +1,50 @@ +. + */ + +namespace GameQ\Tests\Protocols; + +/** + * Test Class for Dods + * + * @package GameQ\Tests\Protocols + */ +class Dods extends Base +{ + /** + * Test responses for Dods + * + * @dataProvider loadData + * + * @param $responses + * @param $result + */ + public function testResponses($responses, $result) + { + + // Pull the first key off the array this is the server ip:port + $server = key($result); + + $testResult = $this->queryTest( + $server, + 'dods', + $responses + ); + + $this->assertEquals($result[$server], $testResult); + } +} diff --git a/gameq/tests/Protocols/Dow.php b/gameq/tests/Protocols/Dow.php new file mode 100644 index 0000000..b160387 --- /dev/null +++ b/gameq/tests/Protocols/Dow.php @@ -0,0 +1,50 @@ +. + */ + +namespace GameQ\Tests\Protocols; + +/** + * Test Class for Days of War + * + * @package GameQ\Tests\Protocols + */ +class Dow extends Base +{ + /** + * Test responses for Dow + * + * @dataProvider loadData + * + * @param $responses + * @param $result + */ + public function testResponses($responses, $result) + { + + // Pull the first key off the array this is the server ip:port + $server = key($result); + + $testResult = $this->queryTest( + $server, + 'dow', + $responses + ); + + $this->assertEquals($result[$server], $testResult); + } +} diff --git a/gameq/tests/Protocols/Eco.php b/gameq/tests/Protocols/Eco.php new file mode 100644 index 0000000..c0ad10b --- /dev/null +++ b/gameq/tests/Protocols/Eco.php @@ -0,0 +1,84 @@ +. + */ + +namespace GameQ\Tests\Protocols; + +class Eco extends Base +{ + + /** + * Holds stub on setup + * + * @type \GameQ\Protocols\Eco + */ + protected $stub; + + /** + * Holds the expected packets for this protocol class + * + * @type array + */ + protected $packets = [ + \GameQ\Protocol::PACKET_STATUS => "GET /frontpage HTTP/1.0\r\nAccept: */*\r\n\r\n", + ]; + + /** + * Setup + */ + public function setUp() + { + + // Create the stub class + $this->stub = $this->getMockBuilder('\GameQ\Protocols\Eco') + ->enableProxyingToOriginalMethods() + ->getMock(); + } + + /** + * Test the packets to make sure they are correct for source + */ + public function testPackets() + { + + // Test to make sure packets are defined properly + $this->assertEquals($this->packets, \PHPUnit\Framework\Assert::readAttribute($this->stub, 'packets')); + } + + /** + * Test responses for Grand Theft Auto Network + * + * @dataProvider loadData + * + * @param $responses + * @param $result + */ + public function testResponses($responses, $result) + { + + // Pull the first key off the array this is the server ip:port + $server = key($result); + + $testResult = $this->queryTest( + $server, + 'eco', + $responses + ); + + $this->assertEquals($result[$server], $testResult, '', 0.000001); + } +} diff --git a/gameq/tests/Protocols/Egs.php b/gameq/tests/Protocols/Egs.php new file mode 100644 index 0000000..ba125ad --- /dev/null +++ b/gameq/tests/Protocols/Egs.php @@ -0,0 +1,50 @@ +. + */ + +namespace GameQ\Tests\Protocols; + +/** + * Test Class for Empyrion - Galactic Survival + * + * @package GameQ\Tests\Protocols + */ +class Egs extends Base +{ + /** + * Test responses for Empyrion - Galactic Survival + * + * @dataProvider loadData + * + * @param $responses + * @param $result + */ + public function testResponses($responses, $result) + { + + // Pull the first key off the array this is the server ip:port + $server = key($result); + + $testResult = $this->queryTest( + $server, + 'egs', + $responses + ); + + $this->assertEquals($result[$server], $testResult); + } +} diff --git a/gameq/tests/Protocols/Etqw.php b/gameq/tests/Protocols/Etqw.php new file mode 100644 index 0000000..2113e6b --- /dev/null +++ b/gameq/tests/Protocols/Etqw.php @@ -0,0 +1,121 @@ +. + */ + +namespace GameQ\Tests\Protocols; + +class Etqw extends Base +{ + + /** + * Holds stub on setup + * + * @type \GameQ\Protocols\Etqw + */ + protected $stub; + + /** + * Holds the expected packets for this protocol class + * + * @type array + */ + protected $packets = [ + \GameQ\Protocol::PACKET_STATUS => "\xFF\xFFgetInfoEx\x00\x00\x00\x00", + ]; + + /** + * Setup + */ + public function setUp() + { + + // Create the stub class + $this->stub = $this->getMockBuilder('\GameQ\Protocols\Etqw') + ->enableProxyingToOriginalMethods() + ->getMock(); + } + + /** + * Test the packets to make sure they are correct for source + */ + public function testPackets() + { + + // Test to make sure packets are defined properly + $this->assertEquals($this->packets, \PHPUnit\Framework\Assert::readAttribute($this->stub, 'packets')); + } + + /** + * Test invalid packet type without debug + */ + public function testInvalidPacketType() + { + + // Read in a css source file + $source = file_get_contents(sprintf('%s/Providers/Etqw/1_response.txt', __DIR__)); + + // Change the first packet to some unknown header + $source = str_replace("\xFF\xFFinfoExResponses", "\xFF\xFFinfoExResponses", $source); + + // Should show up as offline + $testResult = $this->queryTest('127.0.0.1:27733', 'css', explode(PHP_EOL . '||' . PHP_EOL, $source), false); + + $this->assertFalse($testResult['gq_online']); + } + + /** + * Test for invalid packet type in response + * + * @expectedException \Exception + * @expectedExceptionMessage + */ + public function testInvalidPacketTypeDebug() + { + + // Read in a css source file + $source = file_get_contents(sprintf('%s/Providers/Etqw/1_response.txt', __DIR__)); + + // Change the first packet to some unknown header + $source = str_replace("\xFF\xFFinfoExResponses", "\xFF\xFFinfoExResponses", $source); + + // Should show up as offline + $this->queryTest('127.0.0.1:27733', 'css', explode(PHP_EOL . '||' . PHP_EOL, $source), true); + } + + /** + * Test responses for Etqw + * + * @dataProvider loadData + * + * @param $responses + * @param $result + */ + public function testResponses($responses, $result) + { + + // Pull the first key off the array this is the server ip:port + $server = key($result); + + $testResult = $this->queryTest( + $server, + 'etqw', + $responses + ); + + $this->assertEquals($result[ $server ], $testResult, '', 0.000000001); + } +} diff --git a/gameq/tests/Protocols/Ffe.php b/gameq/tests/Protocols/Ffe.php new file mode 100644 index 0000000..f1653c5 --- /dev/null +++ b/gameq/tests/Protocols/Ffe.php @@ -0,0 +1,50 @@ +. + */ + +namespace GameQ\Tests\Protocols; + +/** + * Test Class for Fortress Forever + * + * @package GameQ\Tests\Protocols + */ +class Ffe extends Base +{ + /** + * Test responses for Ffe + * + * @dataProvider loadData + * + * @param $responses + * @param $result + */ + public function testResponses($responses, $result) + { + + // Pull the first key off the array this is the server ip:port + $server = key($result); + + $testResult = $this->queryTest( + $server, + 'ffe', + $responses + ); + + $this->assertEquals($result[$server], $testResult); + } +} diff --git a/gameq/tests/Protocols/Ffow.php b/gameq/tests/Protocols/Ffow.php new file mode 100644 index 0000000..49c9eeb --- /dev/null +++ b/gameq/tests/Protocols/Ffow.php @@ -0,0 +1,153 @@ +. + */ + +namespace GameQ\Tests\Protocols; + +class Ffow extends Base +{ + + /** + * Holds stub on setup + * + * @type \GameQ\Protocols\Ffow + */ + protected $stub; + + /** + * Holds the expected packets for this protocol class + * + * @type array + */ + protected $packets = [ + \GameQ\Protocol::PACKET_CHALLENGE => "\xFF\xFF\xFF\xFF\x57", + \GameQ\Protocol::PACKET_RULES => "\xFF\xFF\xFF\xFF\x56%s", + \GameQ\Protocol::PACKET_PLAYERS => "\xFF\xFF\xFF\xFF\x55%s", + \GameQ\Protocol::PACKET_INFO => "\xFF\xFF\xFF\xFF\x46\x4C\x53\x51", + ]; + + /** + * Setup + */ + public function setUp() + { + + // Create the stub class + $this->stub = $this->getMockBuilder('\GameQ\Protocols\Ffow') + ->enableProxyingToOriginalMethods() + ->getMock(); + } + + /** + * Test the packets to make sure they are correct for source + */ + public function testPackets() + { + + // Test to make sure packets are defined properly + $this->assertEquals($this->packets, \PHPUnit\Framework\Assert::readAttribute($this->stub, 'packets')); + } + + /** + * Test the challenge application + */ + public function testChallengeapply() + { + + $packets = $this->packets; + + // Set what the packets should look like + $packets[\GameQ\Protocol::PACKET_PLAYERS] = "\xFF\xFF\xFF\xFF\x55test"; + $packets[\GameQ\Protocol::PACKET_RULES] = "\xFF\xFF\xFF\xFF\x56test"; + + // Create a fake buffer + $challenge_buffer = new \GameQ\Buffer("\xFF\xFF\xFF\xFF\xFFtest"); + + // Apply the challenge + $this->stub->challengeParseAndApply($challenge_buffer); + + // Build reflection to access changed data + $reflectionClass = new \ReflectionClass($this->stub); + $reflectionProperty = $reflectionClass->getProperty('__phpunit_originalObject'); + $reflectionProperty->setAccessible(true); + + $this->assertEquals( + $packets, + \PHPUnit\Framework\Assert::readAttribute($reflectionProperty->getValue($this->stub), 'packets') + ); + } + + /** + * Test invalid packet type without debug + */ + public function testInvalidPacketType() + { + + // Read in a ffow source file + $source = file_get_contents(sprintf('%s/Providers/Ffow/1_response.txt', __DIR__)); + + // Change the first packet to some unknown header + $source = str_replace("\xFF\xFF\xFF\xFF\x49\x02", "\xFF\xFF\xFF\xFF\x48\x02", $source); + + // Should show up as offline + $testResult = $this->queryTest('127.0.0.1:5476', 'ffow', explode(PHP_EOL . '||' . PHP_EOL, $source), false); + + $this->assertFalse($testResult['gq_online']); + } + + /** + * Test for invalid packet type in response + * + * @expectedException \Exception + * @expectedExceptionMessage GameQ\Protocols\Ffow::processResponse response type 'ffffffff4802' is not valid + */ + public function testInvalidPacketTypeDebug() + { + + // Read in a ffow source file + $source = file_get_contents(sprintf('%s/Providers/Ffow/1_response.txt', __DIR__)); + + // Change the first packet to some unknown header + $source = str_replace("\xFF\xFF\xFF\xFF\x49\x02", "\xFF\xFF\xFF\xFF\x48\x02", $source); + + // Should show up as offline + $this->queryTest('127.0.0.1:5476', 'ffow', explode(PHP_EOL . '||' . PHP_EOL, $source), true); + } + + /** + * Test responses for Ffow + * + * @dataProvider loadData + * + * @param $responses + * @param $result + */ + public function testResponses($responses, $result) + { + + // Pull the first key off the array this is the server ip:port + $server = key($result); + + $testResult = $this->queryTest( + $server, + 'ffow', + $responses + ); + + $this->assertEquals($result[$server], $testResult); + } +} diff --git a/gameq/tests/Protocols/Gamespy.php b/gameq/tests/Protocols/Gamespy.php new file mode 100644 index 0000000..a6ba2c3 --- /dev/null +++ b/gameq/tests/Protocols/Gamespy.php @@ -0,0 +1,99 @@ +. + */ + +namespace GameQ\Tests\Protocols; + +class Gamespy extends Base +{ + + /** + * Holds stub on setup + * + * @type \GameQ\Protocols\Gamespy + */ + protected $stub; + + /** + * Holds the expected packets for this protocol class + * + * @type array + */ + protected $packets = [ + \GameQ\Protocol::PACKET_STATUS => "\x5C\x73\x74\x61\x74\x75\x73\x5C", + ]; + + /** + * Setup + */ + public function setUp() + { + + // Create the stub class + $this->stub = $this->getMockBuilder('\GameQ\Protocols\Gamespy') + ->enableProxyingToOriginalMethods() + ->getMock(); + } + + /** + * Test the packets to make sure they are correct for source + */ + public function testPackets() + { + + // Test to make sure packets are defined properly + $this->assertEquals($this->packets, \PHPUnit\Framework\Assert::readAttribute($this->stub, 'packets')); + } + + /** + * Test invalid packet type without debug + */ + public function testInvalidPacketType() + { + + // Read in a css source file + $source = file_get_contents(sprintf('%s/Providers/Ut/1_response.txt', __DIR__)); + + // Change the first packet to some unknown header + $source = str_replace('queryid\\20.1', '', $source); + + // Should show up as offline + $testResult = $this->queryTest('127.0.0.1:7777', 'ut', explode(PHP_EOL . '||' . PHP_EOL, $source), false); + + $this->assertFalse($testResult['gq_online']); + } + + /** + * Test for invalid packet type in response + * + * @expectedException \Exception + * @expectedExceptionMessage GameQ\Protocols\Gamespy::processResponse An error occurred while parsing the packets + * for 'queryid' + */ + public function testInvalidPacketTypeDebug() + { + + // Read in a css source file + $source = file_get_contents(sprintf('%s/Providers/Ut/1_response.txt', __DIR__)); + + // Change the first packet to some unknown header + $source = str_replace('queryid\\20.1', '', $source); + + // Should show up as offline + $this->queryTest('127.0.0.1:7777', 'ut', explode(PHP_EOL . '||' . PHP_EOL, $source), true); + } +} diff --git a/gameq/tests/Protocols/Gmod.php b/gameq/tests/Protocols/Gmod.php new file mode 100644 index 0000000..2fbde74 --- /dev/null +++ b/gameq/tests/Protocols/Gmod.php @@ -0,0 +1,50 @@ +. + */ + +namespace GameQ\Tests\Protocols; + +/** + * Test Class for Garry's Mod + * + * @package GameQ\Tests\Protocols + */ +class Gmod extends Base +{ + /** + * Test responses for Gmod + * + * @dataProvider loadData + * + * @param $responses + * @param $result + */ + public function testResponses($responses, $result) + { + + // Pull the first key off the array this is the server ip:port + $server = key($result); + + $testResult = $this->queryTest( + $server, + 'gmod', + $responses + ); + + $this->assertEquals($result[$server], $testResult); + } +} diff --git a/gameq/tests/Protocols/Grav.php b/gameq/tests/Protocols/Grav.php new file mode 100644 index 0000000..dd80ec0 --- /dev/null +++ b/gameq/tests/Protocols/Grav.php @@ -0,0 +1,50 @@ +. + */ + +namespace GameQ\Tests\Protocols; + +/** + * Test Class for GRAV Online + * + * @package GameQ\Tests\Protocols + */ +class Grav extends Base +{ + /** + * Test responses for Grav + * + * @dataProvider loadData + * + * @param $responses + * @param $result + */ + public function testResponses($responses, $result) + { + + // Pull the first key off the array this is the server ip:port + $server = key($result); + + $testResult = $this->queryTest( + $server, + 'grav', + $responses + ); + + $this->assertEquals($result[ $server ], $testResult); + } +} diff --git a/gameq/tests/Protocols/Gta5m.php b/gameq/tests/Protocols/Gta5m.php new file mode 100644 index 0000000..0fdc925 --- /dev/null +++ b/gameq/tests/Protocols/Gta5m.php @@ -0,0 +1,121 @@ +. + */ + +namespace GameQ\Tests\Protocols; + +class Gta5m extends Base +{ + + /** + * Holds stub on setup + * + * @type \GameQ\Protocols\Gta5m + */ + protected $stub; + + /** + * Holds the expected packets for this protocol class + * + * @type array + */ + protected $packets = [ + \GameQ\Protocol::PACKET_STATUS => "\xFF\xFF\xFF\xFFgetinfo xxx", + ]; + + /** + * Setup + */ + public function setUp() + { + + // Create the stub class + $this->stub = $this->getMockBuilder('\GameQ\Protocols\Gta5m') + ->enableProxyingToOriginalMethods() + ->getMock(); + } + + /** + * Test the packets to make sure they are correct for source + */ + public function testPackets() + { + + // Test to make sure packets are defined properly + $this->assertEquals($this->packets, \PHPUnit\Framework\Assert::readAttribute($this->stub, 'packets')); + } + + /** + * Test invalid packet type without debug + */ + public function testInvalidPacketType() + { + + // Read in a css source file + $source = file_get_contents(sprintf('%s/Providers/Gta5m/1_response.txt', __DIR__)); + + // Change the first packet to some unknown header + $source = str_replace("\xFF\xFF\xFF\xFFinfoResponse", "\xFF\xFF\xFF\xFFinfoResponses", $source); + + // Should show up as offline + $testResult = $this->queryTest('127.0.0.1:30120', 'gta5m', explode(PHP_EOL . '||' . PHP_EOL, $source), false); + + $this->assertFalse($testResult['gq_online']); + } + + /** + * Test for invalid packet type in response + * + * @expectedException \Exception + * @expectedExceptionMessage + */ + public function testInvalidPacketTypeDebug() + { + + // Read in a css source file + $source = file_get_contents(sprintf('%s/Providers/Gta5m/1_response.txt', __DIR__)); + + // Change the first packet to some unknown header + $source = str_replace("\xFF\xFF\xFF\xFFinfoResponse", "\xFF\xFF\xFF\xFFinfoResponses", $source); + + // Should show up as offline + $this->queryTest('127.0.0.1:30210', 'gta5m', explode(PHP_EOL . '||' . PHP_EOL, $source), true); + } + + /** + * Test responses for GTA Five M + * + * @dataProvider loadData + * + * @param $responses + * @param $result + */ + public function testResponses($responses, $result) + { + + // Pull the first key off the array this is the server ip:port + $server = key($result); + + $testResult = $this->queryTest( + $server, + 'gta5m', + $responses + ); + + $this->assertEquals($result[ $server ], $testResult, '', 0.000000001); + } +} diff --git a/gameq/tests/Protocols/Gtan.php b/gameq/tests/Protocols/Gtan.php new file mode 100644 index 0000000..bbb617b --- /dev/null +++ b/gameq/tests/Protocols/Gtan.php @@ -0,0 +1,84 @@ +. + */ + +namespace GameQ\Tests\Protocols; + +class Gtan extends Base +{ + + /** + * Holds stub on setup + * + * @type \GameQ\Protocols\Gtan + */ + protected $stub; + + /** + * Holds the expected packets for this protocol class + * + * @type array + */ + protected $packets = [ + \GameQ\Protocol::PACKET_STATUS => "GET /gtan/api.php?ip=%s&raw HTTP/1.0\r\nHost: multiplayerhosting.info\r\nAccept: */*\r\n\r\n", + ]; + + /** + * Setup + */ + public function setUp() + { + + // Create the stub class + $this->stub = $this->getMockBuilder('\GameQ\Protocols\Gtan') + ->enableProxyingToOriginalMethods() + ->getMock(); + } + + /** + * Test the packets to make sure they are correct for source + */ + public function testPackets() + { + + // Test to make sure packets are defined properly + $this->assertEquals($this->packets, \PHPUnit\Framework\Assert::readAttribute($this->stub, 'packets')); + } + + /** + * Test responses for Grand Theft Auto Network + * + * @dataProvider loadData + * + * @param $responses + * @param $result + */ + public function testResponses($responses, $result) + { + + // Pull the first key off the array this is the server ip:port + $server = key($result); + + $testResult = $this->queryTest( + $server, + 'gtan', + $responses + ); + + $this->assertEquals($result[ $server ], $testResult, '', 0.000000001); + } +} diff --git a/gameq/tests/Protocols/Hl2dm.php b/gameq/tests/Protocols/Hl2dm.php new file mode 100644 index 0000000..ccc3413 --- /dev/null +++ b/gameq/tests/Protocols/Hl2dm.php @@ -0,0 +1,50 @@ +. + */ + +namespace GameQ\Tests\Protocols; + +/** + * Test Class for Half Life 2 DM + * + * @package GameQ\Tests\Protocols + */ +class Hl2dm extends Base +{ + /** + * Test responses for Hl2dm + * + * @dataProvider loadData + * + * @param $responses + * @param $result + */ + public function testResponses($responses, $result) + { + + // Pull the first key off the array this is the server ip:port + $server = key($result); + + $testResult = $this->queryTest( + $server, + 'hl2dm', + $responses + ); + + $this->assertEquals($result[$server], $testResult); + } +} diff --git a/gameq/tests/Protocols/Insurgency.php b/gameq/tests/Protocols/Insurgency.php new file mode 100644 index 0000000..7789116 --- /dev/null +++ b/gameq/tests/Protocols/Insurgency.php @@ -0,0 +1,50 @@ +. + */ + +namespace GameQ\Tests\Protocols; + +/** + * Test Class for Insurgency + * + * @package GameQ\Tests\Protocols + */ +class Insurgency extends Base +{ + /** + * Test responses for Insurgency + * + * @dataProvider loadData + * + * @param $responses + * @param $result + */ + public function testResponses($responses, $result) + { + + // Pull the first key off the array this is the server ip:port + $server = key($result); + + $testResult = $this->queryTest( + $server, + 'insurgency', + $responses + ); + + $this->assertEquals($result[$server], $testResult); + } +} diff --git a/gameq/tests/Protocols/Jediacademy.php b/gameq/tests/Protocols/Jediacademy.php new file mode 100644 index 0000000..d5ee0ee --- /dev/null +++ b/gameq/tests/Protocols/Jediacademy.php @@ -0,0 +1,50 @@ +. + */ + +namespace GameQ\Tests\Protocols; + +/** + * Test Class for Jedi Academy + * + * @package GameQ\Tests\Protocols + */ +class Jediacademy extends Base +{ + /** + * Test responses for Jedi Academy + * + * @dataProvider loadData + * + * @param $responses + * @param $result + */ + public function testResponses($responses, $result) + { + + // Pull the first key off the array this is the server ip:port + $server = key($result); + + $testResult = $this->queryTest( + $server, + 'jediacademy', + $responses + ); + + $this->assertEquals($result[$server], $testResult); + } +} diff --git a/gameq/tests/Protocols/Jedioutcast.php b/gameq/tests/Protocols/Jedioutcast.php new file mode 100644 index 0000000..bef6a5a --- /dev/null +++ b/gameq/tests/Protocols/Jedioutcast.php @@ -0,0 +1,50 @@ +. + */ + +namespace GameQ\Tests\Protocols; + +/** + * Test Class for Jedi Outcast + * + * @package GameQ\Tests\Protocols + */ +class Jedioutcast extends Base +{ + /** + * Test responses for Jedi Outcast + * + * @dataProvider loadData + * + * @param $responses + * @param $result + */ + public function testResponses($responses, $result) + { + + // Pull the first key off the array this is the server ip:port + $server = key($result); + + $testResult = $this->queryTest( + $server, + 'jedioutcast', + $responses + ); + + $this->assertEquals($result[$server], $testResult); + } +} diff --git a/gameq/tests/Protocols/Justcause2.php b/gameq/tests/Protocols/Justcause2.php new file mode 100644 index 0000000..55e92dc --- /dev/null +++ b/gameq/tests/Protocols/Justcause2.php @@ -0,0 +1,85 @@ +. + */ + +namespace GameQ\Tests\Protocols; + +class Justcause2 extends Base +{ + + /** + * Holds stub on setup + * + * @type \GameQ\Protocols\Gamespy + */ + protected $stub; + + /** + * Holds the expected packets for this protocol class + * + * @type array + */ + protected $packets = [ + \GameQ\Protocol::PACKET_CHALLENGE => "\xFE\xFD\x09\x10\x20\x30\x40", + \GameQ\Protocol::PACKET_ALL => "\xFE\xFD\x00\x10\x20\x30\x40%s\xFF\xFF\xFF\x02", + ]; + + /** + * Setup + */ + public function setUp() + { + + // Create the stub class + $this->stub = $this->getMockBuilder('\GameQ\Protocols\Justcause2') + ->enableProxyingToOriginalMethods() + ->getMock(); + } + + /** + * Test the packets to make sure they are correct for source + */ + public function testPackets() + { + + // Test to make sure packets are defined properly + $this->assertEquals($this->packets, \PHPUnit\Framework\Assert::readAttribute($this->stub, 'packets')); + } + + /** + * Test responses for Just cause 2 + * + * @dataProvider loadData + * + * @param $responses + * @param $result + */ + public function testResponses($responses, $result) + { + + // Pull the first key off the array this is the server ip:port + $server = key($result); + + $testResult = $this->queryTest( + $server, + 'justcause2', + $responses + ); + + $this->assertEquals($result[$server], $testResult); + } +} diff --git a/gameq/tests/Protocols/Justcause3.php b/gameq/tests/Protocols/Justcause3.php new file mode 100644 index 0000000..2bbb362 --- /dev/null +++ b/gameq/tests/Protocols/Justcause3.php @@ -0,0 +1,50 @@ +. + */ + +namespace GameQ\Tests\Protocols; + +/** + * Test Class for Just Cause 3 + * + * @package GameQ\Tests\Protocols + */ +class Justcause3 extends Base +{ + /** + * Test responses for Justcause3 + * + * @dataProvider loadData + * + * @param $responses + * @param $result + */ + public function testResponses($responses, $result) + { + + // Pull the first key off the array this is the server ip:port + $server = key($result); + + $testResult = $this->queryTest( + $server, + 'justcause3', + $responses + ); + + $this->assertEquals($result[$server], $testResult); + } +} diff --git a/gameq/tests/Protocols/Killingfloor.php b/gameq/tests/Protocols/Killingfloor.php new file mode 100644 index 0000000..84c1efb --- /dev/null +++ b/gameq/tests/Protocols/Killingfloor.php @@ -0,0 +1,50 @@ +. + */ + +namespace GameQ\Tests\Protocols; + +/** + * Test Class for Killing Floor + * + * @package GameQ\Tests\Protocols + */ +class Killingfloor extends Base +{ + /** + * Test responses for Killingfloor + * + * @dataProvider loadData + * + * @param $responses + * @param $result + */ + public function testResponses($responses, $result) + { + + // Pull the first key off the array this is the server ip:port + $server = key($result); + + $testResult = $this->queryTest( + $server, + 'killingfloor', + $responses + ); + + $this->assertEquals($result[$server], $testResult); + } +} diff --git a/gameq/tests/Protocols/Killingfloor2.php b/gameq/tests/Protocols/Killingfloor2.php new file mode 100644 index 0000000..51f35b9 --- /dev/null +++ b/gameq/tests/Protocols/Killingfloor2.php @@ -0,0 +1,50 @@ +. + */ + +namespace GameQ\Tests\Protocols; + +/** + * Test Class for Killing Floor 2 + * + * @package GameQ\Tests\Protocols + */ +class Killingfloor2 extends Base +{ + /** + * Test responses for Killing floor 2 + * + * @dataProvider loadData + * + * @param $responses + * @param $result + */ + public function testResponses($responses, $result) + { + + // Pull the first key off the array this is the server ip:port + $server = key($result); + + $testResult = $this->queryTest( + $server, + 'killingfloor2', + $responses + ); + + $this->assertEquals($result[$server], $testResult); + } +} diff --git a/gameq/tests/Protocols/L4d.php b/gameq/tests/Protocols/L4d.php new file mode 100644 index 0000000..649f249 --- /dev/null +++ b/gameq/tests/Protocols/L4d.php @@ -0,0 +1,50 @@ +. + */ + +namespace GameQ\Tests\Protocols; + +/** + * Test Class for Left 4 Dead + * + * @package GameQ\Tests\Protocols + */ +class L4d extends Base +{ + /** + * Test responses for L4d + * + * @dataProvider loadData + * + * @param $responses + * @param $result + */ + public function testResponses($responses, $result) + { + + // Pull the first key off the array this is the server ip:port + $server = key($result); + + $testResult = $this->queryTest( + $server, + 'l4d', + $responses + ); + + $this->assertEquals($result[$server], $testResult); + } +} diff --git a/gameq/tests/Protocols/L4d2.php b/gameq/tests/Protocols/L4d2.php new file mode 100644 index 0000000..a72f034 --- /dev/null +++ b/gameq/tests/Protocols/L4d2.php @@ -0,0 +1,50 @@ +. + */ + +namespace GameQ\Tests\Protocols; + +/** + * Test Class for Left 4 Dead 2 + * + * @package GameQ\Tests\Protocols + */ +class L4d2 extends Base +{ + /** + * Test responses for L4d2 + * + * @dataProvider loadData + * + * @param $responses + * @param $result + */ + public function testResponses($responses, $result) + { + + // Pull the first key off the array this is the server ip:port + $server = key($result); + + $testResult = $this->queryTest( + $server, + 'l4d2', + $responses + ); + + $this->assertEquals($result[$server], $testResult); + } +} diff --git a/gameq/tests/Protocols/Lhmp.php b/gameq/tests/Protocols/Lhmp.php new file mode 100644 index 0000000..a66cf04 --- /dev/null +++ b/gameq/tests/Protocols/Lhmp.php @@ -0,0 +1,99 @@ +. + */ + +namespace GameQ\Tests\Protocols; + +class Lhmp extends Base +{ + + /** + * Holds stub on setup + * + * @type \GameQ\Protocols\Lhmp + */ + protected $stub; + + /** + * Holds the expected packets for this protocol class + * + * @type array + */ + protected $packets = [ + \GameQ\Protocol::PACKET_DETAILS => "LHMPo", + \GameQ\Protocol::PACKET_PLAYERS => "LHMPp", + ]; + + /** + * Setup + */ + public function setUp() + { + + // Create the stub class + $this->stub = $this->getMockBuilder('\GameQ\Protocols\Lhmp') + ->enableProxyingToOriginalMethods() + ->getMock(); + } + + /** + * Test the packets to make sure they are correct for source + */ + public function testPackets() + { + + // Test to make sure packets are defined properly + $this->assertEquals($this->packets, \PHPUnit\Framework\Assert::readAttribute($this->stub, 'packets')); + } + + /** + * Test invalid packet type without debug + */ + public function testInvalidPacketType() + { + + // Read in a lhmp source file + $source = file_get_contents(sprintf('%s/Providers/Lhmp/1_response.txt', __DIR__)); + + // Change the first packet to some unknown header + $source = str_replace("LHMPo", "LHMPz", $source); + + // Should show up as offline + $testResult = $this->queryTest('127.0.0.1:270015', 'lhmp', explode(PHP_EOL . '||' . PHP_EOL, $source), false); + + $this->assertFalse($testResult['gq_online']); + } + + /** + * Test for invalid packet type in response + * + * @expectedException \Exception + * @expectedExceptionMessage GameQ\Protocols\Lhmp::processResponse response type 'LHMPz' is not valid + */ + public function testInvalidPacketTypeDebug() + { + + // Read in a lhmp source file + $source = file_get_contents(sprintf('%s/Providers/Lhmp/1_response.txt', __DIR__)); + + // Change the first packet to some unknown header + $source = str_replace("LHMPo", "LHMPz", $source); + + // Should show up as offline + $this->queryTest('127.0.0.1:27015', 'lhmp', explode(PHP_EOL . '||' . PHP_EOL, $source), true); + } +} diff --git a/gameq/tests/Protocols/Minecraft.php b/gameq/tests/Protocols/Minecraft.php new file mode 100644 index 0000000..74714c5 --- /dev/null +++ b/gameq/tests/Protocols/Minecraft.php @@ -0,0 +1,50 @@ +. + */ + +namespace GameQ\Tests\Protocols; + +/** + * Test Class for Minecraft + * + * @package GameQ\Tests\Protocols + */ +class Minecraft extends Base +{ + /** + * Test responses for Minecraft + * + * @dataProvider loadData + * + * @param $responses + * @param $result + */ + public function testResponses($responses, $result) + { + + // Pull the first key off the array this is the server ip:port + $server = key($result); + + $testResult = $this->queryTest( + $server, + 'minecraft', + $responses + ); + + $this->assertEquals($result[$server], $testResult); + } +} diff --git a/gameq/tests/Protocols/Minecraftpe.php b/gameq/tests/Protocols/Minecraftpe.php new file mode 100644 index 0000000..84049e4 --- /dev/null +++ b/gameq/tests/Protocols/Minecraftpe.php @@ -0,0 +1,50 @@ +. + */ + +namespace GameQ\Tests\Protocols; + +/** + * Test Class for Minecraft PE + * + * @package GameQ\Tests\Protocols + */ +class Minecraftpe extends Base +{ + /** + * Test responses for Minecraft PE + * + * @dataProvider loadData + * + * @param $responses + * @param $result + */ + public function testResponses($responses, $result) + { + + // Pull the first key off the array this is the server ip:port + $server = key($result); + + $testResult = $this->queryTest( + $server, + 'minecraftpe', + $responses + ); + + $this->assertEquals($result[$server], $testResult); + } +} diff --git a/gameq/tests/Protocols/Mohaa.php b/gameq/tests/Protocols/Mohaa.php new file mode 100644 index 0000000..f270bb7 --- /dev/null +++ b/gameq/tests/Protocols/Mohaa.php @@ -0,0 +1,79 @@ +. + */ + +namespace GameQ\Tests\Protocols; + +/** + * Test Class for Medal of honor: Allied Assault + * + * @package GameQ\Tests\Protocols + */ +class Mohaa extends Base +{ + + /** + * Holds stub on setup + * + * @type \GameQ\Protocols\Mohaa + */ + protected $stub; + + /** + * Setup + */ + public function setUp() + { + + // Create the stub class + $this->stub = $this->getMockBuilder('\GameQ\Protocols\Mohaa') + ->enableProxyingToOriginalMethods() + ->getMock(); + } + + /** + * Test to make sure the query port has not changed. May have to come back and change this if it turns out + * that the mohaa query port can be different by some kind of predictable interval. + */ + public function testQueryPort() + { + $this->assertEquals($this->stub->findQueryPort(12203), 12203+97); + } + + /** + * Test responses for Medal of honor: Allied Assault + * + * @dataProvider loadData + * + * @param $responses + * @param $result + */ + public function testResponses($responses, $result) + { + + // Pull the first key off the array this is the server ip:port + $server = key($result); + + $testResult = $this->queryTest( + $server, + 'mohaa', + $responses + ); + + $this->assertEquals($result[$server], $testResult); + } +} diff --git a/gameq/tests/Protocols/Mta.php b/gameq/tests/Protocols/Mta.php new file mode 100644 index 0000000..326a03e --- /dev/null +++ b/gameq/tests/Protocols/Mta.php @@ -0,0 +1,50 @@ +. + */ + +namespace GameQ\Tests\Protocols; + +/** + * Test Class for Multi Theft Auto + * + * @package GameQ\Tests\Protocols + */ +class Mta extends Base +{ + /** + * Test responses for Mta + * + * @dataProvider loadData + * + * @param $responses + * @param $result + */ + public function testResponses($responses, $result) + { + + // Pull the first key off the array this is the server ip:port + $server = key($result); + + $testResult = $this->queryTest( + $server, + 'mta', + $responses + ); + + $this->assertEquals($result[$server], $testResult); + } +} diff --git a/gameq/tests/Protocols/Mumble.php b/gameq/tests/Protocols/Mumble.php new file mode 100644 index 0000000..d093c21 --- /dev/null +++ b/gameq/tests/Protocols/Mumble.php @@ -0,0 +1,102 @@ +. + */ + +namespace GameQ\Tests\Protocols; + +/** + * Test Class for Mumble + * + * @package GameQ\Tests\Protocols + */ +class Mumble extends Base +{ + + /** + * Holds stub on setup + * + * @type \GameQ\Protocols\Mumble + */ + protected $stub; + + /** + * Holds the expected packets for this protocol class + * + * @type array + */ + protected $packets = [ + \GameQ\Protocol::PACKET_ALL => "\x6A\x73\x6F\x6E", + ]; + + /** + * Setup + */ + public function setUp() + { + + // Create the stub class + $this->stub = $this->getMockBuilder('\GameQ\Protocols\Mumble') + ->enableProxyingToOriginalMethods() + ->getMock(); + } + + /** + * Test the packets to make sure they are correct for source + */ + public function testPackets() + { + + // Test to make sure packets are defined properly + $this->assertEquals($this->packets, \PHPUnit\Framework\Assert::readAttribute($this->stub, 'packets')); + } + + /** + * Test non-JSON formatted response + * + * @expectedException \Exception + * @expectedExceptionMessage GameQ\Protocols\Mumble::processResponse Unable to decode JSON data. + */ + public function testBadResponseFormat() + { + + // Should fail out + $this->queryTest('127.0.0.1:27015', 'mumble', [ '{"key1": "val", "key2" :}' ], true); + } + + /** + * Test responses for Mumble + * + * @dataProvider loadData + * + * @param $responses + * @param $result + */ + public function testResponses($responses, $result) + { + + // Pull the first key off the array this is the server ip:port + $server = key($result); + + $testResult = $this->queryTest( + $server, + 'mumble', + $responses + ); + + $this->assertEquals($result[$server], $testResult); + } +} diff --git a/gameq/tests/Protocols/Ns2.php b/gameq/tests/Protocols/Ns2.php new file mode 100644 index 0000000..b5874a8 --- /dev/null +++ b/gameq/tests/Protocols/Ns2.php @@ -0,0 +1,50 @@ +. + */ + +namespace GameQ\Tests\Protocols; + +/** + * Test Class for Natural Selection 2 + * + * @package GameQ\Tests\Protocols + */ +class Ns2 extends Base +{ + /** + * Test responses for Ns2 + * + * @dataProvider loadData + * + * @param $responses + * @param $result + */ + public function testResponses($responses, $result) + { + + // Pull the first key off the array this is the server ip:port + $server = key($result); + + $testResult = $this->queryTest( + $server, + 'ns2', + $responses + ); + + $this->assertEquals($result[$server], $testResult); + } +} diff --git a/gameq/tests/Protocols/Projectrealitybf2.php b/gameq/tests/Protocols/Projectrealitybf2.php new file mode 100644 index 0000000..a904bb2 --- /dev/null +++ b/gameq/tests/Protocols/Projectrealitybf2.php @@ -0,0 +1,50 @@ +. + */ + +namespace GameQ\Tests\Protocols; + +/** + * Test Class for Projectrealitybf2 + * + * @package GameQ\Tests\Protocols + */ +class Projectrealitybf2 extends Base +{ + /** + * Test responses for Projectrealitybf2 + * + * @dataProvider loadData + * + * @param $responses + * @param $result + */ + public function testResponses($responses, $result) + { + + // Pull the first key off the array this is the server ip:port + $server = key($result); + + $testResult = $this->queryTest( + $server, + 'projectrealitybf2', + $responses + ); + + $this->assertEquals($result[$server], $testResult); + } +} diff --git a/gameq/tests/Protocols/Providers/Aa3/1_response.txt b/gameq/tests/Protocols/Providers/Aa3/1_response.txt new file mode 100644 index 0000000..7afbab6 Binary files /dev/null and b/gameq/tests/Protocols/Providers/Aa3/1_response.txt differ diff --git a/gameq/tests/Protocols/Providers/Aa3/1_result.json b/gameq/tests/Protocols/Providers/Aa3/1_result.json new file mode 100644 index 0000000..75a1613 --- /dev/null +++ b/gameq/tests/Protocols/Providers/Aa3/1_result.json @@ -0,0 +1 @@ +{"66.55.149.86:8777":{"dedicated":"d","game_descr":"America's Army 3.3","game_dir":"aa3game","game_id":13140,"gq_address":"66.55.149.86","gq_joinlink":"steam:\/\/connect\/66.55.149.86:8777\/","gq_name":"America's Army 3","gq_online":true,"gq_port_client":"8777","gq_port_query":27020,"gq_protocol":"source","gq_transport":"udp","gq_type":"aa3","hostname":"[Honor Server] Fort Apache I","keywords":"M=coai;W=foggy;T=day;P=0;C=0;pb=1;voip=1;ver=AA3.3.1;","map":"Bridge AI","max_players":26,"num_bots":0,"num_players":19,"os":"w","password":0,"players":[{"id":0,"name":"schipper49","score":783,"time":3521.0852050781},{"id":0,"name":"Antares","score":1664,"time":3506.9526367188},{"id":0,"name":"mh830","score":1806,"time":3436.7834472656},{"id":0,"name":"Anterl","score":2781,"time":3123.7114257812},{"id":0,"name":"Brock-You","score":1656,"time":2515.2087402344},{"id":0,"name":"==Fightin69th.==","score":1853,"time":2271.1311035156},{"id":0,"name":"UKRAINE.IS.OLD.USSR","score":384,"time":2150.2229003906},{"id":0,"name":"GPAM","score":1330,"time":2122.1516113281},{"id":0,"name":"PointBlanck","score":1209,"time":1451.5159912109},{"id":0,"name":"yooper","score":375,"time":1261.2972412109},{"id":0,"name":"mikelpozd","score":370,"time":1088.3349609375},{"id":0,"name":"Mikee369","score":212,"time":821.59899902344},{"id":0,"name":"BecksvsHeineken","score":479,"time":678.19763183594},{"id":0,"name":"mistrzo","score":-149,"time":666.46978759766},{"id":0,"name":"Poglavnik","score":45,"time":550.17498779297},{"id":0,"name":"Torugo1989","score":203,"time":429.21243286133},{"id":0,"name":"Alex6464","score":72,"time":305.24179077148},{"id":0,"name":"Zplanet","score":-1,"time":267.80621337891},{"id":0,"name":"","score":0,"time":5.7877426147461}],"port":8777,"protocol":17,"secure":0,"steam_id":90094381178881031,"steamappid":13140,"version":"1.0.0.0"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Aa3/2_response.txt b/gameq/tests/Protocols/Providers/Aa3/2_response.txt new file mode 100644 index 0000000..85a0732 Binary files /dev/null and b/gameq/tests/Protocols/Providers/Aa3/2_response.txt differ diff --git a/gameq/tests/Protocols/Providers/Aa3/2_result.json b/gameq/tests/Protocols/Providers/Aa3/2_result.json new file mode 100644 index 0000000..3ec784a --- /dev/null +++ b/gameq/tests/Protocols/Providers/Aa3/2_result.json @@ -0,0 +1 @@ +{"108.61.121.18:8777":{"dedicated":"d","game_descr":"America's Army 3.3","game_dir":"aa3game","game_id":13140,"gq_address":"108.61.121.18","gq_joinlink":"steam:\/\/connect\/108.61.121.18:8777\/","gq_name":"America's Army 3","gq_online":true,"gq_port_client":"8777","gq_port_query":27020,"gq_protocol":"source","gq_transport":"udp","gq_type":"aa3","hostname":"[Honor Server] (R-S) rEEvE SQUAD","keywords":"M=classic;W=clear;T=night;P=0;C=0;pb=1;voip=1;ver=AA3.3.1;","map":"Bridge","max_players":26,"num_bots":0,"num_players":0,"os":"w","password":0,"port":8777,"protocol":17,"secure":0,"steam_id":90094381740938246,"steamappid":13140,"version":"1.0.0.0"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Aapg/1_response.txt b/gameq/tests/Protocols/Providers/Aapg/1_response.txt new file mode 100644 index 0000000..621cc2e Binary files /dev/null and b/gameq/tests/Protocols/Providers/Aapg/1_response.txt differ diff --git a/gameq/tests/Protocols/Providers/Aapg/1_result.json b/gameq/tests/Protocols/Providers/Aapg/1_result.json new file mode 100644 index 0000000..379d545 --- /dev/null +++ b/gameq/tests/Protocols/Providers/Aapg/1_result.json @@ -0,0 +1 @@ +{"104.200.142.52:8777":{"dedicated":"d","game_descr":"America's Army: Proving Grounds","game_dir":"aa4game","game_id":203290,"gq_address":"104.200.142.52","gq_joinlink":"steam:\/\/connect\/104.200.142.52:8777\/","gq_name":"America's Army: Proving Grounds","gq_online":true,"gq_port_client":"8777","gq_port_query":27020,"gq_protocol":"source","gq_transport":"udp","gq_type":"aapg","hostname":"-=312th=- \/ Dallas I - INNER HOSPITAL ONLY","keywords":"qp=27020;M=;ver=148023;T=Round In Progress 1:46;VM=0;P=0;C=1;pb=1;voip=1;sm=396;HONOR=1;","map":"FLO_InnerHospital_EX","max_players":24,"num_bots":0,"num_players":25,"os":"w","password":0,"players":[{"id":0,"name":"[T1]Austin[25ID]","score":11110,"time":2137.7214355469},{"id":0,"name":"[T1]$pOn$oR_[QC]","score":7970,"time":2137.0080566406},{"id":0,"name":"[T0]~NightOwl~","score":12730,"time":2135.8583984375},{"id":0,"name":"[T0]-^Un-TaMeD^-","score":6520,"time":2135.6137695312},{"id":0,"name":"[T1]WV_Dave","score":6660,"time":2135.1694335938},{"id":0,"name":"[T0]|EHC|-Manile","score":6320,"time":2134.947265625},{"id":0,"name":"[T1]Cheesestick","score":8230,"time":2134.8693847656},{"id":0,"name":"[T0]DocReese","score":4610,"time":2134.4802246094},{"id":0,"name":"[T1][UAB]-2Ten.FreakBross","score":7450,"time":2133.5119628906},{"id":0,"name":"[T1]FourPaws","score":8430,"time":2132.6450195312},{"id":0,"name":"[T1]Pvt.Sakarium","score":6100,"time":2132.1118164062},{"id":0,"name":"[T0]razamocno","score":4050,"time":2131.9897460938},{"id":0,"name":"[T0]Voodooist","score":3500,"time":2130.1010742188},{"id":0,"name":"[T1][Br.Army]Brasilia","score":6080,"time":2129.8564453125},{"id":0,"name":"[T1]CARBURADORJ","score":4090,"time":2125.2346191406},{"id":0,"name":"[T1]compoundkiller","score":4830,"time":2123.0114746094},{"id":0,"name":"[T1]airsoft0skater","score":5140,"time":2068.2182617188},{"id":0,"name":"[T0]CookyTheDuck","score":5210,"time":1971.5570068359},{"id":0,"name":"[T0]ChapterMaster","score":5240,"time":1895.8389892578},{"id":0,"name":"[T0]i_Ryan","score":4140,"time":1561.7036132812},{"id":0,"name":"[T1]SmokinCowboy","score":5240,"time":1462.5111083984},{"id":0,"name":"[T0]-=MWP=-Minievildoer","score":1630,"time":874.5830078125},{"id":0,"name":"[T-1]RETROBANGBANG","score":0,"time":595.38348388672},{"id":0,"name":"[T0]|Leonhard","score":0,"time":231.25021362305},{"id":0,"name":"[T0](-n00b-)EVERCLIPS","score":0,"time":123.75677490234}],"port":7778,"protocol":17,"secure":0,"steam_id":90094379593627649,"steamappid":0,"version":"1.0.0.0"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Aapg/2_response.txt b/gameq/tests/Protocols/Providers/Aapg/2_response.txt new file mode 100644 index 0000000..765018b Binary files /dev/null and b/gameq/tests/Protocols/Providers/Aapg/2_response.txt differ diff --git a/gameq/tests/Protocols/Providers/Aapg/2_result.json b/gameq/tests/Protocols/Providers/Aapg/2_result.json new file mode 100644 index 0000000..e2ff5f5 --- /dev/null +++ b/gameq/tests/Protocols/Providers/Aapg/2_result.json @@ -0,0 +1 @@ +{"208.100.40.101:8777":{"dedicated":"d","game_descr":"America's Army: Proving Grounds","game_dir":"aa4game","game_id":203290,"gq_address":"208.100.40.101","gq_joinlink":"steam:\/\/connect\/208.100.40.101:8777\/","gq_name":"America's Army: Proving Grounds","gq_online":true,"gq_port_client":"8777","gq_port_query":27020,"gq_protocol":"source","gq_transport":"udp","gq_type":"aapg","hostname":"U.S. Army Official BDX Only ORD24","keywords":"qp=27020;M=;ver=148023;T=Warmup Round;VM=0;P=0;C=1;pb=1;voip=1;sm=400;HONOR=1;","map":"BDX_OuterHospital_DE","max_players":12,"num_bots":0,"num_players":0,"os":"w","password":0,"port":7778,"protocol":17,"secure":0,"steam_id":90094358355068936,"steamappid":0,"version":"1.0.0.0"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Arkse/1_response.txt b/gameq/tests/Protocols/Providers/Arkse/1_response.txt new file mode 100644 index 0000000..0e4bcd4 Binary files /dev/null and b/gameq/tests/Protocols/Providers/Arkse/1_response.txt differ diff --git a/gameq/tests/Protocols/Providers/Arkse/1_result.json b/gameq/tests/Protocols/Providers/Arkse/1_result.json new file mode 100644 index 0000000..645ff5a --- /dev/null +++ b/gameq/tests/Protocols/Providers/Arkse/1_result.json @@ -0,0 +1 @@ +{"74.80.133.254:7777":{"CUSTOMSERVERNAME_s":"ark lowpinggameservers.com","DAYTIME_s":"01:27","GameMode_s":"TestGameMode_C","MATCHTIMEOUT_f":"120.000000","ModId_l":"0","NUMOPENPUBCONN":"50","OFFICIALSERVER_i":"0","OWNINGID":"90096618768367620","OWNINGNAME":"90096618768367620","P2PADDR":"90096618768367620","P2PPORT":"7777","SEARCHKEYWORDS_s":"Custom","SESSIONFLAGS":"683","ServerPassword_b":"false","dedicated":"d","game_descr":"ARK: Survival Evolved","game_dir":"ark_survival_evolved","game_id":346110,"gq_address":"74.80.133.254","gq_joinlink":"steam:\/\/connect\/74.80.133.254:7777\/","gq_name":"ARK: Survival Evolved","gq_online":true,"gq_port_client":7777,"gq_port_query":27015,"gq_protocol":"source","gq_transport":"udp","gq_type":"arkse","hostname":"ARK LowPingGameServers.com - (v191.0)","keywords":",OWNINGID:90096618768367620,OWNINGNAME:90096618768367620,NUMOPENPUBCONN:50,P2PADDR:90096618768367620,P2PPORT:7777,ModId_l:0","map":"TheIsland","max_players":50,"num_bots":0,"num_players":0,"num_rules":14,"os":"w","password":0,"port":7777,"protocol":17,"secure":1,"steam_id":90096618768367620,"steamappid":0,"version":"1.0.0.0"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Arkse/2_response.txt b/gameq/tests/Protocols/Providers/Arkse/2_response.txt new file mode 100644 index 0000000..34e7a8b Binary files /dev/null and b/gameq/tests/Protocols/Providers/Arkse/2_response.txt differ diff --git a/gameq/tests/Protocols/Providers/Arkse/2_result.json b/gameq/tests/Protocols/Providers/Arkse/2_result.json new file mode 100644 index 0000000..9e6a672 --- /dev/null +++ b/gameq/tests/Protocols/Providers/Arkse/2_result.json @@ -0,0 +1 @@ +{"79.133.51.105:7777":{"CUSTOMSERVERNAME_s":"[lost] www.bfs-gaming.de","DAYTIME_s":"14:43","GameMode_s":"TestGameMode_C","MATCHTIMEOUT_f":"120.000000","ModId_l":"0","NUMOPENPUBCONN":"18","OFFICIALSERVER_i":"0","OWNINGID":"90096642544037896","OWNINGNAME":"90096642544037896","P2PADDR":"90096642544037896","P2PPORT":"7777","SEARCHKEYWORDS_s":"Custom","SESSIONFLAGS":"683","ServerPassword_b":"false","dedicated":"d","game_descr":"ARK: Survival Evolved","game_dir":"ark_survival_evolved","game_id":346110,"gq_address":"79.133.51.105","gq_joinlink":"steam:\/\/connect\/79.133.51.105:7777\/","gq_name":"ARK: Survival Evolved","gq_online":true,"gq_port_client":7777,"gq_port_query":27015,"gq_protocol":"source","gq_transport":"udp","gq_type":"arkse","hostname":"[LOST] WWW.BFS-GAMING.DE - (v192.0)","keywords":",OWNINGID:90096642544037896,OWNINGNAME:90096642544037896,NUMOPENPUBCONN:18,P2PADDR:90096642544037896,P2PPORT:7777,ModId_l:0","map":"TheIsland","max_players":100,"num_bots":0,"num_players":82,"num_rules":14,"os":"w","password":0,"players":[{"id":0,"name":"Fantik","score":0,"time":12665.318359375},{"id":0,"name":"philsalm","score":0,"time":12659.999023438},{"id":0,"name":"marlnhir","score":0,"time":12658.619140625},{"id":0,"name":"Yoroi","score":0,"time":12658.559570312},{"id":0,"name":"Verko01","score":0,"time":12656.486328125},{"id":0,"name":"BATRIOS","score":0,"time":12655.251953125},{"id":0,"name":"mrepicbrain(ger)...","score":0,"time":12654.37890625},{"id":0,"name":"draconian","score":0,"time":12648.14453125},{"id":0,"name":"cris","score":0,"time":12645.431640625},{"id":0,"name":"Gosejo","score":0,"time":12639.109375},{"id":0,"name":"daTax","score":0,"time":12638.491210938},{"id":0,"name":"xDevilStylez","score":0,"time":12638.055664062},{"id":0,"name":"MORPHEUSwtf","score":0,"time":12632.141601562},{"id":0,"name":"OT Dutchmaniak","score":0,"time":12620.004882812},{"id":0,"name":"Lord Bullet","score":0,"time":12608.674804688},{"id":0,"name":"el-loco-tattoo","score":0,"time":12538.715820312},{"id":0,"name":"Crystopal","score":0,"time":12531.876953125},{"id":0,"name":"^SuBbE.Ger","score":0,"time":12512.310546875},{"id":0,"name":"| Max |","score":0,"time":12498.650390625},{"id":0,"name":"The old Man","score":0,"time":12479.622070312},{"id":0,"name":"SerrasMask","score":0,"time":12290.9921875},{"id":0,"name":"Tamara","score":0,"time":12228.379882812},{"id":0,"name":"AgoMar","score":0,"time":12190.372070312},{"id":0,"name":"-=DR=- †††† Blut...","score":0,"time":12180.59765625},{"id":0,"name":"LORD SHADOW","score":0,"time":12119.859375},{"id":0,"name":"Chewy","score":0,"time":12110.5859375},{"id":0,"name":"FruitLoop","score":0,"time":12053.6171875},{"id":0,"name":"ROBO-COM","score":0,"time":11953.431640625},{"id":0,"name":"Tandora","score":0,"time":11853.75},{"id":0,"name":"Leodane","score":0,"time":11812.677734375},{"id":0,"name":"Tasmo Kidge","score":0,"time":11575.298828125},{"id":0,"name":"Brack.Wolf","score":0,"time":11563.56640625},{"id":0,"name":"ThundernoX","score":0,"time":11414.286132812},{"id":0,"name":"Jack [GER]","score":0,"time":11073.438476562},{"id":0,"name":"Lord I Killer I","score":0,"time":10629.75},{"id":0,"name":"Abdullah.Aljamhi","score":0,"time":10084.116210938},{"id":0,"name":"bulghi","score":0,"time":9430.9365234375},{"id":0,"name":"sierra","score":0,"time":8834.5439453125},{"id":0,"name":"michirehm","score":0,"time":8802.7197265625},{"id":0,"name":"BlackBalu","score":0,"time":7948.5405273438},{"id":0,"name":"TheRexso","score":0,"time":7917.1782226562},{"id":0,"name":"broken_bodies","score":0,"time":7301.7607421875},{"id":0,"name":"Oberfix","score":0,"time":6957.4672851562},{"id":0,"name":"Mino","score":0,"time":6446.8930664062},{"id":0,"name":"Damo","score":0,"time":6252.0864257812},{"id":0,"name":"Adjana","score":0,"time":5907.3481445312},{"id":0,"name":"Taeter","score":0,"time":5844.5063476562},{"id":0,"name":"✪✪ Emsi","score":0,"time":5751.396484375},{"id":0,"name":"Setrakian \/ Cars...","score":0,"time":5505.0961914062},{"id":0,"name":"DigiTaLRusKi","score":0,"time":5368.5844726562},{"id":0,"name":"cobra","score":0,"time":5286.630859375},{"id":0,"name":"proxus303","score":0,"time":5280.2807617188},{"id":0,"name":"[DE]BerSerKer","score":0,"time":5276.060546875},{"id":0,"name":"BlueMonk","score":0,"time":5215.9912109375},{"id":0,"name":"Anoobis","score":0,"time":5145.3325195312},{"id":0,"name":"Kraex","score":0,"time":5085.7788085938},{"id":0,"name":"Kilib","score":0,"time":4950.2924804688},{"id":0,"name":"Vampir","score":0,"time":4471.6728515625},{"id":0,"name":"sushyonline","score":0,"time":4427.8520507812},{"id":0,"name":"The_Ripper","score":0,"time":4093.3427734375},{"id":0,"name":"Leeloo","score":0,"time":3826.1840820312},{"id":0,"name":"Ragnar_Liten","score":0,"time":3657.9858398438},{"id":0,"name":"Lord Of War","score":0,"time":3392.6599121094},{"id":0,"name":"Æc'ô","score":0,"time":2709.1723632812},{"id":0,"name":"R4nku","score":0,"time":2502.9467773438},{"id":0,"name":"Netos","score":0,"time":2446.2551269531},{"id":0,"name":"Blueweek","score":0,"time":2282.7768554688},{"id":0,"name":"Korsakoff","score":0,"time":2129.6362304688},{"id":0,"name":"[KdS]-Beer","score":0,"time":2040.7583007812},{"id":0,"name":"Durock","score":0,"time":2005.888671875},{"id":0,"name":"Sneakosaur goes ...","score":0,"time":1740.3111572266},{"id":0,"name":"Knallix","score":0,"time":1725.4757080078},{"id":0,"name":"MMOGC | Andreas3...","score":0,"time":1425.8955078125},{"id":0,"name":"macknum","score":0,"time":1376.1329345703},{"id":0,"name":"potatojoe","score":0,"time":1249.9288330078},{"id":0,"name":"itgas","score":0,"time":1003.1369018555},{"id":0,"name":"destaany","score":0,"time":777.74237060547},{"id":0,"name":"nigerfaget","score":0,"time":652.35852050781},{"id":0,"name":"Revi Black","score":0,"time":477.48461914062},{"id":0,"name":"lBlL4cKIDlE4TlH","score":0,"time":386.5866394043},{"id":0,"name":"andros2","score":0,"time":298.91931152344},{"id":0,"name":"|HACE|Becker","score":0,"time":212.06161499023}],"port":7777,"protocol":17,"secure":1,"steam_id":90096642544037896,"steamappid":0,"version":"1.0.0.0"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Arkse/3_response.txt b/gameq/tests/Protocols/Providers/Arkse/3_response.txt new file mode 100644 index 0000000..ccdda94 Binary files /dev/null and b/gameq/tests/Protocols/Providers/Arkse/3_response.txt differ diff --git a/gameq/tests/Protocols/Providers/Arkse/3_result.json b/gameq/tests/Protocols/Providers/Arkse/3_result.json new file mode 100644 index 0000000..51677a6 --- /dev/null +++ b/gameq/tests/Protocols/Providers/Arkse/3_result.json @@ -0,0 +1 @@ +{"89.163.144.43:7777":{"CUSTOMSERVERNAME_s":"sessionname=pigeonchasers.com-mature community-pvp-no offlin","DAYTIME_s":"08:21","GameMode_s":"TestGameMode_C","MATCHTIMEOUT_f":"120.000000","ModId_l":"0","NUMOPENPUBCONN":"28","OFFICIALSERVER_i":"0","OWNINGID":"90096635355251719","OWNINGNAME":"90096635355251719","P2PADDR":"90096635355251719","P2PPORT":"7777","SEARCHKEYWORDS_s":"Custom","SESSIONFLAGS":"683","ServerPassword_b":"false","dedicated":"d","game_descr":"ARK: Survival Evolved","game_dir":"ark_survival_evolved","game_id":346110,"gq_address":"89.163.144.43","gq_joinlink":"steam:\/\/connect\/89.163.144.43:7777\/","gq_name":"ARK: Survival Evolved","gq_online":true,"gq_port_client":7777,"gq_port_query":27015,"gq_protocol":"source","gq_transport":"udp","gq_type":"arkse","hostname":"SessionName=Pigeonchasers.com-Mature Community-PVP-No Offlin - ","keywords":",OWNINGID:90096635355251719,OWNINGNAME:90096635355251719,NUMOPENPUBCONN:28,P2PADDR:90096635355251719,P2PPORT:7777,ModId_l:0","map":"TheIsland","max_players":120,"num_bots":0,"num_players":92,"num_rules":14,"os":"w","password":0,"players":[{"id":0,"name":"aNo","score":0,"time":41250.14453125},{"id":0,"name":"Grex","score":0,"time":38126.9140625},{"id":0,"name":"Ron82","score":0,"time":35613.19140625},{"id":0,"name":"ISparky XzamQle","score":0,"time":34711.5078125},{"id":0,"name":"Dragaro","score":0,"time":28635.552734375},{"id":0,"name":"Allahu AQbar","score":0,"time":28067.171875},{"id":0,"name":"☆ M.M.O`7 ☆","score":0,"time":26475.2265625},{"id":0,"name":"jennaboyd","score":0,"time":24227.453125},{"id":0,"name":"NorthW3st","score":0,"time":23272.337890625},{"id":0,"name":"FX","score":0,"time":19290.029296875},{"id":0,"name":"apelsinsaft","score":0,"time":19206.09375},{"id":0,"name":"oddimannen","score":0,"time":18606.23046875},{"id":0,"name":"xenom","score":0,"time":18555.31640625},{"id":0,"name":"Xiran","score":0,"time":17472.615234375},{"id":0,"name":"Davrick00","score":0,"time":17452.341796875},{"id":0,"name":"dermarquis","score":0,"time":17391.859375},{"id":0,"name":"Frosty","score":0,"time":16905.75},{"id":0,"name":"Grantelbart","score":0,"time":16755.435546875},{"id":0,"name":"jeanjean","score":0,"time":15885.6015625},{"id":0,"name":"Heruor","score":0,"time":15346.0859375},{"id":0,"name":"OLI","score":0,"time":14381.934570312},{"id":0,"name":"Marine3D","score":0,"time":13550.5390625},{"id":0,"name":"Sylvikrin","score":0,"time":13402.6484375},{"id":0,"name":"Kieran","score":0,"time":13244.47265625},{"id":0,"name":"Fayt","score":0,"time":12905.744140625},{"id":0,"name":"Shirotenshi89","score":0,"time":12697.828125},{"id":0,"name":"Fanjo","score":0,"time":12566.073242188},{"id":0,"name":"henning.sass","score":0,"time":12547.985351562},{"id":0,"name":"Kuki","score":0,"time":12469.111328125},{"id":0,"name":"Lili","score":0,"time":12155.489257812},{"id":0,"name":"SageSix","score":0,"time":11815.330078125},{"id":0,"name":"sp00fy skeletn","score":0,"time":11772.211914062},{"id":0,"name":"Joey","score":0,"time":11200.1484375},{"id":0,"name":"warchild ","score":0,"time":10827.177734375},{"id":0,"name":"snapdragon","score":0,"time":10695.493164062},{"id":0,"name":"D-Baggins696","score":0,"time":9872.9091796875},{"id":0,"name":"rossaert","score":0,"time":9784.1650390625},{"id":0,"name":"edufac","score":0,"time":9520.0869140625},{"id":0,"name":"sakura","score":0,"time":9315.751953125},{"id":0,"name":"King_Flauschi","score":0,"time":9033.029296875},{"id":0,"name":"Salazar Volcae","score":0,"time":8105.6591796875},{"id":0,"name":"Draquo","score":0,"time":7516.8959960938},{"id":0,"name":"Zephr","score":0,"time":7251.64453125},{"id":0,"name":"Noar","score":0,"time":6652.0693359375},{"id":0,"name":"Rawked","score":0,"time":6596.1123046875},{"id":0,"name":"TheLomaxx","score":0,"time":6022.951171875},{"id":0,"name":"Cedounet","score":0,"time":5817.6328125},{"id":0,"name":";unnamed;","score":0,"time":5678.9458007812},{"id":0,"name":"[CG] Shizzlefudg...","score":0,"time":5276.1669921875},{"id":0,"name":"eskil200","score":0,"time":4993.92578125},{"id":0,"name":"sticks42","score":0,"time":4911.9047851562},{"id":0,"name":"Otto Skorzeny","score":0,"time":4864.2299804688},{"id":0,"name":"Ricci","score":0,"time":4858.1206054688},{"id":0,"name":"recycler.","score":0,"time":4796.9155273438},{"id":0,"name":"Dave","score":0,"time":4680.6186523438},{"id":0,"name":"Ruten Moshi","score":0,"time":4534.4008789062},{"id":0,"name":"nasreth","score":0,"time":4475.291015625},{"id":0,"name":"zhitaothomas","score":0,"time":3994.5817871094},{"id":0,"name":"Ikkeikke402","score":0,"time":3656.4899902344},{"id":0,"name":"butterball88","score":0,"time":3518.1877441406},{"id":0,"name":"kylerproprietor","score":0,"time":3237.6066894531},{"id":0,"name":"kabooodle","score":0,"time":2891.3498535156},{"id":0,"name":"Zagatore","score":0,"time":2528.1953125},{"id":0,"name":"Cramer2409","score":0,"time":2341.9938964844},{"id":0,"name":"Enulax","score":0,"time":2189.921875},{"id":0,"name":"Reznor","score":0,"time":2066.9270019531},{"id":0,"name":"TeKilla","score":0,"time":1876.4300537109},{"id":0,"name":"°Abu°","score":0,"time":1697.7952880859},{"id":0,"name":"Forsaken Reason","score":0,"time":1691.4118652344},{"id":0,"name":"zerlis","score":0,"time":1661.7938232422},{"id":0,"name":"Gamblah HD","score":0,"time":1627.1444091797},{"id":0,"name":"b0sz_nAsz","score":0,"time":1446.6735839844},{"id":0,"name":"Lindell","score":0,"time":1380.4309082031},{"id":0,"name":"Elaine","score":0,"time":1304.0061035156},{"id":0,"name":"Bondage*","score":0,"time":1280.0219726562},{"id":0,"name":"Wollering","score":0,"time":1206.5477294922},{"id":0,"name":"TE | Doxl","score":0,"time":1163.6446533203},{"id":0,"name":"Ivan","score":0,"time":1160.3547363281},{"id":0,"name":"Keystone","score":0,"time":733.13677978516},{"id":0,"name":"Lady of Ravens","score":0,"time":718.33026123047},{"id":0,"name":"The Bearded Zerg...","score":0,"time":650.97283935547},{"id":0,"name":"Progressblocker","score":0,"time":626.72271728516},{"id":0,"name":"Venemox","score":0,"time":504.53610229492},{"id":0,"name":"IxJack","score":0,"time":381.25302124023},{"id":0,"name":"belly_171","score":0,"time":338.23446655273},{"id":0,"name":"Burnt Toast","score":0,"time":319.94873046875},{"id":0,"name":"The Peruvian Jaj...","score":0,"time":257.34295654297},{"id":0,"name":"✪Kenpachi✪","score":0,"time":209.73718261719},{"id":0,"name":"Freddy","score":0,"time":168.2241973877},{"id":0,"name":"Aaron Seigh","score":0,"time":122.140625},{"id":0,"name":"LironB™ ts","score":840,"time":1500.8879394531},{"id":0,"name":"Giddyup01","score":2320,"time":1241.0709228516},{"id":0,"name":"[BB]QaddafiDuck","score":600,"time":730.94561767578},{"id":0,"name":"biff722","score":720,"time":580.9052734375},{"id":0,"name":"Ratt Savage","score":500,"time":200.8443145752}],"port":27015,"protocol":17,"secure":1,"steam_id":90101383022948353,"steamappid":42690,"version":"1.0.0.1"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Conanexiles/1_response.txt b/gameq/tests/Protocols/Providers/Conanexiles/1_response.txt new file mode 100644 index 0000000..580cab2 Binary files /dev/null and b/gameq/tests/Protocols/Providers/Conanexiles/1_response.txt differ diff --git a/gameq/tests/Protocols/Providers/Conanexiles/1_result.json b/gameq/tests/Protocols/Providers/Conanexiles/1_result.json new file mode 100644 index 0000000..c7967e4 --- /dev/null +++ b/gameq/tests/Protocols/Providers/Conanexiles/1_result.json @@ -0,0 +1 @@ +{"85.114.155.195:27015":{"CSF_i":"0","HOSTIP":"1433574339","HOSTPORT":"7777","OWNINGID":"90109545464288261","OWNINGNAME":"[GER] Blood & Sand [PvP(RP)HVx2] Admins, Rules, No Avatars","P2PADDR":"90109545464288261","P2PPORT":"7777","S05_b":"true","S0_b":"true","S15_b":"false","S18_b":"true","S2_b":"false","S6_f":"0.100000","S7_b":"true","SESSIONFLAGS":"523","Sa_b":"true","Sb_f":"0.800000","Sf_f":"1.000000","Sk_f":"0.250000","So_f":"1200.000000","Sr_f":"10000.000000","Su_i":"4","Sv_f":"1.000000","Sx_i":"12","Sy_i":"0","dedicated":"d","game_descr":"Conan Exiles","game_dir":"conanexiles","game_id":440900,"gq_address":"85.114.155.195","gq_joinlink":"steam:\/\/connect\/85.114.155.195:27015\/","gq_name":"Conan Exiles","gq_online":true,"gq_port_client":27015,"gq_port_query":27015,"gq_protocol":"source","gq_transport":"udp","gq_type":"conanexiles","hostname":"[GER] Blood & Sand [PvP(RP)HVx2] Admins, Rules, No Avatars","keywords":"BUILDID:256536549,OWNINGID:90109545464288261,OWNINGNAME:[GER] Blood & Sand [PvP(RP)HVx2] Admins, Rules, No Avatars,P2PPORT:7777","map":"The Exiled Lands","max_players":70,"num_bots":0,"num_players":18,"num_rules":28,"os":"w","password":0,"players":[{"id":0,"name":"Miller","score":0,"time":14230.8125},{"id":0,"name":"Monshy","score":0,"time":14149.408203125},{"id":0,"name":"Tristan","score":0,"time":12823.291992188},{"id":0,"name":"Hauptmann Stahl","score":0,"time":10072.771484375},{"id":0,"name":"Memo","score":0,"time":9202.734375},{"id":0,"name":"Mat-Thorne","score":0,"time":8856.5234375},{"id":0,"name":"zumhieressen","score":0,"time":6606.5903320312},{"id":0,"name":"Maroner","score":0,"time":6271.3994140625},{"id":0,"name":"El Fiero","score":0,"time":4555.3115234375},{"id":0,"name":"Akatsuki","score":0,"time":3905.6616210938},{"id":0,"name":"martin.geez","score":0,"time":2906.0234375},{"id":0,"name":"Bane","score":0,"time":2733.3444824219},{"id":0,"name":"lthola","score":0,"time":2363.2619628906},{"id":0,"name":"LuckyLouGER","score":0,"time":1922.4068603516},{"id":0,"name":"Barbarella","score":0,"time":1574.6242675781},{"id":0,"name":"Sir_Hect0r_2.0","score":0,"time":1255.36328125},{"id":0,"name":"Yemaja","score":0,"time":451.47943115234},{"id":0,"name":"The Doctor","score":0,"time":133.0213470459}],"port":7777,"protocol":17,"sc_f":"10.000000","se_f":"0.500000","secure":1,"sl_f":"2.000000","steam_id":90109545464288261,"steamappid":0,"version":"1.0.0.0"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Conanexiles/2_response.txt b/gameq/tests/Protocols/Providers/Conanexiles/2_response.txt new file mode 100644 index 0000000..2fe3da6 Binary files /dev/null and b/gameq/tests/Protocols/Providers/Conanexiles/2_response.txt differ diff --git a/gameq/tests/Protocols/Providers/Conanexiles/2_result.json b/gameq/tests/Protocols/Providers/Conanexiles/2_result.json new file mode 100644 index 0000000..b71ed32 --- /dev/null +++ b/gameq/tests/Protocols/Providers/Conanexiles/2_result.json @@ -0,0 +1 @@ +{"31.186.250.173:7777":{"CSF_i":"0","HOSTIP":"532347565","HOSTPORT":"7777","OWNINGID":"90109540268569604","OWNINGNAME":"KH#1[UK\/EU]ALLx6[24\/06]EVENTS\/NOGOD KHGAMING.CO.UK","P2PADDR":"90109540268569604","P2PPORT":"7777","S05_b":"true","S0_b":"true","S15_b":"false","S18_b":"true","S7_b":"true","SESSIONFLAGS":"523","Sa_b":"true","Sb_f":"0.500000","Sf_f":"6.000000","Sg_f":"10.000000","Sj_f":"1.300000","Sk_f":"0.500000","Sm_f":"2.000000","So_f":"900.000000","Su_i":"2","Sw_f":"120.000000","Sx_i":"8","Sy_i":"0","dedicated":"d","game_descr":"Conan Exiles","game_dir":"conanexiles","game_id":440900,"gq_address":"31.186.250.173","gq_joinlink":"steam:\/\/connect\/31.186.250.173:7777\/","gq_name":"Conan Exiles","gq_online":true,"gq_port_client":7777,"gq_port_query":27015,"gq_protocol":"source","gq_transport":"udp","gq_type":"conanexiles","hostname":"KH#1[UK\/EU]ALLx6[24\/06]EVENTS\/NOGOD KHGAMING.CO.UK","keywords":"BUILDID:256536549,OWNINGID:90109540268569604,OWNINGNAME:KH#1[UK\/EU]ALLx6[24\/06]EVENTS\/NOGOD KHGAMING.CO.UK,HOSTIP:532347565","map":"The Exiled Lands","max_players":70,"num_bots":0,"num_players":22,"num_rules":28,"os":"w","password":0,"players":[{"id":0,"name":"Games Foundry","score":0,"time":24031.859375},{"id":0,"name":"Stanislav Rink","score":0,"time":12920.913085938},{"id":0,"name":"Rastafreaak","score":0,"time":9190.6064453125},{"id":0,"name":"Igas","score":0,"time":6897.5263671875},{"id":0,"name":"\"CONAN EXILES\"","score":0,"time":6269.919921875},{"id":0,"name":"carlos89j","score":0,"time":5068.6474609375},{"id":0,"name":"VikingLord","score":0,"time":4934.224609375},{"id":0,"name":"Moraiz92","score":0,"time":3930.3786621094},{"id":0,"name":"Ashen-Shugar","score":0,"time":3794.3669433594},{"id":0,"name":"Claire","score":0,"time":3778.5329589844},{"id":0,"name":"Badbonez","score":0,"time":3544.4113769531},{"id":0,"name":"♥ Cyria |I| Dana ♥","score":0,"time":3197.2294921875},{"id":0,"name":"C4","score":0,"time":2557.4655761719},{"id":0,"name":"kisbye1","score":0,"time":1639.34765625},{"id":0,"name":"Matthi","score":0,"time":1590.5541992188},{"id":0,"name":"kosete83","score":0,"time":1562.9281005859},{"id":0,"name":"Depravao","score":0,"time":971.13580322266},{"id":0,"name":"BitsnPieces","score":0,"time":867.36468505859},{"id":0,"name":"dat_Shane","score":0,"time":650.52447509766},{"id":0,"name":"Palczi","score":0,"time":426.59994506836},{"id":0,"name":"GAbrieL","score":0,"time":215.14616394043},{"id":0,"name":"Silverman","score":0,"time":193.0185546875}],"port":7777,"protocol":17,"sc_f":"10.000000","se_f":"0.500000","secure":1,"sl_f":"6.000000","steam_id":90109540268569604,"steamappid":0,"version":"1.0.0.0"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Conanexiles/3_response.txt b/gameq/tests/Protocols/Providers/Conanexiles/3_response.txt new file mode 100644 index 0000000..aaa6f09 Binary files /dev/null and b/gameq/tests/Protocols/Providers/Conanexiles/3_response.txt differ diff --git a/gameq/tests/Protocols/Providers/Conanexiles/3_result.json b/gameq/tests/Protocols/Providers/Conanexiles/3_result.json new file mode 100644 index 0000000..154e486 --- /dev/null +++ b/gameq/tests/Protocols/Providers/Conanexiles/3_result.json @@ -0,0 +1 @@ +{"193.111.186.177:7777":{"ALLOWDOWNLOADCHARS_i":"0","ALLOWDOWNLOADITEMS_i":"0","CUSTOMSERVERNAME_s":"(orp2)(wiped 13\/6)gamersreunited-10x(g)10x(t)5x(xp)","DayTime_s":"11:41","GameMode_s":"TestGameMode_xtcrisland_C","MATCHTIMEOUT_f":"120.000000","MOD0_s":"599476919:80B7AFED4294E3805C8C079C70A1AF74","MOD1_s":"731604991:8E24D60643B4AD865ADCCDB6BD0EC89A","MOD2_s":"609425335:AB0E60CF432B2C7019771399AEDA5F4A","MOD3_s":"566885854:4A5A1F1C49F88442D00B3186474D171A","ModId_l":"0","NUMOPENPUBCONN":"49","Networking_i":"0","OFFICIALSERVER_i":"0","OWNINGID":"90109502901488645","OWNINGNAME":"90109502901488645","P2PADDR":"90109502901488645","P2PPORT":"7777","SEARCHKEYWORDS_s":"Custom","SERVERUSESBATTLEYE_b":"true","SESSIONFLAGS":"683","SESSIONISPVE_i":"0","ServerPassword_b":"false","dedicated":"d","game_descr":"ARK: Survival Evolved","game_dir":"ark_survival_evolved","game_id":346110,"gq_address":"193.111.186.177","gq_joinlink":"steam:\/\/connect\/193.111.186.177:7777\/","gq_name":"Conan Exiles","gq_online":true,"gq_port_client":7777,"gq_port_query":27015,"gq_protocol":"source","gq_transport":"udp","gq_type":"conanexiles","hostname":"(ORP2)(Wiped 13\/6)GamersReunited-10x(G)10x(T)5x(XP) - (v259.35)","keywords":",OWNINGID:90109502901488645,OWNINGNAME:90109502901488645,NUMOPENPUBCONN:49,P2PADDR:90109502901488645,P2PPORT:7777,ModId_l:0","map":"TheIsland","max_players":50,"num_bots":0,"num_players":4,"num_rules":23,"os":"w","password":0,"players":[{"id":0,"name":"","score":0,"time":139524.46875},{"id":0,"name":"","score":0,"time":90719.78125},{"id":0,"name":"","score":0,"time":70353.6171875},{"id":0,"name":"banther","score":0,"time":14043.213867188}],"port":7777,"protocol":17,"secure":1,"steam_id":90109502901488645,"steamappid":0,"version":"1.0.0.0"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Crysiswars/1_response.txt b/gameq/tests/Protocols/Providers/Crysiswars/1_response.txt new file mode 100644 index 0000000..0e147fe Binary files /dev/null and b/gameq/tests/Protocols/Providers/Crysiswars/1_response.txt differ diff --git a/gameq/tests/Protocols/Providers/Crysiswars/1_result.json b/gameq/tests/Protocols/Providers/Crysiswars/1_result.json new file mode 100644 index 0000000..1ec97f2 --- /dev/null +++ b/gameq/tests/Protocols/Providers/Crysiswars/1_result.json @@ -0,0 +1 @@ +{"138.201.128.96:64100":{"anticheat":"0","dedicated":"1","dx10":"0","friendlyfire":"1","gamemode":"game","gamename":"crysiswars","gamepadsonly":"0","gametype":"TerrainControl","gamever":"1.1.1.6729","gq_address":"138.201.128.96","gq_joinlink":"","gq_name":"Crysis Wars","gq_online":true,"gq_port_client":64100,"gq_port_query":64100,"gq_protocol":"gamespy3","gq_transport":"udp","gq_type":"crysiswars","hostname":"=CJW=FunbocksAlpha|mixed maps","hostport":"64100","mapname":"TC_Altay","maxplayers":"28","modname":"MWLL","modversion":"0.8.6","numplayers":"25","official":"0","password":"0","players":[{"player":"Sergei","team":"2","deaths":"5","rank":"11","kills":"6"},{"player":"BOZOH","team":"2","deaths":"2","rank":"3","kills":""},{"player":"GuppyFish","team":"2","deaths":"7","rank":"10","kills":"7"},{"player":"Fred104 [BPL]","team":"1","deaths":"6","rank":"4","kills":""},{"player":"CloneSarge","team":"0","deaths":"","rank":"1","kills":""},{"player":"MR_TEX","team":"1","deaths":"7","rank":"9","kills":"4"},{"player":"Domkek [CSF]","team":"1","deaths":"6","rank":"11","kills":"10"},{"player":"Michaellsland","team":"2","deaths":"6","rank":"8","kills":"3"},{"player":"[BPL] Greg","team":"1","deaths":"3","rank":"5","kills":"-1"},{"player":"DarthVisari","team":"2","deaths":"5","rank":"4","kills":""},{"player":"123456789","team":"1","deaths":"","rank":"12","kills":"10"},{"player":"Vancer2","team":"2","deaths":"3","rank":"3","kills":"2"},{"player":"Canadian Commando","team":"1","deaths":"8","rank":"3","kills":""},{"player":"grog","team":"2","deaths":"1","rank":"9","kills":"2"},{"player":"Nytmare","team":"2","deaths":"2","rank":"5","kills":""},{"player":"[W-R].GnKnG","team":"1","deaths":"2","rank":"7","kills":"5"},{"player":"WindowsVista","team":"2","deaths":"1","rank":"2","kills":"2"},{"player":"BrutaLShag","team":"1","deaths":"2","rank":"7","kills":"2"},{"player":"One Bucket o' KFC","team":"2","deaths":"4","rank":"4","kills":""},{"player":"Dr.Gonzo","team":"1","deaths":"7","rank":"4","kills":""},{"player":"Gyph","team":"2","deaths":"3","rank":"6","kills":"1"},{"player":"Jasper","team":"1","deaths":"2","rank":"3","kills":"1"},{"player":"Mechwarrior","team":"1","deaths":"1","rank":"6","kills":"1"},{"player":"","team":"","deaths":"","rank":"","kills":""},{"player":"","team":"","deaths":"","rank":"","kills":""}],"timeleft":"1719","timelimit":"75","voicecomm":"0"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Cs15/1_response.txt b/gameq/tests/Protocols/Providers/Cs15/1_response.txt new file mode 100644 index 0000000..2d83c3e Binary files /dev/null and b/gameq/tests/Protocols/Providers/Cs15/1_response.txt differ diff --git a/gameq/tests/Protocols/Providers/Cs15/1_result.json b/gameq/tests/Protocols/Providers/Cs15/1_result.json new file mode 100644 index 0000000..656b094 --- /dev/null +++ b/gameq/tests/Protocols/Providers/Cs15/1_result.json @@ -0,0 +1 @@ +{"85.153.14.4:27015":{"KEEG_Nameban":"0.4.5","SpecList":"1.2b","__sxei_16bppkick":"0","__sxei_16bppshow":"0","__sxei_antisound":"1","__sxei_awhfordead":"0","__sxei_awhforent":"0","__sxei_awhforteam":"0","__sxei_changenick":"1","__sxei_clt_ver":"15.1","__sxei_internal_ip":"","__sxei_required":"1","__sxei_screen_path":"","__sxei_screen_save":"","__sxei_srv_ver":"9.6.3.2","__sxei_zmirror":"","address":"85.153.14.4:27015","admin_allinone_version":"3.3 CS (AMX Mod)","allow_spectators":"1","amx_contactinfo":"","amx_modules":"3","amx_nextmap":"fy_iceworld","amx_timeleft":"25:04","amx_version":"2010.1","antidlfile_version":"1.4","coop":"0","deathmatch":"1","decalfrequency":"60","dedicated":"d","edgefriction":"2","game_descr":"CounterStrike","game_dir":"cstrike","gq_address":"85.153.14.4","gq_joinlink":"steam:\/\/connect\/85.153.14.4:27015\/","gq_name":"Counter-Strike 1.5","gq_online":true,"gq_port_client":"27015","gq_port_query":27015,"gq_protocol":"won","gq_transport":"udp","gq_type":"cs15","hostname":"~UnconscionabLe~ l","ismod":1,"kg_ver":"2012.2","map":"de_inferno","max_players":30,"max_queries_sec":"1","max_queries_sec_global":"1","max_queries_window":"1","metamod_version":"1.19p32","mod_cldll":1,"mod_size":184000000,"mod_type":0,"mod_urldl":"","mod_urlinfo":"www.counter-strike.net","mod_version":1,"mp_allowmonsters":"0","mp_autokick":"0","mp_autoteambalance":"1","mp_buytime":"1.5","mp_c4timer":"35","mp_chattime":"0","mp_consistency":"1","mp_fadetoblack":"0","mp_flashlight":"1","mp_footsteps":"1","mp_forcecamera":"0","mp_forcechasecam":"0","mp_fragsleft":"0","mp_freezetime":"0","mp_friendlyfire":"0","mp_ghostfrequency":"0.1","mp_hostagepenalty":"0","mp_kickpercent":"0.66","mp_limitteams":"2","mp_logdetail":"0","mp_logfile":"1","mp_logmessages":"0","mp_mapvoteratio":"0.66","mp_maxrounds":"0","mp_mirrordamage":"0","mp_playerid":"0","mp_roundtime":"2.45","mp_slaylosers":"1","mp_startmoney":"1000","mp_timeleft":"0","mp_timelimit":"40","mp_tkpunish":"0","mp_winlimit":"0","num_bots":0,"num_players":7,"num_rules":94,"os":"l","password":0,"pausable":"0","players":[{"id":1,"name":"~Aktas,`+Ajm;?` ^^","score":12,"time":777.92645263672},{"id":2,"name":"Addicted","score":16,"time":2131.7644042969},{"id":3,"name":"hain_bedo","score":2,"time":722.48895263672},{"id":4,"name":"| f A T j H :}","score":3,"time":761.03582763672},{"id":5,"name":"` 0hmiSss !","score":10,"time":4015.8249511719},{"id":6,"name":"corumluu","score":10,"time":870.42840576172},{"id":7,"name":"~sadeceiz|e.","score":0,"time":3376.2585449219}],"secure":0,"statsme_version":"2.7.1","sv_accelerate":"5","sv_aim":"0","sv_airaccelerate":"10","sv_airmove":"1","sv_allowupload":"0","sv_bounce":"1","sv_cheats":"0","sv_clienttrace":"1","sv_clipmode":"0","sv_contact":"","sv_friction":"4","sv_friendlyfire":"0","sv_gravity":"800","sv_logblocks":"0","sv_maxrate":"25000","sv_maxspeed":"2000","sv_minrate":"3500","sv_password":"0","sv_proxies":"1","sv_restart":"0","sv_restartround":"0","sv_stepsize":"18","sv_stopspeed":"75","sv_voiceenable":"1","sv_wateraccelerate":"10","sv_waterfriction":"1","version":46}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Cs15/2_response.txt b/gameq/tests/Protocols/Providers/Cs15/2_response.txt new file mode 100644 index 0000000..b5b7d67 Binary files /dev/null and b/gameq/tests/Protocols/Providers/Cs15/2_response.txt differ diff --git a/gameq/tests/Protocols/Providers/Cs15/2_result.json b/gameq/tests/Protocols/Providers/Cs15/2_result.json new file mode 100644 index 0000000..2c30ec8 --- /dev/null +++ b/gameq/tests/Protocols/Providers/Cs15/2_result.json @@ -0,0 +1 @@ +{"85.153.14.13:27015":{"address":"85.153.14.13:27015","hostname":"[YLK] Pro Public*","map":"fy_iceworld","game_dir":"cstrike","game_descr":"CounterStrike", "num_players":5,"max_players":30,"version":46,"dedicated":"d","os":"l","password":0,"ismod":1,"mod_urlinfo":"www.counter-strike.net", "mod_urldl":"","mod_version":1,"mod_size":184000000,"mod_type":0,"mod_cldll":1,"secure":0,"num_bots":0,"players":[{"id":1,"name":"~[`]~ -Agr!Ly :}}}","score":0,"time":29.371921539307},{"id":2,"name":"WHA * cool line jaetz ^","score":0,"time":198.72763061523},{"id":3,"name":"kecon","score":2,"time":187.68759155273},{"id":4,"name":"-wiL`y \/\/ - VALVEEEEEEEE ^^ ;[","score":1,"time":196.46151733398},{"id":5,"name":"`- Realize -` # Druq ~C~","score":21,"time":1134.5721435547}],"num_rules":94,"__sxei_16bppkick":"0","__sxei_16bppshow":"0","__sxei_antisound":"1","__sxei_awhfordead":"0","__sxei_awhforent":"0","__sxei_awhforteam":"0","__sxei_changenick":"1","__sxei_clt_ver":"15.1","__sxei_internal_ip":"","__sxei_required":"1","__sxei_screen_path":"","__sxei_screen_save":"","__sxei_srv_ver":"9.6.3.2","__sxei_zmirror":"","Admin Mark":"1.2","admin_allinone_version":"3.3 CS (AMX Mod)","allow_spectators":"1","amx_contactinfo":"","amx_modules":"3","amx_nextmap":"awp_battle","amx_timeleft":"24:24","amx_version":"2010.1","coop":"0","deathmatch":"1","decalfrequency":"60","edgefriction":"2","KEEG_Nameban":"0.4.5","kg_ver":"2012.2","max_queries_sec":"1","max_queries_sec_global":"1","max_queries_window":"1","metamod_version":"1.19p32","mp_allowmonsters":"0","mp_autokick":"0","mp_autoteambalance":"1","mp_buytime":"1.5","mp_c4timer":"35","mp_chattime":"0","mp_consistency":"1","mp_fadetoblack":"0","mp_flashlight":"1","mp_footsteps":"1","mp_forcecamera":"0","mp_forcechasecam":"0","mp_fragsleft":"0","mp_freezetime":"1","mp_friendlyfire":"0","mp_ghostfrequency":"0.1","mp_hostagepenalty":"0","mp_kickpercent":"0.66","mp_limitteams":"2","mp_logdetail":"0","mp_logfile":"1","mp_logmessages":"0","mp_mapvoteratio":"0.66","mp_maxrounds":"0","mp_mirrordamage":"0","mp_playerid":"0","mp_roundtime":"3","mp_slaylosers":"1","mp_startmoney":"850","mp_timeleft":"0","mp_timelimit":"35","mp_tkpunish":"0","mp_winlimit":"0","pausable":"0","SpecList":"1.2b","statsme_version":"2.7.1","sv_accelerate":"5","sv_aim":"0","sv_airaccelerate":"10","sv_airmove":"1","sv_allowupload":"0","sv_bounce":"1","sv_cheats":"0","sv_clienttrace":"1","sv_clipmode":"0","sv_contact":"","sv_friction":"4","sv_friendlyfire":"0","sv_gravity":"800","sv_logblocks":"0","sv_maxrate":"25000","sv_maxspeed":"2000","sv_minrate":"3500","sv_password":"0","sv_proxies":"1","sv_restart":"0","sv_restartround":"0","sv_stepsize":"18","sv_stopspeed":"75","sv_voiceenable":"1","sv_wateraccelerate":"10","sv_waterfriction":"1","gq_joinlink":"steam:\/\/connect\/85.153.14.13:27015\/","gq_online":true,"gq_address":"85.153.14.13","gq_port_client":"27015","gq_port_query":27015,"gq_protocol":"won","gq_type":"cs15","gq_transport":"udp","gq_name":"Counter-Strike 1.5"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Cs16/1_response.txt b/gameq/tests/Protocols/Providers/Cs16/1_response.txt new file mode 100644 index 0000000..e163d77 Binary files /dev/null and b/gameq/tests/Protocols/Providers/Cs16/1_response.txt differ diff --git a/gameq/tests/Protocols/Providers/Cs16/1_result.json b/gameq/tests/Protocols/Providers/Cs16/1_result.json new file mode 100644 index 0000000..575587c --- /dev/null +++ b/gameq/tests/Protocols/Providers/Cs16/1_result.json @@ -0,0 +1 @@ +{"63.251.20.37:27015":{"SgKALLPlugin":"1.0","Team_Semiclip_version":"2.0.0","WalkGuard":"1.3.2","_tutor_bomb_viewable_check_interval":"0.5","_tutor_debug_level":"0","_tutor_examine_time":"0.5","_tutor_hint_interval_time":"10.0","_tutor_look_angle":"10","_tutor_look_distance":"200","_tutor_message_character_display_time_coefficient":"0.07","_tutor_message_minimum_display_time":"1","_tutor_message_repeats":"5","_tutor_view_distance":"1000","admanager_version":"0.5","aesp_version":"1.3","allow_spectators":"1.0","amx_client_languages":"1","amx_language":"en","amx_nextmap":"de_train","amx_timeleft":"00:00","amxbans_version":"6.0.3","amxmodx_version":"1.8.2","coop":"0","deathmatch":"1","decalfrequency":"10","dedicated":"d","edgefriction":"2","game_descr":"|SgK| Clan","game_dir":"cstrike","game_id":10,"gq_address":"63.251.20.37","gq_joinlink":"steam:\/\/connect\/63.251.20.37:27015\/","gq_name":"Counter-Strike 1.6","gq_online":true,"gq_port_client":"27015","gq_port_query":27015,"gq_protocol":"source","gq_transport":"udp","gq_type":"cs16","hostage_debug":"0","hostage_stop":"0","hostname":"|SgK| CLASSIC 1000 FPS #1USA sgkclan.org ","humans_join_team":"any","jtp10181":"gore","map":"de_inferno","map_spawns":"T(20) CT(20)","max_players":32,"max_queries_sec":"1","max_queries_sec_global":"1","max_queries_window":"1","metamod_version":"1.21p37","mp_allowmonsters":"0","mp_autokick":"0","mp_autokick_timeout":"-1","mp_autoteambalance":"1","mp_buytime":"1.","mp_c4timer":"30","mp_chattime":"10","mp_consistency":"1","mp_fadetoblack":"0","mp_flashlight":"0","mp_footsteps":"1","mp_forcecamera":"0","mp_forcechasecam":"0","mp_fragsleft":"0","mp_freezetime":"0","mp_friendlyfire":"0","mp_ghostfrequency":"0.1","mp_hostagepenalty":"5","mp_kickpercent":"0.66","mp_limitteams":"2","mp_logdetail":"0","mp_logfile":"1","mp_logmessages":"1","mp_mapvoteratio":"0.66","mp_maxrounds":"0","mp_mirrordamage":"0","mp_playerid":"0","mp_roundtime":"2","mp_startmoney":"801","mp_timeleft":"0","mp_timelimit":"0","mp_tkpunish":"1","mp_windifference":"1","mp_winlimit":"0","num_bots":2,"num_players":23,"num_rules":98,"os":"l","password":0,"pausable":"0","players":[{"id":1,"name":"|SgK| Vicking **PT**","score":10,"time":917.609375},{"id":2,"name":"|SGK| WarGod Shield","score":2,"time":102516.2421875},{"id":3,"name":"Player","score":0,"time":178.5703125},{"id":4,"name":"E.U.A","score":1,"time":653.5390625},{"id":5,"name":"DIMON","score":2,"time":219.0625},{"id":6,"name":"www.sgkclan.org","score":0,"time":102516.2421875},{"id":7,"name":"BUBU","score":0,"time":32591.5859375},{"id":8,"name":"NiGGaZ","score":9,"time":636.984375},{"id":9,"name":"iliesergyoSB","score":3,"time":224.8984375},{"id":10,"name":"Illusion Raccoon","score":49,"time":2226.609375},{"id":11,"name":"JOSE","score":0,"time":147.296875},{"id":12,"name":"|SgK| method`","score":0,"time":1882.921875},{"id":13,"name":"The m4d J0k3r","score":0,"time":196.0234375},{"id":14,"name":"[[BABA BHAKT]] 666 KRODHIT","score":0,"time":36.9921875},{"id":15,"name":"|SgK| Sparki","score":11,"time":908.84375},{"id":16,"name":"name","score":3,"time":636.59375},{"id":17,"name":"Spades","score":9,"time":814.671875},{"id":18,"name":"|SgK| Pacman #DeT","score":13,"time":755.25},{"id":19,"name":"Neko Tamo :)","score":1,"time":138.40625},{"id":20,"name":"AST staford","score":0,"time":142.40625},{"id":21,"name":"[[BABA BHAKT]]Uchiha Itachi","score":0,"time":21.53125},{"id":22,"name":"bob'sbitch","score":0,"time":17204.75},{"id":23,"name":"Ze Alves","score":4,"time":1849.59375}],"port":27015,"protocol":48,"qs_version":"2.0","redirect_version":"1","secure":1,"specbot":"1","steam_id":90071992547409920,"steamappid":10,"sv_accelerate":"5","sv_aim":"1","sv_airaccelerate":"10","sv_allowupload":"1","sv_alltalk":"1","sv_bounce":"1","sv_cheats":"0","sv_clienttrace":"1","sv_contact":"http\/\/www.sgkclan.org","sv_friction":"4","sv_gravity":"800","sv_logblocks":"0","sv_maxrate":"0","sv_maxspeed":"9999","sv_minrate":"100000","sv_password":"0","sv_proxies":"1","sv_restart":"0","sv_restartround":"0","sv_stepsize":"18","sv_stopspeed":"75","sv_uploadmax":"0.5","sv_voiceenable":"1","sv_wateraccelerate":"10","sv_waterfriction":"1","version":"1.1.2.7\/Stdio"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Cs16/2_response.txt b/gameq/tests/Protocols/Providers/Cs16/2_response.txt new file mode 100644 index 0000000..719a142 Binary files /dev/null and b/gameq/tests/Protocols/Providers/Cs16/2_response.txt differ diff --git a/gameq/tests/Protocols/Providers/Cs16/2_result.json b/gameq/tests/Protocols/Providers/Cs16/2_result.json new file mode 100644 index 0000000..86d413b --- /dev/null +++ b/gameq/tests/Protocols/Providers/Cs16/2_result.json @@ -0,0 +1 @@ +{"64.74.97.97:27015":{"WalkGuard":"1.3.2","_tutor_bomb_viewable_check_interval":"0.5","_tutor_debug_level":"0","_tutor_examine_time":"0.5","_tutor_hint_interval_time":"10.0","_tutor_look_angle":"10","_tutor_look_distance":"200","_tutor_message_character_display_time_coefficient":"0.07","_tutor_message_minimum_display_time":"1","_tutor_message_repeats":"5","_tutor_view_distance":"1000","address":"127.0.0.1:27015","admanager_version":"0.5","aesp_version":"1.3","allow_spectators":"1.0","amx_client_languages":"1","amx_language":"en","amxbans_version":"6.0.3","amxmodx_version":"1.8.2-dev-RA","brr_ver":"1.4-kill","coop":"0","deathmatch":"1","decalfrequency":"60","dedicated":"d","edgefriction":"2","game_descr":"www.ragaming.org","game_dir":"cstrike","game_id":10,"gq_address":"64.74.97.97","gq_joinlink":"steam:\/\/connect\/64.74.97.97:27015\/","gq_name":"Counter-Strike 1.6","gq_online":true,"gq_port_client":"27015","gq_port_query":27015,"gq_protocol":"source","gq_transport":"udp","gq_type":"cs16","hlxce_plugin_version":"1.6.16 (HL1)","hlxce_version":"1.6.19","hlxce_webpage":"http:\/\/192.210.229.197\/stats","hostage_debug":"0","hostage_stop":"0","hostname":"Renegade Army `NoN-SteaM` [ragaming.org] [1000FPS]","humans_join_team":"any","ismod":1,"luciaHallucination":"1.0","map":"de_dust2","max_players":32,"max_queries_sec":"1","max_queries_sec_global":"1","max_queries_window":"1","metamod_version":"1.21.1-am","mod_cldll":0,"mod_size":0,"mod_type":1,"mod_urldl":"","mod_urlinfo":"","mod_version":1,"mp_allowmonsters":"0","mp_autokick":"0","mp_autokick_timeout":"-1","mp_autoteambalance":"1","mp_buytime":"0.40","mp_c4timer":"40","mp_chattime":"10","mp_consistency":"1","mp_fadetoblack":"0","mp_flashlight":"0","mp_footsteps":"1","mp_forcecamera":"0","mp_forcechasecam":"0","mp_fragsleft":"0","mp_freezetime":"2","mp_friendlyfire":"0","mp_ghostfrequency":"0.1","mp_hostagepenalty":"0","mp_kickpercent":"0.66","mp_limitteams":"2","mp_logdetail":"0","mp_logfile":"1","mp_logmessages":"1","mp_mapvoteratio":"0.66","mp_maxrounds":"0","mp_mirrordamage":"0","mp_playerid":"0","mp_roundtime":"2","mp_startmoney":"16000","mp_timeleft":"0","mp_timelimit":"0","mp_tkpunish":"0","mp_windifference":"1","mp_winlimit":"0","num_bots":0,"num_players":23,"num_rules":95,"os":"w","password":0,"pausable":"0","players":[{"id":1,"name":"Rewel","score":30,"time":4328.375},{"id":2,"name":"Bartol","score":0,"time":83.1484375},{"id":3,"name":"LH@3","score":0,"time":49.8984375},{"id":4,"name":"piterskij","score":2,"time":1099.0625},{"id":5,"name":"ECD","score":5,"time":570.26171875},{"id":6,"name":"Player","score":1,"time":247.6328125},{"id":7,"name":"DeCa.","score":0,"time":38.71875},{"id":8,"name":"dAfuck '","score":4,"time":1457.84375},{"id":9,"name":"grEEn","score":0,"time":504.6015625},{"id":10,"name":"supersoldier25","score":7,"time":429.5234375},{"id":11,"name":"bagabontu$","score":0,"time":22.54296875},{"id":12,"name":"Cleider [Ghost] x_O [Happy]","score":0,"time":22.3984375},{"id":13,"name":"(1)Player","score":22,"time":1657.9921875},{"id":14,"name":"TUMACHO","score":1,"time":378.6171875},{"id":15,"name":"anan","score":10,"time":1266.921875},{"id":16,"name":"R1 yamaha :)","score":14,"time":1503.953125},{"id":17,"name":"o_OoKing_|DePredador|_(VeNoM#","score":3,"time":194.37109375},{"id":18,"name":"Lisanna","score":0,"time":160.1640625},{"id":19,"name":"-prodigy.","score":1,"time":351.27734375},{"id":20,"name":"YUNGWUN","score":2,"time":141.5},{"id":21,"name":"iCoke","score":2,"time":703.234375},{"id":22,"name":"Na vi ' N2HuX - New Member","score":32,"time":1394.125},{"id":23,"name":"TIC TAC.STK.435.((((<>))))>k","score":5,"time":2123.0625}],"port":27015,"protocol":48,"secure":1,"steam_id":10,"steamappid":10,"sv_accelerate":"5","sv_aim":"0","sv_airaccelerate":"100","sv_allowupload":"1","sv_alltalk":"0","sv_bounce":"1","sv_cheats":"0","sv_clienttrace":"1.0","sv_contact":"","sv_friction":"4","sv_gravity":"800","sv_logblocks":"0","sv_maxrate":"80000","sv_maxspeed":"900","sv_minrate":"12000","sv_password":"0","sv_proxies":"1","sv_restart":"0","sv_restartround":"0","sv_stepsize":"18","sv_stopspeed":"75","sv_uploadmax":"0.5","sv_voiceenable":"1","sv_wateraccelerate":"10","sv_waterfriction":"1","version":"1.1.2.7\/Stdio","vtc_version":"80"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Cs16/3_response.txt b/gameq/tests/Protocols/Providers/Cs16/3_response.txt new file mode 100644 index 0000000..aefb125 Binary files /dev/null and b/gameq/tests/Protocols/Providers/Cs16/3_response.txt differ diff --git a/gameq/tests/Protocols/Providers/Cs16/3_result.json b/gameq/tests/Protocols/Providers/Cs16/3_result.json new file mode 100644 index 0000000..024be1e --- /dev/null +++ b/gameq/tests/Protocols/Providers/Cs16/3_result.json @@ -0,0 +1 @@ +{"64.94.101.205:27015":{"Team_Semiclip_version":"3.1.0","UltimatePlugin":"1.5.1b","_tutor_bomb_viewable_check_interval":"0.5","_tutor_debug_level":"0","_tutor_examine_time":"0.5","_tutor_hint_interval_time":"10.0","_tutor_look_angle":"10","_tutor_look_distance":"200","_tutor_message_character_display_time_coefficient":"0.07","_tutor_message_minimum_display_time":"1","_tutor_message_repeats":"5","_tutor_view_distance":"1000","address":"127.0.0.1:27015","admanager_version":"0.5","aesp_version":"1.3","allow_spectators":"1","amx_client_languages":"1","amx_language":"en","amx_nextmap":"de_dust2","amx_timeleft":"98:28","amxbans_version":"6.0.3","amxmodx_version":"1.8.3-dev+19c8b00","coop":"0","deathmatch":"1","decalfrequency":"60","dedicated":"d","dp_version":"0.9.391","edgefriction":"2","game_descr":"Acs-Gaming.com","game_dir":"cstrike","game_id":10,"gq_address":"64.94.101.205","gq_joinlink":"steam:\/\/connect\/64.94.101.205:27015\/","gq_name":"Counter-Strike 1.6","gq_online":true,"gq_port_client":"27015","gq_port_query":27015,"gq_protocol":"source","gq_transport":"udp","gq_type":"cs16","hostage_debug":"0","hostage_stop":"0","hostname":"AcceleratedCS | Dust2 24\/7 | Pub | Los Angeles","humans_join_team":"any","ichat_version":"2.3.3","ismod":1,"map":"de_dust2","max_players":32,"max_queries_sec":"1","max_queries_sec_global":"1","max_queries_window":"1","metamod_version":"1.21p37","mod_cldll":0,"mod_size":0,"mod_type":1,"mod_urldl":"","mod_urlinfo":"","mod_version":1,"mp_allowmonsters":"0","mp_autokick":"0","mp_autokick_timeout":"-1","mp_autoteambalance":"1","mp_buytime":".5","mp_c4timer":"35","mp_chattime":"2","mp_consistency":"1","mp_fadetoblack":"0","mp_flashlight":"1","mp_footsteps":"1","mp_forcecamera":"0","mp_forcechasecam":"0","mp_fragsleft":"0","mp_freezetime":"0","mp_friendlyfire":"0","mp_ghostfrequency":"0","mp_hostagepenalty":"0","mp_kickpercent":"0.66","mp_limitteams":"1","mp_logdetail":"0","mp_logfile":"1","mp_logmessages":"1","mp_mapvoteratio":"0.6","mp_maxrounds":"0","mp_mirrordamage":"0","mp_playerid":"0","mp_roundtime":"1.7","mp_startmoney":"16000","mp_timeleft":"0","mp_timelimit":"120","mp_tkpunish":"0","mp_windifference":"1","mp_winlimit":"0","num_bots":0,"num_players":26,"num_rules":94,"os":"l","password":0,"pausable":"0","players":[{"id":0,"name":"ShadowPlayerX","score":0,"time":77.5859375},{"id":0,"name":"MITRE","score":0,"time":8.0703125},{"id":0,"name":"[TBV]*Ackerman'[B]aby *--* T'c","score":0,"time":76.734375},{"id":0,"name":"stick to your guns","score":27,"time":1047.34375},{"id":0,"name":"adrian","score":0,"time":634.609375},{"id":0,"name":"Rainden","score":1,"time":8050.328125},{"id":0,"name":"vive islamic","score":0,"time":136.40625},{"id":0,"name":"Karrar #acs","score":24,"time":15202.7421875},{"id":0,"name":"duroColombia","score":12,"time":1020.078125},{"id":0,"name":"TGV \/\/ Dz Bro","score":0,"time":302.6171875},{"id":0,"name":"Effective|Spray (Lisa)","score":5,"time":1194.8984375},{"id":0,"name":"guilhermehamada [BR]","score":1,"time":159.7578125},{"id":0,"name":"$Sammy$","score":2,"time":1702.8671875},{"id":0,"name":"jamesBondddddd007","score":5,"time":2349.234375},{"id":0,"name":"Ricardo","score":2,"time":2872.6796875},{"id":0,"name":"XENEIZE","score":0,"time":386.171875},{"id":0,"name":"CANADIAN","score":20,"time":556.265625},{"id":0,"name":"Whizk","score":10,"time":525.578125},{"id":0,"name":"digital*!","score":6,"time":508.6875},{"id":0,"name":"ISISKILLER","score":6,"time":3449.171875},{"id":0,"name":"@EMANOEL@[BR]","score":3,"time":493.6875},{"id":0,"name":"`NoobStar -ph-","score":0,"time":882.4453125},{"id":0,"name":"Enteng #acs","score":10,"time":659.84375},{"id":0,"name":"oussama","score":3,"time":2763.4296875},{"id":0,"name":"SteeL.l papa","score":3,"time":478.5390625},{"id":0,"name":"*chiva*","score":1,"time":223.7421875}],"port":27015,"protocol":48,"secure":1,"steam_id":10,"steamappid":10,"sv_accelerate":"5","sv_aim":"0","sv_airaccelerate":"5","sv_allowupload":"1","sv_alltalk":"0","sv_bounce":"1","sv_cheats":"0","sv_clienttrace":"1","sv_contact":"sohailyaftaly@hotmail.com","sv_friction":"4","sv_gravity":"800","sv_logblocks":"0","sv_maxrate":"0","sv_maxspeed":"320","sv_minrate":"100000","sv_password":"0","sv_proxies":"1","sv_restart":"0","sv_restartround":"0","sv_stepsize":"18","sv_stopspeed":"75","sv_uploadmax":"0.5","sv_voiceenable":"1","sv_wateraccelerate":"10","sv_waterfriction":"1","version":"1.1.2.7\r\/Stdio"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Cscz/1_response.txt b/gameq/tests/Protocols/Providers/Cscz/1_response.txt new file mode 100644 index 0000000..5538ee6 Binary files /dev/null and b/gameq/tests/Protocols/Providers/Cscz/1_response.txt differ diff --git a/gameq/tests/Protocols/Providers/Cscz/1_result.json b/gameq/tests/Protocols/Providers/Cscz/1_result.json new file mode 100644 index 0000000..a1a3e86 --- /dev/null +++ b/gameq/tests/Protocols/Providers/Cscz/1_result.json @@ -0,0 +1 @@ +{"74.91.123.5:27015":{"_tutor_bomb_viewable_check_interval":"0.5","_tutor_debug_level":"0","_tutor_examine_time":"0.5","_tutor_hint_interval_time":"10.0","_tutor_look_angle":"10","_tutor_look_distance":"200","_tutor_message_character_display_time_coefficient":"0.07","_tutor_message_minimum_display_time":"1","_tutor_message_repeats":"5","_tutor_view_distance":"1000","afkslay_version":"3.0.0 Beta 1","allow_spectators":"1","amx_client_languages":"1","amx_czbotcontrol":"1.3.4","amx_language":"en","amx_nextmap":"cf_13street","amx_ptb_version":"1.8b3","amx_rollthedice":"v2.5 RC 4","amx_timeleft":"05:09","amxmodx_version":"1.8.1.3746","bot_allow_grenades":"1","bot_allow_machine_guns":"1","bot_allow_pistols":"1","bot_allow_rifles":"1","bot_allow_rogues":"1","bot_allow_shield":"0","bot_allow_shotguns":"1","bot_allow_snipers":"1","bot_allow_sub_machine_guns":"1","bot_auto_vacate":"1","bot_chatter":"off","bot_debug":"0","bot_defer_to_human":"0","bot_difficulty":"1","bot_join_after_player":"0","bot_join_team":"any","bot_nav_edit":"0","bot_nav_zdraw":"4","bot_prefix":"","bot_profile_db":"BotProfile.db","bot_quicksave":"0","bot_quota":"-18","bot_quota_match":"0","bot_show_danger":"0","bot_show_nav":"0","bot_stop":"0","bot_traceview":"0","bot_walk":"0","bot_zombie":"0","coop":"0","deathmatch":"1","decalfrequency":"60","dedicated":"d","edgefriction":"2","game_descr":"Condition Zero","game_dir":"czero","game_id":80,"gq_address":"74.91.123.5","gq_joinlink":"steam:\/\/connect\/74.91.123.5:27015\/","gq_name":"Counter-Strike: Condition Zero","gq_online":true,"gq_port_client":27015,"gq_port_query":27015,"gq_protocol":"source","gq_transport":"udp","gq_type":"cscz","hostage_debug":"0","hostage_stop":"0","hostname":" Smokinguns Hideout","humans_join_team":"any","jtp10181":"gore","map":"de_prodigy_cz","map_spawns":"T(20) CT(20)","max_players":26,"max_queries_sec":"1","max_queries_sec_global":"1","max_queries_window":"1","metamod_version":"1.19p32","mp_allowmonsters":"0","mp_autokick":"0","mp_autoteambalance":"0","mp_buytime":"90","mp_c4timer":"45","mp_chattime":"3","mp_consistency":"1","mp_fadetoblack":"0","mp_flashlight":"0","mp_footsteps":"1","mp_forcecamera":"0","mp_forcechasecam":"0","mp_fragsleft":"0","mp_freezetime":"3","mp_friendlyfire":"1","mp_ghostfrequency":"0","mp_hostagepenalty":"4","mp_kickpercent":"0.66","mp_limitteams":"0","mp_logdetail":"0","mp_logfile":"1","mp_logmessages":"1","mp_mapvoteratio":"0.6","mp_maxrounds":"0","mp_mirrordamage":"0","mp_playerid":"0","mp_roundtime":"3","mp_startmoney":"1000","mp_timeleft":"0","mp_timelimit":"20","mp_tkpunish":"1","mp_windifference":"1","mp_winlimit":"0","num_bots":0,"num_players":26,"num_rules":125,"os":"w","password":0,"pausable":"0","players":[{"id":0,"name":"{S.G.H.}-{gT}-]V[rClam","score":4,"time":5997.1860351562},{"id":0,"name":"ThelO.Monk","score":3,"time":5746.7846679688},{"id":0,"name":"~SexyTexasBeauty~","score":9,"time":5156.01953125},{"id":0,"name":"Lightfoot","score":1,"time":4342.5859375},{"id":0,"name":"[rDz] MiAuUu-ChAn","score":3,"time":2064.5146484375},{"id":0,"name":"rines| Sergeant Polaris","score":13,"time":2059.7468261719},{"id":0,"name":"Goosey","score":2,"time":1591.9549560547},{"id":0,"name":"THE TREWS NEWS","score":15,"time":1457.8232421875},{"id":0,"name":"Freedomdonkey","score":1,"time":1371.0355224609},{"id":0,"name":"mike","score":8,"time":1226.7027587891},{"id":0,"name":"Kaka Martins","score":5,"time":998.22485351562},{"id":0,"name":"Player","score":0,"time":856.43701171875},{"id":0,"name":"Adr0ck - Voice Disabled","score":9,"time":816.47064208984},{"id":0,"name":"-Guido-(EVIL!!!)","score":4,"time":629.38745117188},{"id":0,"name":"Vermin","score":3,"time":607.37835693359},{"id":0,"name":"Ares{S.g.H}","score":1,"time":500.92126464844},{"id":0,"name":"Nity Grity - Canada","score":7,"time":468.04083251953},{"id":0,"name":"Z -","score":1,"time":412.90676879883},{"id":0,"name":"ChiKoo","score":3,"time":334.7424621582},{"id":0,"name":"Pinga BRA","score":1,"time":300.09506225586},{"id":0,"name":"Diego","score":2,"time":290.98104858398},{"id":0,"name":"Taldo","score":3,"time":208.45259094238},{"id":0,"name":"syfodyas","score":1,"time":143.76496887207},{"id":0,"name":".:MexStone:.(mex)","score":0,"time":142.22471618652},{"id":0,"name":"Rick Grimes TWD","score":0,"time":86.892738342285},{"id":0,"name":"{S.G.H}Nutt","score":0,"time":48.537117004395}],"port":27015,"protocol":48,"secure":1,"steam_id":90094472659721216,"steamappid":80,"sv_accelerate":"5","sv_aim":"0","sv_airaccelerate":"5","sv_airmove":"1","sv_allowupload":"1","sv_alltalk":"1","sv_bounce":"1","sv_cheats":"1","sv_clienttrace":"1","sv_clipmode":"0","sv_contact":"your@email.address","sv_friction":"4","sv_gravity":"800","sv_logblocks":"0","sv_maxrate":"19999","sv_maxspeed":"320","sv_minrate":"30000","sv_password":"0","sv_proxies":"1","sv_region":"0","sv_restart":"0","sv_restartround":"0","sv_stepsize":"18","sv_stopspeed":"75","sv_uploadmax":"0.5","sv_voiceenable":"1","sv_wateraccelerate":"10","sv_waterfriction":"1","version":"1.0.0.3","version_no_headshot_with_helmet":"1.2.0"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Cscz/2_response.txt b/gameq/tests/Protocols/Providers/Cscz/2_response.txt new file mode 100644 index 0000000..0df26e9 Binary files /dev/null and b/gameq/tests/Protocols/Providers/Cscz/2_response.txt differ diff --git a/gameq/tests/Protocols/Providers/Cscz/2_result.json b/gameq/tests/Protocols/Providers/Cscz/2_result.json new file mode 100644 index 0000000..e54d0e4 --- /dev/null +++ b/gameq/tests/Protocols/Providers/Cscz/2_result.json @@ -0,0 +1 @@ +{"70.42.74.140:27015":{"_tutor_bomb_viewable_check_interval":"0.5","_tutor_debug_level":"0","_tutor_examine_time":"0.5","_tutor_hint_interval_time":"10.0","_tutor_look_angle":"10","_tutor_look_distance":"200","_tutor_message_character_display_time_coefficient":"0.07","_tutor_message_minimum_display_time":"1","_tutor_message_repeats":"5","_tutor_view_distance":"1000","aesp_version":"1.3","allow_spectators":"1","amx_client_languages":"1","amx_language":"en","amx_nextmap":"de_dust2_cz","amx_super_menu":"5.0.2","amx_timeleft":"85:50","amxbans_version":"6.0.3","amxmodx_version":"1.8.2","bot_allow_grenades":"0","bot_allow_machine_guns":"1","bot_allow_pistols":"1","bot_allow_rifles":"1","bot_allow_rogues":"1","bot_allow_shield":"0","bot_allow_shotguns":"1","bot_allow_snipers":"0","bot_allow_sub_machine_guns":"1","bot_auto_vacate":"1","bot_chatter":"off","bot_debug":"0","bot_defer_to_human":"0","bot_difficulty":"1","bot_join_after_player":"0","bot_join_team":"any","bot_nav_edit":"0","bot_nav_zdraw":"4","bot_prefix":"","bot_profile_db":"BotProfile.db","bot_quicksave":"0","bot_quota":"4","bot_quota_match":"0","bot_show_danger":"0","bot_show_nav":"0","bot_stop":"0","bot_traceview":"0","bot_walk":"0","bot_zombie":"0","coop":"0","deathmatch":"1","decalfrequency":"60","dedicated":"d","edgefriction":"2","game_descr":"WWW.XXLGAMERS.NET","game_dir":"czero","game_id":80,"gameme_plugin_version":"2.3 (HL1)","gameme_webpage":"http:\/\/www.gameme.com","gq_address":"70.42.74.140","gq_joinlink":"steam:\/\/connect\/70.42.74.140:27015\/","gq_name":"Counter-Strike: Condition Zero","gq_online":true,"gq_port_client":27015,"gq_port_query":27015,"gq_protocol":"source","gq_transport":"udp","gq_type":"cscz","hostage_debug":"0","hostage_stop":"0","hostname":"24\/7 [*XXL BabyGirl's -Dust2-* UPGRADED] \/\/ xxlgamers.net","humans_join_team":"any","map":"de_dust2_cz","max_players":32,"max_queries_sec":"1","max_queries_sec_global":"1","max_queries_window":"1","metamod_version":"1.21-am","mp_allowmonsters":"0","mp_autokick":"0","mp_autokick_timeout":"-1","mp_autoteambalance":"1","mp_buytime":".45","mp_c4timer":"30","mp_chattime":"10","mp_consistency":"0","mp_fadetoblack":"0","mp_flashlight":"0","mp_footsteps":"1","mp_forcecamera":"0","mp_forcechasecam":"0","mp_fragsleft":"0","mp_freezetime":"1","mp_friendlyfire":"0","mp_ghostfrequency":"0.1","mp_hostagepenalty":"13","mp_kickpercent":"0.66","mp_limitteams":"2","mp_logdetail":"3","mp_logfile":"1","mp_logmessages":"1","mp_mapvoteratio":"0.66","mp_maxrounds":"0","mp_mirrordamage":"0","mp_playerid":"0","mp_roundtime":"1.8","mp_startmoney":"3250","mp_timeleft":"0","mp_timelimit":"100","mp_tkpunish":"0","mp_windifference":"1","mp_winlimit":"0","num_bots":4,"num_players":29,"num_rules":122,"os":"w","password":0,"pausable":"0","players":[{"id":0,"name":"Shinobi","score":28,"time":851.17907714844},{"id":0,"name":"Simply tAE","score":7,"time":848.87713623047},{"id":0,"name":"Fireman","score":4,"time":841.02307128906},{"id":0,"name":"InVisibLE","score":0,"time":840.46612548828},{"id":0,"name":"ConVict | I.TeD","score":14,"time":839.37811279297},{"id":0,"name":"BaitWithaNade","score":10,"time":835.39117431641},{"id":0,"name":"Fork","score":2,"time":825.21905517578},{"id":0,"name":"RANDYBEAR-(o.0)-","score":16,"time":767.03509521484},{"id":0,"name":"Matador_1269","score":4,"time":688.52069091797},{"id":0,"name":"s1ren","score":2,"time":672.27117919922},{"id":0,"name":"[MOCM]ABCD1234[MOCM]","score":3,"time":638.78369140625},{"id":0,"name":"Di$n3Yki!!@","score":3,"time":608.74005126953},{"id":0,"name":"Biu","score":7,"time":603.31378173828},{"id":0,"name":"+4 Longsword","score":4,"time":582.91400146484},{"id":0,"name":"CriXu$","score":8,"time":525.06903076172},{"id":0,"name":"`sars","score":1,"time":504.0710144043},{"id":0,"name":"Hot *Pockets","score":13,"time":482.33294677734},{"id":0,"name":"Lucky 13","score":4,"time":477.69186401367},{"id":0,"name":"Rathma","score":1,"time":396.13092041016},{"id":0,"name":"donkeyspanker","score":2,"time":367.66415405273},{"id":0,"name":"technicality","score":0,"time":337.97900390625},{"id":0,"name":"hoboface","score":2,"time":119.5785369873},{"id":0,"name":".: Matrix :. No sound","score":0,"time":42.440063476562},{"id":0,"name":"=AsHo=Hpman808 AFN","score":0,"time":17.540205001831},{"id":0,"name":"=IcB= Mongoose","score":0,"time":13.103922843933},{"id":0,"name":"Ian","score":0,"time":855.12139892578},{"id":0,"name":"Derek","score":3,"time":855.12139892578},{"id":0,"name":"Connor","score":5,"time":855.12139892578},{"id":0,"name":"Bill","score":1,"time":855.12145996094}],"port":27015,"protocol":48,"reconnect_features":"0.3.1","secure":1,"steam_id":90094492233148418,"steamappid":80,"sv_accelerate":"5","sv_aim":"0","sv_airaccelerate":"10","sv_allowupload":"1","sv_alltalk":"0","sv_bounce":"1","sv_cheats":"0","sv_clienttrace":"1","sv_contact":"","sv_friction":"4","sv_gravity":"800","sv_logblocks":"0","sv_maxrate":"100000","sv_maxspeed":"320","sv_minrate":"60000","sv_password":"0","sv_proxies":"1","sv_restart":"0","sv_restartround":"0","sv_stepsize":"18","sv_stopspeed":"75","sv_uploadmax":"0.5","sv_voiceenable":"1","sv_wateraccelerate":"10","sv_waterfriction":"1","version":"1.0.0.3"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Csgo/1_response.txt b/gameq/tests/Protocols/Providers/Csgo/1_response.txt new file mode 100644 index 0000000..583c4ac Binary files /dev/null and b/gameq/tests/Protocols/Providers/Csgo/1_response.txt differ diff --git a/gameq/tests/Protocols/Providers/Csgo/1_result.json b/gameq/tests/Protocols/Providers/Csgo/1_result.json new file mode 100644 index 0000000..03b0246 --- /dev/null +++ b/gameq/tests/Protocols/Providers/Csgo/1_result.json @@ -0,0 +1 @@ +{"74.91.120.159:27015":{"dedicated":"d","game_descr":"Counter-Strike: Global Offensive","game_dir":"csgo","game_id":730,"gq_address":"74.91.120.159","gq_joinlink":"steam:\/\/connect\/74.91.120.159:27015\/","gq_name":"Counter-Strike: Global Offensive","gq_online":true,"gq_port_client":"27015","gq_port_query":27015,"gq_protocol":"source","gq_transport":"udp","gq_type":"csgo","hostname":"[HorizonServers.net]Beginner Surf [Tier 1]|HSTimer|Drops|FastDL","keywords":"100,102.4,1024,autohop,bhop,bunnyhop,horizon,surf,tick,secure","map":"surf_lux","max_players":38,"num_bots":0,"num_players":30,"os":"l","password":0,"players":[{"id":0,"name":"kyle","score":0,"time":8814.724609375},{"id":0,"name":"FKGSparrow","score":0,"time":4443.150390625},{"id":0,"name":"Ajdin","score":0,"time":3087.6025390625},{"id":0,"name":"Dunni","score":0,"time":2420.4699707031},{"id":0,"name":"xXtHeDaRkDjlnNXx","score":0,"time":2291.7160644531},{"id":0,"name":"Har\u014dkiti","score":0,"time":2071.0874023438},{"id":0,"name":"Luckstaaa nosound","score":0,"time":1918.3195800781},{"id":0,"name":"Shadow \u30c4","score":0,"time":1891.8033447266},{"id":0,"name":"AL CAPWN \u2660","score":0,"time":1598.9741210938},{"id":0,"name":"minimalis","score":0,"time":1353.3310546875},{"id":0,"name":"edisk\u00e6w","score":0,"time":1328.6643066406},{"id":0,"name":"Peggle_","score":0,"time":1212.4361572266},{"id":0,"name":"niekS","score":0,"time":875.42858886719},{"id":0,"name":"Royal_","score":0,"time":630.86981201172},{"id":0,"name":"Refrac","score":0,"time":483.95172119141},{"id":0,"name":"Papa John's","score":0,"time":439.27172851562},{"id":0,"name":"Dr. Jerkey\u2122","score":0,"time":437.80139160156},{"id":0,"name":"CharlieeBrown","score":0,"time":424.6520690918},{"id":0,"name":"Noob Move\u2122","score":0,"time":346.60507202148},{"id":0,"name":"BohkitBoi","score":0,"time":312.19866943359},{"id":0,"name":"Fegat","score":0,"time":266.00360107422},{"id":0,"name":"Sen\u03c0\u00b3 #Wiggle #Sanic #NoSound","score":0,"time":262.78100585938},{"id":0,"name":"50 Shades Of Essence","score":0,"time":212.36706542969},{"id":0,"name":"","score":0,"time":191.01463317871},{"id":0,"name":"Lindsay Lohan","score":0,"time":131.2145690918},{"id":0,"name":"AtomicFormula","score":0,"time":55.101043701172},{"id":0,"name":"syava","score":0,"time":39.412082672119},{"id":0,"name":"FallOfTheAnimalKingdom","score":0,"time":19.46138381958},{"id":0,"name":"","score":0,"time":16.87455368042},{"id":0,"name":"","score":0,"time":10.312337875366}],"port":27015,"protocol":17,"secure":1,"steam_id":90094336077840387,"steamappid":730,"version":"1.34.7.1"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Csgo/2_response.txt b/gameq/tests/Protocols/Providers/Csgo/2_response.txt new file mode 100644 index 0000000..3ca2603 Binary files /dev/null and b/gameq/tests/Protocols/Providers/Csgo/2_response.txt differ diff --git a/gameq/tests/Protocols/Providers/Csgo/2_result.json b/gameq/tests/Protocols/Providers/Csgo/2_result.json new file mode 100644 index 0000000..e83e303 --- /dev/null +++ b/gameq/tests/Protocols/Providers/Csgo/2_result.json @@ -0,0 +1 @@ +{"74.91.117.68:27015":{"dedicated":"d","game_descr":"Counter-Strike: Global Offensive","game_dir":"csgo","game_id":730,"gq_address":"74.91.117.68","gq_joinlink":"steam:\/\/connect\/74.91.117.68:27015\/","gq_name":"Counter-Strike: Global Offensive","gq_online":true,"gq_port_client":"27015","gq_port_query":27015,"gq_protocol":"source","gq_transport":"udp","gq_type":"csgo","hostname":"AG:\\\\ NewbSurf #2 [Tier 1-3] AlliedGamers.net","keywords":"AG,AlliedGamers.net,OpiumGaming.com,ag,allied,alliedgamers,bhop,chicago,fastdl,og,rank,record,respawn,skill,surf,timer,secure","map":"surf_halloween_tf","max_players":32,"num_bots":0,"num_players":28,"os":"l","password":0,"players":[{"id":0,"name":"Ewic","score":0,"time":3296.1181640625},{"id":0,"name":"Silver -1","score":0,"time":3093.0688476562},{"id":0,"name":"Sooolagy","score":0,"time":3065.9123535156},{"id":0,"name":"sleeeeep","score":0,"time":2700.6936035156},{"id":0,"name":"CRoShost","score":0,"time":2008.3811035156},{"id":0,"name":"PC.","score":0,"time":1557.7088623047},{"id":0,"name":"bama","score":0,"time":1089.2349853516},{"id":0,"name":"Moki #CoCo #BakingSoda","score":0,"time":1088.8127441406},{"id":0,"name":"\u261c\u2606\u261e Zooopey \u261c\u2606\u261e","score":0,"time":897.54736328125},{"id":0,"name":"_Dak-","score":0,"time":863.79699707031},{"id":0,"name":"money trees","score":0,"time":685.68731689453},{"id":0,"name":"Mark","score":0,"time":659.29766845703},{"id":0,"name":"Zorgan89 ","score":0,"time":549.10949707031},{"id":0,"name":"[Nji] LaFF","score":0,"time":467.3591003418},{"id":0,"name":"JimmmaBoiii","score":0,"time":465.73498535156},{"id":0,"name":"\u4e38\u3066\u3044","score":0,"time":465.50039672852},{"id":0,"name":"skorpaN","score":0,"time":456.98510742188},{"id":0,"name":"WISEic","score":0,"time":324.48452758789},{"id":0,"name":"Edywang","score":0,"time":322.92251586914},{"id":0,"name":"Kein Smurf","score":0,"time":300.43759155273},{"id":0,"name":"JPG","score":0,"time":287.12509155273},{"id":0,"name":"","score":0,"time":232.17199707031},{"id":0,"name":"[udKc]connor","score":0,"time":174.10972595215},{"id":0,"name":"rufi0","score":0,"time":164.59437561035},{"id":0,"name":"Loea","score":0,"time":122.25064086914},{"id":0,"name":"","score":0,"time":106.79746246338},{"id":0,"name":"sw1tch","score":0,"time":76.874809265137},{"id":0,"name":"","score":0,"time":56.500183105469}],"port":27015,"protocol":17,"secure":1,"steam_id":90094343915677697,"steamappid":730,"version":"1.34.7.1"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Css/1_response.txt b/gameq/tests/Protocols/Providers/Css/1_response.txt new file mode 100644 index 0000000..4f84a2e Binary files /dev/null and b/gameq/tests/Protocols/Providers/Css/1_response.txt differ diff --git a/gameq/tests/Protocols/Providers/Css/1_result.json b/gameq/tests/Protocols/Providers/Css/1_result.json new file mode 100644 index 0000000..6ef4f5c --- /dev/null +++ b/gameq/tests/Protocols/Providers/Css/1_result.json @@ -0,0 +1 @@ +{"167.114.54.252:27015":{"protocol":17,"hostname":"Zombie Mod :: Unlimited Ammo :: PlagueFest.com - FastDL","map":"zm_unpanicv2_pF","game_dir":"cstrike","game_descr":"Counter-Strike: Source","steamappid":240,"num_players":41,"max_players":64,"num_bots":0,"dedicated":"d","os":"l","password":0,"secure":1,"version":"2230303","port":27015,"steam_id":85568392920039656, "keywords":"increased_maxplayers,alltalk,fastdl,ssd,zombie,mod,zm,zombie mod,stats,bunnyhopping,hlxce,hlstatsx,hlstats,gameme","game_id":240,"players":[{"id":0,"name":"venge","score":0,"time":104490.0859375},{"id":0,"name":"[The Cripples] TIMMAY","score":8,"time":14467.744140625},{"id":0,"name":"AcaPulcooo Haze","score":0,"time":9395.0380859375},{"id":0,"name":"SEValerio","score":0,"time":6925.525390625},{"id":0,"name":"zovino","score":-1,"time":5507.55859375},{"id":0,"name":"LALALALA","score":0,"time":5408.513671875},{"id":0,"name":"paulX","score":0,"time":5388.3237304688},{"id":0,"name":"UrNuBiFiSaYuAre","score":0,"time":3616.3439941406},{"id":0,"name":"The Nice Mynt (usmc)","score":0,"time":3613.8239746094},{"id":0,"name":"lym0nade","score":0,"time":3496.9741210938},{"id":0,"name":"aNIKETOS","score":-1,"time":3473.8588867188},{"id":0,"name":"Mamka","score":0,"time":3465.5639648438},{"id":0,"name":"wowisgood6","score":0,"time":2899.5239257812},{"id":0,"name":"(nF) CooL JeWW D:","score":0,"time":2699.6489257812},{"id":0,"name":"HotRod","score":6,"time":2671.1340332031},{"id":0,"name":"[pF]AgoraphobicNosebleed","score":0,"time":2585.0639648438},{"id":0,"name":"Banana","score":6,"time":2461.8991699219},{"id":0,"name":"-Kazous-","score":0,"time":1729.7508544922},{"id":0,"name":"\u043c\u0e40\u03c2\u043a\u03b5\u04af :3","score":0,"time":1647.0858154297},{"id":0,"name":"Kabeachus","score":0,"time":1530.5357666016},{"id":0,"name":"mack daddy","score":0,"time":1348.015625},{"id":0,"name":"Kittykupkakes","score":5,"time":1226.5008544922},{"id":0,"name":"-MegaPwn-","score":0,"time":1224.8657226562},{"id":0,"name":"VRAG.\u03b9ll\u03b9l\u03b9.\u03b9l.","score":0,"time":1111.4058837891},{"id":0,"name":"\u2606\u10e6Tiaminka*\u2022.\u2605","score":0,"time":1093.3306884766},{"id":0,"name":"chungbung","score":8,"time":1072.5107421875},{"id":0,"name":"[pF] Conker","score":0,"time":1071.6707763672},{"id":0,"name":"Lazewski","score":0,"time":1034.9058837891},{"id":0,"name":"Lethal","score":0,"time":976.25579833984},{"id":0,"name":"Cara, Pixie's Wife","score":3,"time":843.35577392578},{"id":0,"name":"Duluth, MN(p90 sqaud)","score":0,"time":734.19000244141},{"id":0,"name":"\u27b3Dizzie Hotep","score":-1,"time":630.07507324219},{"id":0,"name":"xZaike","score":0,"time":629.61004638672},{"id":0,"name":"Scasacs","score":0,"time":594.34490966797},{"id":0,"name":"greenmeaniez","score":6,"time":593.294921875},{"id":0,"name":"Who!","score":0,"time":430.75491333008},{"id":0,"name":"Dragonkillz","score":0,"time":317.65490722656},{"id":0,"name":"dillinger","score":0,"time":256.78506469727},{"id":0,"name":"Righteous Nab","score":0,"time":172.29010009766},{"id":0,"name":"Superkiller","score":0,"time":114.43502044678},{"id":0,"name":"vs. zombies","score":0,"time":81.374992370605}],"num_rules":101,"bot_quota":"0","connect_version":"1.2.0","coop":"0","deathmatch":"1","decalfrequency":"10","gameme_plugin_version":"4.3","gameme_webpage":"http:\/\/www.gameme.com","gs_zombiereloaded_version":"3.1","metamod_version":"1.11.0-devV","mp_allowNPCs":"1","mp_autocrosshair":"1","mp_autoteambalance":"0","mp_c4timer":"45","mp_disable_respawn_times":"0","mp_fadetoblack":"0","mp_falldamage":"0","mp_flashlight":"1","mp_footsteps":"1","mp_forceautoteam":"0","mp_forcerespawn":"1","mp_fraglimit":"0","mp_freezetime":"4","mp_friendlyfire":"0","mp_holiday_nogifts":"0","mp_hostagepenalty":"0","mp_limitteams":"0","mp_match_end_at_timelimit":"0","mp_maxrounds":"0","mp_respawnwavetime":"10.0","mp_roundtime":"5","mp_scrambleteams_auto":"1","mp_scrambleteams_auto_windifference":"2","mp_stalemate_enable":"0","mp_stalemate_meleeonly":"0","mp_startmoney":"16000","mp_teamlist":"hgrunt;scientist","mp_teamplay":"0","mp_teams_unbalance_limit":"1","mp_timelimit":"25","mp_tournament":"0","mp_weaponstay":"0","mp_winlimit":"0","nextlevel":"","r_AirboatViewDampenDamp":"1.0","r_AirboatViewDampenFreq":"7.0","r_AirboatViewZHeight":"0.0","r_JeepViewDampenDamp":"1.0","r_JeepViewDampenFreq":"7.0","r_JeepViewZHeight":"10.0","r_VehicleViewDampen":"1","sb_version":"1.4.11","smac_version":"0.8.5.1","sm_convarsuppression_version":"1.0","sm_nextmap":"zm_westwood_final","sm_nt_verison":"2.0","sm_playerinformation_version":"1.1","sm_selfmute_version":"1.0","sm_stopsound_version":"1.0.2","sm_xenforo_admins":"2.0","sourcemod_version":"1.6.0-dev+4373","sv_accelerate":"5","sv_airaccelerate":"10","sv_allowminmodels":"1","sv_alltalk":"1","sv_bounce":"0","sv_cheats":"0","sv_competitive_minspec":"0","sv_contact":"plaguefest.com","sv_enableboost":"0","sv_enablebunnyhopping":"0","sv_footsteps":"1","sv_friction":"4","sv_gravity":"800","sv_maxspeed":"500","sv_maxusrcmdprocessticks":"24","sv_noclipaccelerate":"5","sv_noclipspeed":"5","sv_nostats":"0","sv_password":"0","sv_pausable":"0","sv_rollangle":"0","sv_rollspeed":"200","sv_specaccelerate":"5","sv_specnoclip":"1","sv_specspeed":"3","sv_steamgroup":"","sv_stepsize":"18","sv_stopspeed":"75","sv_tags":"increased_maxplayers,alltalk,fastdl,ssd,zombie,mod,zm,zombie mod,stats,bunnyhopping,hlxce,hlstatsx,hlstats,gameme","sv_voiceenable":"1","sv_wateraccelerate":"10","sv_waterfriction":"1","tf_arena_max_streak":"3","tf_arena_preround_time":"10","tf_arena_round_time":"0","tf_arena_use_queue":"1","tv_enable":"0","tv_password":"0","tv_relaypassword":"0","unvac_version":"0.0.5","webshortcutsredux_version":"1.1","gq_joinlink":"steam:\/\/connect\/167.114.54.252:27015\/","gq_online":true,"gq_address":"167.114.54.252","gq_port_client":"27015","gq_port_query":27015,"gq_protocol":"source","gq_type":"css","gq_transport":"udp","gq_name":"Counter-Strike: Source"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Css/2_response.txt b/gameq/tests/Protocols/Providers/Css/2_response.txt new file mode 100644 index 0000000..487b09f Binary files /dev/null and b/gameq/tests/Protocols/Providers/Css/2_response.txt differ diff --git a/gameq/tests/Protocols/Providers/Css/2_result.json b/gameq/tests/Protocols/Providers/Css/2_result.json new file mode 100644 index 0000000..79f5320 --- /dev/null +++ b/gameq/tests/Protocols/Providers/Css/2_result.json @@ -0,0 +1 @@ +{"67.228.181.66:27015":{"protocol":17,"hostname":"[HG] 24\/7 Crackhouse Deathmatch - HeLLsGamers.com | gameME","map":"cs_crackhouse_hg_a2","game_dir":"cstrike","game_descr":"Counter-Strike: Source","steamappid":240,"num_players":28,"max_players":40,"num_bots":0,"dedicated":"d","os":"l","password":0,"secure":1,"version":"2230303","port":27015,"steam_id":90094217255135233,"keywords":"increased_maxplayers,bunnyhopping,startmoney,bots,alltalk,Crack,Crackhouse,HG,HLstatsX,HLstatsX:CE,deathmatch,fun,gameme,hellsg","game_id":240,"players":[{"id":0,"name":"Michi KK","score":619,"time":9783.6748046875},{"id":0,"name":"sG | Xlite","score":206,"time":5157.2099609375},{"id":0,"name":"|J| - Son...","score":0,"time":4875.3598632812},{"id":0,"name":"\u0441\u0434s\u0446\u0430l","score":195,"time":4493.0400390625},{"id":0,"name":"ConVict | Sero59","score":258,"time":4034.3251953125},{"id":0,"name":"\u00dcber \u2665","score":0,"time":3442.78515625},{"id":0,"name":"Muffin","score":145,"time":3434.5200195312},{"id":0,"name":"[HG] Leokes624","score":74,"time":3415.6801757812},{"id":0,"name":"greg35greg","score":101,"time":3335.1298828125},{"id":0,"name":".SlayeR","score":117,"time":2856.2700195312},{"id":0,"name":"Lincoln Osiris","score":196,"time":2843.9252929688},{"id":0,"name":"youalreadyknow","score":64,"time":2446.125},{"id":0,"name":"Dab_More","score":7,"time":2426.1899414062},{"id":0,"name":":\\nemesis:\/,,bb,,<3 Mar1an*\/\/>","score":49,"time":2055.1201171875},{"id":0,"name":"Ottomic","score":30,"time":1944.5252685547},{"id":0,"name":"usernamethe1st","score":70,"time":1913.3701171875},{"id":0,"name":"(Sir) Dezmond Vulpin","score":99,"time":1770.9602050781},{"id":0,"name":"A Z N * HMONG*","score":19,"time":1643.1151123047},{"id":0,"name":"QuantinumFuse","score":26,"time":1230.9602050781},{"id":0,"name":"Keefy Blunt","score":76,"time":1116.9898681641},{"id":0,"name":"tHe_ChRiStMaS_HoBGoBLiN","score":31,"time":760.62023925781},{"id":0,"name":"saday89","score":27,"time":672.31518554688},{"id":0,"name":"vpr","score":33,"time":562.29028320312},{"id":0,"name":"sLoWdiVe","score":23,"time":547.95007324219},{"id":0,"name":"tar-Evo[9]","score":9,"time":278.44512939453},{"id":0,"name":"ShadowMan13","score":2,"time":147.9302520752},{"id":0,"name":"joshuaJbozarth","score":0,"time":143.74522399902},{"id":0,"name":"Neon Kirby","score":1,"time":66.04517364502}],"num_rules":114,"bot_quota":"10","bp_version":"1.0.1","coop":"0","cssdm_enabled":"1","cssdm_ffa_enabled":"0","cssdm_version":"2.1.6-dev","deathmatch":"1","decalfrequency":"10","gamedesc_override_version":"1.2","gameme_plugin_version":"4.3","gameme_webpage":"http:\/\/www.gameme.com","kac_version":"1.2.2.1","macrodox_version":"1.9","manicompat_version":"1.0.1","metamod_version":"1.10.0-devV","mp_allowNPCs":"1","mp_autocrosshair":"1","mp_autoteambalance":"1","mp_c4timer":"30","mp_disable_respawn_times":"0","mp_fadetoblack":"0","mp_falldamage":"0","mp_flashlight":"1","mp_footsteps":"1","mp_forceautoteam":"0","mp_forcerespawn":"1","mp_fraglimit":"0","mp_freezetime":"2","mp_friendlyfire":"0","mp_holiday_nogifts":"0","mp_hostagepenalty":"5","mp_limitteams":"2","mp_match_end_at_timelimit":"0","mp_maxrounds":"0","mp_respawnwavetime":"10.0","mp_roundtime":"1.000000","mp_scrambleteams_auto":"1","mp_scrambleteams_auto_windifference":"2","mp_stalemate_enable":"0","mp_stalemate_meleeonly":"0","mp_startmoney":"1337","mp_teamlist":"hgrunt;scientist","mp_teamplay":"0","mp_teams_unbalance_limit":"1","mp_timelimit":"0","mp_tournament":"0","mp_weaponstay":"0","mp_winlimit":"0","nextlevel":"","r_AirboatViewDampenDamp":"1.0","r_AirboatViewDampenFreq":"7.0","r_AirboatViewZHeight":"0.0","r_JeepViewDampenDamp":"1.0","r_JeepViewDampenFreq":"7.0","r_JeepViewZHeight":"10.0","r_VehicleViewDampen":"1","sb_version":"1.4.18hg","sm_adsmysql_version":"1.2.100","sm_blockradio_version":"2.0.2","sm_cannounce_version":"1.1","sm_hive365radio_version":"3.0.3","sm_nextmap":"cs_crackhouse_hg_a2","sm_noblock":"1","sm_playersvotes_version":"1.5.0","sm_quakesounds_version":"1.8","sm_radio_spam_block_version":"1.0.0","sm_redirect_version":"1.0.0.4","sm_saysounds_hybrid_version":"3.1.8","sm_spray_version":"5.8","sm_thunder_version":"1.2","sm_webshortcuts_version":"1.0.1","sourcemod_version":"1.5.2-dev+3930","stripper_version":"1.2.2","sv_accelerate":"5","sv_airaccelerate":"100","sv_allowminmodels":"1","sv_alltalk":"1","sv_bounce":"0","sv_cheats":"0","sv_competitive_minspec":"0","sv_contact":"admin@hellsgamers.com","sv_enableboost":"0","sv_enablebunnyhopping":"1","sv_footsteps":"1","sv_friction":"4","sv_gravity":"800","sv_maxspeed":"320","sv_maxusrcmdprocessticks":"24","sv_noclipaccelerate":"5","sv_noclipspeed":"5","sv_nostats":"0","sv_password":"0","sv_pausable":"0","sv_rollangle":"0","sv_rollspeed":"200","sv_specaccelerate":"5","sv_specnoclip":"1","sv_specspeed":"3","sv_steamgroup":"","sv_stepsize":"18","sv_stopspeed":"75","sv_tags":"increased_maxplayers,bunnyhopping,startmoney,bots,alltalk,Crack,Crackhouse,HG,HLstatsX,HLstatsX:CE,deathmatch,fun,gameme,hellsg","sv_voiceenable":"1","sv_wateraccelerate":"10","sv_waterfriction":"1","tdmtb_version":"1.2","teamswitch_version":"1.3","tf_arena_max_streak":"3","tf_arena_preround_time":"10","tf_arena_round_time":"0","tf_arena_use_queue":"1","tv_enable":"0","tv_password":"0","tv_relaypassword":"0","gq_joinlink":"steam:\/\/connect\/67.228.181.66:27015\/","gq_online":true,"gq_address":"67.228.181.66","gq_port_client":"27015","gq_port_query":27015,"gq_protocol":"source","gq_type":"css","gq_transport":"udp","gq_name":"Counter-Strike: Source"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Css/3_response.txt b/gameq/tests/Protocols/Providers/Css/3_response.txt new file mode 100644 index 0000000..eec3186 Binary files /dev/null and b/gameq/tests/Protocols/Providers/Css/3_response.txt differ diff --git a/gameq/tests/Protocols/Providers/Css/3_result.json b/gameq/tests/Protocols/Providers/Css/3_result.json new file mode 100644 index 0000000..b19d374 --- /dev/null +++ b/gameq/tests/Protocols/Providers/Css/3_result.json @@ -0,0 +1 @@ +{"74.91.116.21:27015":{"protocol":17,"hostname":"Zombies Reloaded All Welcome =GGC= | FastDL | HLStatsX","map":"zm_farm3_nav72_unlim","game_dir":"cstrike","game_descr":"Zombies MOD","steamappid":240,"num_players":0,"max_players":16,"num_bots":0,"dedicated":"d","os":"l","password":0,"secure":1,"version":"2230303","port":27015,"steam_id":90094234784074758,"sourcetv_port":27020, "sourcetv_name":"ZombieTV","keywords":"alltalk","game_id":240,"num_rules":116,"adsql_serverid":"server0123","adsql_version":"1.7.8","bot_quota":"0","coop":"0","custom_chat_colors_version":"3.1.0","deathmatch":"1","decalfrequency":"60","gs_zombiereloaded_version":"3.1","hlxce_plugin_version":"1.6.19","hlxce_version":"","hlxce_webpage":"http:\/\/www.hlxcommunity.com","mce_version":"1.10.2","metamod_version":"1.10.4-devV","mp_allowNPCs":"1","mp_autocrosshair":"1","mp_autoteambalance":"0","mp_c4timer":"35","mp_disable_respawn_times":"0","mp_fadetoblack":"0","mp_falldamage":"1","mp_flashlight":"1","mp_footsteps":"1","mp_forceautoteam":"0","mp_forcerespawn":"1","mp_fraglimit":"0","mp_freezetime":"4","mp_friendlyfire":"0","mp_holiday_nogifts":"0","mp_hostagepenalty":"0","mp_limitteams":"0","mp_match_end_at_timelimit":"0","mp_maxrounds":"0","mp_respawnwavetime":"10.0","mp_roundtime":"5","mp_scrambleteams_auto":"1","mp_scrambleteams_auto_windifference":"2","mp_stalemate_enable":"0","mp_stalemate_meleeonly":"0","mp_startmoney":"800","mp_teamlist":"hgrunt;scientist","mp_teamplay":"0","mp_teams_unbalance_limit":"1","mp_timelimit":"60", "mp_tournament":"0","mp_weaponstay":"0","mp_winlimit":"0","nextlevel":"","ne_version":"1.10.0","observe_version":"1.2.4", "rtve_version":"1.10.0","r_AirboatViewDampenDamp":"1.0","r_AirboatViewDampenFreq":"7.0","r_AirboatViewZHeight":"0.0","r_JeepViewDampenDamp":"1.0","r_JeepViewDampenFreq":"7.0","r_JeepViewZHeight":"10.0","r_VehicleViewDampen":"1","sb_version":"1.4.11","scp_version":"1.1.5","sm_autorecord_version":"1.1.0","sm_cheer_version":"1.3","sm_gamevoting_version":"1.5b","sm_greneffect_version":"2.0","sm_nextmap":"ze_timesplitters_v1_2","sm_parachute_version":"2.5","sm_rconlock":"0.6.7","sm_show_damage_version":"1.0.7","sm_spraynomenu_version":"v5.8b","sm_spray_version":"5.8a","sm_tautodemoupload_version":"0.0.5","sm_teasyftp_version":"0.0.2","sourcemod_version":"1.6.3-dev+4598","steamtools_version":"0.8.3","st_gamedesc_override_version":"1.1.3","sv_accelerate":"5","sv_airaccelerate":"10","sv_allowminmodels":"1","sv_alltalk":"1","sv_bounce":"0","sv_cheats":"0","sv_competitive_minspec":"0","sv_contact":"","sv_enableboost":"0","sv_enablebunnyhopping":"0","sv_footsteps":"1","sv_friction":"4","sv_gravity":"800","sv_maxspeed":"500","sv_maxusrcmdprocessticks":"24","sv_noclipaccelerate":"5","sv_noclipspeed":"5","sv_nostats":"0","sv_password":"0","sv_pausable":"0","sv_rollangle":"0","sv_rollspeed":"200","sv_specaccelerate":"5","sv_specnoclip":"1","sv_specspeed":"3","sv_steamgroup":"","sv_stepsize":"18","sv_stopspeed":"75","sv_tags":"alltalk","sv_voiceenable":"1","sv_wateraccelerate":"10","sv_waterfriction":"1","tf_arena_max_streak":"3","tf_arena_preround_time":"10","tf_arena_round_time":"0","tf_arena_use_queue":"1","tv_enable":"1","tv_password":"0","tv_relaypassword":"0","zombiereloaded_revision":"733:d57da587271c","zr_firstzombieinmunity":"v1.0","zr_zombieclaws_version":"1.1","gq_joinlink":"steam:\/\/connect\/74.91.116.21:27015\/","gq_online":true,"gq_address":"74.91.116.21","gq_port_client":"27015","gq_port_query":27015,"gq_protocol":"source","gq_type":"css","gq_transport":"udp","gq_name":"Counter-Strike: Source"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Dayz/1_response.txt b/gameq/tests/Protocols/Providers/Dayz/1_response.txt new file mode 100644 index 0000000..f695279 Binary files /dev/null and b/gameq/tests/Protocols/Providers/Dayz/1_response.txt differ diff --git a/gameq/tests/Protocols/Providers/Dayz/1_result.json b/gameq/tests/Protocols/Providers/Dayz/1_result.json new file mode 100644 index 0000000..4c44c21 --- /dev/null +++ b/gameq/tests/Protocols/Providers/Dayz/1_result.json @@ -0,0 +1 @@ +{"96.8.115.178:2302":{"allowedBuild":"126645","dedicated":"1","game_descr":"DayZ","game_dir":"dayz","game_id":221100,"gq_address":"96.8.115.178","gq_joinlink":"steam:\/\/connect\/96.8.115.178:2302\/","gq_name":"DayZ Standalone","gq_online":true,"gq_port_client":2302,"gq_port_query":27016,"gq_protocol":"source","gq_transport":"udp","gq_type":"dayz","hostname":"Welcome to the Jungle \/\/ 24\/7 Daytime","island":"ChernarusPlus","keywords":"battleye,13:35","language":"65545","map":"DayZ_Auto","max_players":50,"num_bots":0,"num_players":46,"num_rules":8,"os":"w","password":0,"platform":"win","players":[{"id":0,"name":"Tyler","score":0,"time":5767.1040039062},{"id":0,"name":"Micribio","score":0,"time":5533.2846679688},{"id":0,"name":"Michael","score":0,"time":5178.6811523438},{"id":0,"name":"(ESPT)Leonidas","score":0,"time":4698.4501953125},{"id":0,"name":"|FoNz| Rowland","score":0,"time":4562.1499023438},{"id":0,"name":"Jack","score":0,"time":4088.7685546875},{"id":0,"name":"Craig","score":0,"time":3019.9365234375},{"id":0,"name":"[CM]KoreanBR","score":0,"time":2778.9191894531},{"id":0,"name":"Albert Delinco","score":0,"time":2578.7866210938},{"id":0,"name":"[MTN]Anthony","score":0,"time":2435.4924316406},{"id":0,"name":"Ronan","score":0,"time":2424.6340332031},{"id":0,"name":"Zaycupcakes","score":0,"time":2392.3413085938},{"id":0,"name":"Wellington","score":0,"time":2262.9614257812},{"id":0,"name":"((+N+))Edum4x","score":0,"time":2010.4832763672},{"id":0,"name":"[CTF]DANVIANA","score":0,"time":1792.1412353516},{"id":0,"name":"[CTF]Forasteiro","score":0,"time":1785.3283691406},{"id":0,"name":"Mr Dinkens","score":0,"time":1655.0341796875},{"id":0,"name":"(ESPT)Legolas","score":0,"time":1617.5574951172},{"id":0,"name":"Christian","score":0,"time":1613.541015625},{"id":0,"name":"[KGB] weasels","score":0,"time":1609.2819824219},{"id":0,"name":"Syke","score":0,"time":1565.7698974609},{"id":0,"name":"AsianBigMac","score":0,"time":1548.1004638672},{"id":0,"name":"ButtFucker9000","score":0,"time":1516.6192626953},{"id":0,"name":"Neto","score":0,"time":1513.8000488281},{"id":0,"name":"LeMaO","score":0,"time":1414.1920166016},{"id":0,"name":"MataTuto","score":0,"time":1398.6380615234},{"id":0,"name":"Lucas","score":0,"time":1110.2631835938},{"id":0,"name":"[SM]OfficalREKT","score":0,"time":1029.6437988281},{"id":0,"name":"7pm","score":0,"time":998.10003662109},{"id":0,"name":"Bruno","score":0,"time":997.69445800781},{"id":0,"name":"Choko","score":0,"time":931.94805908203},{"id":0,"name":"HK416","score":0,"time":889.65240478516},{"id":0,"name":"John","score":0,"time":862.78814697266},{"id":0,"name":"rockerBR","score":0,"time":851.68664550781},{"id":0,"name":"Creator","score":0,"time":703.94976806641},{"id":0,"name":"jeison_ga","score":0,"time":686.74279785156},{"id":0,"name":"darre_000","score":0,"time":591.30004882812},{"id":0,"name":"Mike","score":0,"time":585.87652587891},{"id":0,"name":"xinandes","score":0,"time":546.88122558594},{"id":0,"name":"QuackerPlays","score":0,"time":496.46221923828},{"id":0,"name":"wTD * pic4black","score":0,"time":449.4821472168},{"id":0,"name":"Turambey","score":0,"time":263.72207641602},{"id":0,"name":"LEGITPUMA","score":0,"time":186.18351745605},{"id":0,"name":"JayQ","score":0,"time":164.7335357666},{"id":0,"name":"4F4L","score":0,"time":103.49153900146},{"id":0,"name":"[URSS] TROUS","score":0,"time":20.037258148193}],"port":2302,"protocol":17,"requiredBuild":"126645","requiredVersion":"54","secure":1,"steam_id":90094491751706632,"steamappid":0,"timeLeft":"15","version":"0.54.126645"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Dayz/2_response.txt b/gameq/tests/Protocols/Providers/Dayz/2_response.txt new file mode 100644 index 0000000..2ee7a76 Binary files /dev/null and b/gameq/tests/Protocols/Providers/Dayz/2_response.txt differ diff --git a/gameq/tests/Protocols/Providers/Dayz/2_result.json b/gameq/tests/Protocols/Providers/Dayz/2_result.json new file mode 100644 index 0000000..10c51c9 --- /dev/null +++ b/gameq/tests/Protocols/Providers/Dayz/2_result.json @@ -0,0 +1 @@ +{"199.116.113.150:2302":{"allowedBuild":"126384","dedicated":"1","game_descr":"DayZ","game_dir":"dayz","game_id":221100,"gq_address":"199.116.113.150","gq_joinlink":"steam:\/\/connect\/199.116.113.150:2302\/","gq_name":"DayZ Standalone","gq_online":true,"gq_port_client":2302,"gq_port_query":27016,"gq_protocol":"source","gq_transport":"udp","gq_type":"dayz","hostname":"Badboyz - Yeah v know waiting for tick.reply","island":"ChernarusPlus","keywords":"battleye,no3rd,privHive,10:42","language":"65545","map":"DayZ_Auto","max_players":49,"num_bots":0,"num_players":0,"num_rules":8,"os":"w","password":0,"platform":"win","port":2302,"protocol":17,"requiredBuild":"125720","requiredVersion":"54","secure":1,"steam_id":90094492357054464,"steamappid":0,"timeLeft":"15","version":"0.54.126645"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Dayzmod/1_response.txt b/gameq/tests/Protocols/Providers/Dayzmod/1_response.txt new file mode 100644 index 0000000..72616b0 Binary files /dev/null and b/gameq/tests/Protocols/Providers/Dayzmod/1_response.txt differ diff --git a/gameq/tests/Protocols/Providers/Dayzmod/1_result.json b/gameq/tests/Protocols/Providers/Dayzmod/1_result.json new file mode 100644 index 0000000..3a8faf5 --- /dev/null +++ b/gameq/tests/Protocols/Providers/Dayzmod/1_result.json @@ -0,0 +1 @@ +{"162.248.89.7:2332":{"dedicated":"d","game_descr":"DayZMod","game_dir":"arma2arrowpc","game_id":224580,"gq_address":"162.248.89.7","gq_joinlink":"steam:\/\/connect\/162.248.89.7:2332\/","gq_name":"DayZ Mod","gq_online":true,"gq_port_client":2332,"gq_port_query":2333,"gq_protocol":"source","gq_transport":"udp","gq_type":"dayzmod","hash":"35968159A8B1EE9469290C2FB5261A3FFB8E8E5C","hostname":"[INS] CustomBaseBuilding, WalkingZeds, AImission, 200+Vehicles","keywords":"bt,r163,n125548,s7,i1,mf,lf,vt,dt,tcoop,g65545,c2147483647-2147483647,pw,","map":"chernarus","max_players":50,"modHashes:0-2":";BAF v. 1.03;PMC v. 1.02;5284a2e9b46f15cb01b9334ce982af494184671b;64964908fba4386e250517b5c48c967d67a863d7;4839fc40396fae61ab2f","modHashes:1-2":"5e2d7ac31cd6f25169f1;da39a3ee5e6b4b0d3255bfef95601890afd80709;","modNames:0-2":"Arma 2;Arma 2: British Armed Forces (Lite);Arma 2: Private Military Company (Lite);Arma 2: Operation Arrowhead;ArmA 2: DayZ Mod","modNames:1-2":";@Hive;@Arma2NET;","num_bots":0,"num_players":2,"num_rules":9,"os":"w","param1":"0","param2":"0","password":0,"players":[{"id":0,"name":"WOLF","score":0,"time":847.86260986328},{"id":0,"name":"vagrantvidz","score":0,"time":766.36975097656}],"port":2332,"protocol":17,"secure":0,"sigNames:0-1":"bi;bi2;DayZ_1.9.0;","steam_id":90120335722862592,"steamappid":0,"timeLeft":"15","version":"1.63.131129"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Dayzmod/2_response.txt b/gameq/tests/Protocols/Providers/Dayzmod/2_response.txt new file mode 100644 index 0000000..777fee0 Binary files /dev/null and b/gameq/tests/Protocols/Providers/Dayzmod/2_response.txt differ diff --git a/gameq/tests/Protocols/Providers/Dayzmod/2_result.json b/gameq/tests/Protocols/Providers/Dayzmod/2_result.json new file mode 100644 index 0000000..6a65479 --- /dev/null +++ b/gameq/tests/Protocols/Providers/Dayzmod/2_result.json @@ -0,0 +1 @@ +{"192.223.24.141:2302":{"dedicated":"d","game_descr":"DayZMod","game_dir":"arma2arrowpc","game_id":224580,"gq_address":"192.223.24.141","gq_joinlink":"steam:\/\/connect\/192.223.24.141:2302\/","gq_name":"DayZ Mod","gq_online":true,"gq_port_client":2302,"gq_port_query":2303,"gq_protocol":"source","gq_transport":"udp","gq_type":"dayzmod","hash":"E73803C6D51B70B0EE4A69F53A56153237932781","hostname":"The Dead Return 1.9.0|Vanilla+Groups+Missions+POI+Vehs","keywords":"bt,r163,n131129,s7,i2,mf,lf,vt,dt,tcoop,g65545,c2147483647-2147483647,pw,","map":"Chernarus","max_players":40,"modHashes:0-2":";595110b134250f50fb0a1069e169c3226b3c5f49;BAF v. 1.03;PMC v. 1.02;64964908fba4386e250517b5c48c967d67a863d7;da39a3ee5e6b4b0d3255","modHashes:1-2":"bfef95601890afd80709;","modNames:0-2":"Arma 2;Arma 2: Operation Arrowhead;Arma 2: British Armed Forces (Lite);Arma 2: Private Military Company (Lite);ArmA 2: DayZ Mod","modNames:1-2":";@Hive;","num_bots":0,"num_players":5,"num_rules":9,"os":"w","param1":"0","param2":"0","password":0,"players":[{"id":0,"name":"Ignak","score":4,"time":11871.586914062},{"id":0,"name":"Crowen","score":101,"time":11531.525390625},{"id":0,"name":"Galax","score":0,"time":7691.9174804688},{"id":0,"name":"Link","score":30,"time":3574.1176757812},{"id":0,"name":"RogerMcDodger","score":5,"time":2029.6378173828}],"port":2302,"protocol":17,"secure":0,"sigNames:0-1":"bi;bi2;DayZ_1.9.0;","steam_id":90120330949830658,"steamappid":0,"timeLeft":"15","version":"1.63.131129"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Dod/1_response.txt b/gameq/tests/Protocols/Providers/Dod/1_response.txt new file mode 100644 index 0000000..f61ca8d Binary files /dev/null and b/gameq/tests/Protocols/Providers/Dod/1_response.txt differ diff --git a/gameq/tests/Protocols/Providers/Dod/1_result.json b/gameq/tests/Protocols/Providers/Dod/1_result.json new file mode 100644 index 0000000..080a7c5 --- /dev/null +++ b/gameq/tests/Protocols/Providers/Dod/1_result.json @@ -0,0 +1 @@ +{"192.223.29.57:27015":{"DOD_FieldMedic":"v2.0 by Vet(3TT3V)","DOD_WeaponSprites":"v1.2 by Vet(3TT3V)","DoD_Killing_Spree":"v3.0 by Vet(3TT3V)","MESPEC":"Version 3.0 BY Blobby & Feuersturm","SynInstantSpawn":"v1.001 by Synthetic - www.rivurs.com","amx_client_languages":"1","amx_timeleft":"34:26","amxbans_version":"6.0.3","amxmodx_version":"1.8.2","coop":"0","deathmatch":"1","dedicated":"d","dod_blockexploits_stats":"v6.0 - by diamond-optic (www.AvaMods.com)","dod_bot_dmg_stats":"v1.0 Dr.G - www.clan-go.net","dod_fg_stats":"v1.0 by Dr.G","dod_killinfo_stats":"0.1","dod_mg_extrarecoil_stats":"1.0","dod_mgclass_stats":"2.0","dod_rocketclass_stats":"2.0","dod_teammanager_plugin":"Version 1.4 by FeuerSturm | www.dodplugins.net","dod_tkrevenge_plugin":"Version 1.2f1 by FeuerSturm | Refactored by Fysiks","edgefriction":"2","game_descr":"Day of Defeat","game_dir":"dod","game_id":30,"gameme_plugin_version":"2.2 (HL1)","gameme_webpage":"http:\/\/www.gameme.com","gq_address":"192.223.29.57","gq_joinlink":"steam:\/\/connect\/192.223.29.57:27015\/","gq_name":"Day of Defeat","gq_online":true,"gq_port_client":27015,"gq_port_query":27015,"gq_protocol":"source","gq_transport":"udp","gq_type":"dod","hostname":"Merrill's Marauders | Caen 24\/7 | www.475thrangers.com","map":"dod_caen","max_players":32,"max_queries_sec":"1","max_queries_sec_global":"1","max_queries_window":"1","metamod_version":"1.21p37","mp_clan_match":"0","mp_clan_match_warmup":"0","mp_clan_ready_signal":"ready","mp_clan_readyrestart":"0","mp_clan_respawntime":"0","mp_clan_restartround":"0","mp_clan_scoring":"0","mp_clan_scoring_bonus_allies":"-1","mp_clan_scoring_bonus_axis":"-1","mp_clan_scoring_delay":"60","mp_clan_scoring_values_allies":"111111","mp_clan_scoring_values_axis":"111111","mp_clan_timer":"20","mp_consistency":"1","mp_fadetoblack":"0","mp_falldamage":"1","mp_flashlight":"1","mp_footsteps":"1","mp_forcecamera":"1","mp_forcechasecam":"1","mp_friendlyfire":"1","mp_limitallies30cal":"2","mp_limitalliesbar":"6","mp_limitalliesbazooka":"2","mp_limitalliescarbine":"6","mp_limitalliesgarand":"8","mp_limitalliesgreasegun":"4","mp_limitalliesmortar":"-1","mp_limitalliesspring":"2","mp_limitalliesthompson":"6","mp_limitaxisfg42":"4","mp_limitaxisfg42s":"1","mp_limitaxisk43":"6","mp_limitaxiskar":"8","mp_limitaxismg34":"2","mp_limitaxismg42":"2","mp_limitaxismortar":"-1","mp_limitaxismp40":"6","mp_limitaxismp44":"6","mp_limitaxispschreck":"2","mp_limitaxisscopedkar":"2","mp_limitbritassault":"8","mp_limitbritlight":"10","mp_limitbritmg":"6","mp_limitbritmortar":"-1","mp_limitbritpiat":"-1","mp_limitbritsniper":"0","mp_logfile":"1","mp_timelimit":"690.000000","num_bots":4,"num_players":16,"num_rules":101,"os":"w","password":0,"pausable":"0","players":[{"id":0,"name":"[M|475|M] PNCO {A}","score":137,"time":8554.1748046875},{"id":0,"name":"batman 777","score":1,"time":2605.9836425781},{"id":0,"name":"sentenced","score":20,"time":1502.8463134766},{"id":0,"name":"|EVIL|DOGFOOD","score":16,"time":1442.8896484375},{"id":0,"name":"VennoN","score":11,"time":1276.1446533203},{"id":0,"name":"fatie","score":12,"time":920.21661376953},{"id":0,"name":"timbit","score":5,"time":336.72576904297},{"id":0,"name":"numbnut","score":0,"time":271.04238891602},{"id":0,"name":"-|SIN|-AirForceOne*GG*","score":6,"time":165.18807983398},{"id":0,"name":"neXus","score":0,"time":89.273345947266},{"id":0,"name":"Mister","score":0,"time":23.643856048584},{"id":0,"name":"Arther","score":15,"time":125802.3046875},{"id":0,"name":"Saint.Rigid","score":4,"time":125802.3046875},{"id":0,"name":"Cats.Meow","score":13,"time":125802.3046875},{"id":0,"name":"Waldo","score":4,"time":125802.3046875},{"id":0,"name":"Father_Biff","score":0,"time":125802.3046875}],"port":27015,"protocol":48,"secure":1,"steam_id":90094473234358277,"steamappid":30,"sv_accelerate":"10","sv_aim":"0","sv_airaccelerate":"10","sv_allowupload":"1","sv_alltalk":"0","sv_bounce":"1","sv_cheats":"0","sv_clienttrace":"3.5","sv_contact":"","sv_friction":"4","sv_gravity":"800","sv_logblocks":"0","sv_maxrate":"0","sv_maxspeed":"500","sv_minrate":"100000","sv_password":"0","sv_proxies":"0","sv_stepsize":"18","sv_stopspeed":"100","sv_uploadmax":"0.5","sv_voiceenable":"1","sv_wateraccelerate":"10","sv_waterfriction":"1","syns_weapon_mod":"v2.001 by Synthetic - www.rivurs.com","version":"1.1.2.6"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Dod/2_response.txt b/gameq/tests/Protocols/Providers/Dod/2_response.txt new file mode 100644 index 0000000..d01af6f Binary files /dev/null and b/gameq/tests/Protocols/Providers/Dod/2_response.txt differ diff --git a/gameq/tests/Protocols/Providers/Dod/2_result.json b/gameq/tests/Protocols/Providers/Dod/2_result.json new file mode 100644 index 0000000..bc9d481 --- /dev/null +++ b/gameq/tests/Protocols/Providers/Dod/2_result.json @@ -0,0 +1 @@ +{"74.91.119.59:27015":{"DOD_FieldMedic":"v2.1H by Vet(3TT3V)","DOD_RespawnCtrl":"v1.6 by Vet(3TT3V)","DOD_SingleCaps":"v1.6 by Vet(3TT3V)","Deags_Map_Manage":"3.24","Syns_No_Scope_Notifier":"v2.001 www.rivurs.com","Syns_Shrike_Control":"Version 1.4 by Synthetic - www.weaksaucedod.com","amx_client_languages":"1","amx_language":"Sl","amx_nextmap":"dod_trainskill","amxmodx_version":"1.8.2","coop":"0","deathmatch":"1","dedicated":"d","dod_blockexploits_stats":"v6.0 - by diamond-optic (www.AvaMods.com)","dod_gore_custom_stats":"1.7","dod_ir_stats":"v1.0 by AMXX DoD Team","dod_joinquitswitch_msg":"v2.0 - by diamond-optic (www.AvaMods.com)","dod_meleebonus_stats":"v1.0 - by diamond-optic (www.AvaMods.com)","dod_teammanager_plugin":"Version 1.4 by FeuerSturm | www.dodplugins.net","edgefriction":"2","game_descr":"Day of Defeat","game_dir":"dod","game_id":30,"gg_version":"2.00B3","gm_toggle":"0","gq_address":"74.91.119.59","gq_joinlink":"steam:\/\/connect\/74.91.119.59:27015\/","gq_name":"Day of Defeat","gq_online":true,"gq_port_client":27015,"gq_port_query":27015,"gq_protocol":"source","gq_transport":"udp","gq_type":"dod","hostname":" | Maniac Gungame | ~MG* || May Cause Seizures ||","map":"dod_orange_2","max_players":32,"max_queries_sec":"1","max_queries_sec_global":"1","max_queries_window":"1","metamod_version":"1.21-am","mp_clan_match":"0","mp_clan_match_warmup":"0","mp_clan_ready_signal":"ready","mp_clan_readyrestart":"0","mp_clan_respawntime":"0","mp_clan_restartround":"0","mp_clan_scoring":"0","mp_clan_scoring_bonus_allies":"-1","mp_clan_scoring_bonus_axis":"-1","mp_clan_scoring_delay":"60","mp_clan_scoring_values_allies":"111111","mp_clan_scoring_values_axis":"111111","mp_clan_timer":"20","mp_consistency":"1","mp_fadetoblack":"0","mp_falldamage":"1","mp_flashlight":"1","mp_footsteps":"1","mp_forcecamera":"0","mp_forcechasecam":"1","mp_friendlyfire":"0","mp_limitallies30cal":"15","mp_limitalliesbar":"15","mp_limitalliesbazooka":"15","mp_limitalliescarbine":"15","mp_limitalliesgarand":"15","mp_limitalliesgreasegun":"15","mp_limitalliesmortar":"-1","mp_limitalliesspring":"15","mp_limitalliesthompson":"15","mp_limitaxisfg42":"15","mp_limitaxisfg42s":"15","mp_limitaxisk43":"15","mp_limitaxiskar":"15","mp_limitaxismg34":"15","mp_limitaxismg42":"0","mp_limitaxismortar":"-1","mp_limitaxismp40":"-1","mp_limitaxismp44":"15","mp_limitaxispschreck":"15","mp_limitaxisscopedkar":"15","mp_limitbritassault":"15","mp_limitbritlight":"15","mp_limitbritmg":"15","mp_limitbritmortar":"-1","mp_limitbritpiat":"15","mp_limitbritsniper":"15","mp_logfile":"1","mp_maxrounds":"0","mp_timelimit":"60","num_bots":0,"num_players":13,"num_rules":100,"os":"w","password":0,"pausable":"0","players":[{"id":0,"name":"Merlin ~MG*","score":4,"time":2908.6379394531},{"id":0,"name":"Fruit Loops","score":0,"time":175.27197265625},{"id":0,"name":"Negative! Ashe (MI)","score":8,"time":174.37005615234},{"id":0,"name":"BOHICA","score":6,"time":173.79963684082},{"id":0,"name":"EZ Rider","score":5,"time":173.50428771973},{"id":0,"name":"{H.A.T} 707.NoSIR!!? ~MG*","score":0,"time":172.73529052734},{"id":0,"name":"Irracional","score":7,"time":172.09492492676},{"id":0,"name":"Rigisamos","score":3,"time":172.00497436523},{"id":0,"name":"SeUX~MG*","score":7,"time":171.71322631836},{"id":0,"name":"20Fuder","score":2,"time":167.95329284668},{"id":0,"name":"Fran","score":0,"time":166.60006713867},{"id":0,"name":"Sherry","score":0,"time":74.753845214844},{"id":0,"name":"VennoN","score":0,"time":5.6231269836426}],"port":27015,"protocol":48,"sanksounds_version":"1.7.1","secure":1,"steam_id":90094482672542725,"steamappid":30,"sv_accelerate":"10","sv_aim":"0","sv_airaccelerate":"10","sv_allowupload":"1","sv_alltalk":"1","sv_bounce":"1","sv_cheats":"0","sv_clienttrace":"3.5","sv_contact":"","sv_friction":"4","sv_gravity":"700","sv_logblocks":"0","sv_maxrate":"0","sv_maxspeed":"500","sv_minrate":"100000","sv_password":"0","sv_proxies":"1","sv_stepsize":"18","sv_stopspeed":"100","sv_uploadmax":"0.5","sv_voiceenable":"1","sv_wateraccelerate":"10","sv_waterfriction":"1","version":"1.1.2.6"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Dods/1_response.txt b/gameq/tests/Protocols/Providers/Dods/1_response.txt new file mode 100644 index 0000000..cbe83e0 Binary files /dev/null and b/gameq/tests/Protocols/Providers/Dods/1_response.txt differ diff --git a/gameq/tests/Protocols/Providers/Dods/1_result.json b/gameq/tests/Protocols/Providers/Dods/1_result.json new file mode 100644 index 0000000..937be11 --- /dev/null +++ b/gameq/tests/Protocols/Providers/Dods/1_result.json @@ -0,0 +1 @@ +{"162.252.82.28:27015":{"coop":"0","deathmatch":"1","decalfrequency":"10","dedicated":"d","dod_tms_addons":"","dod_tms_version":"1.1","game_descr":"Day of Defeat: Source","game_dir":"dod","game_id":300,"gameme_plugin_version":"4.2","gameme_webpage":"http:\/\/www.gameme.com","gq_address":"162.252.82.28","gq_joinlink":"steam:\/\/connect\/162.252.82.28:27015\/","gq_name":"Day of Defeat: Source","gq_online":true,"gq_port_client":27015,"gq_port_query":27015,"gq_protocol":"source","gq_transport":"udp","gq_type":"dods","hostname":" 24\/7 =(eGO)= AVALANCHE NO BOTS! | GameME","keywords":"fadetoblack,gameME","map":"dod_avalanche","max_players":32,"metamod_version":"1.10.5-devV","mp_allowNPCs":"1","mp_autocrosshair":"1","mp_fadetoblack":"1","mp_falldamage":"0","mp_flashlight":"1","mp_footsteps":"1","mp_forcerespawn":"1","mp_fraglimit":"0","mp_friendlyfire":"0","mp_teamlist":"hgrunt;scientist","mp_teamplay":"0","mp_timelimit":"180","mp_weaponstay":"0","mp_winlimit":"0","nextlevel":"","num_bots":0,"num_players":23,"num_rules":72,"os":"l","password":0,"players":[{"id":0,"name":"\"Core Lokt\"","score":0,"time":7023.8969726562},{"id":0,"name":"x|x Kiro","score":0,"time":6270.2368164062},{"id":0,"name":"top_gun","score":2,"time":5180.8618164062},{"id":0,"name":"Stealthfire","score":8,"time":3437.6818847656},{"id":0,"name":"=(eG)= Jakabok Botch","score":40,"time":3398.8767089844},{"id":0,"name":"=Gp.Nat=","score":2,"time":3006.8818359375},{"id":0,"name":"jerkstore","score":6,"time":2626.2268066406},{"id":0,"name":"Killed_By_Frank","score":2,"time":2334.8068847656},{"id":0,"name":"0bloodshoteyez0","score":0,"time":1256.5471191406},{"id":0,"name":"Zero Apologies","score":5,"time":1193.3969726562},{"id":0,"name":"[*BUNG*] Throbbing Tony","score":0,"time":1123.5870361328},{"id":0,"name":"dmsizzle","score":7,"time":945.82202148438},{"id":0,"name":"Devilz","score":14,"time":917.95202636719},{"id":0,"name":"TERRIBLE IDIOT","score":15,"time":875.56182861328},{"id":0,"name":"JimBeamDistillingCo.","score":12,"time":737.29193115234},{"id":0,"name":"edm.","score":12,"time":642.07208251953},{"id":0,"name":"Taylor Swift","score":2,"time":577.19696044922},{"id":0,"name":"=(e)=™ Dr. Phil's Moustache","score":1,"time":468.17691040039},{"id":0,"name":"=(e)=™dANNyBoY(=","score":3,"time":465.71673583984},{"id":0,"name":"Stumonster","score":2,"time":436.40689086914},{"id":0,"name":"I am Groot","score":1,"time":287.71206665039},{"id":0,"name":"+++ ADERLASS +++ ^^òÓ^^","score":0,"time":263.75686645508},{"id":0,"name":"gnomasaur","score":5,"time":80.264739990234}],"port":27015,"protocol":17,"r_AirboatViewDampenDamp":"1.0","r_AirboatViewDampenFreq":"7.0","r_AirboatViewZHeight":"0.0","r_JeepViewDampenDamp":"1.0","r_JeepViewDampenFreq":"7.0","r_JeepViewZHeight":"10.0","r_VehicleViewDampen":"1","sc_module_version":"1.0.1.0","sc_version":"1.0.1.0","secure":1,"sm_allinfo_version":"2.0.0","sm_dod_pistols_version":"1.0.102","sm_medic_version":"1.0.109","sm_nextmap":"dod_avalanche","sm_rate_version":"0.2","sm_save_scores_version":"1.1.0","smac_version":"0.8.4.0","sourcemod_version":"1.6.4-dev+4609","steam_id":85568392920045698,"steamappid":300,"stripper_version":"1.2.2","sv_accelerate":"10","sv_airaccelerate":"10","sv_alltalk":"0","sv_bounce":"0","sv_cheats":"0","sv_contact":"edgegamers@gmail.com","sv_footsteps":"1","sv_friction":"8","sv_gravity":"800","sv_maxspeed":"320","sv_maxusrcmdprocessticks":"24","sv_noclipaccelerate":"5","sv_noclipspeed":"5","sv_password":"0","sv_pausable":"0","sv_rollangle":"0","sv_rollspeed":"200","sv_specaccelerate":"5","sv_specnoclip":"1","sv_specspeed":"3","sv_steamgroup":"","sv_stepsize":"18","sv_stopspeed":"50","sv_tags":"fadetoblack,gameME","sv_voiceenable":"1","sv_wateraccelerate":"10","sv_waterfriction":"1","teamswitch_version":"1.3","tv_enable":"0","tv_password":"0","tv_relaypassword":"0","version":"2230303"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Dods/2_response.txt b/gameq/tests/Protocols/Providers/Dods/2_response.txt new file mode 100644 index 0000000..a18a840 Binary files /dev/null and b/gameq/tests/Protocols/Providers/Dods/2_response.txt differ diff --git a/gameq/tests/Protocols/Providers/Dods/2_result.json b/gameq/tests/Protocols/Providers/Dods/2_result.json new file mode 100644 index 0000000..c3b74e8 --- /dev/null +++ b/gameq/tests/Protocols/Providers/Dods/2_result.json @@ -0,0 +1 @@ +{"74.91.119.178:27015":{"ban_disconnected_ver":"1.04","connect_version":"1.2.0","coop":"0","daf_version":"Version 4b of SourceOP.com DoS Attack Fix Plugin","deathmatch":"1","decalfrequency":"60","dedicated":"d","dod_medic_version":"1.2","dod_reloadgarand_version":"1.1","game_descr":"Day of Defeat: Source","game_dir":"dod","game_id":300,"gq_address":"74.91.119.178","gq_joinlink":"steam:\/\/connect\/74.91.119.178:27015\/","gq_name":"Day of Defeat: Source","gq_online":true,"gq_port_client":27015,"gq_port_query":27015,"gq_protocol":"source","gq_transport":"udp","gq_type":"dods","hlxce_plugin_version":"1.6.6.1","hlxce_version":"1.6.19","hlxce_webpage":"http:\/\/adultgamerscommunity.box1.hlxcehost.com\/","hostname":"Adult Gamers Community - DOD:S Gungame","keywords":"alltalk,bombs,flamethrowers,gungame,jetpacks,medic,parachutes","kid_version":"0.9","map":"dod_steeltower_final","max_players":28,"metamod_version":"1.10.4V","mp_allowNPCs":"1","mp_autocrosshair":"1","mp_fadetoblack":"0","mp_falldamage":"1","mp_flashlight":"1","mp_footsteps":"1","mp_forcerespawn":"1","mp_fraglimit":"0","mp_friendlyfire":"1","mp_teamlist":"hgrunt;scientist","mp_teamplay":"0","mp_timelimit":"30","mp_weaponstay":"0","mp_winlimit":"0","nextlevel":"","num_bots":0,"num_players":28,"num_rules":97,"os":"w","password":0,"players":[{"id":0,"name":"(( CRAYOLA (( >","score":0,"time":5069.513671875},{"id":0,"name":"=LI= Mrs.Ax(NoMic)","score":0,"time":5062.912109375},{"id":0,"name":"Armageddon","score":0,"time":5062.7021484375},{"id":0,"name":"칫풉","score":0,"time":5058.3520507812},{"id":0,"name":"rockandrolliswar","score":1,"time":4016.388671875},{"id":0,"name":"xx_lvl4rk0s_xx","score":0,"time":3778.1809082031},{"id":0,"name":"The Ozz","score":0,"time":3173.5705566406},{"id":0,"name":"Hoyt ProElite","score":2,"time":2016.6986083984},{"id":0,"name":"Bloody L.","score":0,"time":1977.623046875},{"id":0,"name":"MargaL_NYC","score":0,"time":1547.5383300781},{"id":0,"name":"Nucky Thompson","score":0,"time":1273.6320800781},{"id":0,"name":"syk0","score":1,"time":1262.1418457031},{"id":0,"name":"BigChickenChit","score":0,"time":1132.4390869141},{"id":0,"name":"Dghad","score":0,"time":993.50842285156},{"id":0,"name":"boscoe82","score":0,"time":751.24237060547},{"id":0,"name":"drunken nublet","score":0,"time":578.90948486328},{"id":0,"name":"-=?=-VT Jerry 4 2 o","score":0,"time":545.37072753906},{"id":0,"name":"[UCHS] The Hitmann","score":0,"time":531.19519042969},{"id":0,"name":"Modal_Soul","score":0,"time":491.47546386719},{"id":0,"name":"Jimmeh242","score":1,"time":464.25030517578},{"id":0,"name":"[THE] Nails","score":0,"time":367.57540893555},{"id":0,"name":"Disciple","score":0,"time":323.62551879883},{"id":0,"name":"Spetz929rr","score":0,"time":270.71331787109},{"id":0,"name":"yankeemike2011","score":0,"time":259.47882080078},{"id":0,"name":"MisTer TrOyEnS","score":0,"time":257.93374633789},{"id":0,"name":"Stanley Tweedle","score":0,"time":77.258369445801},{"id":0,"name":"pikl","score":0,"time":53.768375396729},{"id":0,"name":"WARPATH","score":2,"time":27.068267822266}],"port":27015,"protocol":17,"r_AirboatViewDampenDamp":"1.0","r_AirboatViewDampenFreq":"7.0","r_AirboatViewZHeight":"0.0","r_JeepViewDampenDamp":"1.0","r_JeepViewDampenFreq":"7.0","r_JeepViewZHeight":"10.0","r_VehicleViewDampen":"1","sb_version":"1.4.12","sbchecker_version":"1.0.0","secure":1,"sm_advertisements_version":"0.5.5","sm_afkm_version":"3.4.3","sm_antiratehack_version":"1.1","sm_dod_bomb_version":"1.2","sm_dod_xlog_version":"1.4","sm_downloader_version":"1.4","sm_evilmirror_version":"1.0.102","sm_evilpimpslap_version":"1.0.102","sm_explode_version":"0.1","sm_flame_version":"1.0.102","sm_glow_version":"1.1b","sm_gungame_version":"4.3","sm_instantrespawn_delay":"1.5","sm_instantrespawn_enabled":"1","sm_instantrespawn_maxplayers":"0","sm_instantrespawn_selectclass":"1","sm_instantrespawn_version":"1.4","sm_jetpack":"0","sm_jetpack_onspawn":"1","sm_jetpack_version":"2.0.5","sm_nextmap":"dod_orange_fighting_place","sm_parachute_version":"2.0","sm_saysounds_hybrid_version":"4.0.3","sm_speedup_version":"1.0","sm_spray_version":"5.8a","sm_stkp_version":"1.0.3","sm_webshortcuts_version":"1.0.1","smac_version":"0.8.2.4","sourcemod_version":"1.7.0","steam_id":90094492493104136,"steamappid":300,"superlogs_dods_version":"1.1.3","sv_accelerate":"10","sv_airaccelerate":"10","sv_alltalk":"1","sv_bounce":"0","sv_cheats":"0","sv_contact":"webmaster@adultgamerscommunity.com","sv_footsteps":"1","sv_friction":"8","sv_gravity":"800","sv_maxspeed":"320","sv_maxusrcmdprocessticks":"24","sv_noclipaccelerate":"5","sv_noclipspeed":"5","sv_password":"0","sv_pausable":"0","sv_rollangle":"0","sv_rollspeed":"200","sv_specaccelerate":"5","sv_specnoclip":"1","sv_specspeed":"3","sv_steamgroup":"","sv_stepsize":"18","sv_stopspeed":"50","sv_tags":"alltalk,bombs,flamethrowers,gungame,jetpacks,medic,parachutes","sv_voiceenable":"1","sv_wateraccelerate":"10","sv_waterfriction":"1","tv_enable":"0","tv_password":"0","tv_relaypassword":"0","version":"2230303"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Dow/1_response.txt b/gameq/tests/Protocols/Providers/Dow/1_response.txt new file mode 100644 index 0000000..cd4d502 Binary files /dev/null and b/gameq/tests/Protocols/Providers/Dow/1_response.txt differ diff --git a/gameq/tests/Protocols/Providers/Dow/1_result.json b/gameq/tests/Protocols/Providers/Dow/1_result.json new file mode 100644 index 0000000..498700a --- /dev/null +++ b/gameq/tests/Protocols/Providers/Dow/1_result.json @@ -0,0 +1 @@ +{"199.60.101.90:27015":{"BeaconPort_i":"15000","F_i":"0","G_s":"Domination","MPN_s":"dow_carentan","N_i":"5","ONM_s":"Driven Arts US","OWNINGID":"90106191542138888","OWNINGNAME":"90106191542138888","P2PADDR":"90106191542138888","P2PPORT":"7777","P_i":"32","SESSIONFLAGS":"520","V_s":"1.0.3.3","dedicated":"d","game_descr":"Unreal Test!","game_dir":"unrealtest","game_id":454350,"gq_address":"199.60.101.90","gq_joinlink":"steam:\/\/connect\/199.60.101.90:27015\/","gq_name":"Days of War","gq_online":true,"gq_port_client":27015,"gq_port_query":27015,"gq_protocol":"source","gq_transport":"udp","gq_type":"dow","hostname":"90106191542138888","keywords":"BUILDID:211023433,OWNINGID:90106191542138888,OWNINGNAME:90106191542138888,P2PADDR:90106191542138888,P2PPORT:7777,G_s:Domination","map":"","max_players":32,"num_bots":0,"num_players":0,"num_rules":13,"os":"w","password":0,"port":7777,"protocol":17,"secure":1,"steam_id":90106191542138888,"steamappid":0,"version":"1.0.0.0"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Dow/2_response.txt b/gameq/tests/Protocols/Providers/Dow/2_response.txt new file mode 100644 index 0000000..7ad9c37 Binary files /dev/null and b/gameq/tests/Protocols/Providers/Dow/2_response.txt differ diff --git a/gameq/tests/Protocols/Providers/Dow/2_result.json b/gameq/tests/Protocols/Providers/Dow/2_result.json new file mode 100644 index 0000000..67e2ad5 --- /dev/null +++ b/gameq/tests/Protocols/Providers/Dow/2_result.json @@ -0,0 +1 @@ +{"31.186.250.10:27015":{"BeaconPort_i":"15000","F_i":"0","G_s":"Domination","MPN_s":"dow_kaysersberg_SunnyAfternoon","N_i":"1","ONM_s":"Driven Arts EU","OWNINGID":"90106191462140931","OWNINGNAME":"90106191462140931","P2PADDR":"90106191462140931","P2PPORT":"7777","P_i":"32","SESSIONFLAGS":"520","V_s":"1.0.3.3","dedicated":"d","game_descr":"Unreal Test!","game_dir":"unrealtest","game_id":454350,"gq_address":"31.186.250.10","gq_joinlink":"steam:\/\/connect\/31.186.250.10:27015\/","gq_name":"Days of War","gq_online":true,"gq_port_client":27015,"gq_port_query":27015,"gq_protocol":"source","gq_transport":"udp","gq_type":"dow","hostname":"90106191462140931","keywords":"BUILDID:211023433,OWNINGID:90106191462140931,OWNINGNAME:90106191462140931,P2PADDR:90106191462140931,P2PPORT:7777,G_s:Domination","map":"","max_players":32,"num_bots":0,"num_players":0,"num_rules":13,"os":"w","password":0,"port":7777,"protocol":17,"secure":1,"steam_id":90106191462140931,"steamappid":0,"version":"1.0.0.0"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Eco/1_response.txt b/gameq/tests/Protocols/Providers/Eco/1_response.txt new file mode 100644 index 0000000..24c0088 --- /dev/null +++ b/gameq/tests/Protocols/Providers/Eco/1_response.txt @@ -0,0 +1,267 @@ +HTTP/1.1 200 OK +Keep-Alive: true +Content-Length: 6260 +Content-Type: application/json; charset=utf-8 +Server: Microsoft-HTTPAPI/2.0 +Date: Mon, 10 Sep 2018 16:33:59 GMT +Connection: close + +{ + "Info": { + "UniqueIdentifier": 3499416734684207289, + "GamePort": 3000, + "WebPort": 3001, + "IsLAN": false, + "Description": "Let's Kautsch OECONOMICA", + "DetailedDescription": "www.letskautsch.de\\nts.letskautsch.de\\nWipeDate:06.09.18", + "Category": "beginner", + "OnlinePlayers": 4, + "TotalPlayers": 77, + "AdminOnline": false, + "TimeSinceStart": 373544.89116467279, + "TimeLeft": 3514455.1542289914, + "Animals": 3833, + "Plants": 332976, + "Laws": 2, + "WorldSize": "1,96km²", + "Version": "0.7.7.1 beta", + "EconomyDesc": "71 trades, 0 contracts", + "SkillSpecialization": "VeryHigh", + "SkillSpecializationSetting": "veryHigh", + "Language": "German", + "Ha +|| +sPassword": false, + "HasMeteor": true, + "DistributionStationItems": "None." + }, + "Graphs": [ + { + "Category": "Humans", + "Name": "Learn Specialty", + "Graph": { + "Keys": [ + [ + "Humans", + "All", + "Learn Specialty" + ] + ], + "TimeMin": 0.0, + "TimeMax": 4.323436238734824 + } + }, + { + "Category": "Ecosystem", + "Name": "Populations", + "Graph": { + "Keys": [ + [ + "World", + "Population", + "Camas Population" + ], + [ + "World", + "Population", + "Wheat Population" + ], + [ + "World", + "Population", + "Birch Population" + ], + [ + "World", + "Population", + "Cedar Population" + ], + [ + "World", + "Population", + "Bunchgrass Population" + ], + [ + "World", + "Population", + "Fern Population" + ], + [ + "World", + "Population", + "Huckleberry Population" + ], + [ + "World", + "Population", + "Hare Population" + ], + [ + "World", + "Population", + "Elk Population" + ], + [ + "World", + "Population", + "Wolf Population" + ], + [ + "World", + "Population", + "Beets Population" + ], + [ + "World", + "Population", + "Corn Population" + ], + [ + "World", + "Population", + "Waterweed Population" + ], + [ + "World", + "Population", + "Fireweed Population" + ], + [ + "World", + "Population", + "Creosote Bush Population" + ], + [ + "World", + "Population", + "Sagebrush Population" + ], + [ + "World", + "Population", + "Prickly Pear Population" + ], + [ + "World", + "Population", + "Beans Population" + ], + [ + "World", + "Population", + "Bullrush Population" + ], + [ + "World", + "Population", + "Bison Population" + ], + [ + "World", + "Population", + "Turkey Population" + ], + [ + "World", + "Population", + "Fox Population" + ], + [ + "World", + "Population", + "Tuna Population" + ], + [ + "World", + "Population", + "Salmon Population" + ], + [ + "World", + "Population", + "Trout Population" + ], + [ + "World", + "Population", + "Otter Population" + ], + [ + "World", + "Population", + "Clam Population" + ], + [ + "World", + "Population", + "Urchin Population" + ], + [ + "World", + "Population", + "Kelp Population" + ], + [ + "World", + "Population", + "Pitcher Plant Population" + ], + [ + "World", + "Population", + "Buttonbush Population" + ], + [ + "World", + "Population", + "Salal Population" + ], + [ + "World", + "Population", + "Tomatoes Population" + ], + [ + "World", + "Population", + "Amanita Mushroom Population" + ], + [ + "World", + "Population", + "Crimini Mushroom Population +|| +" + ], + [ + "World", + "Population", + "Oak Population" + ], + [ + "World", + "Population", + "Fir Population" + ], + [ + "World", + "Population", + "Saguaro Cactus Population" + ], + [ + "World", + "Population", + "Rice Population" + ], + [ + "World", + "Population", + "Tortoise Population" + ] + ], + "TimeMin": 0.0, + "TimeMax": 4.3234362387970462 + } + } + ] +} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Eco/1_result.json b/gameq/tests/Protocols/Providers/Eco/1_result.json new file mode 100644 index 0000000..f2a5b86 --- /dev/null +++ b/gameq/tests/Protocols/Providers/Eco/1_result.json @@ -0,0 +1 @@ +{"89.163.140.137:3000":{"adminonline":false,"animals":3833,"category":"beginner","dedicated":1,"description":"L<\/color>e<\/color>t<\/color>'<\/color>s<\/color> K<\/color>a<\/color>u<\/color>t<\/color>s<\/color>c<\/color>h<\/color> O<\/color>E<\/color>C<\/color>O<\/color>N<\/color>O<\/color>M<\/color>I<\/color>C<\/color>A<\/color><\/b>","detaileddescription":"www.letskautsch.de\\nts.letskautsch.de\\nWipeDate:06.09.18","distributionstationitems":"None.","economydesc":"71 trades, 0 contracts","gameport":3000,"gq_address":"89.163.140.137","gq_joinlink":"","gq_name":"ECO Global Survival","gq_online":true,"gq_port_client":3000,"gq_port_query":3001,"gq_protocol":"eco","gq_transport":"tcp","gq_type":"eco","hasmeteor":true,"haspassword":false,"islan":false,"language":"German","laws":2,"onlineplayers":4,"plants":332976,"skillspecialization":"VeryHigh","skillspecializationsetting":"veryHigh","timeleft":3514455.154229,"timesincestart":373544.89116467,"totalplayers":77,"uniqueidentifier":3499416734684207289,"version":"0.7.7.1 beta","webport":3001,"worldsize":"1,96km²"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Eco/2_response.txt b/gameq/tests/Protocols/Providers/Eco/2_response.txt new file mode 100644 index 0000000..13fc9fd --- /dev/null +++ b/gameq/tests/Protocols/Providers/Eco/2_response.txt @@ -0,0 +1,266 @@ +HTTP/1.1 200 OK +Keep-Alive: true +Content-Length: 5812 +Content-Type: application/json; charset=utf-8 +Server: Microsoft-HTTPAPI/2.0 +Date: Mon, 10 Sep 2018 16:34:02 GMT +Connection: close + +{ + "Info": { + "UniqueIdentifier": -4819071135178542589, + "GamePort": 3000, + "WebPort": 3001, + "IsLAN": false, + "Description": "<#0000FE>[FR<#FF0000>] <#0000FE>Serveur Next <#FF0000>Multigaming [EXP 1.5][v7.6.3][~2km]", + "OnlinePlayers": 4, + "TotalPlayers": 61, + "TimeSinceStart": 560946.44009479822, + "TimeLeft": 2031053.6661686017, + "Animals": 3608, + "Plants": 316929, + "Laws": 7, + "Leader": "Ripley", + "WorldSize": "1,96km²", + "Version": "0.7.6.3 beta", + "EconomyDesc": "225 trades, 0 contracts", + "SkillSpecialization": "Medium", + "SkillSpecializationSetting": "medium", + "WorldObjective": "Mettez à jour vos Objectifs (touche \"O\") svp!", + "Language": "French", + "HasPassword": false, + "HasMeteor": true, + "DistributionStationItems": "None." + }, + "Graphs": [ + { + "Category": "Humans", + "Name": "Learn Specialty", + "Graph": { + "Keys": [ + [ + "Humans", + "All", + "Learn Specialty" + ] + ], + "TimeMin": 0.0, + "TimeMax": 6.4924354962661823 + } + }, + { + "Category": "Ecosystem", + +|| + "Name": "Populations", + "Graph": { + "Keys": [ + [ + "World", + "Population", + "Camas Population" + ], + [ + "World", + "Population", + "Wheat Population" + ], + [ + "World", + "Population", + "Birch Population" + ], + [ + "World", + "Population", + "Cedar Population" + ], + [ + "World", + "Population", + "Bunchgrass Population" + ], + [ + "World", + "Population", + "Fern Population" + ], + [ + "World", + "Population", + "Huckleberry Population" + ], + [ + "World", + "Population", + "Hare Population" + ], + [ + "World", + "Population", + "Elk Population" + ], + [ + "World", + "Population", + "Wolf Population" + ], + [ + "World", + "Population", + "Beets Population" + ], + [ + "World", + "Population", + "Corn Population" + ], + [ + "World", + "Population", + "Waterweed Population" + ], + [ + "World", + "Population", + "Fireweed Population" + ], + [ + "World", + "Population", + "Creosote Bush Population" + ], + [ + "World", + "Population", + "Sagebrush Population" + ], + [ + "World", + "Population", + "Prickly Pear Population" + ], + [ + "World", + "Population", + "Beans Population" + ], + [ + "World", + "Population", + "Bullrush Population" + ], + [ + "World", + "Population", + "Bison Population" + ], + [ + "World", + "Population", + "Turkey Population" + ], + [ + "World", + "Population", + "Fox Population" + ], + [ + "World", + "Population", + "Tuna Population" + ], + [ + "World", + "Population", + "Salmon Population" + ], + [ + "World", + "Population", + "Trout Population" + ], + [ + "World", + "Population", + "Otter Population" + ], + [ + "World", + "Population", + "Clam Population" + ], + [ + "World", + "Population", + "Urchin Population" + ], + [ + "World", + "Population", + "Kelp Population" + ], + [ + "World", + "Population", + "Pitcher Plant Population" + ], + [ + "World", + "Population", + "Buttonbush Population" + ], + [ + "World", + "Population", + "Salal Population" + ], + [ + "World", + "Population", + "Tomatoes Population" + ], + [ + "World", + "Population", + "Amanita Mushroom Population" + ], + [ + "World", + "Population", + "Crimini Mushroom Population" + ], + [ + "World", + "Population", + "Oak Population" + ], + [ + "World", + "Population", + "Fir Population" + ], + [ + "World", + "Population", + "Saguaro Cactus Population" + ], + [ + "World", + "Population", + "Rice Population" + +|| + ], + [ + "World", + "Population", + "Tortoise Population" + ] + ], + "TimeMin": 0.0, + "TimeMax": 6.4924355150833124 + } + } + ] +} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Eco/2_result.json b/gameq/tests/Protocols/Providers/Eco/2_result.json new file mode 100644 index 0000000..7ba3db2 --- /dev/null +++ b/gameq/tests/Protocols/Providers/Eco/2_result.json @@ -0,0 +1 @@ +{"51.15.15.138:3000":{"animals":3608,"dedicated":1,"description":"<#0000FE>[<\/color>FR<#FF0000>]<\/color> <#0000FE>Serveur <\/color>Next <#FF0000>Multigaming<\/color> [EXP 1.5][v7.6.3][~2km]<\/color><\/b>","distributionstationitems":"None.","economydesc":"225 trades, 0 contracts","gameport":3000,"gq_address":"51.15.15.138","gq_joinlink":"","gq_name":"ECO Global Survival","gq_online":true,"gq_port_client":3000,"gq_port_query":3001,"gq_protocol":"eco","gq_transport":"tcp","gq_type":"eco","hasmeteor":true,"haspassword":false,"islan":false,"language":"French","laws":7,"leader":"Ripley","onlineplayers":4,"plants":316929,"skillspecialization":"Medium","skillspecializationsetting":"medium","timeleft":2031053.6661686,"timesincestart":560946.4400948,"totalplayers":61,"uniqueidentifier":-4819071135178542589,"version":"0.7.6.3 beta","webport":3001,"worldobjective":"Mettez à jour vos Objectifs (touche \"O\") svp!","worldsize":"1,96km²"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Egs/1_response.txt b/gameq/tests/Protocols/Providers/Egs/1_response.txt new file mode 100644 index 0000000..ce19364 Binary files /dev/null and b/gameq/tests/Protocols/Providers/Egs/1_response.txt differ diff --git a/gameq/tests/Protocols/Providers/Egs/1_result.json b/gameq/tests/Protocols/Providers/Egs/1_result.json new file mode 100644 index 0000000..d009c60 --- /dev/null +++ b/gameq/tests/Protocols/Providers/Egs/1_result.json @@ -0,0 +1 @@ +{"192.223.28.130:30000":{"AntiGriefDist":"30","AntiGriefPvE":"30","AntiGriefPvP":"300","DecayTime":"2","Dedicated":"True","EACActive":"True","EnabledTrading":"1","GameModeId":"1","GameName":"","Host":"The Killing Crew - US East","IP":"192.223.28.130","IsPublic":"True","MaxPlayers":"8","MaxStructures":"200","NumPlayfields":"37","NumStartPlanets":"4","NumericalVersion":"-1","OfflProtDelay":"300","OfflProtTime":"48","PasswordNeeded":"False","Ping":"-1","Players":"0","Port":"30000","Product":"EGS","ServerInfo":"","SteamID":"90113336513850378","StopPeriod":"0","Version":"Alpha 7.6.0","WipeTime":"0","dedicated":"d","game_descr":"Empyrion - Galactic Survival","game_dir":"EGS","game_id":383120,"gq_address":"192.223.28.130","gq_joinlink":"steam:\/\/connect\/192.223.28.130:30000\/","gq_name":"Empyrion - Galactic Survival","gq_online":true,"gq_port_client":30000,"gq_port_query":30001,"gq_protocol":"source","gq_transport":"udp","gq_type":"egs","hostname":"The Killing Crew - US East","keywords":"1;1;0","map":"","max_players":8,"num_bots":0,"num_players":0,"num_rules":29,"os":"w","password":0,"port":30000,"protocol":17,"secure":0,"steam_id":90113336513850378,"steamappid":0,"version":"34014720"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Egs/2_response.txt b/gameq/tests/Protocols/Providers/Egs/2_response.txt new file mode 100644 index 0000000..a4110a9 Binary files /dev/null and b/gameq/tests/Protocols/Providers/Egs/2_response.txt differ diff --git a/gameq/tests/Protocols/Providers/Egs/2_result.json b/gameq/tests/Protocols/Providers/Egs/2_result.json new file mode 100644 index 0000000..7573e1c --- /dev/null +++ b/gameq/tests/Protocols/Providers/Egs/2_result.json @@ -0,0 +1 @@ +{"70.186.146.133:25567":{"AntiGriefDist":"30","AntiGriefPvE":"0","AntiGriefPvP":"0","DecayTime":"8","Dedicated":"True","EACActive":"True","EnabledTrading":"1","GameModeId":"1","GameName":"","Host":"Inflicted.org | Custom Gigantic Universe | Starter Packs | EAH","IP":"70.186.146.133","IsPublic":"True","MaxPlayers":"100","MaxStructures":"200","NumPlayfields":"123","NumStartPlanets":"1","NumericalVersion":"-1","OfflProtDelay":"1500","OfflProtTime":"72","PasswordNeeded":"False","Ping":"-1","Players":"20","Port":"25567","Product":"EGS","ServerInfo":"Fast EXP | Rich Resources | Easy Start | Active Admins | Discord: [u][url=discord.gg\/WrA2MQ7]Click Here[\/url][\/u].","SteamID":"90113509010829315","StopPeriod":"0","Version":"Alpha 7.6.1","WipeTime":"336","dedicated":"d","game_descr":"Empyrion - Galactic Survival","game_dir":"EGS","game_id":383120,"gq_address":"70.186.146.133","gq_joinlink":"steam:\/\/connect\/70.186.146.133:25567\/","gq_name":"Empyrion - Galactic Survival","gq_online":true,"gq_port_client":25567,"gq_port_query":25568,"gq_protocol":"source","gq_transport":"udp","gq_type":"egs","hostname":"Inflicted.org | Custom Gigantic Universe | Starter Packs | EAH","keywords":"1;1;XxN4","map":"","max_players":100,"num_bots":0,"num_players":19,"num_rules":29,"os":"w","password":0,"players":[{"id":0,"name":"","score":0,"time":3726.2668457031},{"id":0,"name":"","score":0,"time":3685.2426757812},{"id":0,"name":"","score":0,"time":3677.6577148438},{"id":0,"name":"","score":0,"time":3676.8588867188},{"id":0,"name":"","score":0,"time":3672.7680664062},{"id":0,"name":"","score":0,"time":3669.8703613281},{"id":0,"name":"","score":0,"time":3508.6279296875},{"id":0,"name":"","score":0,"time":3388.2592773438},{"id":0,"name":"","score":0,"time":3382.5698242188},{"id":0,"name":"","score":0,"time":3259.0002441406},{"id":0,"name":"","score":0,"time":2918.9799804688},{"id":0,"name":"","score":0,"time":2886.9367675781},{"id":0,"name":"","score":0,"time":2494.865234375},{"id":0,"name":"","score":0,"time":2174.4692382812},{"id":0,"name":"","score":0,"time":2085.283203125},{"id":0,"name":"","score":0,"time":2034.6342773438},{"id":0,"name":"","score":0,"time":2030.0445556641},{"id":0,"name":"","score":0,"time":1525.6903076172},{"id":0,"name":"","score":0,"time":1489.1007080078}],"port":25567,"protocol":17,"secure":0,"steam_id":90113509010829315,"steamappid":0,"version":"34014721"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Etqw/1_response.txt b/gameq/tests/Protocols/Providers/Etqw/1_response.txt new file mode 100644 index 0000000..d73b0e8 Binary files /dev/null and b/gameq/tests/Protocols/Providers/Etqw/1_response.txt differ diff --git a/gameq/tests/Protocols/Providers/Etqw/1_result.json b/gameq/tests/Protocols/Providers/Etqw/1_result.json new file mode 100644 index 0000000..f707876 --- /dev/null +++ b/gameq/tests/Protocols/Providers/Etqw/1_result.json @@ -0,0 +1 @@ +{"45.79.200.113:27733":{"adminStart":"0","adminname":"-^3Bloodbane^7-","allowLateJoin":"1","antiLag":"1","antiLagForgiving":"0","antiLagOnly":"0","bba_modver":"bbamod alpha1.5 0.5.4 build Sep 8 2008 at 05:05:11","bot_enable":"1","campaign":"campaign_africa","campaignInfo":"1 2","dedicated":1,"disableGlobalChat":"0","disableVoting":"1","email":"bloodbane@buffalobadass.com","gameReviewReadyWait":"0","gamename":"bbamod","gamestate":2,"gq_address":"45.79.200.113","gq_joinlink":"","gq_name":"Enemy Territory Quake Wars","gq_online":true,"gq_port_client":27733,"gq_port_query":27733,"gq_protocol":"etqw","gq_transport":"udp","gq_type":"etqw","interested_clients":1,"map":"maps\/island","maxPlayers":"24","minPlayers":"2","motd_1":"^1Owner ^7: ^4<{^1BBA^4}>^7-Zeus-","motd_2":"^1All Frag - Skip The Lag","motd_3":"^NVisit ^1www.BuffaloBadAss.com","motd_4":"^3Join Us -^3We Make Gaming Fun!","name":"^4<{^1BBA^4}> ^3#1 ^2No Reset ^2XP SAVER","needPass":"0","net_serverDedicated":"1","net_serverPunkbusterEnabled":"0","noProficiency":"0","numplayers":16,"osmask":7,"players":[{"id":0,"ping":76,"name":"^2HillBilly","clantag_pos":0,"clantag":"","bot":0,"total_xp":24795.140625,"teamname":"strogg","total_kills":15,"total_deaths":11},{"id":1,"ping":74,"name":"^1f^2mio^7f","clantag_pos":0,"clantag":"","bot":0,"total_xp":781.75885009766,"teamname":"gdf","total_kills":10,"total_deaths":18},{"id":2,"ping":120,"name":"Riddick^9_1","clantag_pos":0,"clantag":"","bot":0,"total_xp":10534.435546875,"teamname":"gdf","total_kills":14,"total_deaths":15},{"id":3,"ping":213,"name":"^2HIM-AGAIN","clantag_pos":0,"clantag":"^4<{^1BBA^4}>^0","bot":0,"total_xp":17537.240234375,"teamname":"gdf","total_kills":13,"total_deaths":15},{"id":4,"ping":131,"name":"^;GIT","clantag_pos":0,"clantag":"","bot":0,"total_xp":2943.0563964844,"teamname":"strogg","total_kills":6,"total_deaths":14},{"id":5,"ping":48,"name":"^9_^3e^Dc^1h^?o^9_","clantag_pos":0,"clantag":"^4<{^1BBA^4}>^0","bot":0,"total_xp":25880.642578125,"teamname":"gdf","total_kills":11,"total_deaths":15},{"id":6,"ping":118,"name":"^7Ram^coth","clantag_pos":0,"clantag":"","bot":0,"total_xp":97.350006103516,"teamname":"strogg","total_kills":7,"total_deaths":4},{"id":7,"ping":43,"name":"William_Gates","clantag_pos":1,"clantag":"^0|^8B^0B^8A^0|^0","bot":0,"total_xp":10808.482421875,"teamname":"strogg","total_kills":37,"total_deaths":12},{"id":8,"ping":140,"name":"^4Jinxter^3X","clantag_pos":0,"clantag":"","bot":0,"total_xp":68.787467956543,"teamname":"gdf","total_kills":10,"total_deaths":14},{"id":9,"ping":247,"name":"^2the^4bling^3bling^6man","clantag_pos":0,"clantag":"^8[FTJ]^0","bot":0,"total_xp":13972.721679688,"teamname":"gdf","total_kills":9,"total_deaths":11},{"id":10,"ping":74,"name":"^[SLUG^0a^vMNKY","clantag_pos":0,"clantag":"^;=s^1W^;s=^0","bot":0,"total_xp":13821.709960938,"teamname":"strogg","total_kills":20,"total_deaths":12},{"id":11,"ping":44,"name":"^>Ward^>46","clantag_pos":0,"clantag":"^4<{^1BBA^4}>^0","bot":0,"total_xp":13958.2265625,"teamname":"strogg","total_kills":5,"total_deaths":11},{"id":12,"ping":45,"name":"^1S^8watt","clantag_pos":0,"clantag":"^4<{^1BBA^4}>^0","bot":0,"total_xp":18927.51953125,"teamname":"strogg","total_kills":4,"total_deaths":6},{"id":13,"ping":78,"name":"^;alpha-1","clantag_pos":0,"clantag":"^;OC^;B*^0","bot":0,"total_xp":42119.0234375,"teamname":"gdf","total_kills":4,"total_deaths":6},{"id":14,"ping":76,"name":"^1Sissy^4boy","clantag_pos":0,"clantag":"^4<{^1BBA^4}>^0","bot":0,"total_xp":21743.703125,"teamname":"strogg","total_kills":0,"total_deaths":1},{"id":15,"ping":109,"name":"regul","clantag_pos":0,"clantag":"^0OCB ^0","bot":0,"total_xp":38949.0703125,"teamname":"gdf","total_kills":0,"total_deaths":0}],"privateClients":"0","pure":"1","ranked":0,"readyPercent":"51","rules":"sdGameRulesCampaign","servertype":0,"spectators":"1","teamDamage":"1","teamForceBalance":"1","timeleft":338436,"timelimit":"20","version":"ETQW 1.5.12642.33243 win-x86 Apr 30 2008 14:18:50","website":"http:\/\/www.buffalobadass.com"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Etqw/2_response.txt b/gameq/tests/Protocols/Providers/Etqw/2_response.txt new file mode 100644 index 0000000..58bf245 Binary files /dev/null and b/gameq/tests/Protocols/Providers/Etqw/2_response.txt differ diff --git a/gameq/tests/Protocols/Providers/Etqw/2_result.json b/gameq/tests/Protocols/Providers/Etqw/2_result.json new file mode 100644 index 0000000..cdce7ec --- /dev/null +++ b/gameq/tests/Protocols/Providers/Etqw/2_result.json @@ -0,0 +1 @@ +{"198.144.177.2:27733":{"adminStart":"0","allowLateJoin":"1","antiLag":"1","antiLagForgiving":"0","antiLagOnly":"0","bot_enable":"1","campaign":"campaign_northeurope","campaignInfo":"2","dedicated":1,"disableGlobalChat":"0","disableVoting":"1","gameReviewReadyWait":"0","gamename":"baseETQW-1","gamestate":2,"gq_address":"198.144.177.2","gq_joinlink":"","gq_name":"Enemy Territory Quake Wars","gq_online":true,"gq_port_client":27733,"gq_port_query":27733,"gq_protocol":"etqw","gq_transport":"udp","gq_type":"etqw","interested_clients":1,"map":"maps\/ark","maxPlayers":"32","minPlayers":"6","name":"^3S4NDMOD.COM ^1ROTATION^7","needPass":"0","net_serverDedicated":"1","net_serverPunkbusterEnabled":"1","noProficiency":"0","numplayers":30,"osmask":7,"players":[{"id":0,"ping":0,"name":"^9D^7|^9S Sh^7a^9ms","clantag_pos":0,"clantag":"","bot":1,"total_xp":28.69649887085,"teamname":"strogg","total_kills":0,"total_deaths":0},{"id":1,"ping":0,"name":"^9GMPO^7ZAF' ^HAMD","clantag_pos":0,"clantag":"","bot":1,"total_xp":52.127494812012,"teamname":"strogg","total_kills":0,"total_deaths":0},{"id":2,"ping":0,"name":"^1IM^7MorTAL^4]NARF[","clantag_pos":0,"clantag":"","bot":1,"total_xp":93.390396118164,"teamname":"gdf","total_kills":0,"total_deaths":0},{"id":3,"ping":0,"name":"^1Wa^7rKrime^4]NARF[","clantag_pos":0,"clantag":"","bot":1,"total_xp":53.953132629395,"teamname":"strogg","total_kills":0,"total_deaths":0},{"id":4,"ping":0,"name":"^2dr.^7r^2e^7v^2e^7n^2a^7n^2t","clantag_pos":0,"clantag":"","bot":1,"total_xp":83.480400085449,"teamname":"gdf","total_kills":0,"total_deaths":0},{"id":5,"ping":0,"name":"^9C^7-DR^9I^7K ^1!^9N^7T^1!","clantag_pos":0,"clantag":"","bot":1,"total_xp":85.792510986328,"teamname":"gdf","total_kills":0,"total_deaths":0},{"id":6,"ping":0,"name":"^4iN^3-^7Summ3L","clantag_pos":0,"clantag":"","bot":1,"total_xp":32.464996337891,"teamname":"strogg","total_kills":0,"total_deaths":0},{"id":7,"ping":0,"name":"^1Ly^7nch^4]NARF[","clantag_pos":0,"clantag":"","bot":1,"total_xp":88.513305664062,"teamname":"gdf","total_kills":0,"total_deaths":0},{"id":8,"ping":0,"name":"^9HIGHBOT^7HUMM3L","clantag_pos":0,"clantag":"","bot":1,"total_xp":90.546264648438,"teamname":"strogg","total_kills":0,"total_deaths":0},{"id":9,"ping":0,"name":"^9GMPO^7RAMZI ^HAMD","clantag_pos":0,"clantag":"","bot":1,"total_xp":108.56591796875,"teamname":"gdf","total_kills":0,"total_deaths":0},{"id":10,"ping":0,"name":"^1-^9Tv^1-^7DynoSauR","clantag_pos":0,"clantag":"","bot":1,"total_xp":28.473751068115,"teamname":"strogg","total_kills":0,"total_deaths":0},{"id":11,"ping":0,"name":"^4iN^3-^7Spear^3?","clantag_pos":0,"clantag":"","bot":1,"total_xp":155.15991210938,"teamname":"gdf","total_kills":0,"total_deaths":0},{"id":12,"ping":0,"name":"^9Ami^Es^Vh R^Ee^9db^V!^9rd","clantag_pos":0,"clantag":"","bot":1,"total_xp":40.822498321533,"teamname":"strogg","total_kills":0,"total_deaths":0},{"id":13,"ping":0,"name":"^9e^3X^9e^7|^3W^9iz4rd","clantag_pos":0,"clantag":"","bot":1,"total_xp":82.222496032715,"teamname":"gdf","total_kills":0,"total_deaths":0},{"id":14,"ping":0,"name":"^9[^7<<^9] Darkie^7","clantag_pos":0,"clantag":"","bot":1,"total_xp":35.19250869751,"teamname":"strogg","total_kills":0,"total_deaths":0},{"id":15,"ping":0,"name":"^f-^9a^f-^7decka^f)","clantag_pos":0,"clantag":"","bot":1,"total_xp":84.209548950195,"teamname":"gdf","total_kills":0,"total_deaths":0},{"id":16,"ping":0,"name":"^2dr.^7w^2om^7!","clantag_pos":0,"clantag":"","bot":1,"total_xp":65.848754882812,"teamname":"strogg","total_kills":0,"total_deaths":0},{"id":17,"ping":0,"name":"^5-^9a^5-^7bri^5an","clantag_pos":0,"clantag":"","bot":1,"total_xp":88.941345214844,"teamname":"gdf","total_kills":0,"total_deaths":0},{"id":18,"ping":0,"name":"^1Be^7avermanA^4]NARF[","clantag_pos":0,"clantag":"","bot":1,"total_xp":30.935001373291,"teamname":"strogg","total_kills":0,"total_deaths":0},{"id":19,"ping":0,"name":"^r-^9a^r-^7time^r-^7b^romb","clantag_pos":0,"clantag":"","bot":1,"total_xp":72.761245727539,"teamname":"gdf","total_kills":0,"total_deaths":0},{"id":20,"ping":0,"name":"^9-^7o^2p^7p H^2y^7drO^9-","clantag_pos":0,"clantag":"","bot":1,"total_xp":53.338748931885,"teamname":"strogg","total_kills":0,"total_deaths":0},{"id":21,"ping":0,"name":"^1Da^7_G^4]NARF[","clantag_pos":0,"clantag":"","bot":1,"total_xp":98.849113464355,"teamname":"gdf","total_kills":0,"total_deaths":0},{"id":22,"ping":0,"name":"^1M^7ilitant^1^^9Inc^1.","clantag_pos":0,"clantag":"","bot":1,"total_xp":77.95499420166,"teamname":"strogg","total_kills":0,"total_deaths":0},{"id":23,"ping":0,"name":"^2KiH^4.^7smutzig^7","clantag_pos":0,"clantag":"","bot":1,"total_xp":65.125007629395,"teamname":"strogg","total_kills":0,"total_deaths":0},{"id":24,"ping":0,"name":"^9GMPO^7ZEMME ^HAMD","clantag_pos":0,"clantag":"","bot":1,"total_xp":78.860214233398,"teamname":"gdf","total_kills":0,"total_deaths":0},{"id":25,"ping":0,"name":"^2KiH^4.^7FeTTe^7","clantag_pos":0,"clantag":"","bot":1,"total_xp":76.311599731445,"teamname":"gdf","total_kills":0,"total_deaths":0},{"id":26,"ping":0,"name":"^9one^1.^7juncie","clantag_pos":0,"clantag":"","bot":1,"total_xp":39.761253356934,"teamname":"strogg","total_kills":0,"total_deaths":0},{"id":27,"ping":0,"name":"^Msvper^Nkritos","clantag_pos":0,"clantag":"","bot":1,"total_xp":116.84535217285,"teamname":"gdf","total_kills":0,"total_deaths":0},{"id":28,"ping":0,"name":"^9Ami^Es^Vh G^Ei^9golo^3!","clantag_pos":0,"clantag":"","bot":1,"total_xp":30,"teamname":"gdf","total_kills":0,"total_deaths":0},{"id":31,"ping":0,"name":"^1s^9|^7papa","clantag_pos":0,"clantag":"","bot":1,"total_xp":48.102500915527,"teamname":"strogg","total_kills":0,"total_deaths":0}],"privateClients":"0","pure":"1","ranked":0,"readyPercent":"0","rules":"sdGameRulesCampaign","servertype":0,"spectators":"1","teamDamage":"0","teamForceBalance":"1","timeleft":56319,"timelimit":"20","version":"ETQW 1.5.12663.12663 linux-x86 May 9 2008 13:47:37","website":"http:\/\/www.s4ndmod.com"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Etqw/3_response.txt b/gameq/tests/Protocols/Providers/Etqw/3_response.txt new file mode 100644 index 0000000..19fd0d2 Binary files /dev/null and b/gameq/tests/Protocols/Providers/Etqw/3_response.txt differ diff --git a/gameq/tests/Protocols/Providers/Etqw/3_result.json b/gameq/tests/Protocols/Providers/Etqw/3_result.json new file mode 100644 index 0000000..54a9061 --- /dev/null +++ b/gameq/tests/Protocols/Providers/Etqw/3_result.json @@ -0,0 +1 @@ +{"83.170.66.44:27733":{"adminStart":"0","adminname":"Rawa","allowLateJoin":"1","antiLag":"1","antiLagForgiving":"0","antiLagOnly":"0","bot_enable":"1","campaign":"campaign_africa","dedicated":1,"disableGlobalChat":"0","disableVoting":"0","email":"rawalein@gmx.net","gameReviewReadyWait":"0","gamename":"baseETQW-1","gamestate":1,"gq_address":"83.170.66.44","gq_joinlink":"","gq_name":"Enemy Territory Quake Wars","gq_online":true,"gq_port_client":27733,"gq_port_query":27733,"gq_protocol":"etqw","gq_transport":"udp","gq_type":"etqw","interested_clients":6,"irc":"#thegroupthing @ QuakeNet","map":"maps\/refinery.entities","maxPlayers":"32","minPlayers":"2","motd_2":"^1Sponsored By^o: ^gTsujigiri^0","motd_3":"^1Community Gaming For The Masses!^0","motd_4":"^oTGT ^1The Gather: adminned by Rawa!^0","name":"^oT^9he ^oG^9roup ^oT^9hing ^1Gather^0","needPass":"0","net_serverDedicated":"1","net_serverPunkbusterEnabled":"0","noProficiency":"1","numplayers":0,"osmask":7,"privateClients":"0","pure":"1","ranked":0,"readyPercent":"40","rules":"sdGameRulesCampaign","servertype":0,"spectators":"1","teamDamage":"1","teamForceBalance":"1","timeleft":0,"timelimit":"20","version":"ETQW 1.5.12642.33243 win-x86 Apr 30 2008 14:18:50","website":"www.thegroupthing.org"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Ffe/1_response.txt b/gameq/tests/Protocols/Providers/Ffe/1_response.txt new file mode 100644 index 0000000..cc7f9da Binary files /dev/null and b/gameq/tests/Protocols/Providers/Ffe/1_response.txt differ diff --git a/gameq/tests/Protocols/Providers/Ffe/1_result.json b/gameq/tests/Protocols/Providers/Ffe/1_result.json new file mode 100644 index 0000000..db4a2fd --- /dev/null +++ b/gameq/tests/Protocols/Providers/Ffe/1_result.json @@ -0,0 +1 @@ +{"74.91.114.247:27015":{"coop":"0","deathmatch":"1","decalfrequency":"120","dedicated":"d","ffdev_airshot_height_threshold":"72","ffdev_gibdamage":"50","ffdev_mancannon_conc_speed_horiz":"1024","ffdev_mancannon_conc_speed_vert":"768","ffdev_mancannon_push_forward":"768","ffdev_naildamage":"10","ffdev_nailgren_angleoffset":"360.0","ffdev_nailgren_spittime":"0.2","ffdev_nailgren_streams":"10","ffdev_nailspeed":"600","ffdev_ng_nail_bounds":"5.0","ffdev_ng_nail_length":"5.0","ffdev_ng_visualizenails":"0","game_descr":"FF Capture the Flag","game_dir":"FortressForever","game_id":253530,"gq_address":"74.91.114.247","gq_joinlink":"steam:\/\/connect\/74.91.114.247:27015\/","gq_name":"Fortress Forever","gq_online":true,"gq_port_client":27015,"gq_port_query":27015,"gq_protocol":"source","gq_transport":"udp","gq_type":"ffe","hlxce_plugin_version":"1.6.19","hlxce_version":"1.6.19","hlxce_webpage":"http:\/\/suzysworld.hlstatsx.nfoservers.com\/","hostname":"Moto's Funhouse | Dallas, TX","map":"ff_resolve_b2","max_players":20,"metamod_version":"1.10.6-devV","mp_allowNPCs":"1","mp_autocrosshair":"1","mp_falldamage":"1","mp_flashlight":"0","mp_footsteps":"1","mp_forcerespawn":"0","mp_fraglimit":"0","mp_friendlyfire":"0","mp_friendlyfire_armorstrip":"0","mp_prematch":"0","mp_teamlist":"hgrunt;scientist","mp_teamplay":"0","mp_timelimit":"20","mp_weaponstay":"0","num_bots":0,"num_players":10,"num_rules":80,"os":"w","password":0,"players":[{"id":0,"name":"Divinity-[e9]-","score":2,"time":3943.185546875},{"id":0,"name":"Gooster-FkM-","score":3,"time":3663.5080566406},{"id":0,"name":"Zade9110","score":0,"time":1863.0635986328},{"id":0,"name":"Headzy","score":0,"time":1349.3221435547},{"id":0,"name":"SmashBrother13","score":0,"time":831.83477783203},{"id":0,"name":"Ryo","score":0,"time":512.84637451172},{"id":0,"name":"FrailDog","score":0,"time":411.6721496582},{"id":0,"name":"","score":0,"time":327.32794189453},{"id":0,"name":"kro","score":0,"time":50.027606964111},{"id":0,"name":"npm install deez-nuts","score":0,"time":22.838262557983}],"port":27015,"protocol":17,"r_AirboatViewDampenDamp":"1.0","r_AirboatViewDampenFreq":"7.0","r_AirboatViewZHeight":"0.0","r_JeepViewDampenDamp":"1.0","r_JeepViewDampenFreq":"7.0","r_JeepViewZHeight":"10.0","r_VehicleViewDampen":"1","secure":1,"sm_advertisements_version":"0.5.5","sm_nextmap":"ff_voltage_b3","sm_playersvotes_version":"1.5.0","sm_saysounds_hybrid_version":"4.0.5","smac_version":"0.8.0.4","sourcemod_version":"1.7.3-dev+5225","steam_id":90101380046455813,"steamappid":0,"sv_accelerate":"14","sv_airaccelerate":"10","sv_alltalk":"1","sv_bounce":"0","sv_cheats":"0","sv_contact":"fpsmoto@gmail.com","sv_ffskillutilityver":"2.7","sv_footsteps":"1","sv_friction":"5","sv_gravity":"800","sv_maxspeed":"600","sv_motd_enable":"1","sv_noclipaccelerate":"5","sv_noclipspeed":"5","sv_password":"0","sv_pausable":"0","sv_rollangle":"0","sv_rollspeed":"200","sv_shadows":"-1","sv_specaccelerate":"5","sv_specnoclip":"1","sv_specspeed":"3","sv_spectatorchat":"1","sv_stepsize":"18","sv_stopspeed":"100","sv_voice_inputfromfile":"1","sv_voiceenable":"1","sv_wateraccelerate":"10","sv_waterfriction":"1","teamswitch_version":"1.3","tv_delaymapchange":"0","tv_password":"0","tv_relaypassword":"0","version":"1.2.5.0"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Ffe/2_response.txt b/gameq/tests/Protocols/Providers/Ffe/2_response.txt new file mode 100644 index 0000000..5c04b9f Binary files /dev/null and b/gameq/tests/Protocols/Providers/Ffe/2_response.txt differ diff --git a/gameq/tests/Protocols/Providers/Ffe/2_result.json b/gameq/tests/Protocols/Providers/Ffe/2_result.json new file mode 100644 index 0000000..2bf11bf --- /dev/null +++ b/gameq/tests/Protocols/Providers/Ffe/2_result.json @@ -0,0 +1 @@ +{"66.150.121.200:27015":{"ban_disconnected_ver":"1.04","coop":"0","deathmatch":"1","decalfrequency":"60","dedicated":"d","ffdev_airshot_height_threshold":"72","ffdev_gibdamage":"50","ffdev_mancannon_conc_speed_horiz":"1024","ffdev_mancannon_conc_speed_vert":"768","ffdev_mancannon_push_forward":"768","ffdev_naildamage":"10","ffdev_nailgren_angleoffset":"360.0","ffdev_nailgren_spittime":"0.2","ffdev_nailgren_streams":"10","ffdev_nailspeed":"600","ffdev_ng_nail_bounds":"5.0","ffdev_ng_nail_length":"5.0","ffdev_ng_visualizenails":"0","game_descr":"FF Capture the Flag","game_dir":"FortressForever","game_id":253530,"gq_address":"66.150.121.200","gq_joinlink":"steam:\/\/connect\/66.150.121.200:27015\/","gq_name":"Fortress Forever","gq_online":true,"gq_port_client":27015,"gq_port_query":27015,"gq_protocol":"source","gq_transport":"udp","gq_type":"ffe","hlxce_plugin_version":"1.6.19","hlxce_version":"1.6.19","hlxce_webpage":"http:\/\/suzysworld.hlstatsx.nfoservers.com\/","hostname":"TALOS - EAST COAST SERVER","map":"ff_xpress_rt3","max_players":18,"metamod_version":"1.10.6-devV","mp_allowNPCs":"1","mp_autocrosshair":"1","mp_falldamage":"1","mp_flashlight":"0","mp_footsteps":"1","mp_forcerespawn":"0","mp_fraglimit":"0","mp_friendlyfire":"0","mp_friendlyfire_armorstrip":"0","mp_prematch":".25","mp_teamlist":"hgrunt;scientist","mp_teamplay":"0","mp_timelimit":"15","mp_weaponstay":"0","num_bots":0,"num_players":0,"num_rules":77,"os":"w","password":0,"port":27015,"protocol":17,"r_AirboatViewDampenDamp":"1.0","r_AirboatViewDampenFreq":"7.0","r_AirboatViewZHeight":"0.0","r_JeepViewDampenDamp":"1.0","r_JeepViewDampenFreq":"7.0","r_JeepViewZHeight":"10.0","r_VehicleViewDampen":"1","sb_version":"1.4.11","secure":1,"sm_nextmap":"ff_2morforever","sm_saysounds_hybrid_version":"4.0.8","sourcemod_version":"1.7.3-dev+5225","steam_id":90101381479013381,"steamappid":0,"sv_accelerate":"14","sv_airaccelerate":"10","sv_alltalk":"1","sv_bounce":"0","sv_cheats":"0","sv_contact":"fatsuzy@outlook.com","sv_footsteps":"1","sv_friction":"5","sv_gravity":"800","sv_maxspeed":"600","sv_motd_enable":"1","sv_noclipaccelerate":"5","sv_noclipspeed":"5","sv_password":"0","sv_pausable":"0","sv_rollangle":"0","sv_rollspeed":"200","sv_shadows":"-1","sv_specaccelerate":"5","sv_specnoclip":"1","sv_specspeed":"3","sv_spectatorchat":"1","sv_stepsize":"18","sv_stopspeed":"100","sv_voice_inputfromfile":"1","sv_voiceenable":"1","sv_wateraccelerate":"10","sv_waterfriction":"1","tv_delaymapchange":"0","tv_password":"0","tv_relaypassword":"0","version":"1.2.5.0"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Ffe/3_response.txt b/gameq/tests/Protocols/Providers/Ffe/3_response.txt new file mode 100644 index 0000000..8708095 Binary files /dev/null and b/gameq/tests/Protocols/Providers/Ffe/3_response.txt differ diff --git a/gameq/tests/Protocols/Providers/Ffe/3_result.json b/gameq/tests/Protocols/Providers/Ffe/3_result.json new file mode 100644 index 0000000..f259052 --- /dev/null +++ b/gameq/tests/Protocols/Providers/Ffe/3_result.json @@ -0,0 +1 @@ +{"74.91.122.164:27015":{"coop":"0","deathmatch":"1","decalfrequency":"10","dedicated":"d","ffdev_airshot_height_threshold":"72","ffdev_gibdamage":"50","ffdev_mancannon_conc_speed_horiz":"1024","ffdev_mancannon_conc_speed_vert":"768","ffdev_mancannon_push_forward":"768","ffdev_naildamage":"10","ffdev_nailgren_angleoffset":"360.0","ffdev_nailgren_spittime":"0.2","ffdev_nailgren_streams":"10","ffdev_nailspeed":"600","ffdev_ng_nail_bounds":"5.0","ffdev_ng_nail_length":"5.0","ffdev_ng_visualizenails":"0","game_descr":"FF Capture the Flag","game_dir":"FortressForever","game_id":253530,"gq_address":"74.91.122.164","gq_joinlink":"steam:\/\/connect\/74.91.122.164:27015\/","gq_name":"Fortress Forever","gq_online":true,"gq_port_client":27015,"gq_port_query":27015,"gq_protocol":"source","gq_transport":"udp","gq_type":"ffe","hostname":"#AssholeByNature [ABN]","map":"ff_openfire","max_players":10,"metamod_version":"1.10.5-devV","mp_allowNPCs":"1","mp_autocrosshair":"1","mp_falldamage":"0","mp_flashlight":"0","mp_footsteps":"1","mp_forcerespawn":"0","mp_fraglimit":"0","mp_friendlyfire":"1","mp_friendlyfire_armorstrip":"0","mp_prematch":"999.000000","mp_teamlist":"hgrunt;scientist","mp_teamplay":"0","mp_timelimit":"15","mp_weaponstay":"0","num_bots":1,"num_players":0,"num_rules":71,"os":"w","password":1,"port":27015,"protocol":17,"r_AirboatViewDampenDamp":"1.0","r_AirboatViewDampenFreq":"7.0","r_AirboatViewZHeight":"0.0","r_JeepViewDampenDamp":"1.0","r_JeepViewDampenFreq":"7.0","r_JeepViewZHeight":"10.0","r_VehicleViewDampen":"1","secure":1,"sm_nextmap":"ff_openfire","sourcemod_version":"1.7.1-dev+5167","sourcetv_name":"Vote for my baby TV","sourcetv_port":27020,"steam_id":90101382590690304,"steamappid":0,"sv_accelerate":"14","sv_airaccelerate":"10","sv_alltalk":"1.000000","sv_bounce":"0","sv_cheats":"0","sv_contact":"","sv_footsteps":"1","sv_friction":"5","sv_gravity":"800","sv_maxspeed":"600","sv_motd_enable":"1","sv_noclipaccelerate":"5","sv_noclipspeed":"5","sv_password":"1","sv_pausable":"0","sv_rollangle":"0","sv_rollspeed":"200","sv_shadows":"-1","sv_specaccelerate":"5","sv_specnoclip":"1","sv_specspeed":"3","sv_spectatorchat":"1","sv_stepsize":"18","sv_stopspeed":"100","sv_voice_inputfromfile":"1","sv_voiceenable":"1","sv_wateraccelerate":"10","sv_waterfriction":"1","tv_delaymapchange":"0","tv_password":"0","tv_relaypassword":"0","version":"1.2.5.0"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Ffow/1_response.txt b/gameq/tests/Protocols/Providers/Ffow/1_response.txt new file mode 100644 index 0000000..c1089a4 Binary files /dev/null and b/gameq/tests/Protocols/Providers/Ffow/1_response.txt differ diff --git a/gameq/tests/Protocols/Providers/Ffow/1_result.json b/gameq/tests/Protocols/Providers/Ffow/1_result.json new file mode 100644 index 0000000..bd6a18e --- /dev/null +++ b/gameq/tests/Protocols/Providers/Ffow/1_result.json @@ -0,0 +1 @@ +{"104.153.104.203:5476":{"AdminName":"[TKC]TacTicToe","AutoBalanceTeams":"1","CurrentMapListIndex":"0","FriendlyFire":"0","ServerLocation":"East USA","ServerMessage":"Server forums are at www.thekillingcrew.com","ServerWebsite":"http:\/\/www.thekillingcrew.com","anticheat":0,"average_fps":1,"dedicated":100,"description":"Frontlines: Fuel of War","gamemode":"FL","gq_address":"104.153.104.203","gq_joinlink":"","gq_name":"Frontlines Fuel of War","gq_online":true,"gq_port_client":5476,"gq_port_query":5478,"gq_protocol":"ffow","gq_transport":"udp","gq_type":"ffow","maplist":[{"name":"FL-Boneyard"},{"name":"FL-Gnaw"},{"name":"FL-HindSight"},{"name":"FL-Infiltration"},{"name":"FL-Invasion"},{"name":"FL-Mountaintop"},{"name":"FL-Oilfield"},{"name":"FL-Roundabout"},{"name":"FL-Solarfarm"},{"name":"FL-Street"},{"name":"FL-Sunder"},{"name":"FL-Village"},{"name":"FL-WideAwake"}],"mapname":"FL-Boneyard","max_players":32,"max_rounds":1,"modname":"FOW","num_players":0,"os":119,"password":0,"port":25621,"round":0,"servername":"The Killing Crew [FL] use console","time_left":2055,"version":"1.3.0"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Ffow/2_response.txt b/gameq/tests/Protocols/Providers/Ffow/2_response.txt new file mode 100644 index 0000000..cbeeb54 Binary files /dev/null and b/gameq/tests/Protocols/Providers/Ffow/2_response.txt differ diff --git a/gameq/tests/Protocols/Providers/Ffow/2_result.json b/gameq/tests/Protocols/Providers/Ffow/2_result.json new file mode 100644 index 0000000..b4d8ec6 --- /dev/null +++ b/gameq/tests/Protocols/Providers/Ffow/2_result.json @@ -0,0 +1 @@ +{"104.153.104.205:5476":{"AdminName":"[TKC]TacTicToe","AutoBalanceTeams":"0","CurrentMapListIndex":"1","FriendlyFire":"0","ServerLocation":"East USA","ServerMessage":"Server forums are at www.thekillingcrew.com","ServerWebsite":"http:\/\/www.thekillingcrew.com","anticheat":0,"average_fps":1,"dedicated":100,"description":"Frontlines: Fuel of War","gamemode":"FL","gq_address":"104.153.104.205","gq_joinlink":"","gq_name":"Frontlines Fuel of War","gq_online":true,"gq_port_client":5476,"gq_port_query":5478,"gq_protocol":"ffow","gq_transport":"udp","gq_type":"ffow","maplist":[{"name":"CQ-Solarfarm"},{"name":"CQ-Solarfarm"}],"mapname":"CQ-Solarfarm","max_players":64,"max_rounds":1,"modname":"FOW","num_players":0,"os":119,"password":0,"port":25621,"round":0,"servername":"TKC 24\/7 SolarFarm [FL] use console","time_left":48393,"version":"1.3.0"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Gmod/1_response.txt b/gameq/tests/Protocols/Providers/Gmod/1_response.txt new file mode 100644 index 0000000..a911fc3 Binary files /dev/null and b/gameq/tests/Protocols/Providers/Gmod/1_response.txt differ diff --git a/gameq/tests/Protocols/Providers/Gmod/1_result.json b/gameq/tests/Protocols/Providers/Gmod/1_result.json new file mode 100644 index 0000000..5c4849b --- /dev/null +++ b/gameq/tests/Protocols/Providers/Gmod/1_result.json @@ -0,0 +1 @@ +{"192.223.31.94:27015":{"ai_disabled":"0","ai_ignoreplayers":"0","coop":"0","deathmatch":"1","decalfrequency":"60","dedicated":"d","game_descr":"1942RP","game_dir":"garrysmod","game_id":4000,"gq_address":"192.223.31.94","gq_joinlink":"steam:\/\/connect\/192.223.31.94:27015\/","gq_name":"Garry's Mod","gq_online":true,"gq_port_client":27015,"gq_port_query":27015,"gq_protocol":"source","gq_transport":"udp","gq_type":"gmod","hostname":"|POG| WWII Occupation Roleplay (Revision 2760 | Server 1 | Peop","keywords":" gm:1942rp","map":"rp_kielce_pog_v42u7","max_players":90,"mp_allowNPCs":"1","mp_autocrosshair":"1","mp_fadetoblack":"0","mp_falldamage":"1","mp_flashlight":"1","mp_footsteps":"1","mp_forcerespawn":"1","mp_fraglimit":"0","mp_friendlyfire":"0","mp_teamlist":"hgrunt;scientist","mp_teamplay":"0","mp_timelimit":"0","mp_weaponstay":"0","nextlevel":"","num_bots":0,"num_players":60,"num_rules":126,"os":"w","password":0,"physgun_limited":"0","players":[{"id":0,"name":"Mr Cog","score":2,"time":1379.0053710938},{"id":0,"name":"Alexander Bielski","score":-2,"time":1378.6292724609},{"id":0,"name":"dukr24","score":5,"time":1378.2515869141},{"id":0,"name":"[82nd] MAJ.FORGOTTENHOPE","score":2,"time":1378.0625},{"id":0,"name":"zs nolanphalin","score":0,"time":1377.7956542969},{"id":0,"name":"Übernachtung","score":0,"time":1377.4805908203},{"id":0,"name":"Musty Sheep","score":0,"time":1377.4799804688},{"id":0,"name":"DieSpy6","score":0,"time":1377.1655273438},{"id":0,"name":"Jick Mickleson","score":1,"time":1377.1025390625},{"id":0,"name":"SavagexWolf","score":-1,"time":1376.6610107422},{"id":0,"name":"Joystick \/tip","score":1,"time":1376.0946044922},{"id":0,"name":"cleverchris04","score":0,"time":1375.1494140625},{"id":0,"name":"YansterG","score":0,"time":1374.6455078125},{"id":0,"name":"Dissy","score":-1,"time":1374.5825195312},{"id":0,"name":"JrLacroix02","score":0,"time":1374.0152587891},{"id":0,"name":"Mdog","score":0,"time":1373.8265380859},{"id":0,"name":"jmondo97","score":3,"time":1373.4479980469},{"id":0,"name":"Ghostkyle","score":0,"time":1373.1335449219},{"id":0,"name":"Molarcapybara","score":0,"time":1372.8186035156},{"id":0,"name":"DJC00","score":0,"time":1365.4476318359},{"id":0,"name":"superbluedog008","score":0,"time":1357.1307373047},{"id":0,"name":"Dockedknave","score":1,"time":1356.8787841797},{"id":0,"name":"Thesingingmanatee","score":0,"time":1353.4927978516},{"id":0,"name":"Nr.9 The Glorious One","score":0,"time":1352.7427978516},{"id":0,"name":"sorosh","score":0,"time":1351.9307861328},{"id":0,"name":"Pink Floyd","score":0,"time":1350.4925537109},{"id":0,"name":"нσє |(╯°□°)╯Get High","score":0,"time":1350.3677978516},{"id":0,"name":"The Doctor","score":2,"time":1341.4925537109},{"id":0,"name":"Jack Twinkletoes","score":0,"time":1337.6179199219},{"id":0,"name":"proxydeimos","score":0,"time":1326.6809082031},{"id":0,"name":"Butter Dog","score":-1,"time":1302.6802978516},{"id":0,"name":"WolfBoy10","score":0,"time":1299.5826416016},{"id":0,"name":"Arbincir of Durac","score":0,"time":1266.1807861328},{"id":0,"name":"I so Gewd et gem","score":0,"time":1258.5548095703},{"id":0,"name":"Scott Shelby","score":0,"time":1216.3055419922},{"id":0,"name":"密封圈","score":1,"time":1208.4934082031},{"id":0,"name":"Cpt_CockBlock","score":0,"time":1188.9927978516},{"id":0,"name":"PyroMancerMan","score":0,"time":1140.2431640625},{"id":0,"name":"Ornstein The Dragonslayer","score":1,"time":1125.0555419922},{"id":0,"name":"AKMcAnalLovin","score":0,"time":1093.7429199219},{"id":0,"name":"SquirrelDroid","score":0,"time":1074.9921875},{"id":0,"name":"✪ Skit","score":2,"time":1025.5556640625},{"id":0,"name":"JOKER4001","score":0,"time":1023.6799926758},{"id":0,"name":"susanmarkle72","score":0,"time":1019.7426147461},{"id":0,"name":"✠ϟMike-ó The Psycho✪☭","score":0,"time":1019.3676757812},{"id":0,"name":"Bill Nye The Jewish Guy","score":0,"time":978.93029785156},{"id":0,"name":"mikebrink007","score":0,"time":956.74957275391},{"id":0,"name":"Vesmos_Ghastin","score":1,"time":953.93743896484},{"id":0,"name":"Tomato Man","score":0,"time":938.56231689453},{"id":0,"name":"Kim Kardashian West","score":0,"time":893.12530517578},{"id":0,"name":"ScaredToWalkAway","score":2,"time":816.56164550781},{"id":0,"name":"Juan Rectum Inspection","score":-1,"time":706.18725585938},{"id":0,"name":"The Beaver","score":0,"time":545.12420654297},{"id":0,"name":"I em spooderman","score":0,"time":461.87454223633},{"id":0,"name":"everreadykay","score":0,"time":447.93774414062},{"id":0,"name":"","score":0,"time":439.81246948242},{"id":0,"name":"Wingardium LevioSA","score":0,"time":300.56234741211},{"id":0,"name":"lich king","score":0,"time":210.3744354248},{"id":0,"name":"march3258","score":0,"time":77.624893188477},{"id":0,"name":"Gojira417","score":0,"time":72.125244140625}],"port":27015,"protocol":17,"r_AirboatViewDampenDamp":"1.0","r_AirboatViewDampenFreq":"7.0","r_AirboatViewZHeight":"0.0","r_JeepViewDampenDamp":"1.0","r_JeepViewDampenFreq":"7.0","r_JeepViewZHeight":"10.0","r_VehicleViewDampen":"0","sb_version":"1.531","sbox_bonemanip_misc":"0","sbox_bonemanip_npc":"1","sbox_bonemanip_player":"0","sbox_godmode":"0","sbox_maxballoons":"0","sbox_maxbuttons":"0","sbox_maxdynamite":"0","sbox_maxeffects":"0","sbox_maxemitters":"0","sbox_maxhoverballs":"0","sbox_maxlamps":"0","sbox_maxlights":"5","sbox_maxnpcs":"0","sbox_maxprops":"25","sbox_maxragdolls":"0","sbox_maxsents":"10","sbox_maxtextscreens":"1","sbox_maxthrusters":"0","sbox_maxvehicles":"0","sbox_maxwheels":"0","sbox_noclip":"1","sbox_persist":"","sbox_playershurtplayers":"1","sbox_weapons":"1","secure":1,"sensor_debugragdoll":"0","sensor_stretchragdoll":"0","steam_id":90094492921377800,"steamappid":4000,"sv_accelerate":"10","sv_airaccelerate":"100","sv_allowcslua":"0","sv_alltalk":"0","sv_bounce":"0","sv_cheats":"0","sv_contact":"your@email.address","sv_footsteps":"1","sv_friction":"8","sv_gravity":"600","sv_hl2mp_item_respawn_time":"30","sv_hl2mp_weapon_respawn_time":"20","sv_maxspeed":"10000","sv_noclipaccelerate":"5","sv_noclipspeed":"5","sv_password":"0","sv_pausable":"0","sv_report_client_settings":"0","sv_rollangle":"0","sv_rollspeed":"200","sv_specaccelerate":"5","sv_specnoclip":"1","sv_specspeed":"3","sv_steamgroup":"","sv_stepsize":"18","sv_stopspeed":"10","sv_voiceenable":"1","sv_wateraccelerate":"10","sv_waterfriction":"1","toolmode_allow_axis":"1","toolmode_allow_balloon":"1","toolmode_allow_ballsocket":"1","toolmode_allow_button":"1","toolmode_allow_camera":"1","toolmode_allow_colour":"1","toolmode_allow_creator":"1","toolmode_allow_duplicator":"1","toolmode_allow_dynamite":"1","toolmode_allow_editentity":"1","toolmode_allow_elastic":"1","toolmode_allow_emitter":"1","toolmode_allow_example":"1","toolmode_allow_eyeposer":"1","toolmode_allow_faceposer":"1","toolmode_allow_finger":"1","toolmode_allow_hoverball":"1","toolmode_allow_hydraulic":"1","toolmode_allow_ignite":"1","toolmode_allow_inflator":"1","toolmode_allow_lamp":"1","toolmode_allow_leafblower":"1","toolmode_allow_light":"1","toolmode_allow_material":"1","toolmode_allow_motor":"1","toolmode_allow_muscle":"1","toolmode_allow_nocollide":"1","toolmode_allow_paint":"1","toolmode_allow_physprop":"1","toolmode_allow_pulley":"1","toolmode_allow_remover":"1","toolmode_allow_rope":"1","toolmode_allow_shareprops":"1","toolmode_allow_slider":"1","toolmode_allow_textscreen":"1","toolmode_allow_thruster":"1","toolmode_allow_trails":"1","toolmode_allow_weld":"1","toolmode_allow_wheel":"1","toolmode_allow_winch":"1","tv_enable":"0","tv_password":"0","tv_relaypassword":"0","version":"14.07.10"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Gmod/2_response.txt b/gameq/tests/Protocols/Providers/Gmod/2_response.txt new file mode 100644 index 0000000..f240514 Binary files /dev/null and b/gameq/tests/Protocols/Providers/Gmod/2_response.txt differ diff --git a/gameq/tests/Protocols/Providers/Gmod/2_result.json b/gameq/tests/Protocols/Providers/Gmod/2_result.json new file mode 100644 index 0000000..81af004 --- /dev/null +++ b/gameq/tests/Protocols/Providers/Gmod/2_result.json @@ -0,0 +1 @@ +{"198.50.213.18:27016":{"ai_disabled":"0","ai_ignoreplayers":"0","coop":"0","deathmatch":"1","decalfrequency":"0","dedicated":"d","fas2_att_acog":"0","fas2_att_c79":"0","fas2_att_compm4":"0","fas2_att_eotech":"0","fas2_att_foregrip":"0","fas2_att_harrisbipod":"0","fas2_att_leupold":"0","fas2_att_m2120mag":"0","fas2_att_mp5k30mag":"0","fas2_att_pso1":"0","fas2_att_sg55x30mag":"0","fas2_att_sks20mag":"0","fas2_att_sks30mag":"0","fas2_att_slugrounds":"0","fas2_att_suppressor":"0","fas2_att_tritiumsights":"0","fas2_att_uziwoodenstock":"0","fas2_profgain":"0.010000","fas2_profgain_shotguns":"0.010000","game_descr":"GMod DayZ","game_dir":"garrysmod","game_id":4000,"gq_address":"198.50.213.18","gq_joinlink":"steam:\/\/connect\/198.50.213.18:27016\/","gq_name":"Garry's Mod","gq_online":true,"gq_port_client":27016,"gq_port_query":27016,"gq_protocol":"source","gq_transport":"udp","gq_type":"gmod","hostname":"1.Can't Stand Idiots| THE ORIGINAL DAYZ 2.14_7b |No Lag","keywords":" gm:dayz","map":"dz_chernarus","max_players":60,"mp_allowNPCs":"1","mp_autocrosshair":"1","mp_fadetoblack":"0","mp_falldamage":"0","mp_flashlight":"1","mp_footsteps":"1","mp_forcerespawn":"1","mp_fraglimit":"0","mp_friendlyfire":"1","mp_teamlist":"hgrunt;scientist","mp_teamplay":"0","mp_timelimit":"0","mp_weaponstay":"0","netwrapper_max_requests":"-1","netwrapper_request_delay":"5","nextlevel":"","num_bots":0,"num_players":26,"num_rules":106,"os":"w","password":0,"physgun_limited":"0","players":[{"id":0,"name":"EmergentMink417","score":0,"time":4419.2626953125},{"id":0,"name":"NOGOODNAMES","score":3,"time":4320.6259765625},{"id":0,"name":"dmd999fan","score":1,"time":4207.2924804688},{"id":0,"name":"Kalder0623","score":9,"time":3528.5048828125},{"id":0,"name":"Ochocinco","score":1,"time":3174.4145507812},{"id":0,"name":"Jerbear","score":0,"time":2193.03125},{"id":0,"name":"Obama Bin Ladin","score":0,"time":1943.8801269531},{"id":0,"name":"[WDB] K!LL3R","score":5,"time":1864.9405517578},{"id":0,"name":"Tika Turtle Nick","score":0,"time":1634.1531982422},{"id":0,"name":"EEP","score":0,"time":1597.4862060547},{"id":0,"name":"mckringle","score":0,"time":1436.8798828125},{"id":0,"name":"samurai jack","score":0,"time":1039.1202392578},{"id":0,"name":"Mary Beth","score":0,"time":1026.1506347656},{"id":0,"name":"wizard_69","score":4,"time":879.87786865234},{"id":0,"name":"BillyMayonnaise","score":0,"time":847.27203369141},{"id":0,"name":"Bioman2","score":0,"time":830.18121337891},{"id":0,"name":"❤omori❤","score":0,"time":593.45373535156},{"id":0,"name":"CSi. Death Dragon","score":0,"time":474.81784057617},{"id":0,"name":"Panqake","score":0,"time":461.87817382812},{"id":0,"name":"Jack Bauer","score":0,"time":416.93859863281},{"id":0,"name":"Tubby","score":0,"time":375.30224609375},{"id":0,"name":"Mr.Boots","score":0,"time":229.30282592773},{"id":0,"name":"CSi. Moonlight™","score":0,"time":197.96900939941},{"id":0,"name":"bmkozar","score":0,"time":140.5146484375},{"id":0,"name":"","score":0,"time":121.12058258057},{"id":0,"name":"","score":0,"time":60.302158355713}],"port":27016,"protocol":17,"r_AirboatViewDampenDamp":"1.0","r_AirboatViewDampenFreq":"7.0","r_AirboatViewZHeight":"0.0","r_JeepViewDampenDamp":"1.0","r_JeepViewDampenFreq":"7.0","r_JeepViewZHeight":"10.0","r_VehicleViewDampen":"0","sb_version":"1.531","sbox_bonemanip_misc":"0","sbox_bonemanip_npc":"1","sbox_bonemanip_player":"0","sbox_godmode":"1","sbox_maxballoons":"100","sbox_maxbuttons":"50","sbox_maxdynamite":"10","sbox_maxeffects":"200","sbox_maxemitters":"20","sbox_maxhoverballs":"50","sbox_maxlamps":"3","sbox_maxlights":"5","sbox_maxnpcs":"10","sbox_maxprops":"200","sbox_maxragdolls":"10","sbox_maxsents":"100","sbox_maxthrusters":"50","sbox_maxvehicles":"4","sbox_maxwheels":"50","sbox_noclip":"1","sbox_persist":"","sbox_playershurtplayers":"1","sbox_weapons":"1","secure":1,"sensor_debugragdoll":"0","sensor_stretchragdoll":"0","steam_id":90094480274400259,"steamappid":4000,"sv_accelerate":"8.00","sv_airaccelerate":"50.00","sv_allowcslua":"0","sv_alltalk":"0","sv_bounce":"0","sv_cheats":"0","sv_contact":"","sv_footsteps":"1","sv_friction":"6.00","sv_gravity":"800.00","sv_hl2mp_item_respawn_time":"30","sv_hl2mp_weapon_respawn_time":"20","sv_maxspeed":"10000","sv_noclipaccelerate":"5","sv_noclipspeed":"5","sv_password":"0","sv_pausable":"0","sv_report_client_settings":"0","sv_rollangle":"0","sv_rollspeed":"200","sv_specaccelerate":"5","sv_specnoclip":"1","sv_specspeed":"3","sv_steamgroup":"","sv_stepsize":"18","sv_stopspeed":"50.00","sv_voiceenable":"1","sv_wateraccelerate":"10","sv_waterfriction":"1","tv_enable":"0","tv_password":"0","tv_relaypassword":"0","version":"14.07.10"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Grav/1_response.txt b/gameq/tests/Protocols/Providers/Grav/1_response.txt new file mode 100644 index 0000000..5623603 Binary files /dev/null and b/gameq/tests/Protocols/Providers/Grav/1_response.txt differ diff --git a/gameq/tests/Protocols/Providers/Grav/1_result.json b/gameq/tests/Protocols/Providers/Grav/1_result.json new file mode 100644 index 0000000..8ee063d --- /dev/null +++ b/gameq/tests/Protocols/Providers/Grav/1_result.json @@ -0,0 +1 @@ +{"118.241.162.28:27015":{"adminsfile":"admins.txt","allow_spectators":"1.0","coop":"0","deathmatch":"1","dedicated":"d","edgefriction":"2","game_descr":"Sven Co-op 5.0","game_dir":"svencoop","game_id":225840,"gamebuild":"4316","gamename":"Sven Co-op","gameversion":"5.0","gq_address":"118.241.162.28","gq_joinlink":"steam:\/\/connect\/118.241.162.28:27015\/","gq_name":"GRAV Online","gq_online":true,"gq_port_client":27015,"gq_port_query":27015,"gq_protocol":"source","gq_transport":"udp","gq_type":"grav","hostname":"Sven Co-op 5.0 server","map":"last4","mapvotecfgfile":"mapvote.cfg","max_players":32,"max_queries_sec":"1","max_queries_sec_global":"1","max_queries_window":"1","mp_banana":"1","mp_consistency":"0","mp_footsteps":"1","mp_logfile":"1","mp_nextmap_cycle":"toonrun1","mp_notimelimit":"0.0","num_bots":0,"num_players":13,"num_rules":44,"os":"w","password":0,"pausable":"0","players":[{"id":0,"name":"(5)New Player","score":6,"time":4985.8115234375},{"id":0,"name":"arao1129","score":0,"time":3670.7321777344},{"id":0,"name":"(1)New Player","score":0,"time":2445.9145507812},{"id":0,"name":"Parnaery","score":0,"time":2242.6259765625},{"id":0,"name":"meme","score":0,"time":2215.1257324219},{"id":0,"name":"(2)New Player","score":0,"time":2005.9566650391},{"id":0,"name":"New Player","score":0,"time":1943.0061035156},{"id":0,"name":"Madame Bonaparte","score":0,"time":1602.9127197266},{"id":0,"name":"Border","score":1,"time":1242.3610839844},{"id":0,"name":"postal39","score":13,"time":1074.4434814453},{"id":0,"name":"Old Player","score":13,"time":764.81652832031},{"id":0,"name":"Bolan","score":19,"time":556.65905761719},{"id":0,"name":"xzibit","score":3,"time":103.55981445312}],"port":27015,"protocol":17,"secure":1,"skillcfgfile":"skill.cfg","steam_id":90099097616031747,"steamappid":0,"sv_accelerate":"10","sv_admin_icon":"gfx\/icons\/admin.tga","sv_aim":"0","sv_airaccelerate":"10","sv_allowupload":"1","sv_alltalk":"0","sv_bounce":"1","sv_cheats":"0","sv_clienttrace":"1","sv_contact":"","sv_friction":"4","sv_gravity":"800","sv_logblocks":"0","sv_maxrate":"0","sv_maxspeed":"270","sv_minrate":"0","sv_password":"0","sv_proxies":"1","sv_stepsize":"18","sv_stopspeed":"100","sv_uploadmax":"0.5","sv_voiceenable":"1","sv_wateraccelerate":"10","sv_waterfriction":"1","version":"5.0.0.0"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Gta5m/1_response.txt b/gameq/tests/Protocols/Providers/Gta5m/1_response.txt new file mode 100644 index 0000000..ae3ab71 --- /dev/null +++ b/gameq/tests/Protocols/Providers/Gta5m/1_response.txt @@ -0,0 +1,2 @@ +infoResponse +\sv_maxclients\30\clients\4\challenge\xxx\gamename\CitizenFX\protocol\4\hostname\State of Union RP | State Wide RP | Civilian Jobs | ServerHostedMenu | Robbery's! | Now Hiring!\gametype\Freeroam\mapname\fivem-map-skater\iv\173148099 \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Gta5m/1_result.json b/gameq/tests/Protocols/Providers/Gta5m/1_result.json new file mode 100644 index 0000000..5c8e9a5 --- /dev/null +++ b/gameq/tests/Protocols/Providers/Gta5m/1_result.json @@ -0,0 +1 @@ +{"149.56.28.83:30120":{"clients":"4","gamename":"CitizenFX","gametype":"Freeroam","gq_address":"149.56.28.83","gq_joinlink":"","gq_name":"GTA Five M","gq_online":true,"gq_port_client":30120,"gq_port_query":30120,"gq_protocol":"gta5m","gq_transport":"udp","gq_type":"gta5m","hostname":"State of Union RP | State Wide RP | Civilian Jobs | ServerHostedMenu | Robbery's! | Now Hiring!","iv":"173148099","mapname":"fivem-map-skater","protocol":"4","sv_maxclients":"30"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Gta5m/2_response.txt b/gameq/tests/Protocols/Providers/Gta5m/2_response.txt new file mode 100644 index 0000000..796eef2 --- /dev/null +++ b/gameq/tests/Protocols/Providers/Gta5m/2_response.txt @@ -0,0 +1,2 @@ +infoResponse +\sv_maxclients\30\clients\0\challenge\xxx\gamename\CitizenFX\protocol\4\hostname\LIGHT 'EM UP ROLEPLAY\gametype\Freeroam\mapname\fivem-map-skater\iv\1194941742 \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Gta5m/2_result.json b/gameq/tests/Protocols/Providers/Gta5m/2_result.json new file mode 100644 index 0000000..75b20ca --- /dev/null +++ b/gameq/tests/Protocols/Providers/Gta5m/2_result.json @@ -0,0 +1 @@ +{"209.222.103.18:30180":{"clients":"0","gamename":"CitizenFX","gametype":"Freeroam","gq_address":"209.222.103.18","gq_joinlink":"","gq_name":"GTA Five M","gq_online":true,"gq_port_client":30180,"gq_port_query":30180,"gq_protocol":"gta5m","gq_transport":"udp","gq_type":"gta5m","hostname":"LIGHT 'EM UP ROLEPLAY","iv":"1194941742","mapname":"fivem-map-skater","protocol":"4","sv_maxclients":"30"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Gta5m/3_response.txt b/gameq/tests/Protocols/Providers/Gta5m/3_response.txt new file mode 100644 index 0000000..b6cd034 --- /dev/null +++ b/gameq/tests/Protocols/Providers/Gta5m/3_response.txt @@ -0,0 +1,2 @@ +infoResponse +\sv_maxclients\30\clients\0\challenge\xxx\gamename\CitizenFX\protocol\4\hostname\San Andreas County RP | Grand Opening Now Hiring | sasrpcommunity.enjin.com\gametype\Freeroam\mapname\fivem-map-skater\iv\1881510958 \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Gta5m/3_result.json b/gameq/tests/Protocols/Providers/Gta5m/3_result.json new file mode 100644 index 0000000..7bd55f4 --- /dev/null +++ b/gameq/tests/Protocols/Providers/Gta5m/3_result.json @@ -0,0 +1 @@ +{"158.69.240.178:30168":{"clients":"0","gamename":"CitizenFX","gametype":"Freeroam","gq_address":"158.69.240.178","gq_joinlink":"","gq_name":"GTA Five M","gq_online":true,"gq_port_client":30168,"gq_port_query":30168,"gq_protocol":"gta5m","gq_transport":"udp","gq_type":"gta5m","hostname":"San Andreas County RP | Grand Opening Now Hiring | sasrpcommunity.enjin.com","iv":"1881510958","mapname":"fivem-map-skater","protocol":"4","sv_maxclients":"30"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Gtan/1_response.txt b/gameq/tests/Protocols/Providers/Gtan/1_response.txt new file mode 100644 index 0000000..7434e6f --- /dev/null +++ b/gameq/tests/Protocols/Providers/Gtan/1_response.txt @@ -0,0 +1,9 @@ +HTTP/1.0 200 OK +Content-Type: text/html; charset=UTF-8 +Content-Length: 220 +Date: Tue, 29 Aug 2017 00:24:10 GMT +Accept-Ranges: bytes +Server: LiteSpeed +Connection: close + +{"ServerName":"Da Plug Roleplay | [Coming Soon]","IP":"46.105.37.0:4499","FQDN":"","Port":4499,"CurrentPlayers":0,"MaxPlayers":69,"Gamemode":"Da Plug RP v0.1.3","Map":null,"Passworded":true,"ServerVersion":"0.1.517.602"} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Gtan/1_result.json b/gameq/tests/Protocols/Providers/Gtan/1_result.json new file mode 100644 index 0000000..d547462 --- /dev/null +++ b/gameq/tests/Protocols/Providers/Gtan/1_result.json @@ -0,0 +1 @@ +{"46.105.37.0:4499":{"dedicated":1,"gq_address":"46.105.37.0","gq_joinlink":"","gq_name":"Grand Theft Auto Network","gq_online":true,"gq_port_client":4499,"gq_port_query":4499,"gq_protocol":"gtan","gq_transport":"ssl","gq_type":"gtan","hostname":"Da Plug Roleplay | [Coming Soon]","map":"Los Santos\/Blaine Country","maxplayers":69,"mod":"Da Plug RP v0.1.3","numplayers":0,"password":1,"serverversion":"0.1.517.602"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Gtan/2_response.txt b/gameq/tests/Protocols/Providers/Gtan/2_response.txt new file mode 100644 index 0000000..9766ca2 --- /dev/null +++ b/gameq/tests/Protocols/Providers/Gtan/2_response.txt @@ -0,0 +1,9 @@ +HTTP/1.0 200 OK +Content-Type: text/html; charset=UTF-8 +Content-Length: 188 +Date: Tue, 29 Aug 2017 00:25:10 GMT +Accept-Ranges: bytes +Server: LiteSpeed +Connection: close + +{"ServerName":"Twitch","IP":"95.42.224.183:1701","FQDN":"","Port":1701,"CurrentPlayers":0,"MaxPlayers":20,"Gamemode":"freeroam","Map":null,"Passworded":false,"ServerVersion":"0.1.517.602"} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Gtan/2_result.json b/gameq/tests/Protocols/Providers/Gtan/2_result.json new file mode 100644 index 0000000..7b66224 --- /dev/null +++ b/gameq/tests/Protocols/Providers/Gtan/2_result.json @@ -0,0 +1 @@ +{"95.42.224.183:1701":{"dedicated":1,"gq_address":"95.42.224.183","gq_joinlink":"","gq_name":"Grand Theft Auto Network","gq_online":true,"gq_port_client":1701,"gq_port_query":1701,"gq_protocol":"gtan","gq_transport":"ssl","gq_type":"gtan","hostname":"Twitch","map":"Los Santos\/Blaine Country","maxplayers":20,"mod":"freeroam","numplayers":0,"password":0,"serverversion":"0.1.517.602"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Hl2dm/1_response.txt b/gameq/tests/Protocols/Providers/Hl2dm/1_response.txt new file mode 100644 index 0000000..92fc1f9 Binary files /dev/null and b/gameq/tests/Protocols/Providers/Hl2dm/1_response.txt differ diff --git a/gameq/tests/Protocols/Providers/Hl2dm/1_result.json b/gameq/tests/Protocols/Providers/Hl2dm/1_result.json new file mode 100644 index 0000000..f260847 --- /dev/null +++ b/gameq/tests/Protocols/Providers/Hl2dm/1_result.json @@ -0,0 +1 @@ +{"134.161.116.40:27015":{"coop":"0","deathmatch":"1","decalfrequency":"10","dedicated":"d","fof_sv_item_respawn_time":"60","fof_sv_pricemult_dynamite":"1.0","fof_sv_pricemult_sharps":"1.0","fof_sv_recoilamount":"0.8","fof_sv_speedpenalty":"0.5","fof_sv_viewspring":"25","fof_sv_weapon_drop":"0","game_descr":"Break Bad","game_dir":"fof","game_id":265630,"gq_address":"134.161.116.40","gq_joinlink":"steam:\/\/connect\/134.161.116.40:27015\/","gq_name":"Half Life 2: Deathmatch","gq_online":true,"gq_port_client":27015,"gq_port_query":27015,"gq_protocol":"source","gq_transport":"udp","gq_type":"hl2dm","hostname":"Cedar Valley FoF BreakBad Server","keywords":"increased_maxplayers,RockTheVote,no_ads,no_nags,playervotes","map":"fof_cripplecreek","max_players":32,"metamod_version":"1.10.4-devV","mp_allowNPCs":"1","mp_autocrosshair":"1","mp_autoteambalance":"1","mp_disable_respawn_times":"0","mp_fadetoblack":"0","mp_falldamage":"0","mp_flashlight":"0","mp_footsteps":"1","mp_forceautoteam":"0","mp_forcerespawn":"1","mp_fraglimit":"0","mp_friendlyfire":"0","mp_holiday_nogifts":"0","mp_match_end_at_timelimit":"0","mp_maxrounds":"0","mp_respawnwavetime":"10.0","mp_scrambleteams_auto":"1","mp_scrambleteams_auto_windifference":"2","mp_stalemate_enable":"0","mp_stalemate_meleeonly":"0","mp_teamlist":"hgrunt;scientist","mp_teamplay":"1","mp_timelimit":"15","mp_tournament":"0","mp_weaponstay":"0","mp_winlimit":"0","nextlevel":"","num_bots":0,"num_players":30,"num_rules":86,"os":"l","password":0,"players":[{"id":0,"name":"jaminjeese","score":17,"time":9042.39453125},{"id":0,"name":"Lutheraner","score":12,"time":3352.8474121094},{"id":0,"name":"Pern Durnder","score":10,"time":2675.59765625},{"id":0,"name":"oliveman937","score":11,"time":2303.4855957031},{"id":0,"name":"hylian.g.hero","score":3,"time":2298.45703125},{"id":0,"name":"DrewBiezy","score":7,"time":2296.0454101562},{"id":0,"name":"luis mendoza","score":14,"time":2284.3220214844},{"id":0,"name":"santa doge","score":11,"time":2191.4963378906},{"id":0,"name":"Señor Coconut","score":10,"time":1863.7274169922},{"id":0,"name":"Everything You Do Is a Balloon","score":21,"time":1197.7541503906},{"id":0,"name":"JuryDiamondBR","score":3,"time":1106.4772949219},{"id":0,"name":"3DSMat","score":6,"time":1092.2291259766},{"id":0,"name":"NomadKing","score":13,"time":1046.4791259766},{"id":0,"name":"u w0t m8","score":10,"time":836.86950683594},{"id":0,"name":"FunAtTheZOO","score":12,"time":819.82171630859},{"id":0,"name":"mooncleric","score":5,"time":817.44458007812},{"id":0,"name":"TechMonkey","score":14,"time":741.81433105469},{"id":0,"name":"Timmysteve","score":12,"time":681.95440673828},{"id":0,"name":"elpicardo123","score":6,"time":528.11419677734},{"id":0,"name":"The Shipwrecked Player","score":7,"time":514.25744628906},{"id":0,"name":"Paul_The_Ocelot","score":10,"time":334.24230957031},{"id":0,"name":"TerroristPanda7","score":9,"time":318.55563354492},{"id":0,"name":"docbarkker","score":4,"time":293.85961914062},{"id":0,"name":"x-mail_2000","score":1,"time":221.47618103027},{"id":0,"name":"Not Monki?","score":2,"time":166.95143127441},{"id":0,"name":"The Hero Of Time","score":1,"time":143.57806396484},{"id":0,"name":"[e-b0sh]_Pozitiv","score":2,"time":137.68046569824},{"id":0,"name":"Player 1 + Player 2","score":13,"time":123.81007385254},{"id":0,"name":"[FaG] ilosho","score":1,"time":106.71417999268},{"id":0,"name":"Tizor14","score":1,"time":27.424100875854}],"port":27015,"protocol":17,"r_AirboatViewDampenDamp":"1.0","r_AirboatViewDampenFreq":"7.0","r_AirboatViewZHeight":"0.0","r_JeepViewDampenDamp":"1.0","r_JeepViewDampenFreq":"7.0","r_JeepViewZHeight":"10.0","r_VehicleViewDampen":"1","regexfilter_enable":"1","secure":1,"sm_afkm_version":"3.5.2","sm_customvotes_version":"1.7","sm_nextmap":"fof_cripplecreek","sourcemod_version":"1.6.3-dev+4588","steam_id":85568392920045856,"steamappid":0,"sv_accelerate":"4.25","sv_airaccelerate":"10","sv_alltalk":"1","sv_bounce":"0","sv_cheats":"0","sv_contact":"","sv_footsteps":"1","sv_friction":"4","sv_gravity":"600","sv_hl2mp_weapon_respawn_time":"90","sv_maxspeed":"320","sv_maxusrcmdprocessticks":"24","sv_noclipaccelerate":"5","sv_noclipspeed":"5","sv_password":"0","sv_pausable":"0","sv_report_client_settings":"0","sv_rollangle":"0","sv_rollspeed":"200","sv_specaccelerate":"5","sv_specnoclip":"1","sv_specspeed":"3","sv_steamgroup":"","sv_stepsize":"18","sv_stopspeed":"100","sv_tags":"increased_maxplayers,RockTheVote,no_ads,no_nags,playervotes","sv_voiceenable":"1","sv_wateraccelerate":"10","sv_waterfriction":"1","tf_arena_max_streak":"3","tf_arena_preround_time":"10","tf_arena_round_time":"0","tf_arena_use_queue":"1","tv_enable":"0","tv_password":"0","tv_relaypassword":"0","version":"207"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Hl2dm/2_response.txt b/gameq/tests/Protocols/Providers/Hl2dm/2_response.txt new file mode 100644 index 0000000..6102e59 Binary files /dev/null and b/gameq/tests/Protocols/Providers/Hl2dm/2_response.txt differ diff --git a/gameq/tests/Protocols/Providers/Hl2dm/2_result.json b/gameq/tests/Protocols/Providers/Hl2dm/2_result.json new file mode 100644 index 0000000..cec4a1e --- /dev/null +++ b/gameq/tests/Protocols/Providers/Hl2dm/2_result.json @@ -0,0 +1 @@ +{"208.94.245.130:27016":{"cheatcontrol_version":"1.5","coop":"0","damagesound_version":"2.1","deathmatch":"1","decalfrequency":"5","dedicated":"d","door_version":"2.0","game_descr":"Syle22's Roleplay","game_dir":"hl2mp","game_id":320,"goto_version":"1.3","gq_address":"208.94.245.130","gq_joinlink":"steam:\/\/connect\/208.94.245.130:27016\/","gq_name":"Half Life 2: Deathmatch","gq_online":true,"gq_port_client":27016,"gq_port_query":27016,"gq_protocol":"source","gq_transport":"udp","gq_type":"hl2dm","hl2dm_trail_ball_version":"1.1","hostname":"CoLD Community Roleplay |Purge District| New Map |","keywords":"alltalk,increased_maxplayers","map":"rp_Linesse_r3","max_players":32,"metamod_version":"1.10.4V","mp_allowNPCs":"1","mp_autocrosshair":"1","mp_autoteambalance":"1","mp_disable_respawn_times":"0","mp_fadetoblack":"0","mp_falldamage":"1","mp_flashlight":"1","mp_footsteps":"1","mp_forceautoteam":"0","mp_forcerespawn":"1","mp_fraglimit":"0","mp_friendlyfire":"1","mp_holiday_nogifts":"0","mp_match_end_at_timelimit":"0","mp_maxrounds":"0","mp_respawnwavetime":"10.0","mp_scrambleteams_auto":"1","mp_scrambleteams_auto_windifference":"2","mp_stalemate_enable":"0","mp_stalemate_meleeonly":"0","mp_teamlist":"hgrunt;scientist","mp_teamplay":"1","mp_teams_unbalance_limit":"1","mp_timelimit":"0","mp_tournament":"0","mp_weaponstay":"0","mp_winlimit":"0","nextlevel":"","num_bots":0,"num_players":11,"num_rules":110,"os":"w","password":0,"players":[{"id":0,"name":"Burza","score":-1,"time":9244.4755859375},{"id":0,"name":"0p$ K!ll@ Ðн° [DG]","score":128,"time":9186.2099609375},{"id":0,"name":"585-200-7340 SEND NUDES","score":56,"time":8766.9306640625},{"id":0,"name":"0atmeal - Op4℧","score":1694,"time":6038.1142578125},{"id":0,"name":"(λ)KuroShukun","score":1171,"time":3188.6105957031},{"id":0,"name":"DoleBananas-Op4","score":488,"time":3008.7155761719},{"id":0,"name":"LaWlRuS WaLrUs","score":112,"time":2540.8051757812},{"id":0,"name":"","score":0,"time":2205.4792480469},{"id":0,"name":":: AP :: ThunderShorts","score":254,"time":1466.3548583984},{"id":0,"name":"Blanche Nègre","score":421,"time":1449.3155517578},{"id":0,"name":"","score":0,"time":9.795464515686}],"plr_version":"PLR Version 1.2.1","port":27016,"protocol":17,"r_AirboatViewDampenDamp":"1.0","r_AirboatViewDampenFreq":"7.0","r_AirboatViewZHeight":"0.0","r_JeepViewDampenDamp":"1.0","r_JeepViewDampenFreq":"7.0","r_JeepViewZHeight":"10.0","r_VehicleViewDampen":"1","roleplay_mod_Sylesrp":"2.0","roleplay_version":"2.0","rp_spawnprotect_version":"0.1","rp_tools":"1.0","rp_version":"1.3","sb_version":"1.4.10","secure":1,"sm_admin_cheats_version":"0.2","sm_admin_sounds_version":"1.0.1","sm_adminsmite_version":"2.1","sm_advertisements_version":"0.5.5","sm_doublejump_boost":"250","sm_doublejump_enabled":"1","sm_doublejump_max":"1","sm_downloader_version":"1.4","sm_evilbeam_version":"1.0.100","sm_funcommandsx_version":"2.3","sm_ion_version":"1.2.1","sm_nextmap":"dm_overwatch","sm_nukem_version":"1.2.7","sm_quakesoundsv3_version":"3.4.2","sm_ragdolls_version":"1.2.4","sm_rconlock":"0.6.7","sm_supercmds_version":"0.51","smac_version":"0.8.6.0","sourcemod_version":"1.7.0","spawn_version":"1.0","st_gamedesc_override_version":"1.0.1","steam_id":90094492254047239,"steamappid":320,"steamtools_version":"0.8.3","sv_accelerate":"10","sv_airaccelerate":"10","sv_alltalk":"1","sv_bounce":"0","sv_contact":"","sv_footsteps":"1","sv_friction":"4","sv_gravity":"600","sv_hl2mp_item_respawn_time":"30","sv_hl2mp_weapon_respawn_time":"20","sv_maxspeed":"320","sv_maxusrcmdprocessticks":"24","sv_noclipaccelerate":"5","sv_noclipspeed":"5","sv_password":"0","sv_pausable":"0","sv_report_client_settings":"0","sv_rollangle":"0","sv_rollspeed":"200","sv_specaccelerate":"5","sv_specnoclip":"1","sv_specspeed":"3","sv_steamgroup":"","sv_stepsize":"18","sv_stopspeed":"100","sv_tags":"alltalk,increased_maxplayers","sv_voiceenable":"1","sv_wateraccelerate":"10","sv_waterfriction":"1","tf_arena_max_streak":"3","tf_arena_preround_time":"10","tf_arena_round_time":"0","tf_arena_use_queue":"1","tv_enable":"0","tv_password":"0","tv_relaypassword":"0","version":"2230303","vip_version":"1.0"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Insurgency/1_response.txt b/gameq/tests/Protocols/Providers/Insurgency/1_response.txt new file mode 100644 index 0000000..89f2367 Binary files /dev/null and b/gameq/tests/Protocols/Providers/Insurgency/1_response.txt differ diff --git a/gameq/tests/Protocols/Providers/Insurgency/1_result.json b/gameq/tests/Protocols/Providers/Insurgency/1_result.json new file mode 100644 index 0000000..fb449be --- /dev/null +++ b/gameq/tests/Protocols/Providers/Insurgency/1_result.json @@ -0,0 +1 @@ +{"74.91.123.190:27015":{"dedicated":"d","game_descr":"Insurgency","game_dir":"insurgency","game_id":222880,"gq_address":"74.91.123.190","gq_joinlink":"steam:\/\/connect\/74.91.123.190:27015\/","gq_name":"Insurgency","gq_online":true,"gq_port_client":27015,"gq_port_query":27015,"gq_protocol":"source","gq_transport":"udp","gq_type":"insurgency","hostname":".insatiable. Gaming [Day Of Infamy #2][Stats][NYC]","keywords":"g:invasion,p:doi\/pvp_sustained,t:doi,v:2160,pure:-1,","map":"doi_dog_red","max_players":32,"mp_timelimit":"30","mp_winlimit":"3","nextlevel":"","num_bots":0,"num_players":12,"num_rules":3,"os":"w","password":0,"players":[{"id":0,"name":"Dj_HerrWolf (NSDAP)

","score":0,"time":60886.8984375},{"id":0,"name":"FRANK IS LOVE FRANK IS LIFE","score":0,"time":54908.07421875},{"id":0,"name":"Lurk Skywalter","score":12,"time":2115.1374511719},{"id":0,"name":"{KOFL} Snipz18","score":13,"time":1503.4805908203},{"id":0,"name":"Tuna Donger","score":6,"time":996.96612548828},{"id":0,"name":"Zig","score":8,"time":975.10668945312},{"id":0,"name":"Not Hitler","score":5,"time":441.17144775391},{"id":0,"name":"Jaxified","score":2,"time":236.81280517578},{"id":0,"name":"WHALES","score":1,"time":144.89083862305},{"id":0,"name":"DStainn","score":1,"time":144.43766784668},{"id":0,"name":"[CryO] busdriver | Trial","score":0,"time":110.6251449585},{"id":0,"name":"Alex the Amish Electrician","score":0,"time":59.000080108643}],"port":27015,"protocol":17,"secure":1,"steam_id":90099821403782151,"steamappid":0,"version":"2.1.6.0"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Insurgency/2_response.txt b/gameq/tests/Protocols/Providers/Insurgency/2_response.txt new file mode 100644 index 0000000..3270204 Binary files /dev/null and b/gameq/tests/Protocols/Providers/Insurgency/2_response.txt differ diff --git a/gameq/tests/Protocols/Providers/Insurgency/2_result.json b/gameq/tests/Protocols/Providers/Insurgency/2_result.json new file mode 100644 index 0000000..7d5a71e --- /dev/null +++ b/gameq/tests/Protocols/Providers/Insurgency/2_result.json @@ -0,0 +1 @@ +{"74.91.115.228:27015":{"dedicated":"d","game_descr":"Insurgency","game_dir":"insurgency","game_id":222880,"gq_address":"74.91.115.228","gq_joinlink":"steam:\/\/connect\/74.91.115.228:27015\/","gq_name":"Insurgency","gq_online":true,"gq_port_client":27015,"gq_port_query":27015,"gq_protocol":"source","gq_transport":"udp","gq_type":"insurgency","hostname":"Weekend Warriors {FIREFIGHT Mode}","keywords":"g:firefight,p:nwi\/pvp_tactical,t:default,v:2160,pure:1,deathmsgs,noff,","map":"embassy","max_players":24,"mp_timelimit":"30","mp_winlimit":"3","nextlevel":"","num_bots":0,"num_players":0,"num_rules":3,"os":"w","password":0,"port":27015,"protocol":17,"secure":1,"steam_id":90099831295266817,"steamappid":0,"version":"2.1.6.0"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Jediacademy/1_response.txt b/gameq/tests/Protocols/Providers/Jediacademy/1_response.txt new file mode 100644 index 0000000..c07c496 --- /dev/null +++ b/gameq/tests/Protocols/Providers/Jediacademy/1_response.txt @@ -0,0 +1,32 @@ +statusResponse +\version\JAmp: v1.0.1.0 linux-i386 Jul 30 2017\timelimit\25\sv_privateClients\0\sv_minRate\0\sv_minPing\0\sv_maxrate\50000\sv_maxclients\32\sv_maxPing\999\sv_hostname\^5{^2JoF^5}^2Public Server\sv_fps\30\sv_floodProtect\1\sv_autoDemo\0\sv_allowdownload\0\server_host\www.jka.io\protocol\26\mapname\T1_Danger\jp_highlander\0\jp_cinfo\102355\jp_DuelAlpha\100\gamename\JA+ Mod v2.4 B7\g_weaponDisable\524286\g_stepSlideFix\1\g_siegeTeamSwitch\1\g_siegeTeam2\none\g_siegeTeam1\none\g_siegeRespawn\20\g_showDuelHealths\0\g_saberWallDamageScale\0.4\g_saberLocking\0\g_privateDuel\1\g_needpass\0\g_maxHolocronCarry\3\g_maxGameClients\0\g_maxForceRank\7\g_jediVmerc\0\g_gametype\0\g_forceRegenTime\0\g_forcePowerDisable\163837\g_forceBasedTeams\0\g_duelWeaponDisable\1\g_debugMelee\1\fraglimit\00\duel_fraglimit\10\dmflags\640\capturelimit\5\bot_minplayers\0\V\2.4B7 +18 64 "^3$^0JoF^3$^7Lun^4atic^3|^0J^3|" +2 61 "^0{^7JoF^0}^7General Phantom" +8 63 "^8{JoF^8}^9Kess^3^5{I}" +5 47 "^1{JoF}^5Warump^1{I}" +6 58 "^5{^0JoF^5}^0Shadow^5{^0P^5}" +0 0 "^5{^2We Are Recruiting!^5} " +0 0 "^5WWW.JoFACADEMY.EU " +0 0 "^3/AMMOTD for Rules! " +0 33 "^6{^3JoFA^6}^3Mara^6{^3A^6}" +2 31 "^5{^0JoFA^5}^0l^5ack^0fire^5{^" +0 0 "^5{^2MAIN Forums At:^5} " +0 0 "^5WWW.JediofFreedom.EU" +1 31 "^3{JoF} ^2Jedi ^3Top^2BuZz" +0 16 "^7Walid^5." +19 136 "^2(JoF)^4Snake^2[J]" +7 33 "^0{{^6S^0}}^6S^0enek^6_^0{^6SM^" +0 64 "^1^^8inVision^1][^^8Myst" +16 66 "h0ppe" +15 66 "^1{JoFA}^5PsYh0^1{A}" +12 28 "^3{^0JoFA^3}^0^3!^0lly^3{^0A^3" +1 64 "^7a^0L^7do" +5 33 "^2{^8JoFA^2}^8Chilleh^2{^8A^2}" +97 19 "^7DarK^1'^7St^10^7nE" +4 53 "^7JoF ^5| ^7Jedi Grubby" +13 130 "^1{{^0S^1}}^0Instructor Bilbo" +4 36 "Kelevra" +5 25 "^2{JoF} ^6Elestial ^2^2{I}" +4 33 "^1jof^0.^5mark^0.^1vm" +4 43 "{JoFA}Hiimconor{A}" +10 48 "^5{^2JoFA^5}^5Waas{^2A^5}" diff --git a/gameq/tests/Protocols/Providers/Jediacademy/1_result.json b/gameq/tests/Protocols/Providers/Jediacademy/1_result.json new file mode 100644 index 0000000..98e3a1f --- /dev/null +++ b/gameq/tests/Protocols/Providers/Jediacademy/1_result.json @@ -0,0 +1 @@ +{"94.23.165.161:29070":{"V":"2.4B7","bot_minplayers":"0","capturelimit":"5","clients":30,"dmflags":"640","duel_fraglimit":"10","fraglimit":"00","g_debugMelee":"1","g_duelWeaponDisable":"1","g_forceBasedTeams":"0","g_forcePowerDisable":"163837","g_forceRegenTime":"0","g_gametype":"0","g_jediVmerc":"0","g_maxForceRank":"7","g_maxGameClients":"0","g_maxHolocronCarry":"3","g_needpass":"0","g_privateDuel":"1","g_saberLocking":"0","g_saberWallDamageScale":"0.4","g_showDuelHealths":"0","g_siegeRespawn":"20","g_siegeTeam1":"none","g_siegeTeam2":"none","g_siegeTeamSwitch":"1","g_stepSlideFix":"1","g_weaponDisable":"524286","gamename":"JA+ Mod v2.4 B7","gq_address":"94.23.165.161","gq_joinlink":"","gq_name":"Star Wars Jedi Knight: Jedi Academy","gq_online":true,"gq_port_client":29070,"gq_port_query":29070,"gq_protocol":"quake3","gq_transport":"udp","gq_type":"jediacademy","jp_DuelAlpha":"100","jp_cinfo":"102355","jp_highlander":"0","mapname":"T1_Danger","players":[{"frags":"18","ping":"64","name":"^3$^0JoF^3$^7Lun^4atic^3|^0J^3|"},{"frags":"2","ping":"61","name":"^0{^7JoF^0}^7General Phantom"},{"frags":"8","ping":"63","name":"^8{JoF^8}^9Kess^3^5{I}"},{"frags":"5","ping":"47","name":"^1{JoF}^5Warump^1{I}"},{"frags":"6","ping":"58","name":"^5{^0JoF^5}^0Shadow^5{^0P^5}"},{"frags":"0","ping":"0","name":"^5{^2We Are Recruiting!^5}"},{"frags":"0","ping":"0","name":"^5WWW.JoFACADEMY.EU"},{"frags":"0","ping":"0","name":"^3\/AMMOTD for Rules!"},{"frags":"0","ping":"33","name":"^6{^3JoFA^6}^3Mara^6{^3A^6}"},{"frags":"2","ping":"31","name":"^5{^0JoFA^5}^0ßl^5ack^0fire^5{^"},{"frags":"0","ping":"0","name":"^5{^2MAIN Forums At:^5}"},{"frags":"0","ping":"0","name":"^5WWW.JediofFreedom.EU"},{"frags":"1","ping":"31","name":"^3{JoF} ^2Jedi ^3Top^2BuZz"},{"frags":"0","ping":"16","name":"^7Walid^5."},{"frags":"19","ping":"136","name":"^2(JoF)^4Snake^2[J]"},{"frags":"7","ping":"33","name":"^0{{^6S^0}}^6S^0enek^6_^0{^6SM^"},{"frags":"0","ping":"64","name":"^1^^8inVision^1][^^8Myst"},{"frags":"16","ping":"66","name":"h0ppe"},{"frags":"15","ping":"66","name":"^1{JoFA}^5PsY©h0^1{A}"},{"frags":"12","ping":"28","name":"^3{^0JoFA^3}^0ß^3!^0lly^3{^0A^3"},{"frags":"1","ping":"64","name":"^7a^0L^7do"},{"frags":"5","ping":"33","name":"^2{^8JoFA^2}^8Chilleh^2{^8A^2}"},{"frags":"97","ping":"19","name":"^7DarK^1'^7St^10^7nE"},{"frags":"4","ping":"53","name":"^7JoF ^5| ^7Jedi Grubby"},{"frags":"13","ping":"130","name":"^1{{^0S^1}}^0Instructor Bilbo"},{"frags":"4","ping":"36","name":"Kelevra"},{"frags":"5","ping":"25","name":"^2{JoF} ^6Elestial ^2^2{I}"},{"frags":"4","ping":"33","name":"^1jof^0.^5mark^0.^1vm"},{"frags":"4","ping":"43","name":"{JoFA}Hiimconor{A}"},{"frags":"10","ping":"48","name":"^5{^2JoFA^5}^5Waas{^2A^5}"}],"protocol":"26","server_host":"www.jka.io","sv_allowdownload":"0","sv_autoDemo":"0","sv_floodProtect":"1","sv_fps":"30","sv_hostname":"^5{^2JoF^5}^2Public Server","sv_maxPing":"999","sv_maxclients":"32","sv_maxrate":"50000","sv_minPing":"0","sv_minRate":"0","sv_privateClients":"0","timelimit":"25","version":"JAmp: v1.0.1.0 linux-i386 Jul 30 2017"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Jediacademy/2_response.txt b/gameq/tests/Protocols/Providers/Jediacademy/2_response.txt new file mode 100644 index 0000000..95da36c --- /dev/null +++ b/gameq/tests/Protocols/Providers/Jediacademy/2_response.txt @@ -0,0 +1,7 @@ +statusResponse +\g_gravity\800\g_jediVmerc\1\g_maxGameClients\0\g_HideHUDFromSpecs\1\g_noSpecMove\0\g_TKPointsKickCount\600\g_TKPointsSpecCount\400\g_EUAllowed\1\g_TimePeriod\0\g_allowedVillainClasses\0\g_allowedHeroClasses\0\g_Authenticity\2\sv_maxConnections\3\g_AntiCheat\1\g_allowunbalance\1\g_autoteambalance\0\g_ShuffleTimer\300\sv_floodProtect\1\sv_maxPing\0\sv_minPing\0\sv_maxRate\25000\sv_maxclients\32\sv_hostname\^4{B^2G} ^4S^2erver ^4[^2FA^4][^2RTV^4]\sv_privateClients\0\g_gametype\7\timelimit\0\fraglimit\0\version\JAmp: v1.0.1.1 linux-i386 Nov 10 2003\dmflags\0\capturelimit\0\g_maxHolocronCarry\3\g_privateDuel\1\g_saberLocking\1\g_maxForceRank\6\duel_fraglimit\10\g_forceBasedTeams\0\g_duelWeaponDisable\1\g_needpass\0\protocol\26\mapname\mb2_yavinassault_veh\sv_allowDownload\0\bot_minplayers\0\gamename\Movie Battles II V1.4.5\g_SiegeClassQueue\`cb`caba`cc`ccba\bg_fighterAltControl\0\RTVRTM\3807/3.6b +0 79 "Srs^1Clone" +0 46 "^6mylittlexenomorph" +0 148 "^2Gamer^1Red^3Neck" +0 33 "^4Zarabon" +0 45 "hunGarry" diff --git a/gameq/tests/Protocols/Providers/Jediacademy/2_result.json b/gameq/tests/Protocols/Providers/Jediacademy/2_result.json new file mode 100644 index 0000000..43b9d04 --- /dev/null +++ b/gameq/tests/Protocols/Providers/Jediacademy/2_result.json @@ -0,0 +1 @@ +{"91.134.183.153:29073":{"RTVRTM":"3807\/3.6b","bg_fighterAltControl":"0","bot_minplayers":"0","capturelimit":"0","clients":5,"dmflags":"0","duel_fraglimit":"10","fraglimit":"0","g_AntiCheat":"1","g_Authenticity":"2","g_EUAllowed":"1","g_HideHUDFromSpecs":"1","g_ShuffleTimer":"300","g_SiegeClassQueue":"`cb`caba`cc`ccba","g_TKPointsKickCount":"600","g_TKPointsSpecCount":"400","g_TimePeriod":"0","g_allowedHeroClasses":"0","g_allowedVillainClasses":"0","g_allowunbalance":"1","g_autoteambalance":"0","g_duelWeaponDisable":"1","g_forceBasedTeams":"0","g_gametype":"7","g_gravity":"800","g_jediVmerc":"1","g_maxForceRank":"6","g_maxGameClients":"0","g_maxHolocronCarry":"3","g_needpass":"0","g_noSpecMove":"0","g_privateDuel":"1","g_saberLocking":"1","gamename":"Movie Battles II V1.4.5","gq_address":"91.134.183.153","gq_joinlink":"","gq_name":"Star Wars Jedi Knight: Jedi Academy","gq_online":true,"gq_port_client":29073,"gq_port_query":29073,"gq_protocol":"quake3","gq_transport":"udp","gq_type":"jediacademy","mapname":"mb2_yavinassault_veh","players":[{"frags":"0","ping":"79","name":"Srs^1Clone"},{"frags":"0","ping":"46","name":"^6mylittlexenomorph"},{"frags":"0","ping":"148","name":"^2Gamer^1Red^3Neck"},{"frags":"0","ping":"33","name":"^4Zarabon"},{"frags":"0","ping":"45","name":"hunGarry"}],"protocol":"26","sv_allowDownload":"0","sv_floodProtect":"1","sv_hostname":"^4{B^2G} ^4S^2erver ^4[^2FA^4][^2RTV^4]","sv_maxConnections":"3","sv_maxPing":"0","sv_maxRate":"25000","sv_maxclients":"32","sv_minPing":"0","sv_privateClients":"0","timelimit":"0","version":"JAmp: v1.0.1.1 linux-i386 Nov 10 2003"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Jediacademy/3_response.txt b/gameq/tests/Protocols/Providers/Jediacademy/3_response.txt new file mode 100644 index 0000000..6d5300c --- /dev/null +++ b/gameq/tests/Protocols/Providers/Jediacademy/3_response.txt @@ -0,0 +1,2 @@ +statusResponse +\sv_maxclients\10\version\SzlakiemJedi-engine\ojp_allowBodyDodge\1\ojp_skipcutscenes\0\g_allowBotLimit\0\g_maxBots\1\g_minHumans\2\g_siegeTeam2\none\g_siegeTeam1\none\g_siegeTeamSwitch\1\g_siegeRespawn\20\g_forcePowerDisable\0\g_dodgeRegenTime\1000\g_saberanimspeed\1\g_saberDamageScale\1\g_jediVmerc\0\g_maxGameClients\0\g_weapondisable\0\g_forceRegenTime\400\sv_fps\50\sv_floodProtect\1\sv_maxPing\0\sv_minPing\0\sv_maxRate\0\sv_hostname\Szlakiem Jedi [szlakiem-jedi.pl]\g_duelWeaponDisable\1\g_forceBasedTeams\0\duel_fraglimit\0\g_saberLocking\1\g_privateDuel\1\capturelimit\0\timelimit\0\fraglimit\0\dmflags\0\g_maxHolocronCarry\3\g_maxForceRank\6\g_gametype\0\g_needpass\1\protocol\26\mapname\prakith\sv_privateClients\0\sv_allowDownload\1\gamename\Szlakiem Jedi RP v 1.1\g_debugMelee\0\g_stepSlideFix\1\g_noSpecMove\0\g_allowNPC\1\g_saberWallDamageScale\0.4\bg_fighterAltControl\0\g_showDuelHealths\0 diff --git a/gameq/tests/Protocols/Providers/Jediacademy/3_result.json b/gameq/tests/Protocols/Providers/Jediacademy/3_result.json new file mode 100644 index 0000000..5ffa0fa --- /dev/null +++ b/gameq/tests/Protocols/Providers/Jediacademy/3_result.json @@ -0,0 +1 @@ +{"193.33.177.18:26005":{"bg_fighterAltControl":"0","capturelimit":"0","clients":0,"dmflags":"0","duel_fraglimit":"0","fraglimit":"0","g_allowBotLimit":"0","g_allowNPC":"1","g_debugMelee":"0","g_dodgeRegenTime":"1000","g_duelWeaponDisable":"1","g_forceBasedTeams":"0","g_forcePowerDisable":"0","g_forceRegenTime":"400","g_gametype":"0","g_jediVmerc":"0","g_maxBots":"1","g_maxForceRank":"6","g_maxGameClients":"0","g_maxHolocronCarry":"3","g_minHumans":"2","g_needpass":"1","g_noSpecMove":"0","g_privateDuel":"1","g_saberDamageScale":"1","g_saberLocking":"1","g_saberWallDamageScale":"0.4","g_saberanimspeed":"1","g_showDuelHealths":"0","g_siegeRespawn":"20","g_siegeTeam1":"none","g_siegeTeam2":"none","g_siegeTeamSwitch":"1","g_stepSlideFix":"1","g_weapondisable":"0","gamename":"Szlakiem Jedi RP v 1.1","gq_address":"193.33.177.18","gq_joinlink":"","gq_name":"Star Wars Jedi Knight: Jedi Academy","gq_online":true,"gq_port_client":26005,"gq_port_query":26005,"gq_protocol":"quake3","gq_transport":"udp","gq_type":"jediacademy","mapname":"prakith","ojp_allowBodyDodge":"1","ojp_skipcutscenes":"0","protocol":"26","sv_allowDownload":"1","sv_floodProtect":"1","sv_fps":"50","sv_hostname":"Szlakiem Jedi [szlakiem-jedi.pl]","sv_maxPing":"0","sv_maxRate":"0","sv_maxclients":"10","sv_minPing":"0","sv_privateClients":"0","timelimit":"0","version":"SzlakiemJedi-engine"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Jedioutcast/1_response.txt b/gameq/tests/Protocols/Providers/Jedioutcast/1_response.txt new file mode 100644 index 0000000..21b259e --- /dev/null +++ b/gameq/tests/Protocols/Providers/Jedioutcast/1_response.txt @@ -0,0 +1,6 @@ +statusResponse +\version\JK2MP: v1.04mv linux-amd64 Mar 27 2017\sv_maxclients\32\bot_minplayers\2\capturelimit\20\dmflags\0\duel_fraglimit\1\fraglimit\0\g_blueteam\Rebellion\g_duelWeaponDisable\0\g_forceBasedTeams\0\g_forcePowerDisable\0\g_forceRegenTime\200\g_gametype\7\g_jediVmerc\0\g_maxForceRank\7\g_maxGameClients\0\g_privateDuel\1\g_redteam\Empire\g_saberLocking\1\g_weapondisable\0\mv_httpdownloads\0\sv_allowDownload\0\sv_floodProtect\1\sv_hostname\[united] Coruscant\sv_maxPing\0\sv_maxRate\40000\sv_minPing\0\timelimit\20\protocol\16\JK2MV\1.3.1\g_maxHolocronCarry\3\g_needpass\0\mapname\ctf_yavin\sv_privateClients\0\sv_allowAnonymous\0\gamename\basejk +0 0 "Reelo" +10 0 "Luke" +11 0 "Krussk" +10 0 "Lieutenant_Cabbel" diff --git a/gameq/tests/Protocols/Providers/Jedioutcast/1_result.json b/gameq/tests/Protocols/Providers/Jedioutcast/1_result.json new file mode 100644 index 0000000..efdb323 --- /dev/null +++ b/gameq/tests/Protocols/Providers/Jedioutcast/1_result.json @@ -0,0 +1 @@ +{"88.99.15.239:28070":{"JK2MV":"1.3.1","bot_minplayers":"2","capturelimit":"20","clients":4,"dmflags":"0","duel_fraglimit":"1","fraglimit":"0","g_blueteam":"Rebellion","g_duelWeaponDisable":"0","g_forceBasedTeams":"0","g_forcePowerDisable":"0","g_forceRegenTime":"200","g_gametype":"7","g_jediVmerc":"0","g_maxForceRank":"7","g_maxGameClients":"0","g_maxHolocronCarry":"3","g_needpass":"0","g_privateDuel":"1","g_redteam":"Empire","g_saberLocking":"1","g_weapondisable":"0","gamename":"basejk","gq_address":"88.99.15.239","gq_joinlink":"","gq_name":"Star Wars Jedi Knight II: Jedi Outcast","gq_online":true,"gq_port_client":28070,"gq_port_query":28070,"gq_protocol":"quake3","gq_transport":"udp","gq_type":"jedioutcast","mapname":"ctf_yavin","mv_httpdownloads":"0","players":[{"frags":"0","ping":"0","name":"Reelo"},{"frags":"10","ping":"0","name":"Luke"},{"frags":"11","ping":"0","name":"Krussk"},{"frags":"10","ping":"0","name":"Lieutenant_Cabbel"}],"protocol":"16","sv_allowAnonymous":"0","sv_allowDownload":"0","sv_floodProtect":"1","sv_hostname":"[united] Coruscant","sv_maxPing":"0","sv_maxRate":"40000","sv_maxclients":"32","sv_minPing":"0","sv_privateClients":"0","timelimit":"20","version":"JK2MP: v1.04mv linux-amd64 Mar 27 2017"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Jedioutcast/2_response.txt b/gameq/tests/Protocols/Providers/Jedioutcast/2_response.txt new file mode 100644 index 0000000..c243b4f --- /dev/null +++ b/gameq/tests/Protocols/Providers/Jedioutcast/2_response.txt @@ -0,0 +1,17 @@ +statusResponse +\version\JK2MP: v1.02mv linux-amd64 Mar 27 2017\sv_maxclients\20\capturelimit\7\dmflags\0\duel_fraglimit\10\fraglimit\0\g_duelWeaponDisable\65531\g_forceBasedTeams\0\g_forcepowerdisable\262143\g_gametype\7\g_maxForceRank\7\g_privateDuel\1\g_saberLocking\0\g_weapondisable\12284\mv_httpdownloads\1\sv_allowDownload\0\sv_floodProtect\1\sv_hostname\< ^3CTF ^7>\sv_maxPing\0\sv_maxRate\50000\sv_minPing\0\timelimit\0\protocol\15\JK2MV\1.3.1\g_maxHolocronCarry\3\g_needpass\0\mapname\ctf_yavin\sv_privateClients\0\sv_allowAnonymous\0\gamename\basejk +239 97 "^1Manufactura" +188 87 "^4^4sonic" +75 37 "Padawan" +103 56 "^1i | ^6In Flam^3e" +10 65 "^&^*i'm baby Gr^_oo^*T" +150 57 "Padawan" +112 42 "Padawan" +243 53 "^d^1^d<(^wCjS^d)>^w v^1O^wlaTil" +30 45 "^7b0b" +-2 54 "^3^3^7_ph^1e^4^4^7Zor" +204 50 "Padawan" +79 62 "^1Padawan" +113 60 "^1shax" +344 64 "n0vaLyfe" +195 67 "^4^4sonic^7" diff --git a/gameq/tests/Protocols/Providers/Jedioutcast/2_result.json b/gameq/tests/Protocols/Providers/Jedioutcast/2_result.json new file mode 100644 index 0000000..446f776 --- /dev/null +++ b/gameq/tests/Protocols/Providers/Jedioutcast/2_result.json @@ -0,0 +1 @@ +{"31.214.209.81:28070":{"JK2MV":"1.3.1","capturelimit":"7","clients":15,"dmflags":"0","duel_fraglimit":"10","fraglimit":"0","g_duelWeaponDisable":"65531","g_forceBasedTeams":"0","g_forcepowerdisable":"262143","g_gametype":"7","g_maxForceRank":"7","g_maxHolocronCarry":"3","g_needpass":"0","g_privateDuel":"1","g_saberLocking":"0","g_weapondisable":"12284","gamename":"basejk","gq_address":"31.214.209.81","gq_joinlink":"","gq_name":"Star Wars Jedi Knight II: Jedi Outcast","gq_online":true,"gq_port_client":28070,"gq_port_query":28070,"gq_protocol":"quake3","gq_transport":"udp","gq_type":"jedioutcast","mapname":"ctf_yavin","mv_httpdownloads":"1","players":[{"frags":"239","ping":"97","name":"^1Manufactura"},{"frags":"188","ping":"87","name":"^4^4sonic"},{"frags":"75","ping":"37","name":"Padawan"},{"frags":"103","ping":"56","name":"^1i | ^6In Flam^3e"},{"frags":"10","ping":"65","name":"^&^*i'm baby Gr^_oo^*T"},{"frags":"150","ping":"57","name":"Padawan"},{"frags":"112","ping":"42","name":"Padawan"},{"frags":"243","ping":"53","name":"^d^1^d<(^wCjS^d)>^w v^1O^wlaTil"},{"frags":"30","ping":"45","name":"^7b0b"},{"frags":"-2","ping":"54","name":"^3^3^7_ph^1e^4^4^7Zor"},{"frags":"204","ping":"50","name":"Padawan"},{"frags":"79","ping":"62","name":"^1Padawan"},{"frags":"113","ping":"60","name":"^1shax"},{"frags":"344","ping":"64","name":"n0vaLyfe"},{"frags":"195","ping":"67","name":"^4^4sonic^7"}],"protocol":"15","sv_allowAnonymous":"0","sv_allowDownload":"0","sv_floodProtect":"1","sv_hostname":"\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001< ^3CTF ^7>","sv_maxPing":"0","sv_maxRate":"50000","sv_maxclients":"20","sv_minPing":"0","sv_privateClients":"0","timelimit":"0","version":"JK2MP: v1.02mv linux-amd64 Mar 27 2017"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Jedioutcast/3_response.txt b/gameq/tests/Protocols/Providers/Jedioutcast/3_response.txt new file mode 100644 index 0000000..ed6d9e8 --- /dev/null +++ b/gameq/tests/Protocols/Providers/Jedioutcast/3_response.txt @@ -0,0 +1,4 @@ +statusResponse +\version\JK2MP: v1.02mv linux-amd64 Aug 6 2017\capturelimit\0\dmflags\0\duel_fraglimit\10\fraglimit\0\g_blueteam\Rebellion\g_duelWeaponDisable\65531\g_forceBasedTeams\0\g_forcePowerDisable\0\g_forceRegenTime\0\g_maxForceRank\200\g_maxGameClients\3\g_privateDuel\0\g_redteam\Empire\g_saberLocking\0\g_weaponDisable\65531\mv_httpdownloads\0\sv_allowDownload\0\sv_floodProtect\1\sv_hostname\^8Deutsches ^7Imperium ^1+BT3+\sv_maxPing\0\sv_maxRate\90000\sv_maxclients\12\sv_minPing\0\sv_privateClients\2\timelimit\0\protocol\15\JK2MV\1.3-78-g87e1d5e\g_maxHolocronCarry\3\g_gametype\0\g_needpass\0\mapname\ffa_bespin\sv_allowAnonymous\0\bot_minplayers\0\g_bt3\1\gamename\basejk +0 0 "https://discord.gg/MN5p78a" +0 0 "^3New ^2updated ^3handicap mech" diff --git a/gameq/tests/Protocols/Providers/Jedioutcast/3_result.json b/gameq/tests/Protocols/Providers/Jedioutcast/3_result.json new file mode 100644 index 0000000..31030cb --- /dev/null +++ b/gameq/tests/Protocols/Providers/Jedioutcast/3_result.json @@ -0,0 +1 @@ +{"46.38.237.114:28073":{"JK2MV":"1.3-78-g87e1d5e","bot_minplayers":"0","capturelimit":"0","clients":2,"dmflags":"0","duel_fraglimit":"10","fraglimit":"0","g_blueteam":"Rebellion","g_bt3":"1","g_duelWeaponDisable":"65531","g_forceBasedTeams":"0","g_forcePowerDisable":"0","g_forceRegenTime":"0","g_gametype":"0","g_maxForceRank":"200","g_maxGameClients":"3","g_maxHolocronCarry":"3","g_needpass":"0","g_privateDuel":"0","g_redteam":"Empire","g_saberLocking":"0","g_weaponDisable":"65531","gamename":"basejk","gq_address":"46.38.237.114","gq_joinlink":"","gq_name":"Star Wars Jedi Knight II: Jedi Outcast","gq_online":true,"gq_port_client":28073,"gq_port_query":28073,"gq_protocol":"quake3","gq_transport":"udp","gq_type":"jedioutcast","mapname":"ffa_bespin","mv_httpdownloads":"0","players":[{"frags":"0","ping":"0","name":"https:\/\/discord.gg\/MN5p78a"},{"frags":"0","ping":"0","name":"^3New ^2updated ^3handicap mech"}],"protocol":"15","sv_allowAnonymous":"0","sv_allowDownload":"0","sv_floodProtect":"1","sv_hostname":"^8Deutsches ^7Imperium ^1+BT3+","sv_maxPing":"0","sv_maxRate":"90000","sv_maxclients":"12","sv_minPing":"0","sv_privateClients":"2","timelimit":"0","version":"JK2MP: v1.02mv linux-amd64 Aug 6 2017"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Justcause2/1_response.txt b/gameq/tests/Protocols/Providers/Justcause2/1_response.txt new file mode 100644 index 0000000..5834859 Binary files /dev/null and b/gameq/tests/Protocols/Providers/Justcause2/1_response.txt differ diff --git a/gameq/tests/Protocols/Providers/Justcause2/1_result.json b/gameq/tests/Protocols/Providers/Justcause2/1_result.json new file mode 100644 index 0000000..5e724d2 --- /dev/null +++ b/gameq/tests/Protocols/Providers/Justcause2/1_result.json @@ -0,0 +1 @@ +{"204.44.116.72:7777":{"dedicated":"true","description":"Press v to warp to players press b to open the buy shop","gq_address":"204.44.116.72","gq_joinlink":"steam:\/\/connect\/204.44.116.72:7777\/","gq_name":"Just Cause 2 Multiplayer","gq_online":true,"gq_port_client":7777,"gq_port_query":7777,"gq_protocol":"gamespy3","gq_transport":"udp","gq_type":"justcause2","hostname":"[USA\/EU] Hasbo's |FREEROAM|FREE BUYMENU|FACTIONS|TP|","mapname":"Panau","maxplayers":"500","numplayers":"7","password":"False","players":[{"name":"\u0007That1EdgyJohn","steamid":"STEAM_0:1:80615257","ping":42},{"name":"William","steamid":"STEAM_0:1:33394693","ping":139},{"name":"jamek13","steamid":"STEAM_0:1:40122700","ping":124},{"name":"Danya Flomik","steamid":"STEAM_0:0:49118616","ping":204},{"name":"Shepherd of Fire","steamid":"STEAM_0:0:59568826","ping":131},{"name":"κöρεcικ","steamid":"STEAM_0:0:149463014","ping":184},{"name":"Heistâ","steamid":"STEAM_0:0:151713445","ping":203}],"version":"913"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Justcause2/2_response.txt b/gameq/tests/Protocols/Providers/Justcause2/2_response.txt new file mode 100644 index 0000000..58ffa9c Binary files /dev/null and b/gameq/tests/Protocols/Providers/Justcause2/2_response.txt differ diff --git a/gameq/tests/Protocols/Providers/Justcause2/2_result.json b/gameq/tests/Protocols/Providers/Justcause2/2_result.json new file mode 100644 index 0000000..ea27991 --- /dev/null +++ b/gameq/tests/Protocols/Providers/Justcause2/2_result.json @@ -0,0 +1 @@ +{"136.243.148.103:7777":{"dedicated":"true","description":"This is a highly advanced freeroam server with a focus on fair PvP and faction gameplay.","gq_address":"136.243.148.103","gq_joinlink":"steam:\/\/connect\/136.243.148.103:7777\/","gq_name":"Just Cause 2 Multiplayer","gq_online":true,"gq_port_client":7777,"gq_port_query":7777,"gq_protocol":"gamespy3","gq_transport":"udp","gq_type":"justcause2","hostname":"Alpha's Salt Factory: Faction Freeroam","mapname":"Panau","maxplayers":"400","numplayers":"43","password":"False","players":[{"name":"+Moonman","steamid":"STEAM_0:0:55435815","ping":39},{"name":"THE UNKNOWN ANIMATOR","steamid":"STEAM_0:0:71856141","ping":29},{"name":"stalkeR","steamid":"STEAM_0:1:160957339","ping":104},{"name":"Uncle_Vanya","steamid":"STEAM_0:0:52003053","ping":71},{"name":"JaCrispy","steamid":"STEAM_0:1:73648593","ping":51},{"name":"EliteKnight2707","steamid":"STEAM_0:0:121026977","ping":232},{"name":"Zeys","steamid":"STEAM_0:0:179512051","ping":38},{"name":"Marv","steamid":"STEAM_0:0:66767541","ping":36},{"name":"bogdanleonard48","steamid":"STEAM_0:0:139165663","ping":59},{"name":"[PDF Leader] Walker","steamid":"STEAM_0:0:93339598","ping":149},{"name":"Mabynot1","steamid":"STEAM_0:0:79194251","ping":34},{"name":"PanCraft TV || Tim","steamid":"STEAM_0:0:86287787","ping":104},{"name":"G&Kdstgj","steamid":"STEAM_0:1:232981576","ping":37},{"name":"filipoutsikos","steamid":"STEAM_0:1:184355922","ping":86},{"name":"RamenWarrior","steamid":"STEAM_0:0:95962148","ping":30},{"name":"Sheriff Chris Mannix","steamid":"STEAM_0:0:121457571","ping":97},{"name":"atraokca98","steamid":"STEAM_0:0:168622852","ping":33},{"name":"Ventru","steamid":"STEAM_0:0:61875432","ping":165},{"name":"Jajo","steamid":"STEAM_0:0:43767495","ping":41},{"name":"Von Hoofenstein","steamid":"STEAM_0:1:83274971","ping":108},{"name":"Boamosh","steamid":"STEAM_0:0:90040833","ping":35},{"name":"Tumnus Turner","steamid":"STEAM_0:0:42248522","ping":52},{"name":"mitchelljack82","steamid":"STEAM_0:1:174369804","ping":55},{"name":"Scottish Abuse","steamid":"STEAM_0:1:87197773","ping":39},{"name":"Kinkzogan","steamid":"STEAM_0:1:51966772","ping":114},{"name":"hatelove","steamid":"STEAM_0:1:77026563","ping":70},{"name":"LashedBandito","steamid":"STEAM_0:1:128617685","ping":98},{"name":"ArstozkanGamer","steamid":"STEAM_0:1:123347874","ping":122},{"name":"Ronald Dunnewind","steamid":"STEAM_0:1:67292010","ping":20},{"name":"Mr.Sandman_PI","steamid":"STEAM_0:0:197567216","ping":234},{"name":"Nebula ~","steamid":"STEAM_0:0:80111414","ping":17},{"name":"bandit1216","steamid":"STEAM_0:0:151775493","ping":140},{"name":"Slobbyde","steamid":"STEAM_0:1:64184854","ping":42},{"name":"Chip Skylark","steamid":"STEAM_0:1:93389738","ping":31},{"name":"coconut","steamid":"STEAM_0:0:92033360","ping":105},{"name":"opbase","steamid":"STEAM_0:0:38544137","ping":42},{"name":"Pojo","steamid":"STEAM_0:1:92233244","ping":75},{"name":"JustMax","steamid":"STEAM_0:1:166878483","ping":69},{"name":"Rösa","steamid":"STEAM_0:0:147894155","ping":102},{"name":"Jellar","steamid":"STEAM_0:0:58889079","ping":16},{"name":"Mehmet","steamid":"STEAM_0:1:146813806","ping":57},{"name":"Captain Pinkie","steamid":"STEAM_0:1:88905228","ping":36},{"name":"Scrub","steamid":"STEAM_0:1:76481640","ping":23}],"version":"948"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Justcause2/3_response.txt b/gameq/tests/Protocols/Providers/Justcause2/3_response.txt new file mode 100644 index 0000000..5524cfe Binary files /dev/null and b/gameq/tests/Protocols/Providers/Justcause2/3_response.txt differ diff --git a/gameq/tests/Protocols/Providers/Justcause2/3_result.json b/gameq/tests/Protocols/Providers/Justcause2/3_result.json new file mode 100644 index 0000000..a651ada --- /dev/null +++ b/gameq/tests/Protocols/Providers/Justcause2/3_result.json @@ -0,0 +1 @@ +{"204.44.116.72:7777":{"dedicated":"true","description":"Press v to warp to players press b to open the buy shop","gq_address":"204.44.116.72","gq_joinlink":"steam:\/\/connect\/204.44.116.72:7777\/","gq_name":"Just Cause 2 Multiplayer","gq_online":true,"gq_port_client":7777,"gq_port_query":7777,"gq_protocol":"gamespy3","gq_transport":"udp","gq_type":"justcause2","hostname":"[USA\/EU] Hasbo's |FREEROAM|FREE BUYMENU|FACTIONS|TP|","mapname":"Panau","maxplayers":"500","numplayers":"7","password":"False","players":[{"name":"\u0007That1EdgyJohn","steamid":"STEAM_0:1:80615257","ping":69},{"name":"William","steamid":"STEAM_0:1:33394693","ping":137},{"name":"jamek13","steamid":"STEAM_0:1:40122700","ping":129},{"name":"Danya Flomik","steamid":"STEAM_0:0:49118616","ping":205},{"name":"Shepherd of Fire","steamid":"STEAM_0:0:59568826","ping":133},{"name":"κöρεcικ","steamid":"STEAM_0:0:149463014","ping":194},{"name":"Heistâ","steamid":"STEAM_0:0:151713445","ping":197}],"version":"913"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Justcause3/1_response.txt b/gameq/tests/Protocols/Providers/Justcause3/1_response.txt new file mode 100644 index 0000000..f05a64b Binary files /dev/null and b/gameq/tests/Protocols/Providers/Justcause3/1_response.txt differ diff --git a/gameq/tests/Protocols/Providers/Justcause3/1_result.json b/gameq/tests/Protocols/Providers/Justcause3/1_result.json new file mode 100644 index 0000000..692c6ad --- /dev/null +++ b/gameq/tests/Protocols/Providers/Justcause3/1_result.json @@ -0,0 +1 @@ +{"164.132.205.100:4200":{"dedicated":"d","description":"No Server Lag! Minimap + car bombs! Check our other servers jrnetwork.net","game_descr":"Just Cause 3 Multiplayer Mod","game_dir":"Just Cause 3 Multiplayer","game_id":619910,"gq_address":"164.132.205.100","gq_joinlink":"steam:\/\/connect\/164.132.205.100:4200\/","gq_name":"Just Cause 3","gq_online":true,"gq_port_client":4200,"gq_port_query":4201,"gq_protocol":"source","gq_transport":"udp","gq_type":"justcause3","hostname":"[EU2] JC3MP @ JRNetwork.net | Freeroam | i7 + 64GB RAM","keywords":"DIOaGTvtdrUuDGiDlIBQepgkxbNraOMjD-OKYrOrAS4","map":"Just Cause 3","max_players":125,"num_bots":0,"num_players":0,"num_rules":1,"os":"l","password":0,"port":4200,"protocol":17,"secure":0,"steam_id":90111256146121728,"steamappid":0,"version":"1.0.4.0"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Justcause3/2_response.txt b/gameq/tests/Protocols/Providers/Justcause3/2_response.txt new file mode 100644 index 0000000..a326447 Binary files /dev/null and b/gameq/tests/Protocols/Providers/Justcause3/2_response.txt differ diff --git a/gameq/tests/Protocols/Providers/Justcause3/2_result.json b/gameq/tests/Protocols/Providers/Justcause3/2_result.json new file mode 100644 index 0000000..25f707c --- /dev/null +++ b/gameq/tests/Protocols/Providers/Justcause3/2_result.json @@ -0,0 +1 @@ +{"46.105.165.166:4200":{"dedicated":"d","description":"No server lag! Minimap + car bombs! Check our other servers jrnetwork.net Fixed server crash bug.","game_descr":"Just Cause 3 Multiplayer Mod","game_dir":"Just Cause 3 Multiplayer","game_id":619910,"gq_address":"46.105.165.166","gq_joinlink":"steam:\/\/connect\/46.105.165.166:4200\/","gq_name":"Just Cause 3","gq_online":true,"gq_port_client":4200,"gq_port_query":4201,"gq_protocol":"source","gq_transport":"udp","gq_type":"justcause3","hostname":"[EU1] JC3MP @ JRNetwork.net | Freeroam | Xeon + 64GB RAM","keywords":"DIOaGTvtdrUuDGiDlIBQepgkxbNraOMjD-OKYrOrAS4","map":"Just Cause 3","max_players":125,"num_bots":0,"num_players":0,"num_rules":1,"os":"l","password":0,"port":4200,"protocol":17,"secure":0,"steam_id":90111118046569480,"steamappid":0,"version":"1.0.4.0"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Killingfloor/1_response.txt b/gameq/tests/Protocols/Providers/Killingfloor/1_response.txt new file mode 100644 index 0000000..d14781d Binary files /dev/null and b/gameq/tests/Protocols/Providers/Killingfloor/1_response.txt differ diff --git a/gameq/tests/Protocols/Providers/Killingfloor/1_result.json b/gameq/tests/Protocols/Providers/Killingfloor/1_result.json new file mode 100644 index 0000000..d4b48d2 --- /dev/null +++ b/gameq/tests/Protocols/Providers/Killingfloor/1_result.json @@ -0,0 +1 @@ +{"72.5.195.163:7707":{"adminemail":"FoxYMcCloud94@gmail.com","adminname":"Mythril","balanceteams":"True","currentwave":2,"endtimedelay":"4.00","finalwave":"10","forcerespawn":"True","friendlyfirescale":"0%","gameport":7707,"gametype":"KFGameType","goalscore":"60","gq_address":"72.5.195.163","gq_joinlink":"steam:\/\/connect\/72.5.195.163:7707\/","gq_name":"Killing Floor","gq_online":true,"gq_port_client":7707,"gq_port_query":7708,"gq_protocol":"unreal2","gq_transport":"udp","gq_type":"killing floor","initialwave":"0","isvacsecured":"true","kickvoting":"true","mapname":"kf-defence-c1","mapvoting":"true","max perk level":"40","max runtime zombies":"32","maxplayers":24,"maxspectators":"2","min perk level":"1","minplayers":"6","mutator0":"KillingFloorMut","mutator1":"MutVisSpecs","mutator10":"KFARGChat","mutator11":"WeldArmor","mutator12":"MutKFAntiBlocker","mutator13":"MutAdminPlus","mutator14":"KFBotsMut","mutator2":"UGWeaponPickupMessages","mutator3":"MutChatter","mutator4":"UGSlotMachine","mutator5":"UGServerPerksMutAddon","mutator6":"MutRTD","mutator7":"RespawningMutator","mutator8":"MutPatHPLeft","mutator9":"DropAllWeapMut","num trader weapons":"140","numplayers":14,"players":[{"id":607,"name":"â\u0000Ü\u0002: M\u0000R\u0000.\u0000Q\u0000U\u0000A\u0000K\u0000E\u0000R\u0000â\u0000Ü\u0002a\u0001\u0000\u0000\b\u0000\u0000\u0000Ä\t\u0000\u0000\u0000\u0000\u0000 :\u0001\u0000\u0000\tScarz722\u0000€\u0000\u0000\u0000Ü\u0001\u0000\u0000\u0000\u0000\u0000 \u000e\u0000\u0000\u0000\bLoveage\u00008\u0000\u0000\u0000\u0002\u0004\u0000\u0000\u0000\u0000\u0000 \r\u0000\u0000\u0000\u0012-Good-By-Omission\u00000\u0000\u0000\u0000Ö\u0003\u0000\u0000\u0000\u0000\u0000 \f\u0000\u0000\u0000\tDr.Feels","ping":64,"score":1615},{"id":11,"name":"Mean_Machine","ping":152,"score":465},{"id":10,"name":"Killer","ping":40,"score":457},{"id":9,"name":"Lil_Wurm","ping":44,"score":280},{"id":8,"name":"Kemp","ping":152,"score":2500},{"id":7,"name":"b0b3r","ping":32,"score":1058},{"id":6,"name":"Kanade_Tachibana","ping":72,"score":5181},{"id":4,"name":"MoonmanBT","ping":48,"score":410},{"id":3,"name":"[PhFG]_Darth-Taco","ping":52,"score":1178},{"id":2,"name":"Edsu","ping":40,"score":5323}],"playersbalanceteams":"True","queryport":0,"serverid":0,"serverip":false,"servermode":"dedicated","servername":"\u0003 \u001bø@@-<\u001b@øø*\u001bø@@>\u001b°°øU\u001bø@@ltimate\u001b°°øG\u001bø@@ame\u001b°°øS\u001bø@@ervers.Eu<\u001b@øø*\u001bø@@>- | \u001bЀ@Hell On Earth | \u001b@°@Lvl 40 | \u001b@øøPerks | \u001b¢@@Weapons | \u001bÐ@ÐCharacters | \u001b@@¢Specimen | \u001bø€€Maps | \u001bøø@Fast D\/L","serverversion":"1064","slot machines":"Ver 200","starting cash":"2500","timelimit":"0","translocator":"False","veterancy":"Engineer","veterancy handler":"Ver 700","veterancy saving":"Enabled","weaponstay":"True"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Killingfloor/2_response.txt b/gameq/tests/Protocols/Providers/Killingfloor/2_response.txt new file mode 100644 index 0000000..64ad207 Binary files /dev/null and b/gameq/tests/Protocols/Providers/Killingfloor/2_response.txt differ diff --git a/gameq/tests/Protocols/Providers/Killingfloor/2_result.json b/gameq/tests/Protocols/Providers/Killingfloor/2_result.json new file mode 100644 index 0000000..07dc2a6 --- /dev/null +++ b/gameq/tests/Protocols/Providers/Killingfloor/2_result.json @@ -0,0 +1 @@ +{"64.94.101.48:7707":{"adminemail":"InterGamingCommunity@gmail.com","adminname":"","balanceteams":"True","currentwave":7,"endtimedelay":"4.00","finalwave":"7","forcerespawn":"True","friendlyfirescale":"0%","gameport":7707,"gametype":"KFGameType","goalscore":"60","gq_address":"64.94.101.48","gq_joinlink":"steam:\/\/connect\/64.94.101.48:7707\/","gq_name":"Killing Floor","gq_online":true,"gq_port_client":7707,"gq_port_query":7708,"gq_protocol":"unreal2","gq_transport":"udp","gq_type":"killing floor","initialwave":"0","isvacsecured":"true","kickvoting":"true","mapname":"KF-HarbourV3-fix","mapvoting":"true","max perk level":"30","max runtime zombies":"60","maxplayers":35,"maxspectators":"5","min perk level":"6","minplayers":"0","mutator0":"KillingFloorMut","mutator1":"CorLogMut","mutator2":"Spawner","mutator3":"FirstBloodMut","mutator4":"KFDoorMessagesV3","mutator5":"IGCAdminMut","mutator6":"IGCRTD","mutator7":"IGCChat","mutator8":"IGCServer1X","mutator9":"MutLoader","num trader weapons":"122","numplayers":33,"players":[{"id":5763,"name":"Zangetsu_Grim_Hitsug","ping":1020,"score":3000},{"id":5591,"name":"Dat_scoot","ping":60,"score":3474},{"id":4993,"name":"KIKOFU","ping":196,"score":47},{"id":4792,"name":"NextGear","ping":260,"score":6779},{"id":4676,"name":"N(.)(.)Bs","ping":112,"score":55},{"id":4547,"name":"CertifiedOrganic","ping":228,"score":5366},{"id":3947,"name":"Briandude18","ping":112,"score":1203},{"id":3942,"name":"aL.l^Dinamark`^","ping":132,"score":4249},{"id":3560,"name":"ClicheName137","ping":68,"score":561},{"id":3506,"name":"fate_Patch","ping":108,"score":3000},{"id":2812,"name":"chili_dog","ping":52,"score":6108},{"id":2582,"name":"Moneylaw","ping":116,"score":1206},{"id":2581,"name":"Arthritic_ODB","ping":116,"score":1885},{"id":2580,"name":"Dr._Quik","ping":80,"score":529},{"id":1948,"name":"Ahmed_Yusef_Bin_Al-M","ping":104,"score":3000},{"id":1531,"name":"[15th]_Harvain","ping":120,"score":4781},{"id":1481,"name":"Obscuro","ping":188,"score":873},{"id":1398,"name":"fresh_feeesh","ping":84,"score":7938},{"id":276,"name":"blaat","ping":184,"score":91},{"id":178,"name":"Grubby1991","ping":236,"score":262},{"id":23,"name":"Swordfish","ping":92,"score":3000},{"id":21,"name":"RIP.Tiger","ping":216,"score":8000},{"id":20,"name":"Sir_Whiskey","ping":76,"score":2905},{"id":19,"name":"Crasz","ping":116,"score":2958},{"id":18,"name":"Frank","ping":56,"score":112},{"id":16,"name":"Smug_Janitor","ping":48,"score":890},{"id":13,"name":"BaDDoG","ping":208,"score":4580},{"id":11,"name":"loaf_dog","ping":80,"score":2186},{"id":10,"name":"Loaf_Cat","ping":76,"score":221},{"id":9,"name":"Cha_Siu_Bao","ping":76,"score":551},{"id":6,"name":"kastidal","ping":64,"score":3198},{"id":5,"name":"Cafe-BerryMocha","ping":144,"score":6156},{"id":3,"name":"[PHAC]_CLOWNBIG","ping":108,"score":4228},{"id":2,"name":"ManSlayer30","ping":116,"score":1200}],"playersbalanceteams":"True","queryport":0,"serverid":0,"serverip":false,"servermode":"dedicated","servername":"\u0002\u001b@°@Sentry \u001b@€@Turrets\u001b€€€\/\u001b@°@Bots\u001bÀÀÀ|\u001b@°°Weapons\u001b€€€\u001bÀÀÀ|\u001b@€€Specimens: Default \u001bÀÀÀ|\u001b¢€@Lvl 6-30\u001bÀÀÀ| \u001bÀ@@I\u001b€€€nternational Gaming Serve\u001bÀ@@r \u001bøø@[#1]","serverversion":"1064","starting cash":"3000","timelimit":"0","translocator":"False","veterancy":"Demolitions","veterancy handler":"Ver 6","veterancy saving":"Enabled","weaponstay":"True"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Killingfloor2/1_response.txt b/gameq/tests/Protocols/Providers/Killingfloor2/1_response.txt new file mode 100644 index 0000000..8b7ed88 Binary files /dev/null and b/gameq/tests/Protocols/Providers/Killingfloor2/1_response.txt differ diff --git a/gameq/tests/Protocols/Providers/Killingfloor2/1_result.json b/gameq/tests/Protocols/Providers/Killingfloor2/1_result.json new file mode 100644 index 0000000..83fd1fa --- /dev/null +++ b/gameq/tests/Protocols/Providers/Killingfloor2/1_result.json @@ -0,0 +1 @@ +{"173.66.77.112:7777":{"CurrentWave":"5","Difficulty":"3","GameState":"OGS_InProgress","MapName":"KF-BurningParis","MatchQuality":"0.000000","MaxZedCount":"100","Mode":"Survival","NumOpenPrivateConnections":"0","NumOpenPublicConnections":"6","NumPrivateConnections":"0","NumPublicConnections":"32","NumSpectators":"0","NumWaves":"7","OwningPlayerId":"0","OwningPlayerName":"SheepKF.com - RPG [1-250 ] #1 Hans Volter [Fast-DL]","PingInMs":"0","SteamEngineVersion":"10897","ZedCount":"10","bAllowInvites":"True","bAllowJoinInProgress":"True","bAllowJoinViaPresence":"True","bAllowJoinViaPresenceFriendsOnly":"False","bAntiCheatProtected":"True","bAvailableForTakeover":"False","bCustom":"False","bInProgress":"True","bIsDedicated":"False","bIsLanMatch":"False","bMutators":"False","bRequiresPassword":"False","bShouldAdvertise":"True","bUsedForTakeover":"False","bUsesArbitration":"False","bUsesPresence":"True","bUsesStats":"False","dedicated":"l","game_descr":"HardSurv","game_dir":"kf2","game_id":232090,"gq_address":"173.66.77.112","gq_joinlink":"steam:\/\/connect\/173.66.77.112:7777\/","gq_name":"Killing Floor 2","gq_online":true,"gq_port_client":7777,"gq_port_query":27015,"gq_protocol":"source","gq_transport":"udp","gq_type":"killing floor 2","hostname":"SheepKF.com - RPG [1-250 ] #1 Hans Volter [Fast-DL]","keywords":"d:7,e:5,a:1,l:0,m:0,j:0,k:0,i:3,h:0,b:0,c:0,f:0,","map":"kf-policestation_sfix3","max_players":32,"num_bots":0,"num_players":24,"num_rules":35,"os":"w","password":0,"players":[{"id":0,"name":"Player790","score":1823,"time":2955.9064941406},{"id":0,"name":"Toxic Legend Z","score":8623,"time":2955.5695800781},{"id":0,"name":"(S.O.B.R) SilverJack","score":3117,"time":2954.8723144531},{"id":0,"name":"(S.O.B.R) Shmid","score":1338,"time":2954.869140625},{"id":0,"name":"Kotic-Sniper","score":2569,"time":2954.7387695312},{"id":0,"name":"(S.O.B.R) Nil","score":1042,"time":2900.0717773438},{"id":0,"name":"Mighty","score":2779,"time":2830.4284667969},{"id":0,"name":"old head","score":8251,"time":2678.9208984375},{"id":0,"name":"I Like turtles","score":3233,"time":2643.2585449219},{"id":0,"name":"TrooperNoH4x","score":522,"time":2613.1474609375},{"id":0,"name":"{S.T.A.R.S} Andarack","score":1672,"time":2458.6723632812},{"id":0,"name":"Faindizzle","score":828,"time":2324.6760253906},{"id":0,"name":"MeneerDeAardappel","score":716,"time":2203.8676757812},{"id":0,"name":"(S.O.B.R) GrInN","score":4117,"time":1936.8309326172},{"id":0,"name":"iN","score":21698,"time":1933.4650878906},{"id":0,"name":"Banana","score":2431,"time":1743.1625976562},{"id":0,"name":"Zirons","score":2423,"time":1390.6865234375},{"id":0,"name":"I know that girl","score":7366,"time":1009.2462768555},{"id":0,"name":"Super kame guru","score":1681,"time":830.33184814453},{"id":0,"name":"Matts Mom Is Hot","score":722,"time":658.10302734375},{"id":0,"name":"","score":0,"time":632.15380859375},{"id":0,"name":"Derp Herp","score":629,"time":431.85089111328},{"id":0,"name":"","score":0,"time":92.149681091309},{"id":0,"name":"","score":0,"time":68.89826965332}],"port":7777,"protocol":17,"secure":1,"steam_id":90096635858216960,"steamappid":0,"version":"1008"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Killingfloor2/2_response.txt b/gameq/tests/Protocols/Providers/Killingfloor2/2_response.txt new file mode 100644 index 0000000..e57c68e Binary files /dev/null and b/gameq/tests/Protocols/Providers/Killingfloor2/2_response.txt differ diff --git a/gameq/tests/Protocols/Providers/Killingfloor2/2_result.json b/gameq/tests/Protocols/Providers/Killingfloor2/2_result.json new file mode 100644 index 0000000..cf9618c --- /dev/null +++ b/gameq/tests/Protocols/Providers/Killingfloor2/2_result.json @@ -0,0 +1 @@ +{"193.124.58.128:7777":{"CurrentWave":"1","Difficulty":"3","GameState":"OGS_InProgress","MapName":"KF-BurningParis","MatchQuality":"0.000000","MaxZedCount":"100","Mode":"Survival","NumOpenPrivateConnections":"0","NumOpenPublicConnections":"6","NumPrivateConnections":"0","NumPublicConnections":"6","NumSpectators":"0","NumWaves":"10","OwningPlayerId":"0","OwningPlayerName":"VJECHERNY SERVER#1","PingInMs":"0","SteamEngineVersion":"10897","ZedCount":"10","bAllowInvites":"True","bAllowJoinInProgress":"True","bAllowJoinViaPresence":"True","bAllowJoinViaPresenceFriendsOnly":"False","bAntiCheatProtected":"True","bAvailableForTakeover":"False","bCustom":"False","bInProgress":"False","bIsDedicated":"False","bIsLanMatch":"False","bMutators":"False","bRequiresPassword":"False","bShouldAdvertise":"True","bUsedForTakeover":"False","bUsesArbitration":"False","bUsesPresence":"True","bUsesStats":"True","dedicated":"l","game_descr":"KFGameInfo_Survival","game_dir":"kf2","game_id":232090,"gq_address":"193.124.58.128","gq_joinlink":"steam:\/\/connect\/193.124.58.128:7777\/","gq_name":"Killing Floor 2","gq_online":true,"gq_port_client":7777,"gq_port_query":27015,"gq_protocol":"source","gq_transport":"udp","gq_type":"killing floor 2","hostname":"VJECHERNY SERVER#1","keywords":"d:10,e:1,a:0,l:0,m:0,j:0,k:0,i:3,h:0,b:1,c:0,f:0,","map":"KF-BioticsLab","max_players":6,"num_bots":0,"num_players":7,"num_rules":35,"os":"w","password":0,"players":[{"id":0,"name":"bearpaw77","score":700,"time":146795.296875},{"id":0,"name":"Superking","score":245,"time":98346.265625},{"id":0,"name":"DeathReaper5215","score":0,"time":98341.1171875},{"id":0,"name":"Tayzor Azul","score":617,"time":94206.9140625},{"id":0,"name":".S ❤","score":0,"time":93180.28125},{"id":0,"name":"","score":0,"time":93170.828125},{"id":0,"name":"","score":0,"time":93138.7109375}],"port":7777,"protocol":17,"secure":1,"steam_id":90096531038261249,"steamappid":0,"version":"1008"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Killingfloor2/3_response.txt b/gameq/tests/Protocols/Providers/Killingfloor2/3_response.txt new file mode 100644 index 0000000..77cf706 Binary files /dev/null and b/gameq/tests/Protocols/Providers/Killingfloor2/3_response.txt differ diff --git a/gameq/tests/Protocols/Providers/Killingfloor2/3_result.json b/gameq/tests/Protocols/Providers/Killingfloor2/3_result.json new file mode 100644 index 0000000..98f99f7 --- /dev/null +++ b/gameq/tests/Protocols/Providers/Killingfloor2/3_result.json @@ -0,0 +1 @@ +{"213.141.146.68:7778":{"CurrentWave":"7","Difficulty":"1","GameState":"OGS_InProgress","MapName":"KF-BurningParis","MatchQuality":"0.000000","MaxZedCount":"100","Mode":"Survival","NumOpenPrivateConnections":"0","NumOpenPublicConnections":"6","NumPrivateConnections":"0","NumPublicConnections":"6","NumSpectators":"0","NumWaves":"10","OwningPlayerId":"0","OwningPlayerName":"aptemka.net KF2 Server #2 - HARD, LONG","PingInMs":"0","SteamEngineVersion":"10897","ZedCount":"10","bAllowInvites":"True","bAllowJoinInProgress":"True","bAllowJoinViaPresence":"True","bAllowJoinViaPresenceFriendsOnly":"False","bAntiCheatProtected":"True","bAvailableForTakeover":"False","bCustom":"False","bInProgress":"True","bIsDedicated":"False","bIsLanMatch":"False","bMutators":"False","bRequiresPassword":"False","bShouldAdvertise":"True","bUsedForTakeover":"False","bUsesArbitration":"False","bUsesPresence":"True","bUsesStats":"True","dedicated":"l","game_descr":"KFGameInfo_Survival","game_dir":"kf2","game_id":232090,"gq_address":"213.141.146.68","gq_joinlink":"steam:\/\/connect\/213.141.146.68:7778\/","gq_name":"Killing Floor 2","gq_online":true,"gq_port_client":7778,"gq_port_query":27016,"gq_protocol":"source","gq_transport":"udp","gq_type":"killing floor 2","hostname":"aptemka.net KF2 Server #2 - HARD, LONG","keywords":"d:10,e:7,a:1,l:0,m:0,j:0,k:0,i:1,h:0,b:1,c:0,f:0,","map":"KF-BioticsLab","max_players":6,"num_bots":0,"num_players":4,"num_rules":35,"os":"w","password":0,"players":[{"id":0,"name":"KING NATSU","score":34,"time":1602.4636230469},{"id":0,"name":"V1ktor_0verDøse","score":288,"time":1592.5690917969},{"id":0,"name":"opi","score":0,"time":1390.2520751953},{"id":0,"name":"‹ קּ●₫ › Yogui","score":2,"time":619.74560546875}],"port":7778,"protocol":17,"secure":1,"steam_id":90095989236771846,"steamappid":0,"version":"1008"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/L4d/1_response.txt b/gameq/tests/Protocols/Providers/L4d/1_response.txt new file mode 100644 index 0000000..9b54033 Binary files /dev/null and b/gameq/tests/Protocols/Providers/L4d/1_response.txt differ diff --git a/gameq/tests/Protocols/Providers/L4d/1_result.json b/gameq/tests/Protocols/Providers/L4d/1_result.json new file mode 100644 index 0000000..289bd62 --- /dev/null +++ b/gameq/tests/Protocols/Providers/L4d/1_result.json @@ -0,0 +1 @@ +{"67.80.161.254:27022":{"dedicated":"d","game_descr":"L4D - Versus","game_dir":"left4dead","gq_address":"67.80.161.254","gq_joinlink":"steam:\/\/connect\/67.80.161.254:27022\/","gq_name":"Left 4 Dead","gq_online":true,"gq_port_client":27022,"gq_port_query":27022,"gq_protocol":"source","gq_transport":"udp","gq_type":"l4d","hostname":"5th Dimension [Versus]","keywords":"5th,custom,fun,modded","map":"l4d_vs_hospital05_rooftop","max_players":10,"num_bots":0,"num_players":170,"os":"w","password":0,"players":[{"id":0,"name":"Altair","score":5,"time":2150},{"id":0,"name":"Super Saiyan Level 53","score":0,"time":20},{"id":0,"name":"Dead Rising 37","score":2,"time":535},{"id":0,"name":"Dead Rising 68","score":0,"time":27},{"id":0,"name":"(1)Super Saiyan Level 63","score":0,"time":37},{"id":0,"name":"Super Saiyan Level 27","score":0,"time":39105},{"id":0,"name":"Super Saiyan Level 89","score":0,"time":1068},{"id":0,"name":"Super Saiyan Level 45","score":3,"time":2908},{"id":0,"name":"(1)Super Saiyan Level 74","score":0,"time":694},{"id":0,"name":"Dino Crisis 39","score":0,"time":-7},{"id":0,"name":"Dead Rising 76","score":0,"time":72819},{"id":0,"name":"(1)Super Saiyan Level 69","score":0,"time":471},{"id":0,"name":"Super Saiyan Level 59","score":-1,"time":258},{"id":0,"name":"Super Saiyan Level 65","score":3,"time":811},{"id":0,"name":"Super Saiyan Level 1","score":0,"time":46089},{"id":0,"name":"Super Saiyan Level 67","score":1,"time":783},{"id":0,"name":"Super Saiyan Level 98","score":2,"time":640},{"id":0,"name":"Super Saiyan Level 79","score":7,"time":66513},{"id":0,"name":"CYBER 4","score":0,"time":1166},{"id":0,"name":"Dino Crisis 7","score":0,"time":262},{"id":0,"name":"Dino Crisis 22","score":0,"time":66},{"id":0,"name":"Super Saiyan Level 90","score":5,"time":488},{"id":0,"name":"Super Saiyan Level 24","score":1,"time":758},{"id":0,"name":"Super Saiyan Level 31","score":-1,"time":264},{"id":0,"name":"Super Saiyan Level 11","score":-1,"time":838},{"id":0,"name":"Super Saiyan Level 80","score":0,"time":32},{"id":0,"name":"Super Saiyan Level 85","score":5,"time":33680},{"id":0,"name":"CYBER 2","score":0,"time":437},{"id":0,"name":"CTM leo CTM","score":1,"time":-29},{"id":0,"name":"[10000]-=CTMCTM=-[10000]","score":1,"time":75},{"id":0,"name":"-=leonsita=-","score":1,"time":248},{"id":0,"name":"-=Naira=-","score":1,"time":678},{"id":0,"name":"Dead Rising 48","score":0,"time":110725},{"id":0,"name":"(1)Marycielo","score":3,"time":31},{"id":0,"name":"Dead Rising 10","score":2,"time":16253},{"id":0,"name":"Dino Crisis 61","score":0,"time":421},{"id":0,"name":"Dino Crisis 23","score":1,"time":61118},{"id":0,"name":"Dino Crisis 11","score":-1,"time":561},{"id":0,"name":"Dino Crisis 82","score":0,"time":6583},{"id":0,"name":"Dino Crisis 24","score":-1,"time":551},{"id":0,"name":"sofia la pro","score":0,"time":1269},{"id":0,"name":"Dead Rising 87","score":-1,"time":134570},{"id":0,"name":"Dead Rising 85","score":0,"time":37},{"id":0,"name":"Dead Rising 27","score":0,"time":141534},{"id":0,"name":"Dead Rising 63","score":0,"time":-40},{"id":0,"name":"Dead Rising 83","score":0,"time":-15},{"id":0,"name":"Super Saiyan Level 14","score":-1,"time":361},{"id":0,"name":"Dead Rising 29","score":0,"time":51269},{"id":0,"name":"Dead Rising 86","score":6,"time":86716},{"id":0,"name":"Dead Rising 52","score":0,"time":45854},{"id":0,"name":"Super Saiyan Level 23","score":-1,"time":345},{"id":0,"name":"[10000]-0Naira=-[10000]","score":1,"time":-21},{"id":0,"name":"Dead Rising 18","score":1,"time":90},{"id":0,"name":"Super Saiyan Level 5","score":5,"time":110065},{"id":0,"name":"(1)Cambiame en rev.ini","score":0,"time":169739},{"id":0,"name":"Super Saiyan Level 55","score":2,"time":196958},{"id":0,"name":"Super Saiyan Level 9","score":0,"time":285},{"id":0,"name":"Super Saiyan Level 60","score":3,"time":159639},{"id":0,"name":"Super Saiyan Level 94","score":2,"time":78420},{"id":0,"name":"Super Saiyan Level 36","score":-3,"time":561},{"id":0,"name":"Super Saiyan Level 88","score":3,"time":172283},{"id":0,"name":"Dino Crisis 79","score":0,"time":58626},{"id":0,"name":"Dead Rising 78","score":0,"time":56},{"id":0,"name":"Dead Rising 79","score":0,"time":77},{"id":0,"name":"Super Saiyan Level 66","score":0,"time":195354},{"id":0,"name":"Dead Rising 59","score":0,"time":130826},{"id":0,"name":"Dead Rising 45","score":0,"time":24},{"id":0,"name":"Dead Rising 3","score":0,"time":105078},{"id":0,"name":"Dead Rising 44","score":0,"time":46788},{"id":0,"name":"Dino Crisis 12","score":-1,"time":1069},{"id":0,"name":"Dead Rising 80","score":0,"time":-57},{"id":0,"name":"[10000]-=Naira=-[1000]","score":4,"time":5853},{"id":0,"name":"Dead Rising 5","score":0,"time":165158},{"id":0,"name":"Super Saiyan Level 63","score":1,"time":243365},{"id":0,"name":"Super Saiyan Level 37","score":1,"time":160862},{"id":0,"name":"Dino Crisis 76","score":-1,"time":725},{"id":0,"name":"Dead Rising 66","score":0,"time":88933},{"id":0,"name":"Dino Crisis 69","score":0,"time":47582},{"id":0,"name":"Dead Rising 46","score":0,"time":197167},{"id":0,"name":"Dead Rising 14","score":0,"time":156298},{"id":0,"name":"Dead Rising 99","score":0,"time":269975},{"id":0,"name":"Dead Rising 31","score":0,"time":-1},{"id":0,"name":"Dead Rising 49","score":0,"time":825},{"id":0,"name":"Dead Rising 40","score":0,"time":36324},{"id":0,"name":"Dead Rising 16","score":0,"time":165443},{"id":0,"name":"Dino Crisis 2","score":0,"time":193339},{"id":0,"name":"Dead Rising 94","score":2,"time":202199},{"id":0,"name":"Dead Rising 69","score":-1,"time":61},{"id":0,"name":"Dead Rising 35","score":4,"time":277885},{"id":0,"name":"Dead Rising 11","score":0,"time":249860},{"id":0,"name":"-=Nairia=-","score":0,"time":237},{"id":0,"name":"Dead Rising 23","score":6,"time":122935},{"id":0,"name":"**]=-Niaria=-[**","score":-1,"time":152},{"id":0,"name":"Dead Rising 38","score":0,"time":280384},{"id":0,"name":"?¿'¿'¿?¿?¿?¿?¿?","score":0,"time":-1},{"id":0,"name":"Dead Rising 73","score":0,"time":176218},{"id":0,"name":"Dino Crisis 32","score":1,"time":119432},{"id":0,"name":"Dead Rising 53","score":0,"time":128660},{"id":0,"name":"Dino Crisis 20","score":0,"time":217331},{"id":0,"name":"Dino Crisis 47","score":-1,"time":143291},{"id":0,"name":"Dead Rising 96","score":0,"time":30},{"id":0,"name":"Dead Rising 95","score":0,"time":-14},{"id":0,"name":"Dino Crisis 21","score":0,"time":144364},{"id":0,"name":"Dead Rising 90","score":8,"time":126797},{"id":0,"name":"Dino Crisis 43","score":0,"time":171731},{"id":0,"name":"Dead Rising 1","score":-1,"time":42},{"id":0,"name":"Dead Rising 72","score":-1,"time":269117},{"id":0,"name":"Super Saiyan Level 68","score":3,"time":254945},{"id":0,"name":"Dino Crisis 71","score":-4,"time":365},{"id":0,"name":"Super Saiyan Level 77","score":0,"time":117507},{"id":0,"name":"Dead Rising 6","score":0,"time":41},{"id":0,"name":"Dead Rising 26","score":-1,"time":365},{"id":0,"name":"Dead Rising 77","score":3,"time":286589},{"id":0,"name":"Super Saiyan Level 13","score":0,"time":179000},{"id":0,"name":"(1)REVOLUTiON","score":0,"time":0},{"id":0,"name":"Super Saiyan Level 48","score":-1,"time":379},{"id":0,"name":"Dead Rising 58","score":0,"time":107684},{"id":0,"name":"Dead Rising 28","score":-1,"time":126910},{"id":0,"name":"Dead Rising 47","score":0,"time":15067},{"id":0,"name":"Super Saiyan Level 84","score":0,"time":102979},{"id":0,"name":"Dead Rising 64","score":-1,"time":262426},{"id":0,"name":"Dead Rising 60","score":0,"time":179013},{"id":0,"name":"[10000]=-=Naira=-=[10000]","score":0,"time":78},{"id":0,"name":"Dead Rising 50","score":-2,"time":635},{"id":0,"name":"Dead Rising 20","score":0,"time":205827},{"id":0,"name":"Dead Rising 17","score":1,"time":246564},{"id":0,"name":"Dead Rising 57","score":0,"time":319683},{"id":0,"name":"[10000]-=Naira=-[10000]","score":2,"time":323130},{"id":0,"name":"Dead Rising 98","score":0,"time":208709},{"id":0,"name":"Dino Crisis 26","score":0,"time":33171},{"id":0,"name":"Dead Rising 93","score":2,"time":332947},{"id":0,"name":"Dead Rising 71","score":0,"time":55266},{"id":0,"name":"Dead Rising 67","score":0,"time":12484},{"id":0,"name":"REVOLUTiON","score":0,"time":330609},{"id":0,"name":"Dead Rising 15","score":0,"time":61044},{"id":0,"name":"Dead Rising 2","score":0,"time":106526},{"id":0,"name":"Dead Rising 92","score":10,"time":343955},{"id":0,"name":"Dead Rising 70","score":0,"time":64584},{"id":0,"name":"Dead Rising 88","score":0,"time":55397},{"id":0,"name":"Dead Rising 82","score":0,"time":107385},{"id":0,"name":"Dead Rising 97","score":0,"time":315293},{"id":0,"name":"Dead Rising 36","score":0,"time":116},{"id":0,"name":"Dead Rising 9","score":6,"time":274417},{"id":0,"name":"Dead Rising 39","score":-2,"time":326901},{"id":0,"name":"Dead Rising 30","score":0,"time":29258},{"id":0,"name":"Dino Crisis 80","score":3,"time":189},{"id":0,"name":"Super Saiyan Level 52","score":2,"time":290173},{"id":0,"name":"Super Saiyan Level 86","score":4,"time":270151},{"id":0,"name":"Super Saiyan Level 83","score":8,"time":616},{"id":0,"name":"Super Saiyan Level 76","score":2,"time":344544},{"id":0,"name":"Dino Crisis 14","score":-1,"time":302663},{"id":0,"name":"Dino Crisis 88","score":0,"time":1413},{"id":0,"name":"Dino Crisis 77","score":0,"time":165141},{"id":0,"name":"by l4dzone.ru","score":0,"time":296680},{"id":0,"name":"Super Saiyan Level 34","score":-1,"time":405422},{"id":0,"name":"Super Saiyan Level 28","score":-1,"time":1163},{"id":0,"name":"Super Saiyan Level 93","score":0,"time":386687},{"id":0,"name":"Super Saiyan Level 81","score":1,"time":427},{"id":0,"name":"Super Saiyan Level 41","score":-1,"time":593},{"id":0,"name":"Super Saiyan Level 58","score":-1,"time":313567},{"id":0,"name":"(1)Super Saiyan Level 16","score":4,"time":428},{"id":0,"name":"Super Saiyan Level 50","score":1,"time":521},{"id":0,"name":"Super Saiyan Level 72","score":3,"time":427420},{"id":0,"name":"Super Saiyan Level 32","score":1,"time":410401},{"id":0,"name":"Super Saiyan Level 26","score":0,"time":316925},{"id":0,"name":"Cambiame en rev.ini","score":0,"time":396461},{"id":0,"name":"Dead Rising 62","score":0,"time":424001},{"id":0,"name":"Dead Rising 41","score":0,"time":185},{"id":0,"name":"Super Saiyan Level 39","score":-1,"time":569},{"id":0,"name":"Super Saiyan Level 25","score":0,"time":226427}],"port":27022,"protocol":7,"secure":1,"steamappid":500,"version":"1.0.2.8"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/L4d/2_response.txt b/gameq/tests/Protocols/Providers/L4d/2_response.txt new file mode 100644 index 0000000..610fd60 Binary files /dev/null and b/gameq/tests/Protocols/Providers/L4d/2_response.txt differ diff --git a/gameq/tests/Protocols/Providers/L4d/2_result.json b/gameq/tests/Protocols/Providers/L4d/2_result.json new file mode 100644 index 0000000..f9b8de0 --- /dev/null +++ b/gameq/tests/Protocols/Providers/L4d/2_result.json @@ -0,0 +1 @@ +{"64.74.97.37:27015":{"dedicated":"d","game_descr":"L4D - Co-op - Advanced","game_dir":"left4dead","god":"0","gq_address":"64.74.97.37","gq_joinlink":"steam:\/\/connect\/64.74.97.37:27015\/","gq_name":"Left 4 Dead","gq_online":true,"gq_port_client":27015,"gq_port_query":27015,"gq_protocol":"source","gq_transport":"udp","gq_type":"l4d","hostname":"=HS= Headshots live here in Chicago!! (NFO)","infinite_reserve_version":"1.0","l4d_barrel_allow":"1","l4d_barrel_modes":"","l4d_barrel_random":"2","l4d_broadcast_con":"0","l4d_broadcast_ff":"1","l4d_broadcast_hit":"0","l4d_broadcast_kill":"2","l4d_infectedbots_coop_survival_tank_playable":"0","l4d_votemanager2":"1.5.5","map":"l4d_city17_03","max_players":16,"nextlevel":"","num_bots":0,"num_players":9,"num_rules":19,"os":"w","password":0,"players":[{"id":0,"name":"Mojo","score":2,"time":1593.2625732422},{"id":0,"name":"X-Ray","score":8,"time":1593.2614746094},{"id":0,"name":"=HS= Bad Bob Molly","score":7,"time":1593.1385498047},{"id":0,"name":"Mike Wazowski","score":6,"time":1570.9587402344},{"id":0,"name":"=HS=SideShowBawb","score":3,"time":1556.2498779297},{"id":0,"name":"=HS=MaddMonkey","score":13,"time":1553.1448974609},{"id":0,"name":"Chu-Bacca","score":5,"time":1542.1799316406},{"id":0,"name":"=HS=Cap'n Trash","score":9,"time":1124.1408691406},{"id":0,"name":"=HS= Azzofan","score":4,"time":309.47970581055}],"points_gift_on":"1.278","port":27015,"protocol":7,"secure":1,"steamappid":500,"sv_alltalk":"1","sv_cheats":"0","sv_contact":"contact@azzofan.com","sv_password":"0","sv_steamgroup":"1831321","sv_voiceenable":"1","version":"1.0.2.9"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/L4d2/1_response.txt b/gameq/tests/Protocols/Providers/L4d2/1_response.txt new file mode 100644 index 0000000..cf2a3dd Binary files /dev/null and b/gameq/tests/Protocols/Providers/L4d2/1_response.txt differ diff --git a/gameq/tests/Protocols/Providers/L4d2/1_result.json b/gameq/tests/Protocols/Providers/L4d2/1_result.json new file mode 100644 index 0000000..896c3e9 --- /dev/null +++ b/gameq/tests/Protocols/Providers/L4d2/1_result.json @@ -0,0 +1 @@ +{"216.52.148.77:27015":{"buddha":"0","coop":"0","deathmatch":"1","decalfrequency":"10","dedicated":"d","director_afk_timeout":"45","dynamicmotd_version":"2.2.4","game_descr":"Left 4 Dead 2","game_dir":"left4dead2","game_id":550,"god":"0","gq_address":"216.52.148.77","gq_joinlink":"steam:\/\/connect\/216.52.148.77:27015\/","gq_name":"Left 4 Dead 2","gq_online":true,"gq_port_client":27015,"gq_port_query":27015,"gq_protocol":"source","gq_transport":"udp","gq_type":"l4d2","hostname":"gamrs.co | !buy 10v10 #1","keywords":"versus,10v10,20vs,buy,gcftw,increased_maxplayers,versus,secure","l4d2_BwA_Print_Chat_MsgType":"2","l4d2_BwA_SelectTeam_From_Panel":"1","l4d2_BwA_Show_ClientID":"1","l4d2_BwA_TeamPanel_AllowPubs":"1","l4d2_BwA_TeamPanel_EnablePause":"1","l4d2_WeaponUnlock":"0.8.1","l4d2_addons_eclipse":"-1","l4d2_cs_version":"2.1","l4d2_custom_commands_version":"1.0.9","l4d2_finaleghost_rangemod_enabled":"1","l4d2_finaleghost_rangemod_range":"100","l4d2_finaleghost_rangemod_version":"1.0.0","l4d2_freeze_version":"1.1","l4d2_full_reset_on_empty":"0","l4d2_guncontrol_allowgrenadereplenish":"1","l4d2_guncontrol_allowm60replenish":"1","l4d2_guncontrol_assaultammo":"360","l4d2_guncontrol_autoshotgunammo":"90","l4d2_guncontrol_explosiveammomulti":"1","l4d2_guncontrol_grenadelauncherammo":"30","l4d2_guncontrol_huntingrifleammo":"150","l4d2_guncontrol_incendammomulti":"1","l4d2_guncontrol_m60ammo":"150","l4d2_guncontrol_shotgunammo":"56","l4d2_guncontrol_smgammo":"650","l4d2_guncontrol_sniperrifleammo":"180","l4d2_guncontrol_turnGLintoM60chance":"2","l4d2_guncontrol_version":"1.1.3","l4d2_incappedmedsmunch_delaytime":"5.0","l4d2_incappedmedsmunch_dropmeds":"1","l4d2_incappedmedsmunch_duration":"3.0","l4d2_incappedmedsmunch_version":"1.1.9","l4d2_nmelevatorfix_version":"1.0","l4d2_plp_version":"1.2.2","l4d2_points_system_version":"2.2.5gc","l4d2_team_manager_ver":"1.3.0","l4d2_team_order":"0","l4d2_upgradepackfix_version":"1.6","l4d2_vip_version":"1.0","l4d_XtraHP":"0","l4d_ghostpounce_flightspawnallowed":"1","l4d_ghostpounce_version":"1.0.4","l4d_hats_menu":"a","l4d_hats_opaque":"255","l4d_hats_random":"0","l4d_hats_third":"0","l4d_hats_version":"1.4.3","l4d_hats_view":"0","l4d_infected_limit":"10","l4d_kickloadstuckers_duration":"90","l4d_kickloadstuckers_version":"1.0.8","l4d_killreservation":"1","l4d_lasertag_alpha":"100","l4d_lasertag_blue":"255","l4d_lasertag_bots":"0","l4d_lasertag_bots_alpha":"70","l4d_lasertag_bots_blue":"75","l4d_lasertag_bots_green":"255","l4d_lasertag_bots_red":"0","l4d_lasertag_enable":"1","l4d_lasertag_green":"125","l4d_lasertag_life":"0.30","l4d_lasertag_offset":"36","l4d_lasertag_pistols":"1","l4d_lasertag_realism":"1","l4d_lasertag_red":"0","l4d_lasertag_rifles":"1","l4d_lasertag_shotguns":"1","l4d_lasertag_smgs":"1","l4d_lasertag_snipers":"1","l4d_lasertag_version":"1.0","l4d_lasertag_vs":"1","l4d_lasertag_width":"1.0","l4d_reserved_spectators_playersb4kick":"8","l4d_reserved_spectators_timetokick":"10.00","l4d_respawnteleport_version":"1.0","l4d_rs_version":"1.4(KrX)","l4d_stats_version":"1.4B117","l4d_supertank":"1","l4d_survivor_limit":"10","l4d_tank_hpmulti":"0.25","l4d_votekick_version":"1.0","l4d_votemanager2":"1.5.7","left4downtown_version":"0.5.7","map":"c9m1_alleys","max_players":22,"metamod_version":"1.10.2-devV","mp_allowNPCs":"1","mp_autocrosshair":"1","mp_autoteambalance":"1","mp_c4timer":"45","mp_disable_respawn_times":"0","mp_fadetoblack":"0","mp_falldamage":"0","mp_flashlight":"1","mp_footsteps":"1","mp_forcerespawn":"1","mp_fraglimit":"0","mp_freezetime":"6","mp_friendlyfire":"1","mp_limitteams":"2","mp_maxrounds":"0","mp_roundtime":"5","mp_stalemate_at_timelimit":"0","mp_stalemate_enable":"0","mp_teamlist":"hgrunt;scientist","mp_teamplay":"0","mp_teams_unbalance_limit":"1","mp_timelimit":"0","mp_tournament":"0","mp_weaponstay":"0","mp_winlimit":"0","nextlevel":"","num_bots":0,"num_players":15,"num_rules":177,"os":"l","password":0,"players":[{"id":0,"name":"Saint Rick","score":11,"time":7391.3120117188},{"id":0,"name":"Rookie101","score":26,"time":4614.5795898438},{"id":0,"name":"I like the way you bro me","score":0,"time":2846.1115722656},{"id":0,"name":"❤DiXie v7.1❤","score":8,"time":2567.3557128906},{"id":0,"name":"kenny11ckl","score":2,"time":884.51568603516},{"id":0,"name":"CaP'M \/AcediA\\","score":2,"time":849.88037109375},{"id":0,"name":"Brad ArmPitt","score":7,"time":674.3603515625},{"id":0,"name":"Master Wayne","score":1,"time":547.86779785156},{"id":0,"name":"Alexander_Hell","score":0,"time":526.26824951172},{"id":0,"name":"(AKA) DEVILDOG","score":5,"time":401.77484130859},{"id":0,"name":"Enzo B>cards 1 scrap","score":2,"time":241.68547058105},{"id":0,"name":"Loxx","score":0,"time":236.47596740723},{"id":0,"name":"MaestroPG.gc","score":0,"time":230.75927734375},{"id":0,"name":"deadlyist1","score":0,"time":65.996406555176},{"id":0,"name":"Pandas","score":0,"time":62.911708831787}],"port":27015,"protocol":17,"r_AirboatViewDampenDamp":"1.0","r_AirboatViewDampenFreq":"7.0","r_AirboatViewZHeight":"0.0","r_JeepViewDampenDamp":"1.0","r_JeepViewDampenFreq":"7.0","r_JeepViewZHeight":"10.0","r_VehicleViewDampen":"1","sb_version":"1.4.11","secure":1,"sm_admin_sentinel_version":"1.2.100","sm_advertisements_version":"0.5.5","sm_afkm_version":"3.5.2","sm_as_version":"1.0","sm_cannounce_version":"1.4","sm_configauto_loader_version":"0.2","sm_deathbeam_version":"1.1","sm_nextmap":"","sm_rconlock":"0.6.7","sm_server_restart_version":"1.0","sm_spray_version":"5.8","sm_superversus_version":"1.5.4","sm_swearreplace_version":"1.4","sm_vbping_version":"1.4","sourcemod_version":"1.5.4-dev+4059","steam_id":90094482692189186,"steamappid":550,"stripper_version":"1.2.2","survivor_limit":"10","sv_accelerate":"5","sv_admin_sentinel_warmode":"0","sv_airaccelerate":"10","sv_alltalk":"0","sv_bounce":"0","sv_cheats":"0","sv_contact":"","sv_footsteps":"1","sv_friction":"4","sv_gravity":"800","sv_maxspeed":"1000.000000","sv_noclipaccelerate":"5","sv_noclipfriction":"4","sv_noclipspeed":"5","sv_password":"0","sv_rollangle":"0","sv_rollspeed":"200","sv_specaccelerate":"5","sv_specnoclip":"1","sv_specspeed":"3","sv_stepsize":"18","sv_stopspeed":"75","sv_tags":"10v10,20vs,buy,gcftw,increased_maxplayers,versus","sv_voiceenable":"1","sv_wateraccelerate":"10","sv_waterfriction":"1","tauntfrequency":"1","tf_arena_max_streak":"5","tf_arena_preround_time":"10","tf_arena_round_time":"0","tv_enable":"0","tv_password":"0","tv_relaypassword":"0","version":"2.1.3.9","zcs_version":"0.9.2"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/L4d2/2_response.txt b/gameq/tests/Protocols/Providers/L4d2/2_response.txt new file mode 100644 index 0000000..4c4eac0 Binary files /dev/null and b/gameq/tests/Protocols/Providers/L4d2/2_response.txt differ diff --git a/gameq/tests/Protocols/Providers/L4d2/2_result.json b/gameq/tests/Protocols/Providers/L4d2/2_result.json new file mode 100644 index 0000000..e0507bd --- /dev/null +++ b/gameq/tests/Protocols/Providers/L4d2/2_result.json @@ -0,0 +1 @@ +{"66.151.244.151:27015":{"buddha":"0","coop":"0","deathmatch":"1","decalfrequency":"10","dedicated":"d","director_afk_timeout":"45","game_descr":"Left 4 Dead 2","game_dir":"left4dead2","game_id":550,"god":"1","gq_address":"66.151.244.151","gq_joinlink":"steam:\/\/connect\/66.151.244.151:27015\/","gq_name":"Left 4 Dead 2","gq_online":true,"gq_port_client":27015,"gq_port_query":27015,"gq_protocol":"source","gq_transport":"udp","gq_type":"l4d2","hostname":"purpletreefactory's server | DAL [T60] \/ Pro Mod 4.2.2","keywords":"versus,confogl,gravity,increased_maxplayers,secure","l4d2_addons_eclipse":"1","l4d2_block_heatseeking_chargers_version":"1.2","l4d2_server_namer_version":"2.5","l4d2_undoff_announce":"0","l4d2_undoff_blockzerodmg":"7","l4d2_undoff_debug":"0","l4d2_undoff_enable":"7","l4d2_undoff_permdmgfrac":"1.0","l4d_block_spectator_globalchat":"0","l4d_pistol_delay_dualies":"0.1","l4d_pistol_delay_incapped":"0.3","l4d_pistol_delay_single":"0.2","l4d_ready_both_halves":"0","l4d_ready_cfg_name":"Pro Mod 4.2.2","l4d_ready_competition":"0","l4d_ready_connect_enabled":"1","l4d_ready_disable_spawns":"0","l4d_ready_enabled":"1","l4d_ready_minimum_players":"8","l4d_ready_pause_allowed":"3","l4d_ready_pause_duration":"90.0","l4d_ready_search_key_disable":"1","l4d_ready_server_cfg":"","l4d_ready_version":"0.17.10","l4d_stuckzombiemeleefix_version":"1.0.4","l4d_tankdamage_enabled":"1","l4d_tpsblock_version":"1.4","l4d_unreserve_full":"1","l4d_unreserve_version":"1.1.1","left4downtown_version":"0.5.7","map":"c2m1_highway","max_players":25,"metamod_version":"1.11.0-devV","mp_allowNPCs":"1","mp_autocrosshair":"1","mp_autoteambalance":"1","mp_c4timer":"45","mp_disable_respawn_times":"0","mp_fadetoblack":"0","mp_falldamage":"0","mp_flashlight":"1","mp_footsteps":"1","mp_forcerespawn":"1","mp_fraglimit":"0","mp_freezetime":"6","mp_friendlyfire":"1","mp_limitteams":"2","mp_maxrounds":"0","mp_roundtime":"5","mp_stalemate_at_timelimit":"0","mp_stalemate_enable":"0","mp_teamlist":"hgrunt;scientist","mp_teamplay":"0","mp_teams_unbalance_limit":"1","mp_timelimit":"0","mp_tournament":"0","mp_weaponstay":"0","mp_winlimit":"0","nextlevel":"","nokits_version":"0.1.1","num_bots":0,"num_players":10,"num_rules":119,"os":"l","password":0,"players":[{"id":0,"name":"Taco","score":7,"time":1097.2863769531},{"id":0,"name":"LiTTo","score":1,"time":1096.9650878906},{"id":0,"name":"||VanReke||","score":1,"time":1096.9630126953},{"id":0,"name":"-MeserindoLindo-","score":4,"time":1096.9624023438},{"id":0,"name":"Host \/\/","score":3,"time":1096.9613037109},{"id":0,"name":"[[DΑИgэЯØus]] Sísyphos","score":6,"time":1096.9609375},{"id":0,"name":"Kutaro","score":1,"time":871.97619628906},{"id":0,"name":"Power Puff","score":2,"time":830.59234619141},{"id":0,"name":"Ty","score":0,"time":581.15911865234},{"id":0,"name":"Neko - Yudo #Sweet Disposition","score":0,"time":95.367820739746}],"port":27015,"protocol":17,"r_AirboatViewDampenDamp":"1.0","r_AirboatViewDampenFreq":"7.0","r_AirboatViewZHeight":"0.0","r_JeepViewDampenDamp":"1.0","r_JeepViewDampenFreq":"7.0","r_JeepViewZHeight":"10.0","r_VehicleViewDampen":"1","sb_version":"1.4.10","scp_version":"1.1.5A","secure":1,"sm_advertisements_version":"0.6","sm_allinfo_version":"2.1.1","sm_cannounce_version":"1.6","sm_l4d2sgag_version":"0.4","sm_nextmap":"","sm_skill_detect_version":"0.9.15","sm_updater_version":"1.2.1","smac_version":"0.8.5.1","sourcemod_version":"1.6.0-dev+4171","steam_id":90094493009049603,"steamappid":550,"stop_trolls_version":"1.0","stripper_version":"1.2.2","survivor_limit":"4","sv_accelerate":"5","sv_airaccelerate":"10","sv_alltalk":"0","sv_bounce":"0","sv_cheats":"0","sv_contact":"","sv_footsteps":"1","sv_friction":"4","sv_gravity":"750","sv_maxspeed":"1000.000000","sv_noclipaccelerate":"5","sv_noclipfriction":"4","sv_noclipspeed":"5","sv_password":"0","sv_rollangle":"0","sv_rollspeed":"200","sv_specaccelerate":"5","sv_specnoclip":"1","sv_specspeed":"3","sv_steamgroup":"3231237,4197407","sv_stepsize":"18","sv_stopspeed":"75","sv_tags":"confogl,gravity,increased_maxplayers","sv_voiceenable":"1","sv_wateraccelerate":"10","sv_waterfriction":"1","tankdoorfix_version":"1.4","tauntfrequency":"1","tf_arena_max_streak":"5","tf_arena_preround_time":"10","tf_arena_round_time":"0","tv_enable":"0","tv_password":"0","tv_relaypassword":"0","version":"2.1.3.9"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Lhmp/1_response.txt b/gameq/tests/Protocols/Providers/Lhmp/1_response.txt new file mode 100644 index 0000000..dca61f9 Binary files /dev/null and b/gameq/tests/Protocols/Providers/Lhmp/1_response.txt differ diff --git a/gameq/tests/Protocols/Providers/Lhmp/1_result.json b/gameq/tests/Protocols/Providers/Lhmp/1_result.json new file mode 100644 index 0000000..5767549 --- /dev/null +++ b/gameq/tests/Protocols/Providers/Lhmp/1_result.json @@ -0,0 +1 @@ +{"185.91.119.30:27315":{"gamemode":"DeathMatch","gq_address":"185.91.119.30","gq_joinlink":"","gq_name":"Lost Heaven","gq_online":true,"gq_port_client":27315,"gq_port_query":27316,"gq_protocol":"lhmp","gq_transport":"udp","gq_type":"lhmp","mapname":"MISE11-VILA","maxplayers":100,"numplayers":0,"password":"","protocol":"","servername":"[EU-5] Hicoria.com - LHMP - Villadm","website":"http:\/\/hicoria.com"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Lhmp/2_response.txt b/gameq/tests/Protocols/Providers/Lhmp/2_response.txt new file mode 100644 index 0000000..f94073d Binary files /dev/null and b/gameq/tests/Protocols/Providers/Lhmp/2_response.txt differ diff --git a/gameq/tests/Protocols/Providers/Lhmp/2_result.json b/gameq/tests/Protocols/Providers/Lhmp/2_result.json new file mode 100644 index 0000000..c3a66fc --- /dev/null +++ b/gameq/tests/Protocols/Providers/Lhmp/2_result.json @@ -0,0 +1 @@ +{"185.91.119.30:27100":{"gamemode":"Real-Life","gq_address":"185.91.119.30","gq_joinlink":"","gq_name":"Lost Heaven","gq_online":true,"gq_port_client":27100,"gq_port_query":27101,"gq_protocol":"lhmp","gq_transport":"udp","gq_type":"lhmp","mapname":"freekrajina","maxplayers":100,"numplayers":0,"password":"","protocol":"","servername":"[EU-3] Hicoria.com - LHMP - Krajinka","website":"http:\/\/hicoria.com"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Minecraft/1_response.txt b/gameq/tests/Protocols/Providers/Minecraft/1_response.txt new file mode 100644 index 0000000..2011fd7 Binary files /dev/null and b/gameq/tests/Protocols/Providers/Minecraft/1_response.txt differ diff --git a/gameq/tests/Protocols/Providers/Minecraft/1_result.json b/gameq/tests/Protocols/Providers/Minecraft/1_result.json new file mode 100644 index 0000000..a704d04 --- /dev/null +++ b/gameq/tests/Protocols/Providers/Minecraft/1_result.json @@ -0,0 +1 @@ +{"173.236.91.122:25565":{"game_id":"MINECRAFT","gametype":"SMP","gq_address":"173.236.91.122","gq_joinlink":"minecraft:\/\/173.236.91.122:25565\/","gq_name":"Minecraft","gq_online":true,"gq_port_client":25565,"gq_port_query":25565,"gq_protocol":"gamespy3","gq_transport":"udp","gq_type":"minecraft","hostip":"173.236.91.122","hostname":"§3<<<§2TRIBES§3>>>","hostport":"25565","map":"world","maxplayers":"75","numplayers":"14","players":[{"player":"SlappMeDo"},{"player":"specnardo"},{"player":"hackhunter_115"},{"player":"OGthirteen"},{"player":"Roxxerx"},{"player":"weaselstomper04"},{"player":"wiliammmm"},{"player":"pyrocheerios"},{"player":"bulldog0011"},{"player":"TheRacc00n"},{"player":"BigHenry"},{"player":"Maximus1299"},{"player":"Shok252"},{"player":"LunarisNukes"}],"plugins":"CraftBukkit on Bukkit 1.8-R0.1-SNAPSHOT: WorldBorder 1.8.0; NoCheatPlus 3.12.0-SNAPSHOT-sMD5NET-b777; WorldEdit 6.0,3342-78f975b9; Vault 1.5.2-b33; ClearLag 2.7.7; PermissionsEx 1.22.7-SNAPSHOT; Modifyworld 1.19.7; Votifier 1.9; WorldGuard 6.0.0-beta-05.1569-; GAListener 1.3.1; Essentials TeamCity; EssentialsSpawn TeamCity; BookShelf 3.8; EssentialsChat TeamCity; EnjinMinecraftPlugin 2.7.1-bukkit; Factions 1.6.9.5-U0.1.15-SNAPSHOT; ObsidianDestroyer 4.3.7","version":"1.8"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Minecraft/2_response.txt b/gameq/tests/Protocols/Providers/Minecraft/2_response.txt new file mode 100644 index 0000000..d8eb1d0 Binary files /dev/null and b/gameq/tests/Protocols/Providers/Minecraft/2_response.txt differ diff --git a/gameq/tests/Protocols/Providers/Minecraft/2_result.json b/gameq/tests/Protocols/Providers/Minecraft/2_result.json new file mode 100644 index 0000000..368a383 --- /dev/null +++ b/gameq/tests/Protocols/Providers/Minecraft/2_result.json @@ -0,0 +1 @@ +{"74.50.111.251:25565":{"game_id":"MINECRAFT","gametype":"SMP","gq_address":"74.50.111.251","gq_joinlink":"minecraft:\/\/74.50.111.251:25565\/","gq_name":"Minecraft","gq_online":true,"gq_port_client":25565,"gq_port_query":25565,"gq_protocol":"gamespy3","gq_transport":"udp","gq_type":"minecraft","hostip":"74.50.111.251","hostname":"§7={§9§leGO§r§7}= §eSurvival§8, §dSkyblock§8 & §bPlots §8§!","hostport":"25565","map":"spawnisland","maxplayers":"60","numplayers":"15","players":[{"player":"Acefire97"},{"player":"Pslacorte"},{"player":"Nightcutter98"},{"player":"Mochaccino3"},{"player":"StarRazor"},{"player":"misterboy500"},{"player":"Lyarra"},{"player":"_Ritzy"},{"player":"Bahlman"},{"player":"BenishKaleb1"},{"player":"ArlyeToathe"},{"player":"xXPopulation7Xx"},{"player":"MinecraftOutcast"},{"player":"kooroo"},{"player":"FoxyMomma776"}],"plugins":"CraftBukkit on Bukkit 1.8-R0.1-SNAPSHOT: SimplePVPToggle 1.1; CommandUsed 0.0.1; PlugMan 2.0.2; PressurePush 0.8; Vault 1.4.1-b436; PlotMe 0.16.3; MAUL_MC 0.0.4; NetherPortalRescue 1.1.0; RemoteToolkitPlugin R10_A15.3; dynmap 2.1-SNAPSHOT-1091; eGODS 0.8.4; Decapitation 0.2.8; ChestShopFinder 0.9.4; Votifier 1.9; EggBreeding 0.2.0; PlotMe-DefaultGenerator 0.16.1; mcMMO 1.5.00-b3547; PlgDisableCmd 2.0; LagMeter 1.16.0; SBC 0.0.7; WorldEdit 6.0,3342-78f975b9; RepairRecipe 0.4.10; PlayerSnapshot 0.7.2; LWC 4.5.0-SNAPSHOT; eGOAds 0.1.0; WorldGuard 6.0.0-beta-03.1514-; PotionStacker 1.0; PEXSetRank 1.0.0; SignEdit 3.3.8; VoteRoulette 2.3.2; TimePlayed 0.1.0; BuyRegion 1.1.7; BookRules 2.1.1; ClearLag 2.7.2; ChunkSpawnerLimiter 3.0.3; RandomTP 1.1.0; MyWarp 2.5.2; Essentials TeamCity; WorldBorder 1.7.4; Multiverse-Core 2.5-b691; Prism 2.0.4-18; uSkyBlock 2.2-HF9b; CraftBook 3.9-SNAPSHOT; ChestShop 3.8.1; EssentialsChat TeamCity; EssentialsSpawn TeamCity; Multiverse-Inventories 2.5-b335; VanishNoPacket 3.18.1; Multiverse-NetherPortals 2.5-bUNKNOWN; NameRetriever 1.0.3; PermissionsEx 1.19.5; ScoreboardStats 0.7.5; AdminChat 0.0.9; BottledExp 1.7.1; GriefPrevention 10.8; AdminTime 1.5.1","version":"1.8"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Minecraft/3_response.txt b/gameq/tests/Protocols/Providers/Minecraft/3_response.txt new file mode 100644 index 0000000..e769408 Binary files /dev/null and b/gameq/tests/Protocols/Providers/Minecraft/3_response.txt differ diff --git a/gameq/tests/Protocols/Providers/Minecraft/3_result.json b/gameq/tests/Protocols/Providers/Minecraft/3_result.json new file mode 100644 index 0000000..d84c8a9 --- /dev/null +++ b/gameq/tests/Protocols/Providers/Minecraft/3_result.json @@ -0,0 +1 @@ +{"64.94.100.226:25565":{"game_id":"MINECRAFT","gametype":"SMP","gq_address":"64.94.100.226","gq_joinlink":"minecraft:\/\/64.94.100.226:25565\/","gq_name":"Minecraft","gq_online":true,"gq_port_client":25565,"gq_port_query":25565,"gq_protocol":"gamespy3","gq_transport":"udp","gq_type":"minecraft","hostip":"64.94.100.226","hostname":"I like big butts","hostport":"25565","map":"Creative","maxplayers":"20","numplayers":"0","plugins":"CraftBukkit on Bukkit 1.12-R0.1-SNAPSHOT: dynmap 2.5-Dev201706100405; WorldEdit 6.1.7,dd00bb1; Essentials TeamCity; BKCommonLib 1.12.1-v1; SignLink 1.11.2-v2; Modifyworld 1.19.7; Multiverse-Core 2.5-b641; NoCheatPlus 3.12.0-BETA2-sASO-b813; EssentialsProtect TeamCity; Multiverse-Inventories 2.5.0-SNAPSHOT-b418; Train_Carts 1.12-v2; BiomeEdit 1.0.1; EssentialsChat TeamCity; EssentialsAntiBuild TeamCity; AntiGuest 3.10.0; etCommon 2; Multiverse-NetherPortals 2.4-b530; Multiverse-Portals 2.5.0-b751; EssentialsSpawn TeamCity; GriefPrevention 12.2; RedstoneChips 0.97; BasicCircuits 0.97; SensorLibrary 0.33; TCHangRail 1.11.2-v1; Dynmap-GriefPrevention 0.80","version":"1.12"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Minecraft/4_response.txt b/gameq/tests/Protocols/Providers/Minecraft/4_response.txt new file mode 100644 index 0000000..8c60f94 Binary files /dev/null and b/gameq/tests/Protocols/Providers/Minecraft/4_response.txt differ diff --git a/gameq/tests/Protocols/Providers/Minecraft/4_result.json b/gameq/tests/Protocols/Providers/Minecraft/4_result.json new file mode 100644 index 0000000..5bf6df8 --- /dev/null +++ b/gameq/tests/Protocols/Providers/Minecraft/4_result.json @@ -0,0 +1 @@ +{"145.239.222.199:25565":{"game_id":"MINECRAFT","gametype":"SMP","gq_address":"145.239.222.199","gq_joinlink":"minecraft:\/\/145.239.222.199:25565\/","gq_name":"Minecraft","gq_online":true,"gq_port_client":25565,"gq_port_query":25565,"gq_protocol":"gamespy3","gq_transport":"udp","gq_type":"minecraft","hostip":"145.239.222.199","hostname":"ArcherNetwork > Factions | ArenaPvP | SkyBlock | UHC | Prison | SkyPvP","hostport":"25565","map":"BungeeCord_Proxy","maxplayers":"500","numplayers":"64","players":[{"player":"vigHD1"},{"player":"Talisman_7"},{"player":"pametnjakovic"},{"player":"koontra"},{"player":"LUKAPO1"},{"player":"_lakipro123_"},{"player":"DasGoldeneToast"},{"player":"herobrineHD"},{"player":"BlackyFTW"},{"player":"MorskoPrase23"},{"player":"Cukiome"},{"player":"x_Beraa_x"},{"player":"Martinstelma"},{"player":"Phorceus"},{"player":"JocoDaBossFTW"},{"player":"Zekaa"},{"player":"LadyVoldemort"},{"player":"Gregga17"},{"player":"SuperSemKiller2"},{"player":"Summer_Cat"},{"player":"xFadeaway_"},{"player":"Avo"},{"player":"grigoris007"},{"player":"MCGamer"},{"player":"Biljana"},{"player":"ki11er187"},{"player":"Peki"},{"player":"ImIllusions"},{"player":"Kuddeen"},{"player":"Pompeyo"},{"player":"DODOkill98"},{"player":"domainalein_"},{"player":"_XBlue_GamerX_"},{"player":"MichaelJShark"},{"player":"Dupstep"},{"player":"Konradon"},{"player":"looper"},{"player":"Makle_steren00"},{"player":"Abotonix"},{"player":"Sodie"},{"player":"Sparky04"},{"player":"michael456"},{"player":"Syki"},{"player":"MrKolumbo"},{"player":"Dino3152004"},{"player":"TryHardPvP"},{"player":"CounterT"},{"player":"darkbulbasaur"},{"player":"Wiwiwi"},{"player":"CuzImReaz"},{"player":"MamaSwigzy"},{"player":"xXMegaAwsomeXx"},{"player":"proba"},{"player":"18andOlderPlease"},{"player":"KimE"},{"player":"pupaivan2008"},{"player":"_nebojsa5_"},{"player":"ognjen123456789"},{"player":"Danio_"},{"player":"AdoX_FTW"},{"player":"ImBackBitches3"},{"player":"Maki_Kaki"},{"player":"DakiSRB"},{"player":"miniplexprogamer"}],"plugins":"","version":"ArcherNetwork 1.7.x-1.12.x"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Minecraftpe/1_response.txt b/gameq/tests/Protocols/Providers/Minecraftpe/1_response.txt new file mode 100644 index 0000000..a1e493d Binary files /dev/null and b/gameq/tests/Protocols/Providers/Minecraftpe/1_response.txt differ diff --git a/gameq/tests/Protocols/Providers/Minecraftpe/1_result.json b/gameq/tests/Protocols/Providers/Minecraftpe/1_result.json new file mode 100644 index 0000000..a8ae294 --- /dev/null +++ b/gameq/tests/Protocols/Providers/Minecraftpe/1_result.json @@ -0,0 +1 @@ +{"149.56.28.157:19132":{"game_id":"MINECRAFTPE","gametype":"SMP","gq_address":"149.56.28.157","gq_joinlink":"minecraft:\/\/149.56.28.157:19132\/","gq_name":"MinecraftPE","gq_online":true,"gq_port_client":19132,"gq_port_query":19132,"gq_protocol":"gamespy3","gq_transport":"udp","gq_type":"minecraftpe","hostip":"0.0.0.0","hostname":"AvengeTech LoadBalancer","hostport":"19132","map":"Commission","maxplayers":"33","numplayers":"32","players":[{"player":"ToothlessYangya"}],"plugins":"PocketMine-MP 1.7dev: DevTools 1.12.7; Core 1.7.0","server_engine":"PocketMine-MP 1.7dev","version":"v1.2.7","whitelist":"off"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Minecraftpe/2_response.txt b/gameq/tests/Protocols/Providers/Minecraftpe/2_response.txt new file mode 100644 index 0000000..a5bff8f Binary files /dev/null and b/gameq/tests/Protocols/Providers/Minecraftpe/2_response.txt differ diff --git a/gameq/tests/Protocols/Providers/Minecraftpe/2_result.json b/gameq/tests/Protocols/Providers/Minecraftpe/2_result.json new file mode 100644 index 0000000..0b18e95 --- /dev/null +++ b/gameq/tests/Protocols/Providers/Minecraftpe/2_result.json @@ -0,0 +1 @@ +{"104.238.128.20:19132":{"game_id":"MINECRAFTPE","gametype":"SMP","gq_address":"104.238.128.20","gq_joinlink":"minecraft:\/\/104.238.128.20:19132\/","gq_name":"MinecraftPE","gq_online":true,"gq_port_client":19132,"gq_port_query":19132,"gq_protocol":"gamespy3","gq_transport":"udp","gq_type":"minecraftpe","hostip":"0.0.0.0","hostname":"Welcome to PigRaid PVP !","hostport":"19132","map":"hub2","maxplayers":"525","numplayers":"91","players":[{"player":"ste211"}],"plugins":"PocketMine-MP 1.7dev: DevTools 1.12.6; VoteReward 3; Transfer 1.1; EssentialCommands 1.0.3; ChatDefender 1.1.1; SlapperRotation 1.1; PRServer 1; RankBoard 1; VIPSlots 0.0.3; EasyMOTD 1.0a; MiniGames 1.0.0; Slapper 1.3.7; HeadRocket 1.0.0; essentialsTP 1.1.0; ProtocolHack 1.0.0; MagicTelePortal 1.3.2; PRCrate 1; iProtector 3.1a; TimerBan 2.1; PRUtil 1; PigRaid 1.0.0; BanItem 2.1; MSpawns 1.4; DataProvider 1.0.0; BuyCraft 1.2.1; ClearLagg 1.1.0; SimpleMessages 1.2; PRSpawn 1; CombatLogger 1.2.0; PRWorldBorder 1; Particles 1; SimpleAuth 1.7.1; ServerCore 1.0.0; PRCore 1; SlapperCache 1.0.1; FactionsPro 1.3.0; PRChat 1; Cron 1; PREnderPearls 1.0.1; NoHunger 1.0.0; BouncyBlocks 1; PurePerms 1.1.2; BarAPI 1.0.1; EconomyAPI 2.0.7; PRSecret 1; NoFlyZone 1.0.0; Capes 1.0.2; Pets 1.2.5; ChatCensor 1.4; SimpleAuthHelper 2.0.0; MongoSlots 1.0.0; Potions 1.0.4; EconomyShop 2.0.5; KillRate 2.0.1; GrabBag 2.3.0; BattleKits 1.0.3; SignWarp 1.5.1","server_engine":"PocketMine-MP 1.7dev","version":"v1.2.8","whitelist":"off"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Mohaa/1_response.txt b/gameq/tests/Protocols/Providers/Mohaa/1_response.txt new file mode 100644 index 0000000..e250ca1 --- /dev/null +++ b/gameq/tests/Protocols/Providers/Mohaa/1_response.txt @@ -0,0 +1,3 @@ +\location\1\gamever\1.11\gamename\mohaa\gamemode\openplaying\maxplayers\45\numplayers\20\gametype\Team-Match\mapname\m5l1b\hostport\12203\hostname\ STONER SERVER\rankedserver\0\fraglimit\0\timelimit\15\player_5\** JO **\frags_5\27\deaths_5\22\ping_5\200\player_6\KhoKh@@@\frags_6\21\deaths_6\28\ping_6\189\player_7\Thorn\frags_7\27\deaths_7\22\ping_7\193\player_8\boogerhook johnson\frags_8\21\deaths_8\28\ping_8\133\player_9\ARGENTINOs\frags_9\27\deaths_9\22\ping_9\250\player_10\Popeye\frags_10\21\deaths_10\28\ping_10\51\player_11\Bill Hubbard\frags_11\21\deaths_11\28\ping_11\150\player_12\BOB\frags_12\27\deaths_12\22\ping_12\155\player_13\Spc.SCHWARZBACH\frags_13\21\deaths_13\28\ping_13\180\player_14\(kaito_kid)\frags_14\21\deaths_14\28\ping_14\210\player_15\HansensLemonLime\frags_15\21\deaths_15\28\ping_15\50\player_16\TU PAPI PERUANO!!\frags_16\27\deaths_16\22\ping_16\142\player_17\waNdy*\frags_17\27\deaths_17\22\ping_17\98\player_24\Mazuras\frags_24\27\deaths_24\22\ping_24\88\player_25\Spc.Bad Company\frags_25\0\deaths_25\0\ping_25\34\player_28\Garden Mall\frags_28\0\deaths_28\0\ping_28\59\player_30\u.u\frags_30\0\deaths_30\0\ping_30\198\player_33\ozooo13\frags_33\27\deaths_33\22\ping_33\200\player_36\]RoacH[ Just T\frags_36\27\deaths_36\22\ping_36\50\player_39\YOUROLEMAN\frags_39\0\deaths_39\0\ping_39\116\queryid\4396.1 +|| +\final\\queryid\4396.2 \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Mohaa/1_result.json b/gameq/tests/Protocols/Providers/Mohaa/1_result.json new file mode 100644 index 0000000..86bdf3c --- /dev/null +++ b/gameq/tests/Protocols/Providers/Mohaa/1_result.json @@ -0,0 +1 @@ +{"162.248.91.229:12203":{"dedicated":1,"final":"","fraglimit":"0","gamemode":"openplaying","gamename":"mohaa","gametype":"Team-Match","gamever":"1.11","gq_address":"162.248.91.229","gq_joinlink":"","gq_name":"Medal of honor: Allied Assault","gq_online":true,"gq_port_client":12203,"gq_port_query":12300,"gq_protocol":"gamespy","gq_transport":"udp","gq_type":"mohaa","hostname":" STONER SERVER","hostport":"12203","location":"1","mapname":"m5l1b","maxplayers":"45","num_players":0,"num_teams":0,"numplayers":"20","players":[{"player":"** JO **","frags":"27","deaths":"22","ping":"200"},{"player":"KhoKh@@@","frags":"21","deaths":"28","ping":"189"},{"player":"Thorn","frags":"27","deaths":"22","ping":"193"},{"player":"boogerhook johnson","frags":"21","deaths":"28","ping":"133"},{"player":"ARGENTINOs","frags":"27","deaths":"22","ping":"250"},{"player":"Popeye","frags":"21","deaths":"28","ping":"51"},{"player":"Bill Hubbard","frags":"21","deaths":"28","ping":"150"},{"player":"BOB","frags":"27","deaths":"22","ping":"155"},{"player":"Spc.SCHWARZBACH","frags":"21","deaths":"28","ping":"180"},{"player":"(kaito_kid)","frags":"21","deaths":"28","ping":"210"},{"player":"HansensLemonLime","frags":"21","deaths":"28","ping":"50"},{"player":"TU PAPI PERUANO!!","frags":"27","deaths":"22","ping":"142"},{"player":"waNdy*","frags":"27","deaths":"22","ping":"98"},{"player":"Mazuras","frags":"27","deaths":"22","ping":"88"},{"player":"Spc.Bad Company","frags":"0","deaths":"0","ping":"34"},{"player":"Garden Mall","frags":"0","deaths":"0","ping":"59"},{"player":"u.u","frags":"0","deaths":"0","ping":"198"},{"player":"ozooo13","frags":"27","deaths":"22","ping":"200"},{"player":"]RoacH[ Just T","frags":"27","deaths":"22","ping":"50"},{"player":"YOUROLEMAN","frags":"0","deaths":"0","ping":"116"}],"rankedserver":"0","timelimit":"15"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Mohaa/2_response.txt b/gameq/tests/Protocols/Providers/Mohaa/2_response.txt new file mode 100644 index 0000000..137bc47 --- /dev/null +++ b/gameq/tests/Protocols/Providers/Mohaa/2_response.txt @@ -0,0 +1 @@ +\location\1\gamever\1.11\gamename\mohaa\gamemode\openplaying\maxplayers\32\numplayers\1\gametype\=|LuV|= Freeze-Tag Melt Points\mapname\dm/mohdm7\hostport\12203\hostname\^3=|LuV|= Freeze-Tag Server @ www.luvclan.eu\rankedserver\0\fraglimit\0\timelimit\15\player_0\=|LuV|= AmmaR\frags_0\0\deaths_0\0\ping_0\98\final\\queryid\2663.1 \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Mohaa/2_result.json b/gameq/tests/Protocols/Providers/Mohaa/2_result.json new file mode 100644 index 0000000..c087ae6 --- /dev/null +++ b/gameq/tests/Protocols/Providers/Mohaa/2_result.json @@ -0,0 +1 @@ +{"37.97.240.42:12203":{"dedicated":1,"final":"","fraglimit":"0","gamemode":"openplaying","gamename":"mohaa","gametype":"=|LuV|= Freeze-Tag Melt Points","gamever":"1.11","gq_address":"37.97.240.42","gq_joinlink":"","gq_name":"Medal of honor: Allied Assault","gq_online":true,"gq_port_client":12203,"gq_port_query":12300,"gq_protocol":"gamespy","gq_transport":"udp","gq_type":"mohaa","hostname":"^3=|LuV|= Freeze-Tag Server @ www.luvclan.eu","hostport":"12203","location":"1","mapname":"dm\/mohdm7","maxplayers":"32","num_players":0,"num_teams":0,"numplayers":"1","players":[{"player":"=|LuV|= AmmaR","frags":"0","deaths":"0","ping":"98"}],"rankedserver":"0","timelimit":"15"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Mohaa/3_response.txt b/gameq/tests/Protocols/Providers/Mohaa/3_response.txt new file mode 100644 index 0000000..6c47d2f --- /dev/null +++ b/gameq/tests/Protocols/Providers/Mohaa/3_response.txt @@ -0,0 +1 @@ +\location\1\gamever\1.11\gamename\mohaa\gamemode\openplaying\maxplayers\32\numplayers\2\gametype\Team-Match\mapname\dm/mohdm4\hostport\12206\hostname\^3=|LuV|= Team-Deathmatch Server @ www.luvclan.eu\rankedserver\0\fraglimit\0\timelimit\20\player_0\=|LuV|= Face |SA|\frags_0\0\deaths_0\0\ping_0\64\player_2\=|LUV|=grazy\frags_2\0\deaths_2\0\ping_2\10\final\\queryid\46314.1 \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Mohaa/3_result.json b/gameq/tests/Protocols/Providers/Mohaa/3_result.json new file mode 100644 index 0000000..6630350 --- /dev/null +++ b/gameq/tests/Protocols/Providers/Mohaa/3_result.json @@ -0,0 +1 @@ +{"37.97.240.42:12204":{"dedicated":1,"final":"","fraglimit":"0","gamemode":"openplaying","gamename":"mohaa","gametype":"Team-Match","gamever":"1.11","gq_address":"37.97.240.42","gq_joinlink":"","gq_name":"Medal of honor: Allied Assault","gq_online":true,"gq_port_client":12204,"gq_port_query":12301,"gq_protocol":"gamespy","gq_transport":"udp","gq_type":"mohaa","hostname":"^3=|LuV|= Team-Deathmatch Server @ www.luvclan.eu","hostport":"12206","location":"1","mapname":"dm\/mohdm4","maxplayers":"32","num_players":0,"num_teams":0,"numplayers":"2","players":[{"player":"=|LuV|= Face |SA|","frags":"0","deaths":"0","ping":"64"},{"player":"=|LUV|=grazy","frags":"0","deaths":"0","ping":"10"}],"rankedserver":"0","timelimit":"20"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Mta/1_response.txt b/gameq/tests/Protocols/Providers/Mta/1_response.txt new file mode 100644 index 0000000..208caa8 --- /dev/null +++ b/gameq/tests/Protocols/Providers/Mta/1_response.txt @@ -0,0 +1,18 @@ +EYE1mta22003^SX - CnR/DM/RP [proyectosx.net] [Español] [Trabajos|Gangs|Turf|Casas|Criminales vs Policias] SX CnR/DM/RPSX1.40203512?Laucha154? +|XS|Skrim231?DeNix273?[E]EdgarMacias13255? +Nesta~LDS113?SoSi188?[E.T.E.R][P]ausa85?goxi66?Dark<<~Bolt~>>181? South-Park147? DarkasPlayer133?[F.A.]WakaMan[UAD]210?|RG|M@tias2112(CARP)183?Hoodie150?Dark~[F]uSion[SB]235? Ch|Mitsu185?Mist-Ps158?|N|[A]zazzin95133?xXXBlackGhostXXx267? OliSykes182? +Dark-Zona102?~[S]aya~[|XV|]188?Camila150?|URU|ENZO..(x_x)..196? [F.A.]Neon140?lVlWiz_Natanael87?|CW|DESCONOCIDO~426?Navaja260?|RG|Mordecay<3521?{R.G}Gabriel_FLOW235?Takadox133?[S.W.A.T.]Murdoc[UAD]251?[GROM]~Felipe~|GSG|101?||~CamiloFG~||172?CH|Leonidaz18175?T30xD390? LO|Demoniak_188?[F.A.]MrTomato168? [Ch]Pipex542132? DarkRadu143? +Pedro_666152?[RG]NagusFlow182?[F.A.]CaLeX9[AE](VeRa)182? |LO|Salvador86? |RG|Hollman80? DreamerBoy258?Darkus98?[GROM]Francoo271?Daniel150?|THC|BaianoBR167?[RF]-Enzo-1998-167?Lushe153?juancarlithos235?[LO]victor.a.136?|G2H|Angeliux43v3er109? +[A.T]Wolf108?|Ch|<<[P]et>>137?[F.A.]xLuisV2[UAD]80?|CQC|stun.fail74?OS|Mr.Smithers~320? |G2H|R3L4X196?[F.B.I]Ricardo_Vera150?ScandalousRam77192? Facebookero180?~//Reconnect\\~144? |G2H|>Tupac<158?[F.A.]MrBlooDyOtaku129?Dark|Punisher[HL]80? .d:Oliver:b.175?[T.E]Wolk>>>XV<<<153? merari94543118? PepeBagoneta181?DarkMuhin[SB]231?[E](CIA)(PU)Vera(Alex)166?[G2H]-[[Wiz.NEGriFA]]1038? [F.A.]Market473?B$Z-Asilo.3.8|D.C|114? [XV]Stormy221? UNDERCOVER42245?[S.W.A.T.]WarDarkGT|A|136?DarkGisometro166?[CW]Peluca64346172?[F.B.I]Hardwell144? [XV]sr.gato154? +DiegoSape183?CQC|Mata-Ratas|76?|N|LifeStealer147?|CQC|TonyRasta112?|XV|NiggaWhat|DLR|48?DarkTrevelyan006172?[F.A.]Sr.Juan220? |Bs|hitman196?lRFlPapiarca-lDLRl78?A.QCQ||El-Comisario||170? BEKOWSKY475?|Royal|Tabasquenio~112?CH|A.Dark|MR.Jeff109?E.T.E.R[~Tempo~]192?Dark|Monobeer~122?[SX][Ch][Juancho][CM]87?Jhonata206? +Sergio_17254? .:RG:.Rukia95?A.CQC|ASESINO|119? +AletsLuro84? []-[N4CH0]166?Derezz164?|VanSs185?|~|K|iriTo|~|126?[Ch][SrMaku][CM]98?[S.W.A.T.]XbaxS160? mortalkendo200?[A.T]MorirConHonor246?[CQC]Street|Schultz<~143?KoMaNdO166?Dark.:Pitufo:.74? +Ulquiorra181?DUZTIK60? benhooodlum167?N|~[V]0D[K]4~|Sk224?Deluxe172?[E.T.E.R.]Cobani174?>XV|~|Castillo|~|<132?Emer203?[S.W.A.T.]Soldier|A|192?BrunooCortees161? +TicciToby224? Nazarena115? YeowlSamsung108?[SX]DarkGuillermo154? elias159568? [CQC]RamTs124?[S.W.A.T.]LockeD|B|358?Strix245?Arkanic94?>>-[XV]-[P][!7@ChU]-<<174?Dejota196?[E.T.E.R]Adan160?[F.B.I]shoxieJESUS180?onerom202?BELA154?Cristina|G2H|314? viscosho116?~Wang~154?[CH]RaggedEel11130?[F.A.]Sr.Viejete88? ~Disconnect~129? [F.A.]MrLuis105? DarkPucho~!157? ChufiBerta224?[GROM]~BlueMoon[GSG]162?FloweryTissue9064? |~Spryte~|136?A.Dark|Mr.PhyscoGL437?Dark~[P]ikachu~|SB|259?Robocop157?Ayudo|D|Olivo1|DLR!119? fabiloso154?SEM|Eazy-E|::XV231?Fray~123?DarkAsh238? +YESENIA13116?alexboy87?[E.T.E.R.]Stealthy190? Tomorrowland150?FidoOo105?Juan220? +SOYELPOPO62? +alan1508498?[F.A.]Moriremoscnhonor85?[CQC]->Cronnos-|327? +Freakshow70? |CQC|~Cris~>220?Dominic119?GuilleFlow|RG|154?Dark~NaNoSnaKe~Pino140?|G2H|Infinity-[HM]140? ~G2H~Atrox:3169?|N|-XxFeDhexX72?DarkPajaroSalvaje230?DemonicChamois3570?[A.T]~Toreto~84?Caquitafresca109?aloud77164?DieGo168? Fernando246? +javiera:3167?CQC||GhostMen||70?[I.L.V]heProx|C|[DK].211?[A.T]Dante-GDE|D|[UAD]164?|CQC|[G]onzalo~>>165?Warlock257? julitolocura238? +Rodryyy!!138?CH~Saelmus~CM188?RIVALDO147? Nazarena>_<3165?Smith158?FTW!Brayan420213?|?!|Lord|Mohinx|166? +Brunspart107?[DC]jeysonpro514?[CQC]Herobrine2002114 \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Mta/1_result.json b/gameq/tests/Protocols/Providers/Mta/1_result.json new file mode 100644 index 0000000..9f83f6b --- /dev/null +++ b/gameq/tests/Protocols/Providers/Mta/1_result.json @@ -0,0 +1 @@ +{"104.156.48.17:22003":{"dedicated":1,"gamename":"mta","gametype":"SX CnR\/DM\/RP","gq_address":"104.156.48.17","gq_joinlink":"mtasa:\/\/104.156.48.17:22003\/","gq_name":"Multi Theft Auto","gq_online":true,"gq_port_client":22003,"gq_port_query":22126,"gq_protocol":"ase","gq_transport":"udp","gq_type":"mta","map":"SX","max_players":"512","num_players":"203","password":"0","players":[{"name":"Laucha","team":"","skin":"","score":"","ping":"154","time":""},{"name":"|XS|Skrim","team":"","skin":"","score":"","ping":"231","time":""},{"name":"DeNix","team":"","skin":"","score":"","ping":"273","time":""},{"name":"[E]EdgarMacias13","team":"","skin":"","score":"","ping":"255","time":""},{"name":"Nesta~LDS","team":"","skin":"","score":"","ping":"113","time":""},{"name":"SoSi","team":"","skin":"","score":"","ping":"188","time":""},{"name":"[E.T.E.R][P]ausa","team":"","skin":"","score":"","ping":"85","time":""},{"name":"goxi","team":"","skin":"","score":"","ping":"66","time":""},{"name":"Dark<<~Bolt~>>","team":"","skin":"","score":"","ping":"181","time":""},{"name":"South-Park","team":"","skin":"","score":"","ping":"147","time":""},{"name":"DarkasPlayer","team":"","skin":"","score":"","ping":"133","time":""},{"name":"[F.A.]WakaMan[UAD]","team":"","skin":"","score":"","ping":"210","time":""},{"name":"|RG|M@tias2112(CARP)","team":"","skin":"","score":"","ping":"183","time":""},{"name":"Hoodie","team":"","skin":"","score":"","ping":"150","time":""},{"name":"Dark~[F]uSion[SB]","team":"","skin":"","score":"","ping":"235","time":""},{"name":"Ch|Mitsu","team":"","skin":"","score":"","ping":"185","time":""},{"name":"Mist-Ps","team":"","skin":"","score":"","ping":"158","time":""},{"name":"|N|[A]zazzin95","team":"","skin":"","score":"","ping":"133","time":""},{"name":"xXXBlackGhostXXx","team":"","skin":"","score":"","ping":"267","time":""},{"name":"OliSykes","team":"","skin":"","score":"","ping":"182","time":""},{"name":"Dark-Zona","team":"","skin":"","score":"","ping":"102","time":""},{"name":"~[S]aya~[|XV|]","team":"","skin":"","score":"","ping":"188","time":""},{"name":"Camila","team":"","skin":"","score":"","ping":"150","time":""},{"name":"|URU|ENZO..(x_x)..","team":"","skin":"","score":"","ping":"196","time":""},{"name":"[F.A.]Neon","team":"","skin":"","score":"","ping":"140","time":""},{"name":"lVlWiz_Natanael","team":"","skin":"","score":"","ping":"87","time":""},{"name":"|CW|DESCONOCIDO~","team":"","skin":"","score":"","ping":"426","time":""},{"name":"Navaja","team":"","skin":"","score":"","ping":"260","time":""},{"name":"|RG|Mordecay<3","team":"","skin":"","score":"","ping":"521","time":""},{"name":"{R.G}Gabriel_FLOW","team":"","skin":"","score":"","ping":"235","time":""},{"name":"Takadox","team":"","skin":"","score":"","ping":"133","time":""},{"name":"[S.W.A.T.]Murdoc[UAD]","team":"","skin":"","score":"","ping":"251","time":""},{"name":"[GROM]~Felipe~|GSG|","team":"","skin":"","score":"","ping":"101","time":""},{"name":"||~CamiloFG~||","team":"","skin":"","score":"","ping":"172","time":""},{"name":"CH|Leonidaz18","team":"","skin":"","score":"","ping":"175","time":""},{"name":"T30xD","team":"","skin":"","score":"","ping":"390","time":""},{"name":"LO|Demoniak_","team":"","skin":"","score":"","ping":"188","time":""},{"name":"[F.A.]MrTomato","team":"","skin":"","score":"","ping":"168","time":""},{"name":"[Ch]Pipex542","team":"","skin":"","score":"","ping":"132","time":""},{"name":"DarkRadu","team":"","skin":"","score":"","ping":"143","time":""},{"name":"Pedro_666","team":"","skin":"","score":"","ping":"152","time":""},{"name":"[RG]NagusFlow","team":"","skin":"","score":"","ping":"182","time":""},{"name":"[F.A.]CaLeX9[AE](VeRa)","team":"","skin":"","score":"","ping":"182","time":""},{"name":"|LO|Salvador","team":"","skin":"","score":"","ping":"86","time":""},{"name":"|RG|Hollman","team":"","skin":"","score":"","ping":"80","time":""},{"name":"DreamerBoy","team":"","skin":"","score":"","ping":"258","time":""},{"name":"Darkus","team":"","skin":"","score":"","ping":"98","time":""},{"name":"[GROM]Francoo","team":"","skin":"","score":"","ping":"271","time":""},{"name":"Daniel","team":"","skin":"","score":"","ping":"150","time":""},{"name":"|THC|BaianoBR","team":"","skin":"","score":"","ping":"167","time":""},{"name":"[RF]-Enzo-1998-","team":"","skin":"","score":"","ping":"167","time":""},{"name":"Lushe","team":"","skin":"","score":"","ping":"153","time":""},{"name":"juancarlithos","team":"","skin":"","score":"","ping":"235","time":""},{"name":"[LO]victor.a.","team":"","skin":"","score":"","ping":"136","time":""},{"name":"|G2H|Angeliux43v3er","team":"","skin":"","score":"","ping":"109","time":""},{"name":"[A.T]Wolf","team":"","skin":"","score":"","ping":"108","time":""},{"name":"|Ch|<<[P]et>>","team":"","skin":"","score":"","ping":"137","time":""},{"name":"[F.A.]xLuisV2[UAD]","team":"","skin":"","score":"","ping":"80","time":""},{"name":"|CQC|stun.fail","team":"","skin":"","score":"","ping":"74","time":""},{"name":"OS|Mr.Smithers~","team":"","skin":"","score":"","ping":"320","time":""},{"name":"|G2H|R3L4X","team":"","skin":"","score":"","ping":"196","time":""},{"name":"[F.B.I]Ricardo_Vera","team":"","skin":"","score":"","ping":"150","time":""},{"name":"ScandalousRam77","team":"","skin":"","score":"","ping":"192","time":""},{"name":"Facebookero","team":"","skin":"","score":"","ping":"180","time":""},{"name":"~\/\/Reconnect\\\\~","team":"","skin":"","score":"","ping":"144","time":""},{"name":"|G2H|>Tupac<","team":"","skin":"","score":"","ping":"158","time":""},{"name":"[F.A.]MrBlooDyOtaku","team":"","skin":"","score":"","ping":"129","time":""},{"name":"Dark|Punisher[HL]","team":"","skin":"","score":"","ping":"80","time":""},{"name":".d:Oliver:b.","team":"","skin":"","score":"","ping":"175","time":""},{"name":"[T.E]Wolk>>>XV<<<","team":"","skin":"","score":"","ping":"153","time":""},{"name":"merari94543","team":"","skin":"","score":"","ping":"118","time":""},{"name":"PepeBagoneta","team":"","skin":"","score":"","ping":"181","time":""},{"name":"DarkMuhin[SB]","team":"","skin":"","score":"","ping":"231","time":""},{"name":"[E](CIA)(PU)Vera(Alex)","team":"","skin":"","score":"","ping":"166","time":""},{"name":"[G2H]-[[Wiz.NEGriFA]]","team":"","skin":"","score":"","ping":"1038","time":""},{"name":"[F.A.]Market","team":"","skin":"","score":"","ping":"473","time":""},{"name":"B$Z-Asilo.3.8|D.C|","team":"","skin":"","score":"","ping":"114","time":""},{"name":"[XV]Stormy","team":"","skin":"","score":"","ping":"221","time":""},{"name":"UNDERCOVER42","team":"","skin":"","score":"","ping":"245","time":""},{"name":"[S.W.A.T.]WarDarkGT|A|","team":"","skin":"","score":"","ping":"136","time":""},{"name":"DarkGisometro","team":"","skin":"","score":"","ping":"166","time":""},{"name":"[CW]Peluca64346","team":"","skin":"","score":"","ping":"172","time":""},{"name":"[F.B.I]Hardwell","team":"","skin":"","score":"","ping":"144","time":""},{"name":"[XV]sr.gato","team":"","skin":"","score":"","ping":"154","time":""},{"name":"DiegoSape","team":"","skin":"","score":"","ping":"183","time":""},{"name":"CQC|Mata-Ratas|","team":"","skin":"","score":"","ping":"76","time":""},{"name":"|N|LifeStealer","team":"","skin":"","score":"","ping":"147","time":""},{"name":"|CQC|TonyRasta","team":"","skin":"","score":"","ping":"112","time":""},{"name":"|XV|NiggaWhat|DLR|","team":"","skin":"","score":"","ping":"48","time":""},{"name":"DarkTrevelyan006","team":"","skin":"","score":"","ping":"172","time":""},{"name":"[F.A.]Sr.Juan","team":"","skin":"","score":"","ping":"220","time":""},{"name":"|Bs|hitman","team":"","skin":"","score":"","ping":"196","time":""},{"name":"lRFlPapiarca-lDLRl","team":"","skin":"","score":"","ping":"78","time":""},{"name":"A.QCQ||El-Comisario||","team":"","skin":"","score":"","ping":"170","time":""},{"name":"BEKOWSKY","team":"","skin":"","score":"","ping":"475","time":""},{"name":"|Royal|Tabasquenio~","team":"","skin":"","score":"","ping":"112","time":""},{"name":"CH|A.Dark|MR.Jeff","team":"","skin":"","score":"","ping":"109","time":""},{"name":"E.T.E.R[~Tempo~]","team":"","skin":"","score":"","ping":"192","time":""},{"name":"Dark|Monobeer~","team":"","skin":"","score":"","ping":"122","time":""},{"name":"[SX][Ch][Juancho][CM]","team":"","skin":"","score":"","ping":"87","time":""},{"name":"Jhonata","team":"","skin":"","score":"","ping":"206","time":""},{"name":"Sergio_17","team":"","skin":"","score":"","ping":"254","time":""},{"name":".:RG:.Rukia","team":"","skin":"","score":"","ping":"95","time":""},{"name":"A.CQC|ASESINO|","team":"","skin":"","score":"","ping":"119","time":""},{"name":"AletsLuro","team":"","skin":"","score":"","ping":"84","time":""},{"name":"[]-[N4CH0]","team":"","skin":"","score":"","ping":"166","time":""},{"name":"Derezz","team":"","skin":"","score":"","ping":"164","time":""},{"name":"|VanSs","team":"","skin":"","score":"","ping":"185","time":""},{"name":"|~|K|iriTo|~|","team":"","skin":"","score":"","ping":"126","time":""},{"name":"[Ch][SrMaku][CM]","team":"","skin":"","score":"","ping":"98","time":""},{"name":"[S.W.A.T.]XbaxS","team":"","skin":"","score":"","ping":"160","time":""},{"name":"mortalkendo","team":"","skin":"","score":"","ping":"200","time":""},{"name":"[A.T]MorirConHonor","team":"","skin":"","score":"","ping":"246","time":""},{"name":"[CQC]Street|Schultz<~","team":"","skin":"","score":"","ping":"143","time":""},{"name":"KoMaNdO","team":"","skin":"","score":"","ping":"166","time":""},{"name":"Dark.:Pitufo:.","team":"","skin":"","score":"","ping":"74","time":""},{"name":"Ulquiorra","team":"","skin":"","score":"","ping":"181","time":""},{"name":"DUZTIK","team":"","skin":"","score":"","ping":"60","time":""},{"name":"benhooodlum","team":"","skin":"","score":"","ping":"167","time":""},{"name":"N|~[V]0D[K]4~|Sk","team":"","skin":"","score":"","ping":"224","time":""},{"name":"Deluxe","team":"","skin":"","score":"","ping":"172","time":""},{"name":"[E.T.E.R.]Cobani","team":"","skin":"","score":"","ping":"174","time":""},{"name":">XV|~|Castillo|~|<","team":"","skin":"","score":"","ping":"132","time":""},{"name":"Emer","team":"","skin":"","score":"","ping":"203","time":""},{"name":"[S.W.A.T.]Soldier|A|","team":"","skin":"","score":"","ping":"192","time":""},{"name":"BrunooCortees","team":"","skin":"","score":"","ping":"161","time":""},{"name":"TicciToby","team":"","skin":"","score":"","ping":"224","time":""},{"name":"Nazarena","team":"","skin":"","score":"","ping":"115","time":""},{"name":"YeowlSamsung","team":"","skin":"","score":"","ping":"108","time":""},{"name":"[SX]DarkGuillermo","team":"","skin":"","score":"","ping":"154","time":""},{"name":"elias159","team":"","skin":"","score":"","ping":"568","time":""},{"name":"[CQC]RamTs","team":"","skin":"","score":"","ping":"124","time":""},{"name":"[S.W.A.T.]LockeD|B|","team":"","skin":"","score":"","ping":"358","time":""},{"name":"Strix","team":"","skin":"","score":"","ping":"245","time":""},{"name":"Arkanic","team":"","skin":"","score":"","ping":"94","time":""},{"name":">>-[XV]-[P][!7@ChU]-<<","team":"","skin":"","score":"","ping":"174","time":""},{"name":"Dejota","team":"","skin":"","score":"","ping":"196","time":""},{"name":"[E.T.E.R]Adan","team":"","skin":"","score":"","ping":"160","time":""},{"name":"[F.B.I]shoxieJESUS","team":"","skin":"","score":"","ping":"180","time":""},{"name":"onerom","team":"","skin":"","score":"","ping":"202","time":""},{"name":"BELA","team":"","skin":"","score":"","ping":"154","time":""},{"name":"Cristina|G2H|","team":"","skin":"","score":"","ping":"314","time":""},{"name":"viscosho","team":"","skin":"","score":"","ping":"116","time":""},{"name":"~Wang~","team":"","skin":"","score":"","ping":"154","time":""},{"name":"[CH]RaggedEel11","team":"","skin":"","score":"","ping":"130","time":""},{"name":"[F.A.]Sr.Viejete","team":"","skin":"","score":"","ping":"88","time":""},{"name":"~Disconnect~","team":"","skin":"","score":"","ping":"129","time":""},{"name":"[F.A.]MrLuis","team":"","skin":"","score":"","ping":"105","time":""},{"name":"DarkPucho~!","team":"","skin":"","score":"","ping":"157","time":""},{"name":"ChufiBerta","team":"","skin":"","score":"","ping":"224","time":""},{"name":"[GROM]~BlueMoon[GSG]","team":"","skin":"","score":"","ping":"162","time":""},{"name":"FloweryTissue90","team":"","skin":"","score":"","ping":"64","time":""},{"name":"|~Spryte~|","team":"","skin":"","score":"","ping":"136","time":""},{"name":"A.Dark|Mr.PhyscoGL","team":"","skin":"","score":"","ping":"437","time":""},{"name":"Dark~[P]ikachu~|SB|","team":"","skin":"","score":"","ping":"259","time":""},{"name":"Robocop","team":"","skin":"","score":"","ping":"157","time":""},{"name":"Ayudo|D|Olivo1|DLR!","team":"","skin":"","score":"","ping":"119","time":""},{"name":"fabiloso","team":"","skin":"","score":"","ping":"154","time":""},{"name":"SEM|Eazy-E|::XV","team":"","skin":"","score":"","ping":"231","time":""},{"name":"Fray~","team":"","skin":"","score":"","ping":"123","time":""},{"name":"DarkAsh","team":"","skin":"","score":"","ping":"238","time":""},{"name":"YESENIA13","team":"","skin":"","score":"","ping":"116","time":""},{"name":"alexboy","team":"","skin":"","score":"","ping":"87","time":""},{"name":"[E.T.E.R.]Stealthy","team":"","skin":"","score":"","ping":"190","time":""},{"name":"Tomorrowland","team":"","skin":"","score":"","ping":"150","time":""},{"name":"FidoOo","team":"","skin":"","score":"","ping":"105","time":""},{"name":"Juan","team":"","skin":"","score":"","ping":"220","time":""},{"name":"SOYELPOPO","team":"","skin":"","score":"","ping":"62","time":""},{"name":"alan15084","team":"","skin":"","score":"","ping":"98","time":""},{"name":"[F.A.]Moriremoscnhonor","team":"","skin":"","score":"","ping":"85","time":""},{"name":"[CQC]->Cronnos-|","team":"","skin":"","score":"","ping":"327","time":""},{"name":"Freakshow","team":"","skin":"","score":"","ping":"70","time":""},{"name":"|CQC|~Cris~>","team":"","skin":"","score":"","ping":"220","time":""},{"name":"Dominic","team":"","skin":"","score":"","ping":"119","time":""},{"name":"GuilleFlow|RG|","team":"","skin":"","score":"","ping":"154","time":""},{"name":"Dark~NaNoSnaKe~Pino","team":"","skin":"","score":"","ping":"140","time":""},{"name":"|G2H|Infinity-[HM]","team":"","skin":"","score":"","ping":"140","time":""},{"name":"~G2H~Atrox:3","team":"","skin":"","score":"","ping":"169","time":""},{"name":"|N|-XxFeDhexX","team":"","skin":"","score":"","ping":"72","time":""},{"name":"DarkPajaroSalvaje","team":"","skin":"","score":"","ping":"230","time":""},{"name":"DemonicChamois35","team":"","skin":"","score":"","ping":"70","time":""},{"name":"[A.T]~Toreto~","team":"","skin":"","score":"","ping":"84","time":""},{"name":"Caquitafresca","team":"","skin":"","score":"","ping":"109","time":""},{"name":"aloud77","team":"","skin":"","score":"","ping":"164","time":""},{"name":"DieGo","team":"","skin":"","score":"","ping":"168","time":""},{"name":"Fernando","team":"","skin":"","score":"","ping":"246","time":""},{"name":"javiera:3","team":"","skin":"","score":"","ping":"167","time":""},{"name":"CQC||GhostMen||","team":"","skin":"","score":"","ping":"70","time":""},{"name":"[I.L.V]heProx|C|[DK].","team":"","skin":"","score":"","ping":"211","time":""},{"name":"[A.T]Dante-GDE|D|[UAD]","team":"","skin":"","score":"","ping":"164","time":""},{"name":"|CQC|[G]onzalo~>>","team":"","skin":"","score":"","ping":"165","time":""},{"name":"Warlock","team":"","skin":"","score":"","ping":"257","time":""},{"name":"julitolocura","team":"","skin":"","score":"","ping":"238","time":""},{"name":"Rodryyy!!","team":"","skin":"","score":"","ping":"138","time":""},{"name":"CH~Saelmus~CM","team":"","skin":"","score":"","ping":"188","time":""},{"name":"RIVALDO","team":"","skin":"","score":"","ping":"147","time":""},{"name":"Nazarena>_<3","team":"","skin":"","score":"","ping":"165","time":""},{"name":"Smith","team":"","skin":"","score":"","ping":"158","time":""},{"name":"FTW!Brayan420","team":"","skin":"","score":"","ping":"213","time":""},{"name":"|?!|Lord|Mohinx|","team":"","skin":"","score":"","ping":"166","time":""},{"name":"Brunspart","team":"","skin":"","score":"","ping":"107","time":""},{"name":"[DC]jeysonpro","team":"","skin":"","score":"","ping":"514","time":""},{"name":"[CQC]Herobrine2002","team":"","skin":"","score":"","ping":"114","time":false}],"port":"22003","servername":"SX - CnR\/DM\/RP [proyectosx.net] [Español] [Trabajos|Gangs|Turf|Casas|Criminales vs Policias]","version":"1.4"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Mta/2_response.txt b/gameq/tests/Protocols/Providers/Mta/2_response.txt new file mode 100644 index 0000000..e51e663 --- /dev/null +++ b/gameq/tests/Protocols/Providers/Mta/2_response.txt @@ -0,0 +1,5 @@ +EYE1mta22003.|| OwlGaming Roleplay || www.owlgaming.net || Roleplay Los Santos1.401221000Script Version4.3.6.5Author(OwlGaming - MTA Server Development TeamWebsitewww.owlgaming.net?Douglas_Schrader44260?Elroy_Robinson206128? Jonah_Russo252147?Emily_O'Leary10920?Michelle_Giotto157138? Dwayne_Smith286142?Edward_Carter393102?Christian_Garrett2098?Elizabeth_Starks981129?Chanelle_Baker433105?Stephan_Ocean89104?Nicholas_Krajewski9178? +Angel_Mae5494? Philip_Gomez367112?Daevon_Montell203108?Michael_Hopkins135166?Edward_Dabson726216?Derrick_James76102?Steven_Fletcher1784?Owl.Player.3758210? Brad_Collins198167? Norman_Yung272122?James_Douglas239123?Albert_Barney153138?Joel_Williams184158?Mona_McLaughlin2115138?Justin_Almeida1298130? Jason_Gomez137112? Pete_Molina97108?Joshua_Martinez10550?Fabrizio_Gallardo146122?Jane_Matthews541108? Tim_Harrison356198?Dimitri_Kristoff849132? Edward_Savko66154?Tyler_Barnwood2990? +Emma_Crow27110?Klaus_Reinbacher127104?Elizabeth_Stewart0188?Borja_Vinagre24146?Desmond_Bryce14184?Marko_Vidovic1133150?Albert_Fincher7670?Kenzie_McLaughlin852158? Frank_Milano245126?Phil_Anderson68938?Owl.Player.6347109127?Samuel_Johnson94471?Keron_Reynolds14128? John_Payne51124?Sebastian_Bryant1698? Nina_Ashmore16138? Taylor_King105174?Maxwell_Zobert276288? Paul_Karter167148?Sebastian_Kobayashi632?Heather_Russel107140? Angus_Moore30126?Tyrel_Williams798163? Paul_Clifton103112?Clara_Wayland6384?Kenneth_Akiyama105126?Thomas_Murdock114248?Jackson_Pearce1142? +Nina_Grey23333?Nicholas_Krauss9422?Yamato_Oshiro45106?Michael_Navarro118140?Borat_Sanjeev2694?Owl.Player.84098136?Antonio_Johnson249137?Lance_MacTavish23150?Yakamura_Nagashaki258112? James_Davies181143?James_Vandross20792?Theodore_Caballero238124? Jamal_Clay14142?Javier_de_la_Serna1119?Davide_Nardovino15138?Shawn_Henderson36124?Carl_Sheffman039?Santiago_Mendoza451101? +Ray_Flynn189124?Francisco_Carbajal73144? Sarah_Hill3134? Martin_Leon713134?Liliana_Medina64111?Alfred_Garrett7136?Mark_Valentino1542332?Owl.Player.961010366? Zack_Quint82126?Owl.Player.0919166? Hank_Clint9202?Alexander_Winston426122?William_Martinez6167? Rob_Bradley533100?Clement_Knight49298? Manjot_Singh67594?Michael_Coleman393138?Owl.Player.3857127? Edison_Best461102?Owl.Player.724628?Owl.Player.05491695?Owl.Player.4619112?Owl.Player.281472?Owl.Player.9095126?Owl.Player.7020128?Owl.Player.3355152?Owl.Player.6659142?Owl.Player.4375108?Owl.Player.7774112?Owl.Player.6188133?Owl.Player.0667104?Owl.Player.2837108?Owl.Player.5376108?Owl.Player.7312112?Owl.Player.2398114?Owl.Player.5726140?Owl.Player.5658197?Owl.Player.993262?Owl.Player.1679167?Owl.Player.7526117 \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Mta/2_result.json b/gameq/tests/Protocols/Providers/Mta/2_result.json new file mode 100644 index 0000000..ab5518b --- /dev/null +++ b/gameq/tests/Protocols/Providers/Mta/2_result.json @@ -0,0 +1 @@ +{"167.114.119.145:22003":{"Author":"OwlGaming - MTA Server Development Team","Script Version":"4.3.6.5","Website":"www.owlgaming.net","dedicated":1,"gamename":"mta","gametype":"Roleplay","gq_address":"167.114.119.145","gq_joinlink":"mtasa:\/\/167.114.119.145:22003\/","gq_name":"Multi Theft Auto","gq_online":true,"gq_port_client":22003,"gq_port_query":22126,"gq_protocol":"ase","gq_transport":"udp","gq_type":"mta","map":"Los Santos","max_players":"1000","num_players":"122","password":"0","players":[{"name":"Douglas_Schrader","team":"","skin":"","score":"442","ping":"60","time":""},{"name":"Elroy_Robinson","team":"","skin":"","score":"206","ping":"128","time":""},{"name":"Jonah_Russo","team":"","skin":"","score":"252","ping":"147","time":""},{"name":"Emily_O'Leary","team":"","skin":"","score":"109","ping":"20","time":""},{"name":"Michelle_Giotto","team":"","skin":"","score":"157","ping":"138","time":""},{"name":"Dwayne_Smith","team":"","skin":"","score":"286","ping":"142","time":""},{"name":"Edward_Carter","team":"","skin":"","score":"393","ping":"102","time":""},{"name":"Christian_Garrett","team":"","skin":"","score":"20","ping":"98","time":""},{"name":"Elizabeth_Starks","team":"","skin":"","score":"981","ping":"129","time":""},{"name":"Chanelle_Baker","team":"","skin":"","score":"433","ping":"105","time":""},{"name":"Stephan_Ocean","team":"","skin":"","score":"89","ping":"104","time":""},{"name":"Nicholas_Krajewski","team":"","skin":"","score":"9","ping":"178","time":""},{"name":"Angel_Mae","team":"","skin":"","score":"54","ping":"94","time":""},{"name":"Philip_Gomez","team":"","skin":"","score":"367","ping":"112","time":""},{"name":"Daevon_Montell","team":"","skin":"","score":"203","ping":"108","time":""},{"name":"Michael_Hopkins","team":"","skin":"","score":"135","ping":"166","time":""},{"name":"Edward_Dabson","team":"","skin":"","score":"726","ping":"216","time":""},{"name":"Derrick_James","team":"","skin":"","score":"76","ping":"102","time":""},{"name":"Steven_Fletcher","team":"","skin":"","score":"17","ping":"84","time":""},{"name":"Owl.Player.3758","team":"","skin":"","score":"","ping":"210","time":""},{"name":"Brad_Collins","team":"","skin":"","score":"198","ping":"167","time":""},{"name":"Norman_Yung","team":"","skin":"","score":"272","ping":"122","time":""},{"name":"James_Douglas","team":"","skin":"","score":"239","ping":"123","time":""},{"name":"Albert_Barney","team":"","skin":"","score":"153","ping":"138","time":""},{"name":"Joel_Williams","team":"","skin":"","score":"184","ping":"158","time":""},{"name":"Mona_McLaughlin","team":"","skin":"","score":"2115","ping":"138","time":""},{"name":"Justin_Almeida","team":"","skin":"","score":"1298","ping":"130","time":""},{"name":"Jason_Gomez","team":"","skin":"","score":"137","ping":"112","time":""},{"name":"Pete_Molina","team":"","skin":"","score":"97","ping":"108","time":""},{"name":"Joshua_Martinez","team":"","skin":"","score":"105","ping":"50","time":""},{"name":"Fabrizio_Gallardo","team":"","skin":"","score":"146","ping":"122","time":""},{"name":"Jane_Matthews","team":"","skin":"","score":"541","ping":"108","time":""},{"name":"Tim_Harrison","team":"","skin":"","score":"356","ping":"198","time":""},{"name":"Dimitri_Kristoff","team":"","skin":"","score":"849","ping":"132","time":""},{"name":"Edward_Savko","team":"","skin":"","score":"66","ping":"154","time":""},{"name":"Tyler_Barnwood","team":"","skin":"","score":"29","ping":"90","time":""},{"name":"Emma_Crow","team":"","skin":"","score":"27","ping":"110","time":""},{"name":"Klaus_Reinbacher","team":"","skin":"","score":"127","ping":"104","time":""},{"name":"Elizabeth_Stewart","team":"","skin":"","score":"0","ping":"188","time":""},{"name":"Borja_Vinagre","team":"","skin":"","score":"24","ping":"146","time":""},{"name":"Desmond_Bryce","team":"","skin":"","score":"141","ping":"84","time":""},{"name":"Marko_Vidovic","team":"","skin":"","score":"1133","ping":"150","time":""},{"name":"Albert_Fincher","team":"","skin":"","score":"76","ping":"70","time":""},{"name":"Kenzie_McLaughlin","team":"","skin":"","score":"852","ping":"158","time":""},{"name":"Frank_Milano","team":"","skin":"","score":"245","ping":"126","time":""},{"name":"Phil_Anderson","team":"","skin":"","score":"689","ping":"38","time":""},{"name":"Owl.Player.6347","team":"","skin":"","score":"109","ping":"127","time":""},{"name":"Samuel_Johnson","team":"","skin":"","score":"944","ping":"71","time":""},{"name":"Keron_Reynolds","team":"","skin":"","score":"14","ping":"128","time":""},{"name":"John_Payne","team":"","skin":"","score":"51","ping":"124","time":""},{"name":"Sebastian_Bryant","team":"","skin":"","score":"16","ping":"98","time":""},{"name":"Nina_Ashmore","team":"","skin":"","score":"16","ping":"138","time":""},{"name":"Taylor_King","team":"","skin":"","score":"105","ping":"174","time":""},{"name":"Maxwell_Zobert","team":"","skin":"","score":"276","ping":"288","time":""},{"name":"Paul_Karter","team":"","skin":"","score":"167","ping":"148","time":""},{"name":"Sebastian_Kobayashi","team":"","skin":"","score":"6","ping":"32","time":""},{"name":"Heather_Russel","team":"","skin":"","score":"107","ping":"140","time":""},{"name":"Angus_Moore","team":"","skin":"","score":"30","ping":"126","time":""},{"name":"Tyrel_Williams","team":"","skin":"","score":"798","ping":"163","time":""},{"name":"Paul_Clifton","team":"","skin":"","score":"103","ping":"112","time":""},{"name":"Clara_Wayland","team":"","skin":"","score":"63","ping":"84","time":""},{"name":"Kenneth_Akiyama","team":"","skin":"","score":"105","ping":"126","time":""},{"name":"Thomas_Murdock","team":"","skin":"","score":"114","ping":"248","time":""},{"name":"Jackson_Pearce","team":"","skin":"","score":"1","ping":"142","time":""},{"name":"Nina_Grey","team":"","skin":"","score":"23","ping":"333","time":""},{"name":"Nicholas_Krauss","team":"","skin":"","score":"94","ping":"22","time":""},{"name":"Yamato_Oshiro","team":"","skin":"","score":"45","ping":"106","time":""},{"name":"Michael_Navarro","team":"","skin":"","score":"118","ping":"140","time":""},{"name":"Borat_Sanjeev","team":"","skin":"","score":"26","ping":"94","time":""},{"name":"Owl.Player.8409","team":"","skin":"","score":"8","ping":"136","time":""},{"name":"Antonio_Johnson","team":"","skin":"","score":"249","ping":"137","time":""},{"name":"Lance_MacTavish","team":"","skin":"","score":"23","ping":"150","time":""},{"name":"Yakamura_Nagashaki","team":"","skin":"","score":"258","ping":"112","time":""},{"name":"James_Davies","team":"","skin":"","score":"181","ping":"143","time":""},{"name":"James_Vandross","team":"","skin":"","score":"207","ping":"92","time":""},{"name":"Theodore_Caballero","team":"","skin":"","score":"238","ping":"124","time":""},{"name":"Jamal_Clay","team":"","skin":"","score":"14","ping":"142","time":""},{"name":"Javier_de_la_Serna","team":"","skin":"","score":"1","ping":"119","time":""},{"name":"Davide_Nardovino","team":"","skin":"","score":"15","ping":"138","time":""},{"name":"Shawn_Henderson","team":"","skin":"","score":"36","ping":"124","time":""},{"name":"Carl_Sheffman","team":"","skin":"","score":"0","ping":"39","time":""},{"name":"Santiago_Mendoza","team":"","skin":"","score":"451","ping":"101","time":""},{"name":"Ray_Flynn","team":"","skin":"","score":"189","ping":"124","time":""},{"name":"Francisco_Carbajal","team":"","skin":"","score":"73","ping":"144","time":""},{"name":"Sarah_Hill","team":"","skin":"","score":"3","ping":"134","time":""},{"name":"Martin_Leon","team":"","skin":"","score":"713","ping":"134","time":""},{"name":"Liliana_Medina","team":"","skin":"","score":"64","ping":"111","time":""},{"name":"Alfred_Garrett","team":"","skin":"","score":"7","ping":"136","time":""},{"name":"Mark_Valentino","team":"","skin":"","score":"154","ping":"2332","time":""},{"name":"Owl.Player.9610","team":"","skin":"","score":"103","ping":"66","time":""},{"name":"Zack_Quint","team":"","skin":"","score":"82","ping":"126","time":""},{"name":"Owl.Player.0919","team":"","skin":"","score":"","ping":"166","time":""},{"name":"Hank_Clint","team":"","skin":"","score":"9","ping":"202","time":""},{"name":"Alexander_Winston","team":"","skin":"","score":"426","ping":"122","time":""},{"name":"William_Martinez","team":"","skin":"","score":"6","ping":"167","time":""},{"name":"Rob_Bradley","team":"","skin":"","score":"533","ping":"100","time":""},{"name":"Clement_Knight","team":"","skin":"","score":"492","ping":"98","time":""},{"name":"Manjot_Singh","team":"","skin":"","score":"675","ping":"94","time":""},{"name":"Michael_Coleman","team":"","skin":"","score":"393","ping":"138","time":""},{"name":"Owl.Player.3857","team":"","skin":"","score":"","ping":"127","time":""},{"name":"Edison_Best","team":"","skin":"","score":"461","ping":"102","time":""},{"name":"Owl.Player.7246","team":"","skin":"","score":"","ping":"28","time":""},{"name":"Owl.Player.0549","team":"","skin":"","score":"","ping":"1695","time":""},{"name":"Owl.Player.4619","team":"","skin":"","score":"","ping":"112","time":""},{"name":"Owl.Player.2814","team":"","skin":"","score":"","ping":"72","time":""},{"name":"Owl.Player.9095","team":"","skin":"","score":"","ping":"126","time":""},{"name":"Owl.Player.7020","team":"","skin":"","score":"","ping":"128","time":""},{"name":"Owl.Player.3355","team":"","skin":"","score":"","ping":"152","time":""},{"name":"Owl.Player.6659","team":"","skin":"","score":"","ping":"142","time":""},{"name":"Owl.Player.4375","team":"","skin":"","score":"","ping":"108","time":""},{"name":"Owl.Player.7774","team":"","skin":"","score":"","ping":"112","time":""},{"name":"Owl.Player.6188","team":"","skin":"","score":"","ping":"133","time":""},{"name":"Owl.Player.0667","team":"","skin":"","score":"","ping":"104","time":""},{"name":"Owl.Player.2837","team":"","skin":"","score":"","ping":"108","time":""},{"name":"Owl.Player.5376","team":"","skin":"","score":"","ping":"108","time":""},{"name":"Owl.Player.7312","team":"","skin":"","score":"","ping":"112","time":""},{"name":"Owl.Player.2398","team":"","skin":"","score":"","ping":"114","time":""},{"name":"Owl.Player.5726","team":"","skin":"","score":"","ping":"140","time":""},{"name":"Owl.Player.5658","team":"","skin":"","score":"","ping":"197","time":""},{"name":"Owl.Player.9932","team":"","skin":"","score":"","ping":"62","time":""},{"name":"Owl.Player.1679","team":"","skin":"","score":"","ping":"167","time":""},{"name":"Owl.Player.7526","team":"","skin":"","score":"","ping":"117","time":false}],"port":"22003","servername":"|| OwlGaming Roleplay || www.owlgaming.net ||","version":"1.4"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Mumble/1_response.txt b/gameq/tests/Protocols/Providers/Mumble/1_response.txt new file mode 100644 index 0000000..5ed0bc2 --- /dev/null +++ b/gameq/tests/Protocols/Providers/Mumble/1_response.txt @@ -0,0 +1,3371 @@ +{ + "id": 1, + "name": "Skyttegrav & SweClockers Mumble", + "x_connecturl": "mumble://mumble.skyttegrav.se/?version=1.2.0", + "x_gtmurmur_connectport": "64738", + "x_gtmurmur_max_users": "250", + "x_gtmurmur_server_version": "1.2.8", + "x_gtmurmur_doclen": 224063, + "root": { + "channels": [ + { + "channels": [], + "description": "", + "id": 1, + "name": "AFK", + "parent": 0, + "position": 0, + "temporary": false, + "users": [ + { + "bytespersec": 0, + "channel": 1, + "comment": "", + "context": "", + "deaf": false, + "identity": "", + "idlesecs": 23441, + "mute": false, + "name": "pyootr", + "onlinesecs": 23441, + "os": "Win", + "osversion": "6.1.7601.1", + "release": "1.2.5", + "selfDeaf": true, + "selfMute": true, + "session": 96, + "suppress": true, + "tcponly": false, + "userid": 66, + "version": 66053, + "udpPing": 51.19, + "tcpPing": 62.56 + } +, + { + "bytespersec": 0, + "channel": 1, + "comment": "Serveransvarig & Admin f\u00f6r Skyttegrav.se/Sweclockers.com spelservrar. \n", + "context": "", + "deaf": false, + "identity": "", + "idlesecs": 28260, + "mute": false, + "name": "[SG-SUP]Gix", + "onlinesecs": 28289, + "os": "X11", + "osversion": "Linux Mint 17 Qiana", + "release": "1.2.8-1~ppa1~trusty1", + "selfDeaf": false, + "selfMute": false, + "session": 124, + "suppress": true, + "tcponly": false, + "userid": 47, + "version": 66056, + "udpPing": 29.20, + "tcpPing": 28.94 + } +, + { + "bytespersec": 0, + "channel": 1, + "comment": "JAG TROR DIG URKEL!\n


", + "context": "", + "deaf": false, + "identity": "", + "idlesecs": 21756, + "mute": false, + "name": "Eyem-_-", + "onlinesecs": 23981, + "os": "Win", + "osversion": "6.1.7601.1", + "release": "1.2.4", + "selfDeaf": false, + "selfMute": false, + "session": 176, + "suppress": true, + "tcponly": false, + "userid": 1001, + "version": 66052, + "udpPing": 17.31, + "tcpPing": 20.12 + } +, + { + "bytespersec": 0, + "channel": 1, + "comment": "", + "context": "", + "deaf": false, + "identity": "", + "idlesecs": 855, + "mute": false, + "name": "[SG-HA]Relemy", + "onlinesecs": 28262, + "os": "Win", + "osversion": "6.2.9200.1", + "release": "1.2.8", + "selfDeaf": true, + "selfMute": true, + "session": 232, + "suppress": true, + "tcponly": false, + "userid": 1926, + "version": 66056, + "udpPing": 37.94, + "tcpPing": 42.07 + } +, + { + "bytespersec": 0, + "channel": 1, + "comment": "", + "context": "", + "deaf": false, + "identity": "", + "idlesecs": 27997, + "mute": false, + "name": "TheLikus", + "onlinesecs": 28143, + "os": "Win", + "osversion": "6.1.7601.1", + "release": "1.2.8", + "selfDeaf": false, + "selfMute": false, + "session": 269, + "suppress": true, + "tcponly": false, + "userid": 4120, + "version": 66056, + "udpPing": 11.01, + "tcpPing": 13.62 + } +, + { + "bytespersec": 0, + "channel": 1, + "comment": "EX VERITAS ET VIGILANTIA VICTORIA", + "context": "", + "deaf": false, + "identity": "", + "idlesecs": 857, + "mute": false, + "name": "[SG-SUP]Azlan1", + "onlinesecs": 24386, + "os": "Win", + "osversion": "6.1.7601.1", + "release": "1.2.8", + "selfDeaf": false, + "selfMute": false, + "session": 316, + "suppress": true, + "tcponly": true, + "userid": 2296, + "version": 66056, + "udpPing": 53.51, + "tcpPing": 65.31 + } +, + { + "bytespersec": 0, + "channel": 1, + "comment" +|| +: "", + "context": "", + "deaf": false, + "identity": "", + "idlesecs": 28272, + "mute": false, + "name": "Legoo", + "onlinesecs": 28274, + "os": "Win", + "osversion": "6.1.7601.1", + "release": "1.2.5", + "selfDeaf": false, + "selfMute": false, + "session": 473, + "suppress": true, + "tcponly": false, + "userid": 1657, + "version": 66053, + "udpPing": 8.45, + "tcpPing": 23.05 + } + ] + }, + { + "channels": [], + "description": "", + "id": 8, + "name": "Utl\u00e5nade Kanaler", + "parent": 0, + "position": 100, + "temporary": false, + "users": [] + }, + { + "channels": [ + { + "channels": [], + "description": "", + "id": 38, + "name": "Admins", + "parent": 9, + "position": 11, + "temporary": false, + "users": [] + }, + { + "channels": [], + "description": "", + "id": 43, + "name": "Headadmins Corner", + "parent": 9, + "position": 60, + "temporary": false, + "users": [] + }, + { + "channels": [], + "description": "", + "id": 44, + "name": "Supervisors Corner - Polska Riksdagen", + "parent": 9, + "position": 70, + "temporary": false, + "users": [] + }, + { + "channels": [ + { + "channels": [], + "description": "", + +|| +"id": 151, + "name": "M\u00f6te", + "parent": 150, + "position": 0, + "temporary": false, + "users": [] + }, + { + "channels": [], + "description": "", + "id": 152, + "name": "Styrelsem\u00f6te", + "parent": 150, + "position": 0, + "temporary": false, + "users": [] + } + ], + "description": "Spelf\u00f6reningen bakom Skyttegrav.se", + "id": 150, + "name": "United Gaming", + "parent": 9, + "position": 0, + "temporary": false, + "users": [] + }, + { + "channels": [ + { + "channels": [], + "description": "", + "id": 188, + "name": "Allm\u00e4n Admin", + "parent": 187, + "position": 0, + "temporary": false, + "users": [] + }, + { + "channels": [], + "description": "", + "id": 189, + "name": "Privat Admin (Endast inbjudan)", + "parent": 187, + "position": 0, + "temporary": false, + "users": [] + } + ], + "description": "Endast F\u00f6r SweClockers.com admins!", + "id": 187, + "name": "Sweclockers", + "parent": 9, + "position": 0, + "temporary": false, + "users": [] + }, + { + "channels": [], + "description": "", + "id": 214, + "name": "Allm\u00e4n Admin (Delad)", + "parent": 9, + "position": 10, + "temporary": false, + "users": [] + } + ], + "description": "Endast F\u00f6r Skyttegrav admins!", + "id": 9, + "name": "Admins Corner (private)", + "parent": 0, + "position": 200, + "temporary": false, + "users": [] + }, + { + "channels": [ + { + "channels": [], + "description": "H\u00e4r kommer v\u00e5ra stream och webtv att s\u00e4ndas! \n

\n

Bes\u00f6k www.swec.tv och avnjut s\u00e4ndningen, vill du deltaga s\u00e5 skicka ett meddelande i mumble till en admin som antingen kan flytta dig eller ge dig l\u00f6senordet. Vi kommer att b\u00e5de casta och spela olika spel l\u00f6pande.

\n

\n

I kanalen g\u00e4ller strikt ljud och informationskontroll, akta er allts\u00e5 f\u00f6r att inte s\u00e4ga f\u00f6r mycket.

", + "id": 358, + "name": "SweC TV Studio (private)", + "parent": 183, + "position": 100, + "temporary": false, + "users": [] + }, + { + "channels": [], + "description": "Vill ni deltaga i SweC TV? \n

\n

S\u00e4tt er i detta rummet s\u00e5 kommer vi att dra in er i cast rummet vid tillf\u00e4lle, ni \u00e4r varmt v\u00e4lkomna att titta p\u00e5 www.swec.tv medan ni v\u00e4ntar!

\n

\n

N\u00e4r ni kommer in i cast kanalen \u00e4r ni automatiskt satta till "mute", vi kommer att \u00e4ndra det n\u00e4r ni kommer in.

\n

\n

\n

", + "id": 402, + "name": "SweC TV lobby (wait for invite to cast room)", + "parent": 183, + "position": 200, + "temporary": false, + "users": [] + }, + { + "channels": [ + { + "channels": [], + "description": "H\u00e4r har ni nyttig information om spelkv\u00e4llarna! \n

SpelClockers Spelkv\u00e4llar

\n

Sweclockers Steam chat grupp

\n

", + "id": 426, + "name": "Allm\u00e4n samlingskanal - Kom hit f\u00f6r r\u00e5d och v\u00e4gledning", + "parent": 421, + "position": 0, + "temporary": false, + "users": [] + }, + { + "channels": [ + { + "channels": [], + "description": "", + "id": 429, + "name": "Grupp 1", + "parent": 427, + "position": 10, + "temporary": false, + "users": [] + }, + { + "channels": [], + "description": "", + "id": 430, + "name": "Grupp 2", + "parent": 427, + "position": 20, + "temporary": false, + "users": [] + }, + { + "channels": [], + "description": "", + "id": 449, + "name": "Grupp 3", + "parent": 427, + "position": 30, + "temporary": false, + "users": [] + }, + { + "channels": [], + "description": "", + "id": 450, + "name": "Grupp 4", + "parent": 427, + "position": 40, + "temporary": false, + "users": [] + }, + { + "channels": [], + "description": "", + "id": 453, + "name": "Rematch och rekryt Lobby", + "parent": 427, + "position": 0, + "temporary": false, + "users": [] + }, + { + "channels": [], + "description": "", + "id": 455, + "name": "Grupp 5", + "parent": 427, + "position": 50, + "temporary": false, + "users": [] + }, + { + "channels": [], + "description": "", + "id": 456, + "name": "Grupp 6", + "parent": 427, + "position": 60, + "temporary": false, + "users": [] + } + ], + "description": "", + "id": 427, + "name": "Reserv #2", + "parent": 421, + "position": 20, + "temporary": false, + "users": [] + }, + { + "channels": [ + { + "channels": [], + "description": "", + "id": 432, + "name": "MechWarrior Online", + "parent": 428, + "position": 10, + "temporary": false, + "users": [ + { + "bytespersec": 0, + "channel": 432, + "comment": "http://www.twitch.tv/tobbbe__", + "context": "", + "deaf": false, + "identity": "", + "idlesecs": 114, + "mute": false, + "name": "[SweC]Tobbbe__", + "onlinesecs": 28273, + "os": "Win", + "osversion": "6.2.9200.1" +|| +, + "release": "1.2.8", + "selfDeaf": false, + "selfMute": false, + "session": 5, + "suppress": false, + "tcponly": false, + "userid": 3769, + "version": 66056, + "udpPing": 21.70, + "tcpPing": 23.08 + } +, + { + "bytespersec": 0, + "channel": 432, + "comment": "


", + "context": "", + "deaf": false, + "identity": "", + "idlesecs": 16, + "mute": false, + "name": "Vilse(SWE)", + "onlinesecs": 15534, + "os": "Win", + "osversion": "6.1.7601.1", + "release": "1.2.8", + "selfDeaf": false, + "selfMute": false, + "session": 110, + "suppress": false, + "tcponly": false, + "userid": 4124, + "version": 66056, + "udpPing": 13.77, + "tcpPing": 16.06 + } +, + { + "bytespersec": 0, + "channel": 432, + "comment": "", + "context": "", + "deaf": false, + "identity": "", + "idlesecs": 54, + "mute": false, + "name": "Th3MadPanda", + "onlinesecs": 28272, + "os": +|| +"Win", + "osversion": "6.1.7601.1", + "release": "1.2.8", + "selfDeaf": false, + "selfMute": false, + "session": 236, + "suppress": false, + "tcponly": false, + "userid": 2099, + "version": 66056, + "udpPing": 8.86, + "tcpPing": 11.80 + } +, + { + "bytespersec": 0, + "channel": 432, + "comment": "", + "context": "", + "deaf": false, + "identity": "", + "idlesecs": 63, + "mute": false, + "name": "Mumin", + "onlinesecs": 8481, + "os": "Win", + "osversion": "6.1.7601.1", + "release": "1.2.8", + "selfDeaf": false, + "selfMute": false, + "session": 306, + "suppress": false, + "tcponly": false, + "userid": 4125, + "version": 66056, + "udpPing": 19.08, + "tcpPing": 22.64 + } +, + { + "bytespersec": 0, + "channel": 432, + "comment": "Greetinx Programs! \n

\n

V\u00e4lkommen till SweClockers och Skyttegravs gemensamma Mumble!

\n

\n

Ni kan fr\u00e5ga mig om administrativa saker p\u00e5 servers eller mumble, jag \u00e4r huvudadmin f\u00f6r SweC g\u00e4nget och dessutom forumledare f\u00f6r SweClockers.com. H\u00e4r \u00e4r reglerna f\u00f6r mumble och SweC forum.

\n

\n

Vi satsar p\u00e5 en trevlig st\u00e4mning online! :)

\n

", + "context": "", + "deaf": false, + "identi +|| +ty": "", + "idlesecs": 1720, + "mute": false, + "name": "[SweC-H]Lan", + "onlinesecs": 28266, + "os": "Win", + "osversion": "6.1.7601.1", + "release": "1.2.5", + "selfDeaf": true, + "selfMute": true, + "session": 353, + "suppress": false, + "tcponly": false, + "userid": 56, + "version": 66053, + "udpPing": 15.76, + "tcpPing": 35.14 + } + ] + }, + { + "channels": [], + "description": "", + "id": 433, + "name": "Grupp 2", + "parent": 428, + "position": 20, + "temporary": false, + "users": [ + { + "bytespersec": 0, + "channel": 433, + "comment": "", + "context": "", + "deaf": false, + "identity": "", + "idlesecs": 110, + "mute": false, + "name": "Gson", + "onlinesecs": 3157, + "os": "Win", + "osversion": "6.2.9200.1", + "release": "1.2.8", + "selfDeaf": false, + "selfMute": false, + "session": 146, + "suppress": false, + "tcponly": false, + "userid": 4123, + "version": 66056, + "udpPing": 52.64, + "tcpP +|| +ing": 58.41 + } +, + { + "bytespersec": 0, + "channel": 433, + "comment": "", + "context": "", + "deaf": false, + "identity": "", + "idlesecs": 113, + "mute": false, + "name": "lampan", + "onlinesecs": 18331, + "os": "Win", + "osversion": "6.2.9200.1", + "release": "1.2.5", + "selfDeaf": false, + "selfMute": false, + "session": 463, + "suppress": false, + "tcponly": false, + "userid": 3404, + "version": 66053, + "udpPing": 13.61, + "tcpPing": 16.75 + } + ] + }, + { + "channels": [], + "description": "", + "id": 434, + "name": "Grupp 3", + "parent": 428, + "position": 30, + "temporary": false, + "users": [] + }, + { + "channels": [], + "description": "", + "id": 443, + "name": "Grupp 4", + "parent": 428, + "position": 40, + "temporary": false, + "users": [] + }, + { + "channels": [], + "description": "", + "id": 444, + "name": "Grupp 5", + "parent": 428, + "position": 50, + "temporary": false, + +|| + "users": [] + }, + { + "channels": [], + "description": "", + "id": 451, + "name": "Samlingsal", + "parent": 428, + "position": 0, + "temporary": false, + "users": [ + { + "bytespersec": 0, + "channel": 451, + "comment": "", + "context": "", + "deaf": false, + "identity": "", + "idlesecs": 146, + "mute": false, + "name": "[SweC-T]Grabbengr\u00e5", + "onlinesecs": 27438, + "os": "Win", + "osversion": "6.2. +|| +9200.1", + "release": "1.2.8", + "selfDeaf": false, + "selfMute": false, + "session": 53, + "suppress": false, + "tcponly": false, + "userid": 1952, + "version": 66056, + "udpPing": 20.40, + "tcpPing": 22.75 + } +, + { + "bytespersec": 0, + "channel": 451, + "comment": "", + "context": "", + "deaf": false, + "identity": "", + "idlesecs": 433, + "mute": false, + "name": "[SweC-H]Kinekin", + "onlinesecs": 28269, + "os": "Win", + "osversion": "6.2.9200.1", + "release": "1.2.8", + "selfDeaf": true, + "selfMute": true, + "session": 180, + "suppress": false, + "tcponly": false, + "userid": 2426, + "version": 66056, + "udpPing": 49.77, + "tcpPing": 52.25 + } +, + { + "bytespersec": 7488, + "channel": 451, + "comment": "Det h\u00e4nder att jag spelar spel ibland.\n


\n


\n


\n

", + "context": "", + "deaf": false, + "identity": "", + "idlesecs": 0, + "mute": false, + "name": "[SweC-T]DavidtheDoom", + "onlinesecs": 28221, + "os": "Win", + "osversion": "6.2.9200.1", + "release": "1.2.8", + "selfDeaf": false, + "selfMute": false, + "session": 203, + "suppress": false, + "tcponly": false, + "userid": 3030, + "version": 66056, + "udpPing": 3.95, + "tcpPing": 5.59 + } +, + { + "bytespersec": 0, + +|| + "channel": 451, + "comment": "SweC spelservrar finns ocks\u00e5 p\u00e5 Facebook", + "context": "", + "deaf": false, + "identity": "", + "idlesecs": 26, + "mute": false, + "name": "[SweC-H]Raven_cc", + "onlinesecs": 21049, + "os": "Win", + "osversion": "6.1.7600.1", + "release": "1.2.7", + "selfDeaf": false, + "selfMute": false, + "session": 264, + "suppress": false, + "tcponly": true, + "userid": 78, + "version": 66055, + "udpPing": 19.72, + "tcpPing": 25.83 + } +, + { + "bytespersec": 0, + "channel": 451, + "comment": "", + "context": "", + "deaf": false, + "identity": "", + "idlesecs": 763, + "mute": false, + "name": "OskarWallin", + "onlinesecs": 11404, + "os": "Win", + "osversion": "6.1.7601.1", + "release": "1.2.8", + "selfDeaf": false, + "selfMute": false, + "session": 272, + "suppress": false, + "tcponly": false, + "userid": 3783, + "version": 66056, + "udpPing": 11.9 +|| +6, + "tcpPing": 31.07 + } +, + { + "bytespersec": 3996, + "channel": 451, + "comment": "", + "context": "", + "deaf": false, + "identity": "", + "idlesecs": 0, + "mute": false, + "name": "[SweC-A]Hitman", + "onlinesecs": 28265, + "os": "Win", + "osversion": "6.1.7601.1", + "release": "1.2.8", + "selfDeaf": false, + "selfMute": false, + "session": 485, + "suppress": false, + "tcponly": true, + "userid": 76, + "version": 66056, + "udpPing": 21.36, + "tcpPing": 28.02 + } +, + { + "bytespersec": 0, + "channel": 451, + "comment": "", + "context": "", + "deaf": false, + "identity": "", + "idlesecs": 6, + "mute": false, + "name": "[SG-A]bl0m1", + "onlinesecs": 28242, + "os": "Win", + "osversion": "6.2.9200.1", + "release": "1.2.8", + "selfDeaf": false, + "selfMute": false, + "session": 488, + "suppress": false, + "tcponly": false, + "userid": 3447, + "version": 66056, + "udpPing": 40.23, + "tcpPing": 43.40 + +|| + } + ] + }, + { + "channels": [], + "description": "", + "id": 459, + "name": "Grupp 6", + "parent": 428, + "position": 60, + "temporary": false, + "users": [] + } + ], + "description": "", + "id": 428, + "name": "12h stream med SpelClockers - L\u00f6rdag 28 feb", + "parent": 421, + "position": 10, + "temporary": false, + "users": [] + }, + { + "channels": [ + { + "channels": [], + "description": "", + "id": 437, + "name": "Grupp 1", + "parent": 436, + "position": 10, + "temporary": false, + "users": [] + }, + { + "channels": [], + "description": "", + "id": 438, + "name": "Grupp 2", + "parent": 436, + "position": 20, + "temporary": false, + "users": [] + }, + { + "channels": [], + "description": "", + "id": 439, + "name": "Grupp 3", + "parent": 436, + "position": 30, + "temporary": false, + "users": [] + }, + { + "channels": [], + "description": "", + "id": 440, + "name": "Grupp 4", + "parent": 436, + "position": 40, + +|| + "temporary": false, + "users": [] + }, + { + "channels": [], + "description": "", + "id": 441, + "name": "Grupp 5", + "parent": 436, + "position": 50, + "temporary": false, + "users": [] + }, + { + "channels": [], + "description": "", + "id": 442, + "name": "Grupp 6", + "parent": 436, + "position": 60, + "temporary": false, + "users": [] + }, + { + "channels": [], + "description": "", + "id": 452, + "name": "Rematch och rekryt Lobby", + "parent": 436, + "position": 0, + "temporary": false, + "users": [] + } + ], + "description": "", + "id": 436, + "name": "Reserv #3", + "parent": 421, + "position": 30, + "temporary": false, + "users": [] + } + ], + "description": "Hj\u00e4lp med Mumble? L\u00e4s h\u00e4r -> Mumble tr\u00e5d p\u00e5 SweClockers", + "id": 421, + "name": "Spelkv\u00e4llar", + "parent": 183, + "position": 300, + "temporary": false, + "users": [] + } + ], + "description": "", + "id": 183, + "name": "SweClockers", + "parent": 0, + "position": 10, + "temporary": false, + "users": [] + }, + { + "channels": [ + { + "channels": [ + { + "channels": [], + "description": "", + "id": 10, + "name": "Allm\u00e4nt Snack - Rum #1", + "parent": 2, + "position": 0, + "temporary": false, + "users": [] + }, + { + "channels": [], + "description": "", + "id": 11, + "name": "Allm\u00e4nt Snack - Rum #2", + "parent": 2, + "position": 0, + "temporary": false, + "users": [] + }, + { + "channels": [], + "description": "", + "id": 12, + "name": "Allm\u00e4nt Snack - Rum #3", + "parent": 2, + "position": 0, + "temporary": false, + "users": [] + }, + { + "channels": [], + "description": "", + "id": 13, + "name": "Allm\u00e4nt Snack - Rum #4", + "parent": 2, + "position": 0, + "temporary": false, + "users": [] + }, + { + "channels": [], + "description": "", + "id": 14, + "name": "Utvisningsb\u00e5set", + "parent": 2, + "position": 1000, + "temporary": false, + "users": [] + }, + { + "channels": [], + "description": "", + "id": 84, + "name": "Allm\u00e4nt Sna +|| +ck - Rum #5", + "parent": 2, + "position": 0, + "temporary": false, + "users": [] + }, + { + "channels": [], + "description": "", + "id": 85, + "name": "Allm\u00e4nt Snack - Rum #6", + "parent": 2, + "position": 0, + "temporary": false, + "users": [] + }, + { + "channels": [], + "description": "", + "id": 86, + "name": "Allm\u00e4nt Snack - Vuxenkanal #1", + "parent": 2, + "position": 0, + "temporary": false, + "users": [] + }, + { + "channels": [], + "description": "", + "id": 87, + "name": "Allm\u00e4nt Snack - Vuxenkanal #2", + "parent": 2, + "position": 0, + "temporary": false, + "users": [] + }, + { + "channels": [], + "description": "", + "id": 88, + "name": "Allm\u00e4nt Snack - Vuxenkanal #3 30 Plus", + "parent": 2, + "position": 0, + "temporary": false, + "users": [] + } + ], + "description": "", + "id": 2, + "name": "Allm\u00e4nt Snack", + "parent": 190, + "position": 100, + "temporary": false, + "users": [] + }, + { + "channels": [], + "description": "", + "id": 205, + "name": "V\u00e4lkommen in - Allm\u00e4n samlingskanal", + "parent": 190, + +|| + "position": 0, + "temporary": false, + "users": [] + } + ], + "description": "", + "id": 190, + "name": "Snack-kanaler", + "parent": 0, + "position": 20, + "temporary": false, + "users": [] + }, + { + "channels": [], + "description": "", + "id": 193, + "name": "Startbanan (registrera er sj\u00e4lva)", + "parent": 0, + "position": 999, + "temporary": false, + "users": [] + }, + { + "channels": [ + { + "channels": [ + { + "channels": [ + { + "channels": [], + "description": "", + "id": 479, + "name": "Grupp 1", + "parent": 119, + "position": 0, + "temporary": false, + "users": [] + }, + { + "channels": [], + "description": "", + "id": 480, + "name": "Grupp 2", + "parent": 119, + "position": 0, + "temporary": false, + "users": [] + } + ], + "description": "", + "id": 119, + "name": "Battlefield 3", + "parent": 3, + "position": 0, + "temporary": false, + "users": [] + }, + { + "channels": [ + { + "channels": [ + { + "channels": [], + "description": "", + "id": 47, + "name": "Team #1", + "parent": 16, + +|| + "position": 10, + "temporary": false, + "users": [] + }, + { + "channels": [], + "description": "", + "id": 54, + "name": "Team #2", + "parent": 16, + "position": 20, + "temporary": false, + "users": [] + } + ], + "description": "", + "id": 16, + "name": "Skyttegrav #2 Project Reality Coop", + "parent": 122, + "position": 0, + "temporary": false, + "users": [] + }, + { + "channels": [], + "description": "", + "id": 17, + "name": "Skyttegrav #1 BF2 Ranked", + "parent": 122, + "position": 0, + "temporary": false, + "users": [] + }, + { + "channels": [ + { + "channels": [], + "description": "", + "id": 385, + "name": "Team #1", + "parent": 384, + "position": 0, + "temporary": false, + "users": [] + }, + { + "channels": [], + "description": "", + "id": 386, + "name": "Team #2", + "parent": 384, + "position": 0, + "temporary": false, + "users": [] + } + ], + "descriptio +|| +n": "", + "id": 384, + "name": "Skyttegrav #3 Project Reality", + "parent": 122, + "position": 0, + "temporary": false, + "users": [] + } + ], + "description": "", + "id": 122, + "name": "Battlefield 2", + "parent": 3, + "position": 0, + "temporary": false, + "users": [] + }, + { + "channels": [ + { + "channels": [ + { + "channels": [ + { + "channels": [], + "description": "", + "id": 198, + "name": "Squad #1", + "parent": 149, + "position": 0, + "temporary": false, + "users": [] + }, + { + "channels": [], + "description": "", + "id": 199, + "name": "Squad #2", + "parent": 149, + "position": 0, + "temporary": false, + "users": [] + }, + { + "channels": [], + "description": "", + "id": 202, + "name": "Squad #3", + "parent": 149, + "position": 0, + "temporary": false, + "users": [] + } + ], + "description": "", + "id": 149, + "name": " +|| +Team #1", + "parent": 148, + "position": 0, + "temporary": false, + "users": [] + }, + { + "channels": [ + { + "channels": [], + "description": "", + "id": 200, + "name": "Squad #1", + "parent": 194, + "position": 0, + "temporary": false, + "users": [] + }, + { + "channels": [], + "description": "", + "id": 201, + "name": "Squad #2", + "parent": 194, + "position": 0, + "temporary": false, + "users": [] + }, + { + "channels": [], + "description": "", + "id": 203, + "name": "Squad #3", + "parent": 194, + "position": 0, + "temporary": false, + "users": [] + } + ], + "description": "", + "id": 194, + "name": "Team #2", + "parent": 148, + "position": 10, + "temporary": false, + "users": [] + } + ], + "description": "http://www.sweclockers.com/forum/149-spelcloc +|| +kers/1247307-bf4-sweclockers-battlefield-servrar/", + "id": 148, + "name": "SweClockers 64 HC Conquest", + "parent": 389, + "position": 10, + "temporary": false, + "users": [] + }, + { + "channels": [], + "description": "", + "id": 390, + "name": "Grupp 1", + "parent": 389, + "position": 110, + "temporary": false, + "users": [] + }, + { + "channels": [], + "description": "", + "id": 391, + "name": "Grupp 2", + "parent": 389, + "position": 120, + "temporary": false, + "users": [ + { + "bytespersec": 0, + "channel": 391, + "comment": "", + "context": "", + "deaf": false, + "identity": "", + "idlesecs": 9336, + "mute": false, + "name": "Tennethe", + "onlinesecs": 18772, + "os": "Win", + "osversion": "6.2.9200.1", + "release": "1.2.8", + "selfDeaf": false, + "selfMute": false, + "session": 152, + "suppress": false, + "tcponly": false, + "userid": 4081, + "version": 66056, + "udpPing": 28.61, + "tcpPing": 32.88 + } + ] + }, + +|| + { + "channels": [], + "description": "", + "id": 392, + "name": "Grupp 3", + "parent": 389, + "position": 130, + "temporary": false, + "users": [] + }, + { + "channels": [], + "description": "", + "id": 393, + "name": "S\u00f6ker spelare", + "parent": 389, + "position": 0, + "temporary": false, + "users": [] + }, + { + "channels": [ + { + "channels": [ + { + "channels": [], + "description": "", + "id": 475, + "name": "Squad #1", + "parent": 473, + "position": 0, + "temporary": false, + "users": [] + }, + { + "channels": [], + "description": "", + "id": 476, + "name": "Squad #2", + "parent": 473, + "position": 0, + "temporary": false, + "users": [] + } + ], + "description": "", + "id": 473, + "name": "Team #1", + "parent": 472, + "position": 0, + "temporary": false, + "users": [] + }, + { + "channels": [ + { + "channels": [ +|| +], + "description": "", + "id": 477, + "name": "Squad #1", + "parent": 474, + "position": 0, + "temporary": false, + "users": [] + }, + { + "channels": [], + "description": "", + "id": 478, + "name": "Squad #2", + "parent": 474, + "position": 0, + "temporary": false, + "users": [] + } + ], + "description": "", + "id": 474, + "name": "Team #2", + "parent": 472, + "position": 0, + "temporary": false, + "users": [] + } + ], + "description": "http://www.sweclockers.com/forum/149-spelclockers/1247307-bf4-sweclockers-battlefield-servrar/", + "id": 472, + "name": "SweClockers 32 Vanilla maps", + "parent": 389, + "position": 20, + "temporary": false, + "users": [] + } + ], + "description": "SweClockers.com 64 HC Conquest: \n

http://battlelog.battlefield.com/bf4/servers/show/pc/dc5cdf97-7b5b-4b4f-962f-e6b74b7a9ad5/SweClockers-com-64-HC-Conquest/

SweClockers.com 32 Custom Rush/Obliteration:

\n

http://battlelog.battlefield.com/bf4/servers/show/pc/b7c21efd-25ab-4306-a2ff-4342f41850bc/SweClockers-com-32-Custom-Rush-Obliteration/

", + "id": 389, + "name": "Battlefield 4", + "parent": 3, + "position": 0, + "temporary": false, + "users": [] + }, + { + "channels": [ + { + "channels": [], + "description": "", + "id": 561, + "name": "Grupp 1", + "parent": 560, + "position": 1, + "temporary": false, + "users": [] + }, + { + "channels": [], + "description": "", + "id": 562, + "name": "Grupp 2", + "parent": 560, + "position": 2, + "temporary": false, + "users": [] + }, + { + "channels": [], + +|| +"description": "", + "id": 563, + "name": "Grupp 3", + "parent": 560, + "position": 3, + "temporary": false, + "users": [] + }, + { + "channels": [], + "description": "", + "id": 564, + "name": "S\u00f6ker spelare", + "parent": 560, + "position": 0, + "temporary": false, + "users": [] + } + ], + "description": "", + "id": 560, + "name": "Battlefield Hardline Beta", + "parent": 3, + "position": 4, + "temporary": false, + "users": [] + }, + { + "channels": [ + { + "channels": [], + "description": "", + "id": 570, + "name": "Grupp 1", + "parent": 569, + "position": 1, + "temporary": false, + "users": [] + }, + { + "channels": [], + "description": "", + "id": 571, + "name": "Grupp 2", + "parent": 569, + "position": 2, + "temporary": false, + "users": [] + } + ], + "description": "", + "id": 569, + "name": "Bad Company 2", + "parent": 3, + "position": 0, + "temporary": false, + "users": [] + } + ], + "description": "H\u00e4r spelar vi B +|| +attlefield och Project Reality.\n


Foruml\u00e4nk: http://www.skyttegrav.se/viewforum.php?f=8

", + "id": 3, + "name": "Battlefield", + "parent": 542, + "position": 10, + "temporary": false, + "users": [] + }, + { + "channels": [ + { + "channels": [], + "description": "", + "id": 23, + "name": "Call of Duty 4", + "parent": 4, + "position": 30, + "temporary": false, + "users": [] + }, + { + "channels": [ + { + "channels": [], + "description": "", + "id": 95, + "name": "Party 1", + "parent": 25, + "position": 100, + "temporary": false, + "users": [ + { + "bytespersec": 0, + "channel": 95, + "comment": "", + "context": "", + "deaf": false, + "identity": "", + "idlesecs": 131, + "mute": false, + "name": "Figge86", + "onlinesecs": 3454, + "os": "Win", + "osversion": "6.2.9200.1", + "release": "1.2.8", + "selfDeaf": false, + "selfMute": false, + "session": 259, + "suppress": false, + "tcponly": false, + "userid": 3459, + "version": +|| +66056, + "udpPing": 15.41, + "tcpPing": 17.77 + } +, + { + "bytespersec": 0, + "channel": 95, + "comment": "", + "context": "", + "deaf": false, + "identity": "", + "idlesecs": 5, + "mute": false, + "name": "sterner007", + "onlinesecs": 8801, + "os": "Win", + "osversion": "6.1.7601.1", + "release": "1.2.8", + "selfDeaf": false, + "selfMute": false, + "session": 312, + "suppress": false, + "tcponly": false, + "userid": 3836, + "version": 66056, + "udpPing": 33.28, + "tcpPing": 36.30 + } + ] + }, + { + "channels": [], + "description": "", + "id": 96, + "name": "Party 2", + "parent": 25, + "position": 200, + "temporary": false, + "users": [] + } + ], + "description": "", + "id": 25, + "name": "Call of Duty - Modern Warfare 2", + "parent": 4, + "position": 50, + "temporary": false, + "users": [] + }, + { + "channels": [ + { + "channels": [], + "description": "", + "id": 140, + "name": "Party 1", + "parent": 139, + +|| + "position": 0, + "temporary": false, + "users": [] + }, + { + "channels": [], + "description": "", + "id": 212, + "name": "Party 2", + "parent": 139, + "position": 0, + "temporary": false, + "users": [] + } + ], + "description": "", + "id": 139, + "name": "Call of Duty - Modern Warfare 3", + "parent": 4, + "position": 0, + "temporary": false, + "users": [] + }, + { + "channels": [ + { + "channels": [], + "description": "", + "id": 254, + "name": "Party 1", + "parent": 246, + "position": 0, + "temporary": false, + "users": [] + }, + { + "channels": [], + "description": "", + "id": 255, + "name": "Party 2", + "parent": 246, + "position": 0, + "temporary": false, + "users": [] + } + ], + "description": "", + "id": 246, + "name": "Call of Duty - Black Ops 2", + "parent": 4, + "position": 0, + "temporary": false, + "users": [] + }, + { + "channels": [ + { + "channels": [ + { + "channels": [], + "description": "", + "id": 398, + "name": "Party 1", + "parent": 396, + "position": 0, + "temporary": false, + "users": [] + }, + { + "channels": [], + "description": "", + "id": 399, + "name": "Party 2", + "parent": 396, + "position": 0, + "temporary": false, + "users": [] + } + ], + "description": "", + "id": 396, + "name": "Hardcore", + "parent": 395, + "position": 0, + "temporary": false, + "users": [] + }, + { + "channels": [], + "description": "", + "id": 397, + "name": "Softcore", + "parent": 395, + "position": 0, + "temporary": false, + "users": [] + } + ], + "description": "", + "id": 395, + "name": "Call of Duty - Ghosts", + "parent": 4, + "position": 0, + "temporary": false, + "users": [] + }, + { + "channels": [ + { + "channels": [], + "description": "", + "id": 555, + "name": "Party 1", + "parent": 554, + "position": 0, + "temporary": false, + "users": [ + { + "bytespersec": 0, + "channel": 555, + "comment": "", + +|| + "context": "", + "deaf": false, + "identity": "", + "idlesecs": 9, + "mute": false, + "name": "[SG]K\u00e5Be", + "onlinesecs": 28263, + "os": "Win", + "osversion": "6.1.7601.1", + "release": "1.2.8", + "selfDeaf": false, + "selfMute": false, + "session": 12, + "suppress": false, + "tcponly": false, + "userid": 27, + "version": 66056, + "udpPing": 20.78, + "tcpPing": 23.90 + } +, + { + "bytespersec": 0, + "channel": 555, + "comment": "beh\u00f6ver ni mig kalla\n

", + "context": "", + "deaf": false, + "identity": "", + "idlesecs": 8, + "mute": false, + "name": "[SG-SUP]strike", + "onlinesecs": 4771, + "os": "Win", + "osversion": "5.1.2600.1", + "release": "1.2.3", + "selfDeaf": false, + "selfMute": false, + "session": 314, + "suppress": false, + "tcponly": false, + "userid": 19, + "version": 66051, + "udpPing": 21.30, + "tcpPing": 25.92 + } + ] + }, + { + "channels": [], + "description": "", + "id": 556, + "name": "Party 2", + "parent": 554, + "position": 0, + "temporary": false, + "users": [] + } + ], + "description": "", + "id": 554, + "name": "Call of Duty - Advance Warfare", + "parent": 4, + "position": 0, + "temporary": false, + "users": [] + } + ], + "description": "", + "id": 4, + "name": "Call of Duty", + "parent": 542, + "position": 20, + "temporary": false, + "users": [] + }, + { + "channels": [ + { + "channels": [], + "description": "", + "id": 28, + "name": "Skyttegrav #1 - D2 INF Nuke", + "parent": 5, + "position": 10, + "temporary": false, + "users": [] + }, + { + "channels": [], + "description": "", + "id": 30, + "name": "Skyttegrav #3 - WC3FT ", + "parent": 5, + "position": 30, + "temporary": false, + "users": [] + }, + { + "channels": [ + { + "channels": [ + { + "channels": [], + "description": "", + "id": 483, + "name": "Rum #1", + "parent": 179, + "position": 10, + "temporary": false, + "users": [] + }, + { + "channe +|| +ls": [], + "description": "", + "id": 484, + "name": "Rum #2", + "parent": 179, + "position": 20, + "temporary": false, + "users": [] + } + ], + "description": "", + "id": 179, + "name": "Competitive", + "parent": 178, + "position": 20, + "temporary": false, + "users": [] + }, + { + "channels": [], + "description": "", + "id": 180, + "name": "Rum #2", + "parent": 178, + "position": 200, + "temporary": false, + "users": [] + }, + { + "channels": [], + "description": "", + "id": 181, + "name": "Skyttegrav #3 Classic Competitive", + "parent": 178, + "position": 0, + "temporary": false, + "users": [] + }, + { + "channels": [], + "description": "", + "id": 527, + "name": "Rum #1", + "parent": 178, + "position": 100, + "temporary": false, + "users": [] + } + ], + "description": "", + "id": 178, + "name": "Global Offensive", + "parent": 5, + "position": 0, + "temporary": false, + "users": [] + } + ], + "description": "", + "id": 5, + +|| + "name": "Counter-Strike", + "parent": 542, + "position": 30, + "temporary": false, + "users": [] + }, + { + "channels": [ + { + "channels": [ + { + "channels": [], + "description": "", + "id": 537, + "name": "Euro Truck Sim", + "parent": 345, + "position": 0, + "temporary": false, + "users": [] + } + ], + "description": "", + "id": 345, + "name": "Bilspel och racingsims (F1 Dirt ETS mm)", + "parent": 7, + "position": 0, + "temporary": false, + "users": [] + }, + { + "channels": [ + { + "channels": [], + "description": "", + "id": 486, + "name": "7 days to die ", + "parent": 485, + "position": 0, + "temporary": false, + "users": [] + }, + { + "channels": [], + "description": "", + "id": 487, + "name": "Space Engineers", + "parent": 485, + "position": 0, + "temporary": false, + "users": [] + }, + { + "channels": [], + "description": "", + "id": 536, + "name": "Everquest landmark", + "parent": 485, + "position": 0, + "temporary": false, + "users": [] + } + ], + "description": "", + "id": 485, + "name": "Voxel Spel", + "parent": 7, + "position": 0, + "temporary": false, + "users": [] + }, + { + "channels": [ + { + "channels": [ + { + "channels": [], + "description": "", + "id": 418, + "name": "Rum #1", + "parent": 394, + "position": 0, + "temporary": false, + "users": [] + }, + { + "channels": [], + "description": "", + "id": 419, + "name": "Rum #2", + "parent": 394, + "position": 0, + "temporary": false, + "users": [] + } + ], + "description": "", + "id": 394, + "name": "Final Fantasy XIV - A Realm Reborn", + "parent": 488, + "position": 0, + "temporary": false, + "users": [] + }, + { + "channels": [], + "description": "", + "id": 489, + "name": "Mortal Online", + "parent": 488, + "position": 0, + "temporary": false, + "users": [] + }, + { + "channels": [ + { + "channels": [], + "description": "", + "id": 491, + "name": "Party 1", + +|| + "parent": 490, + "position": 0, + "temporary": false, + "users": [] + }, + { + "channels": [], + "description": "", + "id": 492, + "name": "Party 2", + "parent": 490, + "position": 0, + "temporary": false, + "users": [ + { + "bytespersec": 6876, + "channel": 492, + "comment": "", + "context": "", + "deaf": false, + "identity": "", + "idlesecs": 0, + "mute": false, + "name": "Widoxz", + "onlinesecs": 27468, + "os": "Win", + "osversion": "6.1.7601.1", + "release": "1.2.8", + "selfDeaf": false, + "selfMute": false, + "session": 24, + "suppress": false, + "tcponly": false, + "userid": 4058, + "version": 66056, + "udpPing": 35.82, + "tcpPing": 56.07 + } +, + { + "bytespersec": 6918, + "channel": 492, + "comment": "", + "context": "", + "deaf": false, + "identity": "", + "idlesecs": 0, + "mute": false, + "name": "FourO", + "onlinesecs": 2556, + +|| + "os": "Win", + "osversion": "6.1.7601.1", + "release": "1.2.8", + "selfDeaf": false, + "selfMute": false, + "session": 131, + "suppress": false, + "tcponly": false, + "userid": 4111, + "version": 66056, + "udpPing": 9.74, + "tcpPing": 17.55 + } +, + { + "bytespersec": 0, + "channel": 492, + "comment": "", + "context": "", + "deaf": false, + "identity": "", + "idlesecs": 2578, + "mute": false, + "name": "lemurtacos", + "onlinesecs": 2579, + "os": "Win", + "osversion": "6.1.7601.1", + "release": "1.2.8", + "selfDeaf": false, + "selfMute": true, + "session": 185, + "suppress": false, + "tcponly": false, + "userid": 3827, + "version": 66056, + "udpPing": 9.87, + "tcpPing": 13.88 + } +, + { + "bytespersec": 8868, + "channel": 492, + "comment": "", + "context": "", + "deaf": false, + "identity": "", + "idlesecs": 0, + "mute": false, + "nam +|| +e": "kaviar", + "onlinesecs": 22276, + "os": "Win", + "osversion": "6.1.7601.1", + "release": "1.2.8", + "selfDeaf": false, + "selfMute": false, + "session": 349, + "suppress": false, + "tcponly": false, + "userid": 3759, + "version": 66056, + "udpPing": 11.72, + "tcpPing": 14.77 + } +, + { + "bytespersec": 9032, + "channel": 492, + "comment": "", + "context": "", + "deaf": false, + "identity": "", + "idlesecs": 0, + "mute": false, + "name": "LillaEmma", + "onlinesecs": 3092, + "os": "Win", + "osversion": "6.1.7601.1", + "release": "1.2.8", + "selfDeaf": false, + "selfMute": false, + "session": 419, + "suppress": false, + "tcponly": false, + "userid": 3758, + "version": 66056, + "udpPing": 10.32, + "tcpPing": 14.23 + } + ] + } + ], + "description": "", + "id": 490, + "name": "World of Warcraft", + "parent": 488, + "position": 0, + "temporary": false, + +|| +"users": [] + }, + { + "channels": [], + "description": "", + "id": 495, + "name": "Guild Wars 2", + "parent": 488, + "position": 0, + "temporary": false, + "users": [] + }, + { + "channels": [], + "description": "", + "id": 513, + "name": "Planetside 2", + "parent": 488, + "position": 0, + "temporary": false, + "users": [] + }, + { + "channels": [], + "description": "", + "id": 529, + "name": "Aion", + "parent": 488, + "position": 0, + "temporary": false, + "users": [] + } + ], + "description": "", + "id": 488, + "name": "MMO", + "parent": 7, + "position": 0, + "temporary": false, + "users": [] + }, + { + "channels": [ + { + "channels": [], + "description": "", + "id": 207, + "name": "Borderlands 2", + "parent": 498, + "position": 0, + "temporary": false, + "users": [] + }, + { + "channels": [], + "description": "", + "id": 218, + "name": "Portal 2", + "parent": 498, + "position": 0, + "temporary": false, + "users": [ + +|| + { + "bytespersec": 0, + "channel": 218, + "comment": "", + "context": "", + "deaf": false, + "identity": "", + "idlesecs": 833, + "mute": false, + "name": "Maichopalami", + "onlinesecs": 4034, + "os": "Win", + "osversion": "6.2.9200.1", + "release": "1.2.8", + "selfDeaf": false, + "selfMute": false, + "session": 157, + "suppress": false, + "tcponly": false, + "userid": 1563, + "version": 66056, + "udpPing": 12.87, + "tcpPing": 14.56 + } + ] + }, + { + "channels": [ + { + "channels": [], + "description": "Clanen vi har till Wipe heter \n

SKYTTEGRAV

\n

\n

Joina denna f\u00f6r att teama up.

", + "id": 240, + "name": "Grupp 1", + "parent": 232, + "position": 0, + "temporary": false, + "users": [] + }, + { + "channels": [], + "description": "", + "id": 241, + "name": "Grupp 2", + "parent": 232, + "position": 1, + "temporary": false, + "users": [] + }, + { + +|| +"channels": [], + "description": "", + "id": 376, + "name": "Skyttegrav KLAN SPEL", + "parent": 232, + "position": 1, + "temporary": false, + "users": [] + } + ], + "description": "", + "id": 232, + "name": "Infestation Survivor Stories", + "parent": 498, + "position": 0, + "temporary": false, + "users": [] + }, + { + "channels": [], + "description": "", + "id": 499, + "name": "ArmA", + "parent": 498, + "position": 0, + "temporary": false, + "users": [] + }, + { + "channels": [], + "description": "", + "id": 500, + "name": "Natural Selection 2", + "parent": 498, + "position": 0, + "temporary": false, + "users": [] + }, + { + "channels": [], + "description": "", + "id": 502, + "name": "Left 4 Dead", + "parent": 498, + "position": 0, + "temporary": false, + "users": [] + }, + { + "channels": [ + { + "channels": [], + "description": "", + "id": 515, + "name": "Allies", + "parent": 514, + "position": 0, + "temporary": false, + "users": [] + }, + { + "channels": [], + "description": "", + "id": 516, + "name": "Axis", + "parent": 514, + "position": 0, + "temporary": false, + "users": [] + } + ], + "description": "", + "id": 514, + "name": "Red Orchestra 2", + "parent": 498, + "position": 0, + "temporary": false, + "users": [] + }, + { + "channels": [ + { + "channels": [], + "description": "", + "id": 519, + "name": "Persistent World", + "parent": 518, + "position": 0, + "temporary": false, + "users": [] + }, + { + "channels": [], + "description": "", + "id": 520, + "name": "Mount and blade Vanilla", + "parent": 518, + "position": 0, + "temporary": false, + "users": [] + } + ], + "description": "", + "id": 518, + "name": "Mount and Blade - Warband", + "parent": 498, + "position": 0, + "temporary": false, + "users": [] + }, + { + "channels": [], + "description": "", + "id": 541, + +|| + "name": "Insurgency", + "parent": 498, + "position": 0, + "temporary": false, + "users": [] + }, + { + "channels": [], + "description": "", + "id": 567, + "name": "Evolve", + "parent": 498, + "position": 0, + "temporary": false, + "users": [] + } + ], + "description": "First-person shooter & Third-person shooter", + "id": 498, + "name": "FPS och TPS", + "parent": 7, + "position": 0, + "temporary": false, + "users": [] + }, + { + "channels": [ + { + "channels": [], + "description": "", + "id": 356, + "name": "Starcraft", + "parent": 504, + "position": 0, + "temporary": false, + "users": [] + }, + { + "channels": [], + "description": "", + "id": 505, + "name": "Company of Heroes", + "parent": 504, + "position": 0, + "temporary": false, + "users": [] + }, + { + "channels": [ + { + "channels": [], + "description": "", + "id": 534, + "name": "Rum #1", + "parent": 506, + "position": 0, + "temporary": false, + "users": [] + +|| + }, + { + "channels": [], + "description": "", + "id": 535, + "name": "Rum #2", + "parent": 506, + "position": 0, + "temporary": false, + "users": [] + } + ], + "description": "", + "id": 506, + "name": "Europa Universalis ", + "parent": 504, + "position": 0, + "temporary": false, + "users": [] + }, + { + "channels": [], + "description": "", + "id": 523, + "name": "Age of Empires", + "parent": 504, + "position": 0, + "temporary": false, + "users": [] + }, + { + "channels": [], + "description": "h\u00e4r spelar man Civilization V", + "id": 533, + "name": "Civilization V", + "parent": 504, + "position": 0, + "temporary": false, + "users": [] + } + ], + "description": "", + "id": 504, + "name": "RTS och grand strategy", + "parent": 7, + "position": 0, + "temporary": false, + " +|| +users": [] + }, + { + "channels": [ + { + "channels": [], + "description": "", + "id": 375, + "name": "Mechwarrior Online", + "parent": 510, + "position": 0, + "temporary": false, + "users": [] + }, + { + "channels": [ + { + "channels": [], + "description": "", + "id": 526, + "name": "Tank", + "parent": 511, + "position": 0, + "temporary": false, + "users": [] + }, + { + "channels": [], + "description": "", + "id": 538, + "name": "Flyg", + "parent": 511, + "position": 0, + "temporary": false, + "users": [] + } + ], + "description": "", + "id": 511, + "name": "War Thunder", + "parent": 510, + "position": 0, + "temporary": false, + "users": [] + }, + { + "channels": [], + "description": "", + "id": 512, + "name": "World of Tanks", + "parent": 510, + "position": 0, + "temporary": false, + "users": [ + { + "bytespersec": 0, + "channel": 512, + "comment": "", + "context": "", + "deaf": false, + "identity": "", + "idlesecs": 1774, + "mute": false, + "name": "[SG]Binge", + "onlinesecs": 10721, + "os": "Win", + "osversion": "6.1.7601.1", + "release": "1.2.8", + "selfDeaf": false, + "selfMute": false, + "session": 333, + "suppress": false, + "tcponly": false, + "userid": 1837, + "version": 66056, + "udpPing": 22.63, + "tcpPing": 25.85 + } + ] + }, + { + "channels": [], + "description": "", + "id": 530, + "name": "Town of salem", + "parent": 510, + "position": 0, + "temporary": false, + "users": [] + } + ], + "description": "Spel som \u00e4r gratis att k\u00f6ra.", + "id": 510, + "name": "Free to play", + "parent": 7, + "position": 0, + "temporary": false, + "users": [] + }, + { + "channels": [ + { + "channels": [], + "description": "", + "id": 167, + "name": "Diablo 3", + "parent": 521, + "position": 0, + "temporary": false, + "users": [ + { + "bytespersec": 8843, + "channel": 167, + "comment": "", + +|| + "context": "", + "deaf": false, + "identity": "", + "idlesecs": 0, + "mute": false, + "name": "shimmerghost", + "onlinesecs": 16295, + "os": "Win", + "osversion": "6.1.7601.1", + "release": "1.2.4", + "selfDeaf": false, + "selfMute": false, + "session": 144, + "suppress": false, + "tcponly": false, + "userid": 2347, + "version": 66052, + "udpPing": 30.98, + "tcpPing": 33.08 + } +, + { + "bytespersec": 8982, + "channel": 167, + "comment": "", + "context": "", + "deaf": false, + "identity": "", + "idlesecs": 0, + "mute": false, + "name": "Lankfisher", + "onlinesecs": 16298, + "os": "Win", + "osversion": "6.2.9200.1", + "release": "1.2.8", + "selfDeaf": false, + "selfMute": false, + "session": 186, + "suppress": false, + "tcponly": false, + "userid": 4106, + "version": 66056, + "udpPing": 21.28, + "tcpPing": 23.40 + } +, + { + "bytespersec": 8564, + "channel": 167, + "comment": "", + "context": "", + " +|| +deaf": false, + "identity": "", + "idlesecs": 0, + "mute": false, + "name": "AndreasLindgren", + "onlinesecs": 4401, + "os": "Win", + "osversion": "6.2.9200.1", + "release": "1.2.8", + "selfDeaf": false, + "selfMute": false, + "session": 235, + "suppress": false, + "tcponly": false, + "userid": 2439, + "version": 66056, + "udpPing": 31.60, + "tcpPing": 17.20 + } +, + { + "bytespersec": 0, + "channel": 167, + "comment": "", + "context": "", + "deaf": false, + "identity": "", + "idlesecs": 4345, + "mute": false, + "name": "Emmag", + "onlinesecs": 4364, + "os": "Win", + "osversion": "6.1.7601.1", + "release": "1.2.4", + "selfDeaf": false, + "selfMute": true, + "session": 300, + "suppress": false, + "tcponly": false, + "userid": 2438, + "version": 66052, + "udpPing": 24.04, + "tcpPing": 24.97 + } + ] + }, + { + "channels": [], + "description": "", + "id": 336, + "name": "Path of Exile", + "parent": 521, + +|| + "position": 0, + "temporary": false, + "users": [] + }, + { + "channels": [], + "description": "", + "id": 383, + "name": "Torchlight II", + "parent": 521, + "position": 0, + "temporary": false, + "users": [ + { + "bytespersec": 0, + "channel": 383, + "comment": "", + "context": "", + "deaf": false, + "identity": "", + "idlesecs": 3095, + "mute": false, + "name": "Tobias", + "onlinesecs": 7952, + "os": "Win", + "osversion": "6.1.7601.1", + "release": "1.2.8", + "selfDeaf": false, + "selfMute": false, + "session": 325, + "suppress": false, + "tcponly": false, + "userid": 3788, + "version": 66056, + "udpPing": 15.76, + "tcpPing": 22.77 + } + ] + } + ], + "description": "", + "id": 521, + "name": "Hack and slash", + "parent": 7, + "position": 0, + "temporary": false, + "users": [] + }, + { + "channels": [ + { + "channels": [ + { + "channels": [], + "description": "", + "id": 565, + "name": "Grupp 1", + "parent": 6, + "position": 5, + "temporary": false, + "users": [] + }, + { + "channels": [], + "description": "", + "id": 566, + "name": "Grupp 2", + "parent": 6, + "position": 10, + "temporary": false, + "users": [] + } + ], + "description": "", + "id": 6, + "name": "League of Legends", + "parent": 522, + "position": 0, + "temporary": false, + "users": [] + }, + { + "channels": [ + { + "channels": [], + "description": "", + "id": 236, + "name": "Grupp 1", + "parent": 153, + "position": 0, + "temporary": false, + "users": [] + }, + { + "channels": [], + "description": "", + "id": 237, + "name": "Grupp 2", + "parent": 153, + "position": 0, + "temporary": false, + "users": [] + } + ], + "description": "", + "id": 153, + "name": "Dota 2", + "parent": 522, + "position": 0, + "temporary": false, + "users": [] + }, + { + "channels": [], + "description": "", + "id": 532, + "name": "Smite", + "parent": 522, + "position": 0, + "temporary": false, + "users": [] + } + ], + "description": "", + "id": 522, + "name": "MOBA", + "parent": 7, + "position": 0, + "temporary": false, + "users": [] + }, + { + "channels": [], + "description": "", + "id": 528, + "name": "Tabletop Simulator", + "parent": 7, + "position": 0, + "temporary": false, + "users": [] + }, + { + "channels": [], + "description": "", + "id": 559, + "name": "Kerbal Space Program", + "parent": 7, + "position": 0, + "temporary": false, + "users": [] + } + ], + "description": "", + "id": 7, + "name": "\u00d6vriga spel", + "parent": 542, + "position": 60, + "temporary": false, + "users": [] + }, + { + "channels": [ + { + "channels": [ + { + "channels": [], + "description": "L\u00e5st till admins f\u00f6r Hemligastugan.", + "id": 388, + "name": "Admin", + "parent": 157, + "position": 2, + "temporary": false, + "users": [] + }, + { + "channels": [], + "description": "", + "id": 416, + +|| + "name": "Grupp 1", + "parent": 157, + "position": 0, + "temporary": false, + "users": [] + }, + { + "channels": [], + "description": "", + "id": 417, + "name": "Grupp 2", + "parent": 157, + "position": 0, + "temporary": false, + "users": [] + } + ], + "description": "Serverip:
mc.hemligastugan.com

Dynmap / Regler:

http://www.hemligastugan.com/minecraft/#
", + "id": 157, + "name": "Hemligastugan", + "parent": 156, + "position": 0, + "temporary": false, + "users": [] + }, + { + "channels": [ + { + "channels": [], + "description": "", + "id": 539, + "name": "Rum 1", + "parent": 158, + "position": 0, + "temporary": false, + "users": [] + }, + { + "channels": [], + "description": "", + "id": 540, + "name": "Rum 2", + "parent": 158, + "position": 0, + "temporary": false, + +|| + "users": [] + } + ], + "description": "Inte bara en samling moddar.. \u00c4ven med egenutvecklade MODS! \n

MC Version 1.7.10 / Skyttegrav Modpack 2.0

\n

Hemsida: http://mc.skyttegrav.se

\n

Info & registrering: http://www.skyttegrav.se/index.php?/topic/5-skyttegravse-custom-modpack

\n

Server IP: mc.skyttegrav.se

\n

Dynmap: http://mc.skyttegrav.se/dynmap

", + "id": 158, + "name": "Skyttegrav Modpack", + "parent": 156, + "position": 0, + "temporary": false, + "users": [] + } + ], + "description": "", + "id": 156, + "name": "Minecraft", + "parent": 542, + "position": 50, + "temporary": false, + "users": [] + }, + { + "channels": [ + { + "channels": [], + "description": "", + "id": 176, + "name": "Grupp 1", + "parent": 170, + "position": 10, + "temporary": false, + "users": [] + }, + { + "channe +|| +ls": [], + "description": "", + "id": 177, + "name": "Grupp 2", + "parent": 170, + "position": 20, + "temporary": false, + "users": [] + }, + { + "channels": [], + "description": "", + "id": 196, + "name": "Grupp 3", + "parent": 170, + "position": 30, + "temporary": false, + "users": [] + }, + { + "channels": [], + "description": "", + "id": 197, + "name": "Grupp 4", + "parent": 170, + "position": 40, + "temporary": false, + "users": [] + } + ], + "description": "", + "id": 170, + "name": "Day Z", + "parent": 542, + "position": 40, + "temporary": false, + "users": [] + }, + { + "channels": [], + "description": "H\u00e4r s\u00f6ker ni spelare f\u00f6r ert spel.\n

\n

Skapa en egen kanal i denna med speltitel.

", + "id": 192, + "name": "S\u00f6ker spelare", + "parent": 542, + "position": 0, + "temporary": false, + "users": [] + } + ], + "description": "", + "id": 542, + "name": "Spelkanaler", + "parent": 0, + "position": 30, + "temporary": false, + "users": [] + }, + { + "channels": [ + { + "channels": [ + { + "channels": [], + "description": "", + +|| + "id": 546, + "name": "Titta och diskutera", + "parent": 544, + "position": 5, + "temporary": false, + "users": [] + }, + { + "channels": [], + "description": "", + "id": 547, + "name": "Tysta rummet", + "parent": 544, + "position": 10, + "temporary": false, + "users": [] + } + ], + "description": "", + "id": 544, + "name": "MS Presskonferens", + "parent": 543, + "position": 10, + "temporary": false, + "users": [] + }, + { + "channels": [ + { + "channels": [ + { + "channels": [], + "description": "", + "id": 549, + "name": "Rum #1", + "parent": 553, + "position": 0, + "temporary": false, + "users": [] + }, + { + "channels": [], + "description": "", + "id": 550, + "name": "Rum #2", + "parent": 553, + "position": 0, + "temporary": false, + "users": [] + } + ], + "description": "", + "id": 553, + "name": "Trackmania 29 Okt", + "parent": 548, + "position": 0, + "temporary": false, + "users": [] + } + ], + "description": "", + "id": 548, + "name": "Skyttegrav Free-2-Play Spelkv\u00e4llar", + "p +|| +arent": 543, + "position": 50, + "temporary": false, + "users": [] + }, + { + "channels": [], + "description": "", + "id": 558, + "name": "DreamHack", + "parent": 543, + "position": 100, + "temporary": false, + "users": [] + } + ], + "description": "H\u00e4r kan man sitta och titta p\u00e5 streams, E-evenemang eller liknande. Subkanaler kommer att skapas av admins men du f\u00e5r g\u00e4rna tipsa om ett evenemang.", + "id": 543, + "name": "Event-kanaler", + "parent": 0, + "position": 11, + "temporary": false, + "users": [] + } + ], + "description": "Welcome! \n

This server requires registration in order to move from Root.
Please register yourself by selecting Self --> Register in the menu bar, or right-clicking on your nick and choose Register.

", + "id": 0, + "name": "Root", + "parent": -1, + "position": 0, + "temporary": false, + "users": [] + } +} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Mumble/1_result.json b/gameq/tests/Protocols/Providers/Mumble/1_result.json new file mode 100644 index 0000000..fa2ba61 --- /dev/null +++ b/gameq/tests/Protocols/Providers/Mumble/1_result.json @@ -0,0 +1 @@ +{"95.130.64.232:64738":{"dedicated":1,"gq_address":"95.130.64.232","gq_joinlink":"mumble:\/\/95.130.64.232:64738\/","gq_name":"Mumble Server","gq_online":true,"gq_port_client":64738,"gq_port_query":27800,"gq_protocol":"mumble","gq_transport":"tcp","gq_type":"mumble","id":1,"name":"Skyttegrav & SweClockers Mumble","numplayers":38,"players":[{"bytespersec":0,"channel":1,"comment":"","context":"","deaf":false,"identity":"","idlesecs":23441,"mute":false,"name":"pyootr","onlinesecs":23441,"os":"Win","osversion":"6.1.7601.1","release":"1.2.5","selfDeaf":true,"selfMute":true,"session":96,"suppress":true,"tcponly":false,"userid":66,"version":66053,"udpPing":51.19,"tcpPing":62.56},{"bytespersec":0,"channel":1,"comment":"Serveransvarig & Admin<\/b> för Skyttegrav.se\/Sweclockers.com spelservrar. \n

Supervisor<\/b> hos Skyttegrav.se<\/a>.<\/p>","context":"","deaf":false,"identity":"","idlesecs":28260,"mute":false,"name":"[SG-SUP]Gix","onlinesecs":28289,"os":"X11","osversion":"Linux Mint 17 Qiana","release":"1.2.8-1~ppa1~trusty1","selfDeaf":false,"selfMute":false,"session":124,"suppress":true,"tcponly":false,"userid":47,"version":66056,"udpPing":29.2,"tcpPing":28.94},{"bytespersec":0,"channel":1,"comment":"JAG TROR DIG URKEL!\n

<\/p>","context":"","deaf":false,"identity":"","idlesecs":21756,"mute":false,"name":"Eyem-_-","onlinesecs":23981,"os":"Win","osversion":"6.1.7601.1","release":"1.2.4","selfDeaf":false,"selfMute":false,"session":176,"suppress":true,"tcponly":false,"userid":1001,"version":66052,"udpPing":17.31,"tcpPing":20.12},{"bytespersec":0,"channel":1,"comment":"","context":"","deaf":false,"identity":"","idlesecs":855,"mute":false,"name":"[SG-HA]Relemy","onlinesecs":28262,"os":"Win","osversion":"6.2.9200.1","release":"1.2.8","selfDeaf":true,"selfMute":true,"session":232,"suppress":true,"tcponly":false,"userid":1926,"version":66056,"udpPing":37.94,"tcpPing":42.07},{"bytespersec":0,"channel":1,"comment":"","context":"","deaf":false,"identity":"","idlesecs":27997,"mute":false,"name":"TheLikus","onlinesecs":28143,"os":"Win","osversion":"6.1.7601.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":269,"suppress":true,"tcponly":false,"userid":4120,"version":66056,"udpPing":11.01,"tcpPing":13.62},{"bytespersec":0,"channel":1,"comment":"EX VERITAS ET VIGILANTIA VICTORIA<\/span>","context":"","deaf":false,"identity":"","idlesecs":857,"mute":false,"name":"[SG-SUP]Azlan1","onlinesecs":24386,"os":"Win","osversion":"6.1.7601.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":316,"suppress":true,"tcponly":true,"userid":2296,"version":66056,"udpPing":53.51,"tcpPing":65.31},{"bytespersec":0,"channel":1,"comment":"","context":"","deaf":false,"identity":"","idlesecs":28272,"mute":false,"name":"Legoo","onlinesecs":28274,"os":"Win","osversion":"6.1.7601.1","release":"1.2.5","selfDeaf":false,"selfMute":false,"session":473,"suppress":true,"tcponly":false,"userid":1657,"version":66053,"udpPing":8.45,"tcpPing":23.05},{"bytespersec":0,"channel":432,"comment":"http:\/\/www.twitch.tv\/tobbbe__<\/a>","context":"","deaf":false,"identity":"","idlesecs":114,"mute":false,"name":"[SweC]Tobbbe__","onlinesecs":28273,"os":"Win","osversion":"6.2.9200.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":5,"suppress":false,"tcponly":false,"userid":3769,"version":66056,"udpPing":21.7,"tcpPing":23.08},{"bytespersec":0,"channel":432,"comment":"

<\/p>","context":"","deaf":false,"identity":"","idlesecs":16,"mute":false,"name":"Vilse(SWE)","onlinesecs":15534,"os":"Win","osversion":"6.1.7601.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":110,"suppress":false,"tcponly":false,"userid":4124,"version":66056,"udpPing":13.77,"tcpPing":16.06},{"bytespersec":0,"channel":432,"comment":"","context":"","deaf":false,"identity":"","idlesecs":54,"mute":false,"name":"Th3MadPanda","onlinesecs":28272,"os":"Win","osversion":"6.1.7601.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":236,"suppress":false,"tcponly":false,"userid":2099,"version":66056,"udpPing":8.86,"tcpPing":11.8},{"bytespersec":0,"channel":432,"comment":"","context":"","deaf":false,"identity":"","idlesecs":63,"mute":false,"name":"Mumin","onlinesecs":8481,"os":"Win","osversion":"6.1.7601.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":306,"suppress":false,"tcponly":false,"userid":4125,"version":66056,"udpPing":19.08,"tcpPing":22.64},{"bytespersec":0,"channel":432,"comment":"Greetinx Programs!<\/a> \n

\n

Välkommen till SweClockers och Skyttegravs gemensamma Mumble!<\/p>\n

\n

Ni kan fråga mig om administrativa saker på servers eller mumble, jag är huvudadmin för SweC gänget och dessutom forumledare för SweClockers.com. Här är reglerna för mumble och SweC forum.<\/a><\/p>\n

<\/p>\n

Vi satsar på en trevlig stämning online! :)<\/p>\n

","context":"","deaf":false,"identity":"","idlesecs":1720,"mute":false,"name":"[SweC-H]Lan","onlinesecs":28266,"os":"Win","osversion":"6.1.7601.1","release":"1.2.5","selfDeaf":true,"selfMute":true,"session":353,"suppress":false,"tcponly":false,"userid":56,"version":66053,"udpPing":15.76,"tcpPing":35.14},{"bytespersec":0,"channel":433,"comment":"","context":"","deaf":false,"identity":"","idlesecs":110,"mute":false,"name":"Gson","onlinesecs":3157,"os":"Win","osversion":"6.2.9200.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":146,"suppress":false,"tcponly":false,"userid":4123,"version":66056,"udpPing":52.64,"tcpPing":58.41},{"bytespersec":0,"channel":433,"comment":"","context":"","deaf":false,"identity":"","idlesecs":113,"mute":false,"name":"lampan","onlinesecs":18331,"os":"Win","osversion":"6.2.9200.1","release":"1.2.5","selfDeaf":false,"selfMute":false,"session":463,"suppress":false,"tcponly":false,"userid":3404,"version":66053,"udpPing":13.61,"tcpPing":16.75},{"bytespersec":0,"channel":451,"comment":"","context":"","deaf":false,"identity":"","idlesecs":146,"mute":false,"name":"[SweC-T]Grabbengrå","onlinesecs":27438,"os":"Win","osversion":"6.2.9200.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":53,"suppress":false,"tcponly":false,"userid":1952,"version":66056,"udpPing":20.4,"tcpPing":22.75},{"bytespersec":0,"channel":451,"comment":"","context":"","deaf":false,"identity":"","idlesecs":433,"mute":false,"name":"[SweC-H]Kinekin","onlinesecs":28269,"os":"Win","osversion":"6.2.9200.1","release":"1.2.8","selfDeaf":true,"selfMute":true,"session":180,"suppress":false,"tcponly":false,"userid":2426,"version":66056,"udpPing":49.77,"tcpPing":52.25},{"bytespersec":7488,"channel":451,"comment":"Det händer att jag spelar spel ibland.\n

<\/p>\n

<\/p>\n

<\/p>\n

<\/p>","context":"","deaf":false,"identity":"","idlesecs":0,"mute":false,"name":"[SweC-T]DavidtheDoom","onlinesecs":28221,"os":"Win","osversion":"6.2.9200.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":203,"suppress":false,"tcponly":false,"userid":3030,"version":66056,"udpPing":3.95,"tcpPing":5.59},{"bytespersec":0,"channel":451,"comment":"SweC spelservrar finns också på Facebook<\/a>","context":"","deaf":false,"identity":"","idlesecs":26,"mute":false,"name":"[SweC-H]Raven_cc","onlinesecs":21049,"os":"Win","osversion":"6.1.7600.1","release":"1.2.7","selfDeaf":false,"selfMute":false,"session":264,"suppress":false,"tcponly":true,"userid":78,"version":66055,"udpPing":19.72,"tcpPing":25.83},{"bytespersec":0,"channel":451,"comment":"","context":"","deaf":false,"identity":"","idlesecs":763,"mute":false,"name":"OskarWallin","onlinesecs":11404,"os":"Win","osversion":"6.1.7601.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":272,"suppress":false,"tcponly":false,"userid":3783,"version":66056,"udpPing":11.96,"tcpPing":31.07},{"bytespersec":3996,"channel":451,"comment":"","context":"","deaf":false,"identity":"","idlesecs":0,"mute":false,"name":"[SweC-A]Hitman","onlinesecs":28265,"os":"Win","osversion":"6.1.7601.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":485,"suppress":false,"tcponly":true,"userid":76,"version":66056,"udpPing":21.36,"tcpPing":28.02},{"bytespersec":0,"channel":451,"comment":"","context":"","deaf":false,"identity":"","idlesecs":6,"mute":false,"name":"[SG-A]bl0m1","onlinesecs":28242,"os":"Win","osversion":"6.2.9200.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":488,"suppress":false,"tcponly":false,"userid":3447,"version":66056,"udpPing":40.23,"tcpPing":43.4},{"bytespersec":0,"channel":391,"comment":"","context":"","deaf":false,"identity":"","idlesecs":9336,"mute":false,"name":"Tennethe","onlinesecs":18772,"os":"Win","osversion":"6.2.9200.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":152,"suppress":false,"tcponly":false,"userid":4081,"version":66056,"udpPing":28.61,"tcpPing":32.88},{"bytespersec":0,"channel":95,"comment":"","context":"","deaf":false,"identity":"","idlesecs":131,"mute":false,"name":"Figge86","onlinesecs":3454,"os":"Win","osversion":"6.2.9200.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":259,"suppress":false,"tcponly":false,"userid":3459,"version":66056,"udpPing":15.41,"tcpPing":17.77},{"bytespersec":0,"channel":95,"comment":"","context":"","deaf":false,"identity":"","idlesecs":5,"mute":false,"name":"sterner007","onlinesecs":8801,"os":"Win","osversion":"6.1.7601.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":312,"suppress":false,"tcponly":false,"userid":3836,"version":66056,"udpPing":33.28,"tcpPing":36.3},{"bytespersec":0,"channel":555,"comment":"","context":"","deaf":false,"identity":"","idlesecs":9,"mute":false,"name":"[SG]KåBe","onlinesecs":28263,"os":"Win","osversion":"6.1.7601.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":12,"suppress":false,"tcponly":false,"userid":27,"version":66056,"udpPing":20.78,"tcpPing":23.9},{"bytespersec":0,"channel":555,"comment":"behöver ni mig kalla\n

","context":"","deaf":false,"identity":"","idlesecs":8,"mute":false,"name":"[SG-SUP]strike","onlinesecs":4771,"os":"Win","osversion":"5.1.2600.1","release":"1.2.3","selfDeaf":false,"selfMute":false,"session":314,"suppress":false,"tcponly":false,"userid":19,"version":66051,"udpPing":21.3,"tcpPing":25.92},{"bytespersec":6876,"channel":492,"comment":"","context":"","deaf":false,"identity":"","idlesecs":0,"mute":false,"name":"Widoxz","onlinesecs":27468,"os":"Win","osversion":"6.1.7601.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":24,"suppress":false,"tcponly":false,"userid":4058,"version":66056,"udpPing":35.82,"tcpPing":56.07},{"bytespersec":6918,"channel":492,"comment":"","context":"","deaf":false,"identity":"","idlesecs":0,"mute":false,"name":"FourO","onlinesecs":2556,"os":"Win","osversion":"6.1.7601.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":131,"suppress":false,"tcponly":false,"userid":4111,"version":66056,"udpPing":9.74,"tcpPing":17.55},{"bytespersec":0,"channel":492,"comment":"","context":"","deaf":false,"identity":"","idlesecs":2578,"mute":false,"name":"lemurtacos","onlinesecs":2579,"os":"Win","osversion":"6.1.7601.1","release":"1.2.8","selfDeaf":false,"selfMute":true,"session":185,"suppress":false,"tcponly":false,"userid":3827,"version":66056,"udpPing":9.87,"tcpPing":13.88},{"bytespersec":8868,"channel":492,"comment":"","context":"","deaf":false,"identity":"","idlesecs":0,"mute":false,"name":"kaviar","onlinesecs":22276,"os":"Win","osversion":"6.1.7601.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":349,"suppress":false,"tcponly":false,"userid":3759,"version":66056,"udpPing":11.72,"tcpPing":14.77},{"bytespersec":9032,"channel":492,"comment":"","context":"","deaf":false,"identity":"","idlesecs":0,"mute":false,"name":"LillaEmma","onlinesecs":3092,"os":"Win","osversion":"6.1.7601.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":419,"suppress":false,"tcponly":false,"userid":3758,"version":66056,"udpPing":10.32,"tcpPing":14.23},{"bytespersec":0,"channel":218,"comment":"","context":"","deaf":false,"identity":"","idlesecs":833,"mute":false,"name":"Maichopalami","onlinesecs":4034,"os":"Win","osversion":"6.2.9200.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":157,"suppress":false,"tcponly":false,"userid":1563,"version":66056,"udpPing":12.87,"tcpPing":14.56},{"bytespersec":0,"channel":512,"comment":"","context":"","deaf":false,"identity":"","idlesecs":1774,"mute":false,"name":"[SG]Binge","onlinesecs":10721,"os":"Win","osversion":"6.1.7601.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":333,"suppress":false,"tcponly":false,"userid":1837,"version":66056,"udpPing":22.63,"tcpPing":25.85},{"bytespersec":8843,"channel":167,"comment":"","context":"","deaf":false,"identity":"","idlesecs":0,"mute":false,"name":"shimmerghost","onlinesecs":16295,"os":"Win","osversion":"6.1.7601.1","release":"1.2.4","selfDeaf":false,"selfMute":false,"session":144,"suppress":false,"tcponly":false,"userid":2347,"version":66052,"udpPing":30.98,"tcpPing":33.08},{"bytespersec":8982,"channel":167,"comment":"","context":"","deaf":false,"identity":"","idlesecs":0,"mute":false,"name":"Lankfisher","onlinesecs":16298,"os":"Win","osversion":"6.2.9200.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":186,"suppress":false,"tcponly":false,"userid":4106,"version":66056,"udpPing":21.28,"tcpPing":23.4},{"bytespersec":8564,"channel":167,"comment":"","context":"","deaf":false,"identity":"","idlesecs":0,"mute":false,"name":"AndreasLindgren","onlinesecs":4401,"os":"Win","osversion":"6.2.9200.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":235,"suppress":false,"tcponly":false,"userid":2439,"version":66056,"udpPing":31.6,"tcpPing":17.2},{"bytespersec":0,"channel":167,"comment":"","context":"","deaf":false,"identity":"","idlesecs":4345,"mute":false,"name":"Emmag","onlinesecs":4364,"os":"Win","osversion":"6.1.7601.1","release":"1.2.4","selfDeaf":false,"selfMute":true,"session":300,"suppress":false,"tcponly":false,"userid":2438,"version":66052,"udpPing":24.04,"tcpPing":24.97},{"bytespersec":0,"channel":383,"comment":"","context":"","deaf":false,"identity":"","idlesecs":3095,"mute":false,"name":"Tobias","onlinesecs":7952,"os":"Win","osversion":"6.1.7601.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":325,"suppress":false,"tcponly":false,"userid":3788,"version":66056,"udpPing":15.76,"tcpPing":22.77}],"teams":[{"description":"Welcome! <\/b>\n

This server requires registration<\/span> in order to move from Root.Please register yourself by selecting Self --> Register in the menu bar, or right-clicking on your nick and choose Register.<\/b><\/p>","id":0,"name":"Root","parent":-1,"position":0,"temporary":false},{"description":"","id":1,"name":"AFK","parent":0,"position":0,"temporary":false},{"description":"","id":8,"name":"Utlånade Kanaler","parent":0,"position":100,"temporary":false},{"description":"Endast För Skyttegrav admins!<\/b>","id":9,"name":"Admins Corner (private)","parent":0,"position":200,"temporary":false},{"description":"","id":38,"name":"Admins","parent":9,"position":11,"temporary":false},{"description":"","id":43,"name":"Headadmins Corner","parent":9,"position":60,"temporary":false},{"description":"","id":44,"name":"Supervisors Corner - Polska Riksdagen","parent":9,"position":70,"temporary":false},{"description":"Spelföreningen bakom Skyttegrav.se","id":150,"name":"United Gaming","parent":9,"position":0,"temporary":false},{"description":"","id":151,"name":"Möte","parent":150,"position":0,"temporary":false},{"description":"","id":152,"name":"Styrelsemöte","parent":150,"position":0,"temporary":false},{"description":"Endast För SweClockers.com admins!<\/b>","id":187,"name":"Sweclockers","parent":9,"position":0,"temporary":false},{"description":"","id":188,"name":"Allmän Admin","parent":187,"position":0,"temporary":false},{"description":"","id":189,"name":"Privat Admin (Endast inbjudan)","parent":187,"position":0,"temporary":false},{"description":"","id":214,"name":"Allmän Admin (Delad)","parent":9,"position":10,"temporary":false},{"description":"","id":183,"name":"SweClockers","parent":0,"position":10,"temporary":false},{"description":"Här kommer våra stream och webtv att sändas! \n

\n

Besök www.swec.tv och avnjut sändningen, vill du deltaga så skicka ett meddelande i mumble till en admin som antingen kan flytta dig eller ge dig lösenordet. Vi kommer att både casta och spela olika spel löpande.<\/p>\n

\n

I kanalen gäller strikt ljud och informationskontroll, akta er alltså för att inte säga för mycket.<\/p>","id":358,"name":"SweC TV Studio (private)","parent":183,"position":100,"temporary":false},{"description":"Vill ni deltaga i SweC TV? \n

\n

Sätt er i detta rummet så kommer vi att dra in er i cast rummet vid tillfälle, ni är varmt välkomna att titta på www.swec.tv<\/a> medan ni väntar! <\/p>\n

\n

När ni kommer in i cast kanalen är ni automatiskt satta till "mute", vi kommer att ändra det när ni kommer in.<\/p>\n

\n

\n

","id":402,"name":"SweC TV lobby (wait for invite to cast room)","parent":183,"position":200,"temporary":false},{"description":"Hjälp med Mumble? Läs här -> Mumble tråd på SweClockers<\/a>","id":421,"name":"Spelkvällar","parent":183,"position":300,"temporary":false},{"description":"Här har ni nyttig information om spelkvällarna! \n

SpelClockers<\/a> Spelkvällar<\/p>\n

Sweclockers Steam chat grupp<\/a><\/p>\n

<\/p>","id":426,"name":"Allmän samlingskanal - Kom hit för råd och vägledning","parent":421,"position":0,"temporary":false},{"description":"","id":427,"name":"Reserv #2","parent":421,"position":20,"temporary":false},{"description":"","id":429,"name":"Grupp 1","parent":427,"position":10,"temporary":false},{"description":"","id":430,"name":"Grupp 2","parent":427,"position":20,"temporary":false},{"description":"","id":449,"name":"Grupp 3","parent":427,"position":30,"temporary":false},{"description":"","id":450,"name":"Grupp 4","parent":427,"position":40,"temporary":false},{"description":"","id":453,"name":"Rematch och rekryt Lobby","parent":427,"position":0,"temporary":false},{"description":"","id":455,"name":"Grupp 5","parent":427,"position":50,"temporary":false},{"description":"","id":456,"name":"Grupp 6","parent":427,"position":60,"temporary":false},{"description":"","id":428,"name":"12h stream med SpelClockers - Lördag 28 feb","parent":421,"position":10,"temporary":false},{"description":"","id":432,"name":"MechWarrior Online","parent":428,"position":10,"temporary":false},{"description":"","id":433,"name":"Grupp 2","parent":428,"position":20,"temporary":false},{"description":"","id":434,"name":"Grupp 3","parent":428,"position":30,"temporary":false},{"description":"","id":443,"name":"Grupp 4","parent":428,"position":40,"temporary":false},{"description":"","id":444,"name":"Grupp 5","parent":428,"position":50,"temporary":false},{"description":"","id":451,"name":"Samlingsal","parent":428,"position":0,"temporary":false},{"description":"","id":459,"name":"Grupp 6","parent":428,"position":60,"temporary":false},{"description":"","id":436,"name":"Reserv #3","parent":421,"position":30,"temporary":false},{"description":"","id":437,"name":"Grupp 1","parent":436,"position":10,"temporary":false},{"description":"","id":438,"name":"Grupp 2","parent":436,"position":20,"temporary":false},{"description":"","id":439,"name":"Grupp 3","parent":436,"position":30,"temporary":false},{"description":"","id":440,"name":"Grupp 4","parent":436,"position":40,"temporary":false},{"description":"","id":441,"name":"Grupp 5","parent":436,"position":50,"temporary":false},{"description":"","id":442,"name":"Grupp 6","parent":436,"position":60,"temporary":false},{"description":"","id":452,"name":"Rematch och rekryt Lobby","parent":436,"position":0,"temporary":false},{"description":"","id":190,"name":"Snack-kanaler","parent":0,"position":20,"temporary":false},{"description":"","id":2,"name":"Allmänt Snack","parent":190,"position":100,"temporary":false},{"description":"","id":10,"name":"Allmänt Snack - Rum #1","parent":2,"position":0,"temporary":false},{"description":"","id":11,"name":"Allmänt Snack - Rum #2","parent":2,"position":0,"temporary":false},{"description":"","id":12,"name":"Allmänt Snack - Rum #3","parent":2,"position":0,"temporary":false},{"description":"","id":13,"name":"Allmänt Snack - Rum #4","parent":2,"position":0,"temporary":false},{"description":"","id":14,"name":"Utvisningsbåset","parent":2,"position":1000,"temporary":false},{"description":"","id":84,"name":"Allmänt Snack - Rum #5","parent":2,"position":0,"temporary":false},{"description":"","id":85,"name":"Allmänt Snack - Rum #6","parent":2,"position":0,"temporary":false},{"description":"","id":86,"name":"Allmänt Snack - Vuxenkanal #1","parent":2,"position":0,"temporary":false},{"description":"","id":87,"name":"Allmänt Snack - Vuxenkanal #2","parent":2,"position":0,"temporary":false},{"description":"","id":88,"name":"Allmänt Snack - Vuxenkanal #3 30 Plus","parent":2,"position":0,"temporary":false},{"description":"","id":205,"name":"Välkommen in - Allmän samlingskanal","parent":190,"position":0,"temporary":false},{"description":"","id":193,"name":"Startbanan (registrera er själva)","parent":0,"position":999,"temporary":false},{"description":"","id":542,"name":"Spelkanaler","parent":0,"position":30,"temporary":false},{"description":"Här spelar vi Battlefield och Project Reality.<\/span>\n

Forumlänk: http:\/\/www.skyttegrav.se\/viewforum.php?f=8<\/a><\/p>","id":3,"name":"Battlefield","parent":542,"position":10,"temporary":false},{"description":"","id":119,"name":"Battlefield 3","parent":3,"position":0,"temporary":false},{"description":"","id":479,"name":"Grupp 1","parent":119,"position":0,"temporary":false},{"description":"","id":480,"name":"Grupp 2","parent":119,"position":0,"temporary":false},{"description":"","id":122,"name":"Battlefield 2","parent":3,"position":0,"temporary":false},{"description":"","id":16,"name":"Skyttegrav #2 Project Reality Coop","parent":122,"position":0,"temporary":false},{"description":"","id":47,"name":"Team #1","parent":16,"position":10,"temporary":false},{"description":"","id":54,"name":"Team #2","parent":16,"position":20,"temporary":false},{"description":"","id":17,"name":"Skyttegrav #1 BF2 Ranked","parent":122,"position":0,"temporary":false},{"description":"","id":384,"name":"Skyttegrav #3 Project Reality","parent":122,"position":0,"temporary":false},{"description":"","id":385,"name":"Team #1","parent":384,"position":0,"temporary":false},{"description":"","id":386,"name":"Team #2","parent":384,"position":0,"temporary":false},{"description":"SweClockers.com 64 HC Conquest:<\/b> \n

http:\/\/battlelog.battlefield.com\/bf4\/servers\/show\/pc\/dc5cdf97-7b5b-4b4f-962f-e6b74b7a9ad5\/SweClockers-com-64-HC-Conquest\/<\/a><\/a>SweClockers.com 32 Custom Rush\/Obliteration:<\/span><\/b> <\/p>\n

http:\/\/battlelog.battlefield.com\/bf4\/servers\/show\/pc\/b7c21efd-25ab-4306-a2ff-4342f41850bc\/SweClockers-com-32-Custom-Rush-Obliteration\/<\/a><\/p>","id":389,"name":"Battlefield 4","parent":3,"position":0,"temporary":false},{"description":"http:\/\/www.sweclockers.com\/forum\/149-spelclockers\/1247307-bf4-sweclockers-battlefield-servrar\/<\/a>","id":148,"name":"SweClockers 64 HC Conquest","parent":389,"position":10,"temporary":false},{"description":"","id":149,"name":"Team #1","parent":148,"position":0,"temporary":false},{"description":"","id":198,"name":"Squad #1","parent":149,"position":0,"temporary":false},{"description":"","id":199,"name":"Squad #2","parent":149,"position":0,"temporary":false},{"description":"","id":202,"name":"Squad #3","parent":149,"position":0,"temporary":false},{"description":"","id":194,"name":"Team #2","parent":148,"position":10,"temporary":false},{"description":"","id":200,"name":"Squad #1","parent":194,"position":0,"temporary":false},{"description":"","id":201,"name":"Squad #2","parent":194,"position":0,"temporary":false},{"description":"","id":203,"name":"Squad #3","parent":194,"position":0,"temporary":false},{"description":"","id":390,"name":"Grupp 1","parent":389,"position":110,"temporary":false},{"description":"","id":391,"name":"Grupp 2","parent":389,"position":120,"temporary":false},{"description":"","id":392,"name":"Grupp 3","parent":389,"position":130,"temporary":false},{"description":"","id":393,"name":"Söker spelare","parent":389,"position":0,"temporary":false},{"description":"http:\/\/www.sweclockers.com\/forum\/149-spelclockers\/1247307-bf4-sweclockers-battlefield-servrar\/<\/a>","id":472,"name":"SweClockers 32 Vanilla maps","parent":389,"position":20,"temporary":false},{"description":"","id":473,"name":"Team #1","parent":472,"position":0,"temporary":false},{"description":"","id":475,"name":"Squad #1","parent":473,"position":0,"temporary":false},{"description":"","id":476,"name":"Squad #2","parent":473,"position":0,"temporary":false},{"description":"","id":474,"name":"Team #2","parent":472,"position":0,"temporary":false},{"description":"","id":477,"name":"Squad #1","parent":474,"position":0,"temporary":false},{"description":"","id":478,"name":"Squad #2","parent":474,"position":0,"temporary":false},{"description":"","id":560,"name":"Battlefield Hardline Beta","parent":3,"position":4,"temporary":false},{"description":"","id":561,"name":"Grupp 1","parent":560,"position":1,"temporary":false},{"description":"","id":562,"name":"Grupp 2","parent":560,"position":2,"temporary":false},{"description":"","id":563,"name":"Grupp 3","parent":560,"position":3,"temporary":false},{"description":"","id":564,"name":"Söker spelare","parent":560,"position":0,"temporary":false},{"description":"","id":569,"name":"Bad Company 2","parent":3,"position":0,"temporary":false},{"description":"","id":570,"name":"Grupp 1","parent":569,"position":1,"temporary":false},{"description":"","id":571,"name":"Grupp 2","parent":569,"position":2,"temporary":false},{"description":"","id":4,"name":"Call of Duty","parent":542,"position":20,"temporary":false},{"description":"","id":23,"name":"Call of Duty 4","parent":4,"position":30,"temporary":false},{"description":"","id":25,"name":"Call of Duty - Modern Warfare 2","parent":4,"position":50,"temporary":false},{"description":"","id":95,"name":"Party 1","parent":25,"position":100,"temporary":false},{"description":"","id":96,"name":"Party 2","parent":25,"position":200,"temporary":false},{"description":"","id":139,"name":"Call of Duty - Modern Warfare 3","parent":4,"position":0,"temporary":false},{"description":"","id":140,"name":"Party 1","parent":139,"position":0,"temporary":false},{"description":"","id":212,"name":"Party 2","parent":139,"position":0,"temporary":false},{"description":"","id":246,"name":"Call of Duty - Black Ops 2","parent":4,"position":0,"temporary":false},{"description":"","id":254,"name":"Party 1","parent":246,"position":0,"temporary":false},{"description":"","id":255,"name":"Party 2","parent":246,"position":0,"temporary":false},{"description":"","id":395,"name":"Call of Duty - Ghosts","parent":4,"position":0,"temporary":false},{"description":"","id":396,"name":"Hardcore","parent":395,"position":0,"temporary":false},{"description":"","id":398,"name":"Party 1","parent":396,"position":0,"temporary":false},{"description":"","id":399,"name":"Party 2","parent":396,"position":0,"temporary":false},{"description":"","id":397,"name":"Softcore","parent":395,"position":0,"temporary":false},{"description":"","id":554,"name":"Call of Duty - Advance Warfare","parent":4,"position":0,"temporary":false},{"description":"","id":555,"name":"Party 1","parent":554,"position":0,"temporary":false},{"description":"","id":556,"name":"Party 2","parent":554,"position":0,"temporary":false},{"description":"","id":5,"name":"Counter-Strike","parent":542,"position":30,"temporary":false},{"description":"","id":28,"name":"Skyttegrav #1 - D2 INF Nuke","parent":5,"position":10,"temporary":false},{"description":"","id":30,"name":"Skyttegrav #3 - WC3FT ","parent":5,"position":30,"temporary":false},{"description":"","id":178,"name":"Global Offensive","parent":5,"position":0,"temporary":false},{"description":"","id":179,"name":"Competitive","parent":178,"position":20,"temporary":false},{"description":"","id":483,"name":"Rum #1","parent":179,"position":10,"temporary":false},{"description":"","id":484,"name":"Rum #2","parent":179,"position":20,"temporary":false},{"description":"","id":180,"name":"Rum #2","parent":178,"position":200,"temporary":false},{"description":"","id":181,"name":"Skyttegrav #3 Classic Competitive","parent":178,"position":0,"temporary":false},{"description":"","id":527,"name":"Rum #1","parent":178,"position":100,"temporary":false},{"description":"","id":7,"name":"Övriga spel","parent":542,"position":60,"temporary":false},{"description":"","id":345,"name":"Bilspel och racingsims (F1 Dirt ETS mm)","parent":7,"position":0,"temporary":false},{"description":"","id":537,"name":"Euro Truck Sim","parent":345,"position":0,"temporary":false},{"description":"","id":485,"name":"Voxel Spel","parent":7,"position":0,"temporary":false},{"description":"","id":486,"name":"7 days to die ","parent":485,"position":0,"temporary":false},{"description":"","id":487,"name":"Space Engineers","parent":485,"position":0,"temporary":false},{"description":"","id":536,"name":"Everquest landmark","parent":485,"position":0,"temporary":false},{"description":"","id":488,"name":"MMO","parent":7,"position":0,"temporary":false},{"description":"","id":394,"name":"Final Fantasy XIV - A Realm Reborn","parent":488,"position":0,"temporary":false},{"description":"","id":418,"name":"Rum #1","parent":394,"position":0,"temporary":false},{"description":"","id":419,"name":"Rum #2","parent":394,"position":0,"temporary":false},{"description":"","id":489,"name":"Mortal Online","parent":488,"position":0,"temporary":false},{"description":"","id":490,"name":"World of Warcraft","parent":488,"position":0,"temporary":false},{"description":"","id":491,"name":"Party 1","parent":490,"position":0,"temporary":false},{"description":"","id":492,"name":"Party 2","parent":490,"position":0,"temporary":false},{"description":"","id":495,"name":"Guild Wars 2","parent":488,"position":0,"temporary":false},{"description":"","id":513,"name":"Planetside 2","parent":488,"position":0,"temporary":false},{"description":"","id":529,"name":"Aion","parent":488,"position":0,"temporary":false},{"description":"First-person shooter & Third-person shooter","id":498,"name":"FPS och TPS","parent":7,"position":0,"temporary":false},{"description":"","id":207,"name":"Borderlands 2","parent":498,"position":0,"temporary":false},{"description":"","id":218,"name":"Portal 2","parent":498,"position":0,"temporary":false},{"description":"","id":232,"name":"Infestation Survivor Stories","parent":498,"position":0,"temporary":false},{"description":"Clanen vi har till Wipe heter \n

SKYTTEGRAV<\/p>\n

\n

Joina denna för att teama up.<\/p>","id":240,"name":"Grupp 1","parent":232,"position":0,"temporary":false},{"description":"","id":241,"name":"Grupp 2","parent":232,"position":1,"temporary":false},{"description":"","id":376,"name":"Skyttegrav KLAN SPEL","parent":232,"position":1,"temporary":false},{"description":"","id":499,"name":"ArmA","parent":498,"position":0,"temporary":false},{"description":"","id":500,"name":"Natural Selection 2","parent":498,"position":0,"temporary":false},{"description":"","id":502,"name":"Left 4 Dead","parent":498,"position":0,"temporary":false},{"description":"","id":514,"name":"Red Orchestra 2","parent":498,"position":0,"temporary":false},{"description":"","id":515,"name":"Allies","parent":514,"position":0,"temporary":false},{"description":"","id":516,"name":"Axis","parent":514,"position":0,"temporary":false},{"description":"","id":518,"name":"Mount and Blade - Warband","parent":498,"position":0,"temporary":false},{"description":"","id":519,"name":"Persistent World","parent":518,"position":0,"temporary":false},{"description":"","id":520,"name":"Mount and blade Vanilla","parent":518,"position":0,"temporary":false},{"description":"","id":541,"name":"Insurgency","parent":498,"position":0,"temporary":false},{"description":"","id":567,"name":"Evolve","parent":498,"position":0,"temporary":false},{"description":"","id":504,"name":"RTS och grand strategy","parent":7,"position":0,"temporary":false},{"description":"","id":356,"name":"Starcraft","parent":504,"position":0,"temporary":false},{"description":"","id":505,"name":"Company of Heroes","parent":504,"position":0,"temporary":false},{"description":"","id":506,"name":"Europa Universalis ","parent":504,"position":0,"temporary":false},{"description":"","id":534,"name":"Rum #1","parent":506,"position":0,"temporary":false},{"description":"","id":535,"name":"Rum #2","parent":506,"position":0,"temporary":false},{"description":"","id":523,"name":"Age of Empires","parent":504,"position":0,"temporary":false},{"description":"här spelar man Civilization<\/span><\/b> V<\/span><\/a>","id":533,"name":"Civilization V","parent":504,"position":0,"temporary":false},{"description":"Spel som är gratis att köra.","id":510,"name":"Free to play","parent":7,"position":0,"temporary":false},{"description":"","id":375,"name":"Mechwarrior Online","parent":510,"position":0,"temporary":false},{"description":"","id":511,"name":"War Thunder","parent":510,"position":0,"temporary":false},{"description":"","id":526,"name":"Tank","parent":511,"position":0,"temporary":false},{"description":"","id":538,"name":"Flyg","parent":511,"position":0,"temporary":false},{"description":"","id":512,"name":"World of Tanks","parent":510,"position":0,"temporary":false},{"description":"","id":530,"name":"Town of salem","parent":510,"position":0,"temporary":false},{"description":"","id":521,"name":"Hack and slash","parent":7,"position":0,"temporary":false},{"description":"","id":167,"name":"Diablo 3","parent":521,"position":0,"temporary":false},{"description":"","id":336,"name":"Path of Exile","parent":521,"position":0,"temporary":false},{"description":"","id":383,"name":"Torchlight II","parent":521,"position":0,"temporary":false},{"description":"","id":522,"name":"MOBA","parent":7,"position":0,"temporary":false},{"description":"","id":6,"name":"League of Legends","parent":522,"position":0,"temporary":false},{"description":"","id":565,"name":"Grupp 1","parent":6,"position":5,"temporary":false},{"description":"","id":566,"name":"Grupp 2","parent":6,"position":10,"temporary":false},{"description":"","id":153,"name":"Dota 2","parent":522,"position":0,"temporary":false},{"description":"","id":236,"name":"Grupp 1","parent":153,"position":0,"temporary":false},{"description":"","id":237,"name":"Grupp 2","parent":153,"position":0,"temporary":false},{"description":"","id":532,"name":"Smite","parent":522,"position":0,"temporary":false},{"description":"","id":528,"name":"Tabletop Simulator","parent":7,"position":0,"temporary":false},{"description":"","id":559,"name":"Kerbal Space Program","parent":7,"position":0,"temporary":false},{"description":"","id":156,"name":"Minecraft","parent":542,"position":50,"temporary":false},{"description":"Serverip: mc.hemligastugan.com Dynmap \/ Regler: http:\/\/www.hemligastugan.com\/minecraft\/# <\/a>","id":157,"name":"Hemligastugan","parent":156,"position":0,"temporary":false},{"description":"Låst till admins för Hemligastugan.","id":388,"name":"Admin","parent":157,"position":2,"temporary":false},{"description":"","id":416,"name":"Grupp 1","parent":157,"position":0,"temporary":false},{"description":"","id":417,"name":"Grupp 2","parent":157,"position":0,"temporary":false},{"description":"Inte bara en samling moddar.. Även med egenutvecklade MODS!<\/b> \n

MC Version 1.7.10 \/ Skyttegrav Modpack 2.0<\/p>\n

Hemsida: http:\/\/mc.skyttegrav.se<\/a><\/p>\n

Info & registrering: http:\/\/www.skyttegrav.se\/index.php?\/topic\/5-skyttegravse-custom-modpack<\/a><\/p>\n

Server IP: mc.skyttegrav.se<\/p>\n

Dynmap: http:\/\/mc.skyttegrav.se\/dynmap<\/a><\/p>","id":158,"name":"Skyttegrav Modpack","parent":156,"position":0,"temporary":false},{"description":"","id":539,"name":"Rum 1","parent":158,"position":0,"temporary":false},{"description":"","id":540,"name":"Rum 2","parent":158,"position":0,"temporary":false},{"description":"","id":170,"name":"Day Z","parent":542,"position":40,"temporary":false},{"description":"","id":176,"name":"Grupp 1","parent":170,"position":10,"temporary":false},{"description":"","id":177,"name":"Grupp 2","parent":170,"position":20,"temporary":false},{"description":"","id":196,"name":"Grupp 3","parent":170,"position":30,"temporary":false},{"description":"","id":197,"name":"Grupp 4","parent":170,"position":40,"temporary":false},{"description":"Här söker ni spelare för ert spel.\n

\n

Skapa en egen kanal i denna med speltitel.<\/p>","id":192,"name":"Söker spelare","parent":542,"position":0,"temporary":false},{"description":"Här kan man sitta och titta på streams, E-evenemang eller liknande. Subkanaler kommer att skapas av admins men du får gärna tipsa om ett evenemang.","id":543,"name":"Event-kanaler","parent":0,"position":11,"temporary":false},{"description":"","id":544,"name":"MS Presskonferens","parent":543,"position":10,"temporary":false},{"description":"","id":546,"name":"Titta och diskutera","parent":544,"position":5,"temporary":false},{"description":"","id":547,"name":"Tysta rummet","parent":544,"position":10,"temporary":false},{"description":"","id":548,"name":"Skyttegrav Free-2-Play Spelkvällar","parent":543,"position":50,"temporary":false},{"description":"","id":553,"name":"Trackmania 29 Okt","parent":548,"position":0,"temporary":false},{"description":"","id":549,"name":"Rum #1","parent":553,"position":0,"temporary":false},{"description":"","id":550,"name":"Rum #2","parent":553,"position":0,"temporary":false},{"description":"","id":558,"name":"DreamHack","parent":543,"position":100,"temporary":false}],"x_connecturl":"mumble:\/\/mumble.skyttegrav.se\/?version=1.2.0","x_gtmurmur_connectport":"64738","x_gtmurmur_doclen":224063,"x_gtmurmur_max_users":"250","x_gtmurmur_server_version":"1.2.8"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Mumble/2_response.txt b/gameq/tests/Protocols/Providers/Mumble/2_response.txt new file mode 100644 index 0000000..f7629fa --- /dev/null +++ b/gameq/tests/Protocols/Providers/Mumble/2_response.txt @@ -0,0 +1,1718 @@ +{ + "id": 1, + "name": "KBMOD.com", + "x_connecturl": "mumble://voice.kbmod.com:64738/?version=1.2.0", + "x_gtmurmur_connectport": "64738", + "x_gtmurmur_max_users": "100", + "x_gtmurmur_server_version": "1.2.4", + "x_gtmurmur_doclen": 246824, + "root": { + "channels": [ + { + "channels": [], + "description": "", + "id": 1, + "name": "AFK", + "parent": 0, + "position": -1, + "temporary": false, + "users": [ + { + "bytespersec": 0, + "channel": 1, + "comment": "https://www.youtube.com/watch?v=NC7VO7XgpJk\n


\n

http://members.iracing.com/jforum/posts/list/3210432.page

", + "context": "", + "deaf": false, + "identity": "", + "idlesecs": 281990, + "mute": false, + "name": "Peeble", + "onlinesecs": 281990, + "os": "Win", + "osversion": "6.2.9200.1", + "release": "1.2.4", + "selfDeaf": false, + "selfMute": false, + "session": 21, + "suppress": true, + "tcponly": false, + "userid": 55, + "version": 66052, + "udpPing": 51.87, + "tcpPing": 54.78 + } +, + { + "bytespersec": 0, + "channel": 1, + "comment": "Someone carry me from the depths of Gold 1. Please. Can and will return sexual favors for it. \n

Battlenet ID xFantoM#1761

", + "context": "", + "deaf": false, + "identity": "", + "idlesecs": 22792, + "mute": false, + "name": "xFantoM", + "onlinesecs": 615992, + "os": "Win", + "osversion": "6.1.7601.1", + "release": "1.2.5", + "selfDeaf": true, + "selfMute": true, + "session": 56, + "suppress": true, + "tcponly": false, + "userid": 33, + "version": 66053, + "udpPing": 125.01, + "tcpPing": 147.22 + } +, + { + "bytespersec": 0, + "channel": 1, + "comment": "twitter.com/hutchison15\n

twitch.tv/hutchison15

\n

bhutchison.us

", + "context": "", + "deaf": false, + "identity": "", + "idlesecs": 98511, + "mute": false, + "name": "hutchison15", + "onlinesecs": 98511, + "os": "Win", + "osversion": "6.2.9200.1", + "release": "1.2.8", + "selfDeaf": false, + "selfMute": false, + "session": 75, + "suppress": true, + "tcponly": false, + "userid": 161, + "version": 66056, + "udpPing": 64.49, + "tcpPing": 63.47 + } +, + { + "bytespersec": 0, + "channel": 1, + "comment": "Someone do my Technical Drawings", + "context": "", + "deaf": false, + "identity": "", + "idlesecs": 780, + +|| + "mute": false, + "name": "Hunter", + "onlinesecs": 2140, + "os": "Win", + "osversion": "6.2.9200.1", + "release": "1.2.8", + "selfDeaf": false, + "selfMute": false, + "session": 112, + "suppress": true, + "tcponly": false, + "userid": 221, + "version": 66056, + "udpPing": 55.26, + "tcpPing": 69.54 + } +, + { + "bytespersec": 0, + "channel": 1, + "comment": "always down to spawn a conducive environment to engage in civil discussion through adequate mediums such as twitter\n


\n

and 10-mans.

", + "context": "", + "deaf": false, + "identity": "", + "idlesecs": 2237, + "mute": false, + "name": "Aniion", + "onlinesecs": 2260, + "os": "Win", + "osversion": "6.2.9200.1", + "release": "1.2.8", + "selfDeaf": true, + "selfMute": true, + "session": 124, + "suppress": true, + "tcponly": false, + "userid": 28, + "version": 66056, + "udpPing": 55.65, + "tcpPing": 58.20 + } +, + { + "bytespersec": 0, + "channel": 1, + "comment": "", + "context": "", + "deaf": false, + "identity": "", + "idlesecs": 901, + "mute": false, + "name": "SkyShark", + "onlinesecs": 901, + "os": "Win", + "osversion": "6.1.7601.1", + "release": "1.2.8", + " +|| +selfDeaf": true, + "selfMute": true, + "session": 125, + "suppress": true, + "tcponly": false, + "userid": 108, + "version": 66056, + "udpPing": 45.76, + "tcpPing": 50.17 + } +, + { + "bytespersec": 0, + "channel": 1, + "comment": "", + "context": "", + "deaf": false, + "identity": "", + "idlesecs": 28863, + "mute": false, + "name": "AverageJoe", + "onlinesecs": 28868, + "os": "Win", + "osversion": "6.1.7601.1", + "release": "1.2.8", + "selfDeaf": false, + "selfMute": true, + "session": 146, + "suppress": true, + "tcponly": false, + "userid": 96, + "version": 66056, + "udpPing": 143.90, + "tcpPing": 142.09 + } +, + { + "bytespersec": 0, + "channel": 1, + "comment": "twitter \n

", + "context": "", + "deaf": false, + "identity": "", + "idlesecs": 5215, + "mute": false, + "name": "EtchyaSketch", + "onlinesecs": 5215, + "os": "Win", + "osversion": "6.1.7601.1", + "release": "1.2.5", + "selfDeaf": false, + "selfMute": false, + "session": 163, + "suppress": true, + "tcponly": false, + "userid": 78, + "version": 66053, + "udpPing": 49.78, + "tcpPing": 56.60 + } +, + { + "bytespersec": 0, + "channel": 1, + "comment": "", + "context": "", + "deaf": false, + "identity": "", + "idlesecs": 54352, + "mute": false, + "name": "SanguisAngelus", + "onlinesecs": 73788, + "os": "Win", + "osversion": "6.1.7601.1", + "release": "1.2.8", + "selfDeaf": true, + "selfMute": true, + "session": 172, + "suppress": true, + "tcponly": false, + "userid": 224, + "version": 66056, + "udpPing": 49.22, + "tcpPing": 51.04 + } +, + { + "bytespersec": 0, + "channel": 1, + "comment": "Disgusin", + "context": "", + "deaf": false, + "identity": "", + "idlesecs": 12135, + "mute": false, + "name": "arbo96", + "onlinesecs": 12136, + "os": "Win", + "osversion": "6.1.7601.1", + "release": "1.2.7", + "selfDeaf": false, + "selfMute": false, + "session": 191, + "suppress": true, + "tcponly": false, + "userid": 62, + "version": 66055, + "udpPing": 54.75, + "tcpPing": 56.15 + } + ] + }, + { + "channels": [ + { + "channels": [], + "description": "", + "id": 21, + "name": "1", + "parent": 2, + "position": 0, + "temporary": false, + "users": [] + }, + { + "channels": [], + "description": "", + "id": 22, + "name": "2", + "parent": 2, + "position": 0, + "temporary": false, + "users": [] + }, + { + "channels": [], + "description": "", + "id": 23, + "name": "3", + "parent": 2, + "position": 0, + "temporary": false, + "users": [] + } + ], + "description": "", + "id": 2, + "name": "General Discussion", + "parent": 0, + "position": -1, + "temporary": false, + "users": [] + }, + { + "channels": [ + { + "channels": [ + { + "channels": [], + "description": "", + "id": 17, + "name": "1", + "parent": 4, + "position": 0, + "temporary": false, + "users": [] + }, + { + "channels": [], + "description": "", + "id": 18, + "name": "2", + "parent": 4, + "position": 0, + "temporary": false, + "users": [] + }, + { + "channels": [], + "description": "", + "id": 45, + "name": "3", + "parent": 4, + "position": 0, + "temporary": false, + "users": [] + }, + { + "channels": [], + "description": "", + "id": 46, + "name": "4", + "parent": 4, + "position": 0, + "temporary": false, + "users": [] + }, + { + "channels": [], + "description": "", + "id": 47, + +|| + "name": "5", + "parent": 4, + "position": 0, + "temporary": false, + "users": [] + } + ], + "description": "", + "id": 4, + "name": "Battlefield 4", + "parent": 3, + "position": 0, + "temporary": false, + "users": [] + }, + { + "channels": [ + { + "channels": [], + "description": "", + "id": 24, + "name": "1", + "parent": 5, + "position": 0, + "temporary": false, + "users": [] + }, + { + "channels": [], + "description": "", + "id": 25, + "name": "2", + "parent": 5, + "position": 0, + "temporary": false, + "users": [] + }, + { + "channels": [], + "description": "", + "id": 100, + "name": "CoD4", + "parent": 5, + "position": 0, + "temporary": false, + "users": [] + } + ], + "description": "", + "id": 5, + "name": "Call of Duty", + "parent": 3, + "position": 0, + "temporary": false, + "users": [] + }, + { + "channels": [ + { + "channels": [ + { + "channels": [], + "description": "", + "id": 7, + "name": "1", + "parent": 72, + "position": 0, + "temporary": false, + "users": [] + }, + { + "channels": [], + "description": "", + "id": 9, + "name": "2", + "parent": 72, + "position": 0, + "temporary": false, + "users": [] + } + ], + "description": "", + "id": 72, + "name": "Casual", + "parent": 6, + "position": 0, + "temporary": false, + "users": [] + }, + { + "channels": [ + { + "channels": [], + "description": "", + "id": 8, + "name": "2", + "parent": 74, + "position": 0, + "temporary": false, + "users": [] + }, + { + "channels": [], + "description": "", + "id": 77, + "name": "1", + "parent": 74, + "position": 0, + "temporary": false, + "users": [ + { + "bytespersec": 0, + "channel": 77, + "comment": "Got places to go, got people to see.", + "context": "", + "deaf": false, + "identity": "", + "idlesecs": 2180, + "mute": false, + "name": "Draggio", + "onlinesecs": 2180, + "os": "Win", + "osversion": "6.1.7601.1", + "release": "1.2.8", + "selfDeaf": false, + "selfMute": false, + "session": 3, + "suppress": false, + "tcponly": false, + "userid": 194, + "version": 66056, + "udpPing": 44.72, + "tcpPing": 46.02 + } + ] + }, + { + "channels": [], + "description": "", + "id": 78, + "name": "3", + "parent": 74, + "position": 0, + "temporary": false, + "users": [ + { + "bytespersec": 0, + "channel": 78, + "comment": "", + "context": "", + "deaf": false, + "identity": "", + "idlesecs": 16, + "mute": false, + "name": "SWEDEN", + "onlinesecs": 2155, + "os": "Win", + "osversion": "6.1.7601.1", + "release": "1.2.8", + "selfDeaf": false, + "selfMute": false, + "session": 13, + "suppress": false, + "tcponly": false, + "userid": -1, + "version": 66056, + "udpPing": 47.59, + "tcpPing": 46.44 + } +, + { + "bytespersec": 0, + "channel": 78, + "comment": "", + "context": "", + "deaf": false, + "identity": "", + "idlesecs": 12, + "mute": false, + "name": "Trash", + "onlinesecs": 2008, + "os": "Win", + "osversion": "6.1.7601.1", + "release": "1.2.8", + "selfDeaf": false, + "selfMute": false, + "session": 91, + "suppress": false, + "tcponly": false, + "userid": 212, + "version": 66056, + "udpPing": 52.54, + "tcpPing": 54.81 + } +, + { + "bytespersec": 0, + "channel": 78, + "comment": "", + "context": "", + "deaf": false, + "identity": "", + "idlesecs": 3, + "mute": false, + "name": "APL", + "onlinesecs": 2189, + "os": "Win", + "osversion": "6.1.7601.1", + "release": "1.2.7", + "selfDeaf": false, + "selfMute": false, + "session": 114, + "suppress": false, + "tcponly": false, + "userid": 157, + "version": 66055, + "udpPing": 47.83, + "tcpPing": 44.76 + } +, + { + "bytespersec": 0, + "channel": 78, + "comment": "", + "context": "", + "deaf": false, + "identity": "", + "idlesecs": 4, + "mute": false, + "name": "Spoob", + "onlinesecs": 2123, + "os": "Win", + "osversion": "6.2.9200.1", + "release": "1.2.8", + "selfDeaf": false, + "selfMute": false, + "session": 144, + "suppress": false, + "tcponly": false, + "userid": -1, + "version": 66056, + "udpPing": 38.05, + "tcpPing": 40.28 + } + ] + }, + { + "channels": [], + "description": "", + "id": 79, + "name": "4", + "parent": 74, + "position": 0, + "temporary": false, + "users": [] + }, + { + "channels": [], + "description": "", + "id": 81, + "name": "Lobby - Waiting Room", + "parent": 74, + "position": -1, + "temporary": false, + "users": [] + }, + { + "channels": [], + "description": "", + "id": 83, + "name": "5", + "parent": 74, + "position": 0, + "temporary": false, + "users": [] + }, + { + "channels": [], + "description": "", + "id": 84, + "name": "6", + "parent": 74, + "position": 0, + "temporary": false, + "users": [] + }, + { + "channels": [], + "description": "", + "id": 97, + "name": "7", + "parent": 74, + "position": 0, + "temporary": false, + "users": [ + { + "bytespersec": 0, + "channel": 97, + "comment": "", + "context": "", + "deaf": false, + "identity": "", + "idlesecs": 512, + "mute": false, + "name": "Haas", + "onlinesecs": 1569, + "os": "Win", + "osversion": "6.1.7601.1", + "release": "1.2.8", + "selfDeaf": false, + "selfMute": false, + "session": 184, + "suppress": false, + "tcponly": false, + "userid": -1, + "version": 66056, + "udpPing": 32.07, + "tcpPing": 36.14 + } + ] + }, + { + "channels": [], + "description": "", + "id": 98, + "name": "8", + "parent": 74, + "position": 0, + +|| + "temporary": false, + "users": [] + } + ], + "description": "", + "id": 74, + "name": "Competitive", + "parent": 6, + "position": 0, + "temporary": false, + "users": [] + } + ], + "description": "", + "id": 6, + "name": "Counter-Strike", + "parent": 3, + "position": 0, + "temporary": false, + "users": [ + { + "bytespersec": 0, + "channel": 6, + "comment": "", + "context": "", + "deaf": false, + "identity": "", + "idlesecs": 3065, + "mute": false, + "name": "roma4356", + "onlinesecs": 41987, + "os": "Win", + "osversion": "6.2.9200.1", + "release": "1.2.8", + "selfDeaf": false, + "selfMute": false, + "session": 44, + "suppress": false, + "tcponly": false, + "userid": 171, + "version": 66056, + "udpPing": 54.97, + "tcpPing": 52.64 + } + ] + }, + { + "channels": [ + { + "channels": [], + "description": "", + "id": 15, + "name": "1", + "parent": 11, + "position": 0, + "temporary": false, + "users": [] + }, + { + "channels": [], + "description": "", + "id": 16, + "name": "2", + "parent": 11, + "position": 0, + "temporary": false, + "users": [] + } + ], + "description": "", + "id": 11, + "name": "League of Legends", + "parent": 3, + "position": 0, + "temporary": false, + "users": [] + }, + { + "channels": [ + { + "channels": [], + "description": "", + "id": 13, + "name": "1", + "parent": 12, + "position": 0, + "temporary": false, + "users": [] + }, + { + "channels": [], + "description": "", + "id": 14, + "name": "2", + "parent": 12, + "position": 0, + "temporary": false, + "users": [] + } + ], + "description": "", + "id": 12, + "name": "Dota 2", + "parent": 3, + "position": 0, + "temporary": false, + "users": [] + }, + { + "channels": [], + "description": "", + "id": 19, + "name": "BFBC2", + "parent": 3, + "position": 0, + "temporary": false, + "users": [] + }, + { + "channels": [], + "description": "", + "id": 26, + "name": "StarCraft", + "parent": 3, + "position": 0, + "temporary": false, + "users": [] + }, + { + "channels": [], + "description": "", + "id": 27, + "name": "Hearthstone", + "parent": 3, + "position": 0, + "temporary": false, + "users": [] + }, + { + "channels": [ + { + "channels": [], + "description": "", + "id": 99, + "name": "Raid", + "parent": 28, + "position": 0, + "temporary": false, + "users": [] + } + ], + "description": "", + "id": 28, + "name": "World of Warcraft", + "parent": 3, + "position": 0, + "temporary": false, + "users": [] + }, + { + "channels": [], + "description": "", + "id": 29, + "name": "Minecraft", + "parent": 3, + "position": 0, + "temporary": false, + "users": [ + { + "bytespersec": 0, + "channel": 29, + "comment": "", + "context": "", + "deaf": false, + "identity": "", + "idlesecs": 63749, + "mute": false, + "name": "Daaz", + "onlinesecs": 69905, + "os": "Win", + "osversion": "6.1.7601.1", + "release": "1.2.8", + "selfDeaf": true, + "selfMute": true, + "session": 27, + "suppress": false, + "tcponly": false, + "userid": 140, + "version": 66056, + "udpPing": 8.07, + "tcpPing": 8.94 + } + ] + }, + { + "channels": [ + { + "channels": [], + "description": "", + "id": 38, + "name": "1", + "parent": 30, + "position": 0, + "temporary": false, + "users": [] + }, + { + "channels": [], + "description": "", + "id": 39, + "name": "2", + "parent": 30, + "position": 0, + "temporary": false, + "users": [] + } + ], + "description": "", + "id": 30, + "name": "Smite", + "parent": 3, + "position": 0, + "temporary": false, + "users": [] + }, + { + "channels": [], + "description": "", + "id": 31, + "name": "Tribes Ascend", + "parent": 3, + "position": 0, + "temporary": false, + "users": [] + }, + { + "channels": [], + "description": "", + "id": 32, + "name": "ARMA", + "parent": 3, + "position": 0, + "temporary": false, + "users": [] + }, + { + "channels": [], + "description": "", + "id": 33, + "name": "ARMA - DayZ", + "parent": 3, + "position": 0, + "temporary": false, + "users": [] + }, + { + "channels": [ + { + "channels": [], + "description": "", + "id": 36, + "name": "1", + "parent": 35, + "position": 0, + "temporary": false, + "users": [] + }, + { + "channels": [], + "description": "", + "id": 37, + "name": "2", + "parent": 35, + "position": 0, + "temporary": false, + "users": [] + } + ], + "description": "", + "id": 35, + "name": "Team Fortress 2", + "parent": 3, + "position": 0, + "temporary": false, + "users": [] + }, + { + "channels": [ + { + "channels": [], + "description": "", + "id": 63, + "name": "1", + "parent": 48, + "position": +|| + 0, + "temporary": false, + "users": [ + { + "bytespersec": 0, + "channel": 63, + "comment": "", + "context": "", + "deaf": false, + "identity": "", + "idlesecs": 1809, + "mute": false, + "name": "dutchy", + "onlinesecs": 138776, + "os": "WinX64", + "osversion": "Windows 7 Professional Service Pack 1 x64 - 6.1.7601", + "release": "1.3.0~540~gedd5509~snapshot", + "selfDeaf": false, + "selfMute": false, + "session": 86, + "suppress": false, + "tcponly": false, + "userid": -1, + "version": 66304, + "udpPing": 61.24, + "tcpPing": 63.72 + } + ] + }, + { + "channels": [], + "description": "", + "id": 64, + "name": "2", + "parent": 48, + "position": 0, + "temporary": false, + "users": [] + }, + { + "channels": [], + "description": "", + "id": 65, + "name": "3", + "parent": 48, + "position": 0, + "temporary": false, + "users": [ + { + "bytespersec": 0, + "channel": 65, + "comment": "http://www.gfycat.com/DecimalSneakyChameleon", + "context": "", + "deaf": false, + "identity": "", + "idlesecs": 4, + "mute": false, + "name": "Lavenous_Dakota", + "onlinesecs": 22300, + "os": "Win", + "osversion": "6.1.7601.1", + "release": "1.2.7", + "selfDeaf": false, + "selfMute": false, + "session": 95, + "suppress": false, + "tcponly": false, + "userid": 3, + "version": 66055, + "udpPing": 36.46, + "tcpPing": +|| + 41.61 + } +, + { + "bytespersec": 0, + "channel": 65, + "comment": "", + "context": "", + "deaf": false, + "identity": "", + "idlesecs": 15, + "mute": false, + "name": "RedishBlue", + "onlinesecs": 15669, + "os": "Win", + "osversion": "6.1.7601.1", + "release": "1.2.5", + "selfDeaf": false, + "selfMute": false, + "session": 154, + "suppress": false, + "tcponly": false, + "userid": 163, + "version": 66053, + "udpPing": 42.16, + "tcpPing": 51.83 + } + ] + } + ], + "description": "", + "id": 48, + "name": "Diablo III", + "parent": 3, + "position": 0, + "temporary": false, + "users": [] + }, + { + "channels": [], + "description": "", + "id": 49, + "name": "Miscellaneous", + "parent": 3, + "position": 0, + "temporary": false, + "users": [] + }, + { + "channels": [], + "description": "", + "id": 55, + "name": "Just Cause 2 MP", + "parent": 3, + "position": 0, + "temporary": false, + "users": [] + }, + { + "channels": [], + "description": "", + "id": 56, + "name": "Dawngate", + "parent": 3, + "position": 0, + "temporary": false, + "users": [] + }, + { + "channels": [], + "description": "", + "id": 58, + "name": "Quake Live", + "parent": 3, + "position": 0, + "temporary": false, + "users": [] + }, + { + "channels": [], + "description": "", + "id": 61, + "name": "Loadout", + "parent": 3, + "position": 0, + "temporary": false, + "users": [] + }, + { + "channels": [], + "description": "", + "id": 62, + "name": "Titanfall", + "parent": 3, + "position": 0, + "temporary": false, + "users": [] + }, + { + "channels": [], + "description": "", + "id": 67, + "name": "WildStar", + "parent": 3, + "position": 0, + "temporary": false, + "users": [] + }, + { + "channels": [], + "description": "", + "id": 68, + "name": "Star Citizen", + "parent": 3, + "position": 0, + "temporary": false, + "users": [] + }, + { + "channels": [], + "description": "", + "id": 70, + "name": "Supraball", + "parent": 3, + "position": 0, + "temporary": false, + "users": [] + }, + { + "channels": [ + { + "channels": [], + "description": "", + "id": 86, + "name": "1", + "parent": 85, + "position": 0, + "temporary": false, + "users": [] + }, + { + "channels": [], + "description": "", + "id": 87, + "name": "2", + "parent": 85, + "position": 0, + "temporary": false, + "users": [] + }, + { + "channels": [], + "description": "", + "id": 88, + "name": "3", + "parent": 85, + "position": 0, + "temporary": false, + "users": [] + }, + { + "channels": [], + "description": "", + "id": 89, + "name": "4", + "parent": 85, + "position": 0, + "temporary": false, + "users": [] + } + ], + "description": "", + "id": 85, + "name": "Project M", + "parent": 3, + "position": 0, + "temporary": false, + "users": [] + }, + { + "channels": [ + { + "channels": [], + "description": "", + "id": 91, + "name": "Commentators", + "parent": 90, + "position": 0, + "temporary": false, + "users": [] + } + ], + "description": "", + "id": 90, + "name": "USF4", + "parent": 3, + "position": 0, + "temporary": false, + "users": [] + }, + { + "channels": [], + "description": "", + "id": 92, + "name": "ArcheAge", + "parent": 3, + "position": 0, + "temporary": false, + "users": [] + }, + { + "channels": [], + "description": "", + "id": 93, + "name": "Heroes of the Storm", + "parent": 3, + "position": 0, + "temporary": false, + "users": [] + }, + { + "channels": [], + "description": "", + "id": 94, + "name": "Reflex", + "parent": 3, + "position": 0, + "temporary": false, + "users": [] + }, + { + "channels": [ + { + "channels": [], + "description": "", + "id": 104, + "name": "1", + "parent": 101, + "position": 0, + "temporary": false, + "users": [ + { + "bytespersec": 0, + "channel": 104, + "comment": "Want free bitcoin?\n

http://btc-flow.com/r/8b06357d87

", + "context": "", + "deaf": false, + "identity": "", + "idlesecs": 1261, + "mute": false, + "name": "Mojang", + "onlinesecs": 29344, + "os": "Win", + "osversion": "6.1.7601.1", + "release": "1.2.8", + "selfDeaf": false, + "selfMute": false, + "session": 8, + "suppress": false, + "tcponly": false, + "userid": 178, + "version": 66056, + "udpPing": 62.55, + "tcpPing": 57.80 + } +, + { + "bytespersec": 0, + "channel": 104, + "comment": "", + "context": "", + "deaf": false, + "identity": "", + "idlesecs": 518, + "mute": false, + "name": "YoStatty", + "onlinesecs": 15876, + "os": "Win", + "osversion": "6.2.9200.1", + "release": "1.2.8", + "selfDeaf": false, + "selfMute": false, + "session": 20, + "suppress": false, + "tcponly": false, + "userid": -1, + "version": 66056, + "udpPing": 58.66, + "tcpPing": 65.34 + } +, + { + "bytespersec": 0, + "channel": 104, + "comment": "", + +|| + "context": "", + "deaf": false, + "identity": "", + "idlesecs": 3854, + "mute": false, + "name": "Zomagoras", + "onlinesecs": 13200, + "os": "Win", + "osversion": "6.2.9200.1", + "release": "1.2.8", + "selfDeaf": true, + "selfMute": true, + "session": 36, + "suppress": false, + "tcponly": false, + "userid": 222, + "version": 66056, + "udpPing": 47.30, + "tcpPing": 47.91 + } + ] + }, + { + "channels": [], + "description": "", + "id": 105, + "name": "2", + "parent": 101, + "position": 0, + "temporary": false, + "users": [] + }, + { + "channels": [], + "description": "", + "id": 106, + "name": "3", + "parent": 101, + "position": 0, + "temporary": false, + "users": [] + } + ], + "description": "", + "id": 101, + "name": "H1Z1", + "parent": 3, + "position": 0, + "temporary": false, + "users": [] + }, + { + "channels": [], + "description": "", + "id": 108, + "name": "DragonballZ", + "parent": 3, + "position": 0, + "temporary": true, + "users": [ + { + "bytespersec": 0, + "channel": 108, + "comment": "", + "context": "", + "deaf": false, + "identity": "", + "idlesecs": 24, + "mute": false, + "name": "Market", + "onlinesecs": 16613, + "os": "Win", + "osversion": "6.1.7600.1", + "release": "1.2.8", + "selfDeaf": false, + "selfMute": false, + "session": 81, + "suppress": false, + "tcponly": false, + "userid": 218, + "version": 66056, + "udpPing": 62.88, + "tcpPing": 67.09 + } + ] + } + ], + "description": "", + "id": 3, + "name": "Games", + "parent": 0, + "position": 0, + "temporary": false, + "users": [] + }, + { + "channels": [], + "description": "", + "id": 20, + "name": "Fleshlight Headquarters", + "parent": 0, + "position": -1, + "temporary": false, + "users": [] + }, + { + "channels": [ + { + "channels": [], + "description": "", + "id": 41, + "name": "Admins Only", + "parent": 40, + "position": 1, + "temporary": false, + "users": [] + }, + { + "channels": [], + "description": "", + "id": 42, + "name": "1", + "parent": 40, + "position": 0, + "temporary": false, + "users": [] + }, + { + "channels": [], + "description": "", + "id": 43, + "name": "2", + "parent": 40, + "position": 0, + " +|| +temporary": false, + "users": [] + }, + { + "channels": [], + "description": "", + "id": 44, + "name": "3", + "parent": 40, + "position": 0, + "temporary": false, + "users": [] + }, + { + "channels": [ + { + "channels": [], + "description": "", + "id": 103, + "name": "Jimmy", + "parent": 57, + "position": 0, + "temporary": false, + "users": [] + } + ], + "description": "", + "id": 57, + "name": "Livestreaming", + "parent": 40, + "position": 0, + "temporary": false, + "users": [] + }, + { + "channels": [], + "description": "", + "id": 69, + "name": "Dannisters Subs", + "parent": 40, + "position": 0, + "temporary": false, + "users": [] + }, + { + "channels": [], + "description": "", + "id": 107, + "name": "LAN", + "parent": 40, + "position": 0, + "temporary": false, + "users": [] + } + ], + "description": "", + "id": 40, + "name": "Bropile", + "parent": 0, + "position": 1, + "temporary": false, + "users": [] + }, + { + "channels": [ + { + "channels": [], + "description": "", + "id": 52, + "name": "1", + "parent": 51, + "position": 0, + "temporary": false, + "users": [] + }, + +|| +{ + "channels": [], + "description": "", + "id": 53, + "name": "2", + "parent": 51, + "position": 0, + "temporary": false, + "users": [] + }, + { + "channels": [], + "description": "", + "id": 54, + "name": "3", + "parent": 51, + "position": 0, + "temporary": false, + "users": [] + } + ], + "description": "", + "id": 51, + "name": "Livestreaming", + "parent": 0, + "position": -1, + "temporary": false, + "users": [] + }, + { + "channels": [], + "description": "", + "id": 96, + "name": "Waiting Room", + "parent": 0, + "position": 0, + "temporary": false, + "users": [] + }, + { + "channels": [], + "description": "", + "id": 102, + "name": "Community Night", + "parent": 0, + "position": 0, + "temporary": false, + "users": [] + } + ], + "description": "
\n

Welcome to the KBMOD.com Mumble server!

\n


\n

Live server status available @ kbmod.com/servers

\n


\n

Check us out on your social media platforms of choice!

\n


\n

Twitter: @KBMODGaming

\n

Facebook: facebook.com/KBMOD

\n

Twitch: twitch.tv/KBMOD

\n

Steam group: Keyboard + Mouse or Die!

", + "id": 0, + "name": "Root", + "parent": -1, + "position": 0, + "temporary": false, + "users": [] + } +} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Mumble/2_result.json b/gameq/tests/Protocols/Providers/Mumble/2_result.json new file mode 100644 index 0000000..b022f30 --- /dev/null +++ b/gameq/tests/Protocols/Providers/Mumble/2_result.json @@ -0,0 +1 @@ +{"198.58.117.238:64738":{"dedicated":1,"gq_address":"198.58.117.238","gq_joinlink":"mumble:\/\/198.58.117.238:64738\/","gq_name":"Mumble Server","gq_online":true,"gq_port_client":64738,"gq_port_query":27800,"gq_protocol":"mumble","gq_transport":"tcp","gq_type":"mumble","id":1,"name":"KBMOD.com","numplayers":25,"players":[{"bytespersec":0,"channel":1,"comment":"https:\/\/www.youtube.com\/watch?v=NC7VO7XgpJk<\/a>\n

<\/p>\n

http:\/\/members.iracing.com\/jforum\/posts\/list\/3210432.page<\/a><\/p>","context":"","deaf":false,"identity":"","idlesecs":281990,"mute":false,"name":"Peeble","onlinesecs":281990,"os":"Win","osversion":"6.2.9200.1","release":"1.2.4","selfDeaf":false,"selfMute":false,"session":21,"suppress":true,"tcponly":false,"userid":55,"version":66052,"udpPing":51.87,"tcpPing":54.78},{"bytespersec":0,"channel":1,"comment":"Someone carry me from the depths of Gold 1. Please. Can and will return sexual favors for it.<\/b> \n

Battlenet ID xFantoM#1761<\/p>","context":"","deaf":false,"identity":"","idlesecs":22792,"mute":false,"name":"xFantoM","onlinesecs":615992,"os":"Win","osversion":"6.1.7601.1","release":"1.2.5","selfDeaf":true,"selfMute":true,"session":56,"suppress":true,"tcponly":false,"userid":33,"version":66053,"udpPing":125.01,"tcpPing":147.22},{"bytespersec":0,"channel":1,"comment":"twitter.com\/hutchison15\n

twitch.tv\/hutchison15<\/p>\n

bhutchison.us<\/p>","context":"","deaf":false,"identity":"","idlesecs":98511,"mute":false,"name":"hutchison15","onlinesecs":98511,"os":"Win","osversion":"6.2.9200.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":75,"suppress":true,"tcponly":false,"userid":161,"version":66056,"udpPing":64.49,"tcpPing":63.47},{"bytespersec":0,"channel":1,"comment":"Someone do my Technical Drawings","context":"","deaf":false,"identity":"","idlesecs":780,"mute":false,"name":"Hunter","onlinesecs":2140,"os":"Win","osversion":"6.2.9200.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":112,"suppress":true,"tcponly":false,"userid":221,"version":66056,"udpPing":55.26,"tcpPing":69.54},{"bytespersec":0,"channel":1,"comment":"always down to spawn a conducive environment to engage in civil discussion through adequate mediums such as twitter\n

<\/p>\n

and 10-mans.<\/p>","context":"","deaf":false,"identity":"","idlesecs":2237,"mute":false,"name":"Aniion","onlinesecs":2260,"os":"Win","osversion":"6.2.9200.1","release":"1.2.8","selfDeaf":true,"selfMute":true,"session":124,"suppress":true,"tcponly":false,"userid":28,"version":66056,"udpPing":55.65,"tcpPing":58.2},{"bytespersec":0,"channel":1,"comment":"","context":"","deaf":false,"identity":"","idlesecs":901,"mute":false,"name":"SkyShark","onlinesecs":901,"os":"Win","osversion":"6.1.7601.1","release":"1.2.8","selfDeaf":true,"selfMute":true,"session":125,"suppress":true,"tcponly":false,"userid":108,"version":66056,"udpPing":45.76,"tcpPing":50.17},{"bytespersec":0,"channel":1,"comment":"","context":"","deaf":false,"identity":"","idlesecs":28863,"mute":false,"name":"AverageJoe","onlinesecs":28868,"os":"Win","osversion":"6.1.7601.1","release":"1.2.8","selfDeaf":false,"selfMute":true,"session":146,"suppress":true,"tcponly":false,"userid":96,"version":66056,"udpPing":143.9,"tcpPing":142.09},{"bytespersec":0,"channel":1,"comment":"twitter <\/a>\n

<\/p>","context":"","deaf":false,"identity":"","idlesecs":5215,"mute":false,"name":"EtchyaSketch","onlinesecs":5215,"os":"Win","osversion":"6.1.7601.1","release":"1.2.5","selfDeaf":false,"selfMute":false,"session":163,"suppress":true,"tcponly":false,"userid":78,"version":66053,"udpPing":49.78,"tcpPing":56.6},{"bytespersec":0,"channel":1,"comment":"","context":"","deaf":false,"identity":"","idlesecs":54352,"mute":false,"name":"SanguisAngelus","onlinesecs":73788,"os":"Win","osversion":"6.1.7601.1","release":"1.2.8","selfDeaf":true,"selfMute":true,"session":172,"suppress":true,"tcponly":false,"userid":224,"version":66056,"udpPing":49.22,"tcpPing":51.04},{"bytespersec":0,"channel":1,"comment":"Disgusin","context":"","deaf":false,"identity":"","idlesecs":12135,"mute":false,"name":"arbo96","onlinesecs":12136,"os":"Win","osversion":"6.1.7601.1","release":"1.2.7","selfDeaf":false,"selfMute":false,"session":191,"suppress":true,"tcponly":false,"userid":62,"version":66055,"udpPing":54.75,"tcpPing":56.15},{"bytespersec":0,"channel":6,"comment":"","context":"","deaf":false,"identity":"","idlesecs":3065,"mute":false,"name":"roma4356","onlinesecs":41987,"os":"Win","osversion":"6.2.9200.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":44,"suppress":false,"tcponly":false,"userid":171,"version":66056,"udpPing":54.97,"tcpPing":52.64},{"bytespersec":0,"channel":77,"comment":"Got places to go, got people to see.","context":"","deaf":false,"identity":"","idlesecs":2180,"mute":false,"name":"Draggio","onlinesecs":2180,"os":"Win","osversion":"6.1.7601.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":3,"suppress":false,"tcponly":false,"userid":194,"version":66056,"udpPing":44.72,"tcpPing":46.02},{"bytespersec":0,"channel":78,"comment":"","context":"","deaf":false,"identity":"","idlesecs":16,"mute":false,"name":"SWEDEN","onlinesecs":2155,"os":"Win","osversion":"6.1.7601.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":13,"suppress":false,"tcponly":false,"userid":-1,"version":66056,"udpPing":47.59,"tcpPing":46.44},{"bytespersec":0,"channel":78,"comment":"","context":"","deaf":false,"identity":"","idlesecs":12,"mute":false,"name":"Trash","onlinesecs":2008,"os":"Win","osversion":"6.1.7601.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":91,"suppress":false,"tcponly":false,"userid":212,"version":66056,"udpPing":52.54,"tcpPing":54.81},{"bytespersec":0,"channel":78,"comment":"","context":"","deaf":false,"identity":"","idlesecs":3,"mute":false,"name":"APL","onlinesecs":2189,"os":"Win","osversion":"6.1.7601.1","release":"1.2.7","selfDeaf":false,"selfMute":false,"session":114,"suppress":false,"tcponly":false,"userid":157,"version":66055,"udpPing":47.83,"tcpPing":44.76},{"bytespersec":0,"channel":78,"comment":"","context":"","deaf":false,"identity":"","idlesecs":4,"mute":false,"name":"Spoob","onlinesecs":2123,"os":"Win","osversion":"6.2.9200.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":144,"suppress":false,"tcponly":false,"userid":-1,"version":66056,"udpPing":38.05,"tcpPing":40.28},{"bytespersec":0,"channel":97,"comment":"","context":"","deaf":false,"identity":"","idlesecs":512,"mute":false,"name":"Haas","onlinesecs":1569,"os":"Win","osversion":"6.1.7601.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":184,"suppress":false,"tcponly":false,"userid":-1,"version":66056,"udpPing":32.07,"tcpPing":36.14},{"bytespersec":0,"channel":29,"comment":"","context":"","deaf":false,"identity":"","idlesecs":63749,"mute":false,"name":"Daaz","onlinesecs":69905,"os":"Win","osversion":"6.1.7601.1","release":"1.2.8","selfDeaf":true,"selfMute":true,"session":27,"suppress":false,"tcponly":false,"userid":140,"version":66056,"udpPing":8.07,"tcpPing":8.94},{"bytespersec":0,"channel":63,"comment":"","context":"","deaf":false,"identity":"","idlesecs":1809,"mute":false,"name":"dutchy","onlinesecs":138776,"os":"WinX64","osversion":"Windows 7 Professional Service Pack 1 x64 - 6.1.7601","release":"1.3.0~540~gedd5509~snapshot","selfDeaf":false,"selfMute":false,"session":86,"suppress":false,"tcponly":false,"userid":-1,"version":66304,"udpPing":61.24,"tcpPing":63.72},{"bytespersec":0,"channel":65,"comment":"http:\/\/www.gfycat.com\/DecimalSneakyChameleon<\/a>","context":"","deaf":false,"identity":"","idlesecs":4,"mute":false,"name":"Lavenous_Dakota","onlinesecs":22300,"os":"Win","osversion":"6.1.7601.1","release":"1.2.7","selfDeaf":false,"selfMute":false,"session":95,"suppress":false,"tcponly":false,"userid":3,"version":66055,"udpPing":36.46,"tcpPing":41.61},{"bytespersec":0,"channel":65,"comment":"","context":"","deaf":false,"identity":"","idlesecs":15,"mute":false,"name":"RedishBlue","onlinesecs":15669,"os":"Win","osversion":"6.1.7601.1","release":"1.2.5","selfDeaf":false,"selfMute":false,"session":154,"suppress":false,"tcponly":false,"userid":163,"version":66053,"udpPing":42.16,"tcpPing":51.83},{"bytespersec":0,"channel":104,"comment":"Want free bitcoin?<\/span><\/a>\n

http:\/\/btc-flow.com\/r\/8b06357d87<\/span><\/a><\/p>","context":"","deaf":false,"identity":"","idlesecs":1261,"mute":false,"name":"Mojang","onlinesecs":29344,"os":"Win","osversion":"6.1.7601.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":8,"suppress":false,"tcponly":false,"userid":178,"version":66056,"udpPing":62.55,"tcpPing":57.8},{"bytespersec":0,"channel":104,"comment":"","context":"","deaf":false,"identity":"","idlesecs":518,"mute":false,"name":"YoStatty","onlinesecs":15876,"os":"Win","osversion":"6.2.9200.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":20,"suppress":false,"tcponly":false,"userid":-1,"version":66056,"udpPing":58.66,"tcpPing":65.34},{"bytespersec":0,"channel":104,"comment":"","context":"","deaf":false,"identity":"","idlesecs":3854,"mute":false,"name":"Zomagoras","onlinesecs":13200,"os":"Win","osversion":"6.2.9200.1","release":"1.2.8","selfDeaf":true,"selfMute":true,"session":36,"suppress":false,"tcponly":false,"userid":222,"version":66056,"udpPing":47.3,"tcpPing":47.91},{"bytespersec":0,"channel":108,"comment":"","context":"","deaf":false,"identity":"","idlesecs":24,"mute":false,"name":"Market","onlinesecs":16613,"os":"Win","osversion":"6.1.7600.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":81,"suppress":false,"tcponly":false,"userid":218,"version":66056,"udpPing":62.88,"tcpPing":67.09}],"teams":[{"description":" \n

Welcome to the KBMOD.com<\/a> Mumble server!<\/p>\n

<\/p>\n

Live server status available @ kbmod.com\/servers<\/a><\/p>\n

<\/p>\n

Check us out on your social media platforms of choice!<\/p>\n

<\/p>\n

Twitter:<\/span> @KBMODGaming<\/a><\/p>\n

Facebook:<\/span> facebook.com\/KBMOD<\/a><\/p>\n

Twitch:<\/span> twitch.tv\/KBMOD<\/a><\/p>\n

Steam group:<\/span> Keyboard + Mouse or Die!<\/a><\/p>","id":0,"name":"Root","parent":-1,"position":0,"temporary":false},{"description":"","id":1,"name":"AFK","parent":0,"position":-1,"temporary":false},{"description":"","id":2,"name":"General Discussion","parent":0,"position":-1,"temporary":false},{"description":"","id":21,"name":"1","parent":2,"position":0,"temporary":false},{"description":"","id":22,"name":"2","parent":2,"position":0,"temporary":false},{"description":"","id":23,"name":"3","parent":2,"position":0,"temporary":false},{"description":"","id":3,"name":"Games","parent":0,"position":0,"temporary":false},{"description":"","id":4,"name":"Battlefield 4","parent":3,"position":0,"temporary":false},{"description":"","id":17,"name":"1","parent":4,"position":0,"temporary":false},{"description":"","id":18,"name":"2","parent":4,"position":0,"temporary":false},{"description":"","id":45,"name":"3","parent":4,"position":0,"temporary":false},{"description":"","id":46,"name":"4","parent":4,"position":0,"temporary":false},{"description":"","id":47,"name":"5","parent":4,"position":0,"temporary":false},{"description":"","id":5,"name":"Call of Duty","parent":3,"position":0,"temporary":false},{"description":"","id":24,"name":"1","parent":5,"position":0,"temporary":false},{"description":"","id":25,"name":"2","parent":5,"position":0,"temporary":false},{"description":"","id":100,"name":"CoD4","parent":5,"position":0,"temporary":false},{"description":"","id":6,"name":"Counter-Strike","parent":3,"position":0,"temporary":false},{"description":"","id":72,"name":"Casual","parent":6,"position":0,"temporary":false},{"description":"","id":7,"name":"1","parent":72,"position":0,"temporary":false},{"description":"","id":9,"name":"2","parent":72,"position":0,"temporary":false},{"description":"","id":74,"name":"Competitive","parent":6,"position":0,"temporary":false},{"description":"","id":8,"name":"2","parent":74,"position":0,"temporary":false},{"description":"","id":77,"name":"1","parent":74,"position":0,"temporary":false},{"description":"","id":78,"name":"3","parent":74,"position":0,"temporary":false},{"description":"","id":79,"name":"4","parent":74,"position":0,"temporary":false},{"description":"","id":81,"name":"Lobby - Waiting Room","parent":74,"position":-1,"temporary":false},{"description":"","id":83,"name":"5","parent":74,"position":0,"temporary":false},{"description":"","id":84,"name":"6","parent":74,"position":0,"temporary":false},{"description":"","id":97,"name":"7","parent":74,"position":0,"temporary":false},{"description":"","id":98,"name":"8","parent":74,"position":0,"temporary":false},{"description":"","id":11,"name":"League of Legends","parent":3,"position":0,"temporary":false},{"description":"","id":15,"name":"1","parent":11,"position":0,"temporary":false},{"description":"","id":16,"name":"2","parent":11,"position":0,"temporary":false},{"description":"","id":12,"name":"Dota 2","parent":3,"position":0,"temporary":false},{"description":"","id":13,"name":"1","parent":12,"position":0,"temporary":false},{"description":"","id":14,"name":"2","parent":12,"position":0,"temporary":false},{"description":"","id":19,"name":"BFBC2","parent":3,"position":0,"temporary":false},{"description":"","id":26,"name":"StarCraft","parent":3,"position":0,"temporary":false},{"description":"","id":27,"name":"Hearthstone","parent":3,"position":0,"temporary":false},{"description":"","id":28,"name":"World of Warcraft","parent":3,"position":0,"temporary":false},{"description":"","id":99,"name":"Raid","parent":28,"position":0,"temporary":false},{"description":"","id":29,"name":"Minecraft","parent":3,"position":0,"temporary":false},{"description":"","id":30,"name":"Smite","parent":3,"position":0,"temporary":false},{"description":"","id":38,"name":"1","parent":30,"position":0,"temporary":false},{"description":"","id":39,"name":"2","parent":30,"position":0,"temporary":false},{"description":"","id":31,"name":"Tribes Ascend","parent":3,"position":0,"temporary":false},{"description":"","id":32,"name":"ARMA","parent":3,"position":0,"temporary":false},{"description":"","id":33,"name":"ARMA - DayZ","parent":3,"position":0,"temporary":false},{"description":"","id":35,"name":"Team Fortress 2","parent":3,"position":0,"temporary":false},{"description":"","id":36,"name":"1","parent":35,"position":0,"temporary":false},{"description":"","id":37,"name":"2","parent":35,"position":0,"temporary":false},{"description":"","id":48,"name":"Diablo III","parent":3,"position":0,"temporary":false},{"description":"","id":63,"name":"1","parent":48,"position":0,"temporary":false},{"description":"","id":64,"name":"2","parent":48,"position":0,"temporary":false},{"description":"","id":65,"name":"3","parent":48,"position":0,"temporary":false},{"description":"","id":49,"name":"Miscellaneous","parent":3,"position":0,"temporary":false},{"description":"","id":55,"name":"Just Cause 2 MP","parent":3,"position":0,"temporary":false},{"description":"","id":56,"name":"Dawngate","parent":3,"position":0,"temporary":false},{"description":"","id":58,"name":"Quake Live","parent":3,"position":0,"temporary":false},{"description":"","id":61,"name":"Loadout","parent":3,"position":0,"temporary":false},{"description":"","id":62,"name":"Titanfall","parent":3,"position":0,"temporary":false},{"description":"","id":67,"name":"WildStar","parent":3,"position":0,"temporary":false},{"description":"","id":68,"name":"Star Citizen","parent":3,"position":0,"temporary":false},{"description":"","id":70,"name":"Supraball","parent":3,"position":0,"temporary":false},{"description":"","id":85,"name":"Project M","parent":3,"position":0,"temporary":false},{"description":"","id":86,"name":"1","parent":85,"position":0,"temporary":false},{"description":"","id":87,"name":"2","parent":85,"position":0,"temporary":false},{"description":"","id":88,"name":"3","parent":85,"position":0,"temporary":false},{"description":"","id":89,"name":"4","parent":85,"position":0,"temporary":false},{"description":"","id":90,"name":"USF4","parent":3,"position":0,"temporary":false},{"description":"","id":91,"name":"Commentators","parent":90,"position":0,"temporary":false},{"description":"","id":92,"name":"ArcheAge","parent":3,"position":0,"temporary":false},{"description":"","id":93,"name":"Heroes of the Storm","parent":3,"position":0,"temporary":false},{"description":"","id":94,"name":"Reflex","parent":3,"position":0,"temporary":false},{"description":"","id":101,"name":"H1Z1","parent":3,"position":0,"temporary":false},{"description":"","id":104,"name":"1","parent":101,"position":0,"temporary":false},{"description":"","id":105,"name":"2","parent":101,"position":0,"temporary":false},{"description":"","id":106,"name":"3","parent":101,"position":0,"temporary":false},{"description":"","id":108,"name":"DragonballZ","parent":3,"position":0,"temporary":true},{"description":"","id":20,"name":"Fleshlight Headquarters","parent":0,"position":-1,"temporary":false},{"description":"","id":40,"name":"Bropile","parent":0,"position":1,"temporary":false},{"description":"","id":41,"name":"Admins Only","parent":40,"position":1,"temporary":false},{"description":"","id":42,"name":"1","parent":40,"position":0,"temporary":false},{"description":"","id":43,"name":"2","parent":40,"position":0,"temporary":false},{"description":"","id":44,"name":"3","parent":40,"position":0,"temporary":false},{"description":"","id":57,"name":"Livestreaming","parent":40,"position":0,"temporary":false},{"description":"","id":103,"name":"Jimmy","parent":57,"position":0,"temporary":false},{"description":"","id":69,"name":"Dannisters Subs","parent":40,"position":0,"temporary":false},{"description":"","id":107,"name":"LAN","parent":40,"position":0,"temporary":false},{"description":"","id":51,"name":"Livestreaming","parent":0,"position":-1,"temporary":false},{"description":"","id":52,"name":"1","parent":51,"position":0,"temporary":false},{"description":"","id":53,"name":"2","parent":51,"position":0,"temporary":false},{"description":"","id":54,"name":"3","parent":51,"position":0,"temporary":false},{"description":"","id":96,"name":"Waiting Room","parent":0,"position":0,"temporary":false},{"description":"","id":102,"name":"Community Night","parent":0,"position":0,"temporary":false}],"x_connecturl":"mumble:\/\/voice.kbmod.com:64738\/?version=1.2.0","x_gtmurmur_connectport":"64738","x_gtmurmur_doclen":246824,"x_gtmurmur_max_users":"100","x_gtmurmur_server_version":"1.2.4"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Ns2/1_response.txt b/gameq/tests/Protocols/Providers/Ns2/1_response.txt new file mode 100644 index 0000000..c806f89 Binary files /dev/null and b/gameq/tests/Protocols/Providers/Ns2/1_response.txt differ diff --git a/gameq/tests/Protocols/Providers/Ns2/1_result.json b/gameq/tests/Protocols/Providers/Ns2/1_result.json new file mode 100644 index 0000000..e13f3d3 --- /dev/null +++ b/gameq/tests/Protocols/Providers/Ns2/1_result.json @@ -0,0 +1 @@ +{"162.248.91.95:27015":{"dedicated":"l","ent_count":"747","game_descr":"Natural Selection 2","game_dir":"Natural Selection 2","game_id":4920,"gq_address":"162.248.91.95","gq_joinlink":"steam:\/\/connect\/162.248.91.95:27015\/","gq_name":"Natural Selection 2","gq_online":true,"gq_port_client":27015,"gq_port_query":27016,"gq_protocol":"source","gq_transport":"udp","gq_type":"ns2","hostname":" -MCG-'s Lounge | All Maps | Vote","keywords":"274|ns2|M|149|25|12|99|rookie|ServerTickrate30|P_S644|CHUD_0x16|tickrate_29","map":"ns2_nyx","max_players":24,"mods[000]":"706d242 101ab256 812f004 aa8da06 b7149f9 1415d1a6","num_bots":0,"num_players":24,"num_rules":3,"os":"w","password":0,"players":[{"id":0,"name":"Saxton Its My Bday:D","score":222,"time":7635.4365234375},{"id":0,"name":"jackreacher","score":219,"time":7256.26171875},{"id":0,"name":"wyattweichel","score":193,"time":6495.7573242188},{"id":0,"name":"iodine","score":392,"time":4785.0576171875},{"id":0,"name":"RedRick","score":241,"time":3657.6557617188},{"id":0,"name":"BudlyStudly","score":162,"time":3571.5461425781},{"id":0,"name":"MoonNipple","score":21,"time":3468.2453613281},{"id":0,"name":"Hey I Just Met You &","score":410,"time":3393.5900878906},{"id":0,"name":"herp derp","score":246,"time":3136.6799316406},{"id":0,"name":"Schplat","score":228,"time":2870.0895996094},{"id":0,"name":"yodakohl","score":359,"time":2271.2177734375},{"id":0,"name":"BaconTuxedo","score":6,"time":2250.8498535156},{"id":0,"name":"lerkn is hard","score":434,"time":2181.2734375},{"id":0,"name":"CoolBeans","score":270,"time":2126.2819824219},{"id":0,"name":"-MCG- scoots","score":209,"time":1953.5261230469},{"id":0,"name":"Skuldy","score":420,"time":1761.7818603516},{"id":0,"name":"Gorge Washington","score":179,"time":1584.8758544922},{"id":0,"name":"{TT}Tera","score":100,"time":1370.8156738281},{"id":0,"name":"Hot Dogs Rule","score":190,"time":1036.333984375},{"id":0,"name":"lunchboxblues","score":92,"time":965.1123046875},{"id":0,"name":"ns player","score":100,"time":958.77728271484},{"id":0,"name":"Gunter.","score":0,"time":317.09606933594},{"id":0,"name":"[DMD] NothinMuch","score":3,"time":264.677734375},{"id":0,"name":"stevenbaggett91","score":7,"time":243.06587219238}],"port":27015,"protocol":17,"secure":1,"steam_id":90094480016162817,"steamappid":4920,"tickrate":"29","version":"1.0.0.0"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Ns2/2_response.txt b/gameq/tests/Protocols/Providers/Ns2/2_response.txt new file mode 100644 index 0000000..335a59f Binary files /dev/null and b/gameq/tests/Protocols/Providers/Ns2/2_response.txt differ diff --git a/gameq/tests/Protocols/Providers/Ns2/2_result.json b/gameq/tests/Protocols/Providers/Ns2/2_result.json new file mode 100644 index 0000000..334ef3c --- /dev/null +++ b/gameq/tests/Protocols/Providers/Ns2/2_result.json @@ -0,0 +1 @@ +{"174.37.194.20:27015":{"dedicated":"l","ent_count":"270","game_descr":"Natural Selection 2","game_dir":"Natural Selection 2","game_id":4920,"gq_address":"174.37.194.20","gq_joinlink":"steam:\/\/connect\/174.37.194.20:27015\/","gq_name":"Natural Selection 2","gq_online":true,"gq_port_client":27015,"gq_port_query":27016,"gq_protocol":"source","gq_transport":"udp","gq_type":"ns2","hostname":"IBISGaming.com NS2#1 DC (LagFREE)","keywords":"274|ns2|M|168|22|3|83|R_S2|rookie|CHUD_0x16|P_S1146|shine|ServerTickrate29|tickrate_29","map":"ns2_veil","max_players":24,"mods[000]":"5f4f178 b7149f9 706d242 812f004","num_bots":0,"num_players":22,"num_rules":3,"os":"w","password":0,"players":[{"id":0,"name":"Gorge C Scott","score":62,"time":13347.8447265625},{"id":0,"name":"lifeavenger","score":43,"time":7439.5063476562},{"id":0,"name":"ONinja","score":75,"time":6144.5405273438},{"id":0,"name":"Shameless","score":248,"time":5350.7934570312},{"id":0,"name":"RicketyRektshaw","score":92,"time":5032.2250976562},{"id":0,"name":"Castle","score":75,"time":4191.4501953125},{"id":0,"name":"Code Monkey","score":171,"time":3973.2531738281},{"id":0,"name":"Luxon 5","score":71,"time":3781.8603515625},{"id":0,"name":"yolo","score":98,"time":3746.0412597656},{"id":0,"name":"GhostFade Killa","score":93,"time":3070.9228515625},{"id":0,"name":"Uuugggg","score":120,"time":2639.8403320312},{"id":0,"name":"Ken Sander no sound","score":6,"time":2484.1628417969},{"id":0,"name":"ludacris","score":110,"time":1907.1362304688},{"id":0,"name":"Lactose The Intolera","score":75,"time":1768.8353271484},{"id":0,"name":"Failuresaurus","score":73,"time":1597.2080078125},{"id":0,"name":"dart","score":179,"time":1514.0079345703},{"id":0,"name":"Mercury One","score":107,"time":1485.9306640625},{"id":0,"name":"Anna","score":80,"time":1483.328125},{"id":0,"name":"Caetus","score":3,"time":1337.2996826172},{"id":0,"name":"King Snake","score":42,"time":1203.0048828125},{"id":0,"name":"an evil villain","score":115,"time":920.35137939453},{"id":0,"name":"Swap","score":91,"time":683.51391601562}],"port":27015,"protocol":17,"secure":1,"steam_id":90094491342705671,"steamappid":4920,"tickrate":"29","version":"1.0.0.0"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Projectrealitybf2/1_response.txt b/gameq/tests/Protocols/Providers/Projectrealitybf2/1_response.txt new file mode 100644 index 0000000..3f60661 Binary files /dev/null and b/gameq/tests/Protocols/Providers/Projectrealitybf2/1_response.txt differ diff --git a/gameq/tests/Protocols/Providers/Projectrealitybf2/1_result.json b/gameq/tests/Protocols/Providers/Projectrealitybf2/1_result.json new file mode 100644 index 0000000..9a0d05f --- /dev/null +++ b/gameq/tests/Protocols/Providers/Projectrealitybf2/1_result.json @@ -0,0 +1 @@ +{"188.40.118.13:16568":{"bf2_anticheat":"0","bf2_autobalanced":"0","bf2_autorec":"1","bf2_bots":"0","bf2_communitylogo_url":"http:\/\/prteamwork.com","bf2_coopbotcount":"","bf2_coopbotdiff":"","bf2_coopbotratio":"","bf2_d_dl":"http:\/\/","bf2_d_idx":"http:\/\/","bf2_dedicated":"1","bf2_fps":"30.000000","bf2_friendlyfire":"1","bf2_globalunlocks":"0","bf2_mapsize":"128","bf2_novehicles":"0","bf2_os":"linux-64","bf2_plasma":"0","bf2_pure":"0","bf2_ranked":"0","bf2_reservedslots":"0","bf2_scorelimit":"1000","bf2_spawntime":"300.000000","bf2_sponsorlogo_url":"http:\/\/prteamwork.com\/images\/server\/servergraphic-bf2pr_colored.png","bf2_sponsortext":"Welcome to PRTA!|-Website: prteamwork.com|-TS: ts.prta.co|-Be respectful of all players, work together & fight hard.|-Read our rules on our website.|-No squads before 2:00.","bf2_startdelay":"300","bf2_team1":"MEC","bf2_team2":"US","bf2_teamratio":"100.000000","bf2_ticketratio":"100","bf2_tkmode":"No Punish","bf2_voip":"0","gamemode":"openplaying","gamename":"battlefield2","gametype":"gpm_cq","gamevariant":"pr","gamever":"1.5.3153-802.0","gq_address":"188.40.118.13","gq_joinlink":"bf2:\/\/188.40.118.13:16568","gq_name":"Project Reality: Battlefield 2","gq_online":true,"gq_port_client":16568,"gq_port_query":29901,"gq_protocol":"gamespy3","gq_transport":"udp","gq_type":"projectrealitybf2","hostname":"[PR v1.4.3.0] PRTA | EU - prteamwork.com","hostport":"16568","mapname":"Khamisiyah","maxplayers":"100","numplayers":"100","password":"0","players":[{"player":"[GDW] Menuen","score":"974","ping":"45","team":"2","deaths":"1","pid":"100002122","skill":"32","AIBot":"0"},{"player":"[PR]EMC|KruZar","score":"829","ping":"180","team":"2","deaths":"1","pid":"100362089","skill":"1","AIBot":"0"},{"player":"[SNGE] Thazer","score":"806","ping":"34","team":"2","deaths":"3","pid":"100170450","skill":"0","AIBot":"0"},{"player":"[+H+] mr_macwindsorPR","score":"745","ping":"39","team":"1","deaths":"2","pid":"100104437","skill":"16","AIBot":"0"},{"player":"DuriosDavros","score":"691","ping":"49","team":"1","deaths":"2","pid":"100347816","skill":"0","AIBot":"0"},{"player":"[TZ] AceInvader","score":"614","ping":"156","team":"2","deaths":"1","pid":"100066892","skill":"1","AIBot":"0"},{"player":"Alexian95","score":"563","ping":"36","team":"2","deaths":"3","pid":"100373063","skill":"1","AIBot":"0"},{"player":"[6-1] Captain_Vlad","score":"557","ping":"133","team":"1","deaths":"1","pid":"100178787","skill":"2","AIBot":"0"},{"player":"=HOGp= Neshville","score":"543","ping":"35","team":"2","deaths":"0","pid":"100324492","skill":"2","AIBot":"0"},{"player":"EDM","score":"532","ping":"41","team":"2","deaths":"2","pid":"100174752","skill":"3","AIBot":"0"},{"player":"Nancy","score":"526","ping":"211","team":"2","deaths":"3","pid":"100375340","skill":"2","AIBot":"0"},{"player":"Uscha DietrichKlaus","score":"525","ping":"36","team":"2","deaths":"2","pid":"100199239","skill":"8","AIBot":"0"},{"player":"major98","score":"524","ping":"154","team":"1","deaths":"5","pid":"100353583","skill":"0","AIBot":"0"},{"player":"[PR]EMC|happy_google","score":"510","ping":"332","team":"1","deaths":"1","pid":"100362173","skill":"3","AIBot":"0"},{"player":"[GDW] P4R40N","score":"507","ping":"52","team":"2","deaths":"2","pid":"100213559","skill":"4","AIBot":"0"},{"player":"[6-1] jybbe","score":"487","ping":"41","team":"1","deaths":"2","pid":"100001677","skill":"14","AIBot":"0"},{"player":"Panzershrek","score":"476","ping":"57","team":"1","deaths":"4","pid":"100306843","skill":"1","AIBot":"0"},{"player":"Lt_Morgan","score":"452","ping":"29","team":"2","deaths":"1","pid":"100044729","skill":"0","AIBot":"0"},{"player":"Maxim","score":"451","ping":"175","team":"1","deaths":"2","pid":"100049255","skill":"2","AIBot":"0"},{"player":"HornyOstritch","score":"442","ping":"51","team":"1","deaths":"2","pid":"100349713","skill":"3","AIBot":"0"},{"player":"Brah Potato","score":"436","ping":"46","team":"2","deaths":"4","pid":"100003191","skill":"3","AIBot":"0"},{"player":"[PR]EMC|gwaihir","score":"433","ping":"15","team":"2","deaths":"3","pid":"100362312","skill":"17","AIBot":"0"},{"player":"Rifleman1","score":"431","ping":"61","team":"2","deaths":"2","pid":"100341275","skill":"4","AIBot":"0"},{"player":"[SNGE] SHINYREDBULLETS","score":"428","ping":"46","team":"2","deaths":"3","pid":"100339519","skill":"3","AIBot":"0"},{"player":"A[O] scodriem","score":"415","ping":"53","team":"2","deaths":"4","pid":"100005679","skill":"2","AIBot":"0"},{"player":"[PR]EMC|AlonTavor","score":"413","ping":"78","team":"1","deaths":"1","pid":"100362248","skill":"1","AIBot":"0"},{"player":"TeppoWinnipeg","score":"412","ping":"67","team":"1","deaths":"3","pid":"100224557","skill":"1","AIBot":"0"},{"player":"NL Hazelhoff","score":"404","ping":"31","team":"2","deaths":"2","pid":"100132691","skill":"0","AIBot":"0"},{"player":"Clamchops","score":"393","ping":"115","team":"2","deaths":"2","pid":"100358200","skill":"0","AIBot":"0"},{"player":"ela","score":"380","ping":"44","team":"1","deaths":"5","pid":"100051250","skill":"3","AIBot":"0"},{"player":"F|PFC. Buttermilch25","score":"373","ping":"25","team":"2","deaths":"2","pid":"100216659","skill":"0","AIBot":"0"},{"player":"[GDW] BuffaloRastaman","score":"367","ping":"70","team":"2","deaths":"1","pid":"100242367","skill":"0","AIBot":"0"},{"player":"gameconsole34","score":"363","ping":"72","team":"2","deaths":"1","pid":"100367848","skill":"1","AIBot":"0"},{"player":"Xamber","score":"331","ping":"49","team":"1","deaths":"7","pid":"100006202","skill":"2","AIBot":"0"},{"player":"[6-1] meloonileuka","score":"320","ping":"99","team":"1","deaths":"1","pid":"100010337","skill":"0","AIBot":"0"},{"player":"[DPRC] Re$tGeber","score":"316","ping":"13","team":"2","deaths":"3","pid":"100223458","skill":"1","AIBot":"0"},{"player":"F|Pvt. Azivegu","score":"306","ping":"22","team":"1","deaths":"3","pid":"100033576","skill":"6","AIBot":"0"},{"player":"HornyCorn","score":"305","ping":"78","team":"1","deaths":"2","pid":"100068562","skill":"12","AIBot":"0"},{"player":"SkyFaitH","score":"303","ping":"54","team":"2","deaths":"0","pid":"100164306","skill":"0","AIBot":"0"},{"player":"[GDW] parch","score":"302","ping":"38","team":"2","deaths":"3","pid":"100129270","skill":"12","AIBot":"0"},{"player":"[6-1] MasterHenaz","score":"283","ping":"43","team":"1","deaths":"2","pid":"100006852","skill":"1","AIBot":"0"},{"player":"cribbaaa","score":"266","ping":"28","team":"2","deaths":"1","pid":"100000438","skill":"0","AIBot":"0"},{"player":"[POV] klippiematich","score":"265","ping":"27","team":"2","deaths":"3","pid":"100005761","skill":"2","AIBot":"0"},{"player":"{BigJ} wokinstorm","score":"261","ping":"73","team":"2","deaths":"4","pid":"100022912","skill":"2","AIBot":"0"},{"player":"[GDW] Sierzant_Grubas","score":"255","ping":"35","team":"2","deaths":"4","pid":"100001361","skill":"8","AIBot":"0"},{"player":"Alucard.","score":"251","ping":"55","team":"2","deaths":"2","pid":"100343140","skill":"3","AIBot":"0"},{"player":"[3dAC] Frontliner(Ger)","score":"236","ping":"45","team":"1","deaths":"1","pid":"100082450","skill":"2","AIBot":"0"},{"player":"[HB] hellnoob","score":"233","ping":"39","team":"1","deaths":"3","pid":"100365838","skill":"2","AIBot":"0"},{"player":"LeNger","score":"228","ping":"20","team":"1","deaths":"2","pid":"100215090","skill":"4","AIBot":"0"},{"player":"[PLEB] elbono","score":"223","ping":"55","team":"2","deaths":"2","pid":"100005321","skill":"0","AIBot":"0"},{"player":"[PR]EMC|PBAsydney","score":"222","ping":"71","team":"1","deaths":"2","pid":"100362597","skill":"1","AIBot":"0"},{"player":"Sirze","score":"206","ping":"80","team":"2","deaths":"1","pid":"100356090","skill":"0","AIBot":"0"},{"player":"[PLEB] rosenplat","score":"205","ping":"51","team":"2","deaths":"2","pid":"100002787","skill":"0","AIBot":"0"},{"player":"ur4s26","score":"203","ping":"30","team":"2","deaths":"1","pid":"100060191","skill":"4","AIBot":"0"},{"player":"[POV] Daan","score":"190","ping":"22","team":"2","deaths":"4","pid":"100061270","skill":"0","AIBot":"0"},{"player":"[INF_PL]KaNguR_84_PL","score":"184","ping":"79","team":"1","deaths":"2","pid":"100340930","skill":"3","AIBot":"0"},{"player":"chukonu","score":"178","ping":"16","team":"2","deaths":"1","pid":"100121628","skill":"1","AIBot":"0"},{"player":"[OD-S]Fiordas","score":"155","ping":"28","team":"1","deaths":"2","pid":"100002140","skill":"1","AIBot":"0"},{"player":"INF_PL Jakub_spartakus","score":"155","ping":"58","team":"1","deaths":"0","pid":"100351369","skill":"0","AIBot":"0"},{"player":"[PR]EMC|TEDF","score":"154","ping":"58","team":"1","deaths":"1","pid":"100362520","skill":"1","AIBot":"0"},{"player":"Valta","score":"152","ping":"36","team":"2","deaths":"3","pid":"100002817","skill":"1","AIBot":"0"},{"player":"[DD] slorpo","score":"146","ping":"32","team":"1","deaths":"5","pid":"100345804","skill":"2","AIBot":"0"},{"player":"SH| TNTNiTii","score":"146","ping":"65","team":"2","deaths":"2","pid":"100172913","skill":"0","AIBot":"0"},{"player":"lakinen","score":"145","ping":"34","team":"2","deaths":"3","pid":"100376207","skill":"0","AIBot":"0"}],"roundtime":"1","teams":[{"team":"MEC","score":"0"},{"team":"US","score":"0"}],"timelimit":"14400"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Projectrealitybf2/2_response.txt b/gameq/tests/Protocols/Providers/Projectrealitybf2/2_response.txt new file mode 100644 index 0000000..7fcca3a Binary files /dev/null and b/gameq/tests/Protocols/Providers/Projectrealitybf2/2_response.txt differ diff --git a/gameq/tests/Protocols/Providers/Projectrealitybf2/2_result.json b/gameq/tests/Protocols/Providers/Projectrealitybf2/2_result.json new file mode 100644 index 0000000..9aa2c5b --- /dev/null +++ b/gameq/tests/Protocols/Providers/Projectrealitybf2/2_result.json @@ -0,0 +1 @@ +{"188.40.118.13:16569":{"bf2_anticheat":"0","bf2_autobalanced":"0","bf2_autorec":"0","bf2_bots":"0","bf2_communitylogo_url":"http:\/\/prteamwork.com","bf2_coopbotcount":"","bf2_coopbotdiff":"","bf2_coopbotratio":"","bf2_d_dl":"http:\/\/","bf2_d_idx":"http:\/\/","bf2_dedicated":"1","bf2_fps":"36.000000","bf2_friendlyfire":"1","bf2_globalunlocks":"0","bf2_mapsize":"64","bf2_novehicles":"0","bf2_os":"linux-64","bf2_plasma":"0","bf2_pure":"0","bf2_ranked":"0","bf2_reservedslots":"0","bf2_scorelimit":"1000","bf2_spawntime":"15.000000","bf2_sponsorlogo_url":"http:\/\/prteamwork.com\/images\/server\/servergraphic-bf2pr_colored.png","bf2_sponsortext":"Welcome to PRTA!|-Website: prteamwork.com|-TS: ts.prta.co|-Be respectful of all players, work together & fight hard.|-Read our rules on our website.|-No squads before 2:00.","bf2_startdelay":"30","bf2_team1":"CH","bf2_team2":"GB","bf2_teamratio":"100.000000","bf2_ticketratio":"100","bf2_tkmode":"No Punish","bf2_voip":"0","gamemode":"openplaying","gamename":"battlefield2","gametype":"gpm_cq","gamevariant":"pr","gamever":"1.5.3153-802.0","gq_address":"188.40.118.13","gq_joinlink":"bf2:\/\/188.40.118.13:16569","gq_name":"Project Reality: Battlefield 2","gq_online":true,"gq_port_client":16569,"gq_port_query":29902,"gq_protocol":"gamespy3","gq_transport":"udp","gq_type":"projectrealitybf2","hostname":"[PR v1.4.3.0] PRTA | EU - Training","hostport":"16569","mapname":"TEST AIRFIELD","maxplayers":"100","numplayers":"1","password":"1","players":[{"player":"[TP]Kerkhoff","score":"0","ping":"21","team":"2","deaths":"0","pid":"100002466","skill":"0","AIBot":"0"}],"roundtime":"1","teams":[{"team":"CH","score":"0"},{"team":"GB","score":"0"}],"timelimit":"14400"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Projectrealitybf2/3_response.txt b/gameq/tests/Protocols/Providers/Projectrealitybf2/3_response.txt new file mode 100644 index 0000000..5138e74 Binary files /dev/null and b/gameq/tests/Protocols/Providers/Projectrealitybf2/3_response.txt differ diff --git a/gameq/tests/Protocols/Providers/Projectrealitybf2/3_result.json b/gameq/tests/Protocols/Providers/Projectrealitybf2/3_result.json new file mode 100644 index 0000000..a2330f7 --- /dev/null +++ b/gameq/tests/Protocols/Providers/Projectrealitybf2/3_result.json @@ -0,0 +1 @@ +{"108.61.88.95:16567":{"bf2_anticheat":"0","bf2_autobalanced":"0","bf2_autorec":"1","bf2_bots":"0","bf2_communitylogo_url":"http:\/\/www.hardcoregaming.org\/","bf2_coopbotcount":"","bf2_coopbotdiff":"","bf2_coopbotratio":"","bf2_d_dl":"http:\/\/108.61.88.96\/demos\/","bf2_d_idx":"http:\/\/108.61.88.96\/demos\/","bf2_dedicated":"1","bf2_fps":"35.000000","bf2_friendlyfire":"1","bf2_globalunlocks":"1","bf2_mapsize":"64","bf2_novehicles":"0","bf2_os":"linux-64","bf2_plasma":"0","bf2_pure":"0","bf2_ranked":"0","bf2_reservedslots":"0","bf2_scorelimit":"1000","bf2_spawntime":"300.000000","bf2_sponsorlogo_url":"http:\/\/i.imgur.com\/uLm15H6.jpg","bf2_sponsortext":"=]H[= HARDCORE GAMING|_|Website: www.hardcoregaming.org|TS3: ts.hardcoregaming.org:8990|Rules: www.hardcoregaming.org\/serverrules|_|Next Map: Gaza Insurgency Inf","bf2_startdelay":"200","bf2_team1":"MEInsurgent","bf2_team2":"US","bf2_teamratio":"100.000000","bf2_ticketratio":"100","bf2_tkmode":"No Punish","bf2_voip":"0","gamemode":"openplaying","gamename":"battlefield2","gametype":"gpm_insurgency","gamevariant":"pr","gamever":"1.5.3153-802.0","gq_address":"108.61.88.95","gq_joinlink":"bf2:\/\/108.61.88.95:16567","gq_name":"Project Reality: Battlefield 2","gq_online":true,"gq_port_client":16567,"gq_port_query":29900,"gq_protocol":"gamespy3","gq_transport":"udp","gq_type":"projectrealitybf2","hostname":"[PR v1.4.3.0] =]H[= HARDCORE GAMING - NA","hostport":"16567","mapname":"Fallujah West","maxplayers":"100","numplayers":"5","password":"0","players":[{"player":"Ripper47","score":"846","ping":"122","team":"1","deaths":"2","pid":"100158354","skill":"0","AIBot":"0"},{"player":"=]H[= Eskil_swe","score":"523","ping":"108","team":"1","deaths":"0","pid":"100000205","skill":"0","AIBot":"0"},{"player":"SuperWhalez69","score":"116","ping":"89","team":"2","deaths":"0","pid":"100275882","skill":"0","AIBot":"0"},{"player":"=DRK=TrapMan","score":"6","ping":"56","team":"2","deaths":"0","pid":"100343043","skill":"0","AIBot":"0"},{"player":"Fry Frysmong","score":"0","ping":"76","team":"2","deaths":"0","pid":"100377388","skill":"0","AIBot":"0"}],"roundtime":"1","teams":[{"team":"MEInsurgent","score":"0"},{"team":"US","score":"0"}],"timelimit":"14400"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Quake2/1_response.txt b/gameq/tests/Protocols/Providers/Quake2/1_response.txt new file mode 100644 index 0000000..2bdb3e2 --- /dev/null +++ b/gameq/tests/Protocols/Providers/Quake2/1_response.txt @@ -0,0 +1,13 @@ +print +\Q2Admin\1.17.44-tsmod-2\mapname\q2dm6\anticheat\1\sv_noobquad\0\gamedate\Aug 2 2009\gamename\baseq2\sv_handicap\1\maxspectators\8\INFO2\NO BOTS, HACKS, CHEATS PLEASE\INFO1\All Skill Levels Welcome\cheats\0\timelimit\15\fraglimit\30\dmflags\16404\deathmatch\1\version\R1Q2 b7864 i386 Oct 1 2008 Linux\hostname\tastyspleen.net::dm\maxclients\17 +0 2 "WallFly[BZZZ]" +2 162 "ninja" +3 196 "Richo de Lula" +22 52 "Fatal[KiD]" +15 25 "Anus Paste" +12 22 "hindmost" +29 59 "[A2W]H3mr0yd" +4 159 "nx0" +26 40 "0:0" +18 41 "mag" +9 71 "mind" diff --git a/gameq/tests/Protocols/Providers/Quake2/1_result.json b/gameq/tests/Protocols/Providers/Quake2/1_result.json new file mode 100644 index 0000000..09813a0 --- /dev/null +++ b/gameq/tests/Protocols/Providers/Quake2/1_result.json @@ -0,0 +1 @@ +{"67.228.69.114:27916":{"INFO1":"All Skill Levels Welcome","INFO2":"NO BOTS, HACKS, CHEATS PLEASE","Q2Admin":"1.17.44-tsmod-2","anticheat":"1","cheats":"0","clients":11,"deathmatch":"1","dmflags":"16404","fraglimit":"30","gamedate":"Aug 2 2009","gamename":"baseq2","gq_address":"67.228.69.114","gq_joinlink":"","gq_name":"Quake 2 Server","gq_online":true,"gq_port_client":27916,"gq_port_query":27916,"gq_protocol":"quake2","gq_transport":"udp","gq_type":"quake2","hostname":"tastyspleen.net::dm","mapname":"q2dm6","maxclients":"17","maxspectators":"8","mod":0,"password":0,"players":[{"frags":"0","ping":"2","name":"WallFly[BZZZ]","address":""},{"frags":"2","ping":"162","name":"ninja","address":""},{"frags":"3","ping":"196","name":"Richo de Lula","address":""},{"frags":"22","ping":"52","name":"Fatal[KiD]","address":""},{"frags":"15","ping":"25","name":"Anus Paste","address":""},{"frags":"12","ping":"22","name":"hindmost","address":""},{"frags":"29","ping":"59","name":"[A2W]H3mr0yd","address":""},{"frags":"4","ping":"159","name":"nx0","address":""},{"frags":"26","ping":"40","name":"0:0","address":""},{"frags":"18","ping":"41","name":"mag","address":""},{"frags":"9","ping":"71","name":"mind","address":""}],"sv_handicap":"1","sv_noobquad":"0","timelimit":"15","version":"R1Q2 b7864 i386 Oct 1 2008 Linux"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Quake2/2_response.txt b/gameq/tests/Protocols/Providers/Quake2/2_response.txt new file mode 100644 index 0000000..f460deb --- /dev/null +++ b/gameq/tests/Protocols/Providers/Quake2/2_response.txt @@ -0,0 +1,12 @@ +print +\mapname\q2dm1\ngWorldStats_Status\<<< Disabled >>>\anticheat\1\match_info\Runes, Hook, Protection\match_type\RegularDM\time_remaining\17:28\gamedate\Jul 1 1999\gamename\baseq2 \cheats\0\timelimit\20\fraglimit\0\dmflags\17940\version\R1Q2 b7864 i386 Oct 1 2008 Linux\hostname\Clanworld's Lithium-DM #1\deathmatch\1\gamedir\ospl2\port\27910\game\ospl2\maxclients\32 +0 15 "nikon" +0 16 "Ulrik" +0 16 "bubbleuniverse" +0 18 "Centriot" +0 17 "AL1AS" +0 17 "Oilver" +0 17 "snappy" +16 55 "4833" +0 17 "rackor" +0 66 "Player" diff --git a/gameq/tests/Protocols/Providers/Quake2/2_result.json b/gameq/tests/Protocols/Providers/Quake2/2_result.json new file mode 100644 index 0000000..9db8cff --- /dev/null +++ b/gameq/tests/Protocols/Providers/Quake2/2_result.json @@ -0,0 +1 @@ +{"77.66.46.219:27910":{"anticheat":"1","cheats":"0","clients":10,"deathmatch":"1","dmflags":"17940","fraglimit":"0","game":"ospl2","gamedate":"Jul 1 1999","gamedir":"ospl2","gamename":"baseq2","gq_address":"77.66.46.219","gq_joinlink":"","gq_name":"Quake 2 Server","gq_online":true,"gq_port_client":27910,"gq_port_query":27910,"gq_protocol":"quake2","gq_transport":"udp","gq_type":"quake2","hostname":"Clanworld's Lithium-DM #1","mapname":"q2dm1","match_info":"Runes, Hook, Protection","match_type":"RegularDM","maxclients":"32","mod":0,"ngWorldStats_Status":"<<< Disabled >>>","password":0,"players":[{"frags":"0","ping":"15","name":"nikon","address":""},{"frags":"0","ping":"16","name":"Ulrik","address":""},{"frags":"0","ping":"16","name":"bubbleuniverse","address":""},{"frags":"0","ping":"18","name":"Centriot","address":""},{"frags":"0","ping":"17","name":"AL1AS","address":""},{"frags":"0","ping":"17","name":"Oilver","address":""},{"frags":"0","ping":"17","name":"snappy","address":""},{"frags":"16","ping":"55","name":"4833","address":""},{"frags":"0","ping":"17","name":"rackor","address":""},{"frags":"0","ping":"66","name":"Player","address":""}],"port":"27910","time_remaining":"17:28","timelimit":"20","version":"R1Q2 b7864 i386 Oct 1 2008 Linux"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Quake2/3_response.txt b/gameq/tests/Protocols/Providers/Quake2/3_response.txt new file mode 100644 index 0000000..0d3971c --- /dev/null +++ b/gameq/tests/Protocols/Providers/Quake2/3_response.txt @@ -0,0 +1,2 @@ +print +\Score_A\WARMUP\Score_B\WARMUP\anticheat\1\cheats\0\deathmatch\1\dmflags\1040\fraglimit\0\game\opentdm\gamedate\Feb 9 2013\gamedir\opentdm\gamename\OpenTDM\hostname\PlayGround.ru - Teamplay\mapname\q2dm1\match_type\TDM\maxclients\12\port\27911\protocol\34\revision\22\time_remaining\WARMUP\timelimit\0\version\q2proded r1504~924ff39 Dec 3 2014 Linux i386 diff --git a/gameq/tests/Protocols/Providers/Quake2/3_result.json b/gameq/tests/Protocols/Providers/Quake2/3_result.json new file mode 100644 index 0000000..d5134f6 --- /dev/null +++ b/gameq/tests/Protocols/Providers/Quake2/3_result.json @@ -0,0 +1 @@ +{"212.42.38.88:27911":{"Score_A":"WARMUP","Score_B":"WARMUP","anticheat":"1","cheats":"0","clients":0,"deathmatch":"1","dmflags":"1040","fraglimit":"0","game":"opentdm","gamedate":"Feb 9 2013","gamedir":"opentdm","gamename":"OpenTDM","gq_address":"212.42.38.88","gq_joinlink":"","gq_name":"Quake 2 Server","gq_online":true,"gq_port_client":27911,"gq_port_query":27911,"gq_protocol":"quake2","gq_transport":"udp","gq_type":"quake2","hostname":"PlayGround.ru - Teamplay","mapname":"q2dm1","match_type":"TDM","maxclients":"12","mod":0,"password":0,"port":"27911","protocol":"34","revision":"22","time_remaining":"WARMUP","timelimit":"0","version":"q2proded r1504~924ff39 Dec 3 2014 Linux i386"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Quake3/1_response.txt b/gameq/tests/Protocols/Providers/Quake3/1_response.txt new file mode 100644 index 0000000..24a3b26 --- /dev/null +++ b/gameq/tests/Protocols/Providers/Quake3/1_response.txt @@ -0,0 +1,12 @@ +statusResponse +\sv_maxclients\64\sv_privateClients\0\version\Q3 1.32c linux-i386 May 8 2009\com_protocol\71\protocol\68\dmflags\0\fraglimit\30\timelimit\10\g_gametype\0\mapname\q3tourney4\sv_hostname\XXXADULTS*ONLYXXX\sv_minRate\0\sv_maxRate\25000\sv_dlRate\1000\sv_minPing\0\sv_maxPing\0\sv_floodProtect\1\sv_allowDownload\1\bot_minplayers\2\ Administrator\X\ E-mail\esclan@att.net\ Location\San Jose, CA\ Website\matchlessgaming.com\g_maxGameClients\0\capturelimit\8\gamename\baseq3\g_needpass\0\Score_Time\Starting +0 46 "^w*ES*^3Bro^7chillin" +0 92 "^w*ES*^7a^6m^7and^6a" +0 13 "^w*ES*yursofat" +0 26 "^w*ES*guapo" +0 28 "^w*ES*^7Darth Ni" +0 18 "^w*ES*^3sunflarez" +0 18 "^w*ES*^7^1Lovely^4Lisa" +0 29 "^w*ES*^7tha mane" +0 20 "^w*ES*^7^4NoStatic" +0 68 "^w*ES*^7Hmmmmmm" diff --git a/gameq/tests/Protocols/Providers/Quake3/1_result.json b/gameq/tests/Protocols/Providers/Quake3/1_result.json new file mode 100644 index 0000000..00c0e1d --- /dev/null +++ b/gameq/tests/Protocols/Providers/Quake3/1_result.json @@ -0,0 +1 @@ +{"66.160.179.212:27960":{"Administrator":"X","E-mail":"esclan@att.net","Location":"San Jose, CA","Score_Time":"Starting","Website":"matchlessgaming.com","bot_minplayers":"2","capturelimit":"8","clients":10,"com_protocol":"71","dmflags":"0","fraglimit":"30","g_gametype":"0","g_maxGameClients":"0","g_needpass":"0","gamename":"baseq3","gq_address":"66.160.179.212","gq_joinlink":"","gq_name":"Quake 3 Server","gq_online":true,"gq_port_client":27960,"gq_port_query":27960,"gq_protocol":"quake3","gq_transport":"udp","gq_type":"quake3","mapname":"q3tourney4","players":[{"frags":"0","ping":"46","name":"^w*ES*^3Bro^7chillin"},{"frags":"0","ping":"92","name":"^w*ES*^7a^6m^7and^6a"},{"frags":"0","ping":"13","name":"^w*ES*yursofat"},{"frags":"0","ping":"26","name":"^w*ES*guapo"},{"frags":"0","ping":"28","name":"^w*ES*^7Darth Ni"},{"frags":"0","ping":"18","name":"^w*ES*^3sunflarez"},{"frags":"0","ping":"18","name":"^w*ES*^7^1Lovely^4Lisa"},{"frags":"0","ping":"29","name":"^w*ES*^7tha mane"},{"frags":"0","ping":"20","name":"^w*ES*^7^4NoStatic"},{"frags":"0","ping":"68","name":"^w*ES*^7Hmmmmmm"}],"protocol":"68","sv_allowDownload":"1","sv_dlRate":"1000","sv_floodProtect":"1","sv_hostname":"XXXADULTS*ONLYXXX","sv_maxPing":"0","sv_maxRate":"25000","sv_maxclients":"64","sv_minPing":"0","sv_minRate":"0","sv_privateClients":"0","timelimit":"10","version":"Q3 1.32c linux-i386 May 8 2009"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Quake3/2_response.txt b/gameq/tests/Protocols/Providers/Quake3/2_response.txt new file mode 100644 index 0000000..6edfce3 --- /dev/null +++ b/gameq/tests/Protocols/Providers/Quake3/2_response.txt @@ -0,0 +1,2 @@ +statusResponse +\cg_enemyColors\1\Score_Red\0\Score_Blue\0\gamename\NoGhost\Mod_Build\911\Mod_Website\www.NoGhost.net\Mod_Author\Maverick\g_authenticateClient_strict\2\g_authenticateClient\1\g_delag\2\g_gamemod\0\g_antiBot\1\g_needpass\0\sv_privateClients\0\mapname\q3ctf1\protocol\43\g_gametype\4\version\Q3 1.15c win-x86 Jan 13 2000\sv_keywords\demo\capturelimit\4\g_maxGameClients\0\sv_fps\30\sv_floodProtect\0\sv_maxPing\0\sv_minPing\0\sv_maxRate\25000\sv_maxclients\20\sv_hostname\Megas|CTF.\timelimit\20\fraglimit\25\dmflags\2056\fs_game\noghost diff --git a/gameq/tests/Protocols/Providers/Quake3/2_result.json b/gameq/tests/Protocols/Providers/Quake3/2_result.json new file mode 100644 index 0000000..27c20a0 --- /dev/null +++ b/gameq/tests/Protocols/Providers/Quake3/2_result.json @@ -0,0 +1 @@ +{"50.97.113.104:27960":{"Mod_Author":"Maverick","Mod_Build":"911","Mod_Website":"www.NoGhost.net","Score_Blue":"0","Score_Red":"0","clients":0,"capturelimit":"4","cg_enemyColors":"1","dmflags":"2056","fraglimit":"25","fs_game":"noghost","g_antiBot":"1","g_authenticateClient":"1","g_authenticateClient_strict":"2","g_delag":"2","g_gamemod":"0","g_gametype":"4","g_maxGameClients":"0","g_needpass":"0","gamename":"NoGhost","gq_address":"50.97.113.104","gq_joinlink":"","gq_name":"Quake 3 Server","gq_online":true,"gq_port_client":27960,"gq_port_query":27960,"gq_protocol":"quake3","gq_transport":"udp","gq_type":"quake3","mapname":"q3ctf1","protocol":"43","sv_floodProtect":"0","sv_fps":"30","sv_hostname":"Megas|CTF.","sv_keywords":"demo","sv_maxPing":"0","sv_maxRate":"25000","sv_maxclients":"20","sv_minPing":"0","sv_privateClients":"0","timelimit":"20","version":"Q3 1.15c win-x86 Jan 13 2000"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Quakelive/1_response.txt b/gameq/tests/Protocols/Providers/Quakelive/1_response.txt new file mode 100644 index 0000000..2fdded7 Binary files /dev/null and b/gameq/tests/Protocols/Providers/Quakelive/1_response.txt differ diff --git a/gameq/tests/Protocols/Providers/Quakelive/1_result.json b/gameq/tests/Protocols/Providers/Quakelive/1_result.json new file mode 100644 index 0000000..83ea7af --- /dev/null +++ b/gameq/tests/Protocols/Providers/Quakelive/1_result.json @@ -0,0 +1 @@ +{"64.74.97.106:27960":{"capturelimit":"8","dedicated":"d","dmflags":"0","fraglimit":"50","g_adCaptureScoreBonus":"3","g_adElimScoreBonus":"2","g_adTouchScoreBonus":"1","g_blueScore":"7","g_customSettings":"0","g_factory":"freeze","g_factoryTitle":"PILL FREEZE TAG","g_freezeRoundDelay":"0","g_gameState":"IN_PROGRESS","g_gametype":"9","g_gravity":"800","g_instaGib":"0","g_itemHeight":"35","g_itemTimers":"0","g_levelStartTime":"1480117693","g_loadout":"0","g_needpass":"0","g_overtime":"120","g_quadDamageFactor":"3","g_redScore":"4","g_roundWarmupDelay":"10000","g_startingHealth":"100","g_teamForceBalance":"0","g_teamSizeMin":"1","g_timeoutCount":"0","g_voteFlags":"13416","g_weaponRespawn":"5","game_descr":"Freeze Tag","game_dir":"baseq3","game_id":282440,"gq_address":"64.74.97.106","gq_joinlink":"steam:\/\/connect\/64.74.97.106:27960\/","gq_name":"Quake Live","gq_online":true,"gq_port_client":27960,"gq_port_query":27960,"gq_protocol":"source","gq_transport":"udp","gq_type":"quakelive","hostname":"PILL FREEZE TAG | CHICAGO","keywords":"freezetag,minqlx,freeze,ft,Chicago,pills,pill","map":"dredwerkz","mapname":"dredwerkz","max_players":28,"mercylimit":"0","num_bots":0,"num_players":17,"num_rules":42,"os":"l","password":0,"players":[{"id":0,"name":"AC!D","score":40,"time":4133.3115234375},{"id":0,"name":"^2lint","score":43,"time":4131.3125},{"id":0,"name":"^2Weed","score":43,"time":4130.978515625},{"id":0,"name":"^5ρṻ ^3^^0♥ ^5ЄЯɦ","score":17,"time":4128.0483398438},{"id":0,"name":"^7]^1SpB^7[ ph^11^7ldo","score":44,"time":3916.46484375},{"id":0,"name":"^4£ighter^3thieƒ","score":33,"time":3644.162109375},{"id":0,"name":"eXerguX","score":27,"time":3146.34765625},{"id":0,"name":"║▌║█║▌│║▌║","score":34,"time":2827.6049804688},{"id":0,"name":"stormy","score":44,"time":2769.97265625},{"id":0,"name":"minion","score":45,"time":2550.7478027344},{"id":0,"name":"DeMan_EM","score":16,"time":973.90362548828},{"id":0,"name":"soclose","score":18,"time":924.83319091797},{"id":0,"name":"^5Mithandirs^6Ghost","score":10,"time":612.466796875},{"id":0,"name":"Avatar","score":21,"time":537.2802734375},{"id":0,"name":"✿ⓏⓊⓇⒹⓄ™✿","score":19,"time":409.67333984375},{"id":0,"name":"alien","score":0,"time":343.43966674805},{"id":0,"name":"algerion","score":6,"time":239.77928161621}],"port":27960,"protocol":"91","roundlimit":"8","roundtimelimit":"0","scorelimit":"150","secure":1,"steam_id":90105407413101572,"steamappid":0,"sv_hostname":"PILL FREEZE TAG | CHICAGO","sv_maxclients":"28","sv_privateClients":"1","teamsize":"9","timelimit":"20","version":"1069 linux-x64 Jun 3 2016 20:53:50"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Quakelive/2_response.txt b/gameq/tests/Protocols/Providers/Quakelive/2_response.txt new file mode 100644 index 0000000..7ed526a Binary files /dev/null and b/gameq/tests/Protocols/Providers/Quakelive/2_response.txt differ diff --git a/gameq/tests/Protocols/Providers/Quakelive/2_result.json b/gameq/tests/Protocols/Providers/Quakelive/2_result.json new file mode 100644 index 0000000..91df583 --- /dev/null +++ b/gameq/tests/Protocols/Providers/Quakelive/2_result.json @@ -0,0 +1 @@ +{"104.192.227.170:27960":{"capturelimit":"8","dedicated":"d","dmflags":"0","fraglimit":"50","g_adCaptureScoreBonus":"3","g_adElimScoreBonus":"2","g_adTouchScoreBonus":"1","g_blueScore":"12","g_customSettings":"0","g_factory":"ffa","g_factoryTitle":"Free For All","g_freezeRoundDelay":"4000","g_gameState":"IN_PROGRESS","g_gametype":"0","g_gravity":"800","g_instaGib":"0","g_itemHeight":"35","g_itemTimers":"0","g_levelStartTime":"1480118601","g_loadout":"0","g_needpass":"0","g_overtime":"0","g_quadDamageFactor":"3","g_redScore":"18","g_roundWarmupDelay":"10000","g_startingHealth":"100","g_teamForceBalance":"1","g_teamSizeMin":"1","g_timeoutCount":"0","g_voteFlags":"1288","g_weaponRespawn":"1","game_descr":"Free For All","game_dir":"baseq3","game_id":282440,"gq_address":"104.192.227.170","gq_joinlink":"steam:\/\/connect\/104.192.227.170:27960\/","gq_name":"Quake Live","gq_online":true,"gq_port_client":27960,"gq_port_query":27960,"gq_protocol":"source","gq_transport":"udp","gq_type":"quakelive","hostname":"|)ark Fiber FFA | Chicago ","keywords":"ffa,minqlx,DarkFiberQuake.com, Dedicated, Stats","map":"blackcathedral","mapname":"blackcathedral","max_players":32,"mercylimit":"0","num_bots":0,"num_players":14,"num_rules":42,"os":"l","password":0,"players":[{"id":0,"name":"petehaberkorn","score":0,"time":14434.790039062},{"id":0,"name":"[RIOT]HeLlSpAwN","score":0,"time":9717.986328125},{"id":0,"name":"HarryTurdKnocker","score":0,"time":4886.3173828125},{"id":0,"name":"^2PotHe4d","score":8,"time":1295.3927001953},{"id":0,"name":"0BigJimSlade0","score":3,"time":1049.2965087891},{"id":0,"name":"antman63","score":3,"time":1011.1903076172},{"id":0,"name":"CracKMonkey","score":12,"time":905.10412597656},{"id":0,"name":"cedde","score":7,"time":815.43988037109},{"id":0,"name":"Blue.Demon","score":3,"time":736.82592773438},{"id":0,"name":"_McCafe_","score":18,"time":695.35919189453},{"id":0,"name":"SubZero","score":4,"time":418.99301147461},{"id":0,"name":"boomstick","score":9,"time":358.4323425293},{"id":0,"name":"Species","score":9,"time":331.39785766602},{"id":0,"name":"kvn","score":6,"time":85.051734924316}],"port":27960,"protocol":"91","roundlimit":"10","roundtimelimit":"180","scorelimit":"150","secure":1,"steam_id":90105375025776647,"steamappid":0,"sv_hostname":"|)ark Fiber FFA | Chicago ","sv_maxclients":"32","sv_privateClients":"0","teamsize":"32","timelimit":"15","version":"1069 linux-x64 Jun 3 2016 20:53:50"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Quakelive/3_response.txt b/gameq/tests/Protocols/Providers/Quakelive/3_response.txt new file mode 100644 index 0000000..ede5886 Binary files /dev/null and b/gameq/tests/Protocols/Providers/Quakelive/3_response.txt differ diff --git a/gameq/tests/Protocols/Providers/Quakelive/3_result.json b/gameq/tests/Protocols/Providers/Quakelive/3_result.json new file mode 100644 index 0000000..6732081 --- /dev/null +++ b/gameq/tests/Protocols/Providers/Quakelive/3_result.json @@ -0,0 +1 @@ +{"5.19.249.101:27961":{"capturelimit":"8","dedicated":"d","dmflags":"52","fraglimit":"50","g_adCaptureScoreBonus":"3","g_adElimScoreBonus":"2","g_adTouchScoreBonus":"1","g_blueScore":"0","g_customSettings":"0","g_factory":"instagib_ffa_pql","g_factoryTitle":"PQL Instagib FFA","g_freezeRoundDelay":"4000","g_gameState":"PRE_GAME","g_gametype":"0","g_gravity":"800","g_instaGib":"1","g_itemHeight":"35","g_itemTimers":"0","g_levelStartTime":"1480118939","g_loadout":"0","g_needpass":"0","g_overtime":"0","g_quadDamageFactor":"3","g_redScore":"0","g_roundWarmupDelay":"10000","g_startingHealth":"100","g_teamForceBalance":"1","g_teamSizeMin":"1","g_timeoutCount":"0","g_voteFlags":"30568","g_weaponRespawn":"5","game_descr":"Free For All","game_dir":"baseq3","game_id":282440,"gq_address":"5.19.249.101","gq_joinlink":"steam:\/\/connect\/5.19.249.101:27961\/","gq_name":"Quake Live","gq_online":true,"gq_port_client":27961,"gq_port_query":27961,"gq_protocol":"source","gq_transport":"udp","gq_type":"quakelive","hostname":"► [Instagib FFA PQL] RU Melodeiro Server","keywords":"ffa,instagib,minqlx,pql,b-rated,Melodeiro,Saint-Petersburg,RU","map":"skyward","mapname":"skyward","max_players":22,"mercylimit":"0","num_bots":0,"num_players":3,"num_rules":42,"os":"l","password":0,"players":[{"id":0,"name":"execgarret","score":0,"time":11382.264648438},{"id":0,"name":"yadohimikat","score":0,"time":1168.9237060547},{"id":0,"name":"RMRH","score":0,"time":31.532669067383}],"port":27961,"protocol":"91","roundlimit":"10","roundtimelimit":"180","scorelimit":"150","secure":1,"steam_id":90105393812024328,"steamappid":0,"sv_hostname":"► [Instagib FFA PQL] RU Melodeiro Server","sv_maxClients":"22","sv_privateClients":"1","teamsize":"16","timelimit":"15","version":"1069 linux-x64 Jun 3 2016 20:53:50"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Redorchestra2/1_response.txt b/gameq/tests/Protocols/Providers/Redorchestra2/1_response.txt new file mode 100644 index 0000000..7994b95 Binary files /dev/null and b/gameq/tests/Protocols/Providers/Redorchestra2/1_response.txt differ diff --git a/gameq/tests/Protocols/Providers/Redorchestra2/1_result.json b/gameq/tests/Protocols/Providers/Redorchestra2/1_result.json new file mode 100644 index 0000000..0e00adc --- /dev/null +++ b/gameq/tests/Protocols/Providers/Redorchestra2/1_result.json @@ -0,0 +1 @@ +{"70.42.74.39:7787":{"AdminContact":"","AlliesCampaignTerritories":"0","AxisCampaignTerritories":"0","FriendlyFire":"100","GameMode":"1","MapGame":"1","MapType":"1","MaxHonor":"100","MinHonor":"0","MutatorsRunning":"(\"SmartLoader.u\")","NumOpenPublicConnections":"1","NumPublicConnections":"64","OwningPlayerId":"0","OwningPlayerName":"[2.FJg] Rising Storm - Tactical Realism","PunkBusterLevel":"0","RealismLevel":"0","SpectatorMode":"0","SteamEngineVersion":"7258","bAntiCheatProtected":"True","bIsCampaignGame":"False","bIsDedicated":"False","bIsRanked":"True","bRequiresPassword":"False","bUsesStats":"True","dedicated":"l","game_descr":"Red Orchestra 2","game_dir":"ro2","game_id":35450,"gq_address":"70.42.74.39","gq_joinlink":"steam:\/\/connect\/70.42.74.39:7787\/","gq_name":"Red Orchestra 2","gq_online":true,"gq_port_client":7787,"gq_port_query":27025,"gq_protocol":"source","gq_transport":"udp","gq_type":"redorchestra2","hostname":"[2.FJg] Rising Storm - Tactical Realism","keywords":"a:64,s:1,b:1,e:1,m:0,h:1,c:0,d:0,n:0,o:0,i:1,g:0,k:100,j:0,t:100,r:1,u:1,f:0,l:,p:0,q:s|,","map":"RSTE-MaggotHill","max_players":64,"num_bots":0,"num_players":70,"num_rules":34,"os":"w","p0":"2","p1":"","p2":"RSTE-MaggotHill","p3":"0","p4":"100","p5":"0","p6":"100","p7":"0","p8":"1","p9":"0","password":0,"players":[{"id":0,"name":"worlder","score":5,"time":1013.0524291992},{"id":0,"name":"DeadlyFootFungi","score":91,"time":1013.0521240234},{"id":0,"name":"Duke of New York","score":31,"time":1013.051940918},{"id":0,"name":"CruciformSWORD","score":32,"time":1013.0517578125},{"id":0,"name":"Baranyk","score":30,"time":1013.0512695312},{"id":0,"name":"Scourge","score":28,"time":1013.0511474609},{"id":0,"name":"BTRY B 529th FA BN","score":62,"time":1013.0510253906},{"id":0,"name":"Division7Hills","score":110,"time":1013.0509643555},{"id":0,"name":"Mellie","score":26,"time":1013.0508422852},{"id":0,"name":"uberdave91","score":96,"time":1013.0507202148},{"id":0,"name":"A bag of onions","score":33,"time":1013.0505981445},{"id":0,"name":"Pablo","score":15,"time":1013.0504150391},{"id":0,"name":"Krimzon","score":180,"time":1013.0502929688},{"id":0,"name":"TribalCurve","score":124,"time":1013.0501708984},{"id":0,"name":"toine.113","score":27,"time":1013.0012207031},{"id":0,"name":"(Zach) FragBiter","score":30,"time":1012.9885253906},{"id":0,"name":"monkeymasher","score":98,"time":1012.9738769531},{"id":0,"name":"bobernaught","score":52,"time":1012.9682006836},{"id":0,"name":"FruityBunBuns","score":20,"time":1012.9680786133},{"id":0,"name":"Ace of Hearts","score":50,"time":1012.9678955078},{"id":0,"name":"Z0mbiekiller827","score":55,"time":1012.9672851562},{"id":0,"name":"Sticker and a Wheelc","score":28,"time":1012.9671020508},{"id":0,"name":"KingEvil","score":36,"time":1012.9669189453},{"id":0,"name":"jer_hunsberger","score":27,"time":1012.9666137695},{"id":0,"name":"Roshanak","score":60,"time":1012.9664916992},{"id":0,"name":"Rommel","score":84,"time":1012.9662475586},{"id":0,"name":"mojazz92","score":68,"time":1012.966003418},{"id":0,"name":"Deeble07","score":23,"time":1012.9658813477},{"id":0,"name":"flyinillini88","score":10,"time":1012.9657592773},{"id":0,"name":"DQ Mushroom Swiss","score":65,"time":1012.9656982422},{"id":0,"name":"Jeranger","score":19,"time":1012.9655761719},{"id":0,"name":"Flamingo the Pirate","score":40,"time":1012.9654541016},{"id":0,"name":"Waldo 17","score":29,"time":1012.953125},{"id":0,"name":"rogue163","score":42,"time":1012.9529418945},{"id":0,"name":"MuncyGunner","score":22,"time":1012.9019165039},{"id":0,"name":"20 Percent Above Ave","score":28,"time":1012.9017333984},{"id":0,"name":"Bob Hope","score":82,"time":1012.8996582031},{"id":0,"name":"Fametom900","score":78,"time":1012.8746948242},{"id":0,"name":"Askatasuna","score":78,"time":1012.8745117188},{"id":0,"name":"Lebrun","score":29,"time":1012.8662719727},{"id":0,"name":"Tichy#","score":27,"time":1012.8524169922},{"id":0,"name":"revenge of the wm1","score":55,"time":1012.8451538086},{"id":0,"name":"Cracker McGee","score":83,"time":1012.8430786133},{"id":0,"name":"Do0m[y]","score":110,"time":1012.8228149414},{"id":0,"name":"Gunnerside","score":14,"time":1012.789855957},{"id":0,"name":"Paddytehpyro [J-Serv","score":33,"time":1012.7623291016},{"id":0,"name":"Outlaw","score":21,"time":1012.7478027344},{"id":0,"name":"Kikkoman","score":64,"time":1012.7283325195},{"id":0,"name":"JohnnyMadKunt","score":124,"time":1012.7183227539},{"id":0,"name":"viktor-2008.79","score":4,"time":1012.7182006836},{"id":0,"name":"Hrafnar [YO!]","score":79,"time":1012.7037353516},{"id":0,"name":"MiGu3h","score":7,"time":1012.6434936523},{"id":0,"name":"=AMAN=_Charada250","score":32,"time":1012.6433105469},{"id":0,"name":"Newgame","score":47,"time":1012.5354614258},{"id":0,"name":"BK3","score":39,"time":1012.4039306641},{"id":0,"name":"USWarrior","score":57,"time":1010.7360839844},{"id":0,"name":"DatGuyJo","score":39,"time":998.43341064453},{"id":0,"name":"Grizzled RO1 Vet","score":65,"time":996.27392578125},{"id":0,"name":"Harry Bacon","score":37,"time":963.66705322266},{"id":0,"name":"[TCO] Sgt. Rock Fury","score":66,"time":947.62634277344},{"id":0,"name":"kelanousukaste","score":29,"time":666.89678955078},{"id":0,"name":"Bodkins(UK)","score":9,"time":652.37322998047},{"id":0,"name":"Clovah","score":11,"time":561.21655273438},{"id":0,"name":"Rieban","score":1,"time":487.34140014648},{"id":0,"name":"Spot","score":31,"time":459.11111450195},{"id":0,"name":"fatgleeson","score":8,"time":419.59140014648},{"id":0,"name":"Grosbolos","score":-4,"time":357.95526123047},{"id":0,"name":"Karma","score":0,"time":119.30563354492},{"id":0,"name":"","score":0,"time":119.05187988281},{"id":0,"name":"Covert_Tiger","score":0,"time":71.099876403809}],"port":7787,"protocol":17,"secure":1,"steam_id":90094348721876999,"steamappid":35450,"version":"2.0.0.19"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Redorchestra2/2_response.txt b/gameq/tests/Protocols/Providers/Redorchestra2/2_response.txt new file mode 100644 index 0000000..30a8fe5 Binary files /dev/null and b/gameq/tests/Protocols/Providers/Redorchestra2/2_response.txt differ diff --git a/gameq/tests/Protocols/Providers/Redorchestra2/2_result.json b/gameq/tests/Protocols/Providers/Redorchestra2/2_result.json new file mode 100644 index 0000000..e7e008d --- /dev/null +++ b/gameq/tests/Protocols/Providers/Redorchestra2/2_result.json @@ -0,0 +1 @@ +{"72.5.102.247:7777":{"AdminContact":"","AlliesCampaignTerritories":"5","AxisCampaignTerritories":"5","FriendlyFire":"100","GameMode":"1","MapGame":"0","MapType":"0","MaxHonor":"100","MinHonor":"0","MutatorsRunning":"","NumOpenPublicConnections":"1","NumPublicConnections":"64","OwningPlayerId":"0","OwningPlayerName":"|RD| PROFESSIONAL TERRITORY-CAMPAIGN.","PunkBusterLevel":"0","RealismLevel":"0","SpectatorMode":"0","SteamEngineVersion":"7258","bAntiCheatProtected":"True","bIsCampaignGame":"True","bIsDedicated":"False","bIsRanked":"True","bRequiresPassword":"False","bUsesStats":"True","dedicated":"l","game_descr":"Red Orchestra 2","game_dir":"ro2","game_id":35450,"gq_address":"72.5.102.247","gq_joinlink":"steam:\/\/connect\/72.5.102.247:7777\/","gq_name":"Red Orchestra 2","gq_online":true,"gq_port_client":7777,"gq_port_query":27015,"gq_protocol":"source","gq_transport":"udp","gq_type":"redorchestra2","hostname":"|RD| PROFESSIONAL TERRITORY-CAMPAIGN.","keywords":"a:64,s:1,b:1,e:1,m:1,h:1,c:0,d:0,n:5,o:5,i:1,g:0,k:100,j:0,t:100,r:0,u:0,f:0,l:,p:0,q:,","map":"TE-Rakowice_MCP","max_players":64,"num_bots":0,"num_players":65,"num_rules":34,"os":"w","p0":"2","p1":"","p2":"TE-Rakowice_MCP","p3":"0","p4":"100","p5":"1","p6":"100","p7":"0","p8":"1","p9":"0","password":0,"players":[{"id":0,"name":"ColoradoKush","score":38,"time":1304.9552001953},{"id":0,"name":"Gadamlu","score":64,"time":1304.9066162109},{"id":0,"name":"ESBlofeld","score":25,"time":1304.9064941406},{"id":0,"name":"tangosuckaGSC","score":20,"time":1304.90625},{"id":0,"name":"Chupacabra","score":87,"time":1304.9040527344},{"id":0,"name":"Rambo","score":0,"time":1304.9024658203},{"id":0,"name":"vermin","score":112,"time":1304.8575439453},{"id":0,"name":"Reddit","score":36,"time":1304.8572998047},{"id":0,"name":"lankage1","score":79,"time":1304.8571777344},{"id":0,"name":"A Small White Box","score":127,"time":1304.8570556641},{"id":0,"name":"T-KNUCKLES","score":41,"time":1304.8569335938},{"id":0,"name":"Echo Whiskey","score":39,"time":1304.8568115234},{"id":0,"name":"Spiele Dota","score":0,"time":1304.8566894531},{"id":0,"name":"ROPlayer2664","score":180,"time":1304.8564453125},{"id":0,"name":"VaGaBonD","score":153,"time":1304.8564453125},{"id":0,"name":"Prowrestler001","score":76,"time":1304.8562011719},{"id":0,"name":"Dred825","score":0,"time":1304.8560791016},{"id":0,"name":"MpSarge","score":30,"time":1304.8559570312},{"id":0,"name":"demurphy47","score":22,"time":1304.8555908203},{"id":0,"name":"int | Tricycle Fire","score":84,"time":1304.85546875},{"id":0,"name":"Ass Pound the Desect","score":28,"time":1304.8551025391},{"id":0,"name":"alec4558","score":147,"time":1304.8548583984},{"id":0,"name":"BullsEyeBart","score":63,"time":1304.8547363281},{"id":0,"name":"Nervybobcat","score":120,"time":1304.8546142578},{"id":0,"name":"Belphegor","score":40,"time":1304.8526611328},{"id":0,"name":"Twelve","score":86,"time":1304.8510742188},{"id":0,"name":"Legalize_gay_marinar","score":120,"time":1304.7548828125},{"id":0,"name":"Rufus9952","score":133,"time":1304.7486572266},{"id":0,"name":"Mr. Waldo","score":69,"time":1304.7391357422},{"id":0,"name":"LastNutria","score":5,"time":1304.7281494141},{"id":0,"name":"Amerakee","score":147,"time":1304.7265625},{"id":0,"name":"hockmah2","score":72,"time":1304.7082519531},{"id":0,"name":"eaglewarrior27","score":143,"time":1304.7081298828},{"id":0,"name":"Atoli","score":42,"time":1304.6788330078},{"id":0,"name":"gorillahands4","score":68,"time":1304.6787109375},{"id":0,"name":"Man_or_Astroman","score":49,"time":1304.6623535156},{"id":0,"name":"|President Rasputin","score":13,"time":1304.6622314453},{"id":0,"name":"FireFox-Miho","score":136,"time":1304.6535644531},{"id":0,"name":"olehen","score":43,"time":1304.6469726562},{"id":0,"name":"##pp###","score":105,"time":1304.6468505859},{"id":0,"name":"Bendy","score":47,"time":1304.6420898438},{"id":0,"name":"BRADREY","score":86,"time":1304.5491943359},{"id":0,"name":"ROPlayer2639","score":42,"time":1304.4912109375},{"id":0,"name":"[0 Coy] 76","score":79,"time":1304.4407958984},{"id":0,"name":"Fredo","score":125,"time":1304.3909912109},{"id":0,"name":"julio.magni","score":8,"time":1303.333984375},{"id":0,"name":"TRAP GOD","score":14,"time":1301.2165527344},{"id":0,"name":"Fat_Man09","score":85,"time":1282.1513671875},{"id":0,"name":"|Sad","score":16,"time":1226.4389648438},{"id":0,"name":"SCHMUCKATELLI","score":72,"time":1218.6187744141},{"id":0,"name":"Wubsy","score":18,"time":1213.4152832031},{"id":0,"name":"Wizzy","score":27,"time":1167.8348388672},{"id":0,"name":"SSGermanater","score":42,"time":1162.3328857422},{"id":0,"name":"gizmo31fr","score":5,"time":1083.9244384766},{"id":0,"name":"One_Man_Army","score":8,"time":1073.4337158203},{"id":0,"name":"Dauthaz","score":54,"time":801.07067871094},{"id":0,"name":"Jokazu","score":2,"time":678.93121337891},{"id":0,"name":"###","score":0,"time":621.84301757812},{"id":0,"name":"LordCC","score":0,"time":516.69146728516},{"id":0,"name":"Kilroy","score":0,"time":431.74523925781},{"id":0,"name":"gausho182","score":0,"time":423.06420898438},{"id":0,"name":"Communist Cat(Tradin","score":0,"time":154.16453552246},{"id":0,"name":"Sherb3rt","score":3,"time":127.28482055664},{"id":0,"name":"Boon","score":0,"time":102.12944030762},{"id":0,"name":"The_true_doge","score":0,"time":69.381576538086}],"port":7777,"protocol":17,"secure":1,"steam_id":90094486016507910,"steamappid":35450,"version":"2.0.0.19"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Risingstorm2/1_response.txt b/gameq/tests/Protocols/Providers/Risingstorm2/1_response.txt new file mode 100644 index 0000000..00535cf Binary files /dev/null and b/gameq/tests/Protocols/Providers/Risingstorm2/1_response.txt differ diff --git a/gameq/tests/Protocols/Providers/Risingstorm2/1_result.json b/gameq/tests/Protocols/Providers/Risingstorm2/1_result.json new file mode 100644 index 0000000..b4e1abf --- /dev/null +++ b/gameq/tests/Protocols/Providers/Risingstorm2/1_result.json @@ -0,0 +1 @@ +{"85.195.114.188:7777":{"AdminContact":"admins@clusterwars.net","FriendlyFire":"100","GameMode":"1","MapGame":"0","MapType":"0","MaxHonor":"100","MinHonor":"0","MutatorsRunning":"","NumOpenPublicConnections":"51","NumPublicConnections":"64","OwningPlayerId":"0","OwningPlayerName":" =]RC[= STRATEGO - RS2 Vietnam TE","RealismLevel":"0","SpectatorMode":"0","SteamEngineVersion":"7258","bAntiCheatProtected":"True","bIsCampaignGame":"False","bIsDedicated":"False","bIsRanked":"True","bRequiresPassword":"False","bUsesStats":"True","dedicated":"d","game_descr":"Rising Storm 2","game_dir":"RS2","game_id":418460,"gq_address":"85.195.114.188","gq_joinlink":"steam:\/\/connect\/85.195.114.188:7777\/","gq_name":"Rising Storm 2","gq_online":true,"gq_port_client":7777,"gq_port_query":27015,"gq_protocol":"source","gq_transport":"udp","gq_type":"rising storm 2","hostname":" =]RC[= STRATEGO - RS2 Vietnam TE","keywords":"a:64,s:51,b:1,e:1,m:0,h:1,c:0,d:0,i:1,g:0,k:100,j:0,t:100,r:0,u:0,l:admins@clusterwars.net,p:0,q:,","map":"VNTE-SongBe","max_players":64,"num_bots":0,"num_players":14,"num_rules":30,"os":"w","p0":"0","p1":"admins@clusterwars.net","p2":"VNTE-SongBe","p3":"0","p4":"100","p5":"0","p6":"100","p7":"0","p8":"1","password":0,"players":[{"id":0,"name":"","score":0,"time":175984.09375},{"id":0,"name":"Slevin","score":208,"time":1106.2414550781},{"id":0,"name":"Genocide","score":69,"time":1106.2397460938},{"id":0,"name":"Captain Pablo","score":128,"time":1106.1923828125},{"id":0,"name":"Pimpin le Vermintici","score":57,"time":1106.1922607422},{"id":0,"name":"Jimmy","score":93,"time":1106.1920166016},{"id":0,"name":"shiina_mashiro","score":256,"time":1106.16015625},{"id":0,"name":"kilo_200","score":72,"time":1106.1572265625},{"id":0,"name":"daniel","score":40,"time":1106.1424560547},{"id":0,"name":"SoupDragon","score":304,"time":1106.1348876953},{"id":0,"name":"rileyforprez2036","score":0,"time":1106.0163574219},{"id":0,"name":"derangedwartomato","score":63,"time":1105.7180175781},{"id":0,"name":"Howzer","score":0,"time":1104.5264892578},{"id":0,"name":"Roiberto","score":25,"time":1085.9934082031}],"port":7777,"protocol":17,"secure":1,"steam_id":90110703944269833,"steamappid":0,"version":"1026"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Risingstorm2/2_response.txt b/gameq/tests/Protocols/Providers/Risingstorm2/2_response.txt new file mode 100644 index 0000000..df97157 Binary files /dev/null and b/gameq/tests/Protocols/Providers/Risingstorm2/2_response.txt differ diff --git a/gameq/tests/Protocols/Providers/Risingstorm2/2_result.json b/gameq/tests/Protocols/Providers/Risingstorm2/2_result.json new file mode 100644 index 0000000..2eaf465 --- /dev/null +++ b/gameq/tests/Protocols/Providers/Risingstorm2/2_result.json @@ -0,0 +1 @@ +{"85.159.42.196:8777":{"AdminContact":"","AlliesCampaignTerritories":"0","AxisCampaignTerritories":"0","FriendlyFire":"100","GameMode":"1","MapGame":"0","MapType":"1","MaxHonor":"100","MinHonor":"0","MutatorsRunning":"","NumOpenPublicConnections":"64","NumPublicConnections":"64","OwningPlayerId":"0","OwningPlayerName":" Front RussianCommunity 24\/7 TE [RedOrchestra.ru] ","PunkBusterLevel":"0","RealismLevel":"3","SpectatorMode":"1","SteamEngineVersion":"7258","bAntiCheatProtected":"True","bIsCampaignGame":"False","bIsDedicated":"False","bIsRanked":"True","bRequiresPassword":"False","bUsesStats":"True","dedicated":"l","game_descr":"Red Orchestra 2","game_dir":"ro2","game_id":35450,"gq_address":"85.159.42.196","gq_joinlink":"steam:\/\/connect\/85.159.42.196:8777\/","gq_name":"Rising Storm 2","gq_online":true,"gq_port_client":8777,"gq_port_query":27015,"gq_protocol":"source","gq_transport":"udp","gq_type":"rising storm 2","hostname":" Front RussianCommunity 24\/7 TE [RedOrchestra.ru] ","keywords":"a:64,s:64,b:1,e:1,m:0,h:1,c:0,d:0,n:0,o:0,i:1,g:3,k:100,j:0,t:100,r:1,u:0,f:0,l:,p:1,q:,","map":"TE-Coldsteel_MCP","max_players":64,"num_bots":0,"num_players":0,"num_rules":34,"os":"w","p0":"2","p1":"","p2":"TE-Coldsteel_MCP","p3":"0","p4":"100","p5":"0","p6":"100","p7":"3","p8":"1","p9":"0","password":0,"port":7777,"protocol":17,"secure":1,"steam_id":90110727896296448,"steamappid":35450,"version":"2.0.0.20"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Risingstorm2/3_response.txt b/gameq/tests/Protocols/Providers/Risingstorm2/3_response.txt new file mode 100644 index 0000000..3f116c1 Binary files /dev/null and b/gameq/tests/Protocols/Providers/Risingstorm2/3_response.txt differ diff --git a/gameq/tests/Protocols/Providers/Risingstorm2/3_result.json b/gameq/tests/Protocols/Providers/Risingstorm2/3_result.json new file mode 100644 index 0000000..e924d2b --- /dev/null +++ b/gameq/tests/Protocols/Providers/Risingstorm2/3_result.json @@ -0,0 +1 @@ +{"74.91.115.81:7777":{"AdminContact":"http:\/\/Discord.me\/Bloodbath\/","FriendlyFire":"100","GameMode":"1","MapGame":"0","MapType":"0","MaxHonor":"100","MinHonor":"0","MutatorsRunning":"","NumOpenPublicConnections":"0","NumPublicConnections":"64","OwningPlayerId":"0","OwningPlayerName":" Bloodbath: Broken Arrow [Custom Maps] [Map Voting]","RealismLevel":"0","SpectatorMode":"0","SteamEngineVersion":"7258","bAntiCheatProtected":"True","bIsCampaignGame":"False","bIsDedicated":"False","bIsRanked":"True","bRequiresPassword":"False","bUsesStats":"True","dedicated":"d","game_descr":"Rising Storm 2","game_dir":"RS2","game_id":418460,"gq_address":"74.91.115.81","gq_joinlink":"steam:\/\/connect\/74.91.115.81:7777\/","gq_name":"Rising Storm 2","gq_online":true,"gq_port_client":7777,"gq_port_query":27015,"gq_protocol":"source","gq_transport":"udp","gq_type":"rising storm 2","hostname":" Bloodbath: Broken Arrow [Custom Maps] [Map Voting]","keywords":"a:64,s:0,b:1,e:1,m:0,h:1,c:0,d:0,i:1,g:0,k:100,j:0,t:100,r:0,u:0,l:http:\/\/Discord.me\/Bloodbath\/,p:0,q:,","map":"VNTE-DeweyCanyonII","max_players":64,"num_bots":0,"num_players":65,"num_rules":30,"os":"w","p0":"0","p1":"http:\/\/Discord.me\/Bloodbath\/","p2":"VNTE-DeweyCanyonII","p3":"0","p4":"100","p5":"0","p6":"100","p7":"0","p8":"1","password":0,"players":[{"id":0,"name":"","score":0,"time":18730.984375},{"id":0,"name":"A_Mustang","score":130,"time":1110.5479736328},{"id":0,"name":"rjoyce26","score":57,"time":1110.5478515625},{"id":0,"name":"OHRedneck","score":52,"time":1110.5476074219},{"id":0,"name":"RommelMcDonald","score":0,"time":1110.5103759766},{"id":0,"name":"Colton","score":70,"time":1110.5079345703},{"id":0,"name":"Machack","score":12,"time":1110.4842529297},{"id":0,"name":"Thrashaero","score":214,"time":1110.4841308594},{"id":0,"name":"Retro","score":97,"time":1110.4810791016},{"id":0,"name":"B Squared99","score":261,"time":1110.4494628906},{"id":0,"name":"Jesco White","score":314,"time":1110.4494628906},{"id":0,"name":"A Wizard","score":211,"time":1110.44921875},{"id":0,"name":"SOPE","score":129,"time":1110.44921875},{"id":0,"name":"For My Sins","score":134,"time":1110.44921875},{"id":0,"name":"TheRick","score":80,"time":1110.4490966797},{"id":0,"name":"Colonel Cuck","score":46,"time":1110.4444580078},{"id":0,"name":"Falixx","score":0,"time":1110.4443359375},{"id":0,"name":"Pvt Milhouse","score":21,"time":1110.4420166016},{"id":0,"name":"DistressedPotato","score":213,"time":1110.4202880859},{"id":0,"name":"Ariston","score":47,"time":1110.4201660156},{"id":0,"name":"Radium","score":116,"time":1110.4200439453},{"id":0,"name":"Prince Kira","score":105,"time":1110.4200439453},{"id":0,"name":"Entroper","score":125,"time":1110.419921875},{"id":0,"name":"CaptainKyle","score":167,"time":1110.4165039062},{"id":0,"name":"Tremors Van Zant","score":26,"time":1110.4058837891},{"id":0,"name":"ImJustlln","score":63,"time":1110.3767089844},{"id":0,"name":"AtlasLegan","score":108,"time":1110.3765869141},{"id":0,"name":"Animal Mother","score":115,"time":1110.3591308594},{"id":0,"name":"Manganese","score":186,"time":1110.3566894531},{"id":0,"name":"Bubbles","score":119,"time":1110.3566894531},{"id":0,"name":"ninjablooper","score":98,"time":1110.3406982422},{"id":0,"name":"_DirtWizard_","score":79,"time":1110.3325195312},{"id":0,"name":"lieutenant buttfuck","score":0,"time":1110.330078125},{"id":0,"name":"thefauxjew","score":70,"time":1110.3212890625},{"id":0,"name":"HockyPuk","score":128,"time":1110.3211669922},{"id":0,"name":"Immunity","score":127,"time":1110.2974853516},{"id":0,"name":"Kip","score":171,"time":1110.2762451172},{"id":0,"name":"Cinnamon","score":0,"time":1109.9957275391},{"id":0,"name":"cavaleirozero","score":111,"time":1109.9669189453},{"id":0,"name":"dosho28","score":136,"time":1109.80078125},{"id":0,"name":"Júnior","score":95,"time":1109.7561035156},{"id":0,"name":"General Plastro","score":363,"time":1109.7559814453},{"id":0,"name":"JJoeb","score":102,"time":1109.6545410156},{"id":0,"name":"","score":0,"time":1109.6197509766},{"id":0,"name":"TOBAD4HELL","score":116,"time":1109.4210205078},{"id":0,"name":"solid016rafael","score":67,"time":1108.9755859375},{"id":0,"name":"UndeadCadavre","score":82,"time":1073.4222412109},{"id":0,"name":"Foehammer114","score":172,"time":1040.2899169922},{"id":0,"name":"morganleepainting","score":56,"time":1035.3321533203},{"id":0,"name":"weektor","score":95,"time":1026.5035400391},{"id":0,"name":"nlsonblck","score":113,"time":974.05200195312},{"id":0,"name":"BilliamJ","score":117,"time":835.88848876953},{"id":0,"name":"Jefferson Davis","score":54,"time":784.64739990234},{"id":0,"name":"Scix","score":39,"time":773.1494140625},{"id":0,"name":"[RGN] MADDOG","score":117,"time":722.05578613281},{"id":0,"name":"wareagle0823","score":171,"time":720.24334716797},{"id":0,"name":"NRAdude45","score":35,"time":700.30499267578},{"id":0,"name":"Big Booty Judy","score":36,"time":694.67279052734},{"id":0,"name":"Mc.Glubbings","score":107,"time":690.72814941406},{"id":0,"name":"Jirzan","score":76,"time":684.99932861328},{"id":0,"name":"Henrique Lique","score":8,"time":572.04522705078},{"id":0,"name":"Big Buttles","score":17,"time":560.79028320312},{"id":0,"name":"REVIEW BRAH","score":45,"time":560.52294921875},{"id":0,"name":"alex","score":0,"time":167.55917358398},{"id":0,"name":"TheManAntonyo","score":0,"time":154.08596801758}],"port":7777,"protocol":17,"secure":1,"steam_id":90110750993843208,"steamappid":0,"version":"1026"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Rust/1_response.txt b/gameq/tests/Protocols/Providers/Rust/1_response.txt new file mode 100644 index 0000000..cc73533 Binary files /dev/null and b/gameq/tests/Protocols/Providers/Rust/1_response.txt differ diff --git a/gameq/tests/Protocols/Providers/Rust/1_result.json b/gameq/tests/Protocols/Providers/Rust/1_result.json new file mode 100644 index 0000000..923eacc --- /dev/null +++ b/gameq/tests/Protocols/Providers/Rust/1_result.json @@ -0,0 +1 @@ +{"192.223.27.22:28001":{"build":"757.81","country":"","dedicated":"l","description_00":"\\n\\n WOW \\n ","description_01":" GREAT AMMO \\n MANY DEATH \\n ","description_02":" MUCH KITS \\n ","description_03":" SUCH BATTLEFIELD \\n WOW","description_04":"","description_05":"","description_06":"","description_07":"","description_08":"","description_09":"","description_10":"","description_11":"","description_12":"","description_13":"","description_14":"","description_15":"","ent_cnt":"37173","fps":"159","fps_avg":"151.18","game_descr":"rust_server","game_dir":"rust","game_id":252490,"gc_cl":"443","gc_mb":"1308","gq_address":"192.223.27.22","gq_joinlink":"steam:\/\/connect\/192.223.27.22:28001\/","gq_name":"Rust","gq_online":true,"gq_port_client":28001,"gq_port_query":28001,"gq_protocol":"source","gq_transport":"udp","gq_type":"rust","headerimage":"http:\/\/i.imgur.com\/lpU2e2O.jpg","hostname":"RUSTICITY :: BATTLEFIELD|10X|KITS|GUNS|MEGALOOT","io":"sl213,tm20,tr10","keywords":"oxide,modded,mp125,cp93,v1344","map":"Procedural Map","max_players":125,"mem_pv":"3386","mem_ws":"3332","num_bots":0,"num_players":94,"num_rules":32,"os":"w","password":0,"players":[{"id":0,"name":"","score":0,"time":13463.98828125},{"id":0,"name":"","score":0,"time":13425.509765625},{"id":0,"name":"","score":0,"time":13334.126953125},{"id":0,"name":"","score":0,"time":11069.66015625},{"id":0,"name":"","score":0,"time":9405.67578125},{"id":0,"name":"","score":0,"time":9321.2412109375},{"id":0,"name":"","score":0,"time":9170.8095703125},{"id":0,"name":"","score":0,"time":9154.7021484375},{"id":0,"name":"","score":0,"time":9090.65234375},{"id":0,"name":"","score":0,"time":7264.734375},{"id":0,"name":"","score":0,"time":7160.7553710938},{"id":0,"name":"","score":0,"time":6815.6196289062},{"id":0,"name":"","score":0,"time":5791.1787109375},{"id":0,"name":"","score":0,"time":5486.2021484375},{"id":0,"name":"","score":0,"time":5457.2573242188},{"id":0,"name":"","score":0,"time":5397.8369140625},{"id":0,"name":"","score":0,"time":5288.8383789062},{"id":0,"name":"","score":0,"time":5063.8452148438},{"id":0,"name":"","score":0,"time":4833.3051757812},{"id":0,"name":"","score":0,"time":4366.7709960938},{"id":0,"name":"","score":0,"time":4212.3979492188},{"id":0,"name":"","score":0,"time":4121.1918945312},{"id":0,"name":"","score":0,"time":3822.380859375},{"id":0,"name":"","score":0,"time":3685.8579101562},{"id":0,"name":"","score":0,"time":3670.0378417969},{"id":0,"name":"","score":0,"time":3655.3662109375},{"id":0,"name":"","score":0,"time":3550.078125},{"id":0,"name":"","score":0,"time":3479.8706054688},{"id":0,"name":"","score":0,"time":3396.7663574219},{"id":0,"name":"","score":0,"time":3270.2849121094},{"id":0,"name":"","score":0,"time":3245.1994628906},{"id":0,"name":"","score":0,"time":3198.5695800781},{"id":0,"name":"","score":0,"time":3181.7751464844},{"id":0,"name":"","score":0,"time":3179.3481445312},{"id":0,"name":"","score":0,"time":3163.2678222656},{"id":0,"name":"","score":0,"time":3063.7858886719},{"id":0,"name":"","score":0,"time":2896.4953613281},{"id":0,"name":"","score":0,"time":2877.6684570312},{"id":0,"name":"","score":0,"time":2793.3645019531},{"id":0,"name":"","score":0,"time":2675.9079589844},{"id":0,"name":"","score":0,"time":2463.9650878906},{"id":0,"name":"","score":0,"time":2352.7939453125},{"id":0,"name":"","score":0,"time":2150.0920410156},{"id":0,"name":"","score":0,"time":2101.0954589844},{"id":0,"name":"","score":0,"time":2029.8638916016},{"id":0,"name":"","score":0,"time":2000.6716308594},{"id":0,"name":"","score":0,"time":1824.28125},{"id":0,"name":"","score":0,"time":1802.5744628906},{"id":0,"name":"","score":0,"time":1745.7233886719},{"id":0,"name":"","score":0,"time":1741.4007568359},{"id":0,"name":"","score":0,"time":1721.6961669922},{"id":0,"name":"","score":0,"time":1703.1785888672},{"id":0,"name":"","score":0,"time":1625.9567871094},{"id":0,"name":"","score":0,"time":1585.7857666016},{"id":0,"name":"","score":0,"time":1467.6016845703},{"id":0,"name":"","score":0,"time":1446.4173583984},{"id":0,"name":"","score":0,"time":1427.6237792969},{"id":0,"name":"","score":0,"time":1326.8927001953},{"id":0,"name":"","score":0,"time":1321.9521484375},{"id":0,"name":"","score":0,"time":1246.55078125},{"id":0,"name":"","score":0,"time":1159.3245849609},{"id":0,"name":"","score":0,"time":1152.3325195312},{"id":0,"name":"","score":0,"time":1141.8173828125},{"id":0,"name":"","score":0,"time":1129.2806396484},{"id":0,"name":"","score":0,"time":1128.6281738281},{"id":0,"name":"","score":0,"time":1090.5991210938},{"id":0,"name":"","score":0,"time":1081.1143798828},{"id":0,"name":"","score":0,"time":1018.2717895508},{"id":0,"name":"","score":0,"time":776.71624755859},{"id":0,"name":"","score":0,"time":758.28912353516},{"id":0,"name":"","score":0,"time":756.61065673828},{"id":0,"name":"","score":0,"time":701.84796142578},{"id":0,"name":"","score":0,"time":668.72772216797},{"id":0,"name":"","score":0,"time":662.3310546875},{"id":0,"name":"","score":0,"time":494.56890869141},{"id":0,"name":"","score":0,"time":477.20043945312},{"id":0,"name":"","score":0,"time":458.74383544922},{"id":0,"name":"","score":0,"time":434.09942626953},{"id":0,"name":"","score":0,"time":406.33905029297},{"id":0,"name":"","score":0,"time":369.43530273438},{"id":0,"name":"","score":0,"time":354.20465087891},{"id":0,"name":"","score":0,"time":335.03375244141},{"id":0,"name":"","score":0,"time":329.50024414062},{"id":0,"name":"","score":0,"time":319.25552368164},{"id":0,"name":"","score":0,"time":310.80859375},{"id":0,"name":"","score":0,"time":298.22506713867},{"id":0,"name":"","score":0,"time":245.13166809082},{"id":0,"name":"","score":0,"time":174.95889282227},{"id":0,"name":"","score":0,"time":122.3503036499},{"id":0,"name":"","score":0,"time":118.84279632568},{"id":0,"name":"","score":0,"time":93.245552062988},{"id":0,"name":"","score":0,"time":72.206031799316},{"id":0,"name":"","score":0,"time":59.794872283936},{"id":0,"name":"","score":0,"time":4.8901104927063}],"port":28001,"protocol":17,"pve":"False","secure":1,"steam_id":90098931026410505,"steamappid":0,"uptime":"14359","url":"http:\/\/map.playrust.io\/?104.153.107.38:28001","version":"1344","world.seed":"1071987","world.size":"2600"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Rust/2_response.txt b/gameq/tests/Protocols/Providers/Rust/2_response.txt new file mode 100644 index 0000000..bbea014 Binary files /dev/null and b/gameq/tests/Protocols/Providers/Rust/2_response.txt differ diff --git a/gameq/tests/Protocols/Providers/Rust/2_result.json b/gameq/tests/Protocols/Providers/Rust/2_result.json new file mode 100644 index 0000000..23543e7 --- /dev/null +++ b/gameq/tests/Protocols/Providers/Rust/2_result.json @@ -0,0 +1 @@ +{"45.121.211.113:49505":{"build":"757.81","country":"","dedicated":"l","description_00":"Gaming is Life Community Server 500xGather 15 minute aridrops \\n \\n Plugins: AutoDoor, AutoFurnace, ","description_01":"BetterLoot, CraftingController (Insta), Kits, Teleportation (Set home & tpr), QuickSmelt, RemoverToo","description_02":"l, SkipNightVote, StackSizeController & TwigsDecay(no decay). \\n Server Rules: No Cheating or you WI","description_03":"LL be banned. \\n No greifing. Raid but don't destroy a base just for the sake of it. \\n Racial slurs","description_04":" in chat will not be tolerated. \\n MOST IMPORTANT Have Fun! \\n Click The Website link to see the map","description_05":".","description_06":"","description_07":"","description_08":"","description_09":"","description_10":"","description_11":"","description_12":"","description_13":"","description_14":"","description_15":"","ent_cnt":"78446","fps":"260","fps_avg":"259.78","game_descr":"rust_server","game_dir":"rust","game_id":252490,"gc_cl":"68","gc_mb":"1594","gq_address":"45.121.211.113","gq_joinlink":"steam:\/\/connect\/45.121.211.113:49505\/","gq_name":"Rust","gq_online":true,"gq_port_client":49505,"gq_port_query":49505,"gq_protocol":"source","gq_transport":"udp","gq_type":"rust","headerimage":"http:\/\/i.imgur.com\/1NrlcvA.png","hostname":"AuNz Rust Is Life Wiped every Friday 500x,TP,Insta,Stacks,Rads","io":"sl72,tm17,tr10","keywords":"oxide,modded,mp50,cp0,v1344","map":"Procedural Map","max_players":50,"mem_pv":"2969","mem_ws":"2878","num_bots":0,"num_players":0,"num_rules":32,"os":"w","password":0,"port":-16031,"protocol":17,"pve":"False","secure":1,"steam_id":90098932496747529,"steamappid":0,"uptime":"6964","url":"https:\/\/www.streamline-servers.com","version":"1344","world.seed":"1946125","world.size":"4000"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Samp/1_response.txt b/gameq/tests/Protocols/Providers/Samp/1_response.txt new file mode 100644 index 0000000..e502e05 Binary files /dev/null and b/gameq/tests/Protocols/Providers/Samp/1_response.txt differ diff --git a/gameq/tests/Protocols/Providers/Samp/1_result.json b/gameq/tests/Protocols/Providers/Samp/1_result.json new file mode 100644 index 0000000..5ab7e99 --- /dev/null +++ b/gameq/tests/Protocols/Providers/Samp/1_result.json @@ -0,0 +1 @@ +{"93.119.26.201:7777":{"dedicated":true,"gametype":"GFZONE RPG v6.2.8c","gq_address":"93.119.26.201","gq_joinlink":"","gq_name":"San Andreas Multiplayer","gq_online":true,"gq_port_client":7777,"gq_port_query":7777,"gq_protocol":"samp","gq_transport":"udp","gq_type":"samp","lagcomp":"On","language":"Romanian\/English","mapname":"San Andreas","max_players":350,"num_players":34,"num_rules":6,"password":false,"players":[{"id":0,"name":"Unchiu","score":33,"ping":21},{"id":1,"name":"FighteR","score":86,"ping":19},{"id":2,"name":"AjMERAjMER","score":53,"ping":36},{"id":3,"name":"Host.","score":27,"ping":25},{"id":4,"name":"[ESL]Biceps","score":25,"ping":16},{"id":6,"name":"BuZz","score":17,"ping":21},{"id":7,"name":"Bibanu","score":5,"ping":40},{"id":9,"name":"vibe.","score":27,"ping":25},{"id":12,"name":"R@Ul","score":25,"ping":46},{"id":18,"name":"CaptainBoom","score":24,"ping":46},{"id":21,"name":"PinK","score":13,"ping":24},{"id":22,"name":"PotancaEinocent","score":6,"ping":15},{"id":23,"name":"YaLL","score":5,"ping":19},{"id":24,"name":"DOZE","score":8,"ping":25},{"id":25,"name":"[F3]KiNTA","score":39,"ping":24},{"id":27,"name":"KEN","score":80,"ping":26},{"id":29,"name":"Blindius","score":21,"ping":14},{"id":30,"name":"guabyy","score":16,"ping":20},{"id":31,"name":"KnND_196","score":12,"ping":21},{"id":34,"name":"Meryen","score":40,"ping":26},{"id":35,"name":"Jah","score":54,"ping":20},{"id":36,"name":"ZAGGYY","score":13,"ping":40},{"id":37,"name":"BoGDan","score":11,"ping":30},{"id":47,"name":"LiNu","score":32,"ping":26},{"id":51,"name":"SirRazvano","score":13,"ping":26},{"id":53,"name":"hd.GFZ","score":20,"ping":157},{"id":78,"name":"MaRio","score":38,"ping":26},{"id":99,"name":"sPz.","score":20,"ping":51},{"id":102,"name":"ShifT","score":69,"ping":26},{"id":106,"name":"BeLoDeDiky","score":5,"ping":24},{"id":119,"name":"ReDix","score":49,"ping":20},{"id":149,"name":"RaLuCa","score":3,"ping":71},{"id":169,"name":"FaLc0N","score":6,"ping":26},{"id":170,"name":"jrD","score":32,"ping":41}],"servername":"GFZONE: RPG Server [0.3.7]","version":"0.3.7-R2","weather":"10","weburl":"www.gfzone.ro\/forum","worldtime":"05:00"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Samp/2_response.txt b/gameq/tests/Protocols/Providers/Samp/2_response.txt new file mode 100644 index 0000000..e69de29 diff --git a/gameq/tests/Protocols/Providers/Samp/2_result.json b/gameq/tests/Protocols/Providers/Samp/2_result.json new file mode 100644 index 0000000..198891f --- /dev/null +++ b/gameq/tests/Protocols/Providers/Samp/2_result.json @@ -0,0 +1 @@ +{"91.121.97.26:7791":{"gq_address":"91.121.97.26","gq_joinlink":"","gq_name":"San Andreas Multiplayer","gq_online":false,"gq_port_client":7791,"gq_port_query":7791,"gq_protocol":"samp","gq_transport":"udp","gq_type":"samp"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Sevendaystodie/1_response.txt b/gameq/tests/Protocols/Providers/Sevendaystodie/1_response.txt new file mode 100644 index 0000000..993c8f4 Binary files /dev/null and b/gameq/tests/Protocols/Providers/Sevendaystodie/1_response.txt differ diff --git a/gameq/tests/Protocols/Providers/Sevendaystodie/1_result.json b/gameq/tests/Protocols/Providers/Sevendaystodie/1_result.json new file mode 100644 index 0000000..6e114af --- /dev/null +++ b/gameq/tests/Protocols/Providers/Sevendaystodie/1_result.json @@ -0,0 +1 @@ +{"64.94.95.106:25341":{"AirDropFrequency":"72","AirDropMarker":"False","Architecture64":"True","BlockDurabilityModifier":"100","BuildCreate":"False","CompatibilityVersion":"Alpha 15","CountryCode":"XX","CurrentPlayers":"10","CurrentServerTime":"31540904","DayCount":"3","DayLightLength":"18","DayNightLength":"50","DropOnDeath":"0","DropOnQuit":"0","EACEnabled":"True","EnemyDifficulty":"1","EnemySenseMemory":"60","EnemySpawnMode":"3","GameDifficulty":"4","GameHost":"All Night Gamers (A) | Admins | USA | PvE Only |","GameMode":"SurvivalMP","GameName":"ziotlen3","GameType":"7DTD","IP":"64.94.95.106","IsDedicated":"True","IsPasswordProtected":"False","LandClaimDeadZone":"15","LandClaimDecayMode":"2","LandClaimExpiryTime":"7","LandClaimOfflineDurabilityModifier":"0","LandClaimOnlineDurabilityModifier":"0","LandClaimSize":"21","LevelName":"Random Gen","LootAbundance":"100","LootRespawnDays":"30","MaxPlayers":"50","MaxSpawnedAnimals":"75","MaxSpawnedZombies":"75","Ping":"-1","Platform":"WindowsPlayer","PlayerKillingMode":"0","Port":"25341","RequiresMod":"False","ServerDescription":"Friendly PvE players wanted.","ServerWebsiteURL":"","ShowFriendPlayerOnMap":"True","SteamID":"90105371493633028","StockFiles":"True","StockSettings":"True","Version":"Alpha 15","ZombiesRun":"0","dedicated":"d","game_descr":"7 Days To Die","game_dir":"7DTD","game_id":251570,"gq_address":"64.94.95.106","gq_joinlink":"steam:\/\/connect\/64.94.95.106:25341\/","gq_name":"7 Days to Die","gq_online":true,"gq_port_client":25341,"gq_port_query":25342,"gq_protocol":"source","gq_transport":"udp","gq_type":"sevendaystodie","hostname":"All Night Gamers (A) | Admins | USA | PvE Only |","keywords":"1;1;1;1;0;0;4;1;","map":"Random Gen","max_players":50,"num_bots":0,"num_players":11,"num_rules":51,"os":"w","password":0,"players":[{"id":0,"name":"","score":0,"time":6938.0610351562},{"id":0,"name":"","score":0,"time":6886.0043945312},{"id":0,"name":"","score":0,"time":6547.015625},{"id":0,"name":"","score":0,"time":6281.1879882812},{"id":0,"name":"","score":0,"time":5972.138671875},{"id":0,"name":"","score":0,"time":5514.2905273438},{"id":0,"name":"","score":0,"time":2185.7521972656},{"id":0,"name":"","score":0,"time":1913.5505371094},{"id":0,"name":"","score":0,"time":974.35504150391},{"id":0,"name":"","score":0,"time":113.64181518555},{"id":0,"name":"","score":0,"time":9.2815980911255}],"port":25341,"protocol":17,"secure":0,"steam_id":90105371493633028,"steamappid":0,"version":"00.15.00"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Sevendaystodie/2_response.txt b/gameq/tests/Protocols/Providers/Sevendaystodie/2_response.txt new file mode 100644 index 0000000..e87023e Binary files /dev/null and b/gameq/tests/Protocols/Providers/Sevendaystodie/2_response.txt differ diff --git a/gameq/tests/Protocols/Providers/Sevendaystodie/2_result.json b/gameq/tests/Protocols/Providers/Sevendaystodie/2_result.json new file mode 100644 index 0000000..3cb6e24 --- /dev/null +++ b/gameq/tests/Protocols/Providers/Sevendaystodie/2_result.json @@ -0,0 +1 @@ +{"173.234.30.74:22814":{"AirDropFrequency":"72","AirDropMarker":"False","Architecture64":"True","BlockDurabilityModifier":"100","BuildCreate":"False","CompatibilityVersion":"Alpha 15","CountryCode":"XX","CurrentPlayers":"13","CurrentServerTime":"31744145","DayCount":"3","DayLightLength":"18","DayNightLength":"50","DropOnDeath":"0","DropOnQuit":"0","EACEnabled":"True","EnemyDifficulty":"1","EnemySenseMemory":"60","EnemySpawnMode":"3","GameDifficulty":"4","GameHost":"All Night Gamers (B) | Admins | USA | PvE Only |","GameMode":"SurvivalMP","GameName":"pion34","GameType":"7DTD","IP":"173.234.30.74","IsDedicated":"True","IsPasswordProtected":"False","LandClaimDeadZone":"15","LandClaimDecayMode":"2","LandClaimExpiryTime":"7","LandClaimOfflineDurabilityModifier":"0","LandClaimOnlineDurabilityModifier":"0","LandClaimSize":"21","LevelName":"Random Gen","LootAbundance":"100","LootRespawnDays":"30","MaxPlayers":"50","MaxSpawnedAnimals":"50","MaxSpawnedZombies":"75","Ping":"-1","Platform":"WindowsPlayer","PlayerKillingMode":"0","Port":"22814","RequiresMod":"False","ServerDescription":"Friendly PvE players wanted","ServerWebsiteURL":"","ShowFriendPlayerOnMap":"True","SteamID":"90105371909004295","StockFiles":"True","StockSettings":"True","Version":"Alpha 15","ZombiesRun":"0","dedicated":"d","game_descr":"7 Days To Die","game_dir":"7DTD","game_id":251570,"gq_address":"173.234.30.74","gq_joinlink":"steam:\/\/connect\/173.234.30.74:22814\/","gq_name":"7 Days to Die","gq_online":true,"gq_port_client":22814,"gq_port_query":22815,"gq_protocol":"source","gq_transport":"udp","gq_type":"sevendaystodie","hostname":"All Night Gamers (B) | Admins | USA | PvE Only |","keywords":"1;1;1;1;0;0;4;1;","map":"Random Gen","max_players":50,"num_bots":0,"num_players":13,"num_rules":51,"os":"w","password":0,"players":[{"id":0,"name":"","score":0,"time":4929.2446289062},{"id":0,"name":"","score":0,"time":4928.4418945312},{"id":0,"name":"","score":0,"time":4926.47265625},{"id":0,"name":"","score":0,"time":4206.7333984375},{"id":0,"name":"","score":0,"time":3436.2412109375},{"id":0,"name":"","score":0,"time":2710.3879394531},{"id":0,"name":"","score":0,"time":2329.5681152344},{"id":0,"name":"","score":0,"time":1564.7233886719},{"id":0,"name":"","score":0,"time":1412.8809814453},{"id":0,"name":"","score":0,"time":1029.9963378906},{"id":0,"name":"","score":0,"time":752.91870117188},{"id":0,"name":"","score":0,"time":715.45239257812},{"id":0,"name":"","score":0,"time":489.68960571289}],"port":22814,"protocol":17,"secure":0,"steam_id":90105371909004295,"steamappid":0,"version":"00.15.00"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Ship/1_response.txt b/gameq/tests/Protocols/Providers/Ship/1_response.txt new file mode 100644 index 0000000..c34eff3 Binary files /dev/null and b/gameq/tests/Protocols/Providers/Ship/1_response.txt differ diff --git a/gameq/tests/Protocols/Providers/Ship/1_result.json b/gameq/tests/Protocols/Providers/Ship/1_result.json new file mode 100644 index 0000000..0d4cfe4 --- /dev/null +++ b/gameq/tests/Protocols/Providers/Ship/1_result.json @@ -0,0 +1 @@ +{"198.100.156.163:27017":{"coop":"0","deathmatch":"1","decalfrequency":"10","dedicated":"d","game_descr":"The Ship","game_dir":"ship","game_mode":0,"gq_address":"198.100.156.163","gq_joinlink":"steam:\/\/connect\/198.100.156.163:27017\/","gq_name":"The Ship","gq_online":true,"gq_port_client":"27017","gq_port_query":27017,"gq_protocol":"source","gq_transport":"udp","gq_type":"ship","hostname":"**|multiplayerbrasil.com.br\/forum|** SHIP USA1","map":"raifucu_maru","max_players":24,"metamod_version":"1.10.4-devV","mp_allowNPCs":"1","mp_autocrosshair":"1","mp_falldamage":"0","mp_flashlight":"0","mp_footsteps":"1","mp_forcerespawn":"1","mp_fraglimit":"0","mp_friendlyfire":"1","mp_teamlist":"hgrunt;scientist","mp_teamplay":"0","mp_timelimit":"0","mp_weaponstay":"0","num_bots":0,"num_players":0,"num_rules":51,"os":"w","password":0,"protocol":7,"r_AirboatViewDampenDamp":"1.0","r_AirboatViewDampenFreq":"7.0","r_AirboatViewZHeight":"0.0","r_JeepViewDampenDamp":"1.0","r_JeepViewDampenFreq":"7.0","r_JeepViewZHeight":"10.0","r_VehicleViewDampen":"1","secure":1,"sm_nextmap":"krassin","sm_updater_version":"1.2.1","sourcemod_version":"1.6.3-dev+4580","steamappid":2400,"sv_accelerate":"10","sv_airaccelerate":"10","sv_alltalk":"0","sv_bounce":"0","sv_cheats":"0","sv_footsteps":"1","sv_friction":"4","sv_gravity":"800","sv_maxspeed":"320","sv_noclipaccelerate":"5","sv_noclipspeed":"5","sv_password":"0","sv_pausable":"0","sv_rollangle":"0","sv_rollspeed":"200","sv_specaccelerate":"5","sv_specnoclip":"1","sv_specspeed":"3","sv_stepsize":"18","sv_stopspeed":"100","sv_voiceenable":"1","sv_wateraccelerate":"10","sv_waterfriction":"1","tv_password":"0","tv_relaypassword":"0","version":"1.0.0.16","witness_count":2,"witness_time":1}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Ship/2_response.txt b/gameq/tests/Protocols/Providers/Ship/2_response.txt new file mode 100644 index 0000000..7f1697b Binary files /dev/null and b/gameq/tests/Protocols/Providers/Ship/2_response.txt differ diff --git a/gameq/tests/Protocols/Providers/Ship/2_result.json b/gameq/tests/Protocols/Providers/Ship/2_result.json new file mode 100644 index 0000000..a5b7beb --- /dev/null +++ b/gameq/tests/Protocols/Providers/Ship/2_result.json @@ -0,0 +1 @@ +{"95.211.30.23:27017":{"coop":"0","deathmatch":"1","decalfrequency":"10","dedicated":"d","extended_advertisements_version":"1.2.8","game_descr":"The Ship","game_dir":"ship","game_mode":0,"gq_address":"95.211.30.23","gq_joinlink":"steam:\/\/connect\/95.211.30.23:27017\/","gq_name":"The Ship","gq_online":true,"gq_port_client":"27017","gq_port_query":27017,"gq_protocol":"source","gq_transport":"udp","gq_type":"ship","hostname":"mucosmos.nl Pakjesboot 12 : Cruise ships","map":"cyclops","max_players":32,"metamod_version":"1.9.2V","mp_allowNPCs":"1","mp_autocrosshair":"1","mp_falldamage":"0","mp_flashlight":"0","mp_footsteps":"1","mp_forcerespawn":"1","mp_fraglimit":"0","mp_friendlyfire":"1","mp_teamlist":"hgrunt;scientist","mp_teamplay":"0","mp_timelimit":"0","mp_weaponstay":"0","num_bots":5,"num_players":7,"num_rules":55,"os":"w","password":0,"players":[{"id":0,"name":"Shipmate1","score":0,"time":-1,"deaths":3,"money":1750},{"id":1,"name":"Shipmate2","score":1,"time":-1,"deaths":1,"money":4720},{"id":2,"name":"Shipmate3","score":3,"time":-1,"deaths":0,"money":4750},{"id":3,"name":"Shipmate4","score":1,"time":-1,"deaths":3,"money":3830},{"id":4,"name":"Shipmate5","score":1,"time":-1,"deaths":2,"money":3300},{"id":5,"name":"GiGidri","score":2,"time":252.12991333008,"deaths":0,"money":8830},{"id":6,"name":"Airyqueef","score":1,"time":193.14128112793,"deaths":0,"money":550}],"protocol":7,"r_AirboatViewDampenDamp":"1.0","r_AirboatViewDampenFreq":"7.0","r_AirboatViewZHeight":"0.0","r_JeepViewDampenDamp":"1.0","r_JeepViewDampenFreq":"7.0","r_JeepViewZHeight":"10.0","r_VehicleViewDampen":"1","sb_version":"1.4.10","secure":1,"sm_cheat_version":"1.2","sm_funcommandsx_version":"2.3","sm_nextmap":"huronian","sm_updater_version":"1.2.1","sourcemod_version":"1.4.7","steamappid":2400,"sv_accelerate":"10","sv_airaccelerate":"10","sv_alltalk":"0","sv_bounce":"0","sv_cheats":"0","sv_footsteps":"1","sv_friction":"4","sv_gravity":"800","sv_maxspeed":"320","sv_noclipaccelerate":"5","sv_noclipspeed":"5","sv_password":"0","sv_pausable":"0","sv_rollangle":"0","sv_rollspeed":"200","sv_specaccelerate":"5","sv_specnoclip":"1","sv_specspeed":"3","sv_stepsize":"18","sv_stopspeed":"100","sv_voiceenable":"1","sv_wateraccelerate":"10","sv_waterfriction":"1","tv_password":"0","tv_relaypassword":"0","version":"1.0.0.16","witness_count":2,"witness_time":3}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Ship/3_response.txt b/gameq/tests/Protocols/Providers/Ship/3_response.txt new file mode 100644 index 0000000..5b3afd4 Binary files /dev/null and b/gameq/tests/Protocols/Providers/Ship/3_response.txt differ diff --git a/gameq/tests/Protocols/Providers/Ship/3_result.json b/gameq/tests/Protocols/Providers/Ship/3_result.json new file mode 100644 index 0000000..057c422 --- /dev/null +++ b/gameq/tests/Protocols/Providers/Ship/3_result.json @@ -0,0 +1 @@ +{"208.100.19.166:27019":{"coop":"0","deathmatch":"1","decalfrequency":"10","dedicated":"d","game_descr":"The Ship","game_dir":"ship","game_mode":0,"gq_address":"208.100.19.166","gq_joinlink":"steam:\/\/connect\/208.100.19.166:27019\/","gq_name":"The Ship","gq_online":true,"gq_port_client":"27019","gq_port_query":27019,"gq_protocol":"source","gq_transport":"udp","gq_type":"ship","hostname":"RKSzone.com | US Chicago | The Ship | Hunt","map":"rubicon","max_players":32,"metamod_version":"1.10.5-devV","mp_allowNPCs":"1","mp_autocrosshair":"1","mp_falldamage":"0","mp_flashlight":"0","mp_footsteps":"1","mp_forcerespawn":"1","mp_fraglimit":"0","mp_friendlyfire":"1","mp_teamlist":"hgrunt;scientist","mp_teamplay":"0","mp_timelimit":"0","mp_weaponstay":"0","num_bots":16,"num_players":30,"num_rules":51,"os":"w","password":0,"players":[{"id":0,"name":"Shipmate1","score":0,"time":-1,"deaths":0,"money":2500},{"id":1,"name":"Shipmate2","score":0,"time":-1,"deaths":0,"money":2500},{"id":2,"name":"Shipmate3","score":0,"time":-1,"deaths":0,"money":2500},{"id":3,"name":"Shipmate4","score":0,"time":-1,"deaths":0,"money":2500},{"id":4,"name":"(3)LandLubber","score":1,"time":739.02227783203,"deaths":0,"money":3850},{"id":5,"name":"Shipmate5","score":0,"time":-1,"deaths":0,"money":2500},{"id":6,"name":"Shipmate6","score":0,"time":-1,"deaths":0,"money":2500},{"id":7,"name":"Shipmate7","score":0,"time":-1,"deaths":0,"money":2500},{"id":8,"name":"Shipmate8","score":0,"time":-1,"deaths":0,"money":2500},{"id":9,"name":"Shipmate9","score":0,"time":-1,"deaths":0,"money":2500},{"id":10,"name":"Shipmate10","score":0,"time":-1,"deaths":0,"money":2500},{"id":11,"name":"Shipmate11","score":0,"time":-1,"deaths":0,"money":2500},{"id":12,"name":"Shipmate12","score":0,"time":-1,"deaths":0,"money":2500},{"id":13,"name":"Shipmate13","score":0,"time":-1,"deaths":0,"money":2500},{"id":14,"name":"Shipmate14","score":0,"time":-1,"deaths":0,"money":2500},{"id":15,"name":"Shipmate15","score":0,"time":-1,"deaths":0,"money":2500},{"id":16,"name":"Shipmate16","score":0,"time":-1,"deaths":0,"money":2500},{"id":17,"name":"LandLubber","score":0,"time":482.43698120117,"deaths":0,"money":2500},{"id":18,"name":"LandRubber","score":0,"time":2694.5964355469,"deaths":0,"money":2500},{"id":20,"name":"Snake","score":0,"time":4148.6318359375,"deaths":0,"money":2500},{"id":21,"name":"SpadePlays","score":0,"time":195.37226867676,"deaths":0,"money":2500},{"id":23,"name":"Tyc","score":0,"time":1341.5109863281,"deaths":0,"money":2500},{"id":24,"name":"Onofi","score":0,"time":1302.0955810547,"deaths":0,"money":2500},{"id":25,"name":"The Mad Supremacy","score":0,"time":1107.9113769531,"deaths":1,"money":2250},{"id":26,"name":"(1)LandLubber","score":0,"time":1106.8912353516,"deaths":0,"money":2500},{"id":27,"name":"WHO LET THE DOGS OUT!","score":0,"time":4799.16796875,"deaths":0,"money":2500},{"id":28,"name":"Serial killer","score":0,"time":4763.6811523438,"deaths":0,"money":1500},{"id":29,"name":"Antariss","score":0,"time":985.26831054688,"deaths":0,"money":-2500},{"id":30,"name":"Crusty Smeg","score":1,"time":751.28131103516,"deaths":0,"money":5070},{"id":31,"name":"(2)LandLubber","score":0,"time":746.13726806641,"deaths":1,"money":2250}],"protocol":7,"r_AirboatViewDampenDamp":"1.0","r_AirboatViewDampenFreq":"7.0","r_AirboatViewZHeight":"0.0","r_JeepViewDampenDamp":"1.0","r_JeepViewDampenFreq":"7.0","r_JeepViewZHeight":"10.0","r_VehicleViewDampen":"1","sb_version":"1.4.11","secure":1,"sm_nextmap":"huronian","sourcemod_version":"1.6.4-dev+4624","steamappid":2400,"sv_accelerate":"10","sv_airaccelerate":"10","sv_alltalk":"0","sv_bounce":"0","sv_cheats":"0","sv_footsteps":"1","sv_friction":"4","sv_gravity":"800","sv_maxspeed":"320","sv_noclipaccelerate":"5","sv_noclipspeed":"5","sv_password":"0","sv_pausable":"0","sv_rollangle":"0","sv_rollspeed":"200","sv_specaccelerate":"5","sv_specnoclip":"1","sv_specspeed":"3","sv_stepsize":"18","sv_stopspeed":"100","sv_voiceenable":"1","sv_wateraccelerate":"10","sv_waterfriction":"1","tv_password":"0","tv_relaypassword":"0","version":"1.0.0.16","witness_count":2,"witness_time":5}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Spaceengineers/1_response.txt b/gameq/tests/Protocols/Providers/Spaceengineers/1_response.txt new file mode 100644 index 0000000..a2e3298 Binary files /dev/null and b/gameq/tests/Protocols/Providers/Spaceengineers/1_response.txt differ diff --git a/gameq/tests/Protocols/Providers/Spaceengineers/1_result.json b/gameq/tests/Protocols/Providers/Spaceengineers/1_result.json new file mode 100644 index 0000000..99dca11 --- /dev/null +++ b/gameq/tests/Protocols/Providers/Spaceengineers/1_result.json @@ -0,0 +1 @@ +{"66.85.14.202:27016":{"dedicated":"d","game_descr":"Space Engineers","game_dir":"Space Engineers","game_id":244850,"gq_address":"66.85.14.202","gq_joinlink":"steam:\/\/connect\/66.85.14.202:27016\/","gq_name":"Space Engineers","gq_online":true,"gq_port_client":27016,"gq_port_query":27016,"gq_protocol":"source","gq_transport":"udp","gq_type":"spaceengineers","hostname":"The Silent Void","keywords":"groupId0 version1157012 datahashJf7\/v9oenRRbnjLNyYXVYTtG4dI= mods0 gamemodeS10-5-5 view12000","map":"TSV Fresh World","max_players":15,"mods":"0","num_bots":0,"num_players":4,"num_rules":1,"os":"w","password":0,"players":[{"id":0,"name":"Dvsmessiah","score":0,"time":12671.053710938},{"id":0,"name":"Siredon","score":0,"time":2498.3591308594},{"id":0,"name":"wernu123","score":0,"time":2380.4106445312},{"id":0,"name":"Not CavnFox","score":0,"time":633.91241455078}],"port":27016,"protocol":17,"secure":1,"steam_id":90105363286642693,"steamappid":0,"version":"1157012"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Spaceengineers/2_response.txt b/gameq/tests/Protocols/Providers/Spaceengineers/2_response.txt new file mode 100644 index 0000000..247eab7 Binary files /dev/null and b/gameq/tests/Protocols/Providers/Spaceengineers/2_response.txt differ diff --git a/gameq/tests/Protocols/Providers/Spaceengineers/2_result.json b/gameq/tests/Protocols/Providers/Spaceengineers/2_result.json new file mode 100644 index 0000000..d7fceb3 --- /dev/null +++ b/gameq/tests/Protocols/Providers/Spaceengineers/2_result.json @@ -0,0 +1 @@ +{"149.202.89.108:27016":{"dedicated":"d","game_descr":"Space Engineers","game_dir":"Space Engineers","game_id":244850,"gq_address":"149.202.89.108","gq_joinlink":"steam:\/\/connect\/149.202.89.108:27016\/","gq_name":"Space Engineers","gq_online":true,"gq_port_client":27016,"gq_port_query":27016,"gq_protocol":"source","gq_transport":"udp","gq_type":"spaceengineers","hostname":"Mine, Trade and Fight, Get your \"yarrrr\" on! PVP\/E-RP","keywords":"groupId0 version1157012 datahash\/YaPAkIlnmdh8j2RnJaFJ7SLN\/k= mods9 gamemodeS15-10-10 view15000","map":"Muttly's Pirates! (UK ENG)","max_players":20,"mod0":"customrespawn","mod1":"Skybox Nebula GB318 C","mod2":"Frontier Economy (Adds money and Trade)","mod3":"}DT{ Armored Camera","mod4":"Window Pack - Tinted and Clean Blocks","mod5":"(DX11) Kolt - Command Console Pack","mod6":"Midspace's Admin helper commands","mod7":"(DX11)Letters Mod","mod8":"[Dx11]DeadTech - Catwalk Pack","mods":"9","num_bots":0,"num_players":20,"num_rules":10,"os":"w","password":0,"players":[{"id":0,"name":"Zayas","score":0,"time":6295.2783203125},{"id":0,"name":"Harrold Finch","score":0,"time":6288.572265625},{"id":0,"name":"Adolfin Hittlerin","score":0,"time":6236.8291015625},{"id":0,"name":"Dave The Rave","score":0,"time":5983.0551757812},{"id":0,"name":"scadbad","score":0,"time":5819.9711914062},{"id":0,"name":"Blood","score":0,"time":5743.8110351562},{"id":0,"name":"КАРМЕЛИТА","score":0,"time":4878.9462890625},{"id":0,"name":"Garrus","score":0,"time":4424.6328125},{"id":0,"name":"Hulrick","score":0,"time":4388.4614257812},{"id":0,"name":"Коварищ Коталин","score":0,"time":4186.6259765625},{"id":0,"name":"(T.I.N)egor.kononskiy","score":0,"time":3417.2663574219},{"id":0,"name":"Tonono","score":0,"time":2675.3962402344},{"id":0,"name":"Ölkpy","score":0,"time":2191.8518066406},{"id":0,"name":"Sanderman","score":0,"time":1766.822265625},{"id":0,"name":"Retsu","score":0,"time":1021.1619262695},{"id":0,"name":"Escobar Pigeon","score":0,"time":726.12756347656},{"id":0,"name":"FourWindBadger","score":0,"time":673.96295166016},{"id":0,"name":"Charlie","score":0,"time":631.20275878906},{"id":0,"name":"Thomasgk9","score":0,"time":591.62518310547},{"id":0,"name":"Garroshek Hellscream","score":0,"time":176.64654541016}],"port":27016,"protocol":17,"secure":1,"steam_id":90105371831186438,"steamappid":0,"version":"1157012"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Squad/1_response.txt b/gameq/tests/Protocols/Providers/Squad/1_response.txt new file mode 100644 index 0000000..a2d2cf6 Binary files /dev/null and b/gameq/tests/Protocols/Providers/Squad/1_response.txt differ diff --git a/gameq/tests/Protocols/Providers/Squad/1_result.json b/gameq/tests/Protocols/Providers/Squad/1_result.json new file mode 100644 index 0000000..8e7235f --- /dev/null +++ b/gameq/tests/Protocols/Providers/Squad/1_result.json @@ -0,0 +1 @@ +{"144.48.104.66:7787":{"Flags_i":"7","GameMode_s":"AAS","GameVersion_s":"a-8.9.201.11966","LicenseId_i":"378883","LicenseSig1_s":"YKh3V7PySEzfbz7axVj1VYIorlQBJPrRufrt7HIr8Gh\/Wu1himLwukoOnoUiszd0bYuc\/2w5zi\/uBtxW4a8ENEFHydEp4bK6P6dFY16dYXGn82QiPijpH44E0sAcyrm","LicenseSig2_s":"fIoFKP3wWt9dJLvsWFZKiz\/iBKCctk4oj61E4ixix4dwn8AA02khRecOGR\/g+E7zyFC8Gjvmp6jOhFSUEWPH21FdQ1m0c9oWXopm20v5ZWQEcYsjRG90QHHjDHdTcpT","LicenseSig3_s":"PEhl5Q\/8BJn9u+kzaBF1pd+xvOYesCaCgW5uGrk1n9sl0qUBINoW1XeTQShQ7yVOjkb6XTn2LHdTSgIqlWEqVnZA==","MatchTimeout_f":"120.000000","OWNINGID":"90105804093124614","OWNINGNAME":"[USA] Legacy","P2PADDR":"90105804093124614","P2PPORT":"7787","Password_b":"false","PlayerCount_i":"77","PlayerReserveCount_i":"4","SEARCHKEYWORDS_s":"Custom","SESSIONFLAGS":"171","dedicated":"d","game_descr":"Squad","game_dir":"squad","game_id":393380,"gq_address":"144.48.104.66","gq_joinlink":"steam:\/\/connect\/144.48.104.66:7787\/","gq_name":"Squad","gq_online":true,"gq_port_client":7787,"gq_port_query":27165,"gq_protocol":"source","gq_transport":"udp","gq_type":"squad","hostname":"[USA] Legacy","keywords":"BUILDID:490802986,OWNINGID:90105804093124614,OWNINGNAME:[USA] Legacy,P2PADDR:90105804093124614,P2PPORT:7787,SESSIONFLAGS:171","map":"Kohat AAS v2","max_players":80,"num_bots":0,"num_players":104,"num_rules":17,"os":"w","password":0,"players":[{"id":0,"name":"","score":0,"time":140082.578125},{"id":0,"name":"","score":0,"time":140032.6875},{"id":0,"name":"","score":0,"time":130469.9921875},{"id":0,"name":"","score":0,"time":130269.4609375},{"id":0,"name":"","score":0,"time":85943.015625},{"id":0,"name":"","score":0,"time":79207.2265625},{"id":0,"name":"","score":0,"time":77016.2578125},{"id":0,"name":"","score":0,"time":71494.5703125},{"id":0,"name":"","score":0,"time":69730.109375},{"id":0,"name":"","score":0,"time":67127.5234375},{"id":0,"name":"","score":0,"time":65062.34375},{"id":0,"name":"","score":0,"time":54439.2421875},{"id":0,"name":"","score":0,"time":43000.53515625},{"id":0,"name":"","score":0,"time":42921.42578125},{"id":0,"name":"","score":0,"time":42714.625},{"id":0,"name":"","score":0,"time":38661.34765625},{"id":0,"name":"","score":0,"time":38213.44140625},{"id":0,"name":"","score":0,"time":36728.421875},{"id":0,"name":"","score":0,"time":26897.11328125},{"id":0,"name":"","score":0,"time":26191.36328125},{"id":0,"name":"","score":0,"time":23564.544921875},{"id":0,"name":"","score":0,"time":22415.94140625},{"id":0,"name":"","score":0,"time":21517.169921875},{"id":0,"name":"","score":0,"time":19771.611328125},{"id":0,"name":"Afeef al-Saeed","score":113,"time":17159.73828125},{"id":0,"name":"twitch.tv\/kabbyk","score":22,"time":14729.55859375},{"id":0,"name":"Unearthd","score":0,"time":12298.956054688},{"id":0,"name":"solimanatilla","score":148,"time":11103.774414062},{"id":0,"name":"White","score":-1,"time":11026.703125},{"id":0,"name":"[EO] DeVotie","score":1,"time":8976.0673828125},{"id":0,"name":"WHATS NEW PUSSYCAT","score":21,"time":8133.5541992188},{"id":0,"name":"Sullybruh","score":0,"time":7870.8759765625},{"id":0,"name":"Dr.Herpington","score":99,"time":7026.1870117188},{"id":0,"name":"","score":0,"time":6906.4653320312},{"id":0,"name":"Casa Erotica","score":11,"time":6897.9912109375},{"id":0,"name":"edawg1895","score":100,"time":6869.7241210938},{"id":0,"name":"McTwitchy","score":98,"time":6575.5126953125},{"id":0,"name":"[DD]The FalleN","score":-3,"time":6275.7041015625},{"id":0,"name":"[6AB]Firk","score":99,"time":6257.3510742188},{"id":0,"name":"Creed","score":15,"time":6073.056640625},{"id":0,"name":"JOJO","score":0,"time":5986.0708007812},{"id":0,"name":"Kievn","score":-1,"time":5897.5532226562},{"id":0,"name":"","score":0,"time":5399.1733398438},{"id":0,"name":"[FoH]Mycelium","score":0,"time":5171.5732421875},{"id":0,"name":"apoc_","score":21,"time":5161.1352539062},{"id":0,"name":"Japense_Birds","score":0,"time":5125.2377929688},{"id":0,"name":"GuerillaFPS","score":-5,"time":5053.9262695312},{"id":0,"name":"DisobidiantMonk","score":210,"time":5006.478515625},{"id":0,"name":"Big Byrd","score":0,"time":4945.3422851562},{"id":0,"name":"GreenCheese","score":42,"time":4621.4326171875},{"id":0,"name":"Cigar","score":98,"time":4263.1572265625},{"id":0,"name":"Elysian","score":10,"time":3908.7841796875},{"id":0,"name":"THE CAP","score":118,"time":3904.0327148438},{"id":0,"name":"[DD]Plankton","score":18,"time":3668.4826660156},{"id":0,"name":"PoopieDookie","score":-2,"time":3506.8903808594},{"id":0,"name":"TheMiGiZZEl","score":76,"time":3486.1555175781},{"id":0,"name":"Sir Jolly","score":0,"time":3425.9213867188},{"id":0,"name":"¬°M+| WingZero","score":-1,"time":3420.0163574219},{"id":0,"name":"Rusty Neez","score":98,"time":3394.5769042969},{"id":0,"name":"GrislyJim","score":14,"time":3370.33203125},{"id":0,"name":"[KOS] ABSINTHE","score":0,"time":3349.4743652344},{"id":0,"name":"kreker inkvisitor","score":100,"time":3323.8833007812},{"id":0,"name":"=7Cav=CPL.Kydd.M","score":-3,"time":3261.2377929688},{"id":0,"name":"ARROW","score":100,"time":2958.6140136719},{"id":0,"name":"One Ugly Down","score":-2,"time":2794.5844726562},{"id":0,"name":"ptc|Ferrell","score":21,"time":2636.2033691406},{"id":0,"name":"antonioujueta","score":0,"time":2628.7404785156},{"id":0,"name":"franklawl","score":100,"time":2626.9543457031},{"id":0,"name":"Ravel","score":39,"time":2053.2790527344},{"id":0,"name":"Foos","score":143,"time":2051.7143554688},{"id":0,"name":"Markman","score":98,"time":1869.5119628906},{"id":0,"name":"","score":0,"time":1745.7537841797},{"id":0,"name":"Reita","score":106,"time":1745.6719970703},{"id":0,"name":"RivalzTownboy","score":-2,"time":1736.2491455078},{"id":0,"name":"Blue Mark Supreme","score":30,"time":1408.5557861328},{"id":0,"name":"Poodlepoodle","score":24,"time":1405.2314453125},{"id":0,"name":"Liquidbullets","score":30,"time":1394.4688720703},{"id":0,"name":"shawnmccombe1","score":97,"time":1394.0712890625},{"id":0,"name":"Sohei","score":133,"time":1393.0870361328},{"id":0,"name":"Lieutenant Chuckles","score":-1,"time":1061.6441650391},{"id":0,"name":"RaptorRex88","score":98,"time":1061.5034179688},{"id":0,"name":"Christopher","score":0,"time":1035.7482910156},{"id":0,"name":"Spockzilla","score":199,"time":1033.5848388672},{"id":0,"name":"Biggie Bheese","score":21,"time":1030.0743408203},{"id":0,"name":"CombatBananas","score":0,"time":1016.8347167969},{"id":0,"name":"MINIIBEAR","score":0,"time":1013.8148193359},{"id":0,"name":"Sepsis","score":0,"time":1000.9172363281},{"id":0,"name":"Captain Kage","score":9,"time":998.28845214844},{"id":0,"name":"Fedora Neckbeard","score":52,"time":997.91534423828},{"id":0,"name":"Autist","score":-1,"time":974.67156982422},{"id":0,"name":"[B2K]Tomotron000","score":8,"time":969.60852050781},{"id":0,"name":"Knight Of The Hokey Pokey","score":10,"time":941.23864746094},{"id":0,"name":"Moe Bradberry","score":10,"time":934.63861083984},{"id":0,"name":"Boba","score":-3,"time":926.31805419922},{"id":0,"name":"WAR_DOG","score":9,"time":851.19055175781},{"id":0,"name":"madbull","score":1,"time":836.40454101562},{"id":0,"name":"Davkul","score":-1,"time":827.2236328125},{"id":0,"name":"Hardison","score":37,"time":518.07757568359},{"id":0,"name":"Inveniam Viam","score":12,"time":515.03802490234},{"id":0,"name":"[6AB]Wolf","score":100,"time":294.84686279297},{"id":0,"name":"DRAM Rammar","score":21,"time":292.03720092773},{"id":0,"name":"FOXXOR, IMPOSER OF TAXES","score":0,"time":202.78340148926},{"id":0,"name":"Zanax","score":0,"time":193.31829833984},{"id":0,"name":"ridethefire129","score":0,"time":193.06085205078}],"port":7787,"protocol":17,"secure":0,"steam_id":90105804093124614,"steamappid":0,"version":"a-8.9.201.11966"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Squad/2_response.txt b/gameq/tests/Protocols/Providers/Squad/2_response.txt new file mode 100644 index 0000000..ae4c553 Binary files /dev/null and b/gameq/tests/Protocols/Providers/Squad/2_response.txt differ diff --git a/gameq/tests/Protocols/Providers/Squad/2_result.json b/gameq/tests/Protocols/Providers/Squad/2_result.json new file mode 100644 index 0000000..2c52aeb --- /dev/null +++ b/gameq/tests/Protocols/Providers/Squad/2_result.json @@ -0,0 +1 @@ +{"167.114.220.151:7787":{"Flags_i":"7","GameMode_s":"AAS","GameVersion_s":"a-8.9.201.11966","LicenseId_i":"603942","LicenseSig1_s":"CcNo6FMl0y6xoapdEqQCWpVH5MNlbs6OKVW7sTB+xUofAGCTWBo+iYiCTNjR6lmVzDlu57N0NKRWvaCRk+PlosL5HF+vv2z1uc1GtYTu2OpvvUA0aBKKaVVOFQtwsO3","LicenseSig2_s":"biq8cj+BUyx8yU7VaM9aV0eNb80oskN4IRDsDhneB5vHRYmhzNKJ94TxKSrD0Fp6B3GYVpyLVgjjm3DXkYNBMlWd8zYL60yQ+n9fhvWraKnuipyshOSUs\/Pfc8x2DlO","LicenseSig3_s":"sA2xBtHMjK7APCetpQ4WYKEArq7LPYlsSScBl\/12TAIbzkGfnk6fE80ltRj1QsxiX9SkC2KSQ6vUf2ucVbnIn\/RQ==","MatchTimeout_f":"120.000000","OWNINGID":"90105791577239556","OWNINGNAME":"[2.FJg] Squad Tactical Realism #1 [AAS]","P2PADDR":"90105791577239556","P2PPORT":"7787","Password_b":"false","PlayerCount_i":"79","PlayerReserveCount_i":"1","SEARCHKEYWORDS_s":"Custom","SESSIONFLAGS":"171","dedicated":"d","game_descr":"Squad","game_dir":"squad","game_id":393380,"gq_address":"167.114.220.151","gq_joinlink":"steam:\/\/connect\/167.114.220.151:7787\/","gq_name":"Squad","gq_online":true,"gq_port_client":7787,"gq_port_query":27165,"gq_protocol":"source","gq_transport":"udp","gq_type":"squad","hostname":"[2.FJg] Squad Tactical Realism #1 [AAS]","keywords":"BUILDID:490802986,OWNINGID:90105791577239556,OWNINGNAME:[2.FJg] Squad Tactical Realism #1 [AAS],P2PADDR:90105791577239556","map":"Sumari AAS v3","max_players":80,"num_bots":0,"num_players":112,"num_rules":17,"os":"w","password":0,"players":[{"id":0,"name":"","score":0,"time":154039.0625},{"id":0,"name":"","score":0,"time":153602.5},{"id":0,"name":"","score":0,"time":149301.90625},{"id":0,"name":"","score":0,"time":145118.34375},{"id":0,"name":"","score":0,"time":142885.59375},{"id":0,"name":"","score":0,"time":139116.53125},{"id":0,"name":"","score":0,"time":83586.9609375},{"id":0,"name":"","score":0,"time":80933.984375},{"id":0,"name":"","score":0,"time":78047.5078125},{"id":0,"name":"","score":0,"time":73529.203125},{"id":0,"name":"","score":0,"time":70843.7421875},{"id":0,"name":"","score":0,"time":68399.8671875},{"id":0,"name":"","score":0,"time":60953.25},{"id":0,"name":"","score":0,"time":57988.30078125},{"id":0,"name":"","score":0,"time":52424.0625},{"id":0,"name":"","score":0,"time":49786.5},{"id":0,"name":"","score":0,"time":49016.8515625},{"id":0,"name":"","score":0,"time":47529.11328125},{"id":0,"name":"","score":0,"time":47422.1796875},{"id":0,"name":"","score":0,"time":44765.57421875},{"id":0,"name":"","score":0,"time":37028.6796875},{"id":0,"name":"","score":0,"time":32070.162109375},{"id":0,"name":"","score":0,"time":32018.318359375},{"id":0,"name":"","score":0,"time":27256.669921875},{"id":0,"name":"","score":0,"time":27225.5390625},{"id":0,"name":"","score":0,"time":27211.68359375},{"id":0,"name":"","score":0,"time":27128.201171875},{"id":0,"name":"","score":0,"time":26956.51953125},{"id":0,"name":"","score":0,"time":26136.283203125},{"id":0,"name":"","score":0,"time":20071.873046875},{"id":0,"name":"BlackLabel","score":100,"time":13432.658203125},{"id":0,"name":"Lucid Screaming","score":0,"time":13212.25390625},{"id":0,"name":"dirtion","score":-2,"time":13149.634765625},{"id":0,"name":"aR | MajorMalfunction","score":-2,"time":12011.487304688},{"id":0,"name":"♠ CapriSol","score":0,"time":10860.17578125},{"id":0,"name":"Rhombus","score":-1,"time":9316.212890625},{"id":0,"name":"S8S Assassin","score":0,"time":8737.3291015625},{"id":0,"name":"DR650ADV","score":-1,"time":8208.7392578125},{"id":0,"name":"","score":0,"time":8099.384765625},{"id":0,"name":"R0N1N","score":21,"time":7979.607421875},{"id":0,"name":"Benji5919","score":-2,"time":7304.7436523438},{"id":0,"name":"standsalone_1","score":-1,"time":6668.4077148438},{"id":0,"name":"Bloodlust","score":-2,"time":6427.3481445312},{"id":0,"name":"Centurion","score":-1,"time":5658.8579101562},{"id":0,"name":"Mastec","score":-2,"time":5645.4565429688},{"id":0,"name":"Hook","score":103,"time":5616.6625976562},{"id":0,"name":"itsalphahotel","score":5,"time":5508.2094726562},{"id":0,"name":"","score":0,"time":5438.794921875},{"id":0,"name":"SUM TING WONG","score":100,"time":5110.2807617188},{"id":0,"name":"Reese","score":-1,"time":5099.4633789062},{"id":0,"name":"[GDG] 2Lt. Barba Ruiva","score":0,"time":5046.150390625},{"id":0,"name":"FexonTv","score":0,"time":4608.16015625},{"id":0,"name":"TheVub.K","score":200,"time":4265.615234375},{"id":0,"name":"[2.FJg]'discobiscuit-Gefr","score":100,"time":3965.9912109375},{"id":0,"name":"Waistband Wiener","score":0,"time":3739.8459472656},{"id":0,"name":"GunWrath","score":121,"time":3524.6040039062},{"id":0,"name":"Hertog Jan","score":0,"time":3504.4636230469},{"id":0,"name":"Blitzkrieg262","score":-1,"time":3188.6708984375},{"id":0,"name":"","score":0,"time":3105.64453125},{"id":0,"name":"Gultrich","score":10,"time":3065.8278808594},{"id":0,"name":"Sickofguessing","score":-1,"time":3037.5024414062},{"id":0,"name":"Ashurbanipal_24","score":-1,"time":3010.4602050781},{"id":0,"name":"ikillforjebus","score":-1,"time":2990.2473144531},{"id":0,"name":"DAWAZOMBIE","score":-1,"time":2971.5336914062},{"id":0,"name":"[RIP]Twakkie","score":99,"time":2960.830078125},{"id":0,"name":"HotBox","score":-1,"time":2952.8444824219},{"id":0,"name":"Wehmann","score":0,"time":2948.1743164062},{"id":0,"name":"water","score":100,"time":2939.2958984375},{"id":0,"name":"Chellz","score":0,"time":2906.560546875},{"id":0,"name":"Churchs32","score":-1,"time":2819.1901855469},{"id":0,"name":"Tortellini Tony","score":0,"time":2801.396484375},{"id":0,"name":"K1LL3R 0F 4LL","score":20,"time":2737.3806152344},{"id":0,"name":"ZZEZ","score":-2,"time":2553.7214355469},{"id":0,"name":"terrorist","score":99,"time":2548.7641601562},{"id":0,"name":"Ben","score":0,"time":2219.509765625},{"id":0,"name":"Phantom","score":121,"time":2216.322265625},{"id":0,"name":"PzRSpeRRe","score":-1,"time":2079.1640625},{"id":0,"name":"[NOOT] Walton","score":-1,"time":2075.9592285156},{"id":0,"name":"[TCO] Sgt. Rock Fury (SAC)","score":133,"time":1529.4525146484},{"id":0,"name":"Bad Bankai","score":11,"time":1275.3878173828},{"id":0,"name":"SneakyCreeper","score":-2,"time":1113.5192871094},{"id":0,"name":"Conflictedhero","score":-1,"time":1112.8702392578},{"id":0,"name":"Mikro--","score":99,"time":1112.8662109375},{"id":0,"name":"Colonel Forbin","score":-1,"time":1007.2048950195},{"id":0,"name":"error","score":99,"time":893.40234375},{"id":0,"name":"flame841","score":123,"time":851.67401123047},{"id":0,"name":"jovinni","score":110,"time":738.27966308594},{"id":0,"name":"[NOOT] Bradders","score":-1,"time":737.525390625},{"id":0,"name":"Wiccamaw","score":-1,"time":716.00665283203},{"id":0,"name":"yaxa","score":143,"time":715.46636962891},{"id":0,"name":"LOLKI","score":104,"time":596.91003417969},{"id":0,"name":"Whiskey's Brother","score":99,"time":546.64154052734},{"id":0,"name":"tactical-reload","score":8,"time":520.34484863281},{"id":0,"name":"sniperelite7","score":-1,"time":508.91650390625},{"id":0,"name":"Rover","score":-1,"time":490.44277954102},{"id":0,"name":"Icedout782","score":143,"time":478.18405151367},{"id":0,"name":"Safran","score":29,"time":451.49090576172},{"id":0,"name":"Nossa30","score":-1,"time":419.14953613281},{"id":0,"name":"Copernicus","score":99,"time":403.9987487793},{"id":0,"name":"dustep2","score":-1,"time":389.19097900391},{"id":0,"name":"[FuoM]Fl00d","score":0,"time":364.61709594727},{"id":0,"name":"Da Big Man","score":0,"time":306.62420654297},{"id":0,"name":"Sharon","score":0,"time":293.94104003906},{"id":0,"name":"Thurnis Haley","score":0,"time":289.35803222656},{"id":0,"name":"Kio","score":0,"time":272.62060546875},{"id":0,"name":"Chief","score":0,"time":267.95175170898},{"id":0,"name":"Bill Bambus","score":0,"time":258.43923950195},{"id":0,"name":"Chitlin Joe","score":0,"time":192.14283752441},{"id":0,"name":"ISnipeAllDay","score":0,"time":158.29992675781},{"id":0,"name":"ShinRaPresident","score":0,"time":115.70793151855},{"id":0,"name":"Darth-Tronosh","score":0,"time":106.60247039795},{"id":0,"name":"SnakeDoc","score":0,"time":103.14464569092}],"port":7787,"protocol":17,"secure":0,"steam_id":90105791577239556,"steamappid":0,"version":"a-8.9.201.11966"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Starmade/1_response.txt b/gameq/tests/Protocols/Providers/Starmade/1_response.txt new file mode 100644 index 0000000..ad6ea85 Binary files /dev/null and b/gameq/tests/Protocols/Providers/Starmade/1_response.txt differ diff --git a/gameq/tests/Protocols/Providers/Starmade/1_result.json b/gameq/tests/Protocols/Providers/Starmade/1_result.json new file mode 100644 index 0000000..84d44d1 --- /dev/null +++ b/gameq/tests/Protocols/Providers/Starmade/1_result.json @@ -0,0 +1 @@ +{"red.shift.network:4242":{"dedicated":1,"game_descr":"#1 Server! (Pirates, Active Admins, Bounty and Banking System, Chat commands)","gq_address":"red.shift.network","gq_joinlink":"","gq_name":"StarMade","gq_online":true,"gq_port_client":4242,"gq_port_query":4242,"gq_protocol":"starmade","gq_transport":"tcp","gq_type":"starmade","hostname":"Red Shift","info_version":2,"max_players":100,"num_players":34,"password":0,"start_time":1424676404819,"version":0.18850000202656}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Teamspeak2/1_response.txt b/gameq/tests/Protocols/Providers/Teamspeak2/1_response.txt new file mode 100644 index 0000000..214246c --- /dev/null +++ b/gameq/tests/Protocols/Providers/Teamspeak2/1_response.txt @@ -0,0 +1,77 @@ +[TS] + +|| +OK +server_id=1 +server_name=Hamburg-Funk +server_platform=Win32 +server_welcomemessage=Willkommen auf dem Hamburg-Funk Teamspeak Server +server_webpost_linkurl= +server_webpost_posturl=hamburg-funk.all4funradio.eu +server_password=0 +server_clan_server=1 +server_udpport=8767 +server_maxusers=250 +server_allow_codec_celp51=-1 +server_allow_codec_celp63=-1 +server_allow_codec_gsm148=-1 +server_allow_codec_gsm164=-1 +server_allow_codec_windowscelp52=-1 +server_allow_codec_speex2150=-1 +server_allow_codec_speex3950=-1 +server_allow_codec_speex5950=-1 +server_allow_codec_speex8000=-1 +server_allow_codec_speex11000=-1 +server_allow_codec_speex15000=-1 +server_allow_codec_speex18200=-1 +server_allow_codec_speex24600=-1 +server_packetssend=1563401 +server_bytessend=216581381 +server_packetsreceived=1683583 +server_bytesreceived=138154385 +server_uptime=497728 +server_currentusers=3 +server_currentchannels=25 +server_bwinlastsec=3290 +server_bwoutlastsec=157 +server_bwinlastmin=137 +server_bwoutlastmin=3358 +OK + +|| +OK + +|| +id codec parent order maxusers name flags password topic +1 12 -1 1100 200 "Funkraum" 2 0 "Funkverbindungen in die ganze Welt!" +2 12 -1 1000 200 "Plauderraum" 0 0 "Hier kann ungestrt geplaudert werden." +3 12 -1 23352 10 "Admins" 4 1 "" +4 12 -1 1 200 "TESTRAUM" 0 0 "" +5 12 -1 1400 200 "Digimodes" 10 0 "" +6 0 -1 1300 200 "Gateway-Test" 0 0 "" +7 0 -1 34463 200 "ZXSTICKY" 0 0 "" +8 0 -1 34463 200 "AFK" 2 0 "" +9 12 -1 1200 50 "DX Funk" 2 0 "Funkraum fr Gateway- / HF-DX Verbindungen" +10 12 -1 5000 200 "US-CARS & Treffen" 10 0 "" +11 12 -1 3200 200 "Webradio und Musik" 10 0 "" +12 9 -1 6500 200 "GAMERBEREICH" 10 0 "Bereich fr Gamer" +13 9 -1 6000 200 "Funkspiele" 10 0 "" +14 9 -1 1250 200 "Fuchsjagt" 10 0 "" +15 11 -1 1101 200 "Funkraum 2" 2 0 "Funkverbindungen in die ganze Welt!" +16 12 -1 0 250 "***WILLKOMMEN***" 16 0 "Begrssungsraum" +17 12 -1 7000 200 "Operator" 4 1 "" +18 12 5 3200 200 "RTTY50" 2 0 "" +19 12 5 3200 200 "SSTV Analog" 2 0 "" +20 12 5 3200 200 "PACKET" 2 0 "" +21 12 5 3200 200 "BPSK31" 2 0 "" +22 12 5 3200 200 "HELL FM" 2 0 "" +23 12 5 3200 200 "FAX" 2 0 "" +24 12 5 3200 200 "CW" 2 0 "" +25 12 11 3200 200 "Mainstream" 2 0 "All4Fun Radio Mainstream" +OK +OK +p_id c_id ps bs pr br pl ping logintime idletime cprivs pprivs pflags ip nick loginname +6 16 40450 1924469 60903 1845286 0 2 497623 197 0 5 1 "0.0.0.0" "Flauschis-Freundin 110" "Flauschis-Freundin" +105 1 13823 381753 17873 5784359 2 61 14358 0 20 4 4 "0.0.0.0" "VL CB-FUNK-BERLIN Original" "vlcbfunkberlin" +106 1 3261 535080 65 14864 441 45 1860 984 21 4 4 "0.0.0.0" "CrosslinkCL5 FRN_hamburg-funk" "CL4" +OK diff --git a/gameq/tests/Protocols/Providers/Teamspeak2/1_result.json b/gameq/tests/Protocols/Providers/Teamspeak2/1_result.json new file mode 100644 index 0000000..2c81357 --- /dev/null +++ b/gameq/tests/Protocols/Providers/Teamspeak2/1_result.json @@ -0,0 +1 @@ +{"46.163.65.181:8767":{"dedicated":1,"gq_address":"46.163.65.181","gq_joinlink":"teamspeak:\/\/46.163.65.181:8767\/","gq_name":"Teamspeak 2","gq_online":true,"gq_port_client":8767,"gq_port_query":51234,"gq_protocol":"teamspeak2","gq_transport":"tcp","gq_type":"teamspeak2","players":[{"p_id":"6","c_id":"16","ps":"40450","bs":"1924469","pr":"60903","br":"1845286","pl":"0","ping":"2","logintime":"497623","idletime":"197","cprivs":"0","pprivs":"5","pflags":"1","ip":"\"0.0.0.0\"","nick":"\"Flauschis-Freundin 110\"","loginname":"\"Flauschis-Freundin\""},{"p_id":"105","c_id":"1","ps":"13823","bs":"381753","pr":"17873","br":"5784359","pl":"2","ping":"61","logintime":"14358","idletime":"0","cprivs":"20","pprivs":"4","pflags":"4","ip":"\"0.0.0.0\"","nick":"\"VL CB-FUNK-BERLIN Original\"","loginname":"\"vlcbfunkberlin\""},{"p_id":"106","c_id":"1","ps":"3261","bs":"535080","pr":"65","br":"14864","pl":"441","ping":"45","logintime":"1860","idletime":"984","cprivs":"21","pprivs":"4","pflags":"4","ip":"\"0.0.0.0\"","nick":"\"CrosslinkCL5 FRN_hamburg-funk\"","loginname":"\"CL4\""}],"server_allow_codec_celp51":"-1","server_allow_codec_celp63":"-1","server_allow_codec_gsm148":"-1","server_allow_codec_gsm164":"-1","server_allow_codec_speex11000":"-1","server_allow_codec_speex15000":"-1","server_allow_codec_speex18200":"-1","server_allow_codec_speex2150":"-1","server_allow_codec_speex24600":"-1","server_allow_codec_speex3950":"-1","server_allow_codec_speex5950":"-1","server_allow_codec_speex8000":"-1","server_allow_codec_windowscelp52":"-1","server_bwinlastmin":"137","server_bwinlastsec":"3290","server_bwoutlastmin":"3358","server_bwoutlastsec":"157","server_bytesreceived":"138154385","server_bytessend":"216581381","server_clan_server":"1","server_currentchannels":"25","server_currentusers":"3","server_id":"1","server_maxusers":"250","server_name":"Hamburg-Funk","server_packetsreceived":"1683583","server_packetssend":"1563401","server_password":"0","server_platform":"Win32","server_udpport":"8767","server_uptime":"497728","server_webpost_linkurl":"","server_webpost_posturl":"hamburg-funk.all4funradio.eu","server_welcomemessage":"Willkommen auf dem Hamburg-Funk Teamspeak Server","teams":[{"id":"1","codec":"12","parent":"-1","order":"1100","maxusers":"200","name":"\"Funkraum\"","flags":"2","password":"0","topic":"\"Funkverbindungen in die ganze Welt!\""},{"id":"2","codec":"12","parent":"-1","order":"1000","maxusers":"200","name":"\"Plauderraum\"","flags":"0","password":"0","topic":"\"Hier kann ungestört geplaudert werden.\""},{"id":"3","codec":"12","parent":"-1","order":"23352","maxusers":"10","name":"\"Admins\"","flags":"4","password":"1","topic":"\"\""},{"id":"4","codec":"12","parent":"-1","order":"1","maxusers":"200","name":"\"TESTRAUM\"","flags":"0","password":"0","topic":"\"\""},{"id":"5","codec":"12","parent":"-1","order":"1400","maxusers":"200","name":"\"Digimodes\"","flags":"10","password":"0","topic":"\"\""},{"id":"6","codec":"0","parent":"-1","order":"1300","maxusers":"200","name":"\"Gateway-Test\"","flags":"0","password":"0","topic":"\"\""},{"id":"7","codec":"0","parent":"-1","order":"34463","maxusers":"200","name":"\"ZXSTICKY\"","flags":"0","password":"0","topic":"\"\""},{"id":"8","codec":"0","parent":"-1","order":"34463","maxusers":"200","name":"\"AFK\"","flags":"2","password":"0","topic":"\"\""},{"id":"9","codec":"12","parent":"-1","order":"1200","maxusers":"50","name":"\"DX Funk\"","flags":"2","password":"0","topic":"\"Funkraum für Gateway- \/ HF-DX Verbindungen\""},{"id":"10","codec":"12","parent":"-1","order":"5000","maxusers":"200","name":"\"US-CARS & Treffen\"","flags":"10","password":"0","topic":"\"\""},{"id":"11","codec":"12","parent":"-1","order":"3200","maxusers":"200","name":"\"Webradio und Musik\"","flags":"10","password":"0","topic":"\"\""},{"id":"12","codec":"9","parent":"-1","order":"6500","maxusers":"200","name":"\"GAMERBEREICH\"","flags":"10","password":"0","topic":"\"Bereich für Gamer\""},{"id":"13","codec":"9","parent":"-1","order":"6000","maxusers":"200","name":"\"Funkspiele\"","flags":"10","password":"0","topic":"\"\""},{"id":"14","codec":"9","parent":"-1","order":"1250","maxusers":"200","name":"\"Fuchsjagt\"","flags":"10","password":"0","topic":"\"\""},{"id":"15","codec":"11","parent":"-1","order":"1101","maxusers":"200","name":"\"Funkraum 2\"","flags":"2","password":"0","topic":"\"Funkverbindungen in die ganze Welt!\""},{"id":"16","codec":"12","parent":"-1","order":"0","maxusers":"250","name":"\"***WILLKOMMEN***\"","flags":"16","password":"0","topic":"\"Begrüssungsraum\""},{"id":"17","codec":"12","parent":"-1","order":"7000","maxusers":"200","name":"\"Operator\"","flags":"4","password":"1","topic":"\"\""},{"id":"18","codec":"12","parent":"5","order":"3200","maxusers":"200","name":"\"RTTY50\"","flags":"2","password":"0","topic":"\"\""},{"id":"19","codec":"12","parent":"5","order":"3200","maxusers":"200","name":"\"SSTV Analog\"","flags":"2","password":"0","topic":"\"\""},{"id":"20","codec":"12","parent":"5","order":"3200","maxusers":"200","name":"\"PACKET\"","flags":"2","password":"0","topic":"\"\""},{"id":"21","codec":"12","parent":"5","order":"3200","maxusers":"200","name":"\"BPSK31\"","flags":"2","password":"0","topic":"\"\""},{"id":"22","codec":"12","parent":"5","order":"3200","maxusers":"200","name":"\"HELL FM\"","flags":"2","password":"0","topic":"\"\""},{"id":"23","codec":"12","parent":"5","order":"3200","maxusers":"200","name":"\"FAX\"","flags":"2","password":"0","topic":"\"\""},{"id":"24","codec":"12","parent":"5","order":"3200","maxusers":"200","name":"\"CW\"","flags":"2","password":"0","topic":"\"\""},{"id":"25","codec":"12","parent":"11","order":"3200","maxusers":"200","name":"\"Mainstream\"","flags":"2","password":"0","topic":"\"All4Fun Radio Mainstream\""}]}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Teamspeak3/1_response.txt b/gameq/tests/Protocols/Providers/Teamspeak3/1_response.txt new file mode 100644 index 0000000..318bc6b --- /dev/null +++ b/gameq/tests/Protocols/Providers/Teamspeak3/1_response.txt @@ -0,0 +1,64 @@ +TS3 + +|| +Welcome to the TeamSpeak 3 ServerQuery interface, type "help" for a list of commands and "help " for information on a specific command. + error id=0 msg=ok + virtualserver_unique_identifier=CpZsRk9cvQrobpgjwhTtO+gJJVU= virtualserver_name=www.hengeofdenravi.com virtualserver_welcomemessage=Welcome\sto\sthe\sHengeofDenravi.com\sCommunity\sVOIP\sserver. virtualserver_platform=Linux virtualserver_version=3.0.11.2\s[Build:\s1418654632] virtualserver_maxclients=350 virtualserver_password=SRJRjkPqAnT6BXvIkwIumDWMxRE= virtualserver_clientsonline=167 virtualserver_channelsonline=214 virtualserver_created=0 virtualserver_uptime=2238262 virtualserver_codec_encryption_mode=0 virtualserver_hostmessage=Final\sday!\shttp:\/\/www.hengeofdenravi.com\/index.php\/topic,2023.0.html virtualserver_hostmessage_mode=0 virtualserver_filebase=files\/virtualserver_1 virtualserver_default_server_group=7 virtualserver_default_channel_group=7 virtualserver_flag_password=1 virtualserver_default_channel_admin_group=5 virtualserver_max_download_total_bandwidth=18446744073709551615 virtualserver_max_upload_total_bandwidth=18446744073709551615 virtualserver_hostbanner_url=http:\/\/www.hengeofdenravi.com virtualserver_hostbanner_gfx_url virtualserver_hostbanner_gfx_interval=0 virtualserver_complain_autoban_count=5 virtualserver_complain_autoban_time=1200 virtualserver_complain_remove_time=3600 virtualserver_min_clients_in_channel_before_forced_silence=5 +|| +00 virtualserver_priority_speaker_dimm_modificator=-18.0000 virtualserver_id=1 virtualserver_antiflood_points_tick_reduce=5 virtualserver_antiflood_points_needed_command_block=150 virtualserver_antiflood_points_needed_ip_block=250 virtualserver_client_connections=15752 virtualserver_query_client_connections=59579 virtualserver_hostbutton_tooltip virtualserver_hostbutton_url virtualserver_hostbutton_gfx_url virtualserver_queryclientsonline=1 virtualserver_download_quota=18446744073709551615 virtualserver_upload_quota=18446744073709551615 virtualserver_month_bytes_downloaded=4452574 virtualserver_month_bytes_uploaded=745830 virtualserver_total_bytes_downloaded=5022685219 virtualserver_total_bytes_uploaded=176541033 virtualserver_port=9987 virtualserver_autostart=1 virtualserver_machine_id virtualserver_needed_identity_security_level=8 virtualserver_log_client=1 virtualserver_log_query=1 virtualserver_log_channel=1 virtualserver_log_permissions=1 virtualserver_log_server=1 virtualserver_log_filetransfer=1 virtualserver_min_client_version=1373587200 virtualserver_name_phonetic virtualserver_icon_id=0 virtualserver_reserved_slots=0 virtualserver_total_packetloss_speech=0.0018 virtualserver_total_packetloss_keepalive=0.0027 virtualserver_total_packetloss_control=0.0032 virtualserver_total_packetloss_total=0.0025 virtualserver_total_ping=101.7697 virtualserver_ip virtualserver_weblist_enabled=0 virtualserver_ask_for_privilegekey=0 +|| +virtualserver_hostbanner_mode=0 virtualserver_channel_temp_delete_delay_default=0 virtualserver_status=online connection_filetransfer_bandwidth_sent=0 connection_filetransfer_bandwidth_received=0 connection_filetransfer_bytes_sent_total=46999092 connection_filetransfer_bytes_received_total=5387294 connection_packets_sent_speech=2329031766 connection_bytes_sent_speech=256597063724 connection_packets_received_speech=470785932 connection_bytes_received_speech=51724149621 connection_packets_sent_keepalive=289474777 connection_bytes_sent_keepalive=11868465857 connection_packets_received_keepalive=289602472 connection_bytes_received_keepalive=12157558339 connection_packets_sent_control=34443808 connection_bytes_sent_control=6298577714 connection_packets_received_control=33851601 connection_bytes_received_control=2078675352 connection_packets_sent_total=2652950351 connection_bytes_sent_total=274764107295 connection_packets_received_total=794240005 connection_bytes_received_total=65960383312 connection_bandwidth_sent_last_second_total=564034 connection_bandwidth_sent_last_minute_total=552212 connection_bandwidth_received_last_second_total=61004 connection_bandwidth_received_last_minute_total=68035 + error id=0 msg=ok + +|| +error id=0 msg=ok + clid=2 cid=1542 client_database_id=13147 client_nickname=Dhallia client_type=0|clid=4 cid=1708 client_database_id=13989 client_nickname=Waking\sUp client_type=0|clid=5 cid=1542 client_database_id=11878 client_nickname=Lydian client_type=0|clid=6 cid=717 client_database_id=14528 client_nickname=Redga client_type=0|clid=7 cid=1615 client_database_id=14420 client_nickname=sik client_type=0|clid=8 cid=1542 client_database_id=13949 client_nickname=Black\sDynamite client_type=0|clid=9 cid=1542 client_database_id=5235 client_nickname=Primal\sWrath client_type=0|clid=10 cid=1750 client_database_id=14230 client_nickname=Plancton client_type=0|clid=11 cid=1750 client_database_id=14538 client_nickname=Mike client_type=0|clid=12 cid=1445 client_database_id=3394 client_nickname=Dragoncon client_type=0|clid=13 cid=710 client_database_id=2135 client_nickname=Prismaea client_type=0|clid=16 cid=217 client_database_id=12306 client_nickname=DDK client_type=0|clid=19 cid=217 client_database_id=14044 client_nickname=Sylvan client_type=0|clid=20 cid=25 client_database_id=5363 client_nickname=Sir\sNoarg client_type=0|clid=21 cid=1704 client_database_id=2740 client_nickname=Think\sFast client_type=0|clid=22 cid=1542 client_database_id=13162 client_nickname=Grumpy client_type=0|clid=25 cid=1485 client_database_id=12618 client_nickname=Matt client_type=0|clid=27 cid=1485 client_database_id=3071 client_nickname=Eths client_type=0|cl +|| +id=28 cid=1542 client_database_id=14286 client_nickname=[HoD]Chillyboon client_type=0|clid=30 cid=710 client_database_id=12282 client_nickname=Aislynn client_type=0|clid=31 cid=55 client_database_id=13315 client_nickname=Kakida client_type=0|clid=32 cid=1542 client_database_id=13735 client_nickname=Yeagarr client_type=0|clid=33 cid=1542 client_database_id=13914 client_nickname=Hannover\sFist client_type=0|clid=34 cid=710 client_database_id=13986 client_nickname=Kris client_type=0|clid=36 cid=25 client_database_id=2528 client_nickname=Janice\sVyrra client_type=0|clid=37 cid=1467 client_database_id=14511 client_nickname=Ray(touretts) client_type=0|clid=39 cid=25 client_database_id=10877 client_nickname=Fern\sWillow client_type=0|clid=41 cid=1754 client_database_id=13044 client_nickname=HeroPride client_type=0|clid=42 cid=1724 client_database_id=13491 client_nickname=Arkaeous client_type=0|clid=43 cid=25 client_database_id=53 client_nickname=Unknown\sfrom\s71.199.205.69:56260 client_type=1|clid=44 cid=1542 client_database_id=14718 client_nickname=waaah client_type=0|clid=45 cid=25 client_database_id=13899 client_nickname=midgit client_type=0|clid=46 cid=1542 client_database_id=14057 client_nickname=Dark\sRoll\sCaskett client_type=0|clid=47 cid=217 client_database_id=3901 client_nickname=Lu'uke\sSkywalker client_type=0|clid=50 cid=217 client_database_id=12578 client_nickname=Entro client_type=0|clid=52 cid=217 client_database_id +|| +=9212 client_nickname=Irrational client_type=0|clid=53 cid=217 client_database_id=2366 client_nickname=Smash client_type=0|clid=55 cid=217 client_database_id=11458 client_nickname=[orr]\sIkkoroshi\s-\sIkken client_type=0|clid=56 cid=1625 client_database_id=13344 client_nickname=ToBee client_type=0|clid=59 cid=61 client_database_id=14399 client_nickname=Kinrea client_type=0|clid=61 cid=1485 client_database_id=13443 client_nickname=Zone client_type=0|clid=62 cid=1015 client_database_id=7168 client_nickname=Infamous client_type=0|clid=63 cid=1015 client_database_id=12332 client_nickname=Vhira client_type=0|clid=65 cid=1750 client_database_id=13911 client_nickname=Cazy client_type=0|clid=66 cid=217 client_database_id=3975 client_nickname=seksi client_type=0|clid=67 cid=1750 client_database_id=14231 client_nickname=QCOM client_type=0|clid=75 cid=1600 client_database_id=14675 client_nickname=Darkwinter client_type=0|clid=77 cid=1485 client_database_id=13426 client_nickname=Greg\sDouger client_type=0|clid=78 cid=217 client_database_id=14631 client_nickname=Insane\sKillbane client_type=0|clid=79 cid=1718 client_database_id=157 client_nickname=Rollack client_type=0|clid=82 cid=217 client_database_id=63 client_nickname=Edward client_type=0|clid=83 cid=217 client_database_id=1918 client_nickname=Recon\s(Charred\sFurr) client_type=0|clid=88 cid=55 client_database_id=3121 client_nickname=Grayghost client_type=0|clid=90 cid=1615 client_da +|| +tabase_id=13754 client_nickname=www.twitch.tv\/ca8oose client_type=0|clid=92 cid=217 client_database_id=12664 client_nickname=Vitorian client_type=0|clid=93 cid=1542 client_database_id=13311 client_nickname=Domilese client_type=0|clid=94 cid=217 client_database_id=12115 client_nickname=Ozriel client_type=0|clid=95 cid=1542 client_database_id=2705 client_nickname=Will\sDeForest client_type=0|clid=98 cid=145 client_database_id=13675 client_nickname=Grayshark client_type=0|clid=99 cid=1542 client_database_id=13348 client_nickname=smoulderling client_type=0|clid=101 cid=1750 client_database_id=14210 client_nickname=Hiro client_type=0|clid=103 cid=1718 client_database_id=5166 client_nickname=Kalek\sDraaf client_type=0|clid=104 cid=736 client_database_id=95 client_nickname=Sanir\sIronguard client_type=0|clid=106 cid=1724 client_database_id=14414 client_nickname=C\sH\sE\sM\sI\sC\sA\sL client_type=0|clid=107 cid=710 client_database_id=12610 client_nickname=Cerxi client_type=0|clid=111 cid=1718 client_database_id=13624 client_nickname=Maroon\sIllusionist client_type=0|clid=113 cid=1542 client_database_id=9724 client_nickname=Thundar client_type=0|clid=114 cid=1718 client_database_id=13950 client_nickname=Dendrinian client_type=0|clid=115 cid=217 client_database_id=3240 client_nickname=HamUndBacon client_type=0|clid=116 cid=1015 client_database_id=6302 client_nickname=Gale client_type=0|clid=117 cid=659 client_database_id=1084 client_ +|| +nickname=[PHZE]Labadingi client_type=0|clid=119 cid=217 client_database_id=14662 client_nickname=Malibu\sBarbie client_type=0|clid=122 cid=1542 client_database_id=14465 client_nickname=Pop client_type=0|clid=123 cid=217 client_database_id=4414 client_nickname=Aeybon client_type=0|clid=125 cid=717 client_database_id=5659 client_nickname=D\sVid client_type=0|clid=127 cid=1680 client_database_id=13650 client_nickname=Nine\sFingers client_type=0|clid=130 cid=1485 client_database_id=5490 client_nickname=Odin client_type=0|clid=131 cid=217 client_database_id=2014 client_nickname=Orion client_type=0|clid=132 cid=217 client_database_id=12304 client_nickname=Angel client_type=0|clid=133 cid=21 client_database_id=6117 client_nickname=[VS]\sWolfshead client_type=0|clid=134 cid=1542 client_database_id=4840 client_nickname=Zach client_type=0|clid=136 cid=710 client_database_id=11221 client_nickname=Zeth client_type=0|clid=139 cid=55 client_database_id=13510 client_nickname=Kirinkage client_type=0|clid=140 cid=217 client_database_id=14617 client_nickname=Chrono client_type=0|clid=141 cid=1485 client_database_id=3977 client_nickname=afaa client_type=0|clid=142 cid=55 client_database_id=12777 client_nickname=Shelf client_type=0|clid=144 cid=1718 client_database_id=6595 client_nickname=Jyn client_type=0|clid=146 cid=1542 client_database_id=5724 client_nickname=nglass client_type=0|clid=148 cid=1680 client_database_id=12504 client_nickname=Er +|| +is client_type=0|clid=152 cid=1542 client_database_id=14161 client_nickname=Mint client_type=0|clid=153 cid=814 client_database_id=2491 client_nickname=Clatter\sBang client_type=0|clid=154 cid=1718 client_database_id=14174 client_nickname=Rei client_type=0|clid=155 cid=710 client_database_id=10951 client_nickname=Hnah client_type=0|clid=156 cid=1467 client_database_id=14699 client_nickname=Kaly client_type=0|clid=158 cid=1750 client_database_id=11709 client_nickname=anthofire client_type=0|clid=159 cid=1750 client_database_id=12969 client_nickname=Crazy client_type=0|clid=162 cid=217 client_database_id=14523 client_nickname=Talon client_type=0|clid=168 cid=1649 client_database_id=1214 client_nickname=Dany client_type=0|clid=169 cid=1542 client_database_id=12305 client_nickname=Piroloko client_type=0|clid=170 cid=1542 client_database_id=14375 client_nickname=Argon client_type=0|clid=171 cid=1649 client_database_id=13625 client_nickname=Blargo\sThe\sGreat client_type=0|clid=172 cid=1680 client_database_id=4833 client_nickname=Slick client_type=0|clid=175 cid=1542 client_database_id=13910 client_nickname=Massive\sRecoil client_type=0|clid=176 cid=217 client_database_id=13437 client_nickname=Orthiana\sSustrider client_type=0|clid=177 cid=736 client_database_id=9469 client_nickname=Medev client_type=0|clid=179 cid=217 client_database_id=6340 client_nickname=Ashara client_type=0|clid=181 cid=814 client_database_id=2482 client_nick +|| +name=Fumblemuffin client_type=0|clid=182 cid=1759 client_database_id=12373 client_nickname=OPPJimi client_type=0|clid=186 cid=1615 client_database_id=10011 client_nickname=Curtyyy[Alt] client_type=0|clid=187 cid=217 client_database_id=11777 client_nickname=Akral\sSilvermane client_type=0|clid=191 cid=217 client_database_id=10996 client_nickname=Tedohn client_type=0|clid=194 cid=1718 client_database_id=13876 client_nickname=Lord\sSavage client_type=0|clid=195 cid=1680 client_database_id=12114 client_nickname=Elvalas client_type=0|clid=197 cid=1680 client_database_id=12985 client_nickname=Myx client_type=0|clid=198 cid=717 client_database_id=14198 client_nickname=Evil\sStudmuffin client_type=0|clid=201 cid=659 client_database_id=12733 client_nickname=fabbalabba client_type=0|clid=203 cid=710 client_database_id=10440 client_nickname=Spiffers client_type=0|clid=205 cid=33 client_database_id=13732 client_nickname=Ting client_type=0|clid=207 cid=736 client_database_id=4489 client_nickname=Mi\sN\sD\sY client_type=0|clid=213 cid=726 client_database_id=2378 client_nickname=Tandiin client_type=0|clid=214 cid=1467 client_database_id=14427 client_nickname=Jeff client_type=0|clid=216 cid=1542 client_database_id=9570 client_nickname=~Ja~ client_type=0|clid=217 cid=1542 client_database_id=12858 client_nickname=Kins client_type=0|clid=219 cid=1734 client_database_id=7 client_nickname=FrozenHydra client_type=0|clid=220 cid=1542 client_databa +|| +se_id=14294 client_nickname=Loziac client_type=0|clid=221 cid=1542 client_database_id=14203 client_nickname=[HoD]\sCiraxis client_type=0|clid=222 cid=217 client_database_id=14724 client_nickname=Crystal\sCastles client_type=0|clid=224 cid=1542 client_database_id=10939 client_nickname=Lightsoul client_type=0|clid=225 cid=1625 client_database_id=13429 client_nickname=Assembly client_type=0|clid=228 cid=217 client_database_id=13129 client_nickname=Lady\s(Resplendent) client_type=0|clid=229 cid=1542 client_database_id=10115 client_nickname=Rinsam client_type=0|clid=236 cid=217 client_database_id=11650 client_nickname=qwerty.1230 client_type=0|clid=237 cid=1615 client_database_id=10336 client_nickname=Darkside client_type=0|clid=245 cid=822 client_database_id=12 client_nickname=Pentose client_type=0|clid=247 cid=814 client_database_id=12288 client_nickname=Sunny client_type=0|clid=249 cid=814 client_database_id=135 client_nickname=[HC]\sSepar\s\/\sRoth\s\/\sMontoya client_type=0|clid=250 cid=1542 client_database_id=11511 client_nickname=Vampede client_type=0|clid=252 cid=726 client_database_id=3908 client_nickname=Fishstick client_type=0|clid=255 cid=814 client_database_id=14496 client_nickname=Eidocar client_type=0|clid=256 cid=1015 client_database_id=359 client_nickname=Fisty client_type=0|clid=257 cid=217 client_database_id=14725 client_nickname=[Sol]\sDivineMaurader client_type=0|clid=259 cid=217 client_database_id=1530 client_nickname=Raegair client_type=0|clid=263 cid=814 client_database_id=14264 client_nickname=GraySea client_type=0|clid=264 cid=33 client_database_id=76 client_nickname=Winkle\sTinkle client_type=0|clid=266 cid=217 client_database_id=14045 client_nickname=TheBofelsh client_type=0|clid=267 cid=1718 client_database_id=9069 client_nickname=Who\suses\sbows client_type=0|clid=268 cid=1542 client_database_id=11997 client_nickname=Moody client_type=0|clid=270 cid=1542 client_database_id=64 client_nickname=Tifa\sRan client_type=0|clid=274 cid=1542 client_database_id=13706 client_nickname=Dear\sBora client_type=0|clid=280 cid=1542 client_database_id=12094 client_nickname=Spikecell client_type=0|clid=282 cid=1542 client_database_id=14296 client_nickname=Xoris\/Lexiea client_type=0|clid=283 cid=1542 client_database_id=13671 client_nickname=Maximus client_type=0|clid=287 cid=1625 client_database_id=13409 client_nickname=lord\slight client_type=0|clid=294 cid=217 client_database_id=13627 client_nickname=Capt client_type=0|clid=297 cid=1718 client_database_id=13511 client_nickname=Jesse221 client_type=0|clid=298 cid=1542 client_database_id=9911 client_nickname=Sarah\sMay client_type=0|clid=304 cid=1704 client_database_id=14726 client_nickname=YourLastSight666 client_type=0|clid=306 cid=1542 client_database_id=14488 client_nickname=[HoD]\sJoao client_type=0|clid=309 cid=814 client_database_id=14727 client_nickname=AIfef client_type=0|clid=311 cid=1542 client_database_id=13328 client_nickname=Voidloss client_type=0|clid=321 cid=736 client_database_id=5163 client_nickname=Cloud client_type=0|clid=322 cid=217 client_database_id=12324 client_nickname=dodo client_type=0|clid=328 cid=1542 client_database_id=14512 client_nickname=Gendry\sHarlaw client_type=0|clid=332 cid=1542 client_database_id=13912 client_nickname=Prysoner client_type=0|clid=342 cid=1718 client_database_id=3308 client_nickname=Vindictive client_type=0|clid=343 cid=1542 client_database_id=150 client_nickname=Jadis client_type=0 + error id=0 msg=ok + error id=0 msg=ok + cid=25 pid=0 channel_order=0 channel_name=Main\sLobby channel_topic total_clients=5 channel_needed_subscribe_power=0|cid=33 pid=0 channel_order=25 channel_name=Away\sFrom\sKeyboard channel_topic total_clients=2 channel_needed_subscribe_power=0|cid=55 pid=0 channel_order=33 channel_name=PvE channel_topic total_clients=4 channel_needed_subscribe_power=0|cid=1571 pid=55 channel_order=0 channel_name=Community\sEvents channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=225 pid=55 channel_order=1571 channel_name=Server\sEvents channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=659 pid=225 channel_order=0 channel_name=Living\sStory channel_topic total_clients=2 channel_needed_subscribe_power=0|cid=660 pid=225 channel_order=659 channel_name=Wurm channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=57 p +|| +id=55 channel_order=225 channel_name=Dungeons channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=250 pid=57 channel_order=0 channel_name=Dungeons\s2 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=61 pid=57 channel_order=250 channel_name=Dungeons\s1 channel_topic total_clients=1 channel_needed_subscribe_power=0|cid=63 pid=57 channel_order=61 channel_name=Dungeons\s3 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1741 pid=55 channel_order=57 channel_name=Silverwastes channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=2 pid=0 channel_order=55 channel_name=WvW channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1659 pid=2 channel_order=0 channel_name=Server\sMeeting channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1446 pid=2 channel_order=1659 channel_name=Float channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=95 pid=2 channel_order=1446 channel_name=Roaming channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=725 pid=2 channel_order=95 channel_name=EOTM channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=15 pid=2 channel_order=725 channel_name=Blue\sBorderland channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=17 pid=15 channel_order=0 channel_name=Blue\sTeam\s1 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=18 pid=15 channel_order=17 channel_name=Blue\sTeam\s2 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=20 pid=2 channel_order=15 channel_name=Green\sBorderland channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=145 pid=20 channel_order=0 channel_name=Green\sTeam\s1 channel_topic total_clients=1 channel_needed_subscribe_power=0|cid=252 pid=20 channel_order=145 channel_name=Green\sTeam\s2 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=9 pid=2 channel_order=20 channel_name=Red\sBorderland channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=6 pid=9 channel_order=0 channel_name=Red\sTeam\s1 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=274 pid=9 channel_order=6 channel_name=Red\sTeam\s2 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=26 pid=2 channel_order=9 channel_name=Eternal\sBattlegrounds channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=21 pid=26 channel_order=0 channel_name=EB\sTeam\s1 channel_topic total_clients=1 channel_needed_subscribe_power=0|cid=1767 pid=21 channel_order=0 channel_name=Sass\sMouth channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=28 pid=26 channel_order=21 channel_name=EB\sTeam\s2 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1622 pid=26 channel_order=28 channel_name=EB\sgroup\sA channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1623 pid=26 channel_order=16 +|| +22 channel_name=EB\sGroup\sB channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1624 pid=26 channel_order=1623 channel_name=EB\sGroup\sC channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=248 pid=0 channel_order=2 channel_name=WvW\sReset\sMeeting channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=24 pid=0 channel_order=248 channel_name=Guild\sChannels channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1467 pid=24 channel_order=0 channel_name=Asguardian\sLegends\s[AGLS] channel_topic total_clients=3 channel_needed_subscribe_power=0|cid=1474 pid=1467 channel_order=0 channel_name=Odin's\sThrone channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1475 pid=1467 channel_order=1474 channel_name=Valhalla\s(PvP) channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1485 pid=1467 channel_order=1475 channel_name=Ragnarok\s(WvW) channel_topic total_clients=6 channel_needed_subscribe_power=0|cid=1476 pid=1467 channel_order=1485 channel_name=Yggdrasil\s(PvE) channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1498 pid=1467 channel_order=1476 channel_name=Niflheim\s(Other\sGames) channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=822 pid=24 channel_order=1467 channel_name=Astalderas\sChosen\s[ASTC] channel_topic total_clients=1 channel_needed_subscribe_power=0|cid=1360 pid=822 channel_order=0 channel_name=PVP channel_t +|| +opic total_clients=0 channel_needed_subscribe_power=0|cid=1362 pid=822 channel_order=1360 channel_name=Dungeon\/Fractals channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1371 pid=822 channel_order=1362 channel_name=Roaming channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1375 pid=822 channel_order=1371 channel_name=Gala's\sBar channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1642 pid=822 channel_order=1375 channel_name=Sahren's\sGetaway channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1764 pid=822 channel_order=1642 channel_name=STAR channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1765 pid=822 channel_order=1764 channel_name=CITIZEN channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1766 pid=822 channel_order=1765 channel_name=HYPE channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1625 pid=24 channel_order=822 channel_name=Bellicose\sBanana\sClub\s[Bana] channel_topic total_clients=3 channel_needed_subscribe_power=0|cid=1631 pid=1625 channel_order=0 channel_name=BANA\sBLACK\sOPS\s[\sWvW1\s] channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1643 pid=1625 channel_order=1631 channel_name=BANA\sDELTA\steam\s[\sWvW2\s] channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1644 pid=1625 channel_order=1643 channel_name=BANA\sALPHA\steam\s[WvW3] channel_topic total_clients=0 channe +|| +l_needed_subscribe_power=0|cid=1653 pid=1625 channel_order=1644 channel_name=bana\sguild\smission\/meetings\s[PVE] channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1588 pid=24 channel_order=1625 channel_name=Brethren\s[PAIN] channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1590 pid=1588 channel_order=0 channel_name=WvW\s#paintrain\s>:D channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1680 pid=1588 channel_order=1590 channel_name=Guild\sMissions channel_topic total_clients=5 channel_needed_subscribe_power=0|cid=1669 pid=1588 channel_order=1680 channel_name=Music\sRoom:\sEnjoy\sthe\sVibe channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1589 pid=1588 channel_order=1669 channel_name=PVE channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1591 pid=1589 channel_order=0 channel_name=Dungeons channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1684 pid=1589 channel_order=1591 channel_name=Fractals\sof\sthe\sMists channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1689 pid=1588 channel_order=1589 channel_name=Guild\sInformation\sBoard channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1668 pid=1588 channel_order=1689 channel_name=Meeting\sRoom channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1682 pid=1588 channel_order=1668 channel_name=Brethren\sCouncil\sMeeting\sRoom channel_topic t +|| +otal_clients=0 channel_needed_subscribe_power=0|cid=1592 pid=1588 channel_order=1682 channel_name=Blightwing's\sPerch channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=109 pid=24 channel_order=1588 channel_name=Charter\sVanguard\s[CV] channel_topic=Courage,\sHonesty,\sand\sRespect total_clients=0 channel_needed_subscribe_power=0|cid=114 pid=109 channel_order=0 channel_name=Missions channel_topic=Saturday\sGuild\sMissions! total_clients=0 channel_needed_subscribe_power=0|cid=355 pid=114 channel_order=0 channel_name=Troll\sKiller\sChannel channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1488 pid=114 channel_order=355 channel_name=18+ channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=115 pid=109 channel_order=114 channel_name=WvW channel_topic=For\sHoD! total_clients=0 channel_needed_subscribe_power=0|cid=116 pid=109 channel_order=115 channel_name=PvE channel_topic=Dungeons,\sjump\spuzzles,\shearts\sand\sstories total_clients=0 channel_needed_subscribe_power=0|cid=576 pid=109 channel_order=116 channel_name=sPVP channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1401 pid=109 channel_order=576 channel_name=Team\s1 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1403 pid=109 channel_order=1401 channel_name=Team\s2 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1439 pid=109 channel_order=1403 channel_name=Team\s3 channel_topic +|| + total_clients=0 channel_needed_subscribe_power=0|cid=383 pid=24 channel_order=109 channel_name=Contemporary\sHeroes\s[CH] channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=814 pid=383 channel_order=0 channel_name=CH\sChannel\s1\s(Lobby) channel_topic total_clients=7 channel_needed_subscribe_power=0|cid=385 pid=383 channel_order=814 channel_name=CH\sChannel\s2 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=386 pid=383 channel_order=385 channel_name=CH\sChannel\s3 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=726 pid=383 channel_order=386 channel_name=CH\sChannel\s4 channel_topic total_clients=2 channel_needed_subscribe_power=0|cid=496 pid=383 channel_order=726 channel_name=[CH]Small\sGroup\sChannel\s1\s(Private) channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=384 pid=383 channel_order=496 channel_name=[CH]Small\sGroup\sChannel\s2\s(Private) channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1236 pid=383 channel_order=384 channel_name=[CH]Small\sGroup\sChannel\s3\s(Private) channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=387 pid=383 channel_order=1236 channel_name=[CH]Small\sGroup\sChannel\s4\s(password) channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=715 pid=383 channel_order=387 channel_name=Officer\sChannel\s(password) channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1725 pid= +|| +24 channel_order=383 channel_name=Daggers\sand\sArrows\s(DaA) channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1726 pid=1725 channel_order=0 channel_name=WvW channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1727 pid=1725 channel_order=1726 channel_name=PvE channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1728 pid=1725 channel_order=1727 channel_name=PvP channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1729 pid=1725 channel_order=1728 channel_name=AFK channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1737 pid=1725 channel_order=1729 channel_name=Mike's\sAmerican\sHome channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1582 pid=24 channel_order=1725 channel_name=Digital\sSacrifice\s[DS] channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1615 pid=1582 channel_order=0 channel_name=Welcome\sto\sProf\sKaze's\sTeaching\sRoom channel_topic total_clients=4 channel_needed_subscribe_power=0|cid=1750 pid=1582 channel_order=1615 channel_name=Harvey's\sSquad\s[SHYT] channel_topic total_clients=7 channel_needed_subscribe_power=0|cid=1761 pid=1582 channel_order=1750 channel_name=Super\sCharrio\sBros channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=736 pid=24 channel_order=1582 channel_name=Exciting\sRole\sPlay\s[ERP] channel_topic total_clients=4 channel_needed_subscribe_power=0|cid=738 pid=736 channel_o +|| +rder=0 channel_name=WvW channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=741 pid=736 channel_order=738 channel_name=PvE channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1089 pid=736 channel_order=741 channel_name=The\sLove\sRoom channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1760 pid=736 channel_order=1089 channel_name=Dungeon\sof\sGaming channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1542 pid=24 channel_order=736 channel_name=Hordes\sof\sDenravi\s[HoD] channel_topic total_clients=40 channel_needed_subscribe_power=0|cid=1543 pid=1542 channel_order=0 channel_name=Roaming channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1704 pid=1542 channel_order=1543 channel_name=The\sSerious\sRoom channel_topic total_clients=2 channel_needed_subscribe_power=0|cid=1580 pid=1542 channel_order=1704 channel_name=PVP channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1587 pid=1542 channel_order=1580 channel_name=18+\sChannel channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1746 pid=1542 channel_order=1587 channel_name=The\sMeeting\sRoom channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1768 pid=1542 channel_order=1746 channel_name=Hyperbolic\sTime\sChamber channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1707 pid=24 channel_order=1542 channel_name=Mist\sRáiders channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1708 pid=1707 channel_order=0 channel_name=WvW channel_topic total_clients=1 channel_needed_subscribe_power=0|cid=1711 pid=1707 channel_order=1708 channel_name=GvG channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1712 pid=1711 channel_order=0 channel_name=GvG\sKill\sGroup channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1714 pid=1707 channel_order=1711 channel_name=sPvP channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1730 pid=1707 channel_order=1714 channel_name=Meeting\s-\soffice\sroom channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1710 pid=1707 channel_order=1730 channel_name=PvE channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1715 pid=1707 channel_order=1710 channel_name=AFK channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1584 pid=24 channel_order=1707 channel_name=Nerfed\sAgain\s[NERF] channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1690 pid=1584 channel_order=0 channel_name=quiet\stime channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1598 pid=24 channel_order=1584 channel_name=Outlaws,Renegades\sand\sRebels\s[ORR] channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1600 pid=1598 channel_order=0 channel_name=PVE channel_topic total_clients=1 channel_needed_subscribe_power=0|cid=1759 pid=1600 channel_order=0 channel_ +|| +name=Frigid`s\sice\spalace channel_topic total_clients=1 channel_needed_subscribe_power=0|cid=1602 pid=1598 channel_order=1600 channel_name=WVW channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1612 pid=1602 channel_order=0 channel_name=EBG channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1613 pid=1612 channel_order=0 channel_name=Borderlands channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1749 pid=1602 channel_order=1612 channel_name=Will`s\scave channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1603 pid=1598 channel_order=1602 channel_name=sPVP channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1778 pid=1603 channel_order=0 channel_name=Drago`s\sportal channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1604 pid=1598 channel_order=1603 channel_name=Dungeons channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1605 pid=1598 channel_order=1604 channel_name=Chat channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1414 pid=24 channel_order=1598 channel_name=Partners\sN\sCryme\s[PIC] channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1429 pid=1414 channel_order=0 channel_name=sPVP channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1430 pid=1414 channel_order=1429 channel_name=WvW channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1597 pid=1414 channel_ +|| +order=1430 channel_name=Central\sAnime\sTemp\sChannel(GW2\sOnly) channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1747 pid=1414 channel_order=1597 channel_name=AFK channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=30 pid=24 channel_order=1414 channel_name=Phaze\s[PHZE] channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=41 pid=30 channel_order=0 channel_name=Dungeon channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=40 pid=30 channel_order=41 channel_name=WvW\sMain channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=224 pid=40 channel_order=0 channel_name=WvW\sSquad channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=46 pid=30 channel_order=40 channel_name=PvP channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=108 pid=30 channel_order=46 channel_name=Non\sGw2\sStuff channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=179 pid=30 channel_order=108 channel_name=Leaders\sChannel channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1716 pid=24 channel_order=30 channel_name=Prophecies\sof\sAnnihilation\s(POA) channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1718 pid=1716 channel_order=0 channel_name=WvW channel_topic total_clients=10 channel_needed_subscribe_power=0|cid=1743 pid=1716 channel_order=1718 channel_name=PvP channel_topic total_clients=0 channel_needed_subscribe_p +|| +ower=0|cid=1721 pid=1716 channel_order=1743 channel_name=PvE channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1722 pid=1721 channel_order=0 channel_name=Story\smode channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1723 pid=1721 channel_order=1722 channel_name=Dungeons channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1720 pid=1716 channel_order=1721 channel_name=Meeting\sHall channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1744 pid=1720 channel_order=0 channel_name=Open\sMeeting\sHall channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1745 pid=1720 channel_order=1744 channel_name=Closed\sMeeting\sHall channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1724 pid=1716 channel_order=1720 channel_name=AFK channel_topic total_clients=2 channel_needed_subscribe_power=0|cid=997 pid=24 channel_order=1716 channel_name=Quaggan\sSlavers\s[WHIP] channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1015 pid=997 channel_order=0 channel_name=Choo\sChoo channel_topic total_clients=4 channel_needed_subscribe_power=0|cid=1017 pid=997 channel_order=1015 channel_name=Killing\sFools channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1075 pid=997 channel_order=1017 channel_name=Ermergerd\sDark\sSolz channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1451 pid=997 channel_order=1075 channel_name=Blast\sfrom\sthe\sPast\s(GW1) channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1693 pid=24 channel_order=997 channel_name=Rift\sLegion\s[Mist] channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1695 pid=1693 channel_order=0 channel_name=Guest\sBathroom channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1703 pid=1693 channel_order=1695 channel_name=Charr\sParty channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1009 pid=24 channel_order=1693 channel_name=Serenity\sEdge\s[TRE] channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=217 pid=24 channel_order=1009 channel_name=Sovereign\sof\sLords\s[Sol] channel_topic total_clients=32 channel_needed_subscribe_power=0|cid=1445 pid=217 channel_order=0 channel_name=Happy\sFun\sTime channel_topic total_clients=1 channel_needed_subscribe_power=0|cid=222 pid=217 channel_order=1445 channel_name=sPvP channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=220 pid=217 channel_order=222 channel_name=WvW channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=218 pid=217 channel_order=220 channel_name=PvE channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=219 pid=218 channel_order=0 channel_name=Fractals channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=221 pid=218 channel_order=219 channel_name=Dungeons channel_topic total_clients=0 channel_needed_subscribe_power=0| +|| +cid=501 pid=217 channel_order=218 channel_name=The\sLords\sGathering channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=549 pid=501 channel_order=0 channel_name=Sol's\sOffice channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1347 pid=217 channel_order=501 channel_name=AFK channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=91 pid=24 channel_order=217 channel_name=The\sAssassin\sArmy\s[TAA] channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=768 pid=91 channel_order=0 channel_name=Liz's\sChannel.\sPoke\sif\sneeded channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1574 pid=91 channel_order=768 channel_name=Machew's\sChannel channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1756 pid=24 channel_order=91 channel_name=The\sMinistry\s[TM] channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1757 pid=1756 channel_order=0 channel_name=WvW channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1758 pid=1756 channel_order=1757 channel_name=PvE channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1771 pid=1758 channel_order=0 channel_name=Dungeons channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1772 pid=1758 channel_order=1771 channel_name=Fractals channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1774 pid=1758 channel_order=1772 channel_name=Silverwastes channel_top +|| +ic total_clients=0 channel_needed_subscribe_power=0|cid=1775 pid=1758 channel_order=1774 channel_name=Living\sStory channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1773 pid=1756 channel_order=1758 channel_name=Meeting\sRoom channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1777 pid=1756 channel_order=1773 channel_name=PvP channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1611 pid=24 channel_order=1756 channel_name=The\sRaging\sStorm\s[STRM] channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1754 pid=1611 channel_order=0 channel_name=WvW channel_topic total_clients=1 channel_needed_subscribe_power=0|cid=1755 pid=1611 channel_order=1754 channel_name=The\sBunker channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1617 pid=1611 channel_order=1755 channel_name=AFK channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=710 pid=24 channel_order=1611 channel_name=The\sSnow\sRose\sResistance\s[Snow] channel_topic total_clients=7 channel_needed_subscribe_power=0|cid=1593 pid=710 channel_order=0 channel_name=Dungeons\s&\sFractals channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1594 pid=1593 channel_order=0 channel_name=Team\sZefferEtc channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1595 pid=1593 channel_order=1594 channel_name=Team\sPrismStormLord channel_topic total_clients=0 channel_needed_subscribe_po +|| +wer=0|cid=1165 pid=710 channel_order=1593 channel_name=The\sGazebo\s(Other\sGames) channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=717 pid=24 channel_order=710 channel_name=The\sSons\sof\sTzu\s[WAR] channel_topic total_clients=3 channel_needed_subscribe_power=0|cid=719 pid=717 channel_order=0 channel_name=The\s[WAR]\sCouncil\sChamber channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=718 pid=717 channel_order=719 channel_name=WvW channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=720 pid=717 channel_order=718 channel_name=PvE channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=958 pid=717 channel_order=720 channel_name=PvP\sArena channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=959 pid=958 channel_order=0 channel_name=Red\sTeam channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=960 pid=958 channel_order=959 channel_name=Blue\sTeam channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1091 pid=717 channel_order=958 channel_name=The\sAFK\sLounge channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1166 pid=1091 channel_order=0 channel_name=Hellbound's\sSmokehut channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1619 pid=717 channel_order=1091 channel_name=Ed\sand\sBarbie's\sTea\sRoom channel_topic total_clients=-1 channel_needed_subscribe_power=60|cid=1632 pid=24 channel_order=717 chann +|| +el_name=The\sThird\sEclipse\s[Howl] channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1636 pid=1632 channel_order=0 channel_name=Hunting\sGrounds channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1641 pid=1632 channel_order=1636 channel_name=The\sDen channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1649 pid=1641 channel_order=0 channel_name=Kitten's\sPlay\sPen channel_topic total_clients=2 channel_needed_subscribe_power=0|cid=1583 pid=24 channel_order=1632 channel_name=Wankers\sand\sNerdy\sGamers\s[WANG] channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1731 pid=24 channel_order=1583 channel_name=Valkyria\sImmortalis channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1734 pid=1731 channel_order=0 channel_name=Charrbucks channel_topic total_clients=1 channel_needed_subscribe_power=0|cid=1739 pid=1731 channel_order=1734 channel_name=Ed's\sPatio channel_topic total_clients=-1 channel_needed_subscribe_power=60|cid=56 pid=0 channel_order=24 channel_name=SPvP channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=71 pid=56 channel_order=0 channel_name=Group\s1 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=72 pid=56 channel_order=71 channel_name=Group\s2 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1325 pid=56 channel_order=72 channel_name=Group\s3 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1326 pid=56 channel_order=1325 channel_name=Group\s4 channel_topic total_clients=0 channel_needed_subscribe_power=0 + error id=0 msg=ok + \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Teamspeak3/1_result.json b/gameq/tests/Protocols/Providers/Teamspeak3/1_result.json new file mode 100644 index 0000000..2769390 --- /dev/null +++ b/gameq/tests/Protocols/Providers/Teamspeak3/1_result.json @@ -0,0 +1 @@ +{"107.161.184.3:9987":{"connection_bandwidth_received_last_minute_total":"68035","connection_bandwidth_received_last_second_total":"61004","connection_bandwidth_sent_last_minute_total":"552212","connection_bandwidth_sent_last_second_total":"564034","connection_bytes_received_control":"2078675352","connection_bytes_received_keepalive":"12157558339","connection_bytes_received_speech":"51724149621","connection_bytes_received_total":"65960383312","connection_bytes_sent_control":"6298577714","connection_bytes_sent_keepalive":"11868465857","connection_bytes_sent_speech":"256597063724","connection_bytes_sent_total":"274764107295","connection_filetransfer_bandwidth_received":"0","connection_filetransfer_bandwidth_sent":"0","connection_filetransfer_bytes_received_total":"5387294","connection_filetransfer_bytes_sent_total":"46999092","connection_packets_received_control":"33851601","connection_packets_received_keepalive":"289602472","connection_packets_received_speech":"470785932","connection_packets_received_total":"794240005","connection_packets_sent_control":"34443808","connection_packets_sent_keepalive":"289474777","connection_packets_sent_speech":"2329031766","connection_packets_sent_total":"2652950351","dedicated":1,"gq_address":"107.161.184.3","gq_joinlink":"ts3server:\/\/107.161.184.3?port=9987","gq_name":"Teamspeak 3","gq_online":true,"gq_port_client":9987,"gq_port_query":10011,"gq_protocol":"teamspeak3","gq_transport":"tcp","gq_type":"teamspeak3","numplayers":166,"players":[{"clid":"2","cid":"1542","client_database_id":"13147","client_nickname":"Dhallia","client_type":"0"},{"clid":"4","cid":"1708","client_database_id":"13989","client_nickname":"Waking Up","client_type":"0"},{"clid":"5","cid":"1542","client_database_id":"11878","client_nickname":"Lydian","client_type":"0"},{"clid":"6","cid":"717","client_database_id":"14528","client_nickname":"Redga","client_type":"0"},{"clid":"7","cid":"1615","client_database_id":"14420","client_nickname":"sik","client_type":"0"},{"clid":"8","cid":"1542","client_database_id":"13949","client_nickname":"Black Dynamite","client_type":"0"},{"clid":"9","cid":"1542","client_database_id":"5235","client_nickname":"Primal Wrath","client_type":"0"},{"clid":"10","cid":"1750","client_database_id":"14230","client_nickname":"Plancton","client_type":"0"},{"clid":"11","cid":"1750","client_database_id":"14538","client_nickname":"Mike","client_type":"0"},{"clid":"12","cid":"1445","client_database_id":"3394","client_nickname":"Dragoncon","client_type":"0"},{"clid":"13","cid":"710","client_database_id":"2135","client_nickname":"Prismaea","client_type":"0"},{"clid":"16","cid":"217","client_database_id":"12306","client_nickname":"DDK","client_type":"0"},{"clid":"19","cid":"217","client_database_id":"14044","client_nickname":"Sylvan","client_type":"0"},{"clid":"20","cid":"25","client_database_id":"5363","client_nickname":"Sir Noarg","client_type":"0"},{"clid":"21","cid":"1704","client_database_id":"2740","client_nickname":"Think Fast","client_type":"0"},{"clid":"22","cid":"1542","client_database_id":"13162","client_nickname":"Grumpy","client_type":"0"},{"clid":"25","cid":"1485","client_database_id":"12618","client_nickname":"Matt","client_type":"0"},{"clid":"27","cid":"1485","client_database_id":"3071","client_nickname":"Eths","client_type":"0"},{"clid":"28","cid":"1542","client_database_id":"14286","client_nickname":"[HoD]Chillyboon","client_type":"0"},{"clid":"30","cid":"710","client_database_id":"12282","client_nickname":"Aislynn","client_type":"0"},{"clid":"31","cid":"55","client_database_id":"13315","client_nickname":"Kakida","client_type":"0"},{"clid":"32","cid":"1542","client_database_id":"13735","client_nickname":"Yeagarr","client_type":"0"},{"clid":"33","cid":"1542","client_database_id":"13914","client_nickname":"Hannover Fist","client_type":"0"},{"clid":"34","cid":"710","client_database_id":"13986","client_nickname":"Kris","client_type":"0"},{"clid":"36","cid":"25","client_database_id":"2528","client_nickname":"Janice Vyrra","client_type":"0"},{"clid":"37","cid":"1467","client_database_id":"14511","client_nickname":"Ray(touretts)","client_type":"0"},{"clid":"39","cid":"25","client_database_id":"10877","client_nickname":"Fern Willow","client_type":"0"},{"clid":"41","cid":"1754","client_database_id":"13044","client_nickname":"HeroPride","client_type":"0"},{"clid":"42","cid":"1724","client_database_id":"13491","client_nickname":"Arkaeous","client_type":"0"},{"clid":"43","cid":"25","client_database_id":"53","client_nickname":"Unknown from 71.199.205.69:56260","client_type":"1"},{"clid":"44","cid":"1542","client_database_id":"14718","client_nickname":"waaah","client_type":"0"},{"clid":"45","cid":"25","client_database_id":"13899","client_nickname":"midgit","client_type":"0"},{"clid":"46","cid":"1542","client_database_id":"14057","client_nickname":"Dark Roll Caskett","client_type":"0"},{"clid":"47","cid":"217","client_database_id":"3901","client_nickname":"Lu'uke Skywalker","client_type":"0"},{"clid":"50","cid":"217","client_database_id":"12578","client_nickname":"Entro","client_type":"0"},{"clid":"52","cid":"217","client_database_id":"9212","client_nickname":"Irrational","client_type":"0"},{"clid":"53","cid":"217","client_database_id":"2366","client_nickname":"Smash","client_type":"0"},{"clid":"55","cid":"217","client_database_id":"11458","client_nickname":"[orr] Ikkoroshi - Ikken","client_type":"0"},{"clid":"56","cid":"1625","client_database_id":"13344","client_nickname":"ToBee","client_type":"0"},{"clid":"59","cid":"61","client_database_id":"14399","client_nickname":"Kinrea","client_type":"0"},{"clid":"61","cid":"1485","client_database_id":"13443","client_nickname":"Zone","client_type":"0"},{"clid":"62","cid":"1015","client_database_id":"7168","client_nickname":"Infamous","client_type":"0"},{"clid":"63","cid":"1015","client_database_id":"12332","client_nickname":"Vhira","client_type":"0"},{"clid":"65","cid":"1750","client_database_id":"13911","client_nickname":"Cazy","client_type":"0"},{"clid":"66","cid":"217","client_database_id":"3975","client_nickname":"seksi","client_type":"0"},{"clid":"67","cid":"1750","client_database_id":"14231","client_nickname":"QCOM","client_type":"0"},{"clid":"75","cid":"1600","client_database_id":"14675","client_nickname":"Darkwinter","client_type":"0"},{"clid":"77","cid":"1485","client_database_id":"13426","client_nickname":"Greg Douger","client_type":"0"},{"clid":"78","cid":"217","client_database_id":"14631","client_nickname":"Insane Killbane","client_type":"0"},{"clid":"79","cid":"1718","client_database_id":"157","client_nickname":"Rollack","client_type":"0"},{"clid":"82","cid":"217","client_database_id":"63","client_nickname":"Edward","client_type":"0"},{"clid":"83","cid":"217","client_database_id":"1918","client_nickname":"Recon (Charred Furr)","client_type":"0"},{"clid":"88","cid":"55","client_database_id":"3121","client_nickname":"Grayghost","client_type":"0"},{"clid":"90","cid":"1615","client_database_id":"13754","client_nickname":"www.twitch.tv\/ca8oose","client_type":"0"},{"clid":"92","cid":"217","client_database_id":"12664","client_nickname":"Vitorian","client_type":"0"},{"clid":"93","cid":"1542","client_database_id":"13311","client_nickname":"Domilese","client_type":"0"},{"clid":"94","cid":"217","client_database_id":"12115","client_nickname":"Ozriel","client_type":"0"},{"clid":"95","cid":"1542","client_database_id":"2705","client_nickname":"Will DeForest","client_type":"0"},{"clid":"98","cid":"145","client_database_id":"13675","client_nickname":"Grayshark","client_type":"0"},{"clid":"99","cid":"1542","client_database_id":"13348","client_nickname":"smoulderling","client_type":"0"},{"clid":"101","cid":"1750","client_database_id":"14210","client_nickname":"Hiro","client_type":"0"},{"clid":"103","cid":"1718","client_database_id":"5166","client_nickname":"Kalek Draaf","client_type":"0"},{"clid":"104","cid":"736","client_database_id":"95","client_nickname":"Sanir Ironguard","client_type":"0"},{"clid":"106","cid":"1724","client_database_id":"14414","client_nickname":"C H E M I C A L","client_type":"0"},{"clid":"107","cid":"710","client_database_id":"12610","client_nickname":"Cerxi","client_type":"0"},{"clid":"111","cid":"1718","client_database_id":"13624","client_nickname":"Maroon Illusionist","client_type":"0"},{"clid":"113","cid":"1542","client_database_id":"9724","client_nickname":"Thundar","client_type":"0"},{"clid":"114","cid":"1718","client_database_id":"13950","client_nickname":"Dendrinian","client_type":"0"},{"clid":"115","cid":"217","client_database_id":"3240","client_nickname":"HamUndBacon","client_type":"0"},{"clid":"116","cid":"1015","client_database_id":"6302","client_nickname":"Gale","client_type":"0"},{"clid":"117","cid":"659","client_database_id":"1084","client_nickname":"[PHZE]Labadingi","client_type":"0"},{"clid":"119","cid":"217","client_database_id":"14662","client_nickname":"Malibu Barbie","client_type":"0"},{"clid":"122","cid":"1542","client_database_id":"14465","client_nickname":"Pop","client_type":"0"},{"clid":"123","cid":"217","client_database_id":"4414","client_nickname":"Aeybon","client_type":"0"},{"clid":"125","cid":"717","client_database_id":"5659","client_nickname":"D Vid","client_type":"0"},{"clid":"127","cid":"1680","client_database_id":"13650","client_nickname":"Nine Fingers","client_type":"0"},{"clid":"130","cid":"1485","client_database_id":"5490","client_nickname":"Odin","client_type":"0"},{"clid":"131","cid":"217","client_database_id":"2014","client_nickname":"Orion","client_type":"0"},{"clid":"132","cid":"217","client_database_id":"12304","client_nickname":"Angel","client_type":"0"},{"clid":"133","cid":"21","client_database_id":"6117","client_nickname":"[VS] Wolfshead","client_type":"0"},{"clid":"134","cid":"1542","client_database_id":"4840","client_nickname":"Zach","client_type":"0"},{"clid":"136","cid":"710","client_database_id":"11221","client_nickname":"Zeth","client_type":"0"},{"clid":"139","cid":"55","client_database_id":"13510","client_nickname":"Kirinkage","client_type":"0"},{"clid":"140","cid":"217","client_database_id":"14617","client_nickname":"Chrono","client_type":"0"},{"clid":"141","cid":"1485","client_database_id":"3977","client_nickname":"afaa","client_type":"0"},{"clid":"142","cid":"55","client_database_id":"12777","client_nickname":"Shelf","client_type":"0"},{"clid":"144","cid":"1718","client_database_id":"6595","client_nickname":"Jyn","client_type":"0"},{"clid":"146","cid":"1542","client_database_id":"5724","client_nickname":"nglass","client_type":"0"},{"clid":"148","cid":"1680","client_database_id":"12504","client_nickname":"Eris","client_type":"0"},{"clid":"152","cid":"1542","client_database_id":"14161","client_nickname":"Mint","client_type":"0"},{"clid":"153","cid":"814","client_database_id":"2491","client_nickname":"Clatter Bang","client_type":"0"},{"clid":"154","cid":"1718","client_database_id":"14174","client_nickname":"Rei","client_type":"0"},{"clid":"155","cid":"710","client_database_id":"10951","client_nickname":"Hnah","client_type":"0"},{"clid":"156","cid":"1467","client_database_id":"14699","client_nickname":"Kaly","client_type":"0"},{"clid":"158","cid":"1750","client_database_id":"11709","client_nickname":"anthofire","client_type":"0"},{"clid":"159","cid":"1750","client_database_id":"12969","client_nickname":"Crazy","client_type":"0"},{"clid":"162","cid":"217","client_database_id":"14523","client_nickname":"Talon","client_type":"0"},{"clid":"168","cid":"1649","client_database_id":"1214","client_nickname":"Dany","client_type":"0"},{"clid":"169","cid":"1542","client_database_id":"12305","client_nickname":"Piroloko","client_type":"0"},{"clid":"170","cid":"1542","client_database_id":"14375","client_nickname":"Argon","client_type":"0"},{"clid":"171","cid":"1649","client_database_id":"13625","client_nickname":"Blargo The Great","client_type":"0"},{"clid":"172","cid":"1680","client_database_id":"4833","client_nickname":"Slick","client_type":"0"},{"clid":"175","cid":"1542","client_database_id":"13910","client_nickname":"Massive Recoil","client_type":"0"},{"clid":"176","cid":"217","client_database_id":"13437","client_nickname":"Orthiana Sustrider","client_type":"0"},{"clid":"177","cid":"736","client_database_id":"9469","client_nickname":"Medev","client_type":"0"},{"clid":"179","cid":"217","client_database_id":"6340","client_nickname":"Ashara","client_type":"0"},{"clid":"181","cid":"814","client_database_id":"2482","client_nickname":"Fumblemuffin","client_type":"0"},{"clid":"182","cid":"1759","client_database_id":"12373","client_nickname":"OPPJimi","client_type":"0"},{"clid":"186","cid":"1615","client_database_id":"10011","client_nickname":"Curtyyy[Alt]","client_type":"0"},{"clid":"187","cid":"217","client_database_id":"11777","client_nickname":"Akral Silvermane","client_type":"0"},{"clid":"191","cid":"217","client_database_id":"10996","client_nickname":"Tedohn","client_type":"0"},{"clid":"194","cid":"1718","client_database_id":"13876","client_nickname":"Lord Savage","client_type":"0"},{"clid":"195","cid":"1680","client_database_id":"12114","client_nickname":"Elvalas","client_type":"0"},{"clid":"197","cid":"1680","client_database_id":"12985","client_nickname":"Myx","client_type":"0"},{"clid":"198","cid":"717","client_database_id":"14198","client_nickname":"Evil Studmuffin","client_type":"0"},{"clid":"201","cid":"659","client_database_id":"12733","client_nickname":"fabbalabba","client_type":"0"},{"clid":"203","cid":"710","client_database_id":"10440","client_nickname":"Spiffers","client_type":"0"},{"clid":"205","cid":"33","client_database_id":"13732","client_nickname":"Ting","client_type":"0"},{"clid":"207","cid":"736","client_database_id":"4489","client_nickname":"Mi N D Y","client_type":"0"},{"clid":"213","cid":"726","client_database_id":"2378","client_nickname":"Tandiin","client_type":"0"},{"clid":"214","cid":"1467","client_database_id":"14427","client_nickname":"Jeff","client_type":"0"},{"clid":"216","cid":"1542","client_database_id":"9570","client_nickname":"~Ja~","client_type":"0"},{"clid":"217","cid":"1542","client_database_id":"12858","client_nickname":"Kins","client_type":"0"},{"clid":"219","cid":"1734","client_database_id":"7","client_nickname":"FrozenHydra","client_type":"0"},{"clid":"220","cid":"1542","client_database_id":"14294","client_nickname":"Loziac","client_type":"0"},{"clid":"221","cid":"1542","client_database_id":"14203","client_nickname":"[HoD] Ciraxis","client_type":"0"},{"clid":"222","cid":"217","client_database_id":"14724","client_nickname":"Crystal Castles","client_type":"0"},{"clid":"224","cid":"1542","client_database_id":"10939","client_nickname":"Lightsoul","client_type":"0"},{"clid":"225","cid":"1625","client_database_id":"13429","client_nickname":"Assembly","client_type":"0"},{"clid":"228","cid":"217","client_database_id":"13129","client_nickname":"Lady (Resplendent)","client_type":"0"},{"clid":"229","cid":"1542","client_database_id":"10115","client_nickname":"Rinsam","client_type":"0"},{"clid":"236","cid":"217","client_database_id":"11650","client_nickname":"qwerty.1230","client_type":"0"},{"clid":"237","cid":"1615","client_database_id":"10336","client_nickname":"Darkside","client_type":"0"},{"clid":"245","cid":"822","client_database_id":"12","client_nickname":"Pentose","client_type":"0"},{"clid":"247","cid":"814","client_database_id":"12288","client_nickname":"Sunny","client_type":"0"},{"clid":"249","cid":"814","client_database_id":"135","client_nickname":"[HC] Separ \/ Roth \/ Montoya","client_type":"0"},{"clid":"250","cid":"1542","client_database_id":"11511","client_nickname":"Vampede","client_type":"0"},{"clid":"252","cid":"726","client_database_id":"3908","client_nickname":"Fishstick","client_type":"0"},{"clid":"255","cid":"814","client_database_id":"14496","client_nickname":"Eidocar","client_type":"0"},{"clid":"256","cid":"1015","client_database_id":"359","client_nickname":"Fisty","client_type":"0"},{"clid":"257","cid":"217","client_database_id":"14725","client_nickname":"[Sol] DivineMaurader","client_type":"0"},{"clid":"259","cid":"217","client_database_id":"1530","client_nickname":"Raegair","client_type":"0"},{"clid":"263","cid":"814","client_database_id":"14264","client_nickname":"GraySea","client_type":"0"},{"clid":"264","cid":"33","client_database_id":"76","client_nickname":"Winkle Tinkle","client_type":"0"},{"clid":"266","cid":"217","client_database_id":"14045","client_nickname":"TheBofelsh","client_type":"0"},{"clid":"267","cid":"1718","client_database_id":"9069","client_nickname":"Who uses bows","client_type":"0"},{"clid":"268","cid":"1542","client_database_id":"11997","client_nickname":"Moody","client_type":"0"},{"clid":"270","cid":"1542","client_database_id":"64","client_nickname":"Tifa Ran","client_type":"0"},{"clid":"274","cid":"1542","client_database_id":"13706","client_nickname":"Dear Bora","client_type":"0"},{"clid":"280","cid":"1542","client_database_id":"12094","client_nickname":"Spikecell","client_type":"0"},{"clid":"282","cid":"1542","client_database_id":"14296","client_nickname":"Xoris\/Lexiea","client_type":"0"},{"clid":"283","cid":"1542","client_database_id":"13671","client_nickname":"Maximus","client_type":"0"},{"clid":"287","cid":"1625","client_database_id":"13409","client_nickname":"lord light","client_type":"0"},{"clid":"294","cid":"217","client_database_id":"13627","client_nickname":"Capt","client_type":"0"},{"clid":"297","cid":"1718","client_database_id":"13511","client_nickname":"Jesse221","client_type":"0"},{"clid":"298","cid":"1542","client_database_id":"9911","client_nickname":"Sarah May","client_type":"0"},{"clid":"304","cid":"1704","client_database_id":"14726","client_nickname":"YourLastSight666","client_type":"0"},{"clid":"306","cid":"1542","client_database_id":"14488","client_nickname":"[HoD] Joao","client_type":"0"},{"clid":"309","cid":"814","client_database_id":"14727","client_nickname":"AIfef","client_type":"0"},{"clid":"311","cid":"1542","client_database_id":"13328","client_nickname":"Voidloss","client_type":"0"},{"clid":"321","cid":"736","client_database_id":"5163","client_nickname":"Cloud","client_type":"0"},{"clid":"322","cid":"217","client_database_id":"12324","client_nickname":"dodo","client_type":"0"},{"clid":"328","cid":"1542","client_database_id":"14512","client_nickname":"Gendry Harlaw","client_type":"0"},{"clid":"332","cid":"1542","client_database_id":"13912","client_nickname":"Prysoner","client_type":"0"},{"clid":"342","cid":"1718","client_database_id":"3308","client_nickname":"Vindictive","client_type":"0"},{"clid":"343","cid":"1542","client_database_id":"150","client_nickname":"Jadis","client_type":"0"}],"teams":[{"cid":"25","pid":"0","channel_order":"0","channel_name":"Main Lobby","channel_topic":"","total_clients":"5","channel_needed_subscribe_power":"0"},{"cid":"33","pid":"0","channel_order":"25","channel_name":"Away From Keyboard","channel_topic":"","total_clients":"2","channel_needed_subscribe_power":"0"},{"cid":"55","pid":"0","channel_order":"33","channel_name":"PvE","channel_topic":"","total_clients":"4","channel_needed_subscribe_power":"0"},{"cid":"1571","pid":"55","channel_order":"0","channel_name":"Community Events","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"225","pid":"55","channel_order":"1571","channel_name":"Server Events","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"659","pid":"225","channel_order":"0","channel_name":"Living Story","channel_topic":"","total_clients":"2","channel_needed_subscribe_power":"0"},{"cid":"660","pid":"225","channel_order":"659","channel_name":"Wurm","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"57","pid":"55","channel_order":"225","channel_name":"Dungeons","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"250","pid":"57","channel_order":"0","channel_name":"Dungeons 2","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"61","pid":"57","channel_order":"250","channel_name":"Dungeons 1","channel_topic":"","total_clients":"1","channel_needed_subscribe_power":"0"},{"cid":"63","pid":"57","channel_order":"61","channel_name":"Dungeons 3","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1741","pid":"55","channel_order":"57","channel_name":"Silverwastes","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"2","pid":"0","channel_order":"55","channel_name":"WvW","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1659","pid":"2","channel_order":"0","channel_name":"Server Meeting","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1446","pid":"2","channel_order":"1659","channel_name":"Float","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"95","pid":"2","channel_order":"1446","channel_name":"Roaming","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"725","pid":"2","channel_order":"95","channel_name":"EOTM","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"15","pid":"2","channel_order":"725","channel_name":"Blue Borderland","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"17","pid":"15","channel_order":"0","channel_name":"Blue Team 1","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"18","pid":"15","channel_order":"17","channel_name":"Blue Team 2","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"20","pid":"2","channel_order":"15","channel_name":"Green Borderland","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"145","pid":"20","channel_order":"0","channel_name":"Green Team 1","channel_topic":"","total_clients":"1","channel_needed_subscribe_power":"0"},{"cid":"252","pid":"20","channel_order":"145","channel_name":"Green Team 2","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"9","pid":"2","channel_order":"20","channel_name":"Red Borderland","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"6","pid":"9","channel_order":"0","channel_name":"Red Team 1","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"274","pid":"9","channel_order":"6","channel_name":"Red Team 2","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"26","pid":"2","channel_order":"9","channel_name":"Eternal Battlegrounds","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"21","pid":"26","channel_order":"0","channel_name":"EB Team 1","channel_topic":"","total_clients":"1","channel_needed_subscribe_power":"0"},{"cid":"1767","pid":"21","channel_order":"0","channel_name":"Sass Mouth","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"28","pid":"26","channel_order":"21","channel_name":"EB Team 2","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1622","pid":"26","channel_order":"28","channel_name":"EB group A","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1623","pid":"26","channel_order":"1622","channel_name":"EB Group B","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1624","pid":"26","channel_order":"1623","channel_name":"EB Group C","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"248","pid":"0","channel_order":"2","channel_name":"WvW Reset Meeting","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"24","pid":"0","channel_order":"248","channel_name":"Guild Channels","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1467","pid":"24","channel_order":"0","channel_name":"Asguardian Legends [AGLS]","channel_topic":"","total_clients":"3","channel_needed_subscribe_power":"0"},{"cid":"1474","pid":"1467","channel_order":"0","channel_name":"Odin's Throne","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1475","pid":"1467","channel_order":"1474","channel_name":"Valhalla (PvP)","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1485","pid":"1467","channel_order":"1475","channel_name":"Ragnarok (WvW)","channel_topic":"","total_clients":"6","channel_needed_subscribe_power":"0"},{"cid":"1476","pid":"1467","channel_order":"1485","channel_name":"Yggdrasil (PvE)","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1498","pid":"1467","channel_order":"1476","channel_name":"Niflheim (Other Games)","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"822","pid":"24","channel_order":"1467","channel_name":"Astalderas Chosen [ASTC]","channel_topic":"","total_clients":"1","channel_needed_subscribe_power":"0"},{"cid":"1360","pid":"822","channel_order":"0","channel_name":"PVP","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1362","pid":"822","channel_order":"1360","channel_name":"Dungeon\/Fractals","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1371","pid":"822","channel_order":"1362","channel_name":"Roaming","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1375","pid":"822","channel_order":"1371","channel_name":"Gala's Bar","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1642","pid":"822","channel_order":"1375","channel_name":"Sahren's Getaway","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1764","pid":"822","channel_order":"1642","channel_name":"STAR","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1765","pid":"822","channel_order":"1764","channel_name":"CITIZEN","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1766","pid":"822","channel_order":"1765","channel_name":"HYPE","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1625","pid":"24","channel_order":"822","channel_name":"Bellicose Banana Club [Bana]","channel_topic":"","total_clients":"3","channel_needed_subscribe_power":"0"},{"cid":"1631","pid":"1625","channel_order":"0","channel_name":"BANA BLACK OPS [ WvW1 ]","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1643","pid":"1625","channel_order":"1631","channel_name":"BANA DELTA team [ WvW2 ]","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1644","pid":"1625","channel_order":"1643","channel_name":"BANA ALPHA team [WvW3]","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1653","pid":"1625","channel_order":"1644","channel_name":"bana guild mission\/meetings [PVE]","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1588","pid":"24","channel_order":"1625","channel_name":"Brethren [PAIN]","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1590","pid":"1588","channel_order":"0","channel_name":"WvW #paintrain >:D","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1680","pid":"1588","channel_order":"1590","channel_name":"Guild Missions","channel_topic":"","total_clients":"5","channel_needed_subscribe_power":"0"},{"cid":"1669","pid":"1588","channel_order":"1680","channel_name":"Music Room: Enjoy the Vibe","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1589","pid":"1588","channel_order":"1669","channel_name":"PVE","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1591","pid":"1589","channel_order":"0","channel_name":"Dungeons","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1684","pid":"1589","channel_order":"1591","channel_name":"Fractals of the Mists","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1689","pid":"1588","channel_order":"1589","channel_name":"Guild Information Board","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1668","pid":"1588","channel_order":"1689","channel_name":"Meeting Room","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1682","pid":"1588","channel_order":"1668","channel_name":"Brethren Council Meeting Room","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1592","pid":"1588","channel_order":"1682","channel_name":"Blightwing's Perch","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"109","pid":"24","channel_order":"1588","channel_name":"Charter Vanguard [CV]","channel_topic":"Courage, Honesty, and Respect","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"114","pid":"109","channel_order":"0","channel_name":"Missions","channel_topic":"Saturday Guild Missions!","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"355","pid":"114","channel_order":"0","channel_name":"Troll Killer Channel","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1488","pid":"114","channel_order":"355","channel_name":"18+","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"115","pid":"109","channel_order":"114","channel_name":"WvW","channel_topic":"For HoD!","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"116","pid":"109","channel_order":"115","channel_name":"PvE","channel_topic":"Dungeons, jump puzzles, hearts and stories","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"576","pid":"109","channel_order":"116","channel_name":"sPVP","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1401","pid":"109","channel_order":"576","channel_name":"Team 1","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1403","pid":"109","channel_order":"1401","channel_name":"Team 2","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1439","pid":"109","channel_order":"1403","channel_name":"Team 3","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"383","pid":"24","channel_order":"109","channel_name":"Contemporary Heroes [CH]","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"814","pid":"383","channel_order":"0","channel_name":"CH Channel 1 (Lobby)","channel_topic":"","total_clients":"7","channel_needed_subscribe_power":"0"},{"cid":"385","pid":"383","channel_order":"814","channel_name":"CH Channel 2","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"386","pid":"383","channel_order":"385","channel_name":"CH Channel 3","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"726","pid":"383","channel_order":"386","channel_name":"CH Channel 4","channel_topic":"","total_clients":"2","channel_needed_subscribe_power":"0"},{"cid":"496","pid":"383","channel_order":"726","channel_name":"[CH]Small Group Channel 1 (Private)","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"384","pid":"383","channel_order":"496","channel_name":"[CH]Small Group Channel 2 (Private)","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1236","pid":"383","channel_order":"384","channel_name":"[CH]Small Group Channel 3 (Private)","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"387","pid":"383","channel_order":"1236","channel_name":"[CH]Small Group Channel 4 (password)","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"715","pid":"383","channel_order":"387","channel_name":"Officer Channel (password)","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1725","pid":"24","channel_order":"383","channel_name":"Daggers and Arrows (DaA)","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1726","pid":"1725","channel_order":"0","channel_name":"WvW","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1727","pid":"1725","channel_order":"1726","channel_name":"PvE","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1728","pid":"1725","channel_order":"1727","channel_name":"PvP","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1729","pid":"1725","channel_order":"1728","channel_name":"AFK","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1737","pid":"1725","channel_order":"1729","channel_name":"Mike's American Home","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1582","pid":"24","channel_order":"1725","channel_name":"Digital Sacrifice [DS]","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1615","pid":"1582","channel_order":"0","channel_name":"Welcome to Prof Kaze's Teaching Room","channel_topic":"","total_clients":"4","channel_needed_subscribe_power":"0"},{"cid":"1750","pid":"1582","channel_order":"1615","channel_name":"Harvey's Squad [SHYT]","channel_topic":"","total_clients":"7","channel_needed_subscribe_power":"0"},{"cid":"1761","pid":"1582","channel_order":"1750","channel_name":"Super Charrio Bros","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"736","pid":"24","channel_order":"1582","channel_name":"Exciting Role Play [ERP]","channel_topic":"","total_clients":"4","channel_needed_subscribe_power":"0"},{"cid":"738","pid":"736","channel_order":"0","channel_name":"WvW","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"741","pid":"736","channel_order":"738","channel_name":"PvE","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1089","pid":"736","channel_order":"741","channel_name":"The Love Room","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1760","pid":"736","channel_order":"1089","channel_name":"Dungeon of Gaming","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1542","pid":"24","channel_order":"736","channel_name":"Hordes of Denravi [HoD]","channel_topic":"","total_clients":"40","channel_needed_subscribe_power":"0"},{"cid":"1543","pid":"1542","channel_order":"0","channel_name":"Roaming","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1704","pid":"1542","channel_order":"1543","channel_name":"The Serious Room","channel_topic":"","total_clients":"2","channel_needed_subscribe_power":"0"},{"cid":"1580","pid":"1542","channel_order":"1704","channel_name":"PVP","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1587","pid":"1542","channel_order":"1580","channel_name":"18+ Channel","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1746","pid":"1542","channel_order":"1587","channel_name":"The Meeting Room","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1768","pid":"1542","channel_order":"1746","channel_name":"Hyperbolic Time Chamber","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1707","pid":"24","channel_order":"1542","channel_name":"Mist Ráiders","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1708","pid":"1707","channel_order":"0","channel_name":"WvW","channel_topic":"","total_clients":"1","channel_needed_subscribe_power":"0"},{"cid":"1711","pid":"1707","channel_order":"1708","channel_name":"GvG","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1712","pid":"1711","channel_order":"0","channel_name":"GvG Kill Group","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1714","pid":"1707","channel_order":"1711","channel_name":"sPvP","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1730","pid":"1707","channel_order":"1714","channel_name":"Meeting - office room","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1710","pid":"1707","channel_order":"1730","channel_name":"PvE","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1715","pid":"1707","channel_order":"1710","channel_name":"AFK","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1584","pid":"24","channel_order":"1707","channel_name":"Nerfed Again [NERF]","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1690","pid":"1584","channel_order":"0","channel_name":"quiet time","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1598","pid":"24","channel_order":"1584","channel_name":"Outlaws,Renegades and Rebels [ORR]","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1600","pid":"1598","channel_order":"0","channel_name":"PVE","channel_topic":"","total_clients":"1","channel_needed_subscribe_power":"0"},{"cid":"1759","pid":"1600","channel_order":"0","channel_name":"Frigid`s ice palace","channel_topic":"","total_clients":"1","channel_needed_subscribe_power":"0"},{"cid":"1602","pid":"1598","channel_order":"1600","channel_name":"WVW","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1612","pid":"1602","channel_order":"0","channel_name":"EBG","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1613","pid":"1612","channel_order":"0","channel_name":"Borderlands","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1749","pid":"1602","channel_order":"1612","channel_name":"Will`s cave","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1603","pid":"1598","channel_order":"1602","channel_name":"sPVP","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1778","pid":"1603","channel_order":"0","channel_name":"Drago`s portal","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1604","pid":"1598","channel_order":"1603","channel_name":"Dungeons","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1605","pid":"1598","channel_order":"1604","channel_name":"Chat","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1414","pid":"24","channel_order":"1598","channel_name":"Partners N Cryme [PIC]","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1429","pid":"1414","channel_order":"0","channel_name":"sPVP","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1430","pid":"1414","channel_order":"1429","channel_name":"WvW","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1597","pid":"1414","channel_order":"1430","channel_name":"Central Anime Temp Channel(GW2 Only)","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1747","pid":"1414","channel_order":"1597","channel_name":"AFK","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"30","pid":"24","channel_order":"1414","channel_name":"Phaze [PHZE]","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"41","pid":"30","channel_order":"0","channel_name":"Dungeon","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"40","pid":"30","channel_order":"41","channel_name":"WvW Main","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"224","pid":"40","channel_order":"0","channel_name":"WvW Squad","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"46","pid":"30","channel_order":"40","channel_name":"PvP","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"108","pid":"30","channel_order":"46","channel_name":"Non Gw2 Stuff","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"179","pid":"30","channel_order":"108","channel_name":"Leaders Channel","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1716","pid":"24","channel_order":"30","channel_name":"Prophecies of Annihilation (POA)","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1718","pid":"1716","channel_order":"0","channel_name":"WvW","channel_topic":"","total_clients":"10","channel_needed_subscribe_power":"0"},{"cid":"1743","pid":"1716","channel_order":"1718","channel_name":"PvP","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1721","pid":"1716","channel_order":"1743","channel_name":"PvE","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1722","pid":"1721","channel_order":"0","channel_name":"Story mode","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1723","pid":"1721","channel_order":"1722","channel_name":"Dungeons","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1720","pid":"1716","channel_order":"1721","channel_name":"Meeting Hall","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1744","pid":"1720","channel_order":"0","channel_name":"Open Meeting Hall","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1745","pid":"1720","channel_order":"1744","channel_name":"Closed Meeting Hall","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1724","pid":"1716","channel_order":"1720","channel_name":"AFK","channel_topic":"","total_clients":"2","channel_needed_subscribe_power":"0"},{"cid":"997","pid":"24","channel_order":"1716","channel_name":"Quaggan Slavers [WHIP]","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1015","pid":"997","channel_order":"0","channel_name":"Choo Choo","channel_topic":"","total_clients":"4","channel_needed_subscribe_power":"0"},{"cid":"1017","pid":"997","channel_order":"1015","channel_name":"Killing Fools","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1075","pid":"997","channel_order":"1017","channel_name":"Ermergerd Dark Solz","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1451","pid":"997","channel_order":"1075","channel_name":"Blast from the Past (GW1)","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1693","pid":"24","channel_order":"997","channel_name":"Rift Legion [Mist]","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1695","pid":"1693","channel_order":"0","channel_name":"Guest Bathroom","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1703","pid":"1693","channel_order":"1695","channel_name":"Charr Party","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1009","pid":"24","channel_order":"1693","channel_name":"Serenity Edge [TRE]","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"217","pid":"24","channel_order":"1009","channel_name":"Sovereign of Lords [Sol]","channel_topic":"","total_clients":"32","channel_needed_subscribe_power":"0"},{"cid":"1445","pid":"217","channel_order":"0","channel_name":"Happy Fun Time","channel_topic":"","total_clients":"1","channel_needed_subscribe_power":"0"},{"cid":"222","pid":"217","channel_order":"1445","channel_name":"sPvP","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"220","pid":"217","channel_order":"222","channel_name":"WvW","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"218","pid":"217","channel_order":"220","channel_name":"PvE","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"219","pid":"218","channel_order":"0","channel_name":"Fractals","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"221","pid":"218","channel_order":"219","channel_name":"Dungeons","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"501","pid":"217","channel_order":"218","channel_name":"The Lords Gathering","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"549","pid":"501","channel_order":"0","channel_name":"Sol's Office","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1347","pid":"217","channel_order":"501","channel_name":"AFK","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"91","pid":"24","channel_order":"217","channel_name":"The Assassin Army [TAA]","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"768","pid":"91","channel_order":"0","channel_name":"Liz's Channel. Poke if needed","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1574","pid":"91","channel_order":"768","channel_name":"Machew's Channel","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1756","pid":"24","channel_order":"91","channel_name":"The Ministry [TM]","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1757","pid":"1756","channel_order":"0","channel_name":"WvW","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1758","pid":"1756","channel_order":"1757","channel_name":"PvE","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1771","pid":"1758","channel_order":"0","channel_name":"Dungeons","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1772","pid":"1758","channel_order":"1771","channel_name":"Fractals","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1774","pid":"1758","channel_order":"1772","channel_name":"Silverwastes","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1775","pid":"1758","channel_order":"1774","channel_name":"Living Story","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1773","pid":"1756","channel_order":"1758","channel_name":"Meeting Room","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1777","pid":"1756","channel_order":"1773","channel_name":"PvP","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1611","pid":"24","channel_order":"1756","channel_name":"The Raging Storm [STRM]","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1754","pid":"1611","channel_order":"0","channel_name":"WvW","channel_topic":"","total_clients":"1","channel_needed_subscribe_power":"0"},{"cid":"1755","pid":"1611","channel_order":"1754","channel_name":"The Bunker","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1617","pid":"1611","channel_order":"1755","channel_name":"AFK","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"710","pid":"24","channel_order":"1611","channel_name":"The Snow Rose Resistance [Snow]","channel_topic":"","total_clients":"7","channel_needed_subscribe_power":"0"},{"cid":"1593","pid":"710","channel_order":"0","channel_name":"Dungeons & Fractals","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1594","pid":"1593","channel_order":"0","channel_name":"Team ZefferEtc","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1595","pid":"1593","channel_order":"1594","channel_name":"Team PrismStormLord","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1165","pid":"710","channel_order":"1593","channel_name":"The Gazebo (Other Games)","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"717","pid":"24","channel_order":"710","channel_name":"The Sons of Tzu [WAR]","channel_topic":"","total_clients":"3","channel_needed_subscribe_power":"0"},{"cid":"719","pid":"717","channel_order":"0","channel_name":"The [WAR] Council Chamber","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"718","pid":"717","channel_order":"719","channel_name":"WvW","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"720","pid":"717","channel_order":"718","channel_name":"PvE","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"958","pid":"717","channel_order":"720","channel_name":"PvP Arena","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"959","pid":"958","channel_order":"0","channel_name":"Red Team","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"960","pid":"958","channel_order":"959","channel_name":"Blue Team","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1091","pid":"717","channel_order":"958","channel_name":"The AFK Lounge","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1166","pid":"1091","channel_order":"0","channel_name":"Hellbound's Smokehut","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1619","pid":"717","channel_order":"1091","channel_name":"Ed and Barbie's Tea Room","channel_topic":"","total_clients":"-1","channel_needed_subscribe_power":"60"},{"cid":"1632","pid":"24","channel_order":"717","channel_name":"The Third Eclipse [Howl]","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1636","pid":"1632","channel_order":"0","channel_name":"Hunting Grounds","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1641","pid":"1632","channel_order":"1636","channel_name":"The Den","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1649","pid":"1641","channel_order":"0","channel_name":"Kitten's Play Pen","channel_topic":"","total_clients":"2","channel_needed_subscribe_power":"0"},{"cid":"1583","pid":"24","channel_order":"1632","channel_name":"Wankers and Nerdy Gamers [WANG]","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1731","pid":"24","channel_order":"1583","channel_name":"Valkyria Immortalis","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1734","pid":"1731","channel_order":"0","channel_name":"Charrbucks","channel_topic":"","total_clients":"1","channel_needed_subscribe_power":"0"},{"cid":"1739","pid":"1731","channel_order":"1734","channel_name":"Ed's Patio","channel_topic":"","total_clients":"-1","channel_needed_subscribe_power":"60"},{"cid":"56","pid":"0","channel_order":"24","channel_name":"SPvP","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"71","pid":"56","channel_order":"0","channel_name":"Group 1","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"72","pid":"56","channel_order":"71","channel_name":"Group 2","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1325","pid":"56","channel_order":"72","channel_name":"Group 3","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1326","pid":"56","channel_order":"1325","channel_name":"Group 4","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"}],"virtualserver_antiflood_points_needed_command_block":"150","virtualserver_antiflood_points_needed_ip_block":"250","virtualserver_antiflood_points_tick_reduce":"5","virtualserver_ask_for_privilegekey":"0","virtualserver_autostart":"1","virtualserver_channel_temp_delete_delay_default":"0","virtualserver_channelsonline":"214","virtualserver_client_connections":"15752","virtualserver_clientsonline":"167","virtualserver_codec_encryption_mode":"0","virtualserver_complain_autoban_count":"5","virtualserver_complain_autoban_time":"1200","virtualserver_complain_remove_time":"3600","virtualserver_created":"0","virtualserver_default_channel_admin_group":"5","virtualserver_default_channel_group":"7","virtualserver_default_server_group":"7","virtualserver_download_quota":"18446744073709551615","virtualserver_filebase":"files\/virtualserver_1","virtualserver_flag_password":"1","virtualserver_hostbanner_gfx_interval":"0","virtualserver_hostbanner_gfx_url":"","virtualserver_hostbanner_mode":"0","virtualserver_hostbanner_url":"http:\/\/www.hengeofdenravi.com","virtualserver_hostbutton_gfx_url":"","virtualserver_hostbutton_tooltip":"","virtualserver_hostbutton_url":"","virtualserver_hostmessage":"Final day! http:\/\/www.hengeofdenravi.com\/index.php\/topic,2023.0.html","virtualserver_hostmessage_mode":"0","virtualserver_icon_id":"0","virtualserver_id":"1","virtualserver_ip":"","virtualserver_log_channel":"1","virtualserver_log_client":"1","virtualserver_log_filetransfer":"1","virtualserver_log_permissions":"1","virtualserver_log_query":"1","virtualserver_log_server":"1","virtualserver_machine_id":"","virtualserver_max_download_total_bandwidth":"18446744073709551615","virtualserver_max_upload_total_bandwidth":"18446744073709551615","virtualserver_maxclients":"350","virtualserver_min_client_version":"1373587200","virtualserver_min_clients_in_channel_before_forced_silence":"500","virtualserver_month_bytes_downloaded":"4452574","virtualserver_month_bytes_uploaded":"745830","virtualserver_name":"www.hengeofdenravi.com","virtualserver_name_phonetic":"","virtualserver_needed_identity_security_level":"8","virtualserver_password":"SRJRjkPqAnT6BXvIkwIumDWMxRE=","virtualserver_platform":"Linux","virtualserver_port":"9987","virtualserver_priority_speaker_dimm_modificator":"-18.0000","virtualserver_query_client_connections":"59579","virtualserver_queryclientsonline":"1","virtualserver_reserved_slots":"0","virtualserver_status":"online","virtualserver_total_bytes_downloaded":"5022685219","virtualserver_total_bytes_uploaded":"176541033","virtualserver_total_packetloss_control":"0.0032","virtualserver_total_packetloss_keepalive":"0.0027","virtualserver_total_packetloss_speech":"0.0018","virtualserver_total_packetloss_total":"0.0025","virtualserver_total_ping":"101.7697","virtualserver_unique_identifier":"CpZsRk9cvQrobpgjwhTtO+gJJVU=","virtualserver_upload_quota":"18446744073709551615","virtualserver_uptime":"2238262","virtualserver_version":"3.0.11.2 [Build: 1418654632]","virtualserver_weblist_enabled":"0","virtualserver_welcomemessage":"Welcome to the HengeofDenravi.com Community VOIP server."}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Teamspeak3/2_response.txt b/gameq/tests/Protocols/Providers/Teamspeak3/2_response.txt new file mode 100644 index 0000000..fb754d1 --- /dev/null +++ b/gameq/tests/Protocols/Providers/Teamspeak3/2_response.txt @@ -0,0 +1,48 @@ +TS3 + +|| +Welcome to the TeamSpeak 3 ServerQuery interface, type "help" for a list of commands and "help " for information on a specific command. + error id=0 msg=ok + virtualserver_unique_identifier=fFu6LM7r7NKPJlFheQxo6rSweP4= virtualserver_name=DWM\sGaming virtualserver_welcomemessage=Welcome\sto\sDWM\sGaming,\svisit\sour\ssite\sat\s\s[URL]www.DWMGaming.com[\/URL]. virtualserver_platform=Linux virtualserver_version=3.0.11.2\s[Build:\s1418654632] virtualserver_maxclients=500 virtualserver_password virtualserver_clientsonline=107 virtualserver_channelsonline=231 virtualserver_created=1358228062 virtualserver_uptime=81901 virtualserver_codec_encryption_mode=0 virtualserver_hostmessage=Daylight\sSaving\sTime\sbegins\son\sMarch\s8th\s2015\sat\s2AM.\sThe\sclock\sis\sset\sto\sgo\sforward\s1\shour\sat\sthis\stime. virtualserver_hostmessage_mode=2 virtualserver_filebase=files\/virtualserver_1 virtualserver_default_server_group=8 virtualserver_default_channel_group=8 virtualserver_flag_password=0 virtualserver_default_channel_admin_group=5 virtualserver_max_download_total_bandwidth=18446744073709551615 virtualserver_max_upload_total_bandwidth=18446744073709551615 virtualserver_hostbanner_url=https:\/\/docs.google.com\/forms\/d\/11gB6-VhhQevWJb-LyGfU4AtCNGRFBrdkttOjfsP3fQA\/viewform?usp=send_form virtualserver_hostbanner_gfx_url virtualserver_hostbanner_gfx_interval=0 virtualserver_complain_autoban_count=5 virtualserver_complain_autoban_time=1200 +|| +virtualserver_complain_remove_time=3600 virtualserver_min_clients_in_channel_before_forced_silence=250 virtualserver_priority_speaker_dimm_modificator=-18.0000 virtualserver_id=1 virtualserver_antiflood_points_tick_reduce=15 virtualserver_antiflood_points_needed_command_block=150 virtualserver_antiflood_points_needed_ip_block=250 virtualserver_client_connections=797 virtualserver_query_client_connections=1946 virtualserver_hostbutton_tooltip=DWM\sGaming virtualserver_hostbutton_url virtualserver_hostbutton_gfx_url virtualserver_queryclientsonline=1 virtualserver_download_quota=18446744073709551615 virtualserver_upload_quota=18446744073709551615 virtualserver_month_bytes_downloaded=748237337 virtualserver_month_bytes_uploaded=58748505 virtualserver_total_bytes_downloaded=124757274671 virtualserver_total_bytes_uploaded=19436742837 virtualserver_port=9987 virtualserver_autostart=1 virtualserver_machine_id virtualserver_needed_identity_security_level=8 virtualserver_log_client=1 virtualserver_log_query=1 virtualserver_log_channel=1 virtualserver_log_permissions=1 virtualserver_log_server=1 virtualserver_log_filetransfer=1 virtualserver_min_client_version=1373587200 virtualserver_name_phonetic virtualserver_icon_id=0 virtualserver_reserved_slots=0 virtualserver_total_packetloss_speech=0.0037 virtualserver_total_packetloss_keepalive=0.0045 virtualserver_total_packetloss_control=0.0050 virtualserver_total_packetloss_total=0.0050 virtualserver_ +|| +total_ping=114.1226 virtualserver_ip=67.43.5.200 virtualserver_weblist_enabled=1 virtualserver_ask_for_privilegekey=0 virtualserver_hostbanner_mode=2 virtualserver_channel_temp_delete_delay_default=0 virtualserver_status=online connection_filetransfer_bandwidth_sent=0 connection_filetransfer_bandwidth_received=0 connection_filetransfer_bytes_sent_total=627470236 connection_filetransfer_bytes_received_total=13800215 connection_packets_sent_speech=101299587 connection_bytes_sent_speech=11344589012 connection_packets_received_speech=23764523 connection_bytes_received_speech=2691927682 connection_packets_sent_keepalive=13215158 connection_bytes_sent_keepalive=541821478 connection_packets_received_keepalive=13200222 connection_bytes_received_keepalive=554106917 connection_packets_sent_control=1563103 connection_bytes_sent_control=291637874 connection_packets_received_control=1544876 connection_bytes_received_control=94098377 connection_packets_sent_total=116077848 connection_bytes_sent_total=12178048364 connection_packets_received_total=38509621 connection_bytes_received_total=3340132976 connection_bandwidth_sent_last_second_total=95669 connection_bandwidth_sent_last_minute_total=96860 connection_bandwidth_received_last_second_total=49675 connection_bandwidth_received_last_minute_total=47068 + error id=0 msg=ok + error id=0 msg=ok + clid=4 cid=309 client_database_id=38 client_nickname=Viper client_type=0|clid=6 cid=1098 client_database_id=5546 client_nickname=barrysauce client_type=0|clid=7 cid=4283 client_database_id=7739 client_nickname=Naked\sSnake client_type=0|clid=8 cid=872 client_database_id=4816 client_nickname=KillerP_ssy\s[18,2] client_type=0|clid=10 cid=495 client_database_id=2646 client_nickname=b1ue client_type=0|clid=12 cid=1 client_database_id=4968 client_nickname=Unknown\sfrom\s71.199.205.69:44975 client_type=1|clid=13 cid=705 client_database_id=6818 client_nickname=Pantykill client_type=0|clid=14 cid=705 client_database_id=63 client_nickname=Whitehawk client_type=0|clid=16 cid=1068 client_database_id=2773 client_nickname=Noob.Saibot\s(18)\sGeneral client_type=0|clid=24 cid=716 client_database_id=6653 client_nickname=Maes.Sunsanxian\s[7]11 client_type=0|clid=26 cid=321 client_database_id=2710 client_nickname=Undisonus client_type=0|clid=28 cid=1380 client_database_id=7827 client_nickname=Avantarion client_type=0|clid=31 cid=4738 client_database_id=1772 client_nickname=Pzykotik\s[13] client_type=0|clid=34 cid=4485 client_database_id=7786 client_nickname==242=\sCPT.\sHelios11 client_type=0|clid=35 cid=4789 client_database_id=7152 client_nickname=glacepk\s-\sFrank\s[7] client_type=0|clid=36 cid=581 client_database_id=7338 client_nickname=Tolu2weenies(10) client_type=0|clid=42 cid=1247 client_database_id=7708 client_nickname=RainbowBrite[18] client_type=0|clid=45 cid=4789 client_database_id=6984 client_nickname=Akmon[10] client_type=0|clid=48 cid=707 client_database_id=4505 client_nickname=Elaeus\s[17,85] client_type=0|clid=49 cid=872 client_database_id=7646 client_nickname=TripleRocket\s[4] client_type=0|clid=50 cid=4789 client_database_id=7020 client_nickname=Mashala[12] client_type=0|clid=53 cid=2115 client_database_id=6649 client_nickname=Piokil[9] client_type=0|clid=57 cid=1578 client_database_id=6489 client_nickname=mWik[18]^^[4] client_type=0|clid=60 cid=581 client_database_id=5144 client_nickname=BirdofSong[16][5] client_type=0|clid=63 cid=38 client_database_id=7819 client_nickname=Buder client_type=0|clid=65 cid=2083 client_database_id=7057 client_nickname=Narcotx client_type=0|clid=66 cid=4283 client_database_id=5254 client_nickname=Soarden\s[16]\s[6] client_type=0|clid=67 cid=581 client_database_id=3205 client_nickname=-ExT-Fraank(19) client_type=0|clid=68 cid=3373 client_database_id=7791 client_nickname=Ohai\sIm\sAlex client_type=0|clid=69 cid=4632 client_database_id=7746 client_nickname=xwalle\s(5) client_type=0|clid=70 cid=321 client_database_id=6618 client_nickname=Cutie client_type=0|clid=72 cid=4789 client_database_id=4817 client_nickname=MeiAnne\s[15] client_type=0|clid=73 cid=581 client_database_id=7544 client_nickname=Keikat[9] client_type=0|clid=77 cid=321 client_database_id=6820 client_nickname=Jediyodaone client_type=0|clid=82 cid=716 client_database_id=7380 client_nickname=Burnt[8] client_type=0|clid=83 cid=3373 client_database_id=6480 client_nickname=Savannah client_type=0|clid=84 cid=1956 client_database_id=5460 client_nickname=hellscythe[6] client_type=0|clid=87 cid=4738 client_database_id=2815 client_nickname=Road client_type=0|clid=95 cid=1068 client_database_id=7682 client_nickname=ST4RF0X\s11 client_type=0|clid=100 cid=581 client_database_id=3479 client_nickname=angelfish999999999(13)1111 client_type=0|clid=101 cid=309 client_database_id=6746 client_nickname=brandonlopezypr client_type=0|clid=102 cid=1276 client_database_id=7799 client_nickname=MrRiddlez client_type=0|clid=107 cid=309 client_database_id=2 client_nickname=Tide client_type=0|clid=110 cid=1401 client_database_id=5132 client_nickname=jacketstud\s[9] client_type=0|clid=117 cid=1956 client_database_id=3617 client_nickname=fadedshadows1(10) client_type=0|clid=118 cid=480 client_database_id=7044 client_nickname=XalvioN\s[17] client_type=0|clid=119 cid=1956 client_database_id=3101 client_nickname=Themius(15)\sNukeDynasty(5) client_type=0|clid=123 cid=309 client_database_id=33 client_nickname=HomeStyle\sChillin client_type=0|clid=124 cid=1956 client_database_id=4778 client_nickname=CoronApMor[8] client_type=0|clid=126 cid=309 client_database_id=1534 client_nickname=[PNDA]KillerElite client_type=0|clid=127 cid=1116 client_database_id=4643 client_nickname=The\sGhiest[18] client_type=0|clid=130 cid=581 client_database_id=7713 client_nickname=TimesEdge client_type=0|clid=134 cid=1 client_database_id=4656 client_nickname=MagnusEffect\s(15) clie +|| +nt_type=0|clid=135 cid=716 client_database_id=6583 client_nickname=Maxed_Pain[7] client_type=0|clid=137 cid=1098 client_database_id=3094 client_nickname=HurpMcDurp client_type=0|clid=138 cid=321 client_database_id=7758 client_nickname=xStyk client_type=0|clid=139 cid=416 client_database_id=1519 client_nickname=Epic\sWinning client_type=0|clid=140 cid=1401 client_database_id=6306 client_nickname=Zerginater\p5\p client_type=0|clid=142 cid=16 client_database_id=6710 client_nickname=samou\s[5]11 client_type=0|clid=144 cid=1098 client_database_id=1430 client_nickname=-Q- client_type=0|clid=145 cid=3373 client_database_id=1757 client_nickname=dark-gaunt client_type=0|clid=153 cid=480 client_database_id=7367 client_nickname=MazeElwin\s[̯̪̣̣̝͖̯12]̿͌͒͐͛́ client_type=0|clid=156 cid=16 client_database_id=35 client_nickname=wambatx client_type=0|clid=157 cid=581 client_database_id=4810 client_nickname=Kleboldx1-Prime\s(18)(14)(1) client_type=0|clid=158 cid=4738 client_database_id=7800 client_nickname=Xpl0jd client_type=0|clid=159 cid=309 client_database_id=4887 client_nickname=dap client_type=0|clid=160 cid=707 client_database_id=4841 client_nickname=Snixy\s[18,15] client_type=0|clid=163 cid=716 client_database_id=4443 client_nickname=-Apolo\s[13] client_type=0|clid=165 cid=587 client_database_id=5281 client_nickname=Ret\s[Regular\sType\sDude] client_type=0|clid=166 cid=1956 client_database_id=3964 client_nickname=Caliburated(18) clien +|| +t_type=0|clid=167 cid=38 client_database_id=7818 client_nickname=Kyahco client_type=0|clid=168 cid=587 client_database_id=2033 client_nickname=Destroierrr9[18] client_type=0|clid=171 cid=1956 client_database_id=2776 client_nickname=Otaku1988(14) client_type=0|clid=178 cid=495 client_database_id=4175 client_nickname=Snowman client_type=0|clid=180 cid=38 client_database_id=7820 client_nickname=TomTomWhon client_type=0|clid=181 cid=4796 client_database_id=4474 client_nickname=buckw\s(18)► client_type=0|clid=184 cid=4789 client_database_id=5463 client_nickname=Hitoriac\s[16]\s<--\sLucky\sWabbit client_type=0|clid=185 cid=707 client_database_id=4898 client_nickname=Zienox[12] client_type=0|clid=189 cid=1116 client_database_id=4664 client_nickname=Laucivol\s[18] client_type=0|clid=190 cid=3373 client_database_id=4885 client_nickname=SomeDiabeticKid client_type=0|clid=191 cid=1116 client_database_id=4724 client_nickname=AlphaOC\s[18] client_type=0|clid=192 cid=3373 client_database_id=3536 client_nickname=The\sHazzard client_type=0|clid=194 cid=309 client_database_id=5367 client_nickname=Philifly client_type=0|clid=197 cid=716 client_database_id=7447 client_nickname=_Shinobu_Oshino_\s[8] client_type=0|clid=201 cid=480 client_database_id=7448 client_nickname=casey0827 client_type=0|clid=202 cid=716 client_database_id=3711 client_nickname=Tı̸̸̸̸̸̸̸̸̸̸̸̸̸̸̸̸̨ailsx{16} client_type=0|clid=203 cid=587 client_database_id=3215 clien +|| +t_nickname=SapphireSirenz[17] client_type=0|clid=205 cid=2083 client_database_id=7350 client_nickname=Shizzio[6] client_type=0|clid=207 cid=309 client_database_id=6409 client_nickname=Kanaka client_type=0|clid=209 cid=480 client_database_id=4603 client_nickname=CocxyMcChunk\s[9] client_type=0|clid=219 cid=480 client_database_id=6754 client_nickname=DruCova\s[8] client_type=0|clid=225 cid=1276 client_database_id=7247 client_nickname=Mr\sKazz client_type=0|clid=227 cid=581 client_database_id=7710 client_nickname=Uhhninjeesword(10) client_type=0|clid=229 cid=4283 client_database_id=7132 client_nickname=doritofish[16] client_type=0|clid=235 cid=716 client_database_id=3938 client_nickname=Botax\s11 client_type=0|clid=236 cid=38 client_database_id=7817 client_nickname=Aziboo-music client_type=0|clid=241 cid=480 client_database_id=4617 client_nickname=Druul client_type=0|clid=258 cid=480 client_database_id=2765 client_nickname=Junki559[17] client_type=0 + +|| +error id=0 msg=ok + error id=0 msg=ok + cid=1 pid=0 channel_order=0 channel_name=Lobby\s-\sAsk\sto\sbe\spulled\sdown channel_topic=Welcome\sto\sDWM\sGaming total_clients=2 channel_needed_subscribe_power=0|cid=3622 pid=1 channel_order=0 channel_name=Lost?\sJoin\sthis\schannel,\swe'll\shelp\syou. channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=3476 pid=0 channel_order=1 channel_name=[*cspacer\s0]༖ channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=3483 pid=0 channel_order=3476 channel_name=[cspacer]Community\sAdministration channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=2 pid=3483 channel_order=0 channel_name=Admin\sRoom channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=705 pid=3483 channel_order=2 channel_name=Help\sRoom channel_topic total_clients=2 channel_needed_subscribe_power=0|cid=2526 pid=3483 channel_order=705 channel_name=Website\sdevelopment channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=4311 pid=3483 channel_order=2526 channel_name=Promotions\/Ads\/Photoshop channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=4009 pid=3483 channel_order=4311 channel_name=Conference\sRoom channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=4485 pid=3483 channel_order=4009 channel_name=Convergence\sMeeting\sNotes channel_topic total_clients=1 channel_needed_subscribe_power=0|cid=4795 pid=3483 channel_order=4485 channel_name=w +|| +ww.twitch.tv\/convergencegames\/ channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=3455 pid=0 channel_order=3483 channel_name=[*cspacer\s9]༖ channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=16 pid=0 channel_order=3455 channel_name=[cspacer]AFK channel_topic total_clients=2 channel_needed_subscribe_power=0|cid=3450 pid=0 channel_order=16 channel_name=[*cspacer\s7]༖ channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=124 pid=0 channel_order=3450 channel_name=[cspacer]ARMA\sSeries channel_topic=ARMA\sSeries\sGame\sChat\sand\sDiscussion total_clients=0 channel_needed_subscribe_power=0|cid=347 pid=124 channel_order=0 channel_name=Arma3\sWasteland channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=315 pid=124 channel_order=347 channel_name=DayZ\sStandalone channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=402 pid=124 channel_order=315 channel_name=Breaking\sPoint channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=579 pid=0 channel_order=124 channel_name=[*cspacer\s4]༖ channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=303 pid=0 channel_order=579 channel_name=[cspacer]Battlefield\sSeries channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=3 pid=303 channel_order=0 channel_name=Battlefield\s3 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=300 pid=303 channel_order=3 channel_name=Battlefield\ +|| +s4 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=3481 pid=0 channel_order=303 channel_name=[*cspacer01]༖ channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=5 pid=0 channel_order=3481 channel_name=[cspacer]Call\sof\sDuty\sSeries channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=309 pid=5 channel_order=0 channel_name=Advanced\sWarfare channel_topic total_clients=8 channel_needed_subscribe_power=0|cid=1098 pid=5 channel_order=309 channel_name=Advanced\sWarfare\sRoom\s2 channel_topic total_clients=3 channel_needed_subscribe_power=0|cid=2015 pid=5 channel_order=1098 channel_name=Advanced\sWarfare\sAFK channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=6 pid=5 channel_order=2015 channel_name=Black\sOps\sII channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=9 pid=5 channel_order=6 channel_name=COD\s4 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=3516 pid=0 channel_order=5 channel_name=[*cspacer\s81]༖ channel_topic total_clients=-1 channel_needed_subscribe_power=99|cid=522 pid=0 channel_order=3516 channel_name=[cspacer]League\sof\sLegends channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=12 pid=522 channel_order=0 channel_name=League\sof\sLegends\s-\sLobby channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=495 pid=12 channel_order=0 channel_name=Normals channel_topic total_clients=2 channel_needed_subscribe_power=0|cid=503 pid=12 channel_order=495 channel_name=Normal\s2 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1276 pid=12 channel_order=503 channel_name=Normal\s3 channel_topic total_clients=2 channel_needed_subscribe_power=0|cid=2489 pid=12 channel_order=1276 channel_name=Low\sLevels channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1796 pid=12 channel_order=2489 channel_name=Ranked\s5's\s-\sDon't\sdisturb\sduring\sprac. channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=416 pid=12 channel_order=1796 channel_name=Jared's\sChannel channel_topic total_clients=1 channel_needed_subscribe_power=0|cid=1250 pid=522 channel_order=12 channel_name=Tournament\splanning channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1252 pid=522 channel_order=1250 channel_name=Admin\son\sstandby channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1251 pid=1252 channel_order=0 channel_name=Tournament\sLobby channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=571 pid=0 channel_order=522 channel_name=[*cspacer\s1]༖ channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=2645 pid=0 channel_order=571 channel_name=[cspacer]Misc.\sGames channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=3676 pid=2645 channel_order=0 channel_name=Elder\sScrolls\s-\sElder\sScrolls\sOnline channel_topic total_clients=0 channel_needed_subscribe_power=0|cid +|| +=3691 pid=3676 channel_order=0 channel_name=Lobby channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=3680 pid=3676 channel_order=3691 channel_name=Aldmeri\sDominion\sZones channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=3681 pid=3676 channel_order=3680 channel_name=Ebonhart\sPact\sZones channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=3682 pid=3676 channel_order=3681 channel_name=Daggerfall\sZones channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=3683 pid=3676 channel_order=3682 channel_name=Craglorn channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=3684 pid=3676 channel_order=3683 channel_name=Dungeon\s1 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=3685 pid=3676 channel_order=3684 channel_name=Dungeon\s2 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=3686 pid=3676 channel_order=3685 channel_name=Dungeon\s3 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=3687 pid=3676 channel_order=3686 channel_name=Cyrodiil channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=3688 pid=3676 channel_order=3687 channel_name=The\sTraders\/Crafter\sLounge channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=3689 pid=3676 channel_order=3688 channel_name=>\s\s\s\s\s\s\s\s\s\s\s\s-=Guilds=- channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=3690 pid=3689 channel_order=0 channel_name=The\sVoice\sof\sSithis channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1079 pid=2645 channel_order=3676 channel_name=Evolve channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1080 pid=1079 channel_order=0 channel_name=Hunter\sGroup\s1 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1081 pid=1079 channel_order=1080 channel_name=Hunter\sGroup\s2 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=13 pid=2645 channel_order=1079 channel_name=The\sGaming\sPub channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=662 pid=2645 channel_order=13 channel_name=Counter\sStrike channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=29 pid=2645 channel_order=662 channel_name=Diablo\s3 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=4283 pid=29 channel_order=0 channel_name=Harcore channel_topic total_clients=3 channel_needed_subscribe_power=0|cid=4284 pid=29 channel_order=4283 channel_name=Seasonal channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=682 pid=2645 channel_order=29 channel_name=Dofus channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=3557 pid=2645 channel_order=682 channel_name=DOTA\s2 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1401 pid=2645 channel_order=3557 channel_name=Heroes\sof\sthe\sStorm channel_topic total_clients=2 channel_needed_subscribe_power=0|cid=38 pid=2645 channel_order=1401 channel_name=Minecraft channel_topic=Builf\syour\sdream\shome total_clients=4 channel_needed_subscribe_power=0|cid=3175 pid=2645 channel_order=38 channel_name=RUST channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=2873 pid=2645 channel_order=3175 channel_name=Space\sEngineers channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=4697 pid=2645 channel_order=2873 channel_name=Starbound channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=4062 pid=2645 channel_order=4697 channel_name=Stronghold\sKingdoms channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=355 pid=2645 channel_order=4062 channel_name=Titanfall channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=3058 pid=2645 channel_order=355 channel_name=War\sThunder channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=3533 pid=2645 channel_order=3058 channel_name=World\sof\sTanks channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=4790 pid=3533 channel_order=0 channel_name=Squad\s1 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=4791 pid=3533 channel_order=4790 channel_name=Squad\s2 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=3989 pid=2645 channel_order=3533 channel_name=Monster\sHunter\s4\s\sUltimate\s-\sDS channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=4398 pid=2645 channel_order=3989 channel_ +|| +name=Path\sof\sExile channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=4607 pid=2645 channel_order=4398 channel_name=Yet\sAnother\sZombie\sDefense channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=4690 pid=2645 channel_order=4607 channel_name=Starcraft channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=4691 pid=2645 channel_order=4690 channel_name=Guild\sWars\s2 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=4692 pid=2645 channel_order=4691 channel_name=Borderlands\s2 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=4738 pid=2645 channel_order=4692 channel_name=APB:Reloaded channel_topic total_clients=3 channel_needed_subscribe_power=0|cid=4792 pid=2645 channel_order=4738 channel_name=Archeage channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=4796 pid=2645 channel_order=4792 channel_name=Smite channel_topic total_clients=1 channel_needed_subscribe_power=0|cid=3472 pid=0 channel_order=2645 channel_name=[*cspacer]༖ channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1248 pid=0 channel_order=3472 channel_name=[cspacer]Runescape channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1249 pid=1248 channel_order=0 channel_name=XP\sLegacy channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=3373 pid=1249 channel_order=0 channel_name=General\sPlayers channel_topic total_clients=5 channel_needed_subs +|| +cribe_power=0|cid=1272 pid=1249 channel_order=3373 channel_name=Pauls\sRoom channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1273 pid=1249 channel_order=1272 channel_name=Clan\sCitadel channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1264 pid=1249 channel_order=1273 channel_name=Dung\sRoom\s1 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1269 pid=1249 channel_order=1264 channel_name=Bossing\sRoom channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=3464 pid=0 channel_order=1248 channel_name=[*cspacer\s12]༖ channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=311 pid=0 channel_order=3464 channel_name=[cspacer]Warcraft\s-\sWorld\sof\sWarcraft channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=687 pid=311 channel_order=0 channel_name=--Horde--\sWorld\sof\sWarcraft\s--Horde-- channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=652 pid=687 channel_order=0 channel_name=DWM\sOfficer\sChat channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=326 pid=687 channel_order=652 channel_name=Group1 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=327 pid=687 channel_order=326 channel_name=Group2 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=321 pid=687 channel_order=327 channel_name=Raiding channel_topic total_clients=4 channel_needed_subscribe_power=0|cid=2914 pid=687 channel_order=321 channel_name=Mythic\sRaid channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=562 pid=687 channel_order=2914 channel_name=PvP\sArena channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=575 pid=687 channel_order=562 channel_name=PVP\sArena\s2 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=561 pid=687 channel_order=575 channel_name=PvP\sBGs channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=563 pid=687 channel_order=561 channel_name=PvP\sRBGs channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=570 pid=0 channel_order=311 channel_name=[*cspacer\s3]༖ channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=3473 pid=0 channel_order=570 channel_name=[cspacer]Warframe channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=58 pid=3473 channel_order=0 channel_name=>\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s-=Administrative=- channel_topic=Get\ssome!\sBadass\sfree\sgame. total_clients=0 channel_needed_subscribe_power=0|cid=847 pid=58 channel_order=0 channel_name=Warframe\sRecruiting\sOffice channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=2866 pid=58 channel_order=847 channel_name=Warframe\sAdministrative\sOffice channel_topic total_clients=-1 channel_needed_subscribe_power=75|cid=754 pid=2866 channel_order=0 channel_name=攻\s殻\s機\s動\s隊\sGhost\sin\sthe\sShell channel_topic total_clients=-1 channel_needed_subscribe_p +|| +ower=65|cid=569 pid=58 channel_order=2866 channel_name=Network\sAlliance\smeeting\sroom channel_topic total_clients=-1 channel_needed_subscribe_power=60|cid=532 pid=58 channel_order=569 channel_name=Warlord\smeeting\sroom channel_topic total_clients=-1 channel_needed_subscribe_power=60|cid=796 pid=532 channel_order=0 channel_name=Warlord\shideout channel_topic total_clients=-1 channel_needed_subscribe_power=75|cid=841 pid=3473 channel_order=58 channel_name=>\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s-=Clan\smeetings=- channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=3463 pid=841 channel_order=0 channel_name=Meeting\sroom\s1 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=3495 pid=841 channel_order=3463 channel_name=Meeting\sroom\s2 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=3496 pid=841 channel_order=3495 channel_name=Meeting\sroom\s3 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=3497 pid=841 channel_order=3496 channel_name=Meeting\sroom\s4 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=3498 pid=841 channel_order=3497 channel_name=Meeting\sroom\s5 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=479 pid=3473 channel_order=841 channel_name=>\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s-=Music=- channel_topic=\p̲̅̅●̲̅̅\p̲̅̅=̲̅̅\p̲̅̅●̲̅̅\p\p̲̅̅●̲̅̅\p̲̅̅=̲̅̅\p̲̅̅●̲̅̅\p total_clients=0 channel_needed_subscribe_power=0|cid=3466 pid=479 channel_order=0 channel_name=Music\sselection\s1 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=3467 pid=479 channel_order=3466 channel_name=Music\sselection\s2 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=3549 pid=479 channel_order=3467 channel_name=Music\sselection\s3 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=577 pid=3473 channel_order=479 channel_name=>\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s-=PVP=- channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1226 pid=577 channel_order=0 channel_name=PVP\sEvent channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=581 pid=577 channel_order=1226 channel_name=Lobby\s-\sDefend\srail\sfor\sOrion\sCholistan channel_topic total_clients=8 channel_needed_subscribe_power=0|cid=3501 pid=577 channel_order=581 channel_name=Squads channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=648 pid=3501 channel_order=0 channel_name=Squad\s1 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=651 pid=3501 channel_order=648 channel_name=Squad\s2 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=650 pid=3501 channel_order=651 channel_name=Squad\s3 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=740 pid=3501 channel_order=650 channel_name=Squad\s4 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid +|| +=861 pid=3501 channel_order=740 channel_name=Squad\s5 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=862 pid=3501 channel_order=861 channel_name=Squad\s6 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=863 pid=3501 channel_order=862 channel_name=Squad\s7 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=864 pid=3501 channel_order=863 channel_name=Squad\s8 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1221 pid=3501 channel_order=864 channel_name=Squad\s9 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1222 pid=3501 channel_order=1221 channel_name=Squad\s10 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=865 pid=3501 channel_order=1222 channel_name=Squad\s11 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=866 pid=3501 channel_order=865 channel_name=Squad\s12 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1409 pid=3501 channel_order=866 channel_name=Squad\s13 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1410 pid=3501 channel_order=1409 channel_name=Squad\s14 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1411 pid=3501 channel_order=1410 channel_name=Squad\s15 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=2471 pid=3501 channel_order=1411 channel_name=Squad\s16 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=2 +|| +472 pid=3501 channel_order=2471 channel_name=Squad\s17 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1688 pid=3501 channel_order=2472 channel_name=Squad\s18 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1689 pid=3501 channel_order=1688 channel_name=Squad\s19 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1690 pid=3501 channel_order=1689 channel_name=Squad\s20 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1691 pid=3501 channel_order=1690 channel_name=Squad\s21 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1692 pid=3501 channel_order=1691 channel_name=Squad\s22 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=4392 pid=3501 channel_order=1692 channel_name=Squad\s23 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1694 pid=3501 channel_order=4392 channel_name=Squad\s24 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1695 pid=3501 channel_order=1694 channel_name=Squad\s25 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=580 pid=3473 channel_order=577 channel_name=>\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s-=PVE=- channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=4370 pid=580 channel_order=0 channel_name=Lobby\s-\s1 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=3306 pid=580 channel_order=4370 channel_name=Lobby\s-\s2 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=4036 pid=580 channel_order=3306 channel_name=Lobby\s-\s3 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=3503 pid=580 channel_order=4036 channel_name=Ducat\sFarming channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=456 pid=3503 channel_order=0 channel_name=Lobby channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=3704 pid=3503 channel_order=456 channel_name=Squad\s1\s(Nova\sPrime\s+\sDucats) channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=3705 pid=3503 channel_order=3704 channel_name=Squad\s2\s(Loki\s+\sRhino\s+\sDucats) channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=4371 pid=3503 channel_order=3705 channel_name=Squad\s3\s(Misc\s+\sDucats) channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=4372 pid=3503 channel_order=4371 channel_name=Squad\s4\s(Misc\sDucats) channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=4373 pid=3503 channel_order=4372 channel_name=Squad\s-\s5\s(Misc\sDucats) channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=4374 pid=3503 channel_order=4373 channel_name=Squad\s-\s6\s(Misc\sDucats) channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=4375 pid=3503 channel_order=4374 channel_name=Squad\s-\s7\s(Misc\sDucats) channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=3502 pid=580 channel_order=3503 channel_nam +|| +e=Squads channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1112 pid=3502 channel_order=0 channel_name=Squad\s1 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1065 pid=3502 channel_order=1112 channel_name=Squad\s2 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1068 pid=3502 channel_order=1065 channel_name=Squad\s3 channel_topic total_clients=2 channel_needed_subscribe_power=0|cid=1067 pid=3502 channel_order=1068 channel_name=Squad\s4 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1124 pid=3502 channel_order=1067 channel_name=Squad\s5 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1125 pid=3502 channel_order=1124 channel_name=Squad\s6 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1135 pid=3502 channel_order=1125 channel_name=Squad\s7 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1224 pid=3502 channel_order=1135 channel_name=Squad\s8 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1225 pid=3502 channel_order=1224 channel_name=Squad\s9 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=3673 pid=580 channel_order=3502 channel_name=Archwing channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=3764 pid=3673 channel_order=0 channel_name=Lobby channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=3674 pid=3673 channel_order=3764 channel_name=Squad\s1 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=3675 pid=3673 channel_order=3674 channel_name=Squad\s2 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=3692 pid=3673 channel_order=3675 channel_name=Squad\s3 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=668 pid=580 channel_order=3673 channel_name=Syndicate\sFarming channel_topic total_clients=-1 channel_needed_subscribe_power=55|cid=1121 pid=668 channel_order=0 channel_name=Squad\s1 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=3994 pid=3473 channel_order=580 channel_name=>\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s-=Trade\sFrame=- channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=3645 pid=3473 channel_order=3994 channel_name=>\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s-=Alliances=- channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=520 pid=3645 channel_order=0 channel_name=V\sAlliance channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=3648 pid=520 channel_order=0 channel_name=Clans channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=3784 pid=3648 channel_order=0 channel_name=DWM\sGaming channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=3785 pid=3784 channel_order=0 channel_name=Admin\sChannel channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=3786 pid=3784 channel_order=3785 channel_name=Private\sChatroom channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=560 pid=3786 channel_order=0 channel_name=Shards\sof\sDespair\s-\sGhost\s1\/0\/0\/0 channel_topic total_clients=-1 channel_needed_subscribe_power=75|cid=459 pid=3648 channel_order=3784 channel_name=Lag\sWave\s50\s-\sStorm\s71 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=475 pid=3648 channel_order=459 channel_name=MTZ\/Microterrorizm channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=480 pid=3648 channel_order=475 channel_name=Original\sGoon\sSquad-\sStorm\s[52] channel_topic total_clients=7 channel_needed_subscribe_power=0|cid=4789 pid=480 channel_order=0 channel_name=[OGS]\sLeveling\sup\sframes channel_topic total_clients=5 channel_needed_subscribe_power=0|cid=587 pid=3648 channel_order=480 channel_name=Xenosha\s-\sStorm\s[53] channel_topic total_clients=3 channel_needed_subscribe_power=0|cid=707 pid=3648 channel_order=587 channel_name=ISRWarframe\s-\sStorm\sClan\s(Hebrew) channel_topic total_clients=3 channel_needed_subscribe_power=0|cid=872 pid=3648 channel_order=707 channel_name=The\sBrothers\sof\sMortem channel_topic total_clients=2 channel_needed_subscribe_power=0|cid=1116 pid=3648 channel_order=872 channel_name=SOR channel_topic total_clients=3 channel_needed_subscribe_power=0|cid=1247 pid=3648 channel_order=1116 channel_name=Without\sStrings\s-\sShadow\s(20) channel_topic total_clients=1 channel_needed_subscribe_power=0|cid=1364 pid=3648 +|| +channel_order=1247 channel_name=BiziCazipClan-\sStorm(67) channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1578 pid=3648 channel_order=1364 channel_name=SYSTEM\s32\s-\sMoon\sClan\s[793] channel_topic total_clients=1 channel_needed_subscribe_power=0|cid=1380 pid=3648 channel_order=1578 channel_name=Cypher\sadvents\s【FR】【Storm】【Ps4\/Pc\/Xbox】 channel_topic total_clients=1 channel_needed_subscribe_power=0|cid=1956 pid=3648 channel_order=1380 channel_name=Cosmic\sAegis\sGhost(9) channel_topic total_clients=6 channel_needed_subscribe_power=0|cid=2115 pid=3648 channel_order=1956 channel_name=Firestorm\s{FR}-\sStorm\s{57} channel_topic total_clients=1 channel_needed_subscribe_power=0|cid=2083 pid=3648 channel_order=2115 channel_name=Soldiers\s0f\sMisfortune\s-\sGhost\s(10) channel_topic total_clients=2 channel_needed_subscribe_power=0|cid=621 pid=3648 channel_order=2083 channel_name=Shruikan(Fr)\s-\sStorm\sClan channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=2882 pid=3648 channel_order=621 channel_name=GOLDenSILVER\s-\s\sMtn-50 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1363 pid=3648 channel_order=2882 channel_name=Probation channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=716 pid=1363 channel_order=0 channel_name=SuperiorSwords\s46\/13\/37\sMtn115\s3\/1\/15 channel_topic total_clients=7 channel_needed_subscribe_power=0|cid=878 pid=1363 channel_order=716 +|| + channel_name=Blood\sBerserk\s-\sGhost(9)\s3\/8\/15 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1302 pid=1363 channel_order=878 channel_name=ViosVigilantes\s3\/18\/15\sShw(14) channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=2106 pid=1363 channel_order=1302 channel_name=CraK\sza\s-\sShadow10\s1\/1\/15 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=2752 pid=1363 channel_order=2106 channel_name=Wooch\s-\s1\/19\/420\sStorm(100) channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=4248 pid=1363 channel_order=2752 channel_name=Strong\sArmy\s3\/19\/15 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=4632 pid=1363 channel_order=4248 channel_name=Israel\sTenno\sForces(6)\s03\/24\/15 channel_topic total_clients=1 channel_needed_subscribe_power=0|cid=3649 pid=3645 channel_order=520 channel_name=Ice channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=3654 pid=3649 channel_order=0 channel_name=Clans channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=458 pid=3654 channel_order=0 channel_name=-Quantum\sEntanglement\s-\sStorm\s(65) channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=3644 pid=3645 channel_order=3649 channel_name=Orion\sAlliance channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=3656 pid=3644 channel_order=0 channel_name=Lobby channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=3653 pid=3644 channel_order=3656 channel_name=Clans channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=3643 pid=3653 channel_order=0 channel_name=Bloodgod channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=3641 pid=3645 channel_order=3644 channel_name=Tenno\sCouncil\sAlliance channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=3651 pid=3641 channel_order=0 channel_name=Lobby channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=3655 pid=3641 channel_order=3651 channel_name=Clans channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=3657 pid=3655 channel_order=0 channel_name=Okami\ssama\sno\sShinobi channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=3650 pid=0 channel_order=3473 channel_name=[*cspacer\s18]༖ channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=3458 pid=0 channel_order=3650 channel_name=[lspacer\s19]>\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s-=AFK=- channel_topic total_clients=-1 channel_needed_subscribe_power=75|cid=3652 pid=0 channel_order=3458 channel_name=[*cspacer\s17]༖ channel_topic total_clients=0 channel_needed_subscribe_power=0 + error id=0 msg=ok + \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Teamspeak3/2_result.json b/gameq/tests/Protocols/Providers/Teamspeak3/2_result.json new file mode 100644 index 0000000..71db583 --- /dev/null +++ b/gameq/tests/Protocols/Providers/Teamspeak3/2_result.json @@ -0,0 +1 @@ +{"67.43.5.200:9987":{"connection_bandwidth_received_last_minute_total":"47068","connection_bandwidth_received_last_second_total":"49675","connection_bandwidth_sent_last_minute_total":"96860","connection_bandwidth_sent_last_second_total":"95669","connection_bytes_received_control":"94098377","connection_bytes_received_keepalive":"554106917","connection_bytes_received_speech":"2691927682","connection_bytes_received_total":"3340132976","connection_bytes_sent_control":"291637874","connection_bytes_sent_keepalive":"541821478","connection_bytes_sent_speech":"11344589012","connection_bytes_sent_total":"12178048364","connection_filetransfer_bandwidth_received":"0","connection_filetransfer_bandwidth_sent":"0","connection_filetransfer_bytes_received_total":"13800215","connection_filetransfer_bytes_sent_total":"627470236","connection_packets_received_control":"1544876","connection_packets_received_keepalive":"13200222","connection_packets_received_speech":"23764523","connection_packets_received_total":"38509621","connection_packets_sent_control":"1563103","connection_packets_sent_keepalive":"13215158","connection_packets_sent_speech":"101299587","connection_packets_sent_total":"116077848","dedicated":1,"gq_address":"67.43.5.200","gq_joinlink":"ts3server:\/\/67.43.5.200?port=9987","gq_name":"Teamspeak 3","gq_online":true,"gq_port_client":9987,"gq_port_query":10011,"gq_protocol":"teamspeak3","gq_transport":"tcp","gq_type":"teamspeak3","numplayers":106,"players":[{"clid":"4","cid":"309","client_database_id":"38","client_nickname":"Viper","client_type":"0"},{"clid":"6","cid":"1098","client_database_id":"5546","client_nickname":"barrysauce","client_type":"0"},{"clid":"7","cid":"4283","client_database_id":"7739","client_nickname":"Naked Snake","client_type":"0"},{"clid":"8","cid":"872","client_database_id":"4816","client_nickname":"KillerP_ssy [18,2]","client_type":"0"},{"clid":"10","cid":"495","client_database_id":"2646","client_nickname":"b1ue","client_type":"0"},{"clid":"12","cid":"1","client_database_id":"4968","client_nickname":"Unknown from 71.199.205.69:44975","client_type":"1"},{"clid":"13","cid":"705","client_database_id":"6818","client_nickname":"Pantykill","client_type":"0"},{"clid":"14","cid":"705","client_database_id":"63","client_nickname":"Whitehawk","client_type":"0"},{"clid":"16","cid":"1068","client_database_id":"2773","client_nickname":"Noob.Saibot (18) General","client_type":"0"},{"clid":"24","cid":"716","client_database_id":"6653","client_nickname":"Maes.Sunsanxian [7]11","client_type":"0"},{"clid":"26","cid":"321","client_database_id":"2710","client_nickname":"Undisonus","client_type":"0"},{"clid":"28","cid":"1380","client_database_id":"7827","client_nickname":"Avantarion","client_type":"0"},{"clid":"31","cid":"4738","client_database_id":"1772","client_nickname":"Pzykotik [13]","client_type":"0"},{"clid":"34","cid":"4485","client_database_id":"7786","client_nickname":"=242= CPT. Helios11","client_type":"0"},{"clid":"35","cid":"4789","client_database_id":"7152","client_nickname":"glacepk - Frank [7]","client_type":"0"},{"clid":"36","cid":"581","client_database_id":"7338","client_nickname":"Tolu2weenies(10)","client_type":"0"},{"clid":"42","cid":"1247","client_database_id":"7708","client_nickname":"RainbowBrite[18]","client_type":"0"},{"clid":"45","cid":"4789","client_database_id":"6984","client_nickname":"Akmon[10]","client_type":"0"},{"clid":"48","cid":"707","client_database_id":"4505","client_nickname":"Elaeus [17,85]","client_type":"0"},{"clid":"49","cid":"872","client_database_id":"7646","client_nickname":"TripleRocket [4]","client_type":"0"},{"clid":"50","cid":"4789","client_database_id":"7020","client_nickname":"Mashala[12]","client_type":"0"},{"clid":"53","cid":"2115","client_database_id":"6649","client_nickname":"Piokil[9]","client_type":"0"},{"clid":"57","cid":"1578","client_database_id":"6489","client_nickname":"mWik[18]^^[4]","client_type":"0"},{"clid":"60","cid":"581","client_database_id":"5144","client_nickname":"BirdofSong[16][5]","client_type":"0"},{"clid":"63","cid":"38","client_database_id":"7819","client_nickname":"Buder","client_type":"0"},{"clid":"65","cid":"2083","client_database_id":"7057","client_nickname":"Narcotx","client_type":"0"},{"clid":"66","cid":"4283","client_database_id":"5254","client_nickname":"Soarden [16] [6]","client_type":"0"},{"clid":"67","cid":"581","client_database_id":"3205","client_nickname":"-ExT-Fraank(19)","client_type":"0"},{"clid":"68","cid":"3373","client_database_id":"7791","client_nickname":"Ohai Im Alex","client_type":"0"},{"clid":"69","cid":"4632","client_database_id":"7746","client_nickname":"xwalle (5)","client_type":"0"},{"clid":"70","cid":"321","client_database_id":"6618","client_nickname":"Cutie","client_type":"0"},{"clid":"72","cid":"4789","client_database_id":"4817","client_nickname":"MeiAnne [15]","client_type":"0"},{"clid":"73","cid":"581","client_database_id":"7544","client_nickname":"Keikat[9]","client_type":"0"},{"clid":"77","cid":"321","client_database_id":"6820","client_nickname":"Jediyodaone","client_type":"0"},{"clid":"82","cid":"716","client_database_id":"7380","client_nickname":"Burnt[8]","client_type":"0"},{"clid":"83","cid":"3373","client_database_id":"6480","client_nickname":"Savannah","client_type":"0"},{"clid":"84","cid":"1956","client_database_id":"5460","client_nickname":"hellscythe[6]","client_type":"0"},{"clid":"87","cid":"4738","client_database_id":"2815","client_nickname":"Road","client_type":"0"},{"clid":"95","cid":"1068","client_database_id":"7682","client_nickname":"ST4RF0X 11","client_type":"0"},{"clid":"100","cid":"581","client_database_id":"3479","client_nickname":"angelfish999999999(13)1111","client_type":"0"},{"clid":"101","cid":"309","client_database_id":"6746","client_nickname":"brandonlopezypr","client_type":"0"},{"clid":"102","cid":"1276","client_database_id":"7799","client_nickname":"MrRiddlez","client_type":"0"},{"clid":"107","cid":"309","client_database_id":"2","client_nickname":"Tide","client_type":"0"},{"clid":"110","cid":"1401","client_database_id":"5132","client_nickname":"jacketstud [9]","client_type":"0"},{"clid":"117","cid":"1956","client_database_id":"3617","client_nickname":"fadedshadows1(10)","client_type":"0"},{"clid":"118","cid":"480","client_database_id":"7044","client_nickname":"XalvioN [17]","client_type":"0"},{"clid":"119","cid":"1956","client_database_id":"3101","client_nickname":"Themius(15) NukeDynasty(5)","client_type":"0"},{"clid":"123","cid":"309","client_database_id":"33","client_nickname":"HomeStyle Chillin","client_type":"0"},{"clid":"124","cid":"1956","client_database_id":"4778","client_nickname":"CoronApMor[8]","client_type":"0"},{"clid":"126","cid":"309","client_database_id":"1534","client_nickname":"[PNDA]KillerElite","client_type":"0"},{"clid":"127","cid":"1116","client_database_id":"4643","client_nickname":"The Ghiest[18]","client_type":"0"},{"clid":"130","cid":"581","client_database_id":"7713","client_nickname":"TimesEdge","client_type":"0"},{"clid":"134","cid":"1","client_database_id":"4656","client_nickname":"MagnusEffect (15)","client_type":"0"},{"clid":"135","cid":"716","client_database_id":"6583","client_nickname":"Maxed_Pain[7]","client_type":"0"},{"clid":"137","cid":"1098","client_database_id":"3094","client_nickname":"HurpMcDurp","client_type":"0"},{"clid":"138","cid":"321","client_database_id":"7758","client_nickname":"xStyk","client_type":"0"},{"clid":"139","cid":"416","client_database_id":"1519","client_nickname":"Epic Winning","client_type":"0"},{"clid":"140","cid":"1401","client_database_id":"6306","client_nickname":"Zerginater\\p5\\p","client_type":"0"},{"clid":"142","cid":"16","client_database_id":"6710","client_nickname":"samou [5]11","client_type":"0"},{"clid":"144","cid":"1098","client_database_id":"1430","client_nickname":"-Q-","client_type":"0"},{"clid":"145","cid":"3373","client_database_id":"1757","client_nickname":"dark-gaunt","client_type":"0"},{"clid":"153","cid":"480","client_database_id":"7367","client_nickname":"MazeElwin [̯̪̣̣̝͖̯12]̿͌͒͐͛́","client_type":"0"},{"clid":"156","cid":"16","client_database_id":"35","client_nickname":"wambatx","client_type":"0"},{"clid":"157","cid":"581","client_database_id":"4810","client_nickname":"Kleboldx1-Prime (18)(14)(1)","client_type":"0"},{"clid":"158","cid":"4738","client_database_id":"7800","client_nickname":"Xpl0jd","client_type":"0"},{"clid":"159","cid":"309","client_database_id":"4887","client_nickname":"dap","client_type":"0"},{"clid":"160","cid":"707","client_database_id":"4841","client_nickname":"Snixy [18,15]","client_type":"0"},{"clid":"163","cid":"716","client_database_id":"4443","client_nickname":"-Apolo [13]","client_type":"0"},{"clid":"165","cid":"587","client_database_id":"5281","client_nickname":"Ret [Regular Type Dude]","client_type":"0"},{"clid":"166","cid":"1956","client_database_id":"3964","client_nickname":"Caliburated(18)","client_type":"0"},{"clid":"167","cid":"38","client_database_id":"7818","client_nickname":"Kyahco","client_type":"0"},{"clid":"168","cid":"587","client_database_id":"2033","client_nickname":"Destroierrr9[18]","client_type":"0"},{"clid":"171","cid":"1956","client_database_id":"2776","client_nickname":"Otaku1988(14)","client_type":"0"},{"clid":"178","cid":"495","client_database_id":"4175","client_nickname":"Snowman","client_type":"0"},{"clid":"180","cid":"38","client_database_id":"7820","client_nickname":"TomTomWhon","client_type":"0"},{"clid":"181","cid":"4796","client_database_id":"4474","client_nickname":"buckw (18)►","client_type":"0"},{"clid":"184","cid":"4789","client_database_id":"5463","client_nickname":"Hitoriac [16] <-- Lucky Wabbit","client_type":"0"},{"clid":"185","cid":"707","client_database_id":"4898","client_nickname":"Zienox[12]","client_type":"0"},{"clid":"189","cid":"1116","client_database_id":"4664","client_nickname":"Laucivol [18]","client_type":"0"},{"clid":"190","cid":"3373","client_database_id":"4885","client_nickname":"SomeDiabeticKid","client_type":"0"},{"clid":"191","cid":"1116","client_database_id":"4724","client_nickname":"AlphaOC [18]","client_type":"0"},{"clid":"192","cid":"3373","client_database_id":"3536","client_nickname":"The Hazzard","client_type":"0"},{"clid":"194","cid":"309","client_database_id":"5367","client_nickname":"Philifly","client_type":"0"},{"clid":"197","cid":"716","client_database_id":"7447","client_nickname":"_Shinobu_Oshino_ [8]","client_type":"0"},{"clid":"201","cid":"480","client_database_id":"7448","client_nickname":"casey0827","client_type":"0"},{"clid":"202","cid":"716","client_database_id":"3711","client_nickname":"Tı̸̸̸̸̸̸̸̸̸̸̸̸̸̸̸̸̨ailsx{16}","client_type":"0"},{"clid":"203","cid":"587","client_database_id":"3215","client_nickname":"SapphireSirenz[17]","client_type":"0"},{"clid":"205","cid":"2083","client_database_id":"7350","client_nickname":"Shizzio[6]","client_type":"0"},{"clid":"207","cid":"309","client_database_id":"6409","client_nickname":"Kanaka","client_type":"0"},{"clid":"209","cid":"480","client_database_id":"4603","client_nickname":"CocxyMcChunk [9]","client_type":"0"},{"clid":"219","cid":"480","client_database_id":"6754","client_nickname":"DruCova [8]","client_type":"0"},{"clid":"225","cid":"1276","client_database_id":"7247","client_nickname":"Mr Kazz","client_type":"0"},{"clid":"227","cid":"581","client_database_id":"7710","client_nickname":"Uhhninjeesword(10)","client_type":"0"},{"clid":"229","cid":"4283","client_database_id":"7132","client_nickname":"doritofish[16]","client_type":"0"},{"clid":"235","cid":"716","client_database_id":"3938","client_nickname":"Botax 11","client_type":"0"},{"clid":"236","cid":"38","client_database_id":"7817","client_nickname":"Aziboo-music","client_type":"0"},{"clid":"241","cid":"480","client_database_id":"4617","client_nickname":"Druul","client_type":"0"},{"clid":"258","cid":"480","client_database_id":"2765","client_nickname":"Junki559[17]","client_type":"0"}],"teams":[{"cid":"1","pid":"0","channel_order":"0","channel_name":"Lobby - Ask to be pulled down","channel_topic":"Welcome to DWM Gaming","total_clients":"2","channel_needed_subscribe_power":"0"},{"cid":"3622","pid":"1","channel_order":"0","channel_name":"Lost? Join this channel, we'll help you.","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"3476","pid":"0","channel_order":"1","channel_name":"[*cspacer 0]༖","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"3483","pid":"0","channel_order":"3476","channel_name":"[cspacer]Community Administration","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"2","pid":"3483","channel_order":"0","channel_name":"Admin Room","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"705","pid":"3483","channel_order":"2","channel_name":"Help Room","channel_topic":"","total_clients":"2","channel_needed_subscribe_power":"0"},{"cid":"2526","pid":"3483","channel_order":"705","channel_name":"Website development","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"4311","pid":"3483","channel_order":"2526","channel_name":"Promotions\/Ads\/Photoshop","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"4009","pid":"3483","channel_order":"4311","channel_name":"Conference Room","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"4485","pid":"3483","channel_order":"4009","channel_name":"Convergence Meeting Notes","channel_topic":"","total_clients":"1","channel_needed_subscribe_power":"0"},{"cid":"4795","pid":"3483","channel_order":"4485","channel_name":"www.twitch.tv\/convergencegames\/","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"3455","pid":"0","channel_order":"3483","channel_name":"[*cspacer 9]༖","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"16","pid":"0","channel_order":"3455","channel_name":"[cspacer]AFK","channel_topic":"","total_clients":"2","channel_needed_subscribe_power":"0"},{"cid":"3450","pid":"0","channel_order":"16","channel_name":"[*cspacer 7]༖","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"124","pid":"0","channel_order":"3450","channel_name":"[cspacer]ARMA Series","channel_topic":"ARMA Series Game Chat and Discussion","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"347","pid":"124","channel_order":"0","channel_name":"Arma3 Wasteland","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"315","pid":"124","channel_order":"347","channel_name":"DayZ Standalone","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"402","pid":"124","channel_order":"315","channel_name":"Breaking Point","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"579","pid":"0","channel_order":"124","channel_name":"[*cspacer 4]༖","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"303","pid":"0","channel_order":"579","channel_name":"[cspacer]Battlefield Series","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"3","pid":"303","channel_order":"0","channel_name":"Battlefield 3","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"300","pid":"303","channel_order":"3","channel_name":"Battlefield 4","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"3481","pid":"0","channel_order":"303","channel_name":"[*cspacer01]༖","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"5","pid":"0","channel_order":"3481","channel_name":"[cspacer]Call of Duty Series","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"309","pid":"5","channel_order":"0","channel_name":"Advanced Warfare","channel_topic":"","total_clients":"8","channel_needed_subscribe_power":"0"},{"cid":"1098","pid":"5","channel_order":"309","channel_name":"Advanced Warfare Room 2","channel_topic":"","total_clients":"3","channel_needed_subscribe_power":"0"},{"cid":"2015","pid":"5","channel_order":"1098","channel_name":"Advanced Warfare AFK","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"6","pid":"5","channel_order":"2015","channel_name":"Black Ops II","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"9","pid":"5","channel_order":"6","channel_name":"COD 4","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"3516","pid":"0","channel_order":"5","channel_name":"[*cspacer 81]༖","channel_topic":"","total_clients":"-1","channel_needed_subscribe_power":"99"},{"cid":"522","pid":"0","channel_order":"3516","channel_name":"[cspacer]League of Legends","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"12","pid":"522","channel_order":"0","channel_name":"League of Legends - Lobby","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"495","pid":"12","channel_order":"0","channel_name":"Normals","channel_topic":"","total_clients":"2","channel_needed_subscribe_power":"0"},{"cid":"503","pid":"12","channel_order":"495","channel_name":"Normal 2","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1276","pid":"12","channel_order":"503","channel_name":"Normal 3","channel_topic":"","total_clients":"2","channel_needed_subscribe_power":"0"},{"cid":"2489","pid":"12","channel_order":"1276","channel_name":"Low Levels","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1796","pid":"12","channel_order":"2489","channel_name":"Ranked 5's - Don't disturb during prac.","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"416","pid":"12","channel_order":"1796","channel_name":"Jared's Channel","channel_topic":"","total_clients":"1","channel_needed_subscribe_power":"0"},{"cid":"1250","pid":"522","channel_order":"12","channel_name":"Tournament planning","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1252","pid":"522","channel_order":"1250","channel_name":"Admin on standby","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1251","pid":"1252","channel_order":"0","channel_name":"Tournament Lobby","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"571","pid":"0","channel_order":"522","channel_name":"[*cspacer 1]༖","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"2645","pid":"0","channel_order":"571","channel_name":"[cspacer]Misc. Games","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"3676","pid":"2645","channel_order":"0","channel_name":"Elder Scrolls - Elder Scrolls Online","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"3691","pid":"3676","channel_order":"0","channel_name":"Lobby","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"3680","pid":"3676","channel_order":"3691","channel_name":"Aldmeri Dominion Zones","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"3681","pid":"3676","channel_order":"3680","channel_name":"Ebonhart Pact Zones","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"3682","pid":"3676","channel_order":"3681","channel_name":"Daggerfall Zones","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"3683","pid":"3676","channel_order":"3682","channel_name":"Craglorn","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"3684","pid":"3676","channel_order":"3683","channel_name":"Dungeon 1","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"3685","pid":"3676","channel_order":"3684","channel_name":"Dungeon 2","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"3686","pid":"3676","channel_order":"3685","channel_name":"Dungeon 3","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"3687","pid":"3676","channel_order":"3686","channel_name":"Cyrodiil","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"3688","pid":"3676","channel_order":"3687","channel_name":"The Traders\/Crafter Lounge","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"3689","pid":"3676","channel_order":"3688","channel_name":"> -=Guilds=-","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"3690","pid":"3689","channel_order":"0","channel_name":"The Voice of Sithis","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1079","pid":"2645","channel_order":"3676","channel_name":"Evolve","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1080","pid":"1079","channel_order":"0","channel_name":"Hunter Group 1","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1081","pid":"1079","channel_order":"1080","channel_name":"Hunter Group 2","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"13","pid":"2645","channel_order":"1079","channel_name":"The Gaming Pub","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"662","pid":"2645","channel_order":"13","channel_name":"Counter Strike","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"29","pid":"2645","channel_order":"662","channel_name":"Diablo 3","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"4283","pid":"29","channel_order":"0","channel_name":"Harcore","channel_topic":"","total_clients":"3","channel_needed_subscribe_power":"0"},{"cid":"4284","pid":"29","channel_order":"4283","channel_name":"Seasonal","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"682","pid":"2645","channel_order":"29","channel_name":"Dofus","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"3557","pid":"2645","channel_order":"682","channel_name":"DOTA 2","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1401","pid":"2645","channel_order":"3557","channel_name":"Heroes of the Storm","channel_topic":"","total_clients":"2","channel_needed_subscribe_power":"0"},{"cid":"38","pid":"2645","channel_order":"1401","channel_name":"Minecraft","channel_topic":"Builf your dream home","total_clients":"4","channel_needed_subscribe_power":"0"},{"cid":"3175","pid":"2645","channel_order":"38","channel_name":"RUST","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"2873","pid":"2645","channel_order":"3175","channel_name":"Space Engineers","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"4697","pid":"2645","channel_order":"2873","channel_name":"Starbound","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"4062","pid":"2645","channel_order":"4697","channel_name":"Stronghold Kingdoms","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"355","pid":"2645","channel_order":"4062","channel_name":"Titanfall","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"3058","pid":"2645","channel_order":"355","channel_name":"War Thunder","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"3533","pid":"2645","channel_order":"3058","channel_name":"World of Tanks","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"4790","pid":"3533","channel_order":"0","channel_name":"Squad 1","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"4791","pid":"3533","channel_order":"4790","channel_name":"Squad 2","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"3989","pid":"2645","channel_order":"3533","channel_name":"Monster Hunter 4 Ultimate - DS","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"4398","pid":"2645","channel_order":"3989","channel_name":"Path of Exile","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"4607","pid":"2645","channel_order":"4398","channel_name":"Yet Another Zombie Defense","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"4690","pid":"2645","channel_order":"4607","channel_name":"Starcraft","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"4691","pid":"2645","channel_order":"4690","channel_name":"Guild Wars 2","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"4692","pid":"2645","channel_order":"4691","channel_name":"Borderlands 2","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"4738","pid":"2645","channel_order":"4692","channel_name":"APB:Reloaded","channel_topic":"","total_clients":"3","channel_needed_subscribe_power":"0"},{"cid":"4792","pid":"2645","channel_order":"4738","channel_name":"Archeage","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"4796","pid":"2645","channel_order":"4792","channel_name":"Smite","channel_topic":"","total_clients":"1","channel_needed_subscribe_power":"0"},{"cid":"3472","pid":"0","channel_order":"2645","channel_name":"[*cspacer]༖","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1248","pid":"0","channel_order":"3472","channel_name":"[cspacer]Runescape","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1249","pid":"1248","channel_order":"0","channel_name":"XP Legacy","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"3373","pid":"1249","channel_order":"0","channel_name":"General Players","channel_topic":"","total_clients":"5","channel_needed_subscribe_power":"0"},{"cid":"1272","pid":"1249","channel_order":"3373","channel_name":"Pauls Room","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1273","pid":"1249","channel_order":"1272","channel_name":"Clan Citadel","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1264","pid":"1249","channel_order":"1273","channel_name":"Dung Room 1","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1269","pid":"1249","channel_order":"1264","channel_name":"Bossing Room","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"3464","pid":"0","channel_order":"1248","channel_name":"[*cspacer 12]༖","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"311","pid":"0","channel_order":"3464","channel_name":"[cspacer]Warcraft - World of Warcraft","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"687","pid":"311","channel_order":"0","channel_name":"--Horde-- World of Warcraft --Horde--","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"652","pid":"687","channel_order":"0","channel_name":"DWM Officer Chat","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"326","pid":"687","channel_order":"652","channel_name":"Group1","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"327","pid":"687","channel_order":"326","channel_name":"Group2","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"321","pid":"687","channel_order":"327","channel_name":"Raiding","channel_topic":"","total_clients":"4","channel_needed_subscribe_power":"0"},{"cid":"2914","pid":"687","channel_order":"321","channel_name":"Mythic Raid","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"562","pid":"687","channel_order":"2914","channel_name":"PvP Arena","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"575","pid":"687","channel_order":"562","channel_name":"PVP Arena 2","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"561","pid":"687","channel_order":"575","channel_name":"PvP BGs","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"563","pid":"687","channel_order":"561","channel_name":"PvP RBGs","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"570","pid":"0","channel_order":"311","channel_name":"[*cspacer 3]༖","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"3473","pid":"0","channel_order":"570","channel_name":"[cspacer]Warframe","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"58","pid":"3473","channel_order":"0","channel_name":"> -=Administrative=-","channel_topic":"Get some! Badass free game.","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"847","pid":"58","channel_order":"0","channel_name":"Warframe Recruiting Office","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"2866","pid":"58","channel_order":"847","channel_name":"Warframe Administrative Office","channel_topic":"","total_clients":"-1","channel_needed_subscribe_power":"75"},{"cid":"754","pid":"2866","channel_order":"0","channel_name":"攻 æ®» 機 動 隊 Ghost in the Shell","channel_topic":"","total_clients":"-1","channel_needed_subscribe_power":"65"},{"cid":"569","pid":"58","channel_order":"2866","channel_name":"Network Alliance meeting room","channel_topic":"","total_clients":"-1","channel_needed_subscribe_power":"60"},{"cid":"532","pid":"58","channel_order":"569","channel_name":"Warlord meeting room","channel_topic":"","total_clients":"-1","channel_needed_subscribe_power":"60"},{"cid":"796","pid":"532","channel_order":"0","channel_name":"Warlord hideout","channel_topic":"","total_clients":"-1","channel_needed_subscribe_power":"75"},{"cid":"841","pid":"3473","channel_order":"58","channel_name":"> -=Clan meetings=-","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"3463","pid":"841","channel_order":"0","channel_name":"Meeting room 1","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"3495","pid":"841","channel_order":"3463","channel_name":"Meeting room 2","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"3496","pid":"841","channel_order":"3495","channel_name":"Meeting room 3","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"3497","pid":"841","channel_order":"3496","channel_name":"Meeting room 4","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"3498","pid":"841","channel_order":"3497","channel_name":"Meeting room 5","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"479","pid":"3473","channel_order":"841","channel_name":"> -=Music=-","channel_topic":"\\p̲̅̅●̲̅̅\\p̲̅̅=̲̅̅\\p̲̅̅●̲̅̅\\p\\p̲̅̅●̲̅̅\\p̲̅̅=̲̅̅\\p̲̅̅●̲̅̅\\p","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"3466","pid":"479","channel_order":"0","channel_name":"Music selection 1","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"3467","pid":"479","channel_order":"3466","channel_name":"Music selection 2","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"3549","pid":"479","channel_order":"3467","channel_name":"Music selection 3","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"577","pid":"3473","channel_order":"479","channel_name":"> -=PVP=-","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1226","pid":"577","channel_order":"0","channel_name":"PVP Event","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"581","pid":"577","channel_order":"1226","channel_name":"Lobby - Defend rail for Orion Cholistan","channel_topic":"","total_clients":"8","channel_needed_subscribe_power":"0"},{"cid":"3501","pid":"577","channel_order":"581","channel_name":"Squads","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"648","pid":"3501","channel_order":"0","channel_name":"Squad 1","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"651","pid":"3501","channel_order":"648","channel_name":"Squad 2","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"650","pid":"3501","channel_order":"651","channel_name":"Squad 3","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"740","pid":"3501","channel_order":"650","channel_name":"Squad 4","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"861","pid":"3501","channel_order":"740","channel_name":"Squad 5","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"862","pid":"3501","channel_order":"861","channel_name":"Squad 6","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"863","pid":"3501","channel_order":"862","channel_name":"Squad 7","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"864","pid":"3501","channel_order":"863","channel_name":"Squad 8","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1221","pid":"3501","channel_order":"864","channel_name":"Squad 9","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1222","pid":"3501","channel_order":"1221","channel_name":"Squad 10","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"865","pid":"3501","channel_order":"1222","channel_name":"Squad 11","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"866","pid":"3501","channel_order":"865","channel_name":"Squad 12","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1409","pid":"3501","channel_order":"866","channel_name":"Squad 13","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1410","pid":"3501","channel_order":"1409","channel_name":"Squad 14","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1411","pid":"3501","channel_order":"1410","channel_name":"Squad 15","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"2471","pid":"3501","channel_order":"1411","channel_name":"Squad 16","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"2472","pid":"3501","channel_order":"2471","channel_name":"Squad 17","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1688","pid":"3501","channel_order":"2472","channel_name":"Squad 18","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1689","pid":"3501","channel_order":"1688","channel_name":"Squad 19","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1690","pid":"3501","channel_order":"1689","channel_name":"Squad 20","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1691","pid":"3501","channel_order":"1690","channel_name":"Squad 21","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1692","pid":"3501","channel_order":"1691","channel_name":"Squad 22","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"4392","pid":"3501","channel_order":"1692","channel_name":"Squad 23","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1694","pid":"3501","channel_order":"4392","channel_name":"Squad 24","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1695","pid":"3501","channel_order":"1694","channel_name":"Squad 25","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"580","pid":"3473","channel_order":"577","channel_name":"> -=PVE=-","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"4370","pid":"580","channel_order":"0","channel_name":"Lobby - 1","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"3306","pid":"580","channel_order":"4370","channel_name":"Lobby - 2","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"4036","pid":"580","channel_order":"3306","channel_name":"Lobby - 3","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"3503","pid":"580","channel_order":"4036","channel_name":"Ducat Farming","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"456","pid":"3503","channel_order":"0","channel_name":"Lobby","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"3704","pid":"3503","channel_order":"456","channel_name":"Squad 1 (Nova Prime + Ducats)","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"3705","pid":"3503","channel_order":"3704","channel_name":"Squad 2 (Loki + Rhino + Ducats)","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"4371","pid":"3503","channel_order":"3705","channel_name":"Squad 3 (Misc + Ducats)","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"4372","pid":"3503","channel_order":"4371","channel_name":"Squad 4 (Misc Ducats)","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"4373","pid":"3503","channel_order":"4372","channel_name":"Squad - 5 (Misc Ducats)","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"4374","pid":"3503","channel_order":"4373","channel_name":"Squad - 6 (Misc Ducats)","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"4375","pid":"3503","channel_order":"4374","channel_name":"Squad - 7 (Misc Ducats)","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"3502","pid":"580","channel_order":"3503","channel_name":"Squads","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1112","pid":"3502","channel_order":"0","channel_name":"Squad 1","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1065","pid":"3502","channel_order":"1112","channel_name":"Squad 2","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1068","pid":"3502","channel_order":"1065","channel_name":"Squad 3","channel_topic":"","total_clients":"2","channel_needed_subscribe_power":"0"},{"cid":"1067","pid":"3502","channel_order":"1068","channel_name":"Squad 4","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1124","pid":"3502","channel_order":"1067","channel_name":"Squad 5","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1125","pid":"3502","channel_order":"1124","channel_name":"Squad 6","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1135","pid":"3502","channel_order":"1125","channel_name":"Squad 7","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1224","pid":"3502","channel_order":"1135","channel_name":"Squad 8","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1225","pid":"3502","channel_order":"1224","channel_name":"Squad 9","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"3673","pid":"580","channel_order":"3502","channel_name":"Archwing","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"3764","pid":"3673","channel_order":"0","channel_name":"Lobby","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"3674","pid":"3673","channel_order":"3764","channel_name":"Squad 1","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"3675","pid":"3673","channel_order":"3674","channel_name":"Squad 2","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"3692","pid":"3673","channel_order":"3675","channel_name":"Squad 3","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"668","pid":"580","channel_order":"3673","channel_name":"Syndicate Farming","channel_topic":"","total_clients":"-1","channel_needed_subscribe_power":"55"},{"cid":"1121","pid":"668","channel_order":"0","channel_name":"Squad 1","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"3994","pid":"3473","channel_order":"580","channel_name":"> -=Trade Frame=-","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"3645","pid":"3473","channel_order":"3994","channel_name":"> -=Alliances=-","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"520","pid":"3645","channel_order":"0","channel_name":"V Alliance","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"3648","pid":"520","channel_order":"0","channel_name":"Clans","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"3784","pid":"3648","channel_order":"0","channel_name":"DWM Gaming","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"3785","pid":"3784","channel_order":"0","channel_name":"Admin Channel","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"3786","pid":"3784","channel_order":"3785","channel_name":"Private Chatroom","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"560","pid":"3786","channel_order":"0","channel_name":"Shards of Despair - Ghost 1\/0\/0\/0","channel_topic":"","total_clients":"-1","channel_needed_subscribe_power":"75"},{"cid":"459","pid":"3648","channel_order":"3784","channel_name":"Lag Wave 50 - Storm 71","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"475","pid":"3648","channel_order":"459","channel_name":"MTZ\/Microterrorizm","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"480","pid":"3648","channel_order":"475","channel_name":"Original Goon Squad- Storm [52]","channel_topic":"","total_clients":"7","channel_needed_subscribe_power":"0"},{"cid":"4789","pid":"480","channel_order":"0","channel_name":"[OGS] Leveling up frames","channel_topic":"","total_clients":"5","channel_needed_subscribe_power":"0"},{"cid":"587","pid":"3648","channel_order":"480","channel_name":"Xenosha - Storm [53]","channel_topic":"","total_clients":"3","channel_needed_subscribe_power":"0"},{"cid":"707","pid":"3648","channel_order":"587","channel_name":"ISRWarframe - Storm Clan (Hebrew)","channel_topic":"","total_clients":"3","channel_needed_subscribe_power":"0"},{"cid":"872","pid":"3648","channel_order":"707","channel_name":"The Brothers of Mortem","channel_topic":"","total_clients":"2","channel_needed_subscribe_power":"0"},{"cid":"1116","pid":"3648","channel_order":"872","channel_name":"SOR","channel_topic":"","total_clients":"3","channel_needed_subscribe_power":"0"},{"cid":"1247","pid":"3648","channel_order":"1116","channel_name":"Without Strings - Shadow (20)","channel_topic":"","total_clients":"1","channel_needed_subscribe_power":"0"},{"cid":"1364","pid":"3648","channel_order":"1247","channel_name":"BiziCazipClan- Storm(67)","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1578","pid":"3648","channel_order":"1364","channel_name":"SYSTEM 32 - Moon Clan [793]","channel_topic":"","total_clients":"1","channel_needed_subscribe_power":"0"},{"cid":"1380","pid":"3648","channel_order":"1578","channel_name":"Cypher advents 【FR】【Storm】【Ps4\/Pc\/Xbox】","channel_topic":"","total_clients":"1","channel_needed_subscribe_power":"0"},{"cid":"1956","pid":"3648","channel_order":"1380","channel_name":"Cosmic Aegis Ghost(9)","channel_topic":"","total_clients":"6","channel_needed_subscribe_power":"0"},{"cid":"2115","pid":"3648","channel_order":"1956","channel_name":"Firestorm {FR}- Storm {57}","channel_topic":"","total_clients":"1","channel_needed_subscribe_power":"0"},{"cid":"2083","pid":"3648","channel_order":"2115","channel_name":"Soldiers 0f Misfortune - Ghost (10)","channel_topic":"","total_clients":"2","channel_needed_subscribe_power":"0"},{"cid":"621","pid":"3648","channel_order":"2083","channel_name":"Shruikan(Fr) - Storm Clan","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"2882","pid":"3648","channel_order":"621","channel_name":"GOLDenSILVER - Mtn-50","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1363","pid":"3648","channel_order":"2882","channel_name":"Probation","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"716","pid":"1363","channel_order":"0","channel_name":"SuperiorSwords 46\/13\/37 Mtn115 3\/1\/15","channel_topic":"","total_clients":"7","channel_needed_subscribe_power":"0"},{"cid":"878","pid":"1363","channel_order":"716","channel_name":"Blood Berserk - Ghost(9) 3\/8\/15","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1302","pid":"1363","channel_order":"878","channel_name":"ViosVigilantes 3\/18\/15 Shw(14)","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"2106","pid":"1363","channel_order":"1302","channel_name":"CraK za - Shadow10 1\/1\/15","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"2752","pid":"1363","channel_order":"2106","channel_name":"Wooch - 1\/19\/420 Storm(100)","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"4248","pid":"1363","channel_order":"2752","channel_name":"Strong Army 3\/19\/15","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"4632","pid":"1363","channel_order":"4248","channel_name":"Israel Tenno Forces(6) 03\/24\/15","channel_topic":"","total_clients":"1","channel_needed_subscribe_power":"0"},{"cid":"3649","pid":"3645","channel_order":"520","channel_name":"Ice","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"3654","pid":"3649","channel_order":"0","channel_name":"Clans","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"458","pid":"3654","channel_order":"0","channel_name":"-Quantum Entanglement - Storm (65)","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"3644","pid":"3645","channel_order":"3649","channel_name":"Orion Alliance","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"3656","pid":"3644","channel_order":"0","channel_name":"Lobby","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"3653","pid":"3644","channel_order":"3656","channel_name":"Clans","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"3643","pid":"3653","channel_order":"0","channel_name":"Bloodgod","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"3641","pid":"3645","channel_order":"3644","channel_name":"Tenno Council Alliance","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"3651","pid":"3641","channel_order":"0","channel_name":"Lobby","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"3655","pid":"3641","channel_order":"3651","channel_name":"Clans","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"3657","pid":"3655","channel_order":"0","channel_name":"Okami sama no Shinobi","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"3650","pid":"0","channel_order":"3473","channel_name":"[*cspacer 18]༖","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"3458","pid":"0","channel_order":"3650","channel_name":"[lspacer 19]> -=AFK=-","channel_topic":"","total_clients":"-1","channel_needed_subscribe_power":"75"},{"cid":"3652","pid":"0","channel_order":"3458","channel_name":"[*cspacer 17]༖","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"}],"virtualserver_antiflood_points_needed_command_block":"150","virtualserver_antiflood_points_needed_ip_block":"250","virtualserver_antiflood_points_tick_reduce":"15","virtualserver_ask_for_privilegekey":"0","virtualserver_autostart":"1","virtualserver_channel_temp_delete_delay_default":"0","virtualserver_channelsonline":"231","virtualserver_client_connections":"797","virtualserver_clientsonline":"107","virtualserver_codec_encryption_mode":"0","virtualserver_complain_autoban_count":"5","virtualserver_complain_autoban_time":"1200","virtualserver_complain_remove_time":"3600","virtualserver_created":"1358228062","virtualserver_default_channel_admin_group":"5","virtualserver_default_channel_group":"8","virtualserver_default_server_group":"8","virtualserver_download_quota":"18446744073709551615","virtualserver_filebase":"files\/virtualserver_1","virtualserver_flag_password":"0","virtualserver_hostbanner_gfx_interval":"0","virtualserver_hostbanner_gfx_url":"","virtualserver_hostbanner_mode":"2","virtualserver_hostbanner_url":"https:\/\/docs.google.com\/forms\/d\/11gB6-VhhQevWJb-LyGfU4AtCNGRFBrdkttOjfsP3fQA\/viewform?usp=send_form","virtualserver_hostbutton_gfx_url":"","virtualserver_hostbutton_tooltip":"DWM Gaming","virtualserver_hostbutton_url":"","virtualserver_hostmessage":"Daylight Saving Time begins on March 8th 2015 at 2AM. The clock is set to go forward 1 hour at this time.","virtualserver_hostmessage_mode":"2","virtualserver_icon_id":"0","virtualserver_id":"1","virtualserver_ip":"67.43.5.200","virtualserver_log_channel":"1","virtualserver_log_client":"1","virtualserver_log_filetransfer":"1","virtualserver_log_permissions":"1","virtualserver_log_query":"1","virtualserver_log_server":"1","virtualserver_machine_id":"","virtualserver_max_download_total_bandwidth":"18446744073709551615","virtualserver_max_upload_total_bandwidth":"18446744073709551615","virtualserver_maxclients":"500","virtualserver_min_client_version":"1373587200","virtualserver_min_clients_in_channel_before_forced_silence":"250","virtualserver_month_bytes_downloaded":"748237337","virtualserver_month_bytes_uploaded":"58748505","virtualserver_name":"DWM Gaming","virtualserver_name_phonetic":"","virtualserver_needed_identity_security_level":"8","virtualserver_password":"","virtualserver_platform":"Linux","virtualserver_port":"9987","virtualserver_priority_speaker_dimm_modificator":"-18.0000","virtualserver_query_client_connections":"1946","virtualserver_queryclientsonline":"1","virtualserver_reserved_slots":"0","virtualserver_status":"online","virtualserver_total_bytes_downloaded":"124757274671","virtualserver_total_bytes_uploaded":"19436742837","virtualserver_total_packetloss_control":"0.0050","virtualserver_total_packetloss_keepalive":"0.0045","virtualserver_total_packetloss_speech":"0.0037","virtualserver_total_packetloss_total":"0.0050","virtualserver_total_ping":"114.1226","virtualserver_unique_identifier":"fFu6LM7r7NKPJlFheQxo6rSweP4=","virtualserver_upload_quota":"18446744073709551615","virtualserver_uptime":"81901","virtualserver_version":"3.0.11.2 [Build: 1418654632]","virtualserver_weblist_enabled":"1","virtualserver_welcomemessage":"Welcome to DWM Gaming, visit our site at [URL]www.DWMGaming.com[\/URL]."}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Teeworlds/1_response.txt b/gameq/tests/Protocols/Providers/Teeworlds/1_response.txt new file mode 100644 index 0000000..1bbaa5b Binary files /dev/null and b/gameq/tests/Protocols/Providers/Teeworlds/1_response.txt differ diff --git a/gameq/tests/Protocols/Providers/Teeworlds/1_result.json b/gameq/tests/Protocols/Providers/Teeworlds/1_result.json new file mode 100644 index 0000000..5860b30 --- /dev/null +++ b/gameq/tests/Protocols/Providers/Teeworlds/1_result.json @@ -0,0 +1 @@ +{"ddracepro.net:8000":{"dedicated":true,"flags":"0","game_descr":"DDRace","gq_address":"ddracepro.net","gq_joinlink":"steam:\/\/connect\/ddracepro.net:8000\/","gq_name":"Teeworlds Server","gq_online":true,"gq_port_client":8000,"gq_port_query":8000,"gq_protocol":"teeworlds","gq_transport":"udp","gq_type":"teeworlds","hostname":"ddracepro.net - Gores\/HDP\/Verification\/other solo Maps #1","map":"gores","maxplayers":"16","maxplayers_total":"16","num_players":"0","num_players_total":"0","version":"0.6 trunk, 1.15a"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Teeworlds/2_response.txt b/gameq/tests/Protocols/Providers/Teeworlds/2_response.txt new file mode 100644 index 0000000..ff8ac26 Binary files /dev/null and b/gameq/tests/Protocols/Providers/Teeworlds/2_response.txt differ diff --git a/gameq/tests/Protocols/Providers/Teeworlds/2_result.json b/gameq/tests/Protocols/Providers/Teeworlds/2_result.json new file mode 100644 index 0000000..67977c4 --- /dev/null +++ b/gameq/tests/Protocols/Providers/Teeworlds/2_result.json @@ -0,0 +1 @@ +{"144.76.72.214:8303":{"dedicated":true,"flags":"0","game_descr":"DM","gq_address":"144.76.72.214","gq_joinlink":"steam:\/\/connect\/144.76.72.214:8303\/","gq_name":"Teeworlds Server","gq_online":true,"gq_port_client":8303,"gq_port_query":8303,"gq_protocol":"teeworlds","gq_transport":"udp","gq_type":"teeworlds","hostname":"! *** DNW Despe.de *** Teeworlds DM!","map":"dm7","maxplayers":"10","maxplayers_total":"12","num_players":"0","num_players_total":"0","version":"0.6.2"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Teeworlds/3_response.txt b/gameq/tests/Protocols/Providers/Teeworlds/3_response.txt new file mode 100644 index 0000000..d2ec0bb Binary files /dev/null and b/gameq/tests/Protocols/Providers/Teeworlds/3_response.txt differ diff --git a/gameq/tests/Protocols/Providers/Teeworlds/3_result.json b/gameq/tests/Protocols/Providers/Teeworlds/3_result.json new file mode 100644 index 0000000..8ed9a13 --- /dev/null +++ b/gameq/tests/Protocols/Providers/Teeworlds/3_result.json @@ -0,0 +1 @@ +{"5.135.83.167:8303":{"dedicated":true,"flags":"0","game_descr":"DDraceNetwork","gq_address":"5.135.83.167","gq_joinlink":"steam:\/\/connect\/5.135.83.167:8303\/","gq_name":"Teeworlds Server","gq_online":true,"gq_port_client":8303,"gq_port_query":8303,"gq_protocol":"teeworlds","gq_transport":"udp","gq_type":"teeworlds","hostname":"! [Block Server] blmapV3ROYAL Hosted by Rafael [30\/64]","map":"blmapV3ROYAL","maxplayers":"16","maxplayers_total":"16","num_players":"15","num_players_total":"15","players":[{"name":"|Weißnixbrot|","clan":"","flag":"-1","score":"-4287","team":"1"},{"name":"BOOGYMAN","clan":"happysom","flag":"32","score":"-9999","team":"1"},{"name":"artaz Tn'P","clan":"","flag":"643","score":"-9999","team":"1"},{"name":"miswebos","clan":"","flag":"152","score":"-334","team":"1"},{"name":"Paddjini","clan":"","flag":"276","score":"-9999","team":"1"},{"name":"british tea","clan":"thinkabout","flag":"96","score":"-9999","team":"1"},{"name":"\\\\Koala\/\/{LaB}","clan":"","flag":"704","score":"-684","team":"1"},{"name":"suck dis","clan":"","flag":"-1","score":"62","team":"1"},{"name":"born to be free","clan":"","flag":"-1","score":"-9999","team":"1"},{"name":"SƥongȜBOɀɀ","clan":"|RacEBroS|","flag":"8","score":"-9999","team":"1"},{"name":"(1)wubs","clan":"","flag":"-1","score":"-108","team":"1"},{"name":"(1)osski","clan":"","flag":"528","score":"-9999","team":"1"},{"name":"Pyro","clan":"Burn","flag":"36","score":"-9999","team":"1"},{"name":"heisenberg","clan":"","flag":"166","score":"-9999","team":"1"},{"name":"Purzedo","clan":"Ravenclaw","flag":"840","score":"-9999","team":"1"},{"name":"Koala Dummy","clan":"","flag":"-1","score":"-1652","team":"1"}],"version":"0.6.3, 9.1"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Terraria/1_response.txt b/gameq/tests/Protocols/Providers/Terraria/1_response.txt new file mode 100644 index 0000000..83879a4 --- /dev/null +++ b/gameq/tests/Protocols/Providers/Terraria/1_response.txt @@ -0,0 +1,100 @@ +HTTP/1.0 200 Made by Jonas Gauffin +Content-Type: application/json; charset=utf-8 +Content-Length: 1950 +Connection: Close +Server: TShockAPI/4.3.16.0 + + +|| +{ + "status": "200", + "name": "", + "serverversion": "v1.3.2.1", + "tshockversion": { + "Major": 4, + "Minor": 3, + "Build": 16, + "Revision": 0, + "MajorRevision": 0, + "MinorRevision": 0 + }, + "port": 7777, + "playercount": 7, + "maxplayers": 86, + "world": "ShadowRain ~ VII", + "uptime": "8.15:10:51", + "serverpassword": false, + "players": [ + { + "nickname": "Woozer", + "username": "Woozer", + "group": "default", + "active": true, + "state": 10, + "team": 0 + }, + { + "nickname": "G0D", + "username": "G0D", + "group": "default", + "active": true, + "state": 10, + "team": 5 + }, + { + "nickname": "dood123", + "username": "dood123", + "group": "default", + "active": true, + "state": 10, + "team": 0 + }, + { + "nickname": "Shpee", + "username": "Shpee", + "group": "default", + "active": true, + "state": 10, + "team": 0 + }, + { + "nickname": "Ford_j_Ford", + "username": "Ford_j_Ford", + "group": "default", + "active": true, + "state": 10, + "team": 5 + }, + { + "nickname": "Hi-im-jimmy", + "username": "Hi-im-jimmy", + "group": "Member+1", + "active": true, + "state": 10, + "team": 3 + }, + { + "nickname": "Biofighter", + "username": "Biofighter", + "group": "default", + "active": true, + "state": 10, + "team": 0 + } + ], + "rules": { + "AutoSave": false, + "DisableBuild": false, + "DisableClownBombs": false, + "DisableDungeonGuardian": false, + "DisableInvisPvP": true, + "DisableSnowBalls": false, + "DisableTombstones": true, + "EnableWhitelist": false, + "HardcoreOnly": false, + "PvPMode": "normal", + "SpawnProtection": true, + "SpawnProtectionRadius": 325, + "ServerSideInventory": false + } +} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Terraria/1_result.json b/gameq/tests/Protocols/Providers/Terraria/1_result.json new file mode 100644 index 0000000..7aa3b89 --- /dev/null +++ b/gameq/tests/Protocols/Providers/Terraria/1_result.json @@ -0,0 +1 @@ +{"t.shadowrain.net:7777":{"dedicated":1,"game_port":7777,"gq_address":"t.shadowrain.net","gq_joinlink":"steam:\/\/connect\/t.shadowrain.net:7777\/","gq_name":"Terraria","gq_online":true,"gq_port_client":7777,"gq_port_query":7878,"gq_protocol":"tshock","gq_transport":"tcp","gq_type":"terraria","hostname":"","maxplayers":86,"numplayers":7,"password":0,"players":[{"nickname":"Woozer","username":"Woozer","group":"default","active":1,"state":10,"team":0},{"nickname":"G0D","username":"G0D","group":"default","active":1,"state":10,"team":5},{"nickname":"dood123","username":"dood123","group":"default","active":1,"state":10,"team":0},{"nickname":"Shpee","username":"Shpee","group":"default","active":1,"state":10,"team":0},{"nickname":"Ford_j_Ford","username":"Ford_j_Ford","group":"default","active":1,"state":10,"team":5},{"nickname":"Hi-im-jimmy","username":"Hi-im-jimmy","group":"Member+1","active":1,"state":10,"team":3},{"nickname":"Biofighter","username":"Biofighter","group":"default","active":1,"state":10,"team":0}],"rules":{"AutoSave":0,"DisableBuild":0,"DisableClownBombs":0,"DisableDungeonGuardian":0,"DisableInvisPvP":1,"DisableSnowBalls":0,"DisableTombstones":1,"EnableWhitelist":0,"HardcoreOnly":0,"PvPMode":"normal","SpawnProtection":1,"SpawnProtectionRadius":325,"ServerSideInventory":0},"serverversion":"v1.3.2.1","uptime":"8.15:10:51","world":"ShadowRain ~ VII"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Terraria/2_response.txt b/gameq/tests/Protocols/Providers/Terraria/2_response.txt new file mode 100644 index 0000000..e69de29 diff --git a/gameq/tests/Protocols/Providers/Terraria/2_result.json b/gameq/tests/Protocols/Providers/Terraria/2_result.json new file mode 100644 index 0000000..3b2f333 --- /dev/null +++ b/gameq/tests/Protocols/Providers/Terraria/2_result.json @@ -0,0 +1 @@ +{"216.52.143.248:7777":{"gq_address":"216.52.143.248","gq_joinlink":"steam:\/\/connect\/216.52.143.248:7777\/","gq_name":"Terraria","gq_online":false,"gq_port_client":7777,"gq_port_query":7878,"gq_protocol":"tshock","gq_transport":"tcp","gq_type":"terraria"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Tf2/1_response.txt b/gameq/tests/Protocols/Providers/Tf2/1_response.txt new file mode 100644 index 0000000..20a7879 Binary files /dev/null and b/gameq/tests/Protocols/Providers/Tf2/1_response.txt differ diff --git a/gameq/tests/Protocols/Providers/Tf2/1_result.json b/gameq/tests/Protocols/Providers/Tf2/1_result.json new file mode 100644 index 0000000..37872da --- /dev/null +++ b/gameq/tests/Protocols/Providers/Tf2/1_result.json @@ -0,0 +1 @@ +{"74.91.119.154:27016":{"amplifier_version":"2.4","backpack_tf_version":"2.10.0A","connect_version":"1.2.0","coop":"0","deathmatch":"1","decalfrequency":"15","dedicated":"d","dosp_version":"1.0.0.0","enhanced_items_version":"1.0.0A","ff2_version":"1.07 beta 5","ftauntlimit_version":"1.2","game_descr":"Freak Fortress 2 (1.07 beta 5)","game_dir":"tf","game_id":440,"gameme_plugin_version":"4.2","gameme_webpage":"http:\/\/www.gameme.com","goomba_version":"2.0.2","gq_address":"74.91.119.154","gq_joinlink":"steam:\/\/connect\/74.91.119.154:27016\/","gq_name":"Team Fortress 2","gq_online":true,"gq_port_client":"27016","gq_port_query":27016,"gq_protocol":"source","gq_transport":"udp","gq_type":"tf2","hostname":"-[DISC-FF.com]- |24\/7 Freak Fortress #1| [Amp\/Crits\/RTD]","keywords":"increased_maxplayers,arena,alltalk,FastDL,24\/7,Boss,Custom,FREE,Freak,FF2,HHH,Saxton,Freak Fortress,Fun,VSH,Hale,Pony,Furry,XXX","map":"vsh_2fortdesk_v8","max_players":32,"mce_version":"1.10.2","metamod_version":"1.10.4-devV","mp_allowNPCs":"1","mp_autocrosshair":"1","mp_autoteambalance":"1","mp_disable_respawn_times":"0","mp_fadetoblack":"0","mp_falldamage":"1","mp_flashlight":"1","mp_footsteps":"1","mp_forceautoteam":"0","mp_forcerespawn":"0","mp_fraglimit":"0","mp_friendlyfire":"0","mp_highlander":"0","mp_holiday_nogifts":"0","mp_match_end_at_timelimit":"0","mp_maxrounds":"0","mp_respawnwavetime":"10.0","mp_scrambleteams_auto":"1","mp_scrambleteams_auto_windifference":"2","mp_stalemate_enable":"0","mp_stalemate_meleeonly":"0","mp_teamlist":"hgrunt;scientist","mp_teamplay":"0","mp_timelimit":"30","mp_tournament":"0","mp_tournament_stopwatch":"1","mp_weaponstay":"0","mp_windifference":"0","mp_windifference_min":"0","mp_winlimit":"0","ne_version":"1.10.0","nextlevel":"","num_bots":0,"num_players":32,"num_rules":188,"os":"w","password":0,"player_analytics_version":"1.1.0A","players":[{"id":0,"name":"\u00a4DLq\u00a4\u2122 Snivy 2","score":0,"time":11011.298828125},{"id":0,"name":"JawlessBullet","score":17,"time":9825.82421875},{"id":0,"name":"TheMasterSnake |USSR|","score":0,"time":8480.6689453125},{"id":0,"name":"s\u01dd\u01dd\u028c","score":1,"time":8210.12890625},{"id":0,"name":"SMURFASAURUS","score":0,"time":7305.18359375},{"id":0,"name":"Santa's Brother","score":0,"time":5812.4462890625},{"id":0,"name":"Danny De Ditto","score":12,"time":5206.177734375},{"id":0,"name":"Beaver","score":0,"time":5038.1723632812},{"id":0,"name":"\u2603Frostbite","score":0,"time":4806.0766601562},{"id":0,"name":"Super Fresh","score":0,"time":4596.3759765625},{"id":0,"name":"Grzegorz Brzeczyszczykiewicz","score":0,"time":4013.5083007812},{"id":0,"name":"-[FF]-LoLoLoLoLoL","score":0,"time":3888.9562988281},{"id":0,"name":"BigZulu","score":24,"time":3050.3459472656},{"id":0,"name":"Fox Alisa","score":16,"time":2214.6291503906},{"id":0,"name":"Darksamus187","score":0,"time":1919.1916503906},{"id":0,"name":"Uh Huh Hunny.pp","score":2,"time":1546.5238037109},{"id":0,"name":"TinnyKitty","score":1,"time":1407.3640136719},{"id":0,"name":"\u2764\u2620\u2764\u0466$\u0126\u2112\u20ac\u00a5\u2764\u2620\u2764","score":1,"time":1364.2371826172},{"id":0,"name":"bohmann","score":0,"time":1100.2387695312},{"id":0,"name":"Gandolf Rodriguez","score":0,"time":1093.7109375},{"id":0,"name":"JDX|>\u0420\u0443\u0441\u0441\u043a\u0438\u0439","score":0,"time":976.82684326172},{"id":0,"name":"I'm not Pencil","score":0,"time":850.47485351562},{"id":0,"name":"[NTG] Darrel","score":0,"time":748.6689453125},{"id":0,"name":"BarnsAreSafe","score":0,"time":731.89916992188},{"id":0,"name":"darkfan137","score":0,"time":548.47863769531},{"id":0,"name":"Fein","score":0,"time":532.72625732422},{"id":0,"name":"PhantKGul","score":0,"time":463.80426025391},{"id":0,"name":"Redstiza","score":0,"time":461.08813476562},{"id":0,"name":"","score":0,"time":264.21487426758},{"id":0,"name":"","score":0,"time":9.3347358703613},{"id":0,"name":"","score":0,"time":9.2979125976562},{"id":0,"name":"","score":0,"time":6.2301688194275}],"playertrails_version":"1.0.8.2","port":27016,"protocol":17,"r_AirboatViewDampenDamp":"1.0","r_AirboatViewDampenFreq":"7.0","r_AirboatViewZHeight":"0.0","r_JeepViewDampenDamp":"1.0","r_JeepViewDampenFreq":"7.0","r_JeepViewZHeight":"10.0","r_VehicleViewDampen":"1","rtve_version":"1.10.0","sb_version":"1.4.11","scp_version":"1.1.4-fix","secure":1,"short_circuit_nerf_version":"1.0.2A","sm_adv_version":"0.16","sm_advertisements_version":"0.5.6","sm_afkmanager_version":"1.1.3","sm_al_version":"1.0","sm_betherobot_version":"1.31","sm_bhats_version":"1.9","sm_classrestrict_version":"0.6","sm_crashlogger_version":"2.0.0","sm_destroy_version":"1.2.0","sm_dog_version":"1.12.13","sm_downloader_version":"1.4","sm_extendedcomm_version":"3.0.8b","sm_fakedownloadurl_version":"1.0","sm_funcommandsx_version":"2.3","sm_helpmenu_version":"0.3","sm_irs_version":"2.0.8","sm_logo_version":"2.2","sm_menu2_version":"0.3","sm_needlejump_version":"1.0","sm_nextmap":"vsh_dunes_b2","sm_nobuildzones_version":"1.0","sm_observerpoint_version":"1.0.100","sm_resizehead_version":"1.1.0","sm_rplayer_version":"1.0","sm_rtd_version":"0.4.3.3","sm_safezones_version":"3.0.0","sm_shortcuts_version":"1.0.0","sm_spawnprot_version":"1.6.3","sm_spec_target_version":"1.0.1","sm_spray_version":"5.8a","sm_tidychat_version":"0.4","sm_tmedicrubber_version":"0.2.0","sm_updater_version":"1.1.5","sm_warn_version":"1.0.7","smac_version":"0.8.0.9","sourcemod_version":"1.6.4-dev+4608","steam_id":85568392920039968,"steamappid":440,"steamtools_version":"0.8.3","stripper_version":"1.2.2","sv_accelerate":"10","sv_airaccelerate":"10","sv_alltalk":"1","sv_bounce":"0","sv_cheats":"0","sv_contact":"","sv_footsteps":"1","sv_friction":"4","sv_gravity":"800","sv_maxspeed":"320","sv_maxusrcmdprocessticks":"24","sv_noclipaccelerate":"5.000000","sv_noclipspeed":"5.000000","sv_password":"0","sv_pausable":"0","sv_registration_message":"No account specified","sv_registration_successful":"0","sv_rollangle":"0","sv_rollspeed":"200","sv_specaccelerate":"5","sv_specnoclip":"1","sv_specspeed":"3","sv_steamgroup":"","sv_stepsize":"18","sv_stopspeed":"100","sv_tags":"increased_maxplayers,arena,alltalk,FastDL,24\/7,Boss,Custom,FREE,Freak,FF2,HHH,Saxton,Freak Fortress,Fun,VSH,Hale,Pony,Furry,XXX","sv_voiceenable":"1","sv_vote_quorum_ratio":"0.6","sv_wateraccelerate":"10","sv_waterfriction":"1","tails_admin":"0","tails_admin_flags":"s","tails_admin_override":"0","tails_announce":"0","tails_announce_plugin":"0","tails_blocktriggers":"1","tails_delayonspawn":"0.1","tails_force_admins":"0","tails_force_users":"0","tails_version":"1.0.0","teamjoin_version":"1.0","tf2attributes_version":"1.1.1","tf2items_manager":"1","tf2items_manager_version":"1.4.1","tf2items_version":"1.5.3","tf_allow_player_use":"0","tf_arena_change_limit":"1","tf_arena_first_blood":"0","tf_arena_force_class":"0","tf_arena_max_streak":"3","tf_arena_override_cap_enable_time":"-1","tf_arena_preround_time":"10","tf_arena_round_time":"0","tf_arena_use_queue":"0","tf_beta_content":"0","tf_birthday":"0","tf_bot_count":"0","tf_classlimit":"0","tf_ctf_bonus_time":"10","tf_damage_disablespread":"0","tf_force_holidays_off":"0","tf_gamemode_arena":"1","tf_gamemode_cp":"0","tf_gamemode_ctf":"0","tf_gamemode_mvm":"0","tf_gamemode_payload":"0","tf_gamemode_rd":"0","tf_gamemode_sd":"0","tf_max_charge_speed":"750","tf_medieval":"0","tf_medieval_autorp":"1","tf_mm_servermode":"0","tf_mm_strict":"0","tf_mm_trusted":"0","tf_mvm_death_penalty":"0","tf_mvm_min_players_to_start":"3","tf_overtime_nag":"0","tf_player_name_change_time":"60","tf_playergib":"1","tf_powerup_mode":"0","tf_server_identity_disable_quickplay":"0","tf_spells_enabled":"0","tf_teamtalk":"1","tf_use_fixed_weaponspreads":"0","tf_weapon_criticals":"1","tf_weapon_criticals_melee":"1","thirdperson_version":"2.1.0","tv_enable":"0","tv_password":"0","tv_relaypassword":"0","version":"2621505"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Tf2/2_response.txt b/gameq/tests/Protocols/Providers/Tf2/2_response.txt new file mode 100644 index 0000000..2f02599 Binary files /dev/null and b/gameq/tests/Protocols/Providers/Tf2/2_response.txt differ diff --git a/gameq/tests/Protocols/Providers/Tf2/2_result.json b/gameq/tests/Protocols/Providers/Tf2/2_result.json new file mode 100644 index 0000000..dda2c03 --- /dev/null +++ b/gameq/tests/Protocols/Providers/Tf2/2_result.json @@ -0,0 +1 @@ +{"66.150.155.26:27015":{"amplifier_version":"2.4","basicdonator_recog_v":"0.5","basicdonator_version":"0.4","coop":"0","deathmatch":"1","decalfrequency":"10","dedicated":"d","f_mindcontrol_version":"1.0.1","ff2_boss_toggle_version":"1.0.1","ff2_version":"1.10.3 Beta","game_descr":"TF2x10 v1.3.9","game_dir":"tf","game_id":440,"goomba_version":"2.0.2","gq_address":"66.150.155.26","gq_joinlink":"steam:\/\/connect\/66.150.155.26:27015\/","gq_name":"Team Fortress 2","gq_online":true,"gq_port_client":"27015","gq_port_query":27015,"gq_protocol":"source","gq_transport":"udp","gq_type":"tf2","hostname":"[TFF] Saxton Hale Multiplied By 10! #3 FastDL|TauntCrits|Amp","keywords":"increased_maxplayers,nocrits,alltalk,HHH,arena,b,bonkboy,chozo,f2p,fastdl,ff2,ff2,freak fotress,free,fun,hale,items,my,saxton,s","map":"vsh_oilrig_v18","max_players":30,"mce_version":"1.10.2","metamod_version":"1.10.4-devV","mp_allowNPCs":"1","mp_autocrosshair":"1","mp_autoteambalance":"1","mp_disable_respawn_times":"0","mp_fadetoblack":"0","mp_falldamage":"0","mp_flashlight":"0","mp_footsteps":"1","mp_forceautoteam":"0","mp_forcerespawn":"1","mp_fraglimit":"0","mp_friendlyfire":"0","mp_highlander":"0","mp_holiday_nogifts":"0","mp_match_end_at_timelimit":"0","mp_maxrounds":"0","mp_respawnwavetime":"10.0","mp_scrambleteams_auto":"1","mp_scrambleteams_auto_windifference":"2","mp_stalemate_enable":"0","mp_stalemate_meleeonly":"0","mp_teamlist":"hgrunt;scientist","mp_teamplay":"0","mp_timelimit":"35","mp_tournament":"0","mp_tournament_stopwatch":"1","mp_weaponstay":"0","mp_windifference":"0","mp_windifference_min":"0","mp_winlimit":"0","ne_version":"1.10.0","nextlevel":"","num_bots":0,"num_players":26,"num_rules":188,"os":"l","password":0,"players":[{"id":0,"name":"F2P SCOUT NOOB","score":0,"time":5439.0107421875},{"id":0,"name":"Mr.Engiener","score":4,"time":5279.771484375},{"id":0,"name":"Dr. NOPE.avi","score":21,"time":5272.1967773438},{"id":0,"name":"ScooBySnaCk of TWFAME","score":1,"time":5235.8491210938},{"id":0,"name":"Microsoft Word","score":0,"time":5001.2490234375},{"id":0,"name":"carl.rhodes2","score":0,"time":4921.8540039062},{"id":0,"name":"Princess Twilightlicious","score":22,"time":4728.6782226562},{"id":0,"name":"popdan40 :3","score":0,"time":3859.8715820312},{"id":0,"name":"Asnem","score":0,"time":3476.8681640625},{"id":0,"name":"Killernova88","score":0,"time":2951.5090332031},{"id":0,"name":"Kumatora","score":0,"time":2228.5009765625},{"id":0,"name":"Dildo Swaggins","score":0,"time":2228.4560546875},{"id":0,"name":"TNT8770","score":0,"time":2207.6999511719},{"id":0,"name":"Major_Trouble\u2122","score":0,"time":2164.1550292969},{"id":0,"name":"\uff33\uff2f\uff32\uff34\uff21\uff28\uff35\uff2d\uff21\uff2e","score":22,"time":2119.3647460938},{"id":0,"name":"Murkip","score":0,"time":2090.3549804688},{"id":0,"name":"Bacon","score":0,"time":1758.5524902344},{"id":0,"name":"\u25cfBubby\u25cf","score":4,"time":1651.3779296875},{"id":0,"name":"Ten-thousand angry Ikea chairs","score":0,"time":1455.4056396484},{"id":0,"name":"FrozenFire","score":1,"time":1411.9206542969},{"id":0,"name":"blotz","score":0,"time":1227.060546875},{"id":0,"name":"PhirePhox","score":0,"time":1184.9351806641},{"id":0,"name":"Kawaiitous The Spectavous\u2122","score":0,"time":1128.4151611328},{"id":0,"name":"Kaboodlesque","score":0,"time":988.27008056641},{"id":0,"name":"\u272aTURG\u272a potato senpai","score":0,"time":677.12896728516},{"id":0,"name":"","score":0,"time":47.864902496338}],"port":27015,"protocol":17,"r_AirboatViewDampenDamp":"1.0","r_AirboatViewDampenFreq":"7.0","r_AirboatViewZHeight":"0.0","r_JeepViewDampenDamp":"1.0","r_JeepViewDampenFreq":"7.0","r_JeepViewZHeight":"10.0","r_VehicleViewDampen":"1","regexfilter_enable":"1","rtve_version":"1.10.0","sb_version":"2.0.0-dev","secure":1,"sm_adminsmite_version":"2.1","sm_adv_version":"0.16","sm_afkm_version":"3.5.3","sm_betherobot_version":"1.3","sm_bethesaxton_version":"1.0","sm_bhats_version":"1.7","sm_buildcolor_v":"0.1","sm_calladmin_steam_version":"0.1.4","sm_calladmin_version":"0.1.4","sm_classrestrict_version":"0.6","sm_disguisexpert_version":"1.0.4","sm_donatorsinfo_version":"1.0Beta","sm_downloader_version":"1.4","sm_evilrocket_version":"1.0.110","sm_fakeandforce_version":"2.0","sm_homingrocket":"2409","sm_hr_accuracy":"1","sm_hr_adminflag":"","sm_hr_debug":"0","sm_hr_enable":"1","sm_hr_forcehoming":"1","sm_hr_launchers":"18;513;441","sm_hr_lifetime":"10","sm_hr_lifetimemode":"1","sm_hr_mode":"3","sm_hr_mvm_disabler":"1","sm_hr_saccuracy":"3","sm_hr_sforcehoming":"0","sm_hr_showaim":"1","sm_hr_sshowaim":"1","sm_killstreak_amount":"10","sm_ks_version":"1.7","sm_nextmap":"vsh_crevice_north_pole","sm_resize_version":"1.5.1","sm_respawn_version":"1.2","sm_tf2ii_version":"1.9.1","sm_updater_version":"1.2.1","sourcemod_version":"1.6.3-dev+4588","steam_id":90094324941053957,"steamappid":440,"steamtools_version":"0.8.3","stripper_version":"1.2.2","sv_accelerate":"10","sv_airaccelerate":"10","sv_alltalk":"1","sv_bounce":"0","sv_cheats":"0","sv_contact":"","sv_footsteps":"1","sv_friction":"4","sv_gravity":"800","sv_maxspeed":"320","sv_maxusrcmdprocessticks":"24","sv_noclipaccelerate":"5","sv_noclipspeed":"5","sv_password":"0","sv_pausable":"0","sv_registration_message":"No account specified","sv_registration_successful":"0","sv_rollangle":"0","sv_rollspeed":"200","sv_specaccelerate":"5","sv_specnoclip":"1","sv_specspeed":"3","sv_steamgroup":"","sv_stepsize":"18","sv_stopspeed":"100","sv_tags":"increased_maxplayers,nocrits,alltalk,HHH,arena,b,bonkboy,chozo,f2p,fastdl,ff2,ff2,freak fotress,free,fun,hale,items,my,saxton,s","sv_voiceenable":"1","sv_vote_quorum_ratio":"0.6","sv_wateraccelerate":"10","sv_waterfriction":"1","tf2attributes_version":"1.1.1","tf2items_giveweapon_version":"3.14159","tf2items_manager":"1","tf2items_manager_version":"1.4.1","tf2items_rnd_enabled":"0","tf2items_rnd_normals":"0","tf2items_rnd_version":"1.59","tf2items_version":"1.6.0","tf2x10_version":"1.3.9","tf_allow_player_use":"0","tf_arena_change_limit":"1","tf_arena_first_blood":"0","tf_arena_force_class":"0","tf_arena_max_streak":"3","tf_arena_override_cap_enable_time":"-1","tf_arena_preround_time":"10","tf_arena_round_time":"0","tf_arena_use_queue":"0","tf_beta_content":"0","tf_birthday":"0","tf_bot_count":"0","tf_classlimit":"0","tf_ctf_bonus_time":"10","tf_damage_disablespread":"0","tf_force_holidays_off":"0","tf_gamemode_arena":"1","tf_gamemode_cp":"0","tf_gamemode_ctf":"0","tf_gamemode_mvm":"0","tf_gamemode_payload":"0","tf_gamemode_rd":"0","tf_gamemode_sd":"0","tf_max_charge_speed":"750","tf_medieval":"0","tf_medieval_autorp":"1","tf_mm_servermode":"0","tf_mm_strict":"0","tf_mm_trusted":"0","tf_models_admin_flags":"b","tf_models_admin_override":"0","tf_models_announce":"1","tf_models_announce_plugin":"1","tf_models_blocktriggers":"1","tf_models_delayonspawn":"0.1","tf_models_force_admins":"0","tf_models_force_users":"0","tf_models_list":"tf2_modellist","tf_models_version":"1.0.4","tf_mvm_death_penalty":"0","tf_mvm_min_players_to_start":"3","tf_overtime_nag":"0","tf_player_name_change_time":"60","tf_playergib":"1","tf_powerup_mode":"0","tf_server_identity_disable_quickplay":"0","tf_spells_enabled":"0","tf_teamtalk":"0","tf_use_fixed_weaponspreads":"0","tf_weapon_criticals":"0","tf_weapon_criticals_melee":"1","train_rain_version":"1.0.1","tv_enable":"0","tv_password":"0","tv_relaypassword":"0","version":"2621505"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Theforrest/1_response.txt b/gameq/tests/Protocols/Providers/Theforrest/1_response.txt new file mode 100644 index 0000000..45c9cd1 Binary files /dev/null and b/gameq/tests/Protocols/Providers/Theforrest/1_response.txt differ diff --git a/gameq/tests/Protocols/Providers/Theforrest/1_result.json b/gameq/tests/Protocols/Providers/Theforrest/1_result.json new file mode 100644 index 0000000..5708bd3 --- /dev/null +++ b/gameq/tests/Protocols/Providers/Theforrest/1_result.json @@ -0,0 +1 @@ +{"24.144.44.247:27015":{"gq_address":"24.144.44.247","gq_joinlink":"steam:\/\/connect\/24.144.44.247:27015\/","gq_name":"The Forrest","gq_online":true,"gq_port_client":27015,"gq_port_query":27016,"gq_protocol":"source","gq_transport":"udp","gq_type":"theforrest","num_players":0}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Theforrest/2_response.txt b/gameq/tests/Protocols/Providers/Theforrest/2_response.txt new file mode 100644 index 0000000..5a662db Binary files /dev/null and b/gameq/tests/Protocols/Providers/Theforrest/2_response.txt differ diff --git a/gameq/tests/Protocols/Providers/Theforrest/2_result.json b/gameq/tests/Protocols/Providers/Theforrest/2_result.json new file mode 100644 index 0000000..a133d94 --- /dev/null +++ b/gameq/tests/Protocols/Providers/Theforrest/2_result.json @@ -0,0 +1 @@ +{"23.236.224.146:27015":{"dedicated":"d","game_descr":"The Forest","game_dir":"theforestDS","game_id":242760,"gq_address":"23.236.224.146","gq_joinlink":"steam:\/\/connect\/23.236.224.146:27015\/","gq_name":"The Forrest","gq_online":true,"gq_port_client":27015,"gq_port_query":27016,"gq_protocol":"source","gq_transport":"udp","gq_type":"theforrest","hostname":"DharmaForest DISCORD.IO\/DHARMA FOR PASSWORD","keywords":"05cdd6e8-2e67-4234-9f47-f1d70c6de547;__F8D92429D0A2FDA91C89C97A6A17F96C378BAB96149E0C7B24686C81E68C3609","map":"Normal","max_players":50,"num_bots":0,"num_players":0,"os":"w","password":1,"port":27015,"protocol":17,"secure":1,"steam_id":85568392921787049,"steamappid":0,"version":"0.11.3.0.0"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Tibia/1_response.txt b/gameq/tests/Protocols/Providers/Tibia/1_response.txt new file mode 100644 index 0000000..24f3041 --- /dev/null +++ b/gameq/tests/Protocols/Providers/Tibia/1_response.txt @@ -0,0 +1,2 @@ + +Welcome to NoxiousOT! diff --git a/gameq/tests/Protocols/Providers/Tibia/1_result.json b/gameq/tests/Protocols/Providers/Tibia/1_result.json new file mode 100644 index 0000000..5dce614 --- /dev/null +++ b/gameq/tests/Protocols/Providers/Tibia/1_result.json @@ -0,0 +1 @@ +{"172.93.109.58:7171":{"client":"8.60","dedicated":1,"gq_address":"172.93.109.58","gq_joinlink":"otserv:\/\/172.93.109.58\/7171\/","gq_name":"Tibia","gq_online":true,"gq_port_client":7171,"gq_port_query":7171,"gq_protocol":"tibia","gq_transport":"tcp","gq_type":"tibia","ip":"172.93.109.58","location":"United States","map_author":"Noxious Staff","map_height":"33024","map_name":"World.otbm","map_width":"33536","monsters_total":"52643","motd":"Welcome to NoxiousOT!","npcs_total":"690","owner_email":"support@noxiousot.com","owner_name":"Noxious Staff","players_max":"1000","players_online":"246","players_peak":"779","port":"7171","server":"OTMG","servername":"NoxiousOT 8.60","uptime":"2404686","url":"noxiousot.com","version":"V1 - 8.60 Real Map"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Tibia/2_response.txt b/gameq/tests/Protocols/Providers/Tibia/2_response.txt new file mode 100644 index 0000000..f0220a4 --- /dev/null +++ b/gameq/tests/Protocols/Providers/Tibia/2_response.txt @@ -0,0 +1,2 @@ + +Welcome to Deathzot II! diff --git a/gameq/tests/Protocols/Providers/Tibia/2_result.json b/gameq/tests/Protocols/Providers/Tibia/2_result.json new file mode 100644 index 0000000..8836850 --- /dev/null +++ b/gameq/tests/Protocols/Providers/Tibia/2_result.json @@ -0,0 +1 @@ +{"192.99.32.220:7171":{"client":"8.6","dedicated":1,"gq_address":"192.99.32.220","gq_joinlink":"otserv:\/\/192.99.32.220\/7171\/","gq_name":"Tibia","gq_online":true,"gq_port_client":7171,"gq_port_query":7171,"gq_protocol":"tibia","gq_transport":"tcp","gq_type":"tibia","ip":"192.99.32.220","location":"USA","map_author":"Komic","map_height":"5000","map_name":"WORKING.otbm","map_width":"5000","monsters_total":"12898","motd":"Welcome to Deathzot II!","npcs_total":"64","owner_email":"admin@deathzot.net","owner_name":"Xagul Synthetic","players_max":"500","players_online":"14","players_peak":"334","port":"7171","server":"The Forgotten Server","servername":"Deathzot II","uptime":"2866200","url":"http:\/\/deathzot.net\/","version":"0.4_SVN"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Unturned/1_response.txt b/gameq/tests/Protocols/Providers/Unturned/1_response.txt new file mode 100644 index 0000000..54a1fa3 Binary files /dev/null and b/gameq/tests/Protocols/Providers/Unturned/1_response.txt differ diff --git a/gameq/tests/Protocols/Providers/Unturned/1_result.json b/gameq/tests/Protocols/Providers/Unturned/1_result.json new file mode 100644 index 0000000..10b5871 --- /dev/null +++ b/gameq/tests/Protocols/Providers/Unturned/1_result.json @@ -0,0 +1 @@ +{"66.150.155.127:27015":{"dedicated":"d","game_descr":"Unturned","game_dir":"Unturned","game_id":304930,"gq_address":"66.150.155.127","gq_joinlink":"steam:\/\/connect\/66.150.155.127:27015\/","gq_name":"Unturned","gq_online":true,"gq_port_client":27015,"gq_port_query":27016,"gq_protocol":"source","gq_transport":"udp","gq_type":"unturned","hostname":"GGZ Reborn |TPA|KITS|24\/7|PVP|BeOneOfUs!","keywords":"PVP,NORMAL,BOTH,KROW","map":"Washington","max_players":24,"num_bots":1,"num_players":14,"num_rules":2,"os":"w","password":0,"players":[{"id":0,"name":"Blazone","score":1,"time":1642.0865478516},{"id":0,"name":"silentNviolent #sNv","score":0,"time":1532.4891357422},{"id":0,"name":"Rosbriel","score":0,"time":1373.6436767578},{"id":0,"name":"justinhusack","score":0,"time":1230.3295898438},{"id":0,"name":"ixamom","score":0,"time":852.20330810547},{"id":0,"name":"mongobird09","score":0,"time":851.12176513672},{"id":0,"name":"Mervlol","score":0,"time":782.17944335938},{"id":0,"name":"DonGaming | LucarioGamez","score":0,"time":740.96398925781},{"id":0,"name":"Pastor","score":0,"time":566.32922363281},{"id":0,"name":"rybroskeez","score":0,"time":260.33071899414},{"id":0,"name":"Table","score":1,"time":236.27554321289},{"id":0,"name":"Kyotekote","score":0,"time":173.99436950684},{"id":0,"name":"[KNK]Edosvaldo","score":0,"time":22.567728042603},{"id":0,"name":"HallenKey","score":0,"time":10.648074150085}],"port":27015,"protocol":17,"rocket":"4.8.0.1","rocketplugins":"AutoShutdown2,DeathMessages,GlobalBan,Kits,MessageAnnouncer,RocketMod_TPA,Uconomy,Votifier,Warps,WreckingBall,ZaupFeast,ZaupHomeCommand,ZaupUconomyEssentials","secure":1,"steam_id":90098960477970435,"steamappid":0,"version":"3.13.11.2"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Unturned/2_response.txt b/gameq/tests/Protocols/Providers/Unturned/2_response.txt new file mode 100644 index 0000000..a8ba222 Binary files /dev/null and b/gameq/tests/Protocols/Providers/Unturned/2_response.txt differ diff --git a/gameq/tests/Protocols/Providers/Unturned/2_result.json b/gameq/tests/Protocols/Providers/Unturned/2_result.json new file mode 100644 index 0000000..7f28ba3 --- /dev/null +++ b/gameq/tests/Protocols/Providers/Unturned/2_result.json @@ -0,0 +1 @@ +{"209.58.178.236:25444":{"dedicated":"d","game_descr":"Unturned","game_dir":"Unturned","game_id":304930,"gq_address":"209.58.178.236","gq_joinlink":"steam:\/\/connect\/209.58.178.236:25444\/","gq_name":"Unturned","gq_online":true,"gq_port_client":25444,"gq_port_query":25445,"gq_protocol":"source","gq_transport":"udp","gq_type":"unturned","hostname":"GGZ Ultima |TPA|KITS|SHOP|24\/7|PVP|BeOneOfUs!","keywords":"PVP,NORMAL,BOTH,KROW","map":"PEI","max_players":24,"num_bots":1,"num_players":9,"num_rules":2,"os":"w","password":0,"players":[{"id":0,"name":"†B†","score":0,"time":5021.69921875},{"id":0,"name":"montie","score":0,"time":4439.46875},{"id":0,"name":"dersu gaming","score":0,"time":3873.4860839844},{"id":0,"name":"Wolf","score":1,"time":2634.2087402344},{"id":0,"name":"OH Camper","score":1,"time":2585.4035644531},{"id":0,"name":"Irsyad","score":0,"time":2246.6550292969},{"id":0,"name":"BE YOUR EVERYTHING<3","score":0,"time":2077.9357910156},{"id":0,"name":"Nazi Army","score":1,"time":1122.2104492188},{"id":0,"name":"oat_336","score":0,"time":48.402984619141}],"port":25444,"protocol":17,"rocket":"4.8.0.1","rocketplugins":"AutoShutdown2,DeathMessages,GlobalBan,Kits,MessageAnnouncer,RocketMod_TPA,Uconomy,Votifier,Warps,WreckingBall,ZaupFeast,ZaupHomeCommand,ZaupShop,ZaupUconomyEssentials","secure":1,"steam_id":90098960680751111,"steamappid":0,"version":"3.13.11.2"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Ut/1_response.txt b/gameq/tests/Protocols/Providers/Ut/1_response.txt new file mode 100644 index 0000000..15861d2 --- /dev/null +++ b/gameq/tests/Protocols/Providers/Ut/1_response.txt @@ -0,0 +1,5 @@ +\gamename\ut\gamever\451\minnetver\432\location\0\hostname\zp| [=======] [PURE] [INSTAGIB] [US] [=======] by www.unrealkillers.com\hostport\7777\maptitle\W00tabulous !@Fixed [Fixed by: Nugglan]\mapname\CTF-w00tabulousFixed\gametype\ACLCTFGame\numplayers\11\maxplayers\13\gamemode\openplaying\gamever\451\minnetver\432\worldlog\false\wantworldlog\false\mutators\SmartCTF 4E, Rextended CTF v2-4, XC Enhanced spectator\listenserver\False\password\False\timelimit\15\goalteamscore\0\minplayers\0\changelevels\True\maxteams\2\balanceteams\True\playersbalanceteams\True\friendlyfire\0%\tournament\False\gamestyle\Hardcore\AdminName\SAM\AdminEMail\admin@unrealkillers.com\player_0\akatotosh<3\frags_0\1\ping_0\ 152\team_0\1\mesh_0\Female Commando\skin_0\FCommandoSkins.cmdo\face_0\FCommandoSkins.Ivana\ngsecret_0\true\player_1\EnDleSs\frags_1\21\ping_1\ 152\team_1\0\mesh_1\Male Soldier\skin_1\SoldierSkins.hkil\face_1\SoldierSkins.tensor\ngsecret_1\true\queryid\20.1 +|| +\player_2\ResidentEvil\frags_2\719\ping_2\ 86\team_2\255\mesh_2\Spectator\skin_2\None\face_2\\ngsecret_2\true\player_3\pacmaN\frags_3\210\ping_3\ 122\team_3\0\mesh_3\Male Soldier\skin_3\SoldierSkins.Gard\face_3\SoldierSkins.Radkin\ngsecret_3\true\player_4\ImperatorAnd1\frags_4\88\ping_4\ 162\team_4\1\mesh_4\Male Soldier\skin_4\SoldierSkins.sldr\face_4\SoldierSkins.Brock\ngsecret_4\true\player_5\hmmmm\frags_5\780\ping_5\ 141\team_5\0\mesh_5\Male Commando\skin_5\CommandoSkins.cmdo\face_5\CommandoSkins.Blake\ngsecret_5\true\player_6\Ninja|Eddo*--\frags_6\449\ping_6\ 75\team_6\1\mesh_6\Male Commando\skin_6\CommandoSkins.cmdo\face_6\CommandoSkins.Blake\ngsecret_6\true\player_7\MOOG\frags_7\564\ping_7\ 118\team_7\1\mesh_7\Female Soldier\skin_7\SGirlSkins.Garf\face_7\SGirlSkins.Isis\ngsecret_7\true\player_8\Kacper\frags_8\574\ping_8\ 170\team_8\1\mesh_8\Male Commando\skin_8\CommandoSkins.daco\face_8\CommandoSkins.Ramirez\ngsecret_8\true\queryid\20.2 +|| +\player_9\Nap\frags_9\1162\ping_9\ 171\team_9\0\mesh_9\Male Soldier\skin_9\SoldierSkins.Blkt\face_9\SoldierSkins.Malcom\ngsecret_9\true\player_10\KindBud\frags_10\1439\ping_10\ 39\team_10\1\mesh_10\Female Soldier\skin_10\SGirlSkins.Garf\face_10\SGirlSkins.Isis\ngsecret_10\true\queryid\20.3\final\ \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Ut/1_result.json b/gameq/tests/Protocols/Providers/Ut/1_result.json new file mode 100644 index 0000000..c35abbb --- /dev/null +++ b/gameq/tests/Protocols/Providers/Ut/1_result.json @@ -0,0 +1 @@ +{"75.102.41.52:7777":{"AdminEMail":"admin@unrealkillers.com","AdminName":"SAM","balanceteams":"True","changelevels":"True","dedicated":true,"friendlyfire":"0%","gamemode":"openplaying","gamename":"ut","gamestyle":"Hardcore","gametype":"ACLCTFGame","gamever":"451","goalteamscore":"0","gq_address":"75.102.41.52","gq_joinlink":"","gq_name":"Unreal Tournament","gq_online":true,"gq_port_client":7777,"gq_port_query":7778,"gq_protocol":"gamespy","gq_transport":"udp","gq_type":"ut","hostname":"zp| [=======] [PURE] [INSTAGIB] [US] [=======] by www.unrealkillers.com","hostport":"7777","listenserver":"False","location":"0","mapname":"CTF-w00tabulousFixed","maptitle":"W00tabulous !@Fixed [Fixed by: Nugglan]","maxplayers":"13","maxteams":"2","minnetver":"432","minplayers":"0","mutators":"SmartCTF 4E, Rextended CTF v2-4, XC Enhanced spectator","num_players":0,"num_teams":0,"numplayers":"11","password":"False","players":[{"player":"akatotosh<3","frags":"1","ping":" 152","team":"1","mesh":"Female Commando","skin":"FCommandoSkins.cmdo","face":"FCommandoSkins.Ivana","ngsecret":"true"},{"player":"EnDleSs","frags":"21","ping":" 152","team":"0","mesh":"Male Soldier","skin":"SoldierSkins.hkil","face":"SoldierSkins.tensor","ngsecret":"true"},{"player":"Resident Evil±","frags":"719","ping":" 86","team":"255","mesh":"Spectator","skin":"None","face":"","ngsecret":"true"},{"player":"pacmaN","frags":"210","ping":" 122","team":"0","mesh":"Male Soldier","skin":"SoldierSkins.Gard","face":"SoldierSkins.Radkin","ngsecret":"true"},{"player":"ImperatorAnd1","frags":"88","ping":" 162","team":"1","mesh":"Male Soldier","skin":"SoldierSkins.sldr","face":"SoldierSkins.Brock","ngsecret":"true"},{"player":"hmmmm","frags":"780","ping":" 141","team":"0","mesh":"Male Commando","skin":"CommandoSkins.cmdo","face":"CommandoSkins.Blake","ngsecret":"true"},{"player":"Ninja|Eddo*--","frags":"449","ping":" 75","team":"1","mesh":"Male Commando","skin":"CommandoSkins.cmdo","face":"CommandoSkins.Blake","ngsecret":"true"},{"player":"MOOG","frags":"564","ping":" 118","team":"1","mesh":"Female Soldier","skin":"SGirlSkins.Garf","face":"SGirlSkins.Isis","ngsecret":"true"},{"player":"Kacper","frags":"574","ping":" 170","team":"1","mesh":"Male Commando","skin":"CommandoSkins.daco","face":"CommandoSkins.Ramirez","ngsecret":"true"},{"player":"Nap","frags":"1162","ping":" 171","team":"0","mesh":"Male Soldier","skin":"SoldierSkins.Blkt","face":"SoldierSkins.Malcom","ngsecret":"true"},{"player":"KindBud","frags":"1439","ping":" 39","team":"1","mesh":"Female Soldier","skin":"SGirlSkins.Garf","face":"SGirlSkins.Isis","ngsecret":"true"}],"playersbalanceteams":"True","timelimit":"15","tournament":"False","wantworldlog":"false","worldlog":"false"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Ut/2_response.txt b/gameq/tests/Protocols/Providers/Ut/2_response.txt new file mode 100644 index 0000000..ba0082f --- /dev/null +++ b/gameq/tests/Protocols/Providers/Ut/2_response.txt @@ -0,0 +1,5 @@ +\gamename\ut\gamever\451\minnetver\432\location\0\hostname\zp| * * * -=[SIEGE]=- |uK| The One Night Stand -=[SIEGE]=- Server * * * In Loving Memory of |uK|*STARS*\hostport\7777\maptitle\Bathrooms |uK| 4-Bases\mapname\CTF-[4]-'uK-Bathrooms][\gametype\SiegeGI\numplayers\14\maxplayers\23\gamemode\openplaying\gamever\451\minnetver\432\worldlog\false\wantworldlog\true\listenserver\False\password\False\timelimit\80\goalteamscore\30\minplayers\0\changelevels\True\maxteams\4\balanceteams\True\playersbalanceteams\True\friendlyfire\0%\tournament\False\gamestyle\Hardcore\AdminName\SAM\AdminEMail\admin@unrealkillers.com\player_0\earthangel.nl\frags_0\0\ping_0\ 111\team_0\1\mesh_0\Male Soldier\skin_0\SoldierSkins.sldr\face_0\SoldierSkins.Brock\ngsecret_0\false\player_1\}IN{_Spiderman\frags_1\40\ping_1\ 311\team_1\1\mesh_1\Female Soldier\skin_1\SGirlSkins.fwar\face_1\SGirlSkins.Fury\ngsecret_1\true\queryid\86.1 +|| +\player_2\911\frags_2\62\ping_2\ 152\team_2\0\mesh_2\Male Soldier\skin_2\SoldierSkins.RawS\face_2\SoldierSkins.Arkon\ngsecret_2\false\player_3\Girasol.\frags_3\225\ping_3\ 102\team_3\1\mesh_3\Female Commando\skin_3\FCommandoSkins.daco\face_3\FCommandoSkins.Jayce\ngsecret_3\false\player_4\Skarn\frags_4\42\ping_4\ 172\team_4\0\mesh_4\Male Commando\skin_4\CommandoSkins.daco\face_4\CommandoSkins.Graves\ngsecret_4\true\player_5\Ubuntu_test\frags_5\53\ping_5\ 197\team_5\0\mesh_5\Male Soldier\skin_5\SoldierSkins.hkil\face_5\SoldierSkins.tensor\ngsecret_5\false\player_6\Fabiolino\frags_6\132\ping_6\ 197\team_6\1\mesh_6\Male Soldier\skin_6\SoldierSkins.sldr\face_6\SoldierSkins.Rankin\ngsecret_6\false\player_7\][c~air][`Makc\frags_7\194\ping_7\ 157\team_7\0\mesh_7\Male Commando\skin_7\CommandoSkins.daco\face_7\CommandoSkins.Luthor\ngsecret_7\true\player_8\-=TRO=-\frags_8\103\ping_8\ 188\team_8\0\mesh_8\Female Commando\skin_8\FCommandoSkins.goth\face_8\FCommandoSkins.Cryss\ngsecret_8\true\queryid\86.2 +|| +\player_9\Jenya\frags_9\115\ping_9\ 153\team_9\1\mesh_9\Female Commando\skin_9\FCommandoSkins.cmdo\face_9\FCommandoSkins.Anna\ngsecret_9\false\player_10\EProg\frags_10\199\ping_10\ 277\team_10\0\mesh_10\Male Commando\skin_10\CommandoSkins.cmdo\face_10\CommandoSkins.Blake\ngsecret_10\false\player_11\CoD|JIgSaW\frags_11\653\ping_11\ 157\team_11\1\mesh_11\Male Commando\skin_11\CommandoSkins.daco\face_11\CommandoSkins.Graves\ngsecret_11\false\player_12\SophiasWisdom\frags_12\0\ping_12\ 37\team_12\255\mesh_12\Spectator\skin_12\None\face_12\\ngsecret_12\true\player_13\HIGH[+]*C4)v(1L0*\frags_13\342\ping_13\ 183\team_13\0\mesh_13\Female Soldier\skin_13\SGirlSkins.Army\face_13\SGirlSkins.Sara\ngsecret_13\false\queryid\86.3\final\ \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Ut/2_result.json b/gameq/tests/Protocols/Providers/Ut/2_result.json new file mode 100644 index 0000000..cf71027 --- /dev/null +++ b/gameq/tests/Protocols/Providers/Ut/2_result.json @@ -0,0 +1 @@ +{"75.102.40.198:7777":{"AdminEMail":"admin@unrealkillers.com","AdminName":"SAM","balanceteams":"True","changelevels":"True","dedicated":true,"friendlyfire":"0%","gamemode":"openplaying","gamename":"ut","gamestyle":"Hardcore","gametype":"SiegeGI","gamever":"451","goalteamscore":"30","gq_address":"75.102.40.198","gq_joinlink":"","gq_name":"Unreal Tournament","gq_online":true,"gq_port_client":7777,"gq_port_query":7778,"gq_protocol":"gamespy","gq_transport":"udp","gq_type":"ut","hostname":"zp| * * * -=[SIEGE]=- |uK| The One Night Stand -=[SIEGE]=- Server * * * In Loving Memory of |uK|*STARS*","hostport":"7777","listenserver":"False","location":"0","mapname":"CTF-[4]-'uK-Bathrooms][","maptitle":"Bathrooms |uK| 4-Bases","maxplayers":"23","maxteams":"4","minnetver":"432","minplayers":"0","num_players":0,"num_teams":0,"numplayers":"14","password":"False","players":[{"player":"earthangel.nl","frags":"0","ping":" 111","team":"1","mesh":"Male Soldier","skin":"SoldierSkins.sldr","face":"SoldierSkins.Brock","ngsecret":"false"},{"player":"}IN{_Spiderman","frags":"40","ping":" 311","team":"1","mesh":"Female Soldier","skin":"SGirlSkins.fwar","face":"SGirlSkins.Fury","ngsecret":"true"},{"player":"911","frags":"62","ping":" 152","team":"0","mesh":"Male Soldier","skin":"SoldierSkins.RawS","face":"SoldierSkins.Arkon","ngsecret":"false"},{"player":"Girasol.","frags":"225","ping":" 102","team":"1","mesh":"Female Commando","skin":"FCommandoSkins.daco","face":"FCommandoSkins.Jayce","ngsecret":"false"},{"player":"Skarn","frags":"42","ping":" 172","team":"0","mesh":"Male Commando","skin":"CommandoSkins.daco","face":"CommandoSkins.Graves","ngsecret":"true"},{"player":"Ubuntu_test","frags":"53","ping":" 197","team":"0","mesh":"Male Soldier","skin":"SoldierSkins.hkil","face":"SoldierSkins.tensor","ngsecret":"false"},{"player":"Fabiolino","frags":"132","ping":" 197","team":"1","mesh":"Male Soldier","skin":"SoldierSkins.sldr","face":"SoldierSkins.Rankin","ngsecret":"false"},{"player":"][c~air][`Makc","frags":"194","ping":" 157","team":"0","mesh":"Male Commando","skin":"CommandoSkins.daco","face":"CommandoSkins.Luthor","ngsecret":"true"},{"player":"-=TRO=-","frags":"103","ping":" 188","team":"0","mesh":"Female Commando","skin":"FCommandoSkins.goth","face":"FCommandoSkins.Cryss","ngsecret":"true"},{"player":"Jenya","frags":"115","ping":" 153","team":"1","mesh":"Female Commando","skin":"FCommandoSkins.cmdo","face":"FCommandoSkins.Anna","ngsecret":"false"},{"player":"EProg","frags":"199","ping":" 277","team":"0","mesh":"Male Commando","skin":"CommandoSkins.cmdo","face":"CommandoSkins.Blake","ngsecret":"false"},{"player":"CoD|JIgSaW","frags":"653","ping":" 157","team":"1","mesh":"Male Commando","skin":"CommandoSkins.daco","face":"CommandoSkins.Graves","ngsecret":"false"},{"player":"SophiasWisdom","frags":"0","ping":" 37","team":"255","mesh":"Spectator","skin":"None","face":"","ngsecret":"true"},{"player":"HIGH[+]*C4)v(1L0*","frags":"342","ping":" 183","team":"0","mesh":"Female Soldier","skin":"SGirlSkins.Army","face":"SGirlSkins.Sara","ngsecret":"false"}],"playersbalanceteams":"True","timelimit":"80","tournament":"False","wantworldlog":"true","worldlog":"false"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Ut/3_response.txt b/gameq/tests/Protocols/Providers/Ut/3_response.txt new file mode 100644 index 0000000..4b6f728 --- /dev/null +++ b/gameq/tests/Protocols/Providers/Ut/3_response.txt @@ -0,0 +1 @@ +\gamename\ut\gamever\451\minnetver\436\location\0\hostname\ * * * UTzone.de * * * iCTF #1 [ P U R E NN INSTAGIB ] by DNW\hostport\11337\maptitle\Klondike Gold Rush\mapname\CTF-Klondike_LE15\gametype\CTFGame\numplayers\0\maxplayers\10\gamemode\openplaying\gamever\451\minnetver\436\worldlog\false\wantworldlog\false\mutators\UTCmds - Allows most ! commands, Custome flags: UTzoneflags, SmartCTF 4E, Map-Vote LA13, Custome flags: UTzoneflags, UTCmds - Allows most ! commands\listenserver\False\password\False\timelimit\15\goalteamscore\0\minplayers\2\changelevels\True\maxteams\2\balanceteams\True\playersbalanceteams\True\friendlyfire\0%\tournament\False\gamestyle\Hardcore\botskill\Average\AdminName\Donzi.UTzone\AdminEMail\Q-Net #UTzone\queryid\57.1\final\ \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Ut/3_result.json b/gameq/tests/Protocols/Providers/Ut/3_result.json new file mode 100644 index 0000000..ecf6e22 --- /dev/null +++ b/gameq/tests/Protocols/Providers/Ut/3_result.json @@ -0,0 +1 @@ +{"95.156.230.70:11337":{"AdminEMail":"Q-Net #UTzone","AdminName":"Donzi.UTzone","balanceteams":"True","botskill":"Average","changelevels":"True","dedicated":true,"friendlyfire":"0%","gamemode":"openplaying","gamename":"ut","gamestyle":"Hardcore","gametype":"CTFGame","gamever":"451","goalteamscore":"0","gq_address":"95.156.230.70","gq_joinlink":"","gq_name":"Unreal Tournament","gq_online":true,"gq_port_client":11337,"gq_port_query":11338,"gq_protocol":"gamespy","gq_transport":"udp","gq_type":"ut","hostname":" * * * UTzone.de * * * iCTF #1 [ P U R E NN INSTAGIB ] by DNW","hostport":"11337","listenserver":"False","location":"0","mapname":"CTF-Klondike_LE15","maptitle":"Klondike Gold Rush","maxplayers":"10","maxteams":"2","minnetver":"436","minplayers":"2","mutators":"UTCmds - Allows most ! commands, Custome flags: UTzoneflags, SmartCTF 4E, Map-Vote LA13, Custome flags: UTzoneflags, UTCmds - Allows most ! commands","num_players":0,"num_teams":0,"numplayers":"0","password":"False","playersbalanceteams":"True","timelimit":"15","tournament":"False","wantworldlog":"false","worldlog":"false"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Ut2004/1_response.txt b/gameq/tests/Protocols/Providers/Ut2004/1_response.txt new file mode 100644 index 0000000..509f338 Binary files /dev/null and b/gameq/tests/Protocols/Providers/Ut2004/1_response.txt differ diff --git a/gameq/tests/Protocols/Providers/Ut2004/1_result.json b/gameq/tests/Protocols/Providers/Ut2004/1_result.json new file mode 100644 index 0000000..5f3b869 --- /dev/null +++ b/gameq/tests/Protocols/Providers/Ut2004/1_result.json @@ -0,0 +1 @@ +{"199.175.53.150:7777":{"adminemail":"admin@odclan.net","adminname":"Galileo & Humble_Bob","anti tcc version":"2009R6","current game":"Sniper","endtimedelay":"2.00","forcerespawn":"False","game password":"false","gameport":7777,"gamespeed":"1.25","gamestats":"True","gametype":"xDeathMatch","goalscore":"28","gq_address":"199.175.53.150","gq_joinlink":"","gq_name":"Unreal Tournament 2004","gq_online":true,"gq_port_client":7777,"gq_port_query":7778,"gq_protocol":"unreal2","gq_transport":"udp","gq_type":"ut2004","kickvoting":"false","mapname":"\u001bøø@DM-Bathroom-SniperHeaven-2K9[Digital_Demonz_Edit]","mapvoting":"true","maxplayers":30,"maxspectators":"0","minplayers":"7","mutator":"ServerBots","mutator0":"MutAntiTCCFinal","mutator1":"MutZoomMod","mutator10":"Clan Manager 1h 6T","mutator11":"MutClanManager","mutator12":"SZO_Stealth_Trans","mutator13":"MutLowGrav","mutator14":"MutOLGameStats","mutator15":"CFWarningMut","mutator16":"MutUTAN","mutator2":"XCamperMut","mutator3":"ODCChatManager","mutator4":"ODC_SniperMut","mutator5":"DMMutator","mutator6":"ServerColor","mutator7":"MutODCOwnage","mutator8":"MutGameSpeed","mutator9":"MutUSSpawnProtect","numplayers":7,"ping":0,"players":[{"id":20,"name":"Math-Teacher","ping":152,"score":1},{"id":19,"name":"TRIVER","ping":192,"score":1},{"id":18,"name":"TxRufus","ping":68,"score":3},{"id":17,"name":"Spidey","ping":576,"score":1},{"id":10,"name":"CrZyCuBn","ping":52,"score":9},{"id":9,"name":"Jones_Jr.","ping":160,"score":13},{"id":8,"name":"{Wtf}Roland","ping":40,"score":19}],"queryport":0,"server os":"Unix-based","serverid":0,"serverip":false,"servermode":"dedicated","servername":"\u001bø@@Old Dudes\/Dames \u001b@@øSniper - \u001bøø@Campers Only","serverversion":"3369","tick rate":"44.80 \/ 45.00 max.","timelimit":"35","translocator":"True","ut2vote version":"5.9","weaponstay":"True"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Ut2004/2_response.txt b/gameq/tests/Protocols/Providers/Ut2004/2_response.txt new file mode 100644 index 0000000..9254d96 Binary files /dev/null and b/gameq/tests/Protocols/Providers/Ut2004/2_response.txt differ diff --git a/gameq/tests/Protocols/Providers/Ut2004/2_result.json b/gameq/tests/Protocols/Providers/Ut2004/2_result.json new file mode 100644 index 0000000..567a748 --- /dev/null +++ b/gameq/tests/Protocols/Providers/Ut2004/2_result.json @@ -0,0 +1 @@ +{"68.232.163.193:7777":{"adminemail":"","adminname":"igsclan.com","balanceteams":"True","endtimedelay":"4.00","forcerespawn":"False","friendlyfirescale":"0%","gameport":7777,"gamespeed":"1.25","gamestats":"True","gametype":"ONSOnslaughtGame","goalscore":"1","gq_address":"68.232.163.193","gq_joinlink":"","gq_name":"Unreal Tournament 2004","gq_online":true,"gq_port_client":7777,"gq_port_query":7778,"gq_protocol":"unreal2","gq_transport":"udp","gq_type":"ut2004","kickvoting":"true","linksetup":"Default","mapname":"ONS-AggressiveAlleys2k7-","mapvoting":"true","maxplayers":12,"maxspectators":"4","minplayers":"10","mutator":"IGS_SG_1Mut","mutator0":"DMMutator","mutator1":"Mut_SIG66_LR","mutator2":"MutWoRM_X","mutator3":"MutHyperLinkV3","mutator4":"","mutator5":"MutEliteMachine","mutator6":"Mut_IK_SIRRUSH","mutator7":"MutUTAN","mutator8":"EliteMachineGameRules","numplayers":10,"ping":0,"players":[{"id":17,"name":"ImA_Wreck","ping":68,"score":0},{"id":16,"name":"356c","ping":68,"score":0},{"id":15,"name":"TOOSWEET","ping":68,"score":70},{"id":12,"name":"Player","ping":76,"score":0},{"id":14,"name":"Groot","ping":100,"score":20},{"id":10,"name":"Thanos","ping":105,"score":17},{"id":9,"name":"Ironman","ping":75,"score":16},{"id":8,"name":"Iceman","ping":95,"score":15},{"id":7,"name":"Gunslinger","ping":65,"score":23},{"id":5,"name":"Storm","ping":90,"score":23},{"id":3,"name":"Starlord","ping":70,"score":13}],"playersbalanceteams":"True","queryport":0,"serverid":0,"serverip":false,"servermode":"dedicated","servername":"\u001bÿÿ\u0001\u0001\u0001www.IGSClan.com \u0001\u001b\u0001ÿ\u0001>>\u001bÿ\u0001\u0001 New-Skool-ONS \u001b\u0001ÿ\u0001<<","serverversion":"3369","timelimit":"15","translocator":"False","weaponstay":"True","{ik}eragon : by mrbee":"","{ik}eragon fire rate (moving)":"0.13","{ik}eragon fire rate (still)":"0.13","{ik}sig66 lr : by mrbee":"","{ik}sig66 lr fire rate (moving)":"0.12","{ik}sig66 lr fire rate (still)":"0.12"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Ut3/1_response.txt b/gameq/tests/Protocols/Providers/Ut3/1_response.txt new file mode 100644 index 0000000..abf933a Binary files /dev/null and b/gameq/tests/Protocols/Providers/Ut3/1_response.txt differ diff --git a/gameq/tests/Protocols/Providers/Ut3/1_result.json b/gameq/tests/Protocols/Providers/Ut3/1_result.json new file mode 100644 index 0000000..183d1ea --- /dev/null +++ b/gameq/tests/Protocols/Providers/Ut3/1_result.json @@ -0,0 +1 @@ +{"216.52.148.178:7777":{"AverageSkillRating":"1000.000000","EngineVersion":"3810","MinNetVersion":"3467","NumPublicConnections":"12","OwningPlayerId":"830","bIsDedicated":"True","bUsesStats":"True","bot_skill":"2","custom_mutators":["][ No Tags Mutator ][","UTCompIII v4 beta2","FreeFOV"],"force_respawn":"0","frag_limit":"50","gamemode":"0","gametype":"UTGame.UTDeathmatch","gq_address":"216.52.148.178","gq_joinlink":"","gq_name":"Unreal Tournament 3","gq_online":true,"gq_port_client":7777,"gq_port_query":6500,"gq_protocol":"gamespy3","gq_transport":"udp","gq_type":"ut3","hostname":".::.Beer Drinkers and Hell Raisers.::. - Chicago DM","hostport":"7777","mapname":"DM-Campgrounds-U3-Fix","maxplayers":"12","numbots":"2","numplayers":"1","open":"openplaying","p1073741829":"\u001cNoTagsMutator\u001cUTMutator_utcomp3v4b2\u001cUTMutator_FreeFOV\u001c","p268435706":"6","p268435968":"0","p268435969":"0","password":"0","players":[{"player":"Sierra Vasquez","score":"0","ping":"96","deaths":"1","pid":"289"}],"pure_server":"1","servername":"","stock_mutators":"0","time_limit":"17","vs_bots":"0"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Ventrilo/1_response.txt b/gameq/tests/Protocols/Providers/Ventrilo/1_response.txt new file mode 100644 index 0000000..85f6a8e Binary files /dev/null and b/gameq/tests/Protocols/Providers/Ventrilo/1_response.txt differ diff --git a/gameq/tests/Protocols/Providers/Ventrilo/1_result.json b/gameq/tests/Protocols/Providers/Ventrilo/1_result.json new file mode 100644 index 0000000..6384211 --- /dev/null +++ b/gameq/tests/Protocols/Providers/Ventrilo/1_result.json @@ -0,0 +1 @@ +{"78.129.193.68:3808":{"auth":"0","channelcount":"54","clientcount":"14","comment":"","dedicated":1,"gq_address":"78.129.193.68","gq_joinlink":"ventrilo:\/\/78.129.193.68:3808\/","gq_name":"Ventrilo","gq_online":true,"gq_port_client":3808,"gq_port_query":3808,"gq_protocol":"ventrilo","gq_transport":"udp","gq_type":"ventrilo","maxclients":"40","name":"tan.cleanvoice.ru","phonetic":"Clean Voice","platform":"Linux-i386","players":[{"admin":"0","cid":"305","phan":"0","ping":"63","sec":"2181","name":"Tuzik","comm":""},{"admin":"0","cid":"311","phan":"0","ping":"57","sec":"2180","name":"Ecelerok","comm":""},{"admin":"0","cid":"304","phan":"0","ping":"61","sec":"2180","name":"XXXXXXXX","comm":""},{"admin":"0","cid":"295","phan":"0","ping":"111","sec":"2180","name":"NyK FuRy","comm":""},{"admin":"0","cid":"0","phan":"0","ping":"149","sec":"2180","name":"Wrath","comm":""},{"admin":"0","cid":"0","phan":"0","ping":"139","sec":"2180","name":"Facerolladin","comm":""},{"admin":"0","cid":"296","phan":"0","ping":"257","sec":"2180","name":"jdisco","comm":""},{"admin":"0","cid":"295","phan":"0","ping":"107","sec":"2180","name":"kman","comm":""},{"admin":"0","cid":"294","phan":"0","ping":"129","sec":"2180","name":"Elekor","comm":""},{"admin":"0","cid":"327","phan":"0","ping":"71","sec":"2180","name":"Punk","comm":""},{"admin":"0","cid":"296","phan":"0","ping":"1932","sec":"2178","name":"ATC","comm":""},{"admin":"0","cid":"294","phan":"0","ping":"143","sec":"2176","name":"SPRTN II 117","comm":""},{"admin":"0","cid":"305","phan":"0","ping":"108","sec":"2174","name":"bead","comm":""},{"admin":"0","cid":"295","phan":"0","ping":"91","sec":"2127","name":"Austism"}],"teams":[{"cid":"294","pid":"0","prot":"0","name":"!Public #1","comm":""},{"cid":"295","pid":"0","prot":"0","name":"!Public #2","comm":""},{"cid":"296","pid":"0","prot":"0","name":"!Public #3","comm":""},{"cid":"297","pid":"0","prot":"1","name":"#EnclaveTeam#","comm":"ACTIVATED TO 13.03.2015"},{"cid":"298","pid":"0","prot":"1","name":"AAge","comm":"ACTIVATED TO 14.03.2015"},{"cid":"299","pid":"0","prot":"1","name":"AionStorm","comm":"TO BE DELETE 07.03.2015"},{"cid":"300","pid":"0","prot":"1","name":"anaprilin","comm":"ACTIVATED TO 24.03.2015"},{"cid":"301","pid":"0","prot":"1","name":"AOH","comm":"ACTIVATED TO 31.03.2015"},{"cid":"302","pid":"0","prot":"1","name":"Belki_na_tarelke","comm":"TO BE DELETE 03.03.2015"},{"cid":"303","pid":"0","prot":"1","name":"GoldenTime","comm":"ACTIVATED TO 26.03.2015"},{"cid":"304","pid":"0","prot":"1","name":"LeagueOfLegendsRoom","comm":"ACTIVATED TO 25.03.2015"},{"cid":"305","pid":"0","prot":"1","name":"NA","comm":"ACTIVATED TO 01.04.2015"},{"cid":"306","pid":"0","prot":"1","name":"Nagibkainaka","comm":"ACTIVATED TO 27.03.2015"},{"cid":"307","pid":"0","prot":"1","name":"oO1ne","comm":"ACTIVATED TO 21.03.2015"},{"cid":"308","pid":"0","prot":"1","name":"Panika","comm":"ACTIVATED TO 21.03.2015"},{"cid":"309","pid":"0","prot":"1","name":"Playforfun","comm":"ACTIVATED TO 26.03.2015"},{"cid":"310","pid":"0","prot":"0","name":"Prime_Guild","comm":"ACTIVATED TO 12.03.2015"},{"cid":"311","pid":"0","prot":"1","name":"RaidGlobalwarL2","comm":"ACTIVATED TO 11.03.2015"},{"cid":"312","pid":"0","prot":"1","name":"Survarium","comm":"ACTIVATED TO 17.03.2015"},{"cid":"313","pid":"0","prot":"1","name":"tera","comm":"ACTIVATED TO 24.03.2015"},{"cid":"314","pid":"0","prot":"1","name":"thelostroom","comm":"ACTIVATED TO 27.03.2015"},{"cid":"315","pid":"0","prot":"1","name":"Volchara","comm":"ACTIVATED TO 11.03.2015"},{"cid":"316","pid":"0","prot":"1","name":"x3clan","comm":"ACTIVATED TO 20.03.2015"},{"cid":"317","pid":"304","prot":"0","name":"party1","comm":""},{"cid":"318","pid":"304","prot":"0","name":"party2","comm":""},{"cid":"319","pid":"316","prot":"0","name":"afk","comm":""},{"cid":"320","pid":"316","prot":"0","name":"Dota 2","comm":""},{"cid":"321","pid":"316","prot":"0","name":"KypuJIka","comm":""},{"cid":"322","pid":"316","prot":"0","name":"Party 1","comm":""},{"cid":"323","pid":"316","prot":"0","name":"Party 2","comm":""},{"cid":"324","pid":"316","prot":"0","name":"Party 3","comm":""},{"cid":"325","pid":"297","prot":"0","name":"AFK","comm":""},{"cid":"326","pid":"297","prot":"0","name":"DOTA","comm":""},{"cid":"327","pid":"297","prot":"0","name":"DOTA2","comm":""},{"cid":"328","pid":"297","prot":"0","name":"LineAge2","comm":""},{"cid":"329","pid":"297","prot":"0","name":"PartyDimona","comm":""},{"cid":"330","pid":"301","prot":"0","name":"AFK","comm":""},{"cid":"331","pid":"301","prot":"0","name":"lineage2","comm":""},{"cid":"332","pid":"301","prot":"0","name":"WOT","comm":""},{"cid":"333","pid":"315","prot":"0","name":"admin","comm":""},{"cid":"334","pid":"312","prot":"0","name":"Cheesy house","comm":""},{"cid":"335","pid":"312","prot":"0","name":"room-1","comm":""},{"cid":"336","pid":"303","prot":"0","name":"GT","comm":""},{"cid":"337","pid":"303","prot":"0","name":"Mox","comm":""},{"cid":"338","pid":"303","prot":"0","name":"private","comm":""},{"cid":"339","pid":"306","prot":"0","name":"logovoartejki","comm":""},{"cid":"340","pid":"302","prot":"0","name":"Belki_na_farme","comm":""},{"cid":"341","pid":"302","prot":"0","name":"Belki_spyat","comm":""},{"cid":"342","pid":"302","prot":"0","name":"Belki_v_dotke","comm":""},{"cid":"343","pid":"302","prot":"0","name":"Dyplo","comm":""},{"cid":"344","pid":"302","prot":"0","name":"Zaiki_na_lyzhaike","comm":""},{"cid":"345","pid":"299","prot":"0","name":"1","comm":""},{"cid":"346","pid":"299","prot":"0","name":"2","comm":""},{"cid":"347","pid":"299","prot":"0","name":"3","comm":""}],"uptime":"2186","version":"3.0.6","voicecodec":"3,Speex","voiceformat":"31,32 KHz, 16 bit, 9 Qlty"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Ventrilo/2_response.txt b/gameq/tests/Protocols/Providers/Ventrilo/2_response.txt new file mode 100644 index 0000000..5e39947 Binary files /dev/null and b/gameq/tests/Protocols/Providers/Ventrilo/2_response.txt differ diff --git a/gameq/tests/Protocols/Providers/Ventrilo/2_result.json b/gameq/tests/Protocols/Providers/Ventrilo/2_result.json new file mode 100644 index 0000000..81decfd --- /dev/null +++ b/gameq/tests/Protocols/Providers/Ventrilo/2_result.json @@ -0,0 +1 @@ +{"63.209.37.15:4517":{"auth":"1","channelcount":"32","clientcount":"22","comment":"","dedicated":1,"gq_address":"63.209.37.15","gq_joinlink":"ventrilo:\/\/63.209.37.15:4517\/","gq_name":"Ventrilo","gq_online":true,"gq_port_client":4517,"gq_port_query":4517,"gq_protocol":"ventrilo","gq_transport":"udp","gq_type":"ventrilo","maxclients":"150","name":"Voice Server","phonetic":"Voice Server","platform":"Linux-i386","players":[{"admin":"1","cid":"525","phan":"0","ping":"149","sec":"52152","name":"DeathProof","comm":""},{"admin":"0","cid":"552","phan":"1","ping":"0","sec":"52151","name":"DeathProof","comm":""},{"admin":"1","cid":"525","phan":"0","ping":"46","sec":"50184","name":"The__Sun","comm":""},{"admin":"0","cid":"552","phan":"1","ping":"0","sec":"50184","name":"The__Sun","comm":""},{"admin":"0","cid":"525","phan":"0","ping":"75","sec":"38999","name":"Gwendollyn","comm":""},{"admin":"0","cid":"546","phan":"0","ping":"188","sec":"37913","name":"MrJohnDoe","comm":""},{"admin":"1","cid":"525","phan":"0","ping":"58","sec":"29047","name":"icefirewolf","comm":""},{"admin":"0","cid":"552","phan":"1","ping":"0","sec":"29047","name":"icefirewolf","comm":""},{"admin":"1","cid":"527","phan":"0","ping":"55","sec":"27753","name":"Morrier","comm":""},{"admin":"0","cid":"546","phan":"0","ping":"44","sec":"23032","name":"WolvenMacry","comm":""},{"admin":"0","cid":"546","phan":"0","ping":"92","sec":"18419","name":"grei","comm":""},{"admin":"0","cid":"546","phan":"0","ping":"188","sec":"18379","name":"Ignacia","comm":""},{"admin":"0","cid":"546","phan":"0","ping":"414","sec":"16345","name":"Robinson","comm":""},{"admin":"0","cid":"546","phan":"0","ping":"172","sec":"11938","name":"Maradise","comm":""},{"admin":"0","cid":"535","phan":"0","ping":"85","sec":"11612","name":"Tianalie","comm":""},{"admin":"0","cid":"546","phan":"0","ping":"68","sec":"11242","name":"Vortex_Dan","comm":""},{"admin":"0","cid":"546","phan":"0","ping":"43","sec":"10480","name":"Kiike","comm":""},{"admin":"0","cid":"546","phan":"0","ping":"143","sec":"10063","name":"skater","comm":""},{"admin":"0","cid":"535","phan":"0","ping":"47","sec":"10007","name":"pokkits","comm":""},{"admin":"0","cid":"535","phan":"0","ping":"54","sec":"9966","name":"ZippysMommy","comm":""},{"admin":"0","cid":"535","phan":"0","ping":"90","sec":"1296","name":"Ameyuri","comm":""},{"admin":"0","cid":"546","phan":"0","ping":"70","sec":"18","name":"BloodSaphire","comm":""}],"teams":[{"cid":"523","pid":"0","prot":"0","name":"Instance Rooms","comm":"Friend Safe Zone"},{"cid":"525","pid":"0","prot":"0","name":"Hangout Room","comm":"Enter at own risk."},{"cid":"526","pid":"0","prot":"0","name":"Public-Private Room 1","comm":""},{"cid":"527","pid":"0","prot":"0","name":"AFK","comm":""},{"cid":"528","pid":"0","prot":"0","name":"Foreign Language","comm":""},{"cid":"529","pid":"0","prot":"2","name":"Officer Meeting Room","comm":"Sunday 3pm server time"},{"cid":"531","pid":"0","prot":"2","name":"DP's Basement","comm":""},{"cid":"530","pid":"0","prot":"2","name":"Interrogation Room","comm":"RECRUITING ROOM"},{"cid":"532","pid":"0","prot":"0","name":"TW Talks","comm":"TW team"},{"cid":"533","pid":"0","prot":"0","name":"TW Fill Room","comm":"Pls post comment of class & weapon"},{"cid":"534","pid":"523","prot":"0","name":"EVENTS ROOM","comm":""},{"cid":"535","pid":"523","prot":"0","name":"Hot Tub","comm":""},{"cid":"537","pid":"523","prot":"0","name":"Friend's Chillout Room","comm":"Guests Allowed"},{"cid":"541","pid":"526","prot":"0","name":"Music Room","comm":""},{"cid":"742","pid":"528","prot":"0","name":"Portuguese","comm":"7-1"},{"cid":"545","pid":"528","prot":"0","name":"German","comm":""},{"cid":"546","pid":"528","prot":"0","name":"Babosos Room","comm":""},{"cid":"547","pid":"528","prot":"0","name":"Russian","comm":""},{"cid":"548","pid":"529","prot":"2","name":"Event Team","comm":""},{"cid":"549","pid":"529","prot":"2","name":"Fun Under The Sun","comm":"Get your dosage of vitamin D"},{"cid":"550","pid":"530","prot":"0","name":"Waiting Room","comm":""},{"cid":"551","pid":"533","prot":"0","name":"Scout Room","comm":""},{"cid":"552","pid":"533","prot":"0","name":"Leaders Room 1","comm":""},{"cid":"553","pid":"533","prot":"0","name":"CAT2","comm":""},{"cid":"554","pid":"533","prot":"0","name":"CAT1","comm":""},{"cid":"555","pid":"533","prot":"0","name":"ATK1","comm":""},{"cid":"556","pid":"533","prot":"0","name":"ATK2","comm":""},{"cid":"557","pid":"533","prot":"0","name":"Left Flank","comm":""},{"cid":"558","pid":"533","prot":"0","name":"Right Flank","comm":""},{"cid":"559","pid":"533","prot":"0","name":"DEF1","comm":""},{"cid":"560","pid":"533","prot":"0","name":"DEF2","comm":""},{"cid":"561","pid":"533","prot":"0","name":"Nuke","comm":""}],"uptime":"4931211","version":"3.0.6","voicecodec":"3,Speex","voiceformat":"30,32 KHz, 16 bit, 8 Qlty"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Warsow/1_response.txt b/gameq/tests/Protocols/Providers/Warsow/1_response.txt new file mode 100644 index 0000000..e7e2254 --- /dev/null +++ b/gameq/tests/Protocols/Providers/Warsow/1_response.txt @@ -0,0 +1,19 @@ +statusResponse +\challenge\\version\2.01 x86_64 Dec 19 2015 Linux\fs_game\basewsw\g_antilag\1\g_gametypes_available\\g_instagib\1\g_match_score\ ALPHA: 3 BETA: 14\g_match_time\17:13\g_needpass\0\g_race_gametype\0\gamedate\Dec 19 2015\gamename\Warsow\mapname\bipbeta2\protocol\21\sv_cheats\0\sv_hostname\^0_^9_^7_ ^3gibcity^2-|-^3insta ^7_^9_^0_ ^3#1 ^2/// ^9bb2\sv_http\0\sv_maxclients\17\sv_maxmvclients\4\sv_mm_enable\0\sv_mm_loginonly\0\sv_pps\20\sv_pure\1\sv_skilllevel\1\sv_skillRating\0\gametype\ca\clients\17 +1 34 "^7Stylo^1." 2 +14 88 "PunkiZi" 3 +5 72 "MegaZerg" 2 +1 43 "^2Ki^3Wi" 3 +0 11 "^5Crystal^7Clear" 2 +1 59 "^0pelo^1killer" 3 +-9999 0 "H I P P" 0 +11 56 "^0Sch^5w^0amm" 3 +-9999 26 "wcDUCK" 3 +14 41 "^0Ai^9o" 3 +22 20 "^7o_O^1//^7HERO" 3 +3 48 "m0e" 2 +17 53 "Monia" 2 +10 50 "^8LUCK^7SKILL" 3 +4 6 "Muthafunkbli" 2 +3 186 "o_O^1//^7LEGACY" 2 +0 95 "^4A^0l^4e^0s^4s^0i^4o" 2 diff --git a/gameq/tests/Protocols/Providers/Warsow/1_result.json b/gameq/tests/Protocols/Providers/Warsow/1_result.json new file mode 100644 index 0000000..aba211e --- /dev/null +++ b/gameq/tests/Protocols/Providers/Warsow/1_result.json @@ -0,0 +1 @@ +{"81.4.126.182:44400":{"challenge":"","clients":"17","fs_game":"basewsw","g_antilag":"1","g_gametypes_available":"","g_instagib":"1","g_match_score":"ALPHA: 3 BETA: 14","g_match_time":"17:13","g_needpass":"0","g_race_gametype":"0","gamedate":"Dec 19 2015","gamename":"Warsow","gametype":"ca","gq_address":"81.4.126.182","gq_joinlink":"warsow:\/\/81.4.126.182:44400\/","gq_name":"Warsow","gq_online":true,"gq_port_client":44400,"gq_port_query":44400,"gq_protocol":"quake3","gq_transport":"udp","gq_type":"warsow","mapname":"bipbeta2","players":[{"frags":"1","ping":"34","name":"^7Stylo^1.","team":"2"},{"frags":"14","ping":"88","name":"PunkiZi","team":"3"},{"frags":"5","ping":"72","name":"MegaZerg","team":"2"},{"frags":"1","ping":"43","name":"^2Ki^3Wi","team":"3"},{"frags":"0","ping":"11","name":"^5Crystal^7Clear","team":"2"},{"frags":"1","ping":"59","name":"^0pelo^1killer","team":"3"},{"frags":"-9999","ping":"0","name":"H I P P","team":"0"},{"frags":"11","ping":"56","name":"^0Sch^5w^0amm","team":"3"},{"frags":"-9999","ping":"26","name":"wcDUCK","team":"3"},{"frags":"14","ping":"41","name":"^0Ai^9o","team":"3"},{"frags":"22","ping":"20","name":"^7o_O^1\/\/^7HERO","team":"3"},{"frags":"3","ping":"48","name":"m0e","team":"2"},{"frags":"17","ping":"53","name":"Monia","team":"2"},{"frags":"10","ping":"50","name":"^8LUCK^7SKILL","team":"3"},{"frags":"4","ping":"6","name":"Muthafunkbli","team":"2"},{"frags":"3","ping":"186","name":"o_O^1\/\/^7LEGACY","team":"2"},{"frags":"0","ping":"95","name":"^4A^0l^4e^0s^4s^0i^4o","team":"2"}],"protocol":"21","sv_cheats":"0","sv_hostname":"^0_^9_^7_ ^3gibcity^2-|-^3insta ^7_^9_^0_ ^3#1 ^2\/\/\/ ^9bb2","sv_http":"0","sv_maxclients":"17","sv_maxmvclients":"4","sv_mm_enable":"0","sv_mm_loginonly":"0","sv_pps":"20","sv_pure":"1","sv_skillRating":"0","sv_skilllevel":"1","version":"2.01 x86_64 Dec 19 2015 Linux"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Warsow/2_response.txt b/gameq/tests/Protocols/Providers/Warsow/2_response.txt new file mode 100644 index 0000000..20c1974 --- /dev/null +++ b/gameq/tests/Protocols/Providers/Warsow/2_response.txt @@ -0,0 +1,14 @@ +statusResponse +\challenge\\version\2.01 x86_64 Dec 19 2015 Linux\fs_game\basewsw\g_antilag\1\g_gametypes_available\\g_instagib\0\g_match_score\\g_match_time\Countdown\g_needpass\1\g_race_gametype\0\gamedate\Dec 19 2015\gamename\Warsow\mapname\wbomb1\protocol\21\sv_cheats\0\sv_hostname\null.one pickup #1\sv_http\1\sv_maxclients\32\sv_maxmvclients\4\sv_mm_enable\1\sv_mm_loginonly\0\sv_pps\20\sv_pure\1\sv_skilllevel\1\sv_skillRating\22\gametype\bomb\clients\12 +-9999 8 "^1Crust^0Y" 0 +2 11 "^04Z^11^0E" 3 +-9999 12 "^1C^2C^3C^4C^5C^6C^8C^9C^0C" 0 +6 14 "^00D^11^0N" 2 +73 41 "jAck" 3 +40 91 "^0FANG" 2 +10 47 "brianlag" 3 +24 20 "plX" 2 +4 39 "MadRat" 2 +10 12 "prim" 3 +18 48 "^9P^7uffdar" 2 +3 15 "timma^7(1)" 3 diff --git a/gameq/tests/Protocols/Providers/Warsow/2_result.json b/gameq/tests/Protocols/Providers/Warsow/2_result.json new file mode 100644 index 0000000..0b02681 --- /dev/null +++ b/gameq/tests/Protocols/Providers/Warsow/2_result.json @@ -0,0 +1 @@ +{"84.200.8.69:9500":{"challenge":"","clients":"12","fs_game":"basewsw","g_antilag":"1","g_gametypes_available":"","g_instagib":"0","g_match_score":"","g_match_time":"Countdown","g_needpass":"1","g_race_gametype":"0","gamedate":"Dec 19 2015","gamename":"Warsow","gametype":"bomb","gq_address":"84.200.8.69","gq_joinlink":"warsow:\/\/84.200.8.69:9500\/","gq_name":"Warsow","gq_online":true,"gq_port_client":9500,"gq_port_query":9500,"gq_protocol":"quake3","gq_transport":"udp","gq_type":"warsow","mapname":"wbomb1","players":[{"frags":"-9999","ping":"8","name":"^1Crust^0Y","team":"0"},{"frags":"2","ping":"11","name":"^04Z^11^0E","team":"3"},{"frags":"-9999","ping":"12","name":"^1C^2C^3C^4C^5C^6C^8C^9C^0C","team":"0"},{"frags":"6","ping":"14","name":"^00D^11^0N","team":"2"},{"frags":"73","ping":"41","name":"jAck","team":"3"},{"frags":"40","ping":"91","name":"^0FANG","team":"2"},{"frags":"10","ping":"47","name":"brianlag","team":"3"},{"frags":"24","ping":"20","name":"plX","team":"2"},{"frags":"4","ping":"39","name":"MadRat","team":"2"},{"frags":"10","ping":"12","name":"prim","team":"3"},{"frags":"18","ping":"48","name":"^9P^7uffdar","team":"2"},{"frags":"3","ping":"15","name":"timma^7(1)","team":"3"}],"protocol":"21","sv_cheats":"0","sv_hostname":"null.one pickup #1","sv_http":"1","sv_maxclients":"32","sv_maxmvclients":"4","sv_mm_enable":"1","sv_mm_loginonly":"0","sv_pps":"20","sv_pure":"1","sv_skillRating":"22","sv_skilllevel":"1","version":"2.01 x86_64 Dec 19 2015 Linux"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Wurm/1_response.txt b/gameq/tests/Protocols/Providers/Wurm/1_response.txt new file mode 100644 index 0000000..b217e19 Binary files /dev/null and b/gameq/tests/Protocols/Providers/Wurm/1_response.txt differ diff --git a/gameq/tests/Protocols/Providers/Wurm/1_result.json b/gameq/tests/Protocols/Providers/Wurm/1_result.json new file mode 100644 index 0000000..50a5eba --- /dev/null +++ b/gameq/tests/Protocols/Providers/Wurm/1_result.json @@ -0,0 +1 @@ +{"199.101.48.192:25221":{"dedicated":"d","game_descr":"Wurm Unlimited Server","game_dir":"wurmunlimitedserver","game_id":366220,"gq_address":"199.101.48.192","gq_joinlink":"steam:\/\/connect\/199.101.48.192:25221\/","gq_name":"Wurm Unlimited","gq_online":true,"gq_port_client":25221,"gq_port_query":27016,"gq_protocol":"source","gq_transport":"udp","gq_type":"wurm","hostname":"Dagfinnwurm.com|PVE 1X 24\/7 And PVP 1X 24\/7 Server|Noob Friendl","map":"Ocrea","max_players":200,"num_bots":0,"num_players":13,"os":"w","password":0,"players":[{"id":0,"name":"","score":0,"time":20161.482421875},{"id":0,"name":"","score":0,"time":17764.630859375},{"id":0,"name":"","score":0,"time":16728.951171875},{"id":0,"name":"","score":0,"time":10290.177734375},{"id":0,"name":"","score":0,"time":6988.8520507812},{"id":0,"name":"","score":0,"time":6714.6293945312},{"id":0,"name":"","score":0,"time":5390.5786132812},{"id":0,"name":"","score":0,"time":4519.3911132812},{"id":0,"name":"","score":0,"time":3806.3908691406},{"id":0,"name":"","score":0,"time":1779.3572998047},{"id":0,"name":"","score":0,"time":1530.0004882812},{"id":0,"name":"","score":0,"time":1209.0524902344},{"id":0,"name":"","score":0,"time":1137.5563964844}],"port":25221,"protocol":17,"secure":1,"steam_id":90099088428109827,"steamappid":0,"version":"1.0.0.0"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Wurm/2_response.txt b/gameq/tests/Protocols/Providers/Wurm/2_response.txt new file mode 100644 index 0000000..fb50b13 Binary files /dev/null and b/gameq/tests/Protocols/Providers/Wurm/2_response.txt differ diff --git a/gameq/tests/Protocols/Providers/Wurm/2_result.json b/gameq/tests/Protocols/Providers/Wurm/2_result.json new file mode 100644 index 0000000..7ba79f2 --- /dev/null +++ b/gameq/tests/Protocols/Providers/Wurm/2_result.json @@ -0,0 +1 @@ +{"game.mythmoor.com:3724":{"dedicated":"d","game_descr":"Wurm Unlimited Server","game_dir":"wurmunlimitedserver","game_id":366220,"gq_address":"game.mythmoor.com","gq_joinlink":"steam:\/\/connect\/game.mythmoor.com:3724\/","gq_name":"Wurm Unlimited","gq_online":true,"gq_port_client":3724,"gq_port_query":27016,"gq_protocol":"source","gq_transport":"udp","gq_type":"wurm","hostname":"Mythmoor Prime (Dedicated, 7.5x skillgain, 3x action)","map":"New","max_players":250,"num_bots":0,"num_players":122,"os":"w","password":0,"players":[{"id":0,"name":"","score":0,"time":20799.123046875},{"id":0,"name":"","score":0,"time":20744.197265625},{"id":0,"name":"","score":0,"time":20721.05078125},{"id":0,"name":"","score":0,"time":20659.38671875},{"id":0,"name":"","score":0,"time":20578.072265625},{"id":0,"name":"","score":0,"time":20492.74609375},{"id":0,"name":"","score":0,"time":20190.234375},{"id":0,"name":"","score":0,"time":20181.646484375},{"id":0,"name":"","score":0,"time":20034.517578125},{"id":0,"name":"","score":0,"time":20001.765625},{"id":0,"name":"","score":0,"time":19782.232421875},{"id":0,"name":"","score":0,"time":19566.296875},{"id":0,"name":"","score":0,"time":19088.544921875},{"id":0,"name":"","score":0,"time":18952.287109375},{"id":0,"name":"","score":0,"time":18706.642578125},{"id":0,"name":"","score":0,"time":18680.23046875},{"id":0,"name":"","score":0,"time":18286.822265625},{"id":0,"name":"","score":0,"time":18267.892578125},{"id":0,"name":"","score":0,"time":17979.6953125},{"id":0,"name":"","score":0,"time":17368.744140625},{"id":0,"name":"","score":0,"time":16708.4375},{"id":0,"name":"","score":0,"time":15712.014648438},{"id":0,"name":"","score":0,"time":15670.778320312},{"id":0,"name":"","score":0,"time":15400.71875},{"id":0,"name":"","score":0,"time":15125.356445312},{"id":0,"name":"","score":0,"time":14568.228515625},{"id":0,"name":"","score":0,"time":13913.421875},{"id":0,"name":"","score":0,"time":13791.388671875},{"id":0,"name":"","score":0,"time":13390.34375},{"id":0,"name":"","score":0,"time":12236.270507812},{"id":0,"name":"","score":0,"time":11849.6171875},{"id":0,"name":"","score":0,"time":11462.163085938},{"id":0,"name":"","score":0,"time":11429.169921875},{"id":0,"name":"","score":0,"time":11239.673828125},{"id":0,"name":"","score":0,"time":11209.271484375},{"id":0,"name":"","score":0,"time":11107.192382812},{"id":0,"name":"","score":0,"time":10966.579101562},{"id":0,"name":"","score":0,"time":10938.63671875},{"id":0,"name":"","score":0,"time":10915.508789062},{"id":0,"name":"","score":0,"time":10871.122070312},{"id":0,"name":"","score":0,"time":10531.397460938},{"id":0,"name":"","score":0,"time":9820.91015625},{"id":0,"name":"","score":0,"time":9389.107421875},{"id":0,"name":"","score":0,"time":9048.56640625},{"id":0,"name":"","score":0,"time":9014.068359375},{"id":0,"name":"","score":0,"time":8403.4228515625},{"id":0,"name":"","score":0,"time":8339.4287109375},{"id":0,"name":"","score":0,"time":8181.4291992188},{"id":0,"name":"","score":0,"time":7692.9008789062},{"id":0,"name":"","score":0,"time":7455.91796875},{"id":0,"name":"","score":0,"time":7425.7548828125},{"id":0,"name":"","score":0,"time":7412.0703125},{"id":0,"name":"","score":0,"time":7392.76171875},{"id":0,"name":"","score":0,"time":7058.3701171875},{"id":0,"name":"","score":0,"time":6769.7758789062},{"id":0,"name":"","score":0,"time":6654.34375},{"id":0,"name":"","score":0,"time":6244.50390625},{"id":0,"name":"","score":0,"time":6206.267578125},{"id":0,"name":"","score":0,"time":5901.3784179688},{"id":0,"name":"","score":0,"time":5678.5166015625},{"id":0,"name":"","score":0,"time":5511.8974609375},{"id":0,"name":"","score":0,"time":5429.3369140625},{"id":0,"name":"","score":0,"time":5422.544921875},{"id":0,"name":"","score":0,"time":5401.3090820312},{"id":0,"name":"","score":0,"time":5283.427734375},{"id":0,"name":"","score":0,"time":5193.384765625},{"id":0,"name":"","score":0,"time":5071.0961914062},{"id":0,"name":"","score":0,"time":4941.7436523438},{"id":0,"name":"","score":0,"time":4909.5014648438},{"id":0,"name":"","score":0,"time":4876.1215820312},{"id":0,"name":"","score":0,"time":4853.4926757812},{"id":0,"name":"","score":0,"time":4833.6088867188},{"id":0,"name":"","score":0,"time":4760.7890625},{"id":0,"name":"","score":0,"time":4757.2646484375},{"id":0,"name":"","score":0,"time":4385.0180664062},{"id":0,"name":"","score":0,"time":4146.7109375},{"id":0,"name":"","score":0,"time":4053.5407714844},{"id":0,"name":"","score":0,"time":4026.5090332031},{"id":0,"name":"","score":0,"time":4026.4758300781},{"id":0,"name":"","score":0,"time":3952.9001464844},{"id":0,"name":"","score":0,"time":3939.0012207031},{"id":0,"name":"","score":0,"time":3788.2934570312},{"id":0,"name":"","score":0,"time":3782.3820800781},{"id":0,"name":"","score":0,"time":3745.0656738281},{"id":0,"name":"","score":0,"time":3682.3937988281},{"id":0,"name":"","score":0,"time":3648.5073242188},{"id":0,"name":"","score":0,"time":3627.0673828125},{"id":0,"name":"","score":0,"time":3495.7277832031},{"id":0,"name":"","score":0,"time":3483.6411132812},{"id":0,"name":"","score":0,"time":3443.087890625},{"id":0,"name":"","score":0,"time":3387.6943359375},{"id":0,"name":"","score":0,"time":3318.3935546875},{"id":0,"name":"","score":0,"time":3255.0385742188},{"id":0,"name":"","score":0,"time":3240.1218261719},{"id":0,"name":"","score":0,"time":3063.64453125},{"id":0,"name":"","score":0,"time":3056.9567871094},{"id":0,"name":"","score":0,"time":2931.5700683594},{"id":0,"name":"","score":0,"time":2897.3801269531},{"id":0,"name":"","score":0,"time":2851.1240234375},{"id":0,"name":"","score":0,"time":2797.3330078125},{"id":0,"name":"","score":0,"time":2771.5625},{"id":0,"name":"","score":0,"time":2604.9006347656},{"id":0,"name":"","score":0,"time":2531.3056640625},{"id":0,"name":"","score":0,"time":2428.7844238281},{"id":0,"name":"","score":0,"time":2260.3811035156},{"id":0,"name":"","score":0,"time":2201.7219238281},{"id":0,"name":"","score":0,"time":1846.6312255859},{"id":0,"name":"","score":0,"time":1816.1361083984},{"id":0,"name":"","score":0,"time":1642.4254150391},{"id":0,"name":"","score":0,"time":1522.1634521484},{"id":0,"name":"","score":0,"time":1280.0374755859},{"id":0,"name":"","score":0,"time":1253.3065185547},{"id":0,"name":"","score":0,"time":927.25189208984},{"id":0,"name":"","score":0,"time":848.31591796875},{"id":0,"name":"","score":0,"time":693.53253173828},{"id":0,"name":"","score":0,"time":585.89672851562},{"id":0,"name":"","score":0,"time":550.38208007812},{"id":0,"name":"","score":0,"time":293.07904052734},{"id":0,"name":"","score":0,"time":250.83889770508},{"id":0,"name":"","score":0,"time":242.82012939453},{"id":0,"name":"","score":0,"time":70.087799072266},{"id":0,"name":"","score":0,"time":11.414155006409}],"port":3724,"protocol":17,"secure":1,"steam_id":90099098665377801,"steamappid":0,"version":"1.0.0.0"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Wurm/3_response.txt b/gameq/tests/Protocols/Providers/Wurm/3_response.txt new file mode 100644 index 0000000..75935e9 Binary files /dev/null and b/gameq/tests/Protocols/Providers/Wurm/3_response.txt differ diff --git a/gameq/tests/Protocols/Providers/Wurm/3_result.json b/gameq/tests/Protocols/Providers/Wurm/3_result.json new file mode 100644 index 0000000..6b0cda7 --- /dev/null +++ b/gameq/tests/Protocols/Providers/Wurm/3_result.json @@ -0,0 +1 @@ +{"23.108.31.138:21041":{"dedicated":"d","game_descr":"Wurm Unlimited Server","game_dir":"wurmunlimitedserver","game_id":366220,"gq_address":"23.108.31.138","gq_joinlink":"steam:\/\/connect\/23.108.31.138:21041\/","gq_name":"Wurm Unlimited","gq_online":true,"gq_port_client":21041,"gq_port_query":27016,"gq_protocol":"source","gq_transport":"udp","gq_type":"wurm","hostname":"Faewynd - Heavily modded - visit faewynd.com for a list of mods","map":"New","max_players":250,"num_bots":0,"num_players":1,"os":"w","password":0,"players":[{"id":0,"name":"","score":0,"time":15653.234375}],"port":21041,"protocol":17,"secure":1,"steam_id":90099071078371336,"steamappid":0,"version":"1.0.0.0"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/server_list1.json b/gameq/tests/Protocols/Providers/server_list1.json new file mode 100644 index 0000000..3f62ee7 --- /dev/null +++ b/gameq/tests/Protocols/Providers/server_list1.json @@ -0,0 +1,12 @@ +[ + { + "id": 1, + "type": "source", + "host": "127.0.0.1:27015" + }, + { + "id": 2, + "type": "css", + "host": "127.0.0.1:27016" + } +] \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/server_list_bad.json b/gameq/tests/Protocols/Providers/server_list_bad.json new file mode 100644 index 0000000..0bd10bb --- /dev/null +++ b/gameq/tests/Protocols/Providers/server_list_bad.json @@ -0,0 +1,12 @@ +[ + { + "id": 1, + "type": "source", + "host": + }, + { + "id": 2, + "type": "css", + "host": "127.0.0.1:27016" + } +] \ No newline at end of file diff --git a/gameq/tests/Protocols/Quake2.php b/gameq/tests/Protocols/Quake2.php new file mode 100644 index 0000000..8e514ea --- /dev/null +++ b/gameq/tests/Protocols/Quake2.php @@ -0,0 +1,122 @@ +. + */ + +namespace GameQ\Tests\Protocols; + +class Quake2 extends Base +{ + + /** + * Holds stub on setup + * + * @type \GameQ\Protocols\Quake2 + */ + protected $stub; + + /** + * Holds the expected packets for this protocol class + * + * @type array + */ + protected $packets = [ + \GameQ\Protocol::PACKET_STATUS => "\xFF\xFF\xFF\xFFstatus\x00", + ]; + + /** + * Setup + */ + public function setUp() + { + + // Create the stub class + $this->stub = $this->getMockBuilder('\GameQ\Protocols\Quake2') + ->enableProxyingToOriginalMethods() + ->getMock(); + } + + /** + * Test the packets to make sure they are correct for source + */ + public function testPackets() + { + + // Test to make sure packets are defined properly + $this->assertEquals($this->packets, \PHPUnit\Framework\Assert::readAttribute($this->stub, 'packets')); + } + + /** + * Test invalid packet type without debug + */ + public function testInvalidPacketType() + { + + // Read in a quake 2 source file + $source = file_get_contents(sprintf('%s/Providers/Quake2/1_response.txt', __DIR__)); + + // Change the first packet to some unknown header + $source = str_replace("\xFF\xFF\xFF\xFFprint", "\xFF\xFF\xFF\xFFprints", $source); + + // Should show up as offline + $testResult = $this->queryTest('127.0.0.1:27910', 'quake2', explode(PHP_EOL . '||' . PHP_EOL, $source), false); + + $this->assertFalse($testResult['gq_online']); + } + + /** + * Test for invalid packet type in response + * + * @expectedException \Exception + * @expectedExceptionMessage GameQ\Protocols\Quake2::processResponse response type + * 'ffffffff7072696e7473' is not valid + */ + public function testInvalidPacketTypeDebug() + { + + // Read in a quake 2 source file + $source = file_get_contents(sprintf('%s/Providers/Quake2/1_response.txt', __DIR__)); + + // Change the first packet to some unknown header + $source = str_replace("\xFF\xFF\xFF\xFFprint", "\xFF\xFF\xFF\xFFprints", $source); + + // Should show up as offline + $this->queryTest('127.0.0.1:27910', 'quake2', explode(PHP_EOL . '||' . PHP_EOL, $source), true); + } + + /** + * Test responses for Quake3 + * + * @dataProvider loadData + * + * @param $responses + * @param $result + */ + public function testResponses($responses, $result) + { + + // Pull the first key off the array this is the server ip:port + $server = key($result); + + $testResult = $this->queryTest( + $server, + 'quake2', + $responses + ); + + $this->assertEquals($result[$server], $testResult); + } +} diff --git a/gameq/tests/Protocols/Quake3.php b/gameq/tests/Protocols/Quake3.php new file mode 100644 index 0000000..77f82f5 --- /dev/null +++ b/gameq/tests/Protocols/Quake3.php @@ -0,0 +1,122 @@ +. + */ + +namespace GameQ\Tests\Protocols; + +class Quake3 extends Base +{ + + /** + * Holds stub on setup + * + * @type \GameQ\Protocols\Quake3 + */ + protected $stub; + + /** + * Holds the expected packets for this protocol class + * + * @type array + */ + protected $packets = [ + \GameQ\Protocol::PACKET_STATUS => "\xFF\xFF\xFF\xFF\x67\x65\x74\x73\x74\x61\x74\x75\x73\x0A", + ]; + + /** + * Setup + */ + public function setUp() + { + + // Create the stub class + $this->stub = $this->getMockBuilder('\GameQ\Protocols\Quake3') + ->enableProxyingToOriginalMethods() + ->getMock(); + } + + /** + * Test the packets to make sure they are correct for source + */ + public function testPackets() + { + + // Test to make sure packets are defined properly + $this->assertEquals($this->packets, \PHPUnit\Framework\Assert::readAttribute($this->stub, 'packets')); + } + + /** + * Test invalid packet type without debug + */ + public function testInvalidPacketType() + { + + // Read in a Quake 3 source file + $source = file_get_contents(sprintf('%s/Providers/Quake3/1_response.txt', __DIR__)); + + // Change the first packet to some unknown header + $source = str_replace("\xFF\xFF\xFF\xFFstatusResponse", "\xFF\xFF\xFF\xFFstatusResponses", $source); + + // Should show up as offline + $testResult = $this->queryTest('127.0.0.1:27960', 'quake3', explode(PHP_EOL . '||' . PHP_EOL, $source), false); + + $this->assertFalse($testResult['gq_online']); + } + + /** + * Test for invalid packet type in response + * + * @expectedException \Exception + * @expectedExceptionMessage GameQ\Protocols\Quake3::processResponse response type + * 'ffffffff737461747573526573706f6e736573' is not valid + */ + public function testInvalidPacketTypeDebug() + { + + // Read in a Quake 3 source file + $source = file_get_contents(sprintf('%s/Providers/Quake3/1_response.txt', __DIR__)); + + // Change the first packet to some unknown header + $source = str_replace("\xFF\xFF\xFF\xFFstatusResponse", "\xFF\xFF\xFF\xFFstatusResponses", $source); + + // Should show up as offline + $this->queryTest('127.0.0.1:27960', 'quake3', explode(PHP_EOL . '||' . PHP_EOL, $source), true); + } + + /** + * Test responses for Quake3 + * + * @dataProvider loadData + * + * @param $responses + * @param $result + */ + public function testResponses($responses, $result) + { + + // Pull the first key off the array this is the server ip:port + $server = key($result); + + $testResult = $this->queryTest( + $server, + 'quake3', + $responses + ); + + $this->assertEquals($result[$server], $testResult); + } +} diff --git a/gameq/tests/Protocols/Quakelive.php b/gameq/tests/Protocols/Quakelive.php new file mode 100644 index 0000000..4fa5ec6 --- /dev/null +++ b/gameq/tests/Protocols/Quakelive.php @@ -0,0 +1,50 @@ +. + */ + +namespace GameQ\Tests\Protocols; + +/** + * Test Class for Quake Live + * + * @package GameQ\Tests\Protocols + */ +class Quakelive extends Base +{ + /** + * Test responses for Quakelive + * + * @dataProvider loadData + * + * @param $responses + * @param $result + */ + public function testResponses($responses, $result) + { + + // Pull the first key off the array this is the server ip:port + $server = key($result); + + $testResult = $this->queryTest( + $server, + 'quakelive', + $responses + ); + + $this->assertEquals($result[$server], $testResult, '', 0.000000001); + } +} diff --git a/gameq/tests/Protocols/Redorchestra2.php b/gameq/tests/Protocols/Redorchestra2.php new file mode 100644 index 0000000..5189079 --- /dev/null +++ b/gameq/tests/Protocols/Redorchestra2.php @@ -0,0 +1,50 @@ +. + */ + +namespace GameQ\Tests\Protocols; + +/** + * Test Class for Redorchestra2 + * + * @package GameQ\Tests\Protocols + */ +class Redorchestra2 extends Base +{ + /** + * Test responses for Redorchestra2 + * + * @dataProvider loadData + * + * @param $responses + * @param $result + */ + public function testResponses($responses, $result) + { + + // Pull the first key off the array this is the server ip:port + $server = key($result); + + $testResult = $this->queryTest( + $server, + 'redorchestra2', + $responses + ); + + $this->assertEquals($result[$server], $testResult); + } +} diff --git a/gameq/tests/Protocols/Risingstorm2.php b/gameq/tests/Protocols/Risingstorm2.php new file mode 100644 index 0000000..6770fe0 --- /dev/null +++ b/gameq/tests/Protocols/Risingstorm2.php @@ -0,0 +1,78 @@ +. + */ + +namespace GameQ\Tests\Protocols; + +/** + * Test Class for Rising Storm 2 + * + * @package GameQ\Tests\Protocols + */ +class Risingstorm2 extends Base +{ + + /** + * Holds stub on setup + * + * @type \GameQ\Protocols\Risingstorm2 + */ + protected $stub; + + /** + * Setup + */ + public function setUp() + { + + // Create the stub class + $this->stub = $this->getMockBuilder('\GameQ\Protocols\Risingstorm2') + ->enableProxyingToOriginalMethods() + ->getMock(); + } + + /** + * Test to make sure the query port has not changed. Appears to be fixed at 27015 but unsure. + */ + public function testQueryPort() + { + $this->assertEquals($this->stub->findQueryPort(7777), 27015); + } + + /** + * Test responses for Medal of honor: Allied Assault + * + * @dataProvider loadData + * + * @param $responses + * @param $result + */ + public function testResponses($responses, $result) + { + + // Pull the first key off the array this is the server ip:port + $server = key($result); + + $testResult = $this->queryTest( + $server, + 'risingstorm2', + $responses + ); + + $this->assertEquals($result[$server], $testResult); + } +} diff --git a/gameq/tests/Protocols/Rust.php b/gameq/tests/Protocols/Rust.php new file mode 100644 index 0000000..f557364 --- /dev/null +++ b/gameq/tests/Protocols/Rust.php @@ -0,0 +1,50 @@ +. + */ + +namespace GameQ\Tests\Protocols; + +/** + * Test Class for Rust + * + * @package GameQ\Tests\Protocols + */ +class Rust extends Base +{ + /** + * Test responses for Rust + * + * @dataProvider loadData + * + * @param $responses + * @param $result + */ + public function testResponses($responses, $result) + { + + // Pull the first key off the array this is the server ip:port + $server = key($result); + + $testResult = $this->queryTest( + $server, + 'rust', + $responses + ); + + $this->assertEquals($result[$server], $testResult); + } +} diff --git a/gameq/tests/Protocols/Samp.php b/gameq/tests/Protocols/Samp.php new file mode 100644 index 0000000..f646b83 --- /dev/null +++ b/gameq/tests/Protocols/Samp.php @@ -0,0 +1,160 @@ +. + */ + +namespace GameQ\Tests\Protocols; + +class Samp extends Base +{ + + /** + * Holds stub on setup + * + * @type \GameQ\Protocols\Samp + */ + protected $stub; + + /** + * Holds the expected packets for this protocol class + * + * @type array + */ + protected $packets = [ + \GameQ\Protocol::PACKET_STATUS => "SAMP%si", + \GameQ\Protocol::PACKET_PLAYERS => "SAMP%sd", + \GameQ\Protocol::PACKET_RULES => "SAMP%sr", + ]; + + /** + * Setup + */ + public function setUp() + { + + // Create the stub class + $this->stub = $this->getMockBuilder('\GameQ\Protocols\Samp') + ->getMock(); + } + + /** + * Test the packets to make sure they are correct for source + */ + public function testPackets() + { + + // Test to make sure packets are defined properly + $this->assertEquals($this->packets, \PHPUnit\Framework\Assert::readAttribute($this->stub, 'packets')); + } + + /** + * Test the packer header check application + * + * @expectedException \Exception + * @expectedExceptionMessage GameQ\Protocols\Samp::processResponse header response 'SAMu' is not valid + */ + public function testPacketHeader() + { + + // Read in a samp source file + $source = file_get_contents(sprintf('%s/Providers/Samp/1_response.txt', __DIR__)); + + // Change the first packet to some unknown header + $source = str_replace("SAMP", "SAMu", $source); + + // Should fail out + $this->queryTest('127.0.0.1:27015', 'samp', explode(PHP_EOL . '||' . PHP_EOL, $source), true); + } + + /** + * Test for mis matched server code in response + * + * @expectedException \Exception + * @expectedExceptionMessage GameQ\Protocols\Samp::processResponse code check failed. + */ + public function testServerCode() + { + + // Read in a samp source file + $source = file_get_contents(sprintf('%s/Providers/Samp/1_response.txt', __DIR__)); + + // Change the first packet to some unknown header + $source = str_replace("SAMP\x5d\x77\x1a\xc9\x61\x1ei", "SAMP\x5d\x77\x1a\xc9\x61\x1fi", $source); + + // Should fail out + $this->queryTest('93.119.26.201:7777', 'samp', explode(PHP_EOL . '||' . PHP_EOL, $source), true); + } + + /** + * Test invalid packet type without debug + */ + public function testInvalidPacketType() + { + + // Read in a samp source file + $source = file_get_contents(sprintf('%s/Providers/Samp/1_response.txt', __DIR__)); + + // Change the first packet to some unknown header + $source = str_replace("SAMP\x5d\x77\x1a\xc9\x61\x1ei", "SAMP\x5d\x77\x1a\xc9\x61\x1eX", $source); + + // Should fail out + $testResult = $this->queryTest('93.119.26.201:7777', 'samp', explode(PHP_EOL . '||' . PHP_EOL, $source), false); + + $this->assertFalse($testResult['gq_online']); + } + + /** + * Test for invalid packet type in response + * + * @expectedException \Exception + * @expectedExceptionMessage GameQ\Protocols\Samp::processResponse response type 'X' is not valid + */ + public function testInvalidPacketTypeDebug() + { + + // Read in a samp source file + $source = file_get_contents(sprintf('%s/Providers/Samp/1_response.txt', __DIR__)); + + // Change the first packet to some unknown header + $source = str_replace("SAMP\x5d\x77\x1a\xc9\x61\x1ei", "SAMP\x5d\x77\x1a\xc9\x61\x1eX", $source); + + // Should fail out + $this->queryTest('93.119.26.201:7777', 'samp', explode(PHP_EOL . '||' . PHP_EOL, $source), true); + } + + /** + * Test responses for San Andreas Multiplayer + * + * @dataProvider loadData + * + * @param $responses + * @param $result + */ + public function testResponses($responses, $result) + { + + // Pull the first key off the array this is the server ip:port + $server = key($result); + + $testResult = $this->queryTest( + $server, + 'samp', + $responses + ); + + $this->assertEquals($result[$server], $testResult); + } +} diff --git a/gameq/tests/Protocols/Sevendaystodie.php b/gameq/tests/Protocols/Sevendaystodie.php new file mode 100644 index 0000000..2650ce9 --- /dev/null +++ b/gameq/tests/Protocols/Sevendaystodie.php @@ -0,0 +1,50 @@ +. + */ + +namespace GameQ\Tests\Protocols; + +/** + * Test Class for 7 Days to die + * + * @package GameQ\Tests\Protocols + */ +class Sevendaystodie extends Base +{ + /** + * Test responses for 7 Days to die + * + * @dataProvider loadData + * + * @param $responses + * @param $result + */ + public function testResponses($responses, $result) + { + + // Pull the first key off the array this is the server ip:port + $server = key($result); + + $testResult = $this->queryTest( + $server, + 'sevendaystodie', + $responses + ); + + $this->assertEquals($result[$server], $testResult); + } +} diff --git a/gameq/tests/Protocols/Ship.php b/gameq/tests/Protocols/Ship.php new file mode 100644 index 0000000..49ea86d --- /dev/null +++ b/gameq/tests/Protocols/Ship.php @@ -0,0 +1,50 @@ +. + */ + +namespace GameQ\Tests\Protocols; + +/** + * Test Class for The Ship + * + * @package GameQ\Tests\Protocols + */ +class Ship extends Base +{ + /** + * Test responses for Ship + * + * @dataProvider loadData + * + * @param $responses + * @param $result + */ + public function testResponses($responses, $result) + { + + // Pull the first key off the array this is the server ip:port + $server = key($result); + + $testResult = $this->queryTest( + $server, + 'ship', + $responses + ); + + $this->assertEquals($result[$server], $testResult); + } +} diff --git a/gameq/tests/Protocols/Source.php b/gameq/tests/Protocols/Source.php new file mode 100644 index 0000000..6e68e4e --- /dev/null +++ b/gameq/tests/Protocols/Source.php @@ -0,0 +1,127 @@ +. + */ + +namespace GameQ\Tests\Protocols; + +class Source extends Base +{ + + /** + * Holds stub on setup + * + * @type \GameQ\Protocols\Source + */ + protected $stub; + + /** + * Holds the expected packets for this protocol class + * + * @type array + */ + protected $packets = [ + \GameQ\Protocol::PACKET_CHALLENGE => "\xFF\xFF\xFF\xFF\x56\x00\x00\x00\x00", + \GameQ\Protocol::PACKET_DETAILS => "\xFF\xFF\xFF\xFFTSource Engine Query\x00", + \GameQ\Protocol::PACKET_PLAYERS => "\xFF\xFF\xFF\xFF\x55%s", + \GameQ\Protocol::PACKET_RULES => "\xFF\xFF\xFF\xFF\x56%s", + ]; + + /** + * Setup + */ + public function setUp() + { + + // Create the stub class + $this->stub = $this->getMockBuilder('\GameQ\Protocols\Source') + ->enableProxyingToOriginalMethods() + ->getMock(); + } + + /** + * Test the packets to make sure they are correct for source + */ + public function testPackets() + { + + // Test to make sure packets are defined properly + $this->assertEquals($this->packets, \PHPUnit\Framework\Assert::readAttribute($this->stub, 'packets')); + } + + /** + * Test the challenge application + */ + public function testChallengeapply() + { + + $packets = $this->packets; + + // Set what the packets should look like + $packets[\GameQ\Protocol::PACKET_PLAYERS] = "\xFF\xFF\xFF\xFF\x55test"; + $packets[\GameQ\Protocol::PACKET_RULES] = "\xFF\xFF\xFF\xFF\x56test"; + + // Create a fake buffer + $challenge_buffer = new \GameQ\Buffer("\xFF\xFF\xFF\xFF\xFFtest"); + + // Apply the challenge + $this->stub->challengeParseAndApply($challenge_buffer); + + // Build reflection to access changed data + $reflectionClass = new \ReflectionClass($this->stub); + $reflectionProperty = $reflectionClass->getProperty('__phpunit_originalObject'); + $reflectionProperty->setAccessible(true); + + $this->assertEquals($packets, \PHPUnit\Framework\Assert::readAttribute($reflectionProperty->getValue($this->stub), 'packets')); + } + + /** + * Test invalid packet type without debug + */ + public function testInvalidPacketType() + { + + // Read in a css source file + $source = file_get_contents(sprintf('%s/Providers/Css/1_response.txt', __DIR__)); + + // Change the first packet to some unknown header + $source = str_replace("\xFF\xFF\xFF\xFFI", "\xFF\xFF\xFF\xFFX", $source); + + // Should show up as offline + $testResult = $this->queryTest('127.0.0.1:27015', 'css', explode(PHP_EOL . '||' . PHP_EOL, $source), false); + + $this->assertFalse($testResult['gq_online']); + } + + /** + * Test for invalid packet type in response + * + * @expectedException \Exception + * @expectedExceptionMessage GameQ\Protocols\Source::processResponse response type 'X' is not valid + */ + public function testInvalidPacketTypeDebug() + { + + // Read in a css source file + $source = file_get_contents(sprintf('%s/Providers/Css/1_response.txt', __DIR__)); + + // Change the first packet to some unknown header + $source = str_replace("\xFF\xFF\xFF\xFFI", "\xFF\xFF\xFF\xFFX", $source); + + // Should fail out + $this->queryTest('127.0.0.1:27015', 'css', explode(PHP_EOL . '||' . PHP_EOL, $source), true); + } +} diff --git a/gameq/tests/Protocols/Spaceengineers.php b/gameq/tests/Protocols/Spaceengineers.php new file mode 100644 index 0000000..0435306 --- /dev/null +++ b/gameq/tests/Protocols/Spaceengineers.php @@ -0,0 +1,50 @@ +. + */ + +namespace GameQ\Tests\Protocols; + +/** + * Test Class for Space Engineers + * + * @package GameQ\Tests\Protocols + */ +class Spaceengineers extends Base +{ + /** + * Test responses for Space engineers + * + * @dataProvider loadData + * + * @param $responses + * @param $result + */ + public function testResponses($responses, $result) + { + + // Pull the first key off the array this is the server ip:port + $server = key($result); + + $testResult = $this->queryTest( + $server, + 'spaceengineers', + $responses + ); + + $this->assertEquals($result[ $server ], $testResult, '', 0.000000001); + } +} diff --git a/gameq/tests/Protocols/Squad.php b/gameq/tests/Protocols/Squad.php new file mode 100644 index 0000000..b7f869d --- /dev/null +++ b/gameq/tests/Protocols/Squad.php @@ -0,0 +1,50 @@ +. + */ + +namespace GameQ\Tests\Protocols; + +/** + * Test Class for Squad + * + * @package GameQ\Tests\Protocols + */ +class Squad extends Base +{ + /** + * Test responses for Squad + * + * @dataProvider loadData + * + * @param $responses + * @param $result + */ + public function testResponses($responses, $result) + { + + // Pull the first key off the array this is the server ip:port + $server = key($result); + + $testResult = $this->queryTest( + $server, + 'squad', + $responses + ); + + $this->assertEquals($result[$server], $testResult, '', 0.000000001); + } +} diff --git a/gameq/tests/Protocols/Starmade.php b/gameq/tests/Protocols/Starmade.php new file mode 100644 index 0000000..9856cd9 --- /dev/null +++ b/gameq/tests/Protocols/Starmade.php @@ -0,0 +1,88 @@ +. + */ + +namespace GameQ\Tests\Protocols; + +/** + * Test Class for StarMade + * + * @package GameQ\Tests\Protocols + */ +class Starmade extends Base +{ + /** + * Holds stub on setup + * + * @type \GameQ\Protocols\Starmade + */ + protected $stub; + + /** + * Holds the expected packets for this protocol class + * + * @type array + */ + protected $packets = [ + \GameQ\Protocol::PACKET_STATUS => "\x00\x00\x00\x09\x2a\xff\xff\x01\x6f\x00\x00\x00\x00", + ]; + + /** + * Setup + */ + public function setUp() + { + + // Create the stub class + $this->stub = $this->getMockBuilder('\GameQ\Protocols\Starmade') + ->enableProxyingToOriginalMethods() + ->getMock(); + } + + /** + * Test the packets to make sure they are correct for source + */ + public function testPackets() + { + + // Test to make sure packets are defined properly + $this->assertEquals($this->packets, \PHPUnit\Framework\Assert::readAttribute($this->stub, 'packets')); + } + + /** + * Test responses for Starmade + * + * @dataProvider loadData + * + * @param $responses + * @param $result + */ + public function testResponses($responses, $result) + { + + // Pull the first key off the array this is the server ip:port + $server = key($result); + + $testResult = $this->queryTest( + $server, + 'starmade', + $responses + ); + + $this->assertEquals($result[$server], $testResult); + } +} diff --git a/gameq/tests/Protocols/Teamspeak2.php b/gameq/tests/Protocols/Teamspeak2.php new file mode 100644 index 0000000..003d862 --- /dev/null +++ b/gameq/tests/Protocols/Teamspeak2.php @@ -0,0 +1,210 @@ +. + */ + +namespace GameQ\Tests\Protocols; + +/** + * Test Class for Teamspeak2 + * + * @package GameQ\Tests\Protocols + */ +class Teamspeak2 extends Base +{ + + /** + * Holds stub on setup + * + * @type \GameQ\Protocols\Teamspeak2 + */ + protected $stub; + + /** + * Holds the expected packets for this protocol class + * + * @type array + */ + protected $packets = [ + \GameQ\Protocol::PACKET_DETAILS => "sel %d\x0asi\x0a", + \GameQ\Protocol::PACKET_CHANNELS => "sel %d\x0acl\x0a", + \GameQ\Protocol::PACKET_PLAYERS => "sel %d\x0apl\x0a", + ]; + + /** + * Setup + */ + public function setUp() + { + + // Create the stub class + $this->stub = $this->getMockBuilder('\GameQ\Protocols\Teamspeak2') + ->enableProxyingToOriginalMethods() + ->getMock(); + } + + /** + * Test the packets to make sure they are correct for source + */ + public function testPackets() + { + + // Test to make sure packets are defined properly + $this->assertEquals($this->packets, \PHPUnit\Framework\Assert::readAttribute($this->stub, 'packets')); + } + + /** + * Test for exception being thrown if missing query_port + * + * @expectedException \Exception + * @expectedExceptionMessage GameQ\Protocols\Teamspeak2::beforeSend Missing required setting 'query_port'. + */ + public function testMissingQueryPort() + { + + $client_port = 8767; + $query_port = 51234; + + $server = $this->getMockBuilder('\GameQ\Server') + ->setConstructorArgs([ + [ + \GameQ\Server::SERVER_HOST => "127.0.0.1:{$client_port}", + \GameQ\Server::SERVER_TYPE => 'teamspeak2', + \GameQ\Server::SERVER_OPTIONS => [ + \GameQ\Server::SERVER_OPTIONS_QUERY_PORT => $query_port, + ], + ], + ]) + ->enableProxyingToOriginalMethods() + ->getMock(); + + // Apply the before send, should throw exception + $this->stub->beforeSend($server); + } + + /** + * Test the packets to see if they set + * + * @depends testMissingQueryPort + */ + public function testBeforeSend() + { + + $client_port = 8767; + $query_port = 51234; + + // Set what the packets should look like + $packets = [ + \GameQ\Protocol::PACKET_DETAILS => "sel {$client_port}\x0asi\x0a", + \GameQ\Protocol::PACKET_CHANNELS => "sel {$client_port}\x0acl\x0a", + \GameQ\Protocol::PACKET_PLAYERS => "sel {$client_port}\x0apl\x0a", + ]; + + // Create a mock server + $server = $this->getMockBuilder('\GameQ\Server') + ->setConstructorArgs([ + [ + \GameQ\Server::SERVER_HOST => "127.0.0.1:{$client_port}", + \GameQ\Server::SERVER_TYPE => 'teamspeak2', + \GameQ\Server::SERVER_OPTIONS => [ + \GameQ\Server::SERVER_OPTIONS_QUERY_PORT => $query_port, + ], + ], + ]) + ->enableProxyingToOriginalMethods() + ->getMock(); + + $stub = $this->getMockBuilder('\GameQ\Protocols\Teamspeak2') + ->setConstructorArgs([ + [ + \GameQ\Server::SERVER_OPTIONS_QUERY_PORT => $query_port, + ], + ]) + ->enableProxyingToOriginalMethods() + ->getMock(); + + // Apply the before send + $stub->beforeSend($server); + + // Build reflection to access changed data + $reflectionClass = new \ReflectionClass($stub); + $reflectionProperty = $reflectionClass->getProperty('__phpunit_originalObject'); + $reflectionProperty->setAccessible(true); + + $this->assertEquals( + $packets, + \PHPUnit\Framework\Assert::readAttribute($reflectionProperty->getValue($stub), 'packets') + ); + } + + /** + * Test for invalid header + * + * @expectedException \Exception + * @expectedExceptionMessage GameQ\Protocols\Teamspeak2::processResponse Expected header 'BadH' does not match + * expected '[TS]'. + */ + public function testInvalidHeader() + { + + $client_port = 8767; + $query_port = 51234; + + // Read in a css source file + $source = file_get_contents(sprintf('%s/Providers/Teamspeak2/1_response.txt', __DIR__)); + + // Change the first packet to some unknown header + $source = str_replace("[TS]", "BadH", $source); + + // Should throw an exception + $this->queryTest( + '127.0.0.1:' . $client_port, + 'teamspeak2', + explode(PHP_EOL . '||' . PHP_EOL, $source, true), + true, + [ + \GameQ\Server::SERVER_OPTIONS_QUERY_PORT => $query_port, + ] + ); + } + + /** + * Test responses for Teamspeak2 + * + * @dataProvider loadData + * + * @param $responses + * @param $result + */ + public function testResponses($responses, $result) + { + + // Pull the first key off the array this is the server ip:port + $server = key($result); + + $testResult = $this->queryTest( + $server, + 'teamspeak2', + $responses, + false, + [ + \GameQ\Server::SERVER_OPTIONS_QUERY_PORT => $result[$server]['gq_port_query'], + ] + ); + + $this->assertEquals($result[$server], $testResult); + } +} diff --git a/gameq/tests/Protocols/Teamspeak3.php b/gameq/tests/Protocols/Teamspeak3.php new file mode 100644 index 0000000..b6ad0f2 --- /dev/null +++ b/gameq/tests/Protocols/Teamspeak3.php @@ -0,0 +1,211 @@ +. + */ + +namespace GameQ\Tests\Protocols; + +/** + * Test Class for Teamspeak3 + * + * @package GameQ\Tests\Protocols + */ +class Teamspeak3 extends Base +{ + + /** + * Holds stub on setup + * + * @type \GameQ\Protocols\Teamspeak3 + */ + protected $stub; + + /** + * Holds the expected packets for this protocol class + * + * @type array + */ + protected $packets = [ + \GameQ\Protocol::PACKET_DETAILS => "use port=%d\x0Aserverinfo\x0A", + \GameQ\Protocol::PACKET_PLAYERS => "use port=%d\x0Aclientlist\x0A", + \GameQ\Protocol::PACKET_CHANNELS => "use port=%d\x0Achannellist -topic\x0A", + ]; + + /** + * Setup + */ + public function setUp() + { + + // Create the stub class + $this->stub = $this->getMockBuilder('\GameQ\Protocols\Teamspeak3') + ->enableProxyingToOriginalMethods() + ->getMock(); + } + + /** + * Test the packets to make sure they are correct for source + */ + public function testPackets() + { + + // Test to make sure packets are defined properly + $this->assertEquals($this->packets, \PHPUnit\Framework\Assert::readAttribute($this->stub, 'packets')); + } + + /** + * Test for exception being thrown if missing query_port + * + * @expectedException \Exception + * @expectedExceptionMessage GameQ\Protocols\Teamspeak3::beforeSend Missing required setting 'query_port'. + */ + public function testMissingQueryPort() + { + + $client_port = 9987; + $query_port = 10011; + + // Create a mock server + $server = $this->getMockBuilder('\GameQ\Server') + ->setConstructorArgs([ + [ + \GameQ\Server::SERVER_HOST => "127.0.0.1:{$client_port}", + \GameQ\Server::SERVER_TYPE => 'teamspeak3', + \GameQ\Server::SERVER_OPTIONS => [ + \GameQ\Server::SERVER_OPTIONS_QUERY_PORT => $query_port, + ], + ], + ]) + ->enableProxyingToOriginalMethods() + ->getMock(); + + // Apply the before send, should throw exception + $this->stub->beforeSend($server); + } + + /** + * Test the packets to see if they set + * + * @depends testMissingQueryPort + */ + public function testBeforeSend() + { + + $client_port = 9987; + $query_port = 10011; + + // Set what the packets should look like + $packets = [ + \GameQ\Protocol::PACKET_DETAILS => "use port={$client_port}\x0Aserverinfo\x0A", + \GameQ\Protocol::PACKET_PLAYERS => "use port={$client_port}\x0Aclientlist\x0A", + \GameQ\Protocol::PACKET_CHANNELS => "use port={$client_port}\x0Achannellist -topic\x0A", + ]; + + // Create a mock server + $server = $this->getMockBuilder('\GameQ\Server') + ->setConstructorArgs([ + [ + \GameQ\Server::SERVER_HOST => "127.0.0.1:{$client_port}", + \GameQ\Server::SERVER_TYPE => 'teamspeak3', + \GameQ\Server::SERVER_OPTIONS => [ + \GameQ\Server::SERVER_OPTIONS_QUERY_PORT => $query_port, + ], + ], + ]) + ->enableProxyingToOriginalMethods() + ->getMock(); + + $stub = $this->getMockBuilder('\GameQ\Protocols\Teamspeak3') + ->setConstructorArgs([ + [ + \GameQ\Server::SERVER_OPTIONS_QUERY_PORT => $query_port, + ], + ]) + ->enableProxyingToOriginalMethods() + ->getMock(); + + // Apply the before send + $stub->beforeSend($server); + + // Build reflection to access changed data + $reflectionClass = new \ReflectionClass($stub); + $reflectionProperty = $reflectionClass->getProperty('__phpunit_originalObject'); + $reflectionProperty->setAccessible(true); + + $this->assertEquals( + $packets, + \PHPUnit\Framework\Assert::readAttribute($reflectionProperty->getValue($stub), 'packets') + ); + } + + /** + * Test for invalid header + * + * @expectedException \Exception + * @expectedExceptionMessage GameQ\Protocols\Teamspeak3::processResponse Expected header 'So2' does not match + * expected 'TS3'. + */ + public function testInvalidHeader() + { + + $client_port = 9987; + $query_port = 10011; + + // Read in a css source file + $source = file_get_contents(sprintf('%s/Providers/Teamspeak3/1_response.txt', __DIR__)); + + // Change the first packet to some unknown header + $source = str_replace("TS3", "So2", $source); + + // Should throw an exception + $this->queryTest( + '127.0.0.1:' . $client_port, + 'teamspeak3', + explode(PHP_EOL . '||' . PHP_EOL, $source, true), + true, + [ + \GameQ\Server::SERVER_OPTIONS_QUERY_PORT => $query_port, + ] + ); + } + + /** + * Test responses for Teamspeak3 + * + * @dataProvider loadData + * + * @param $responses + * @param $result + */ + public function testResponses($responses, $result) + { + + // Pull the first key off the array this is the server ip:port + $server = key($result); + + $testResult = $this->queryTest( + $server, + 'teamspeak3', + $responses, + false, + [ + \GameQ\Server::SERVER_OPTIONS_QUERY_PORT => $result[$server]['gq_port_query'], + ] + ); + + $this->assertEquals($result[$server], $testResult); + } +} diff --git a/gameq/tests/Protocols/Teeworlds.php b/gameq/tests/Protocols/Teeworlds.php new file mode 100644 index 0000000..08b3bf5 --- /dev/null +++ b/gameq/tests/Protocols/Teeworlds.php @@ -0,0 +1,142 @@ +. + */ + +namespace GameQ\Tests\Protocols; + +/** + * Test Class for Teeworlds + * + * @package GameQ\Tests\Protocols + */ +class Teeworlds extends Base +{ + + /** + * Holds stub on setup + * + * @type \GameQ\Protocols\Teeworlds + */ + protected $stub; + + /** + * Holds the expected packets for this protocol class + * + * @type array + */ + protected $packets = [ + \GameQ\Protocol::PACKET_ALL => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x67\x69\x65\x33\x05", + ]; + + /** + * Setup + */ + public function setUp() + { + + // Create the stub class + $this->stub = $this->getMockBuilder('\GameQ\Protocols\Teeworlds') + ->enableProxyingToOriginalMethods() + ->getMock(); + } + + /** + * Test the packets to make sure they are correct for source + */ + public function testPackets() + { + + // Test to make sure packets are defined properly + $this->assertEquals($this->packets, \PHPUnit\Framework\Assert::readAttribute($this->stub, 'packets')); + } + + /** + * Test invalid packet type without debug + */ + public function testInvalidPacketType() + { + + // Read in a css source file + $source = file_get_contents(sprintf('%s/Providers/Teeworlds/1_response.txt', __DIR__)); + + // Change the first packet to some unknown header + $source = str_replace( + "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xffinf35", + "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xffinf36", + $source + ); + + // Should show up as offline + $testResult = $this->queryTest( + '127.0.0.1:8303', + 'teeworlds', + explode(PHP_EOL . '||' . PHP_EOL, $source), + false + ); + + $this->assertFalse($testResult['gq_online']); + } + + /** + * Test for invalid packet type in response + * + * @expectedException \Exception + * @expectedExceptionMessage GameQ\Protocols\Teeworlds::processResponse response type + * 'ffffffffffffffffffff696e663336' is not valid + */ + public function testInvalidPacketTypeDebug() + { + + // Read in a css source file + $source = file_get_contents(sprintf('%s/Providers/Teeworlds/1_response.txt', __DIR__)); + + // Change the first packet to some unknown header + $source = str_replace( + "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xffinf35", + "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xffinf36", + $source + ); + + // Should show up as offline + $this->queryTest('127.0.0.1:8303', 'teeworlds', explode(PHP_EOL . '||' . PHP_EOL, $source), true); + } + + /** + * Test responses for Teeworlds + * + * @dataProvider loadData + * + * @param $responses + * @param $result + */ + public function testResponses($responses, $result) + { + + // Pull the first key off the array this is the server ip:port + $server = key($result); + + $testResult = $this->queryTest( + $server, + 'teeworlds', + $responses, + false, + [] + ); + + $this->assertEquals($result[$server], $testResult); + } +} diff --git a/gameq/tests/Protocols/Terraria.php b/gameq/tests/Protocols/Terraria.php new file mode 100644 index 0000000..673bd21 --- /dev/null +++ b/gameq/tests/Protocols/Terraria.php @@ -0,0 +1,46 @@ +. + */ + +namespace GameQ\Tests\Protocols; + +class Terraria extends Base +{ + + /** + * Test responses for Terraria + * + * @dataProvider loadData + * + * @param $responses + * @param $result + */ + public function testResponses($responses, $result) + { + + // Pull the first key off the array this is the server ip:port + $server = key($result); + + $testResult = $this->queryTest( + $server, + 'terraria', + $responses + ); + + $this->assertEquals($result[$server], $testResult); + } +} diff --git a/gameq/tests/Protocols/Tf2.php b/gameq/tests/Protocols/Tf2.php new file mode 100644 index 0000000..190186f --- /dev/null +++ b/gameq/tests/Protocols/Tf2.php @@ -0,0 +1,50 @@ +. + */ + +namespace GameQ\Tests\Protocols; + +/** + * Test Class for TF2 + * + * @package GameQ\Tests\Protocols + */ +class Tf2 extends Base +{ + /** + * Test responses for Tf2 + * + * @dataProvider loadData + * + * @param $responses + * @param $result + */ + public function testResponses($responses, $result) + { + + // Pull the first key off the array this is the server ip:port + $server = key($result); + + $testResult = $this->queryTest( + $server, + 'tf2', + $responses + ); + + $this->assertEquals($result[$server], $testResult); + } +} diff --git a/gameq/tests/Protocols/Theforrest.php b/gameq/tests/Protocols/Theforrest.php new file mode 100644 index 0000000..b3f5ef4 --- /dev/null +++ b/gameq/tests/Protocols/Theforrest.php @@ -0,0 +1,50 @@ +. + */ + +namespace GameQ\Tests\Protocols; + +/** + * Test Class for The Forrest + * + * @package GameQ\Tests\Protocols + */ +class Theforrest extends Base +{ + /** + * Test responses for The Forrest + * + * @dataProvider loadData + * + * @param $responses + * @param $result + */ + public function testResponses($responses, $result) + { + + // Pull the first key off the array this is the server ip:port + $server = key($result); + + $testResult = $this->queryTest( + $server, + 'theforrest', + $responses + ); + + $this->assertEquals($result[$server], $testResult, '', 0.000000001); + } +} diff --git a/gameq/tests/Protocols/Tibia.php b/gameq/tests/Protocols/Tibia.php new file mode 100644 index 0000000..8bc797f --- /dev/null +++ b/gameq/tests/Protocols/Tibia.php @@ -0,0 +1,120 @@ +. + */ + +namespace GameQ\Tests\Protocols; + +class Tibia extends Base +{ + + /** + * Holds stub on setup + * + * @type \GameQ\Protocols\Tibia + */ + protected $stub; + + /** + * Holds the expected packets for this protocol class + * + * @type array + */ + protected $packets = [ + \GameQ\Protocol::PACKET_STATUS => "\x06\x00\xFF\xFF\x69\x6E\x66\x6F", + ]; + + /** + * Setup + */ + public function setUp() + { + + // Create the stub class + $this->stub = $this->getMockBuilder('\GameQ\Protocols\Tibia') + ->enableProxyingToOriginalMethods() + ->getMock(); + } + + /** + * Test the packets to make sure they are correct for source + */ + public function testPackets() + { + + // Test to make sure packets are defined properly + $this->assertEquals($this->packets, \PHPUnit\Framework\Assert::readAttribute($this->stub, 'packets')); + } + + /** + * Test invalid xml response without debug + */ + public function testInvalidPacketType() + { + + // Read in a Tibia source file + $source = file_get_contents(sprintf('%s/Providers/Tibia/1_response.txt', __DIR__)); + + // Add bogus characters to the response + $source = 'data' . $source . 'data'; + + // Should show up as offline + $testResult = $this->queryTest('127.0.0.1:7171', 'tibia', explode(PHP_EOL . '||' . PHP_EOL, $source), false); + + $this->assertFalse($testResult['gq_online']); + } + + /** + * Test for invalid response in response + * + * @expectedException \Exception + * @expectedExceptionMessage GameQ\Protocols\Tibia::processResponse Unable to load XML string. + */ + public function testInvalidPacketTypeDebug() + { + // Read in a Tibia source file + $source = file_get_contents(sprintf('%s/Providers/Tibia/1_response.txt', __DIR__)); + + // Add bogus characters to the response + $source = 'data' . $source . 'data'; + + // Should show up as offline + $this->queryTest('127.0.0.1:7171', 'tibia', explode(PHP_EOL . '||' . PHP_EOL, $source), true); + } + + /** + * Test responses for Tibia + * + * @dataProvider loadData + * + * @param $responses + * @param $result + */ + public function testResponses($responses, $result) + { + + // Pull the first key off the array this is the server ip:port + $server = key($result); + + $testResult = $this->queryTest( + $server, + 'tibia', + $responses + ); + + $this->assertEquals($result[$server], $testResult); + } +} diff --git a/gameq/tests/Protocols/Unreal2.php b/gameq/tests/Protocols/Unreal2.php new file mode 100644 index 0000000..402e757 --- /dev/null +++ b/gameq/tests/Protocols/Unreal2.php @@ -0,0 +1,100 @@ +. + */ + +namespace GameQ\Tests\Protocols; + +class Unreal2 extends Base +{ + + /** + * Holds stub on setup + * + * @type \GameQ\Protocols\Unreal2 + */ + protected $stub; + + /** + * Holds the expected packets for this protocol class + * + * @type array + */ + protected $packets = [ + \GameQ\Protocol::PACKET_DETAILS => "\x79\x00\x00\x00\x00", + \GameQ\Protocol::PACKET_RULES => "\x79\x00\x00\x00\x01", + \GameQ\Protocol::PACKET_PLAYERS => "\x79\x00\x00\x00\x02", + ]; + + /** + * Setup + */ + public function setUp() + { + + // Create the stub class + $this->stub = $this->getMockBuilder('\GameQ\Protocols\Unreal2') + ->enableProxyingToOriginalMethods() + ->getMock(); + } + + /** + * Test the packets to make sure they are correct for source + */ + public function testPackets() + { + + // Test to make sure packets are defined properly + $this->assertEquals($this->packets, \PHPUnit\Framework\Assert::readAttribute($this->stub, 'packets')); + } + + /** + * Test invalid packet type without debug + */ + public function testInvalidPacketType() + { + + // Read in a ut2004 source file + $source = file_get_contents(sprintf('%s/Providers/Ut2004/1_response.txt', __DIR__)); + + // Change the first packet to some unknown header + $source = str_replace("\x80\x00\x00\x00\x00", "\x80\x00\x00\x00\x07", $source); + + // Should show up as offline + $testResult = $this->queryTest('127.0.0.1:7777', 'unreal2', explode(PHP_EOL . '||' . PHP_EOL, $source), false); + + $this->assertFalse($testResult['gq_online']); + } + + /** + * Test for invalid packet type in response + * + * @expectedException \Exception + * @expectedExceptionMessage GameQ\Protocols\Unreal2::processResponse response type '8000000007' is not valid + */ + public function testInvalidPacketTypeDebug() + { + + // Read in a ut2004 source file + $source = file_get_contents(sprintf('%s/Providers/Ut2004/1_response.txt', __DIR__)); + + // Change the first packet to some unknown header + $source = str_replace("\x80\x00\x00\x00\x00", "\x80\x00\x00\x00\x07", $source); + + // Should show up as offline + $this->queryTest('127.0.0.1:7777', 'unreal2', explode(PHP_EOL . '||' . PHP_EOL, $source), true); + } +} diff --git a/gameq/tests/Protocols/Unturned.php b/gameq/tests/Protocols/Unturned.php new file mode 100644 index 0000000..0bb3b56 --- /dev/null +++ b/gameq/tests/Protocols/Unturned.php @@ -0,0 +1,50 @@ +. + */ + +namespace GameQ\Tests\Protocols; + +/** + * Test Class for Unturned + * + * @package GameQ\Tests\Protocols + */ +class Unturned extends Base +{ + /** + * Test responses for Unturned + * + * @dataProvider loadData + * + * @param $responses + * @param $result + */ + public function testResponses($responses, $result) + { + + // Pull the first key off the array this is the server ip:port + $server = key($result); + + $testResult = $this->queryTest( + $server, + 'unturned', + $responses + ); + + $this->assertEquals($result[$server], $testResult); + } +} diff --git a/gameq/tests/Protocols/Ut.php b/gameq/tests/Protocols/Ut.php new file mode 100644 index 0000000..578cafd --- /dev/null +++ b/gameq/tests/Protocols/Ut.php @@ -0,0 +1,52 @@ +. + */ + +namespace GameQ\Tests\Protocols; + +/** + * Test Class for Unreal Tournament + * + * @package GameQ\Tests\Protocols + */ +class Ut extends Base +{ + /** + * Test responses for Unreal Tournament + * + * @dataProvider loadData + * + * @param $responses + * @param $result + */ + public function testResponses($responses, $result) + { + + // Pull the first key off the array this is the server ip:port + $server = key($result); + + $testResult = $this->queryTest( + $server, + 'ut', + $responses, + false, + [] + ); + + $this->assertEquals($result[$server], $testResult); + } +} diff --git a/gameq/tests/Protocols/Ut2004.php b/gameq/tests/Protocols/Ut2004.php new file mode 100644 index 0000000..d4ea10e --- /dev/null +++ b/gameq/tests/Protocols/Ut2004.php @@ -0,0 +1,54 @@ +. + */ + +namespace GameQ\Tests\Protocols; + +/** + * Test Class for Unreal Tournament 2004 + * + * @package GameQ\Tests\Protocols + */ +class Ut2004 extends Base +{ + /** + * Test responses for Unreal Tournament 2004 + * + * @dataProvider loadData + * + * @param $responses + * @param $result + */ + public function testResponses($responses, $result) + { + + // Pull the first key off the array this is the server ip:port + $server = key($result); + + $testResult = $this->queryTest( + $server, + 'ut2004', + $responses, + false, + [ + \GameQ\Server::SERVER_OPTIONS_QUERY_PORT => $result[$server]['gq_port_query'], + ] + ); + + $this->assertEquals($result[$server], $testResult); + } +} diff --git a/gameq/tests/Protocols/Ut3.php b/gameq/tests/Protocols/Ut3.php new file mode 100644 index 0000000..1f049e6 --- /dev/null +++ b/gameq/tests/Protocols/Ut3.php @@ -0,0 +1,54 @@ +. + */ + +namespace GameQ\Tests\Protocols; + +/** + * Test Class for Unreal Tournament 3 + * + * @package GameQ\Tests\Protocols + */ +class Ut3 extends Base +{ + /** + * Test responses for Unreal Tournament 3 + * + * @dataProvider loadData + * + * @param $responses + * @param $result + */ + public function testResponses($responses, $result) + { + + // Pull the first key off the array this is the server ip:port + $server = key($result); + + $testResult = $this->queryTest( + $server, + 'ut3', + $responses, + false, + [ + \GameQ\Server::SERVER_OPTIONS_QUERY_PORT => $result[$server]['gq_port_query'], + ] + ); + + $this->assertEquals($result[$server], $testResult); + } +} diff --git a/gameq/tests/Protocols/Ventrilo.php b/gameq/tests/Protocols/Ventrilo.php new file mode 100644 index 0000000..f6b88bd --- /dev/null +++ b/gameq/tests/Protocols/Ventrilo.php @@ -0,0 +1,90 @@ +. + */ + +namespace GameQ\Tests\Protocols; + +/** + * Test Class for Ventrilo + * + * @package GameQ\Tests\Protocols + */ +class Ventrilo extends Base +{ + + /** + * Holds stub on setup + * + * @type \GameQ\Protocols\Ventrilo + */ + protected $stub; + + /** + * Holds the expected packets for this protocol class + * + * @type array + */ + protected $packets = [ + \GameQ\Protocol::PACKET_ALL => + "V\xc8\xf4\xf9`\xa2\x1e\xa5M\xfb\x03\xccQN\xa1\x10\x95\xaf\xb2g\x17g\x812\xfbW\xfd\x8e\xd2\x22r\x034z\xbb\x98", + ]; + + /** + * Setup + */ + public function setUp() + { + + // Create the stub class + $this->stub = $this->getMockBuilder('\GameQ\Protocols\Ventrilo') + ->enableProxyingToOriginalMethods() + ->getMock(); + } + + /** + * Test the packets to make sure they are correct for source + */ + public function testPackets() + { + + // Test to make sure packets are defined properly + $this->assertEquals($this->packets, \PHPUnit\Framework\Assert::readAttribute($this->stub, 'packets')); + } + + /** + * Test responses for Ventrilo + * + * @dataProvider loadData + * + * @param $responses + * @param $result + */ + public function testResponses($responses, $result) + { + + // Pull the first key off the array this is the server ip:port + $server = key($result); + + $testResult = $this->queryTest( + $server, + 'ventrilo', + $responses + ); + + $this->assertEquals($result[$server], $testResult); + } +} diff --git a/gameq/tests/Protocols/Warsow.php b/gameq/tests/Protocols/Warsow.php new file mode 100644 index 0000000..f87e814 --- /dev/null +++ b/gameq/tests/Protocols/Warsow.php @@ -0,0 +1,50 @@ +. + */ + +namespace GameQ\Tests\Protocols; + +/** + * Test Class for Warsow + * + * @package GameQ\Tests\Protocols + */ +class Warsow extends Base +{ + /** + * Test responses for Warsow + * + * @dataProvider loadData + * + * @param $responses + * @param $result + */ + public function testResponses($responses, $result) + { + + // Pull the first key off the array this is the server ip:port + $server = key($result); + + $testResult = $this->queryTest( + $server, + 'warsow', + $responses + ); + + $this->assertEquals($result[$server], $testResult); + } +} diff --git a/gameq/tests/Protocols/Wurm.php b/gameq/tests/Protocols/Wurm.php new file mode 100644 index 0000000..f57d7d8 --- /dev/null +++ b/gameq/tests/Protocols/Wurm.php @@ -0,0 +1,54 @@ +. + */ + +namespace GameQ\Tests\Protocols; + +/** + * Test Class for Wurm Unlimited + * + * @package GameQ\Tests\Protocols + */ +class Wurm extends Base +{ + /** + * Test responses for Wurm + * + * @dataProvider loadData + * + * @param $responses + * @param $result + */ + public function testResponses($responses, $result) + { + + // Pull the first key off the array this is the server ip:port + $server = key($result); + + $testResult = $this->queryTest( + $server, + 'wurm', + $responses, + false, + [ + \GameQ\Server::SERVER_OPTIONS_QUERY_PORT => $result[ $server ]['gq_port_query'], + ] + ); + + $this->assertEquals($result[ $server ], $testResult, '', 0.0001); + } +} diff --git a/gameq/tests/Protocols/generate_provider b/gameq/tests/Protocols/generate_provider new file mode 100644 index 0000000..23ef2d5 --- /dev/null +++ b/gameq/tests/Protocols/generate_provider @@ -0,0 +1,119 @@ +#!/usr/bin/env php +. + */ + +/* + * This file will query a single server and save the contents of the raw packet responses as well as the parsed + * packets into their own indexed files underneath tests/Protocols/Providers/. These are used for unit testing of + * the protocol classes to make sure changes do not break existing functionality. Something v2 had a few problems with. + * + * Requires composer install in dev mode + * + * Usage examples: + * $ php tests/Protocols/generate_provider -s 127.0.0.1:27015 -p css + * $ php tests/Protocols/generate_provider -s 127.0.0.1:27015 -p css -o '{"query_port":27018}' + */ + +require __DIR__ . '/../../vendor/autoload.php'; + +use GetOptionKit\OptionCollection; +use GetOptionKit\OptionParser; + +$specs = new OptionCollection; +$specs->add('s|server:', 'Server to contact ip|hostname:port') + ->isa('String'); + +$specs->add('p|protocol:', 'Protocol of the server') + ->isa('String'); + +$specs->add('o|options:', 'Optional: Server options such as query port') + ->isa('String'); + +$parser = new OptionParser($specs); + +try { + // Parse the argv + $result = $parser->parse($argv); + + // Get the options + $options = $result->toArray(); + + // Make sure options exist + if (!array_key_exists('server', $options) || !array_key_exists('protocol', $options)) { + throw new Exception('Missing arguments'); + } + + // Check the options + if (array_key_exists('options', $options)) { + if (($server_options = json_decode($options['options'], true)) === null) { + throw new Exception('The options setting must be a JSON string'); + } + } else { + $server_options = [ ]; + } + + // Build the directory where we want to store this data + $provider_dir = sprintf('%s/Providers/%s', __DIR__, ucfirst(strtolower($options['protocol']))); + + // Make the directory if it does not already exist + if (!is_dir($provider_dir)) { + mkdir($provider_dir, null, true); + } + + // Figure out the number of files in the provider directory + $pd = new FilesystemIterator($provider_dir, FilesystemIterator::SKIP_DOTS); + + // Figure out the index by taking the count and divide by 2 since there are 2 files for each server test + $index = (iterator_count($pd) / 2) + 1; + + unset($pd); + + // Let's do GameQ + $gq = new \GameQ\GameQ(); + $gq->removeFilter('normalize_d751713988987e9331980363e24189ce'); // We dont care about normalize for testing the core + $gq->setOption('debug', true); + $gq->setOption('timeout', 10); + $gq->setOption('stream_timeout', 900000); + $gq->setOption('capture_packets_file', sprintf('%s/%d_response.txt', $provider_dir, $index)); + + // Add our test server + $gq->addServer([ + \GameQ\Server::SERVER_ID => $options['server'], + \GameQ\Server::SERVER_TYPE => $options['protocol'], + \GameQ\Server::SERVER_HOST => $options['server'], + \GameQ\Server::SERVER_OPTIONS => $server_options, + ]); + + // Process + $results = $gq->process(); + + // Save the result into a file + $result = file_put_contents(sprintf('%s/%d_result.json', $provider_dir, $index), json_encode( + $results, + JSON_UNESCAPED_UNICODE | JSON_PARTIAL_OUTPUT_ON_ERROR + )); + + exit(0); +} catch (Exception $e) { + echo $e->getMessage() . PHP_EOL; + + $printer = new GetOptionKit\OptionPrinter\ConsoleOptionPrinter; + echo $printer->render($specs) . PHP_EOL; + + exit(1); +} diff --git a/gameq/tests/Providers/Buffer/16bitsigned_1.txt b/gameq/tests/Providers/Buffer/16bitsigned_1.txt new file mode 100644 index 0000000..d60f854 --- /dev/null +++ b/gameq/tests/Providers/Buffer/16bitsigned_1.txt @@ -0,0 +1 @@ +_ \ No newline at end of file diff --git a/gameq/tests/Providers/Buffer/16bitsigned_2.txt b/gameq/tests/Providers/Buffer/16bitsigned_2.txt new file mode 100644 index 0000000..b398f13 --- /dev/null +++ b/gameq/tests/Providers/Buffer/16bitsigned_2.txt @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/gameq/tests/Providers/Buffer/16bitsigned_be_1.txt b/gameq/tests/Providers/Buffer/16bitsigned_be_1.txt new file mode 100644 index 0000000..340caa6 --- /dev/null +++ b/gameq/tests/Providers/Buffer/16bitsigned_be_1.txt @@ -0,0 +1 @@ +_ \ No newline at end of file diff --git a/gameq/tests/Providers/Buffer/16bitsigned_be_2.txt b/gameq/tests/Providers/Buffer/16bitsigned_be_2.txt new file mode 100644 index 0000000..bb386b9 --- /dev/null +++ b/gameq/tests/Providers/Buffer/16bitsigned_be_2.txt @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/gameq/tests/Providers/Buffer/16bitunsigned_1.txt b/gameq/tests/Providers/Buffer/16bitunsigned_1.txt new file mode 100644 index 0000000..460c9de --- /dev/null +++ b/gameq/tests/Providers/Buffer/16bitunsigned_1.txt @@ -0,0 +1 @@ +< \ No newline at end of file diff --git a/gameq/tests/Providers/Buffer/16bitunsigned_2.txt b/gameq/tests/Providers/Buffer/16bitunsigned_2.txt new file mode 100644 index 0000000..0aa2925 --- /dev/null +++ b/gameq/tests/Providers/Buffer/16bitunsigned_2.txt @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/gameq/tests/Providers/Buffer/16bitunsigned_be_1.txt b/gameq/tests/Providers/Buffer/16bitunsigned_be_1.txt new file mode 100644 index 0000000..653cfde --- /dev/null +++ b/gameq/tests/Providers/Buffer/16bitunsigned_be_1.txt @@ -0,0 +1 @@ +< \ No newline at end of file diff --git a/gameq/tests/Providers/Buffer/16bitunsigned_be_2.txt b/gameq/tests/Providers/Buffer/16bitunsigned_be_2.txt new file mode 100644 index 0000000..4345424 --- /dev/null +++ b/gameq/tests/Providers/Buffer/16bitunsigned_be_2.txt @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/gameq/tests/Providers/Buffer/32bitsigned_1.txt b/gameq/tests/Providers/Buffer/32bitsigned_1.txt new file mode 100644 index 0000000..81eefd6 --- /dev/null +++ b/gameq/tests/Providers/Buffer/32bitsigned_1.txt @@ -0,0 +1 @@ +xrbJ \ No newline at end of file diff --git a/gameq/tests/Providers/Buffer/32bitsigned_2.txt b/gameq/tests/Providers/Buffer/32bitsigned_2.txt new file mode 100644 index 0000000..56f624f --- /dev/null +++ b/gameq/tests/Providers/Buffer/32bitsigned_2.txt @@ -0,0 +1 @@ +mX \ No newline at end of file diff --git a/gameq/tests/Providers/Buffer/32bitsigned_be_1.txt b/gameq/tests/Providers/Buffer/32bitsigned_be_1.txt new file mode 100644 index 0000000..04bbf16 --- /dev/null +++ b/gameq/tests/Providers/Buffer/32bitsigned_be_1.txt @@ -0,0 +1 @@ +Jbrx \ No newline at end of file diff --git a/gameq/tests/Providers/Buffer/32bitsigned_be_2.txt b/gameq/tests/Providers/Buffer/32bitsigned_be_2.txt new file mode 100644 index 0000000..09ff8fd --- /dev/null +++ b/gameq/tests/Providers/Buffer/32bitsigned_be_2.txt @@ -0,0 +1 @@ +Xm \ No newline at end of file diff --git a/gameq/tests/Providers/Buffer/32bitunsigned_1.txt b/gameq/tests/Providers/Buffer/32bitunsigned_1.txt new file mode 100644 index 0000000..a86aec1 --- /dev/null +++ b/gameq/tests/Providers/Buffer/32bitunsigned_1.txt @@ -0,0 +1 @@ +K \ No newline at end of file diff --git a/gameq/tests/Providers/Buffer/32bitunsigned_2.txt b/gameq/tests/Providers/Buffer/32bitunsigned_2.txt new file mode 100644 index 0000000..623860e --- /dev/null +++ b/gameq/tests/Providers/Buffer/32bitunsigned_2.txt @@ -0,0 +1 @@ +:]J \ No newline at end of file diff --git a/gameq/tests/Providers/Buffer/32bitunsigned_be_1.txt b/gameq/tests/Providers/Buffer/32bitunsigned_be_1.txt new file mode 100644 index 0000000..58c615f --- /dev/null +++ b/gameq/tests/Providers/Buffer/32bitunsigned_be_1.txt @@ -0,0 +1 @@ +K \ No newline at end of file diff --git a/gameq/tests/Providers/Buffer/32bitunsigned_be_2.txt b/gameq/tests/Providers/Buffer/32bitunsigned_be_2.txt new file mode 100644 index 0000000..774866f --- /dev/null +++ b/gameq/tests/Providers/Buffer/32bitunsigned_be_2.txt @@ -0,0 +1 @@ +J]: \ No newline at end of file diff --git a/gameq/tests/Providers/Buffer/32float_1.txt b/gameq/tests/Providers/Buffer/32float_1.txt new file mode 100644 index 0000000..314a348 --- /dev/null +++ b/gameq/tests/Providers/Buffer/32float_1.txt @@ -0,0 +1 @@ +*t> \ No newline at end of file diff --git a/gameq/tests/Providers/Buffer/32float_2.txt b/gameq/tests/Providers/Buffer/32float_2.txt new file mode 100644 index 0000000..d212f81 --- /dev/null +++ b/gameq/tests/Providers/Buffer/32float_2.txt @@ -0,0 +1 @@ +~ \ No newline at end of file diff --git a/gameq/tests/Providers/Buffer/32float_be_1.txt b/gameq/tests/Providers/Buffer/32float_be_1.txt new file mode 100644 index 0000000..25f5a83 --- /dev/null +++ b/gameq/tests/Providers/Buffer/32float_be_1.txt @@ -0,0 +1 @@ +>t* \ No newline at end of file diff --git a/gameq/tests/Providers/Buffer/32float_be_2.txt b/gameq/tests/Providers/Buffer/32float_be_2.txt new file mode 100644 index 0000000..7fec986 --- /dev/null +++ b/gameq/tests/Providers/Buffer/32float_be_2.txt @@ -0,0 +1 @@ +~ \ No newline at end of file diff --git a/gameq/tests/Providers/Buffer/64bitunsigned_1.txt b/gameq/tests/Providers/Buffer/64bitunsigned_1.txt new file mode 100644 index 0000000..18ed3fe --- /dev/null +++ b/gameq/tests/Providers/Buffer/64bitunsigned_1.txt @@ -0,0 +1 @@ +017U@ \ No newline at end of file diff --git a/gameq/tests/Providers/Buffer/64bitunsigned_2.txt b/gameq/tests/Providers/Buffer/64bitunsigned_2.txt new file mode 100644 index 0000000..53ac1b0 Binary files /dev/null and b/gameq/tests/Providers/Buffer/64bitunsigned_2.txt differ diff --git a/gameq/tests/Providers/Buffer/64bitunsigned_be_1.txt b/gameq/tests/Providers/Buffer/64bitunsigned_be_1.txt new file mode 100644 index 0000000..b103c8f --- /dev/null +++ b/gameq/tests/Providers/Buffer/64bitunsigned_be_1.txt @@ -0,0 +1 @@ +@U710 \ No newline at end of file diff --git a/gameq/tests/Providers/Buffer/64bitunsigned_be_2.txt b/gameq/tests/Providers/Buffer/64bitunsigned_be_2.txt new file mode 100644 index 0000000..003bc0e Binary files /dev/null and b/gameq/tests/Providers/Buffer/64bitunsigned_be_2.txt differ diff --git a/gameq/tests/Providers/Buffer/8bitsigned_1.txt b/gameq/tests/Providers/Buffer/8bitsigned_1.txt new file mode 100644 index 0000000..301160a --- /dev/null +++ b/gameq/tests/Providers/Buffer/8bitsigned_1.txt @@ -0,0 +1 @@ +8 \ No newline at end of file diff --git a/gameq/tests/Providers/Buffer/8bitsigned_2.txt b/gameq/tests/Providers/Buffer/8bitsigned_2.txt new file mode 100644 index 0000000..2b8e128 --- /dev/null +++ b/gameq/tests/Providers/Buffer/8bitsigned_2.txt @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/gameq/tests/Providers/Buffer/8bitunsigned_1.txt b/gameq/tests/Providers/Buffer/8bitunsigned_1.txt new file mode 100644 index 0000000..afb09b4 --- /dev/null +++ b/gameq/tests/Providers/Buffer/8bitunsigned_1.txt @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/gameq/tests/Providers/Buffer/8bitunsigned_2.txt b/gameq/tests/Providers/Buffer/8bitunsigned_2.txt new file mode 100644 index 0000000..9280c0d --- /dev/null +++ b/gameq/tests/Providers/Buffer/8bitunsigned_2.txt @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/gameq/tests/Query/Core.php b/gameq/tests/Query/Core.php new file mode 100644 index 0000000..301a606 --- /dev/null +++ b/gameq/tests/Query/Core.php @@ -0,0 +1,66 @@ +. + */ + +namespace GameQ\Tests\Query; + +use GameQ\Tests\TestBase; + +/** + * Class Core testing + * + * @package GameQ\Tests\Query + */ +class Core extends TestBase +{ + /** + * Test setting the properties for the query core + */ + public function testSet() + { + + $stub = $this->getMockForAbstractClass('\GameQ\Query\Core', [ ]); + + // Set the properties + $stub->set('tcp', '127.0.0.1', 27015, 5, true); + + // Verify the properties + $this->assertEquals('tcp', \PHPUnit\Framework\Assert::readAttribute($stub, 'transport')); + + $this->assertEquals('127.0.0.1', \PHPUnit\Framework\Assert::readAttribute($stub, 'ip')); + + $this->assertEquals(27015, \PHPUnit\Framework\Assert::readAttribute($stub, 'port')); + + $this->assertEquals(5, \PHPUnit\Framework\Assert::readAttribute($stub, 'timeout')); + + $this->assertEquals(true, \PHPUnit\Framework\Assert::readAttribute($stub, 'blocking')); + + // Testing the clone + $stub_clone = clone $stub; + + // All of these should tbe the defaults now + $this->assertNull(\PHPUnit\Framework\Assert::readAttribute($stub_clone, 'transport')); + + $this->assertNull(\PHPUnit\Framework\Assert::readAttribute($stub_clone, 'ip')); + + $this->assertNull(\PHPUnit\Framework\Assert::readAttribute($stub_clone, 'port')); + + $this->assertEquals(3, \PHPUnit\Framework\Assert::readAttribute($stub_clone, 'timeout')); + + $this->assertEquals(false, \PHPUnit\Framework\Assert::readAttribute($stub_clone, 'blocking')); + } +} diff --git a/gameq/tests/Server.php b/gameq/tests/Server.php new file mode 100644 index 0000000..d25bb50 --- /dev/null +++ b/gameq/tests/Server.php @@ -0,0 +1,284 @@ +. + */ + +namespace GameQ\Tests; + +/** + * Server testing class + * + * @package GameQ\Tests + */ +class Server extends TestBase +{ + /** + * Test for missing server type + * + * @expectedException \GameQ\Exception\Server + * @expectedExceptionMessage Missing server info key 'type'! + */ + public function testMissingServerType() + { + + // Create a mock server should throw exception + $this->getMockBuilder('\GameQ\Server') + ->setConstructorArgs([]) + ->getMock(); + } + + /** + * Test for missing host information + * + * @expectedException \GameQ\Exception\Server + * @expectedExceptionMessage Missing server info key 'host'! + */ + public function testMissingHost() + { + + // Create a mock server Create a mock server should throw exception + $this->getMockBuilder('\GameQ\Server') + ->setConstructorArgs([ + [ + \GameQ\Server::SERVER_TYPE => 'source', + ], + ]) + ->enableProxyingToOriginalMethods() + ->getMock(); + } + + /** + * Test setting server options + */ + public function testSetServerOptions() + { + + $options = [ + 'option1' => 'val1', + 'option2' => 'val2', + ]; + + // Create a server with some options + $server = $this->getMockBuilder('\GameQ\Server') + ->setConstructorArgs([ + [ + \GameQ\Server::SERVER_HOST => '127.0.0.1:27015', + \GameQ\Server::SERVER_TYPE => 'source', + \GameQ\Server::SERVER_OPTIONS => $options, + ], + ]) + ->enableProxyingToOriginalMethods() + ->getMock(); + + $this->assertEquals($options, \PHPUnit\Framework\Assert::readAttribute($server, 'options')); + + // Check the getOption + $this->assertEquals($options['option1'], $server->getOption('option1')); + + // Check the get null for missing option + $this->assertNull($server->getOption('doesnotexist')); + + // Check the setOption + $server->setOption('option3', 'valnew'); + + $this->assertEquals('valnew', $server->getOption('option3')); + } + + /** + * Test that the server id is behaving properly + */ + public function testServerId() + { + + $id = '127.0.0.1:27015'; + + // Create a server with id + $server = $this->getMockBuilder('\GameQ\Server') + ->setConstructorArgs([ + [ + \GameQ\Server::SERVER_HOST => $id, + \GameQ\Server::SERVER_TYPE => 'source', + ], + ]) + ->enableProxyingToOriginalMethods() + ->getMock(); + + $this->assertEquals($id, \PHPUnit\Framework\Assert::readAttribute($server, 'id')); + + $id = 'my_server_#1'; + + // Create a server with id + $server = $this->getMockBuilder('\GameQ\Server') + ->setConstructorArgs([ + [ + \GameQ\Server::SERVER_HOST => '127.0.0.1:27015', + \GameQ\Server::SERVER_TYPE => 'source', + \GameQ\Server::SERVER_ID => $id, + ], + ]) + ->enableProxyingToOriginalMethods() + ->getMock(); + + $this->assertEquals($id, \PHPUnit\Framework\Assert::readAttribute($server, 'id')); + + $this->assertEquals($id, $server->id()); + } + + /** + * Test ipv4 missing port + * + * @expectedException \GameQ\Exception\Server + * @expectedExceptionMessage The host address '127.0.0.1' is missing the port. All servers must have a port + * defined! + */ + public function testIpv4NoPort() + { + + // Create a mock server + $this->getMockBuilder('\GameQ\Server') + ->setConstructorArgs([ + [ + \GameQ\Server::SERVER_HOST => '127.0.0.1', + \GameQ\Server::SERVER_TYPE => 'source', + ], + ]) + ->enableProxyingToOriginalMethods() + ->getMock(); + } + + /** + * Test IPv4 unresolvable hostname + * + * @expectedException \GameQ\Exception\Server + * @expectedExceptionMessage Unable to resolve the host 'some.unresolable.domain' to an IP address. + */ + public function testIpv4UnresovlableHostname() + { + // Create a mock server + $this->getMockBuilder('\GameQ\Server') + ->setConstructorArgs([ + [ + \GameQ\Server::SERVER_HOST => 'some.unresolable.domain:27015', + \GameQ\Server::SERVER_TYPE => 'source', + ], + ]) + ->enableProxyingToOriginalMethods() + ->getMock(); + } + + /** + * Test IPv6 host + */ + public function testIpv6() + { + // Create a mock server + $stub = $this->getMockBuilder('\GameQ\Server') + ->setConstructorArgs([ + [ + \GameQ\Server::SERVER_HOST => '[::1]:27015', + \GameQ\Server::SERVER_TYPE => 'source', + ], + ]) + ->enableProxyingToOriginalMethods() + ->getMock(); + + $this->assertEquals('[::1]:27015', \PHPUnit\Framework\Assert::readAttribute($stub, 'id')); + } + + /** + * Test ipv6 missing port + * + * @expectedException \GameQ\Exception\Server + * @expectedExceptionMessage The host address '[::1]' is missing the port. All servers must have a port defined! + */ + public function testIpv6NoPort() + { + // Create a mock server + $this->getMockBuilder('\GameQ\Server') + ->setConstructorArgs([ + [ + \GameQ\Server::SERVER_HOST => '[::1]', + \GameQ\Server::SERVER_TYPE => 'source', + ], + ]) + ->enableProxyingToOriginalMethods() + ->getMock(); + } + + /** + * Test invalid ipv6 + * + * @expectedException \GameQ\Exception\Server + * @expectedExceptionMessage The IPv6 address '[:0:1]' is invalid. + */ + public function testIpv6Invalid() + { + // Create a mock server + $this->getMockBuilder('\GameQ\Server') + ->setConstructorArgs([ + [ + \GameQ\Server::SERVER_HOST => '[:0:1]:27015', + \GameQ\Server::SERVER_TYPE => 'source', + ], + ]) + ->enableProxyingToOriginalMethods() + ->getMock(); + } + + /** + * Test invalid protocol + * + * @expectedException \GameQ\Exception\Server + * @expectedExceptionMessage Unable to locate Protocols class for 'doesnotexist'! + */ + public function testInvalidProtocol() + { + // Create a mock server + $this->getMockBuilder('\GameQ\Server') + ->setConstructorArgs([ + [ + \GameQ\Server::SERVER_HOST => '127.0.0.1:27015', + \GameQ\Server::SERVER_TYPE => 'doesnotexist', + ], + ]) + ->enableProxyingToOriginalMethods() + ->getMock(); + } + + /** + * Test for specific query port defined in server creation + */ + public function testSpecifiedQueryPort() + { + $query_port = 27016; + + // Create a mock server + $server = $this->getMockBuilder('\GameQ\Server') + ->setConstructorArgs([ + [ + \GameQ\Server::SERVER_HOST => '127.0.0.1:27015', + \GameQ\Server::SERVER_TYPE => 'source', + \GameQ\Server::SERVER_OPTIONS => [ + \GameQ\Server::SERVER_OPTIONS_QUERY_PORT => $query_port, + ], + ], + ]) + ->enableProxyingToOriginalMethods() + ->getMock(); + + $this->assertEquals($query_port, \PHPUnit\Framework\Assert::readAttribute($server, 'port_query')); + } +} diff --git a/gameq/tests/TestBase.php b/gameq/tests/TestBase.php new file mode 100644 index 0000000..ae150cc --- /dev/null +++ b/gameq/tests/TestBase.php @@ -0,0 +1,48 @@ +. + */ + +namespace GameQ\Tests; + +class TestBase extends \PHPUnit\Framework\TestCase +{ + + /** + * TestBase constructor overload. + * + * @param null $name + * @param array $data + * @param string $dataName + */ + public function __construct($name = null, array $data = [], $dataName = '') + { + // PHPUnit 5 & 6+ hack for name spaces + if (!class_exists('\PHPUnit\Framework\Assert', true)) { + class_alias('\PHPUnit_Framework_Assert', '\PHPUnit\Framework\Assert'); + } + + parent::__construct($name, $data, $dataName); + } + + /** + * Fake test so PHPUnit won't complain about no tests in class. + */ + public function testWarning() + { + $this->assertTrue(true); + } +} diff --git a/gameq/vbox.md b/gameq/vbox.md new file mode 100644 index 0000000..98fba23 --- /dev/null +++ b/gameq/vbox.md @@ -0,0 +1,13 @@ +# Ubuntu 7 + +## Mount Directories for shares +`mount -t vboxsf -o rw,uid=33,gid=33 GameQv3 /home/gameqv3` + +`mount -t vboxsf -o rw,uid=33,gid=33 GameQPages /home/gameqpages` + +# Local PHP Unit testing +## PHP 7.1.x +## PHP 7.0.x +## PHP 5.6.30 +## PHP 5.5.38 +## PHP 5.4.45 \ No newline at end of file diff --git a/index.php b/index.php index 10f4180..3f90277 100644 --- a/index.php +++ b/index.php @@ -4,17 +4,58 @@ $page = $_SERVER['PHP_SELF']; $sec = "300"; - - //ini_set('display_errors', 'on'); //error_reporting(E_ALL); // Display all types of error - include_once('./consql.php'); include_once('./config.php'); + // Don't touch below (or you know what you do) + + $urlserv = $ipserv.":".$portserv ; + // need to fix if mod = 0 + $json = file_get_contents("http://".$ipserv.":".$modport."/"); + $objhigher=json_decode($json); //converts to an object + $objlower = $objhigher[0]; // if the json response its multidimensional this lowers it + $objlower=json_decode($json); //converts to an array of objects + + + + // librarie SQ - info serv game + require 'SQ_/bootstrap.php'; + use xPaw\SourceQuery\SourceQuery; + + define( 'SQ_SERVER_ADDR', "${ipserv}" ); // IP server + define( 'SQ_SERVER_PORT', "${queryport}" ); // YOUR QUERY PORT + define( 'SQ_TIMEOUT', 3 ); + define( 'SQ_ENGINE', SourceQuery::SOURCE ); + + $Timer = MicroTime( true ); + $Query = new SourceQuery( ); + + $Info = Array( ); + $Players = Array( ); + + try + { + $Query->Connect( SQ_SERVER_ADDR, SQ_SERVER_PORT, SQ_TIMEOUT, SQ_ENGINE ); + + $Info = $Query->GetInfo( ); + $Players = $Query->GetPlayers( ); + } + catch( Exception $e ) + { + $Exception = $e; + } + + $Query->Disconnect( ); + + $Timer = Number_Format( MicroTime( true ) - $Timer, 4, '.', '' ); + $InfoGT = $Info['GameTags']; + ?> + @@ -209,23 +250,23 @@ $sec = "300";

x". $InfoGT[42]. " - x".$InfoGT[55]." "; } + // NEED to find a good regex for this shit! + if (count($objlower) == 0){ // if no mod + echo $InfoGT[67].$InfoGT[68].$InfoGT[69].$InfoGT[70].$InfoGT[71].$InfoGT[72].$InfoGT[73]; + echo "x". $InfoGT[42]. " - x".$InfoGT[55]." "; } - -/* if (count($objlower) > 0) { - echo $InfoGT[67].$InfoGT[68].$InfoGT[69].$InfoGT[70].$InfoGT[71].$InfoGT[72].$InfoGT[73]; - echo "x". $InfoGT[43]. " - x".$InfoGT[56]." "; -} -*/ + if (count($objlower) > 0) { + echo $InfoGT[67].$InfoGT[68].$InfoGT[69].$InfoGT[70].$InfoGT[71].$InfoGT[72].$InfoGT[73].$InfoGT[74]; + echo "x". $InfoGT[41].$InfoGT[42].$InfoGT[43]. " - x".$InfoGT[54].$InfoGT[55].$InfoGT[56].""; + } +/* if (count($objlower) > 0) { echo $InfoGT[73].$InfoGT[74].$InfoGT[75].$InfoGT[76].$InfoGT[77].$InfoGT[78]; echo "x". $InfoGT[47]. " - x".$InfoGT[60]." "; } - +*/ ?> @@ -261,7 +302,7 @@ $sec = "300"; } if (count($objlower) > 0){ - echo $InfoGT[19].$InfoGT[25].$InfoGT[26].$InfoGT[27].$InfoGT[28].$InfoGT[29].$InfoGT[30].$InfoGT[31]; + echo $InfoGT[18].$InfoGT[19].$InfoGT[20].$InfoGT[21].$InfoGT[22].$InfoGT[23].$InfoGT[24].$InfoGT[25]; } ?> @@ -655,8 +696,11 @@ $sec = "300";
MAP
- - +
+ + + +
@@ -698,7 +742,7 @@ $sec = "300";
-
+
JSON - - - - - - - diff --git a/json-test.php b/json-test.php new file mode 100644 index 0000000..d336871 --- /dev/null +++ b/json-test.php @@ -0,0 +1,133 @@ +{'name'}; +$map = $data->{'map'}; +$password = $data->{'password'}; +$game = $data->{'raw'}->{'game'}; +$secure = $data->{'raw'}->{'secure'}; +$numplayers = $data->{'raw'}->{'numplayers'}; +$version = $data->{'raw'}->{'version'}; +$tags = $data->{'raw'}->{'tags'}; + +//$dedicated = $data->{'raw'}->{'rules'}->{'dedicated'}; +//$island = $data->{'raw'}->{'rules'}->{'island'}; + + +$connect = $data->{'connect'}; +$ping = $data->{'ping'}; +$time = "$tags[38]$tags[39]:$tags[41]$tags[42]"; +$battleye = substr($tags,0,8); +$hive = substr($tags,18,8); +$players = $data->{'players'}; + +//if(empty($players)) +// $players = "0"; +//if (empty($players)) { "0"; } +//$playersuser = substr($players,0,8); +//$players = $data->{'array_filter($players)'}; +//$player = $data->{'players'}; + +?> + + + + + Dayz ToX Server: <?php echo"${name}"; ?> + + + + + + +
+ + + + + + + + + + + + + + + + +
Server Name IP server Ping Player Info Joueurs Version
+ +
+ + + + + + Player: + + + + + + +
print_r ";print_r($players); + +?> +
+ + + + + + + + diff --git a/json2sql.php b/json2sql.php new file mode 100755 index 0000000..8ccb798 --- /dev/null +++ b/json2sql.php @@ -0,0 +1,41 @@ +#!/usr/bin/php + < hay at bykr dot org > + * Make this executable + * $ chmod u+x json2sql + * Then invoke it from the command line like this + * $ json2sql tablename myfile.json + * The script will automatically write the resulting file as myfile.sql + */ + +$date = date('Y-m-d H:i:s'); + +function quit($msg) { + die($msg . "\n"); +} + +$table = $argv[1]; +if (!$table) quit("No tablename given!"); + +$filename = $argv[2]; +if (!file_exists($filename)) quit("File does not exist: $filename"); + +$file = file_get_contents($filename); +if (!$file) quit("File read error with $filanme"); + +//echo "Processing $filename... \n"; + +$data = json_decode($file, true); +$sql = ""; +foreach($data as $obj) { +// $keys = implode('`,`', array_map('addslashes', array_keys($obj))); + $values = implode("','", array_map('addslashes', array_values($obj))); + $sql .= "INSERT INTO `$table` (`$keys`, `Dates`) VALUES ('$values', '$date');\n"; +} +// Create a filename based on the input file +$out = pathinfo($filename, PATHINFO_FILENAME) . ".sql"; +if(!file_put_contents($out, $sql)) quit("Could not write contents to $out"); + +quit("Written SQL data to $out"); diff --git a/query-servers.php b/query-servers.php index c1cf0d5..975709a 100755 --- a/query-servers.php +++ b/query-servers.php @@ -5,7 +5,7 @@ error_reporting(E_ALL); // Display all types of error require_once("config.inc.php"); require_once("GameQ/Autoloader.php"); -//require_once("GameQ/src/GameQ/Autoloader.php"); + function secondsToString($seconds) { $hours = floor($seconds / 3600); $mins = floor($seconds / 60 % 60); @@ -36,21 +36,21 @@ if (isset($_POST['query-servers']) && $_POST['query-servers'] == true) { //use var_dump for testing //http://php.net/var_dump - // var_dump($server); +// var_dump($server); -echo "

\n"; - if ($server['gq_numplayers'] > 0) //if there are players +echo "

\n"; + + if ($server['gq_numplayers'] == 0) //if there are players { echo "
"; echo "
"; echo "

"; - echo date("H:i:s") . "

"; +// echo date("H:i:s"). "
"; echo "
"; echo ""; - echo "\n"; + echo "\n"; foreach ($server['players'] as $player) { echo "\n"; @@ -62,19 +62,20 @@ echo "
"; + //exit(); ?> diff --git a/server.json b/server.json new file mode 100644 index 0000000..59d2c38 --- /dev/null +++ b/server.json @@ -0,0 +1,2 @@ + +{"server1":{"dedicated":"d","game_descr":"DayZ","game_dir":"dayz","game_id":221100,"gq_address":"82.64.214.194","gq_dedicated":"d","gq_gametype":"DayZ","gq_hostname":"[ TOX 1 #Expansion ] Chernarus Gloom HeroMOD | Summer | FR\/EN","gq_joinlink":"steam:\/\/connect\/82.64.214.194:3201\/","gq_mapname":"ChernarusPlusGloom","gq_maxplayers":60,"gq_mod":"dayz","gq_name":"DayZ Standalone","gq_numplayers":0,"gq_online":true,"gq_password":0,"gq_port_client":3201,"gq_port_query":27001,"gq_protocol":"source","gq_transport":"udp","gq_type":"dayz","hostname":"[ TOX 1 #Expansion ] Chernarus Gloom HeroMOD | Summer | FR\/EN","keywords":"battleye,external,privHive,shard,lqs0,etm2.000000,entm5.500000,mod,07:51","map":"ChernarusPlusGloom","max_players":60,"num_bots":0,"num_players":0,"os":"w","password":0,"players":[],"port":3201,"protocol":17,"secure":1,"steam_id":90142623158817801,"steamappid":0,"teams":[],"version":"1.10.153598"}} diff --git a/server1/statserver.json b/server1/statserver.json deleted file mode 100644 index a1a19c3..0000000 --- a/server1/statserver.json +++ /dev/null @@ -1 +0,0 @@ -{"name":"[TH] F2P SERVER | Chernarus Map | No Mod | F2P.IN.TH |","map":"chernarusplus","password":false,"raw":{"protocol":17,"folder":"dayz","game":"DayZ","steamappid":0,"numplayers":14,"numbots":0,"listentype":"d","environment":"w","secure":1,"version":"1.10.153598","steamid":"90142619942483979","tags":"battleye,external,privHive,shard,lqs0,etm12.000000,entm2.000000,mod,08:42","gameid":"221100","rules":{"\u0001\u0001":"\u0001\u0001\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0001\u0002�>&\u0013Ԓ\u0011\u000bLivonia DLC\u0001\u0001\u0004dayz","allowedBuild":"0","dedicated":"1","island":"chernarusplus","language":"65545","platform":"win","requiredBuild":"0","requiredVersion":"110","timeLeft":"15"}},"maxplayers":60,"players":[{},{},{},{},{},{},{},{},{},{},{},{},{},{}],"bots":[],"connect":"103.58.149.102:2302","ping":195} diff --git a/statserver.json b/statserver.json new file mode 100644 index 0000000..8073f77 --- /dev/null +++ b/statserver.json @@ -0,0 +1 @@ +{"name":"[TH] F2P SERVER | Chernarus Map | No Mod | F2P.IN.TH |","map":"chernarusplus","password":false,"raw":{"protocol":17,"folder":"dayz","game":"DayZ","steamappid":0,"numplayers":4,"numbots":0,"listentype":"d","environment":"w","secure":1,"version":"1.10.153598","steamid":"90142621100619783","tags":"battleye,external,privHive,shard,lqs0,etm12.000000,entm2.000000,mod,04:36","gameid":"221100","rules":{"\u0001\u0001":"\u0001\u0001\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0001\u0002�>&\u0013Ԓ\u0011\u000bLivonia DLC\u0001\u0001\u0004dayz","allowedBuild":"0","dedicated":"1","island":"chernarusplus","language":"65545","platform":"win","requiredBuild":"0","requiredVersion":"110","timeLeft":"15"}},"maxplayers":60,"players":[{},{},{},{}],"bots":[],"connect":"103.58.149.102:2302","ping":208} diff --git a/statserver_json.php b/statserver_json.php deleted file mode 100644 index f50d20c..0000000 --- a/statserver_json.php +++ /dev/null @@ -1,16 +0,0 @@ -

TEST connection MYSQL

"; - -//echo $InfoGT; - -echo $Players; -echo "
"; - -echo $Info['GameTags']; - -?>
" . $server['gq_numplayers'] . " Joueur(s)     ☠   Temps de jeu des joueurs connectés
" .$server['gq_numplayers']. " Joueur(s)     ☠   Temps de jeu des joueurs connectés

Supervisor hos Skyttegrav.se.