/** * Returns the code needed to display a node in a TeamSpeak 3 viewer. * * @param TeamSpeak3_Node_Abstract $node * @param array $siblings * @return string */ public function fetchObject(\Teamspeak3\Node\TS3Abstract $node, array $siblings = array()) { $this->currObj = $node; $this->currSib = $siblings; $args = array($this->getPrefix(), $this->getCorpusIcon(), $this->getCorpusName()); return \TeamSpeak3\Helper\String::factory($this->pattern)->arg($args); }
/** * Creates a new TeamSpeak3_Adapter_ServerQuery_Event object. * * @param TeamSpeak3_Helper_String $evt * @param TeamSpeak3_Node_Host $con * @throws TeamSpeak3_Adapter_Exception * @return TeamSpeak3_Adapter_ServerQuery_Event */ public function __construct(\TeamSpeak3\Helper\String $evt, \TeamSpeak3\Node\Host $con = null) { if (!$evt->startsWith(TeamSpeak3::EVENT)) { throw new \TeamSpeak3\Adapter\Exception("invalid notification event format"); } list($type, $data) = $evt->split(TeamSpeak3::SEPARATOR_CELL, 2); if (empty($data)) { throw new \TeamSpeak3\Adapter\Exception("invalid notification event data"); } $fake = new \TeamSpeak3\Helper\String(TeamSpeak3::ERROR . TeamSpeak3::SEPARATOR_CELL . "id" . TeamSpeak3::SEPARATOR_PAIR . 0 . TeamSpeak3::SEPARATOR_CELL . "msg" . TeamSpeak3::SEPARATOR_PAIR . "ok"); $repl = new \TeamSpeak3\Adapter\ServerQuery\Reply(array($data, $fake), $type); $this->type = $type->substr(strlen(TeamSpeak3::EVENT)); $this->data = $repl->toList(); $this->mesg = $data; \TeamSpeak3\Helper\Signal::getInstance()->emit("notifyEvent", $this, $con); \TeamSpeak3\Helper\Signal::getInstance()->emit("notify" . ucfirst($this->type), $this, $con); }
/** * Connects to a remote server. * * @throws Ts3Exception * @return void */ public function connect() { if ($this->stream !== null) { return; } $host = strval($this->config["host"]); $port = strval($this->config["port"]); $address = "udp://" . $host . ":" . $port; $timeout = intval($this->config["timeout"]); $this->stream = @stream_socket_client($address, $errno, $errstr, $timeout); if ($this->stream === false) { throw new Ts3Exception(String::factory($errstr)->toUtf8()->toString(), $errno); } @stream_set_timeout($this->stream, $timeout); @stream_set_blocking($this->stream, $this->config["blocking"] ? 1 : 0); }
/** * Connects the AbstractTransport object and performs initial actions on the remote * server. * * @throws Ts3Exception * @return void */ public function syn() { if (!isset($this->options["host"]) || empty($this->options["host"])) { $this->options["host"] = $this->default_host; } if (!isset($this->options["port"]) || empty($this->options["port"])) { $this->options["port"] = $this->default_port; } $this->initTransport($this->options, "UDP"); $this->transport->setAdapter($this); Profiler::init(spl_object_hash($this)); $this->getTransport()->send(String::fromHex(33)); if (!preg_match_all("/,?(\\d+)#([0-9a-zA-Z\\._-]+),?/", $this->getTransport()->read(96), $matches) || !isset($matches[1]) || !isset($matches[2])) { throw new Ts3Exception("invalid reply from the server"); } $this->build_datetimes = $matches[1]; $this->version_strings = $matches[2]; Signal::getInstance()->emit("updateConnected", $this); }
/** * Returns the adapter type. * * @return string */ public function getAdapterType() { if ($this->adapter instanceof AbstractAdapter) { $string = String::factory(get_class($this->adapter)); return $string->substr($string->findLast("_"))->replace(array("_", " "), "")->toString(); } return "Unknown"; }
/** * 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] = 0x0; } elseif ($value[$i] === TRUE) { $value[$i] = 0x1; } elseif ($value[$i] instanceof \TeamSpeak3\Node\TS3Abstract) { $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 = 0x0; } elseif ($value === TRUE) { $value = 0x1; } 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 all information available on this node. If $convert is enabled, some property * values will be converted to human-readable values. * * @param boolean $extend * @param boolean $convert * @return array */ public function getInfo($extend = true, $convert = false) { if ($extend) { $this->fetchNodeInfo(); } if ($convert) { $info = $this->nodeInfo; foreach ($info as $key => $val) { $key = String::factory($key); if ($key->contains("_bytes_")) { $info[$key->toString()] = Convert::bytes($val); } elseif ($key->contains("_bandwidth_")) { $info[$key->toString()] = Convert::bytes($val) . "/s"; } elseif ($key->contains("_packets_")) { $info[$key->toString()] = number_format($val, null, null, "."); } elseif ($key->contains("_packetloss_")) { $info[$key->toString()] = sprintf("%01.2f", floatval($val->toString()) * 100) . "%"; } elseif ($key->endsWith("_uptime")) { $info[$key->toString()] = Convert::seconds($val); } elseif ($key->endsWith("_version")) { $info[$key->toString()] = Convert::version($val); } elseif ($key->endsWith("_icon_id")) { $info[$key->toString()] = $this->iconGetName($key)->filterDigits(); } } return $info; } return $this->nodeInfo; }
/** * Reads a single line of data from the stream. * * @param string $token * @throws TeamSpeak3_Transport_Exception * @return TeamSpeak3_Helper_String */ public function readLine($token = "\n") { $this->connect(); $line = \TeamSpeak3\Helper\String::factory(""); while (!$line->endsWith($token)) { $this->waitForReadyRead(); $data = @fgets($this->stream, 4096); \TeamSpeak3\Helper\Signal::getInstance()->emit(strtolower($this->getAdapterType()) . "DataRead", $data); if ($data === FALSE) { if ($line->count()) { $line->append($token); } else { throw new Exception("connection to server '" . $this->config["host"] . ":" . $this->config["port"] . "' lost"); } } else { $line->append($data); } } return $line->trim(); }
/** * @ignore */ protected function fetchPermissionCats() { $permcats = array(); $reflects = new \ReflectionClass("TeamSpeak3"); foreach ($reflects->getConstants() as $key => $val) { if (!String::factory($key)->startsWith("PERM_CAT") || $val == 0xff) { continue; } $permcats[$key] = $val; } $this->permissionCats = $permcats; }
/** * Deploys snapshot data on the selected virtual server. If no virtual server is selected (ID 0), * the data will be used to create a new virtual server from scratch. * * @param string $data * @param string $mode * @return array */ public function snapshotDeploy($data, $mode = TeamSpeak3::SNAPSHOT_STRING) { switch ($mode) { case TeamSpeak3::SNAPSHOT_BASE64: $data = \TeamSpeak3\Helper\String::fromBase64($data); break; case TeamSpeak3::SNAPSHOT_HEXDEC: $data = \TeamSpeak3\Helper\String::fromHex($data); break; default: $data = \TeamSpeak3\Helper\String::factory($data); break; } $detail = $this->request("serversnapshotdeploy " . $data)->toList(); if (array_key_exists("sid", $detail)) { \TeamSpeak3\Helper\Signal::getInstance()->emit("notifyServercreated", $this->getParent(), $detail["sid"]); } return $detail; }
/** * Returns the code needed to display a node in a TeamSpeak 3 viewer. * * @param TeamSpeak3_Node_Abstract $node * @param array $siblings * @return string */ public function fetchObject(\TeamSpeak3\Node\TS3Abstract $node, array $siblings = array()) { $this->currObj = $node; $this->currSib = $siblings; $args = array($this->getContainerIdent(), $this->getContainerClass(), $this->getContainerSummary(), $this->getRowClass(), $this->getPrefixClass(), $this->getPrefix(), $this->getCorpusClass(), $this->getCorpusTitle(), $this->getCorpusIcon(), $this->getCorpusName(), $this->getSuffixClass(), $this->getSuffixIcon(), $this->getSuffixFlag()); return \TeamSpeak3\Helper\String::factory($this->pattern)->arg($args); }
/** * Returns an array filled with all permission categories known to the server including * their ID, name and parent. * * @return array */ public function permissionTree() { $permtree = array(); foreach ($this->permissionCats() as $key => $val) { $permtree[$val]["permcatid"] = $val; $permtree[$val]["permcathex"] = "0x" . dechex($val); $permtree[$val]["permcatname"] = \TeamSpeak3\Helper\String::factory(TeamSpeak3\Helper\Convert::permissionCategory($val)); $permtree[$val]["permcatparent"] = $permtree[$val]["permcathex"][3] == 0 ? 0 : hexdec($permtree[$val]["permcathex"][2] . 0); $permtree[$val]["permcatchilren"] = 0; $permtree[$val]["permcatcount"] = 0; if (isset($permtree[$permtree[$val]["permcatparent"]])) { $permtree[$permtree[$val]["permcatparent"]]["permcatchilren"]++; } if ($permtree[$val]["permcatname"]->contains("/")) { $permtree[$val]["permcatname"] = $permtree[$val]["permcatname"]->section("/", 1)->trim(); } foreach ($this->permissionList() as $permission) { if ($permission["permid"]["permcatid"] == $val) { $permtree[$val]["permcatcount"]++; } } } return $permtree; }
/** * Returns the applications host address. * * @return String */ public static function getHostUri() { $sheme = self::getHostParam("HTTPS") == "on" ? "https" : "http"; $serverName = new String(self::getHostParam("HTTP_HOST")); $serverPort = self::getHostParam("SERVER_PORT"); $serverPort = $serverPort != 80 && $serverPort != 443 ? ":" . $serverPort : ""; if ($serverName->endsWith($serverPort)) { $serverName = $serverName->replace($serverPort, ""); } return new String($sheme . "://" . $serverName . $serverPort); }
/** * Returns a client-like short-formatted version of the TeamSpeak 3 version string. * * @param string $version * @return string */ public static function versionShort($version) { if (!$version instanceof String) { $version = new String($version); } return $version->section(" ", 0); }
/** * Returns the name of an adapter class by $name. * * @param string $name * @param string $namespace * @throws Ts3Exception * @return string */ protected static function getAdapterName($name, $namespace = "Adapter/") { $path = self::getFilePath($namespace); $scan = scandir($path); foreach ($scan as $node) { $file = String::factory($node)->toLower(); if ($file->startsWith($name) && $file->endsWith(".php")) { return str_replace(".php", "", "TeamSpeak3\\Adapter\\" . $node); } } throw new Ts3Exception("adapter '" . $name . "' does not exist"); }