Beispiel #1
0
 /**
  * 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_Abstract $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);
 }
Beispiel #3
0
 /**
  * Connects to a remote server.
  *
  * @throws TeamSpeak3_Transport_Exception
  * @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 TeamSpeak3_Transport_Exception(TeamSpeak3_Helper_String::factory($errstr)->toUtf8()->toString(), $errno);
     }
     @stream_set_timeout($this->stream, $timeout);
     @stream_set_blocking($this->stream, $this->config["blocking"] ? 1 : 0);
 }
Beispiel #4
0
 /**
  * Parses a ServerQuery error and returns a TeamSpeak3_Adapter_ServerQuery_Exception object.
  *
  * @param  string $err
  * @throws TeamSpeak3_Adapter_ServerQuery_Exception
  * @return void
  */
 private function fetchError($err)
 {
     $cells = $err->section(TeamSpeak3::SEPERATOR_CELL, 1, 3);
     foreach ($cells->split(TeamSpeak3::SEPERATOR_CELL) as $pair) {
         list($ident, $value) = $pair->split(TeamSpeak3::SEPERATOR_PAIR);
         $this->err[$ident->toString()] = $value->is_numeric() ? $value->toInt() : $value->unescape();
     }
     if ($this->getErrorProperty("id", 0x0) != 0x0) {
         if ($permid = $this->getErrorProperty("failed_permid")) {
             $suffix = " (failed on " . $this->cmd->section(TeamSpeak3::SEPERATOR_CELL) . " " . $permid . "/0x" . strtoupper(dechex($permid)) . ")";
         } elseif ($details = $this->getErrorProperty("extra_msg")) {
             $suffix = " (" . $details . ")";
         } else {
             $suffix = "";
         }
         throw new TeamSpeak3_Adapter_ServerQuery_Exception($this->getErrorProperty("msg") . $suffix, $this->getErrorProperty("id"));
     }
 }
Beispiel #5
0
 /**
  * Connects the TeamSpeak3_Transport_Abstract object and performs initial actions on the remote
  * server.
  *
  * @throws TeamSpeak3_Adapter_Update_Exception
  * @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, "TeamSpeak3_Transport_UDP");
     $this->transport->setAdapter($this);
     TeamSpeak3_Helper_Profiler::init(spl_object_hash($this));
     $this->getTransport()->send(TeamSpeak3_Helper_String::fromHex(32));
     if (!preg_match_all("/,?(\\d+),?/", $this->getTransport()->read(32), $matches) || !isset($matches[1])) {
         throw new TeamSpeak3_Adapter_Update_Exception("invalid reply from the server");
     }
     $this->build_numbers = $matches[1];
     TeamSpeak3_Helper_Signal::getInstance()->emit("updateConnected", $this);
 }
Beispiel #6
0
 /**
  * Parses a ServerQuery error and throws a TeamSpeak3_Adapter_ServerQuery_Exception object if
  * there's an error.
  *
  * @param  string $err
  * @throws TeamSpeak3_Adapter_ServerQuery_Exception
  * @return void
  */
 protected function fetchError($err)
 {
     $cells = $err->section(TeamSpeak3::SEPARATOR_CELL, 1, 3);
     foreach ($cells->split(TeamSpeak3::SEPARATOR_CELL) as $pair) {
         list($ident, $value) = $pair->split(TeamSpeak3::SEPARATOR_PAIR);
         $this->err[$ident->toString()] = $value->isInt() ? $value->toInt() : $value->unescape();
     }
     TeamSpeak3_Helper_Signal::getInstance()->emit("notifyError", $this);
     if ($this->getErrorProperty("id", 0x0) != 0x0 && $this->exp) {
         if ($permid = $this->getErrorProperty("failed_permid")) {
             if ($permsid = key($this->con->request("permget permid=" . $permid, FALSE)->toAssocArray("permsid"))) {
                 $suffix = " (failed on " . $permsid . ")";
             } else {
                 $suffix = " (failed on " . $this->cmd->section(TeamSpeak3::SEPARATOR_CELL) . " " . $permid . "/0x" . strtoupper(dechex($permid)) . ")";
             }
         } elseif ($details = $this->getErrorProperty("extra_msg")) {
             $suffix = " (" . trim($details) . ")";
         } else {
             $suffix = "";
         }
         throw new TeamSpeak3_Adapter_ServerQuery_Exception($this->getErrorProperty("msg") . $suffix, $this->getErrorProperty("id"));
     }
 }
Beispiel #7
0
 /**
  * Returns the content of a downloaded file as a TeamSpeak3_Helper_String object.
  *
  * @param  string  $key
  * @param  integer $size
  * @throws TeamSpeak3_Adapter_Exception
  * @return TeamSpeak3_Helper_String
  */
 public function download($ftkey, $size)
 {
     $this->init($ftkey);
     $buff = new TeamSpeak3_Helper_String("");
     $size = intval($size);
     $pack = 4096;
     for ($seek = 0; $seek < $size;) {
         $rest = $size - $seek;
         $pack = $rest < $pack ? $rest : $pack;
         $data = $this->getTransport()->read($rest < $pack ? $rest : $pack);
         $seek = $seek + $pack;
         $buff->append($data);
     }
     $this->getProfiler()->stop();
     if (strlen($buff) != $size) {
         throw new TeamSpeak3_Adapter_Exception("incomplete file download (" . count($buff) . " of " . $size . " bytes)");
     }
     return $buff;
 }
Beispiel #8
0
 /**
  * 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_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 = 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);
 }
Beispiel #9
0
 /**
  * Sets a single value in the current ServerQuery connection info.
  *
  * @param  string $ident
  * @param  mixed  $value
  * @return mixed
  */
 public function whoamiSet($ident, $value = null)
 {
     $this->whoami();
     $this->whoami[$ident] = is_numeric($value) ? intval($value) : TeamSpeak3_Helper_String::factory($value);
 }
 /**
  * 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 = TeamSpeak3_Helper_String::factory($key);
             if ($key->contains("_bytes_")) {
                 $info[$key->toString()] = TeamSpeak3_Helper_Convert::bytes($val);
             } elseif ($key->contains("_bandwidth_")) {
                 $info[$key->toString()] = TeamSpeak3_Helper_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()] = TeamSpeak3_Helper_Convert::seconds($val);
             } elseif ($key->endsWith("_icon_id")) {
                 $info[$key->toString()] = $this->iconGetName($key)->filterDigits();
             }
         }
         return $info;
     }
     return $this->nodeInfo;
 }
Beispiel #11
0
 /**
  * Deploys snapshot data on the virtual server.
  *
  * @param  string $data
  * @param  string $mode
  * @return void
  */
 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;
     }
     $this->request("serversnapshotdeploy " . $data);
 }
 /**
  * Prepares a custom error message by replacing pre-defined signs with given values.
  *
  * @param  TeamSpeak3_Helper_String $mesg
  * @return TeamSpeak3_Helper_String
  */
 protected function prepareCustomMessage(TeamSpeak3_Helper_String $mesg)
 {
     $args = array("code" => $this->getCode(), "mesg" => $this->getMessage(), "line" => $this->getLine(), "file" => $this->getFile());
     return $mesg->arg($args)->toString();
 }
Beispiel #13
0
 /**
  * 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 TeamSpeak3_Transport_Exception("connection to server '" . $this->config["host"] . ":" . $this->config["port"] . "' lost");
             }
         } else {
             $line->append($data);
         }
     }
     return $line->trim();
 }
 /**
  * Returns the name of an adapter class by $name.
  *
  * @param  string $name
  * @param  string $namespace
  * @throws TeamSpeak3_Adapter_Exception
  * @return string
  */
 protected static function getAdapterName($name, $namespace = "TeamSpeak3_Adapter_")
 {
     $path = self::getFilePath($namespace);
     $scan = scandir($path);
     foreach ($scan as $node) {
         $file = TeamSpeak3_Helper_String::factory($node)->toLower();
         if ($file->startsWith($name) && $file->endsWith(".php")) {
             return $namespace . str_replace(".php", "", $node);
         }
     }
     throw new TeamSpeak3_Adapter_Exception("adapter '" . $name . "' does not exist");
 }
Beispiel #15
0
 /**
  * Returns a list of permissions available on the server instance.
  *
  * @return array
  */
 public function permissionList()
 {
     if ($this->permissionList === null) {
         $this->fetchPermissionList();
     }
     foreach ($this->permissionList as $permname => $permdata) {
         if (isset($permdata["permcatid"]) && $permdata["permgrant"]) {
             continue;
         }
         $this->permissionList[$permname]["permcatid"] = $this->permissionGetCategoryById($permdata["permid"]);
         $this->permissionList[$permname]["permgrant"] = $this->permissionGetGrantById($permdata["permid"]);
         $grantsid = "i_needed_modify_power_" . substr($permname, 2);
         if (!$permdata["permname"]->startsWith("i_needed_modify_power_") && !isset($this->permissionList[$grantsid])) {
             $this->permissionList[$grantsid]["permid"] = $this->permissionList[$permname]["permgrant"];
             $this->permissionList[$grantsid]["permname"] = TeamSpeak3_Helper_String::factory($grantsid);
             $this->permissionList[$grantsid]["permdesc"] = null;
             $this->permissionList[$grantsid]["permcatid"] = 0xff;
             $this->permissionList[$grantsid]["permgrant"] = $this->permissionList[$permname]["permgrant"];
         }
     }
     return $this->permissionList;
 }
Beispiel #16
0
 /**
  * Returns a client-like formatted version of the TeamSpeak 3 version string.
  *
  * @param  string $version
  * @param  string $format
  * @return string
  */
 public static function version($version, $format = "Y-m-d h:i:s")
 {
     if (!$version instanceof TeamSpeak3_Helper_String) {
         $version = new TeamSpeak3_Helper_String($version);
     }
     $buildno = $version->section("[", 1)->filterDigits()->toInt();
     return $buildno <= 15001 ? $version : $version->section("[")->append("(" . date($format, $buildno) . ")");
 }
Beispiel #17
0
 /**
  * Returns an ordered array of regular server groups available based on a pre-defined
  * set of rules.
  *
  * @return array
  */
 public function serverGroupGetProfiles()
 {
     $profiles = array();
     foreach ($this->serverGroupList() as $sgid => $sgroup) {
         if ($sgroup["type"] != TeamSpeak3::GROUP_DBTYPE_REGULAR) {
             continue;
         }
         $profiles[$sgid] = array("b_permission_modify_power_ignore" => 0, "i_group_needed_member_add_power" => 0, "i_group_member_add_power" => 0, "i_group_needed_member_remove_power" => 0, "i_group_member_remove_power" => 0, "i_needed_modify_power_count" => 0, "i_needed_modify_power_total" => 0, "i_permission_modify_power" => 0, "i_group_needed_modify_power" => 0, "i_group_modify_power" => 0, "i_client_needed_modify_power" => 0, "i_client_modify_power" => 0, "b_virtualserver_servergroup_create" => 0, "b_virtualserver_servergroup_delete" => 0, "b_client_ignore_bans" => 0, "b_client_ignore_antiflood" => 0, "b_group_is_permanent" => 0, "i_client_needed_ban_power" => 0, "i_client_needed_kick_power" => 0, "i_client_needed_move_power" => 0, "i_client_talk_power" => 0, "__sgid" => $sgid, "__name" => $sgroup->toString(), "__node" => $sgroup);
         try {
             $perms = $this->serverGroupPermList($sgid, TRUE);
             $grant = isset($perms["i_permission_modify_power"]) ? $perms["i_permission_modify_power"]["permvalue"] : null;
         } catch (TeamSpeak3_Adapter_ServerQuery_Exception $e) {
             /* ERROR_database_empty_result */
             if ($e->getCode() != 0x501) {
                 throw $e;
             }
             $perms = array();
             $grant = null;
         }
         foreach ($perms as $permsid => $perm) {
             if (in_array($permsid, array_keys($profiles[$sgid]))) {
                 $profiles[$sgid][$permsid] = $perm["permvalue"];
             } elseif (TeamSpeak3_Helper_String::factory($permsid)->startsWith("i_needed_modify_power_")) {
                 if (!$grant || $perm["permvalue"] > $grant) {
                     continue;
                 }
                 $profiles[$sgid]["i_needed_modify_power_total"] = $profiles[$sgid]["i_needed_modify_power_total"] + $perm["permvalue"];
                 $profiles[$sgid]["i_needed_modify_power_count"]++;
             }
         }
     }
     array_multisort($profiles, SORT_DESC);
     return $profiles;
 }
 /**
  * Returns the adapter type.
  *
  * @return string
  */
 public function getAdapterType()
 {
     if ($this->adapter instanceof TeamSpeak3_Adapter_Abstract) {
         $string = TeamSpeak3_Helper_String::factory(get_class($this->adapter));
         return $string->substr($string->findLast("_"))->replace(array("_", " "), "")->toString();
     }
     return "Unknown";
 }
Beispiel #19
0
 /**
  * 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_Abstract $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);
 }
Beispiel #20
0
 /**
  * @ignore
  */
 protected function fetchPermissionCats()
 {
     $permcats = array();
     $reflects = new ReflectionClass("TeamSpeak3");
     foreach ($reflects->getConstants() as $key => $val) {
         if (!TeamSpeak3_Helper_String::factory($key)->startsWith("PERM_CAT") || $val == 0xff) {
             continue;
         }
         $permcats[$key] = $val;
     }
     $this->permissionCats = $permcats;
 }
Beispiel #21
0
 /**
  * Returns the applications host address.
  *
  * @return TeamSpeak3_Helper_String
  */
 public static function getHostUri()
 {
     $sheme = self::getHostParam("HTTPS") == "on" ? "https" : "http";
     $serverName = new TeamSpeak3_Helper_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 TeamSpeak3_Helper_String($sheme . "://" . $serverName . $serverPort);
 }
Beispiel #22
0
 /**
  * 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 TeamSpeak3_Helper_String) {
         $version = new TeamSpeak3_Helper_String($version);
     }
     return $version->section(" ", 0);
 }
Beispiel #23
0
 /**
  * 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;
 }
Beispiel #24
0
 public function getStartParams()
 {
     $params = array();
     $params[] = 'create_default_virtualserver=0';
     if ($this->firstStart) {
         $password = \TeamSpeak3_Helper_String::factory($this->queryPassword)->escape();
         $params[] = 'serveradmin_password='******'"' . implode(' ', $params) . '"' . ($this->firstStart ? ' &' : '');
 }