| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260 |
- <?php
- /**
- * @file
- * TeamSpeak 3 PHP Framework
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program 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 General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
- * @package TeamSpeak3
- * @author Sven 'ScP' Paulsen
- * @copyright Copyright (c) Planet TeamSpeak. All rights reserved.
- */
- /**
- * @class TeamSpeak3_Adapter_ServerQuery
- * @brief Provides low-level methods for ServerQuery communication with a TeamSpeak 3 Server.
- */
- class TeamSpeak3_Adapter_ServerQuery extends TeamSpeak3_Adapter_Abstract
- {
- /**
- * Stores a singleton instance of the active TeamSpeak3_Node_Host object.
- *
- * @var TeamSpeak3_Node_Host
- */
- protected $host = null;
- /**
- * Stores the timestamp of the last command.
- *
- * @var integer
- */
- protected $timer = null;
- /**
- * Number of queries executed on the server.
- *
- * @var integer
- */
- protected $count = 0;
- /**
- * Stores an array with unsupported commands.
- *
- * @var array
- */
- protected $block = array("help");
- /**
- * Connects the TeamSpeak3_Transport_Abstract object and performs initial actions on the remote
- * server.
- *
- * @throws TeamSpeak3_Adapter_Exception
- * @return void
- */
- protected function syn()
- {
- $this->initTransport($this->options);
- $this->transport->setAdapter($this);
- TeamSpeak3_Helper_Profiler::init(spl_object_hash($this));
- $rdy = $this->getTransport()->readLine();
- if(!$rdy->startsWith(TeamSpeak3::TS3_PROTO_IDENT) && !$rdy->startsWith(TeamSpeak3::TEA_PROTO_IDENT) && !(defined("CUSTOM_PROTO_IDENT") && $rdy->startsWith(CUSTOM_PROTO_IDENT)))
- {
- throw new TeamSpeak3_Adapter_Exception("invalid reply from the server (" . $rdy . ")");
- }
- TeamSpeak3_Helper_Signal::getInstance()->emit("serverqueryConnected", $this);
- }
- /**
- * The TeamSpeak3_Adapter_ServerQuery destructor.
- *
- * @return void
- */
- public function __destruct()
- {
- if($this->getTransport() instanceof TeamSpeak3_Transport_Abstract && $this->transport->isConnected())
- {
- try
- {
- $this->request("quit");
- }
- catch(Exception $e)
- {
- return;
- }
- }
- }
- /**
- * Sends a prepared command to the server and returns the result.
- *
- * @param string $cmd
- * @param boolean $throw
- * @throws TeamSpeak3_Adapter_Exception
- * @return TeamSpeak3_Adapter_ServerQuery_Reply
- */
- public function request($cmd, $throw = TRUE)
- {
- $query = TeamSpeak3_Helper_String::factory($cmd)->section(TeamSpeak3::SEPARATOR_CELL);
- if(strstr($cmd, "\r") || strstr($cmd, "\n"))
- {
- throw new TeamSpeak3_Adapter_Exception("illegal characters in command '" . $query . "'");
- }
- elseif(in_array($query, $this->block))
- {
- throw new TeamSpeak3_Adapter_ServerQuery_Exception("command not found", 0x100);
- }
- TeamSpeak3_Helper_Signal::getInstance()->emit("serverqueryCommandStarted", $cmd);
- $this->getProfiler()->start();
- $this->getTransport()->sendLine($cmd);
- $this->timer = time();
- $this->count++;
- $rpl = array();
- do {
- $str = $this->getTransport()->readLine();
- $rpl[] = $str;
- } while($str instanceof TeamSpeak3_Helper_String && $str->section(TeamSpeak3::SEPARATOR_CELL) != TeamSpeak3::ERROR);
- $this->getProfiler()->stop();
- $reply = new TeamSpeak3_Adapter_ServerQuery_Reply($rpl, $cmd, $this->getHost(), $throw);
- TeamSpeak3_Helper_Signal::getInstance()->emit("serverqueryCommandFinished", $cmd, $reply);
- return $reply;
- }
- /**
- * Waits for the server to send a notification message and returns the result.
- *
- * @throws TeamSpeak3_Adapter_Exception
- * @return TeamSpeak3_Adapter_ServerQuery_Event
- */
- public function wait()
- {
- if($this->getTransport()->getConfig("blocking"))
- {
- throw new TeamSpeak3_Adapter_Exception("only available in non-blocking mode");
- }
- do {
- $evt = $this->getTransport()->readLine();
- } while($evt instanceof TeamSpeak3_Helper_String && !$evt->section(TeamSpeak3::SEPARATOR_CELL)->startsWith(TeamSpeak3::EVENT));
- return new TeamSpeak3_Adapter_ServerQuery_Event($evt, $this->getHost());
- }
- /**
- * Uses given parameters and returns a prepared ServerQuery command.
- *
- * @param string $cmd
- * @param array $params
- * @return string
- */
- public function prepare($cmd, array $params = array())
- {
- $args = array();
- $cells = array();
- foreach($params as $ident => $value)
- {
- $ident = is_numeric($ident) ? "" : strtolower($ident) . TeamSpeak3::SEPARATOR_PAIR;
- if(is_array($value))
- {
- $value = array_values($value);
- for($i = 0; $i < count($value); $i++)
- {
- if($value[$i] === null) continue;
- elseif($value[$i] === FALSE) $value[$i] = 0x00;
- elseif($value[$i] === TRUE) $value[$i] = 0x01;
- elseif($value[$i] instanceof TeamSpeak3_Node_Abstract) $value[$i] = $value[$i]->getId();
- $cells[$i][] = $ident . TeamSpeak3_Helper_String::factory($value[$i])->escape()->toUtf8();
- }
- }
- else
- {
- if($value === null) continue;
- elseif($value === FALSE) $value = 0x00;
- elseif($value === TRUE) $value = 0x01;
- elseif($value instanceof TeamSpeak3_Node_Abstract) $value = $value->getId();
- $args[] = $ident . TeamSpeak3_Helper_String::factory($value)->escape()->toUtf8();
- }
- }
- foreach(array_keys($cells) as $ident) $cells[$ident] = implode(TeamSpeak3::SEPARATOR_CELL, $cells[$ident]);
- if(count($args)) $cmd .= " " . implode(TeamSpeak3::SEPARATOR_CELL, $args);
- if(count($cells)) $cmd .= " " . implode(TeamSpeak3::SEPARATOR_LIST, $cells);
- return trim($cmd);
- }
- /**
- * Returns the timestamp of the last command.
- *
- * @return integer
- */
- public function getQueryLastTimestamp()
- {
- return $this->timer;
- }
- /**
- * Returns the number of queries executed on the server.
- *
- * @return integer
- */
- public function getQueryCount()
- {
- return $this->count;
- }
- /**
- * Returns the total runtime of all queries.
- *
- * @return mixed
- */
- public function getQueryRuntime()
- {
- return $this->getProfiler()->getRuntime();
- }
- /**
- * Returns the TeamSpeak3_Node_Host object of the current connection.
- *
- * @return TeamSpeak3_Node_Host
- */
- public function getHost()
- {
- if($this->host === null)
- {
- $this->host = new TeamSpeak3_Node_Host($this);
- }
- return $this->host;
- }
- }
|