Merge remote-tracking branch 'origin/master'

This commit is contained in:
Max Klaversma 2014-05-08 19:40:58 +02:00
commit c149e696b1
43 changed files with 2477 additions and 2430 deletions

View File

@ -4,7 +4,7 @@
*
* @license http://www.gnu.org/licenses/lgpl.html LGPL License 3
*/
namespace Maniaplanet\DedicatedServer\Structures;
abstract class AbstractStructure
@ -13,37 +13,37 @@ abstract class AbstractStructure
{
if(!is_array($array))
return $array;
$object = new static;
foreach($array as $key => $value)
$object->{lcfirst($key)} = $value;
return $object;
}
static public function fromArrayOfArray($array)
{
if(!is_array($array))
return $array;
$result = array();
foreach($array as $key => $value)
$result[$key] = static::fromArray($value);
return $result;
}
static public function getPropertyFromArray($array, $property)
{
return array_map(get_called_class().'::extractProperty', $array, array_fill(0, count($array), $property));
}
static protected function extractProperty($element, $property)
{
if(!is_a($element, get_called_class()) || !property_exists($element, $property))
throw new \InvalidArgumentException('property '.$property.' does not exists in class: '.get_called_class());
return $element->$property;
}
function toArray()
{
$out = array();
@ -52,5 +52,3 @@ abstract class AbstractStructure
return $out;
}
}
?>

View File

@ -4,6 +4,7 @@
*
* @license http://www.gnu.org/licenses/lgpl.html LGPL License 3
*/
namespace Maniaplanet\DedicatedServer\Structures;
class Bill extends AbstractStructure
@ -14,9 +15,11 @@ class Bill extends AbstractStructure
const STATE_PAYED = 4;
const STATE_REFUSED = 5;
const STATE_ERROR = 6;
/** @var int */
public $state;
/** @var string */
public $stateName;
/** @var int */
public $transactionId;
}
?>

View File

@ -1,18 +1,20 @@
<?php
/**
* @version $Revision: $:
* @author $Author: $:
* @date $Date: $:
* ManiaPlanet dedicated server Xml-RPC client
*
* @license http://www.gnu.org/licenses/lgpl.html LGPL License 3
*/
namespace Maniaplanet\DedicatedServer\Structures;
class Command extends AbstractStructure
{
/** @var string */
public $name;
/** @var string */
public $desc;
/** @var string */
public $type;
/** @var string */
public $default;
}
?>

View File

@ -0,0 +1,16 @@
<?php
/**
* ManiaPlanet dedicated server Xml-RPC client
*
* @license http://www.gnu.org/licenses/lgpl.html LGPL License 3
*/
namespace Maniaplanet\DedicatedServer\Structures;
class FileDesc extends AbstractStructure
{
/** @var string */
public $fileName;
/** @var string */
public $checksum;
}

View File

@ -0,0 +1,20 @@
<?php
/**
* ManiaPlanet dedicated server Xml-RPC client
*
* @license http://www.gnu.org/licenses/lgpl.html LGPL License 3
*/
namespace Maniaplanet\DedicatedServer\Structures;
class ForcedSkin extends AbstractStructure
{
/** @var string */
public $orig;
/** @var string */
public $name;
/** @var string */
public $checksum;
/** @var string */
public $url;
}

View File

@ -4,6 +4,7 @@
*
* @license http://www.gnu.org/licenses/lgpl.html LGPL License 3
*/
namespace Maniaplanet\DedicatedServer\Structures;
class GameInfos extends AbstractStructure
@ -19,29 +20,52 @@ class GameInfos extends AbstractStructure
const GAMEMODE_CUP = 5;
const GAMEMODE_STUNTS = 6;
/** @var int */
public $gameMode;
/** @var string */
public $scriptName;
/** @var int */
public $nbMaps;
/** @var int */
public $chatTime;
/** @var int */
public $finishTimeout;
/** @var int */
public $allWarmUpDuration;
/** @var bool */
public $disableRespawn;
/** @var int */
public $forceShowAllOpponents;
/** @var int */
public $roundsPointsLimit;
/** @var int */
public $roundsForcedLaps;
/** @var bool */
public $roundsUseNewRules;
/** @var int */
public $roundsPointsLimitNewRules;
/** @var int */
public $teamPointsLimit;
/** @var int */
public $teamMaxPoints;
/** @var bool */
public $teamUseNewRules;
/** @var int */
public $teamPointsLimitNewRules;
/** @var int */
public $timeAttackLimit;
/** @var int */
public $timeAttackSynchStartPeriod;
/** @var int */
public $lapsNbLaps;
/** @var int */
public $lapsTimeLimit;
/** @var int */
public $cupPointsLimit;
/** @var int */
public $cupRoundsPerMap;
/** @var int */
public $cupNbWinners;
/** @var int */
public $cupWarmUpDuration;
}
?>

View File

@ -0,0 +1,16 @@
<?php
/**
* ManiaPlanet dedicated server Xml-RPC client
*
* @license http://www.gnu.org/licenses/lgpl.html LGPL License 3
*/
namespace Maniaplanet\DedicatedServer\Structures;
class LadderLimits extends AbstractStructure
{
/** @var float */
public $ladderServerLimitMin;
/** @var float */
public $ladderServerLimitMax;
}

View File

@ -0,0 +1,36 @@
<?php
/**
* ManiaPlanet dedicated server Xml-RPC client
*
* @license http://www.gnu.org/licenses/lgpl.html LGPL License 3
*/
namespace Maniaplanet\DedicatedServer\Structures;
class LadderStats extends AbstractStructure
{
/** @var float */
public $lastMatchScore;
/** @var int */
public $nbrMatchWins;
/** @var int */
public $nbrMatchDraws;
/** @var int */
public $nbrMatchLosses;
/** @var string */
public $teamName;
/** @var ZoneRanking[] */
public $playerRankings;
/** @var array */
public $teamRankings;
/**
* @return LadderStats
*/
static function fromArray($array)
{
$object = parent::fromArray($array);
$object->playerRankings = ZoneRanking::fromArrayOfArray($object->playerRankings);
return $object;
}
}

View File

@ -4,14 +4,17 @@
*
* @license http://www.gnu.org/licenses/lgpl.html LGPL License 3
*/
namespace Maniaplanet\DedicatedServer\Structures;
class LobbyInfo extends AbstractStructure
{
/** var bool */
public $isLobby;
/** var int */
public $lobbyPlayers;
/** var int */
public $lobbyMaxPlayers;
/** var float */
public $lobbyPlayersLevel;
}
?>

View File

@ -4,24 +4,41 @@
*
* @license http://www.gnu.org/licenses/lgpl.html LGPL License 3
*/
namespace Maniaplanet\DedicatedServer\Structures;
class Map extends AbstractStructure
{
/** var string */
public $uId;
/** var string */
public $name;
/** var string */
public $fileName;
/** var string */
public $author;
/** var string */
public $environnement;
/** var string */
public $mood;
/** var int */
public $bronzeTime;
/** var int */
public $silverTime;
/** var int */
public $goldTime;
/** var int */
public $authorTime;
/** var int */
public $copperPrice;
/** var bool */
public $lapRace;
/** var int */
public $nbLaps;
/** var int */
public $nbCheckpoints;
/** var string */
public $mapType;
/** var string */
public $mapStyle;
}
}

View File

@ -4,15 +4,13 @@
*
* @license http://www.gnu.org/licenses/lgpl.html LGPL License 3
*/
namespace Maniaplanet\DedicatedServer\Structures;
class Mod extends AbstractStructure
{
/** var string */
public $env;
/** var string */
public $url;
function toArray()
{
return array('Env'=>$this->env,'Url'=>$this->url);
}
}
}

View File

@ -4,11 +4,15 @@
*
* @license http://www.gnu.org/licenses/lgpl.html LGPL License 3
*/
namespace Maniaplanet\DedicatedServer\Structures;
class Music extends AbstractStructure
{
/** var bool */
public $override;
public $url;
/** var string */
public $url;
/** var string */
public $file;
}
}

View File

@ -4,24 +4,34 @@
*
* @license http://www.gnu.org/licenses/lgpl.html LGPL License 3
*/
namespace Maniaplanet\DedicatedServer\Structures;
class NetworkStats extends AbstractStructure
{
/** @var int */
public $uptime;
/** @var int */
public $nbrConnection;
/** @var int */
public $meanConnectionTime;
/** @var int */
public $meanNbrPlayer;
/** @var int */
public $recvNetRate;
/** @var int */
public $sendNetRate;
/** @var int */
public $totalReceivingSize;
/** @var int */
public $totalSendingSize;
/** @var PlayerNetInfo[] */
public $playerNetInfos;
static public function fromArray($array)
{
$object = parent::fromArray($array);
$object->playerNetInfos = Player::fromArrayOfArray($object->playerNetInfos);
$object->playerNetInfos = PlayerNetInfo::fromArrayOfArray($object->playerNetInfos);
return $object;
}
}
}

View File

@ -8,90 +8,6 @@ namespace Maniaplanet\DedicatedServer\Structures;
class Player extends AbstractStructure
{
public $playerId;
/** @var string */
public $login;
public $nickName;
public $teamId;
public $path;
public $language;
public $clientVersion;
public $clientName;
public $iPAddress;
public $downloadRate;
public $uploadRate;
public $isSpectator;
public $isInOfficialMode;
public $avatar;
public $skins;
public $ladderStats;
public $hoursSinceZoneInscription;
public $onlineRights;
public $rank;
public $bestTime;
public $bestCheckpoints;
public $score;
public $nbrLapsFinished;
public $ladderScore;
public $stateUpdateLatency;
public $stateUpdatePeriod;
public $latestNetworkActivity;
public $packetLossRate;
public $spectatorStatus;
public $ladderRanking;
public $flags;
public $isConnected = true;
public $allies = array();
public $clubLink;
//Flags details
public $forceSpectator;
public $isReferee;
public $isPodiumReady;
public $isUsingStereoscopy;
public $isManagedByAnOtherServer;
public $isServer;
public $hasPlayerSlot;
public $isBroadcasting;
public $hasJoinedGame;
//SpectatorStatus details
public $spectator;
public $temporarySpectator;
public $pureSpectator;
public $autoTarget;
public $currentTargetId;
function getArrayFromPath()
{
return explode('|', $this->path);
}
/**
* @return Player
*/
static public function fromArray($array)
{
$object = parent::fromArray($array);
$object->skins = Skin::fromArrayOfArray($object->skins);
//Detail flags
$object->forceSpectator = $object->flags % 10; // 0, 1 or 2
$object->isReferee = (bool) (intval($object->flags / 10) % 10);
$object->isPodiumReady = (bool) (intval($object->flags / 100) % 10);
$object->isUsingStereoscopy = (bool) (intval($object->flags / 1000) % 10);
$object->isManagedByAnOtherServer = (bool) (intval($object->flags / 10000) % 10);
$object->isServer = (bool) (intval($object->flags / 100000) % 10);
$object->hasPlayerSlot = (bool) (intval($object->flags / 1000000) % 10);
$object->isBroadcasting = (bool) (intval($object->flags / 10000000) % 10);
$object->hasJoinedGame = (bool) (intval($object->flags / 100000000) % 10);
//Details spectatorStatus
$object->spectator = (bool) ($object->spectatorStatus % 10);
$object->temporarySpectator = (bool) (intval($object->spectatorStatus / 10) % 10);
$object->pureSpectator = (bool) (intval($object->spectatorStatus / 100) % 10);
$object->autoTarget = (bool) (intval($object->spectatorStatus / 1000) % 10);
$object->currentTargetId = intval($object->spectatorStatus / 10000);
return $object;
}
}
?>

View File

@ -0,0 +1,16 @@
<?php
/**
* ManiaPlanet dedicated server Xml-RPC client
*
* @license http://www.gnu.org/licenses/lgpl.html LGPL License 3
*/
namespace Maniaplanet\DedicatedServer\Structures;
class PlayerAnswer extends Player
{
/** @var int */
public $playerId;
/** @var int */
public $result;
}

View File

@ -0,0 +1,16 @@
<?php
/**
* ManiaPlanet dedicated server Xml-RPC client
*
* @license http://www.gnu.org/licenses/lgpl.html LGPL License 3
*/
namespace Maniaplanet\DedicatedServer\Structures;
class PlayerBan extends Player
{
/** @var string */
public $clientName;
/** @var string */
public $iPAddress;
}

View File

@ -0,0 +1,72 @@
<?php
/**
* ManiaPlanet dedicated server Xml-RPC client
*
* @license http://www.gnu.org/licenses/lgpl.html LGPL License 3
*/
namespace Maniaplanet\DedicatedServer\Structures;
class PlayerDetailedInfo extends Player
{
/** @var string */
public $nickName;
/** @var int */
public $playerId;
/** @var int */
public $teamId;
/** @var string */
public $path;
/** @var string */
public $language;
/** @var string */
public $clientVersion;
/** @var string */
public $clientTitleVersion;
/** @var string */
public $iPAddress;
/** @var int */
public $downloadRate;
/** @var int */
public $uploadRate;
/** @var bool */
public $isSpectator;
/** @var bool */
public $isInOfficialMode;
/** @var bool */
public $isReferee;
/** @var FileDesc */
public $avatar;
/** @var Skin[] */
public $skins;
/** @var LadderStats */
public $ladderStats;
/** @var int */
public $hoursSinceZoneInscription;
/** @var string */
public $broadcasterLogin;
/** @var string[] */
public $allies = array();
/** @var string */
public $clubLink;
/**
* @return string[]
*/
function getArrayFromPath()
{
return explode('|', $this->path);
}
/**
* @return PlayerDetailedInfo
*/
static public function fromArray($array)
{
$object = parent::fromArray($array);
$object->avatar = FileDesc::fromArray($object->avatar);
$object->skins = Skin::fromArrayOfArray($object->skins);
$object->ladderStats = LadderStats::fromArray($object->ladderStats);
return $object;
}
}

View File

@ -0,0 +1,87 @@
<?php
/**
* ManiaPlanet dedicated server Xml-RPC client
*
* @license http://www.gnu.org/licenses/lgpl.html LGPL License 3
*/
namespace Maniaplanet\DedicatedServer\Structures;
class PlayerInfo extends Player
{
/** @var string */
public $nickName;
/** @var int */
public $playerId;
/** @var int */
public $teamId;
/** @var bool */
public $isSpectator;
/** @var bool */
public $isInOfficialMode;
/** @var int */
public $ladderRanking;
/** @var int */
public $spectatorStatus;
/** @var int */
public $flags;
//Flags details
/** @var int */
public $forceSpectator;
/** @var bool */
public $isReferee;
/** @var bool */
public $isPodiumReady;
/** @var bool */
public $isUsingStereoscopy;
/** @var bool */
public $isManagedByAnOtherServer;
/** @var bool */
public $isServer;
/** @var bool */
public $hasPlayerSlot;
/** @var bool */
public $isBroadcasting;
/** @var bool */
public $hasJoinedGame;
//SpectatorStatus details
/** @var bool */
public $spectator;
/** @var bool */
public $temporarySpectator;
/** @var bool */
public $pureSpectator;
/** @var bool */
public $autoTarget;
/** @var int */
public $currentTargetId;
/**
* @return PlayerInfo
*/
static public function fromArray($array)
{
$object = parent::fromArray($array);
//Detail flags
$object->forceSpectator = $object->flags % 10; // 0, 1 or 2
$object->isReferee = (bool) (intval($object->flags / 10) % 10);
$object->isPodiumReady = (bool) (intval($object->flags / 100) % 10);
$object->isUsingStereoscopy = (bool) (intval($object->flags / 1000) % 10);
$object->isManagedByAnOtherServer = (bool) (intval($object->flags / 10000) % 10);
$object->isServer = (bool) (intval($object->flags / 100000) % 10);
$object->hasPlayerSlot = (bool) (intval($object->flags / 1000000) % 10);
$object->isBroadcasting = (bool) (intval($object->flags / 10000000) % 10);
$object->hasJoinedGame = (bool) (intval($object->flags / 100000000) % 10);
//Details spectatorStatus
$object->spectator = (bool) ($object->spectatorStatus % 10);
$object->temporarySpectator = (bool) (intval($object->spectatorStatus / 10) % 10);
$object->pureSpectator = (bool) (intval($object->spectatorStatus / 100) % 10);
$object->autoTarget = (bool) (intval($object->spectatorStatus / 1000) % 10);
$object->currentTargetId = intval($object->spectatorStatus / 10000);
return $object;
}
}

View File

@ -0,0 +1,22 @@
<?php
/**
* ManiaPlanet dedicated server Xml-RPC client
*
* @license http://www.gnu.org/licenses/lgpl.html LGPL License 3
*/
namespace Maniaplanet\DedicatedServer\Structures;
class PlayerNetInfo extends Player
{
/** @var string */
public $iPAddress;
/** @var int */
public $stateUpdateLatency;
/** @var int */
public $stateUpdatePeriod;
/** @var int */
public $latestNetworkActivity;
/** @var float */
public $packetLossRate;
}

View File

@ -0,0 +1,28 @@
<?php
/**
* ManiaPlanet dedicated server Xml-RPC client
*
* @license http://www.gnu.org/licenses/lgpl.html LGPL License 3
*/
namespace Maniaplanet\DedicatedServer\Structures;
class PlayerRanking extends Player
{
/** @var string */
public $nickName;
/** @var int */
public $playerId;
/** @var int */
public $rank;
/** @var int */
public $bestTime;
/** @var int[] */
public $bestCheckpoints;
/** @var int */
public $score;
/** @var int */
public $nbrLapsFinished;
/** @var float */
public $ladderScore;
}

View File

@ -9,29 +9,24 @@ namespace Maniaplanet\DedicatedServer\Structures;
class ScriptInfo extends AbstractStructure
{
/** @var string */
public $name;
/** @var string */
public $compatibleMapTypes;
/** @var string */
public $description;
/** @var string */
public $version;
/** @var ScriptSettings[] */
public $paramDescs = array();
/** @var Command[] */
public $commandDescs = array();
static public function fromArray($array)
{
$object = parent::fromArray($array);
if($object->paramDescs)
{
$object->paramDescs = ScriptSettings::fromArrayOfArray($object->paramDescs);
}
if($object->commandDescs)
{
$object->commandDescs = Command::fromArrayOfArray($object->commandDescs);
}
$object->paramDescs = ScriptSettings::fromArrayOfArray($object->paramDescs);
$object->commandDescs = Command::fromArrayOfArray($object->commandDescs);
return $object;
}
}
?>

View File

@ -7,14 +7,14 @@
namespace Maniaplanet\DedicatedServer\Structures;
final class ScriptSettings extends AbstractStructure
class ScriptSettings extends AbstractStructure
{
/** @var string */
public $name;
/** @var string */
public $desc;
/** @var string */
public $type;
/** @var string */
public $default;
}
?>

View File

@ -9,36 +9,66 @@ namespace Maniaplanet\DedicatedServer\Structures;
class ServerOptions extends AbstractStructure
{
/** @var string */
public $name;
/** @var string */
public $comment;
/** @var string */
public $password;
/** @var string */
public $passwordForSpectator;
/** @var int */
public $hideServer;
/** @var int */
public $currentMaxPlayers;
/** @var int */
public $nextMaxPlayers;
/** @var int */
public $currentMaxSpectators;
/** @var int */
public $nextMaxSpectators;
/** @var bool */
public $isP2PUpload;
/** @var bool */
public $isP2PDownload;
/** @var bool */
public $currentLadderMode;
/** @var int */
public $nextLadderMode;
/** @var float */
public $ladderServerLimitMax;
/** @var float */
public $ladderServerLimitMin;
/** @var int */
public $currentVehicleNetQuality;
/** @var int */
public $nextVehicleNetQuality;
/** @var int */
public $currentCallVoteTimeOut;
/** @var int */
public $nextCallVoteTimeOut;
/** @var float */
public $callVoteRatio;
/** @var bool */
public $allowMapDownload;
/** @var bool */
public $autoSaveReplays;
/** @var bool */
public $autoSaveValidationReplays;
/** @var string */
public $refereePassword;
/** @var int */
public $refereeMode;
/** @var bool */
public $currentUseChangingValidationSeed;
public $useChangingValidationSeed;
/** @var bool */
public $nextUseChangingValidationSeed;
/** @var int */
public $clientInputsMaxLatency;
/** @var bool */
public $keepPlayerSlots;
/** @var bool */
public $disableHorns;
/** @var bool */
public $disableServiceAnnounces;
}
}

View File

@ -4,13 +4,20 @@
*
* @license http://www.gnu.org/licenses/lgpl.html LGPL License 3
*/
namespace Maniaplanet\DedicatedServer\Structures;
class Skin extends AbstractStructure
{
public $orig;
public $name;
public $checksum;
public $url;
}
/** @var string */
public $environnement;
/** @var FileDesc */
public $packDesc;
static function fromArray($array)
{
$object = parent::fromArray($array);
$object->packDesc = FileDesc::fromArray($object->packDesc);
return $object;
}
}

View File

@ -4,6 +4,7 @@
*
* @license http://www.gnu.org/licenses/lgpl.html LGPL License 3
*/
namespace Maniaplanet\DedicatedServer\Structures;
class Status extends AbstractStructure
@ -15,6 +16,8 @@ class Status extends AbstractStructure
const PLAY = 4;
const EXITING = 6;
/** @var int */
public $code;
/** @var string */
public $name;
}
}

View File

@ -4,19 +4,29 @@
*
* @license http://www.gnu.org/licenses/lgpl.html LGPL License 3
*/
namespace Maniaplanet\DedicatedServer\Structures;
class SystemInfos extends AbstractStructure
{
/** @var string */
public $publishedIp;
/** @var int */
public $port;
/** @var int */
public $p2PPort;
/** @var string */
public $titleId;
/** @var string */
public $serverLogin;
/** @var int */
public $serverPlayerId;
/** @var int */
public $connectionDownloadRate;
/** @var int */
public $connectionUploadRate;
/** @var bool */
public $isServer;
/** @var bool */
public $isDedicated;
}
?>

View File

@ -0,0 +1,16 @@
<?php
/**
* ManiaPlanet dedicated server Xml-RPC client
*
* @license http://www.gnu.org/licenses/lgpl.html LGPL License 3
*/
namespace Maniaplanet\DedicatedServer\Structures;
class Tag extends AbstractStructure
{
/** @var string */
public $name;
/** @var string */
public $value;
}

View File

@ -9,14 +9,20 @@ namespace Maniaplanet\DedicatedServer\Structures;
class Team extends AbstractStructure
{
/** @var string */
public $name;
/** @var string */
public $zonePath;
/** @var string */
public $city;
/** @var string */
public $emblemUrl;
/** @var float */
public $huePrimary;
/** @var float */
public $hueSecondary;
/** @var string */
public $rGB;
/** @var string */
public $clubLinkUrl;
}
?>

View File

@ -4,15 +4,19 @@
*
* @license http://www.gnu.org/licenses/lgpl.html LGPL License 3
*/
namespace Maniaplanet\DedicatedServer\Structures;
class Version extends AbstractStructure
{
/** @var string */
public $name;
/** @var string */
public $titleId;
/** @var string */
public $version;
/** @var string */
public $build;
/** @var string */
public $apiVersion;
}
?>

View File

@ -4,7 +4,7 @@
*
* @license http://www.gnu.org/licenses/lgpl.html LGPL License 3
*/
namespace Maniaplanet\DedicatedServer\Structures;
class Vote extends AbstractStructure
@ -13,10 +13,32 @@ class Vote extends AbstractStructure
const STATE_CANCELLED = 'VoteCancelled';
const STATE_PASSED = 'VotePassed';
const STATE_FAILED = 'VoteFailed';
/** @var string */
public $status;
/** @var string */
public $callerLogin;
/** @var string */
public $cmdName;
/** @var mixed[] */
public $cmdParam;
/**
* @param string $cmdName
* @param mixed[] $cmdParam
*/
function __construct($cmdName='', $cmdParam=array())
{
$this->cmdName = $cmdName;
$this->cmdParam = $cmdParam;
}
/**
* @return bool
*/
function isValid()
{
return is_string($this->cmdName)
&& is_array($this->cmdParam);
}
}
?>

View File

@ -4,7 +4,7 @@
*
* @license http://www.gnu.org/licenses/lgpl.html LGPL License 3
*/
namespace Maniaplanet\DedicatedServer\Structures;
class VoteRatio extends AbstractStructure
@ -17,15 +17,41 @@ class VoteRatio extends AbstractStructure
const COMMAND_TEAM_BALANCE = 'AutoTeamBalance';
const COMMAND_KICK = 'Kick';
const COMMAND_BAN = 'Ban';
/** @var string '*' for default */
public $command;
/** @var string Empty to match all votes for the command */
public $param;
/** @var float Must be in range [0,1] or -1 to disable */
public $ratio;
public function __construct($command = null, $ratio = null)
/**
* @param string $command
* @param float $ratio
*/
public function __construct($command = '', $ratio = 0.)
{
$this->command = $command;
$this->ratio = $ratio;
$this->param = '';
}
/**
* @return bool
*/
function isValid()
{
return is_string($this->command)
&& is_string($this->param)
&& self::isRatio($this->ratio);
}
/**
* @param float $ratio
* @return bool
*/
static function isRatio($ratio)
{
return is_float($ratio) && ($ratio === -1. || ($ratio >= 0. && $ratio <= 1.));
}
}
?>

View File

@ -0,0 +1,28 @@
<?php
/**
* ManiaPlanet dedicated server Xml-RPC client
*
* @license http://www.gnu.org/licenses/lgpl.html LGPL License 3
*/
namespace Maniaplanet\DedicatedServer\Structures;
class ZoneRanking extends AbstractStructure
{
/** @var string */
public $path;
/** @var float */
public $score;
/** @var int */
public $ranking;
/** @var int */
public $totalCount;
/**
* @return string[]
*/
function getArrayFromPath()
{
return explode('|', $this->path);
}
}

View File

@ -19,6 +19,12 @@ class Base64
{
$this->scalar = $data;
}
}
?>
/**
* @return string
*/
function __toString()
{
return $this->scalar;
}
}

View File

@ -8,5 +8,3 @@
namespace Maniaplanet\DedicatedServer\Xmlrpc;
class Exception extends \Exception {}
?>

View File

@ -57,5 +57,3 @@ class MapNotCompatibleOrCompleteException extends FaultException{}
class LadderModeUnknownException extends FaultException{}
class PlayerAlreadyIgnoredException extends FaultException{}
class PlayerNotIgnoredException extends FaultException{}
?>

View File

@ -17,7 +17,6 @@ class GbxRemote
private $socket;
private $timeouts = array(
'open' => 5,
'read' => 5000,
'write' => 5000
);
@ -29,13 +28,12 @@ class GbxRemote
/**
* @param string $host
* @param int $port
* @param int[string] $timeouts Override default timeouts for 'open' (in s), 'read' (in ms) and 'write' (in ms) socket operations
* @param int $timeout Timeout when opening connection
*/
function __construct($host, $port, $timeouts = array())
function __construct($host, $port, $timeout = 5)
{
$this->requestHandle = (int) 0x80000000;
$this->timeouts = array_merge($this->timeouts, $timeouts);
$this->connect($host, $port);
$this->connect($host, $port, $timeout);
}
function __destruct()
@ -45,10 +43,10 @@ class GbxRemote
/**
* Change timeouts
* @param int $read read timeout (in ms), null or 0 to leave unchanged
* @param int $write write timeout (in ms), null or 0 to leave unchanged
* @param int $read read timeout (in ms), 0 to leave unchanged
* @param int $write write timeout (in ms), 0 to leave unchanged
*/
function setTimeouts($read=null, $write=null)
function setTimeouts($read=0, $write=0)
{
if($read)
$this->timeouts['read'] = $read;
@ -68,12 +66,12 @@ class GbxRemote
/**
* @param string $host
* @param int $port
* @param int $timeout
* @throws TransportException
*/
private function connect($host, $port)
private function connect($host, $port, $timeout)
{
$this->socket = @fsockopen($host, $port, $errno, $errstr, $this->timeouts['open']);
$this->socket = @fsockopen($host, $port, $errno, $errstr, $timeout);
if(!$this->socket)
throw new TransportException('Cannot open socket', TransportException::NOT_INITIALIZED);
@ -114,12 +112,13 @@ class GbxRemote
if(strlen($xml) > self::MAX_REQUEST_SIZE-8)
{
if($method != 'system.multicall' || count($args) < 2)
if($method != 'system.multicall' || count($args[0]) < 2)
throw new MessageException('Request too large', MessageException::REQUEST_TOO_LARGE);
$mid = count($args) >> 1;
$this->query('system.multicall', array_slice($args, 0, $mid));
$this->query('system.multicall', array_slice($args, $mid));
$mid = count($args[0]) >> 1;
$res1 = $this->query('system.multicall', array(array_slice($args[0], 0, $mid)));
$res2 = $this->query('system.multicall', array(array_slice($args[0], $mid)));
return array_merge($res1, $res2);
}
$this->writeMessage($xml);
@ -151,7 +150,7 @@ class GbxRemote
$call = array_shift($this->multicallBuffer);
return $this->query($call['methodName'], $call['params']);
default:
$result = $this->query('system.multicall', $this->multicallBuffer);
$result = $this->query('system.multicall', array($this->multicallBuffer));
$this->multicallBuffer = array();
return $result;
}
@ -185,9 +184,9 @@ class GbxRemote
*/
private function flush($waitResponse=false)
{
$r=array($this->socket);
$w=null;
$e=null;
$r = array($this->socket);
$w = null;
$e = null;
$n = @stream_select($r, $w, $e, 0);
while($waitResponse || $n > 0)
{
@ -205,12 +204,8 @@ class GbxRemote
$this->callbacksBuffer[] = $value;
}
if(!$waitResponse){
$r=array($this->socket);
$w=null;
$e=null;
if(!$waitResponse)
$n = @stream_select($r, $w, $e, 0);
}
};
}
@ -310,5 +305,3 @@ class MessageException extends Exception
const REQUEST_TOO_LARGE = 1;
const RESPONSE_TOO_LARGE = 2;
}
?>

View File

@ -22,9 +22,12 @@ if(extension_loaded('xmlrpc'))
* @param mixed[] $args
* @return string
*/
static function encode($method, $args)
static function encode($method, $args, $escape=true)
{
return xmlrpc_encode_request($method, $args, self::$options);
$opts = self::$options;
if(!$escape)
$opts['escaping'] = array();
return xmlrpc_encode_request($method, $args, $opts);
}
/**
@ -40,7 +43,7 @@ if(extension_loaded('xmlrpc'))
if($method === null)
{
if(is_array($value) && @xmlrpc_is_fault($value))
if(is_array($value) && xmlrpc_is_fault($value))
return array('fault', $value);
return array('response', $value);
}
@ -59,55 +62,80 @@ else
* @param mixed[] $args
* @return string
*/
static function encode($method, $args)
static function encode($method, $args, $escape=true)
{
$xml = '<?xml version="1.0" encoding="utf-8"?><methodCall><methodName><![CDATA['.$method.']]></methodName><params>';
$xml = '<?xml version="1.0" encoding="utf-8"?><methodCall><methodName>'.self::escape($method, $escape).'</methodName>';
if(!$args)
return $xml.'<params/></methodCall>';
$xml .= '<params>';
foreach($args as $arg)
$xml .= '<param><value>'.self::encodeValue($arg).'</value></param>';
$xml .= '</params></methodCall>';
return $xml;
$xml .= '<param><value>'.self::encodeValue($arg, $escape).'</value></param>';
return $xml.'</params></methodCall>';
}
/**
* @param mixed $v
* @return string
*/
private static function encodeValue($v)
private static function encodeValue($v, $escape=true)
{
switch(gettype($v))
{
case 'boolean':
return '<boolean><![CDATA['.((int) $v).']]></boolean>';
return '<boolean>'.self::escape((int) $v, $escape).'</boolean>';
case 'integer':
return '<int><![CDATA['.$v.']]></int>';
return '<int>'.self::escape($v, $escape).'</int>';
case 'double':
return '<double><![CDATA['.$v.']]></double>';
return '<double>'.self::escape($v, $escape).'</double>';
case 'string':
return '<string><![CDATA['.$v.']]></string>';
case 'NULL':
if(!$v)
return '<string/>';
return '<string>'.self::escape($v, $escape).'</string>';
case 'object':
if($v instanceof Base64)
return '<base64><![CDATA['.base64_encode($v->scalar).']]></base64>';
{
if(!$v->scalar)
return '<base64/>';
return '<base64>'.self::escape(base64_encode($v->scalar), $escape).'</base64>';
}
if($v instanceof \DateTime)
return '<dateTime.iso8601><![CDATA['.$v->format(self::DATE_FORMAT).']]></dateTime.iso8601>';
return '<dateTime.iso8601>'.self::escape($v->format(self::DATE_FORMAT), $escape).'</dateTime.iso8601>';
$v = get_object_vars($v);
// fallthrough
// fallthrough
case 'array':
$return = '';
// empty array case
if(!$v)
return '<array><data/></array>';
// pure array case
if(array_keys($v) === range(0, count($v) - 1))
{
foreach($v as $item)
$return .= '<value>'.self::encodeValue($item).'</value>';
$return .= '<value>'.self::encodeValue($item, $escape).'</value>';
return '<array><data>'.$return.'</data></array>';
}
// else it's a struct
foreach($v as $name => $value)
$return .= '<member><name><![CDATA['.$name.']]></name><value>'.self::encodeValue($value).'</value></member>';
$return .= '<member><name>'.self::escape($name, $escape).'</name><value>'.self::encodeValue($value, $escape).'</value></member>';
return '<struct>'.$return.'</struct>';
}
return '';
}
/**
* @param string $str
* @param bool $escape
* @return string
*/
private static function escape($str, $escape=true)
{
if($escape)
return '<![CDATA['.$str.']]>';
return $str;
}
/**
* @param string $message
* @return mixed
@ -142,7 +170,7 @@ else
switch($elt->getName())
{
case 'boolean':
return (bool) $elt;
return (bool) (int) $elt;
case 'i4':
case 'int':
return (int) $elt;
@ -170,5 +198,3 @@ else
}
class ParseException extends Exception {}
?>

View File

@ -306,7 +306,7 @@ class MapManager implements CallbackListener {
} else {
// Write map via write file method
try {
$this->maniaControl->client->writeFileFromString($relativeMapFileName, $file);
$this->maniaControl->client->writeFile($relativeMapFileName, $file);
} catch (InvalidArgumentException $e) {
if ($e->getMessage() == 'data are too big') {
$this->maniaControl->chat->sendError("Map is too big for a remote save.", $login);
@ -720,4 +720,4 @@ class MapManager implements CallbackListener {
return count($this->maps);
}
// TODO: add local map by filename
}
}

View File

@ -59,36 +59,29 @@ class Player {
public $currentTargetId = 0;
/**
* Construct a player from ManiaPlanet Player structure
*
* @param \Maniaplanet\DedicatedServer\Structures\Player $mpPlayer
* @param bool $connected
*/
public function __construct($mpPlayer) {
if (!$mpPlayer) {
$this->isConnected = false;
return;
}
public function __construct($connected)
{
$this->isConnected = $connected;
if ($connected) {
$this->joinTime = time();
}
}
/**
* Update from ManiaPlanet PlayerInfo structure
* @param \Maniaplanet\DedicatedServer\Structures\PlayerInfo $mpPlayer
*/
public function setInfo($mpPlayer)
{
$this->pid = $mpPlayer->playerId;
$this->login = $mpPlayer->login;
$this->nickname = Formatter::stripDirtyCodes($mpPlayer->nickName);
$this->rawNickname = $mpPlayer->nickName;
$this->path = $mpPlayer->path;
$this->language = $mpPlayer->language;
$this->avatar = $mpPlayer->avatar['FileName'];
$this->allies = $mpPlayer->allies;
$this->clubLink = $mpPlayer->clubLink;
$this->teamId = $mpPlayer->teamId;
$this->isOfficial = $mpPlayer->isInOfficialMode;
$this->ladderScore = $mpPlayer->ladderStats['PlayerRankings'][0]['Score'];
$this->ladderRank = $mpPlayer->ladderStats['PlayerRankings'][0]['Ranking'];
$this->ladderStats = $mpPlayer->ladderStats;
$this->daysSinceZoneInscription = $mpPlayer->hoursSinceZoneInscription / 24;
$this->ipAddress = $mpPlayer->iPAddress;
$this->clientVersion = $mpPlayer->clientVersion;
$this->downloadRate = $mpPlayer->downloadRate;
$this->uploadRate = $mpPlayer->uploadRate;
$this->skins = $mpPlayer->skins;
//Flag Details
$this->forcedSpectatorState = $mpPlayer->forceSpectator;
@ -108,7 +101,37 @@ class Player {
$this->autoTarget = $mpPlayer->autoTarget;
$this->currentTargetId = $mpPlayer->currentTargetId;
$this->joinTime = time();
if (!$this->nickname) {
$this->nickname = $this->login;
}
}
/**
* Update from ManiaPlanet PlayerDetailedInfo structure
* @param \Maniaplanet\DedicatedServer\Structures\PlayerDetailedInfo $mpPlayer
*/
public function setDetailedInfo($mpPlayer)
{
$this->pid = $mpPlayer->playerId;
$this->login = $mpPlayer->login;
$this->nickname = Formatter::stripDirtyCodes($mpPlayer->nickName);
$this->rawNickname = $mpPlayer->nickName;
$this->path = $mpPlayer->path;
$this->language = $mpPlayer->language;
$this->avatar = $mpPlayer->avatar->fileName;
$this->allies = $mpPlayer->allies;
$this->clubLink = $mpPlayer->clubLink;
$this->teamId = $mpPlayer->teamId;
$this->isOfficial = $mpPlayer->isInOfficialMode;
$this->ladderScore = $mpPlayer->ladderStats->playerRankings[0]->score;
$this->ladderRank = $mpPlayer->ladderStats->playerRankings[0]->ranking;
$this->ladderStats = $mpPlayer->ladderStats;
$this->daysSinceZoneInscription = $mpPlayer->hoursSinceZoneInscription / 24;
$this->ipAddress = $mpPlayer->iPAddress;
$this->clientVersion = $mpPlayer->clientVersion;
$this->downloadRate = $mpPlayer->downloadRate;
$this->uploadRate = $mpPlayer->uploadRate;
$this->skins = $mpPlayer->skins;
if (!$this->nickname) {
$this->nickname = $this->login;

View File

@ -118,26 +118,16 @@ class PlayerManager implements CallbackListener, TimerListener {
if ($playerItem->playerId <= 0) {
continue;
}
$detailedPlayerInfo = $this->maniaControl->client->getDetailedPlayerInfo($playerItem->login);
$playerItem->path = $detailedPlayerInfo->path;
$playerItem->language = $detailedPlayerInfo->language;
$playerItem->clientVersion = $detailedPlayerInfo->clientVersion;
$playerItem->iPAddress = $detailedPlayerInfo->iPAddress;
$playerItem->isSpectator = $detailedPlayerInfo->isSpectator;
$playerItem->avatar = $detailedPlayerInfo->avatar;
$playerItem->ladderStats = $detailedPlayerInfo->ladderStats;
$playerItem->downloadRate = $detailedPlayerInfo->downloadRate;
$playerItem->uploadRate = $detailedPlayerInfo->uploadRate;
$playerItem->hoursSinceZoneInscription = $detailedPlayerInfo->hoursSinceZoneInscription;
$detailedPlayerInfo = $this->maniaControl->client->getDetailedPlayerInfo($playerItem->login);
//Check if the Player is in a Team, to notify if its a TeamMode or not
if ($playerItem->teamId != -1) {
$this->maniaControl->server->setTeamMode(true);
}
$player = new Player($playerItem);
$player = new Player(true);
$player->setInfo($playerItem);
$player->setDetailedInfo($detailedPlayerInfo);
$player->hasJoinedGame = true;
$this->addPlayer($player);
}
@ -222,7 +212,8 @@ class PlayerManager implements CallbackListener, TimerListener {
$login = $callback[1][0];
try {
$playerInfo = $this->maniaControl->client->getDetailedPlayerInfo($login);
$player = new Player($playerInfo);
$player = new Player(true);
$player->setDetailedInfo($playerInfo);
$this->addPlayer($player);
} catch (LoginUnknownException $e) {
@ -403,7 +394,7 @@ class PlayerManager implements CallbackListener, TimerListener {
return null;
}
$player = new Player(null);
$player = new Player(false);
$player->index = $row->index;
$player->login = $row->login;
$player->rawNickname = $row->nickname;
@ -488,7 +479,7 @@ class PlayerManager implements CallbackListener, TimerListener {
return null;
}
$player = new Player(null);
$player = new Player(false);
$player->index = $playerIndex;
$player->login = $row->login;
$player->rawNickname = $row->nickname;

View File

@ -275,7 +275,7 @@ class Server implements CallbackListener {
/**
* Get Server Player Info
*
* @return \Maniaplanet\DedicatedServer\Structures\Player
* @return \Maniaplanet\DedicatedServer\Structures\PlayerInfo
*/
public function getInfo() {
return $this->maniaControl->client->getMainServerPlayerInfo();

View File

@ -173,24 +173,13 @@ class CustomVotesPlugin implements CommandListener, CallbackListener, ManialinkP
}
/* Disable Standard Votes */
$array["Command"] = VoteRatio::COMMAND_BAN;
$array["Param"] = "";
$array["Ratio"] = (float)-1;
$ratioArray[] = $array;
$ratioArray[] = new VoteRatio(VoteRatio::COMMAND_BAN, -1.);
$ratioArray[] = new VoteRatio(VoteRatio::COMMAND_KICK, -1.);
$ratioArray[] = new VoteRatio(VoteRatio::COMMAND_RESTART_MAP, -1.);
$ratioArray[] = new VoteRatio(VoteRatio::COMMAND_TEAM_BALANCE, -1.);
$ratioArray[] = new VoteRatio(VoteRatio::COMMAND_NEXT_MAP, -1.);
$array["Command"] = VoteRatio::COMMAND_KICK;
$ratioArray[] = $array;
$array["Command"] = VoteRatio::COMMAND_RESTART_MAP;
$ratioArray[] = $array;
$array["Command"] = VoteRatio::COMMAND_TEAM_BALANCE;
$ratioArray[] = $array;
$array["Command"] = VoteRatio::COMMAND_NEXT_MAP;
$ratioArray[] = $array;
$this->maniaControl->client->setCallVoteRatiosEx(false, $ratioArray);
$this->maniaControl->client->setCallVoteRatios($ratioArray, false);
$this->constructMenu();
return true;
@ -386,20 +375,13 @@ class CustomVotesPlugin implements CommandListener, CallbackListener, ManialinkP
//Enable Standard Votes
$defaultRatio = $this->maniaControl->client->getCallVoteRatio();
$array["Command"] = VoteRatio::COMMAND_BAN;
$array["Param"] = "";
$array["Ratio"] = (float)$defaultRatio;
$ratioArray[] = $array;
$array["Command"] = VoteRatio::COMMAND_KICK;
$ratioArray[] = $array;
$array["Command"] = VoteRatio::COMMAND_RESTART_MAP;
$ratioArray[] = $array;
$array["Command"] = VoteRatio::COMMAND_TEAM_BALANCE;
$ratioArray[] = $array;
$array["Command"] = VoteRatio::COMMAND_NEXT_MAP;
$ratioArray[] = $array;
$ratioArray[] = new VoteRatio(VoteRatio::COMMAND_BAN, $defaultRatio);
$ratioArray[] = new VoteRatio(VoteRatio::COMMAND_KICK, $defaultRatio);
$ratioArray[] = new VoteRatio(VoteRatio::COMMAND_RESTART_MAP, $defaultRatio);
$ratioArray[] = new VoteRatio(VoteRatio::COMMAND_TEAM_BALANCE, $defaultRatio);
$ratioArray[] = new VoteRatio(VoteRatio::COMMAND_NEXT_MAP, $defaultRatio);
$this->maniaControl->client->setCallVoteRatiosEx(false, $ratioArray);
$this->maniaControl->client->setCallVoteRatios($ratioArray, false);
$this->destroyVote();
$this->maniaControl->manialinkManager->hideManialink(self::MLID_ICON);