3namespace PlanetTeamSpeak\TeamSpeak3Framework\Node;
5use PlanetTeamSpeak\TeamSpeak3Framework\Adapter\ServerQuery;
6use PlanetTeamSpeak\TeamSpeak3Framework\Exception\AdapterException;
7use PlanetTeamSpeak\TeamSpeak3Framework\Exception\HelperException;
8use PlanetTeamSpeak\TeamSpeak3Framework\Exception\ServerQueryException;
9use PlanetTeamSpeak\TeamSpeak3Framework\Helper\Convert;
10use PlanetTeamSpeak\TeamSpeak3Framework\Helper\Crypt;
11use PlanetTeamSpeak\TeamSpeak3Framework\Helper\Signal;
12use PlanetTeamSpeak\TeamSpeak3Framework\Helper\StringHelper;
13use PlanetTeamSpeak\TeamSpeak3Framework\TeamSpeak3;
81 $this->parent = $squery;
93 return $this->
whoamiGet(
"virtualserver_id", 0);
105 return $this->
whoamiGet(
"virtualserver_port", 0);
116 public function version(
string $ident =
null): mixed
142 $getargs = func_get_args();
144 if ($sid != 0 && $this->predefined_query_name !==
null) {
145 $this->
execute(
"use", [
"sid" => $sid,
"client_nickname" => (
string)$this->predefined_query_name, $virtual ?
"-virtual" :
null]);
147 $this->
execute(
"use", [
"sid" => $sid, $virtual ?
"-virtual" :
null]);
152 if ($sid != 0 && $this->predefined_query_name !==
null && $this->
whoamiGet(
"client_nickname") != $this->predefined_query_name) {
153 $this->
execute(
"clientupdate", [
"client_nickname" => (
string)$this->predefined_query_name]);
156 $this->
setStorage(
"_server_use", [__FUNCTION__, $getargs]);
158 Signal::getInstance()->emit(
"notifyServerselected", $this);
192 $getargs = func_get_args();
194 if ($port != 0 && $this->predefined_query_name !==
null) {
195 $this->
execute(
"use", [
"port" => $port,
"client_nickname" => (
string)$this->predefined_query_name, $virtual ?
"-virtual" :
null]);
197 $this->
execute(
"use", [
"port" => $port, $virtual ?
"-virtual" :
null]);
202 if ($port != 0 && $this->predefined_query_name !==
null && $this->
whoamiGet(
"client_nickname") != $this->predefined_query_name) {
203 $this->
execute(
"clientupdate", [
"client_nickname" => (
string)$this->predefined_query_name]);
206 $this->
setStorage(
"_server_use", [__FUNCTION__, $getargs]);
208 Signal::getInstance()->emit(
"notifyServerselected", $this);
235 $sid = $this->
execute(
"serveridgetbyport", [
"virtualserver_port" => $port])->toList();
237 return $sid[
"server_id"];
250 if (!array_key_exists((
string)$sid, $this->
serverList())) {
254 return $this->
serverList[intval((
string)$sid)][
"virtualserver_port"];
281 return new Server($this, [
"virtualserver_id" => $sid]);
310 if (
$server[
"virtualserver_name"] == $name) {
329 if (
$server[
"virtualserver_unique_identifier"] == $uid) {
350 $detail = $this->
execute(
"servercreate", $properties)->toList();
351 $server =
new Server($this, [
"virtualserver_id" => intval($detail[
"sid"])]);
353 Signal::getInstance()->emit(
"notifyServercreated", $this, $detail[
"sid"]);
354 Signal::getInstance()->emit(
"notifyTokencreated",
$server, $detail[
"token"]);
373 $this->
execute(
"serverdelete", [
"sid" => $sid]);
376 Signal::getInstance()->emit(
"notifyServerdeleted", $this, $sid);
393 $this->
execute(
"serverstart", [
"sid" => $sid]);
396 Signal::getInstance()->emit(
"notifyServerstarted", $this, $sid);
408 public function serverStop(
int $sid,
string $msg =
null): void
414 $this->
execute(
"serverstop", [
"sid" => $sid,
"reasonmsg" => $msg]);
417 Signal::getInstance()->emit(
"notifyServerstopped", $this, $sid);
430 Signal::getInstance()->emit(
"notifyServershutdown", $this);
432 $this->
execute(
"serverprocessstop", [
"reasonmsg" => $msg]);
446 $servers = $this->
request(
"serverlist -uid")->toAssocArray(
"virtualserver_id");
450 foreach ($servers as $sid =>
$server) {
481 return $this->
execute(
"bindinglist", [
"subsystem" => $subsystem])->toArray();
493 return current($this->
execute(
"apikeylist -count", [
"duration" => 1])->toList(
"count"));
508 public function apiKeyList(
int $offset =
null,
int $limit =
null, mixed $cldbid =
null): array
510 return $this->
execute(
"apikeylist -count", [
"start" => $offset,
"duration" => $limit,
"cldbid" => $cldbid])->toAssocArray(
"id");
527 $detail = $this->
execute(
"apikeyadd", [
"scope" => $scope,
"lifetime" => $lifetime,
"cldbid" => $cldbid])->toList();
529 Signal::getInstance()->emit(
"notifyApikeycreated", $this, $detail[
"apikey"]);
544 $this->
execute(
"apikeydel", [
"id" => $id]);
561 if (isset($permdata[
"permcatid"]) && $permdata[
"permgrant"]) {
568 $grantsid =
"i_needed_modify_power_" . substr($permname, 2);
570 if (!$permdata[
"permname"]->startsWith(
"i_needed_modify_power_") && !isset($this->
permissionList[$grantsid])) {
572 $this->
permissionList[$grantsid][
"permname"] = StringHelper::factory($grantsid);
627 $permtree[$val][
"permcatid"] = $val;
628 $permtree[$val][
"permcathex"] =
"0x" . dechex($val);
629 $permtree[$val][
"permcatname"] = StringHelper::factory(Convert::permissionCategory($val));
630 $permtree[$val][
"permcatparent"] = $permtree[$val][
"permcathex"][3] == 0 ? 0 : hexdec($permtree[$val][
"permcathex"][2] . 0);
631 $permtree[$val][
"permcatchilren"] = 0;
632 $permtree[$val][
"permcatcount"] = 0;
634 if (isset($permtree[$permtree[$val][
"permcatparent"]])) {
635 $permtree[$permtree[$val][
"permcatparent"]][
"permcatchilren"]++;
638 if ($permtree[$val][
"permcatname"]->contains(
"/")) {
639 $permtree[$val][
"permcatname"] = $permtree[$val][
"permcatname"]->section(
"/", 1)->trim();
643 if ((! array_key_exists(
"permid", $permission)) or (! array_key_exists(
"permcatid", $permission[
"permid"]))) {
646 if ($permission[
"permid"][
"permcatid"] == $val) {
647 $permtree[$val][
"permcatcount"]++;
666 if (!is_array($permissionId)) {
667 $permident = (is_numeric($permissionId)) ?
"permid" :
"permsid";
669 $permident = (is_numeric(
current($permissionId))) ?
"permid" :
"permsid";
672 return $this->
execute(
"permfind", [$permident => $permissionId])->toArray();
703 if ($perm[
"permid"] == $permissionId) {
724 if (!is_numeric($permid)) {
728 if ($permid < 0x1000) {
740 if ($val >= $permid && isset($catids[$key])) {
741 return $catids[$key];
747 return (
int)$permid >> 8;
764 if (!is_numeric($permid)) {
768 if ($permid < 0x1000) {
769 return (
int)$permid + 0x8000;
771 return (
int)bindec(substr(decbin($permid), -8)) + 0xFF00;
788 public function serverGroupPermAutoAssign(
int $sgtype,
int|array $permid,
int|array $permvalue,
int|array $permnegated = 0, array|
bool $permskip =
false): void
790 if (!is_array($permid)) {
791 $permident = (is_numeric($permid)) ?
"permid" :
"permsid";
793 $permident = (is_numeric(
current($permid))) ?
"permid" :
"permsid";
796 $this->
execute(
"servergroupautoaddperm", [
"sgtype" => $sgtype, $permident => $permid,
"permvalue" => $permvalue,
"permnegated" => $permnegated,
"permskip" => $permskip]);
811 if (!is_array($permid)) {
812 $permident = (is_numeric($permid)) ?
"permid" :
"permsid";
814 $permident = (is_numeric(
current($permid))) ?
"permid" :
"permsid";
817 $this->
execute(
"servergroupautodelperm", [
"sgtype" => $sgtype, $permident => $permid]);
830 if (!is_array($permid)) {
831 $permident = (is_numeric($permid)) ?
"permid" :
"permsid";
833 $permident = (is_numeric(
current($permid))) ?
"permid" :
"permsid";
836 return $this->
execute(
"permget", [$permident => $permid])->toAssocArray(
"permsid");
847 public function modify(array $properties): void
849 $this->
execute(
"instanceedit", $properties);
863 $this->
execute(
"gm", [
"msg" => $msg]);
877 public function logView(
int $lines = 30,
int $begin_pos =
null,
bool $reverse =
null,
bool $instance =
true): array
879 return $this->
execute(
"logview", [
"lines" => $lines,
"begin_pos" => $begin_pos,
"instance" => $instance,
"reverse" => $reverse])->toArray();
896 $this->
execute(
"logadd", [
"logmsg" => $logmsg,
"loglevel" => $loglevel]);
910 public function login(
string $username,
string $password): void
912 $this->
execute(
"login", [
"client_login_name" => $username,
"client_login_password" => $password]);
915 $crypt =
new Crypt($username);
918 $this->
setStorage(
"_login_pass", $crypt->encrypt($password));
920 Signal::getInstance()->emit(
"notifyLogin", $this);
938 Signal::getInstance()->emit(
"notifyLogout", $this);
951 return current($this->
execute(
"queryloginlist -count", [
"duration" => 1,
"pattern" => $pattern])->toList(
"count"));
965 public function queryListLogin(
int $offset =
null,
int $limit =
null,
string $pattern =
null): array
967 return $this->
execute(
"queryloginlist -count", [
"start" => $offset,
"duration" => $limit,
"pattern" => $pattern])->toAssocArray(
"cldbid");
984 return $this->
execute(
"queryloginadd", [
"client_login_name" => $username,
"cldbid" => $cldbid])->toList();
986 return $this->
execute(
"queryloginadd", [
"client_login_name" => $username])->toList();
999 $this->
execute(
"querylogindel", [
"cldbid" => $cldbid]);
1011 if ($this->
whoami ===
null) {
1027 public function whoamiGet(
string $ident, mixed $default =
null): mixed
1029 if (array_key_exists($ident, $this->
whoami())) {
1030 return $this->
whoami[$ident];
1044 public function whoamiSet(
string $ident, mixed $value =
null)
1048 $this->
whoami[$ident] = (is_numeric($value)) ? (
int)$value : StringHelper::factory($value);
1066 return $this->
getParent()->getTransportHost();
1076 return $this->
getParent()->getTransportPort();
1088 foreach ($servers as
$server) {
1100 $info1 = $this->
request(
"hostinfo")->toList();
1101 $info2 = $this->
request(
"instanceinfo")->toList();
1103 $this->nodeInfo = array_merge($this->nodeInfo, $info1, $info2);
1113 $reply = $this->
request(
"permissionlist -new")->toArray();
1119 foreach ($reply as $line) {
1120 if (array_key_exists(
"group_id_end", $line)) {
1123 $this->
permissionList[$line[
"permname"]->toString()] = array_merge([
"permid" => $start++], $line);
1134 $reflects =
new ReflectionClass(
"TeamSpeak3");
1136 foreach ($reflects->getConstants() as $key => $val) {
1137 if (!StringHelper::factory($key)->startsWith(
"PERM_CAT") || $val == 0xFF) {
1141 $permcats[$key] = $val;
1157 $this->predefined_query_name = $name;
1182 $this->exclude_query_clients = $exclude;
1207 $this->start_offline_virtual = $virtual;
1231 $this->sort_clients_channels = $first;
1295 $username = $this->
getStorage(
"_login_user");
1296 $password = $this->
getStorage(
"_login_pass");
1298 if ($username && $password) {
1299 $crypt =
new Crypt($username);
1301 $this->
login($username, $crypt->decrypt($password));
1304 $this->predefined_query_name = $this->
getStorage(
"_query_nick");
1305 $this->exclude_query_clients = $this->
getStorage(
"_query_hide",
false);
1306 $this->start_offline_virtual = $this->
getStorage(
"_do_virtual",
false);
1307 $this->sort_clients_channels = $this->
getStorage(
"_client_top",
false);
1313 call_user_func_array([$this, $func], $args);
Enhanced exception class for PlanetTeamSpeak\TeamSpeak3Framework\Adapter\ServerQuery objects.
Helper class for data encryption.
Helper class for string handling.
Class describing a TeamSpeak 3 server instance and all it's parameters.
bindingList(string $subsystem="voice")
setUseOfflineAsVirtual(bool $virtual=false)
whoamiGet(string $ident, mixed $default=null)
queryLoginDelete(int $cldbid)
serverGroupPermAutoAssign(int $sgtype, int|array $permid, int|array $permvalue, int|array $permnegated=0, array|bool $permskip=false)
permissionGetIdByName(string $name)
serverGetPortById(int $sid)
serverGroupPermAutoRemove(int $sgtype, int|array $permid)
string null $predefined_query_name
whoamiSet(string $ident, mixed $value=null)
serverStopProcess(string $msg=null)
serverSelectByPort(int $port, bool $virtual=null)
__construct(ServerQuery $squery)
permissionGetCategoryById(int $permid)
selfPermCheck(int|array $permid)
apiKeyCreate(string $scope=TeamSpeak3::APIKEY_READ, int $lifetime=14, int $cldbid=null)
serverGetByPort(int $port)
permissionGetNameById(int $permissionId)
logView(int $lines=30, int $begin_pos=null, bool $reverse=null, bool $instance=true)
queryLoginCreate(string $username, int $cldbid=0)
login(string $username, string $password)
array null $permissionList
serverIdGetByPort(int $port)
queryListLogin(int $offset=null, int $limit=null, string $pattern=null)
apiKeyList(int $offset=null, int $limit=null, mixed $cldbid=null)
setExcludeQueryClients(bool $exclude=false)
version(string $ident=null)
bool $start_offline_virtual
logAdd(string $logmsg, int $loglevel=TeamSpeak3::LOGLEVEL_INFO)
bool $sort_clients_channels
permissionGetGrantById(int $permid)
serverGetByUid(string $uid)
serverSelect(int $sid, bool $virtual=null)
array null $permissionCats
queryCountLogin(string $pattern=null)
serverCreate(array $properties=[])
setLoadClientlistFirst(bool $first=false)
permissionFind(int|array $permissionId)
setPredefinedQueryName(string $name=null)
serverStop(int $sid, string $msg=null)
serverSelectById(int $sid, bool $virtual=null)
array null $permissionEnds
modify(array $properties)
serverGetByName(string $name)
serverList(array $filter=[])
bool $exclude_query_clients
filterList(array $nodes=[], array $rules=[])
execute($cmd, array $params=[])
request(string $cmd, bool $throw=true)
getStorage(string $key, mixed $default=null)
setStorage(string $key, mixed $val)
Class describing a TeamSpeak 3 virtual server and all it's parameters.
const LOGLEVEL_INFO
4: informational output
const APIKEY_READ
allow access to read-only calls