initial commit
This commit is contained in:
commit
186a860385
8199 changed files with 1159811 additions and 0 deletions
58
protocol/GameQ/Filters/Base.php
Normal file
58
protocol/GameQ/Filters/Base.php
Normal file
|
|
@ -0,0 +1,58 @@
|
|||
<?php
|
||||
/**
|
||||
* This file is part of GameQ.
|
||||
*
|
||||
* GameQ is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published by
|
||||
* the Free Software Foundation; either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* GameQ is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
namespace GameQ\Filters;
|
||||
|
||||
use GameQ\Server;
|
||||
|
||||
/**
|
||||
* Abstract base class which all filters must inherit
|
||||
*
|
||||
* @author Austin Bischoff <austin@codebeard.com>
|
||||
*/
|
||||
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);
|
||||
}
|
||||
133
protocol/GameQ/Filters/Normalize.php
Normal file
133
protocol/GameQ/Filters/Normalize.php
Normal file
|
|
@ -0,0 +1,133 @@
|
|||
<?php
|
||||
/**
|
||||
* This file is part of GameQ.
|
||||
*
|
||||
* GameQ is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published by
|
||||
* the Free Software Foundation; either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* GameQ is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
121
protocol/GameQ/Filters/Secondstohuman.php
Normal file
121
protocol/GameQ/Filters/Secondstohuman.php
Normal file
|
|
@ -0,0 +1,121 @@
|
|||
<?php
|
||||
/**
|
||||
* This file is part of GameQ.
|
||||
*
|
||||
* GameQ is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published by
|
||||
* the Free Software Foundation; either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* GameQ is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
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 <austin@codebeard.com>
|
||||
*/
|
||||
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])) {
|
||||
// Make sure the value is a float (throws E_WARNING in PHP 7.1+)
|
||||
$value = floatval($value);
|
||||
// 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;
|
||||
}
|
||||
}
|
||||
115
protocol/GameQ/Filters/Stripcolors.php
Normal file
115
protocol/GameQ/Filters/Stripcolors.php
Normal file
|
|
@ -0,0 +1,115 @@
|
|||
<?php
|
||||
/**
|
||||
* This file is part of GameQ.
|
||||
*
|
||||
* GameQ is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published by
|
||||
* the Free Software Foundation; either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* GameQ is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
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
|
||||
*
|
||||
* @SuppressWarnings(PHPMD.CyclomaticComplexity)
|
||||
*
|
||||
* @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;
|
||||
case 'source':
|
||||
array_walk_recursive($result, [$this, 'stripSource']);
|
||||
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);
|
||||
}
|
||||
|
||||
/**
|
||||
* Strip color codes from Source based games
|
||||
*
|
||||
* @param string $string
|
||||
*/
|
||||
protected function stripSource(&$string)
|
||||
{
|
||||
$string = strip_tags($string);
|
||||
}
|
||||
}
|
||||
47
protocol/GameQ/Filters/Test.php
Normal file
47
protocol/GameQ/Filters/Test.php
Normal file
|
|
@ -0,0 +1,47 @@
|
|||
<?php
|
||||
/**
|
||||
* This file is part of GameQ.
|
||||
*
|
||||
* GameQ is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published by
|
||||
* the Free Software Foundation; either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* GameQ is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue