* -------------------------
* begin : Sunday, Dec 24, 2009
* copyright : (C) 2009-2010 RK Programming
* email : robin@rk-programming.de
* version : 0.3.6
* last modified : Tuesday, Dec 29, 2009
*
* @author RK Programming
* @copyright Copyright (c) 2009-2010, Robin K.
* @version 0.3.6
TS3webinterface 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, version 1.3.
**/
define('TS3WEBINTERFACE_VERSION', '0.3.6');
error_reporting(E_ALL);
require_once('ts3remote.class.php');
function getAssignedServerUsers()
{
global $db;
$ts3vservers = $db->resultQuery("SELECT * FROM OGP_DB_PREFIXts3_homes
WHERE vserver_id='".
TS3WEBINTERFACE_VSERVER_ID."' AND rserver_id=".
$_SESSION['rserver_id'] );
if($ts3vservers != FALSE)
{
$users_assigned = array();
foreach($ts3vservers as $ts3vserver)
{
if($ts3vserver['user_id'] != $_SESSION['user_id'])
$users_assigned[] = $ts3vserver['user_id'];
}
}
$subusers = $db->getUsersSubUsersIds($_SESSION['user_id']);
if(is_array($subusers))
{
$subusers_list = array();
$subusersb = array();
foreach($subusers as $subuser)
{
if(!in_array($subuser,$users_assigned))
$subusers_list[] = $db->getUserById($subuser);
$subusersb[] = $subuser;
}
if(empty($subusers_list))
$subusers_list = FALSE;
}
if(is_array($users_assigned))
{
$subusers_assigned_list = array();
foreach($users_assigned as $user_assigned)
{
if(in_array($user_assigned,$subusersb))
$subusers_assigned_list[] = $db->getUserById($user_assigned);
}
if(empty($subusers_assigned_list))
$subusers_assigned_list = FALSE;
}
return array('users_assigned' => $users_assigned,
'subusers' => $subusersb,
'subusers_assigned_list' => $subusers_assigned_list,
'subusers_list' => $subusers_list);
}
class TS3webinterface
{
private $serverIP;
private $serverPort;
private $server;
private $errorString;
private $session;
private $template;
private $language;
function __construct($ip, $port)
{
global $db;
$isAdmin = $db->isAdmin( $_SESSION['user_id'] );
$this->loadLanguage();
$this->server = new TS3remote($ip, $port);
// CHECK IF CONNECTED
$tmpConnectError = $this->server->getError();
if( !empty($tmpConnectError) )
{
die($this->language['error'].' '.$tmpConnectError[1].': '.$tmpConnectError[2]);
}
$this->server->r_clientupdate(array(array('client_nickname', 'TS3webinterface Client | by Prookie')));
$this->server->setDeEscapeResults(true);
$this->template = null;
$this->serverIP = $ip;
$this->serverPort = $port;
$this->errorString = '';
$this->session = $_SESSION;
if( !isset($this->session['loggedin']) ) $this->session['loggedin'] = false;
if( !isset($this->session['lvserver']) ) $this->session['lvserver'] = 0;
if( !isset($this->session['luser']) ) $this->session['luser'] = '';
if( !isset($this->session['lpwd']) ) $this->session['lpwd'] = '';
if( !isset($this->session['lastaction']) ) $this->session['lastaction'] = 0;
$user = TS3WEBINTERFACE_NAME;
$password = TS3WEBINTERFACE_PWD;
if( !empty($user) && !empty($password) )
{
if( $this->checkLoginData(TS3WEBINTERFACE_NAME, TS3WEBINTERFACE_PWD) )
{
$this->session['loggedin'] = true;
$this->session['luser'] = TS3WEBINTERFACE_NAME;
$this->session['lpwd'] = TS3WEBINTERFACE_PWD;
if ( !$isAdmin )
$this->session['lvserver'] = TS3WEBINTERFACE_VSERVER_ID;
$this->session['lastaction'] = time();
}
}
if( $isAdmin AND isset( $_GET['changevServer'] ) )
{
$this->session['lvserver'] = 0;
}
else if( $isAdmin AND isset( $_POST['vserverSubmit'] ) && !empty( $_POST['vserver'] ) )
{
$this->session['lvserver'] = $_POST['vserver'];
}
if( $this->checkSession() )
{
if( !$this->login() )
{
echo 'TS3webinterface ERROR: '.$this->errorString;
$this->renewSession();
}
else
{
$this->switchAction();
}
}
else
{
$this->initSmarty();
$this->template->assign('title', $this->language['title'].' :: Login');
$this->template->display('header.tpl');
$this->template->display('loginForm.tpl');
$this->template->display('footer.tpl');
}
$this->server->disconnect();
}
function __destruct()
{
$_SESSION = $this->session;
}
private function initSmarty()
{
require_once('smarty/Smarty.class.php');
$this->template = new Smarty();
$this->template->compile_check = true;
$this->template->debugging = false;
if( is_array($this->language) )
{
$this->template->assign('lang', $this->language);
}
else
{
die('TS3webinterface ERROR: no language file available');
}
$this->template->assign_by_ref('webinterface', $this, array('parseTime', 'parseDate', 'convertByteToMB', 'convertByteToKB'));
}
private function loadLanguage($lang=false)
{
$includeStandardFile = 'lang/English/modules/TS3Admin.php';
$includeLangFile = 'lang/'.(($lang != false) ? $lang : TS3WEBINTERFACE_LANG).'/modules/TS3Admin.php';
if( $includeLangFile != $includeStandardFile && file_exists($includeLangFile) )
{
require($includeLangFile);// overwrite standard strings
}
else
{
require($includeStandardFile);
}
$constants = get_defined_constants(true);
$this->language = $constants['user'];
}
public function getError()
{
$tmp = $this->errorString;
$this->errorString = '';
return $tmp;
}
private function renewSession()
{
$this->session['loggedin'] = false;
$this->session['lvserver'] = 0;
$this->session['luser'] = '';
$this->session['lpwd'] = '';
$this->session['lastaction'] = 0;
}
private function checkSession()
{
if( $this->session['loggedin'] === true && $this->session['luser'] != '' &&
$this->session['lpwd'] != '' && (time()-1800 < $this->session['lastaction']) )
{
$this->session['lastaction'] = time();
return true;
}
else if( time()-1800 <= $this->session['lastaction'] )
{
$this->errorString .= '['.$this->language['e_session_timedout'].']';
$this->renewSession();
return false;
}
else
{
$this->renewSession();
return false;
}
}
private function checkLoginData($user, $pwd, $vserver=false)
{
if( !$this->server->isConnected() ) return false;
if( $vserver )
{
if( !$this->server->r_use($vserver) )
{
$this->errorString .= '['.$this->language['e_conn_vserver'].']';
return false;
}
}
if( !$this->server->r_login($user, $pwd) )
{
$this->errorString .= '['.$this->language['e_conn_serverquery'].']';
return false;
}
return true;
}
private function login($vserver=true)
{
if( !$this->server->isConnected() ) return false;
if( $vserver )
{
if( !$this->server->r_use($this->session['lvserver']) )
{
$this->errorString .= '['.$this->language['e_conn_vserver'].']';
return false;
}
}
if( !$this->server->r_login($this->session['luser'], $this->session['lpwd']) )
{
$this->errorString .= '['.$this->language['e_conn_serverquery'].']';
return false;
}
return true;
}
private function switchAction()
{
if( isset($_GET['getchannelbackup']) && $this->session['lvserver'] != 0 )
{
if( $channelBackupString = $this->getChannelBackupString() )
{
header('Content-Disposition: attachment; filename="ts3wi_channelbackup_vserver'.$this->session['lvserver'].'.txt"');
header('Content-Type: x-type/subtype');
echo $channelBackupString;
}
$this->server->disconnect();
exit();
}
if( isset($_POST['ajaxRequest']) )
{
$response = '';
switch($_POST['do'])
{
case 'serveredit':
if( !empty($_POST['serverprop']) && isset($_POST['value']) )
{
if( $this->server->r_serveredit(array(array($_POST['serverprop'], $_POST['value']))) )
{
$response = array('OK', $_POST['serverprop'], $_POST['value']);
}
else
{
$error = $this->server->getError();
$response = array('ERROR', $error[2], $this->language['n_server_responded'].' '.$error[3]);
if( $resolvedError = $this->resolveErrorID($error[2]) )
{
$response[2] .= "\n\n".$resolvedError;
}
}
}
else
{
$response = array('ERROR', 2, 'missing arguments');
}
break;
case 'serverupdate':
if( !empty($_POST['serverprop']) )
{
if( $tmp = $this->server->r_serverinfo() )
{
$tmp = $tmp[0];
$response = array('OK');
if( !is_array($_POST['serverprop']) ) $_POST['serverprop'] = array($_POST['serverprop']);
for($i=0; $iparseTime($tmp[$_POST['serverprop'][$i]]);
}
else if( $_POST['serverprop'][$i] == 'connection_bytes_sent_total' || $_POST['serverprop'][$i] == 'connection_bytes_received_total' )
{
$tmp[$_POST['serverprop'][$i]] = $this->convertByteToMB($tmp[$_POST['serverprop'][$i]]);
}
else if( $_POST['serverprop'][$i] == 'connection_bandwidth_sent_last_second_total' || $_POST['serverprop'][$i] == 'connection_bandwidth_received_last_second_total'
|| $_POST['serverprop'][$i] == 'connection_bandwidth_sent_last_minute_total' || $_POST['serverprop'][$i] == 'connection_bandwidth_received_last_minute_total' )
{
$tmp[$_POST['serverprop'][$i]] = $this->convertByteToKB($tmp[$_POST['serverprop'][$i]]);
}
$response[] = array($_POST['serverprop'][$i], $tmp[$_POST['serverprop'][$i]]);
}
}
else
{
$error = $this->server->getError();
$response = array('ERROR', $error[2], $this->language['n_server_responded'].' '.$error[3]);
}
}
else
{
$response = array('ERROR', 2, 'missing arguments');
}
break;
case 'startserver':
case 'stopserver':
if( !empty($_POST['serverid']) )
{
$actionDone = '';
if( $_POST['do'] == 'startserver' )
{
$tmp = $this->server->r_serverstart($_POST['serverid']);
$actionDone = 'serverstart';
}
else if( $_POST['do'] == 'stopserver' )
{
$tmp = $this->server->r_serverstop($_POST['serverid']);
$actionDone = 'serverstop';
}
if( $tmp )
{
$response = array('OK', $_POST['serverid'], $actionDone);
}
else
{
$error = $this->server->getError();
$response = array('ERROR', $error[2], $this->language['n_server_responded'].' '.$error[3]);
}
}
else
{
$response = array('ERROR', 2, 'missing arguments');
}
break;
case 'deleteserver':
if( !empty($_POST['serverid']) )
{
$this->server->r_serverstop($_POST['serverid']);
if( $this->server->r_serverdelete($_POST['serverid']) )
{
$response = array('OK', $_POST['serverid'], 'serverdelete');
}
else
{
$error = $this->server->getError();
$response = array('ERROR', $error[2], $this->language['n_server_responded'].' '.$error[3]);
}
}
else
{
$response = array('ERROR', 2, 'missing arguments');
}
break;
case 'deletetoken':
if( !empty($_POST['token']) )
{
if( $this->server->r_tokendelete($_POST['token']) )
{
$response = array('OK', $_POST['token']);
}
else
{
$error = $this->server->getError();
$response = array('ERROR', $error[2], $this->language['n_server_responded'].' '.$error[3]);
}
}
else
{
$response = array('ERROR', 2, 'missing arguments');
}
break;
case 'serverviewupdate':
$this->initSmarty();
$this->template->assign('serverTree', $this->getLiveview());
$this->template->display('liveview.tpl');
break;
case 'clientkick':
if( !empty($_POST['clid']) )
{
if( $this->server->r_clientkick($_POST['clid']) )
{
$response = array('OK', $_POST['clid']);
}
else
{
$error = $this->server->getError();
$response = array('ERROR', $error[2], $this->language['n_server_responded'].' '.$error[3]);
}
}
else
{
$response = array('ERROR', 2, 'missing arguments');
}
break;
case 'clientban':
if( isset($_POST['clid']) && isset($_POST['duration']) && isset($_POST['reason']) )
{
if( $this->server->r_banclient($_POST['clid'], $_POST['duration'], $_POST['reason']) )
{
$response = array('OK', $_POST['clid']);
}
else
{
$error = $this->server->getError();
$response = array('ERROR', $error[2], $this->language['n_server_responded'].' '.$error[3]);
}
}
else
{
$response = array('ERROR', 2, 'missing arguments');
}
break;
case 'clientmove':
if( !empty($_POST['clid']) && !empty($_POST['cid']) )
{
if( $this->server->r_clientmove($_POST['clid'], $_POST['cid']) )
{
$response = array('OK', $_POST['clid'], $_POST['cid']);
}
else
{
$error = $this->server->getError();
$response = array('ERROR', $error[2], $this->language['n_server_responded'].' '.$error[3]);
}
}
else
{
$response = array('ERROR', 2, 'missing arguments');
}
break;
case 'clientpoke':
if( !empty($_POST['clid']) && isset($_POST['msg']) )
{
if( $this->server->r_clientpoke($_POST['clid'], $_POST['msg']) )
{
$response = array('OK', $_POST['clid']);
}
else
{
$error = $this->server->getError();
$response = array('ERROR', $error[2], $this->language['n_server_responded'].' '.$error[3]);
}
}
else
{
$response = array('ERROR', 2, 'missing arguments');
}
break;
case 'clientmsg':
if( !empty($_POST['cid']) && !empty($_POST['mode']) && isset($_POST['msg']) )
{
if( $this->server->r_sendtextmessage($_POST['mode'], $_POST['cid'], $_POST['msg']) )
{
$response = array('OK', $_POST['cid'], $_POST['mode']);
}
else
{
$error = $this->server->getError();
$response = array('ERROR', $error[2], $this->language['n_server_responded'].' '.$error[3]);
}
}
else
{
$response = array('ERROR', 2, 'missing arguments');
}
break;
case 'deleteban':
if( !empty($_POST['banid']) )
{
if( $this->server->r_bandel($_POST['banid']) )
{
$response = array('OK', $_POST['banid']);
}
else
{
$error = $this->server->getError();
$response = array('ERROR', $error[2], $this->language['n_server_responded'].' '.$error[3]);
}
}
else
{
$response = array('ERROR', 2, 'missing arguments');
}
break;
case 'addban':
if( isset($_POST['ip']) && isset($_POST['name']) && isset($_POST['uid']) && isset($_POST['reason']) && isset($_POST['duration']) )
{
if( $this->server->r_banadd($_POST['ip'], $_POST['name'], $_POST['uid'], $_POST['duration'], $_POST['reason']) )
{
$response = array('OK');
}
else
{
$error = $this->server->getError();
$response = array('ERROR', $error[2], $this->language['n_server_responded'].' '.$error[3]);
}
}
else
{
$response = array('ERROR', 2, 'missing arguments');
}
break;
case 'banlistupdate':
$this->initSmarty();
if( is_array($this->language) )
$this->template->assign('lang', $this->language);
else
die('TS3webinterface ERROR: no language file available');
$this->template->assign('banList', $this->server->r_banlist());
$this->template->display('banlist.tpl');
break;
default:
$response = array('ERROR', 1, 'unknown action requested');
}
if( !empty($response) )
echo json_encode($response);
}
else
{
// normal
$this->initSmarty();
if( $this->session['lvserver'] == 0 )
{
$this->template->assign('title', $this->language['title'].' :: '.$this->language['login']);
$this->template->display('header.tpl');
$addData = array();
/*if( !isset($_GET['do']) ) $_GET['do'] = '';
switch($_GET['do'])
{
case 'addserver':*/
if( isset($_GET['do']) && $_GET['do'] == 'addserver' )
{
if( isset($_POST['serverAddSubmit']) && !empty($_POST['servername']) && !empty($_POST['serverslots']) )
{
if( $addData = $this->server->r_servercreate($_POST['servername'], array(array('virtualserver_maxclients', $_POST['serverslots']))) )
{
//$addData = $this->server->de_escape($addData[0]);
$addData = $addData[0];
array_unshift($addData, 'OK');
}
else
{
$error = $this->server->getError();
$addData = array('ERROR', $error[2], $this->language['n_server_responded'].$error[3]);
}
}
else
{
$addData = array('ERROR', 0, $this->language['e_fill_out']);
}
}
/*break;
}*/
$vServerList = $this->server->r_serverlist();
if( !isset($vServerList[0]) )
{
$tmp = array($vServerList);
$vServerList = $tmp;
}
$this->template->assign('IP', $this->serverIP);
$this->template->assign('selectvServer', $vServerList);
$this->template->assign('addData', $addData);
$updateAvailable = $this->checkForUpdate();
$this->template->assign('updateAvailable', $updateAvailable);
if( $updateAvailable != "" )
{
$this->template->display('updateAvailable.tpl');
}
$this->template->display('selectvServer.tpl');
$this->template->display('footer.tpl');
}
else
{
if( isset($_GET['liveview']) ) $this->template->assign('liveviewAutoUpdate', true);
else $this->template->assign('liveviewAutoUpdate', false);
$this->template->assign('title', $this->language['title']);
$this->template->display('header.tpl');
$updateAvailable = $this->checkForUpdate();
$this->template->assign('updateAvailable', $updateAvailable);
if( $updateAvailable != "" )
{
$this->template->display('updateAvailable.tpl');
}
$infoBoxData = $this->server->r_serverinfo();
$this->template->assign('data', $infoBoxData[0]);
if( isset($_GET['token']) )
{
$addToken = array();
if( isset($_GET['do']) && $_GET['do'] == 'addtoken' )
{
$tokenid1 = false;
$tokenid2 = false;
if( isset($_POST['tokentype']) )
{
switch((int)$_POST['tokentype'])
{
case 0:
if( !isset($_POST['tokenid1_0']) ) break;
$tokenid1 = $_POST['tokenid1_0'];
$tokenid2 = 0;
break;
case 1:
if( !isset($_POST['tokenid1_1']) || !isset($_POST['tokenid2_1']) ) break;
$tokenid1 = $_POST['tokenid1_1'];
$tokenid2 = $_POST['tokenid2_1'];
break;
}
}
if( $tokenid1 !== false )
{
if( $this->server->r_tokenadd($_POST['tokentype'], $tokenid1, $tokenid2) )
{
$addToken = array('OK');
}
else
{
$error = $this->server->getError();
$addToken = array('ERROR', $error[2], $this->language['n_server_responded'].$error[3]);
}
}
else
{
$addToken = array('ERROR', 0, $this->language['e_fill_out']);
}
}
$this->template->assign('addToken', $addToken);
$this->template->assign('tokenList', $this->server->r_tokenlist());
$serverGroupList = $this->server->r_servergrouplist();
$serverGroupListNames = array();
for($i=0; $itemplate->assign('serverGroupList', $serverGroupList);
$this->template->assign('serverGroupListNames', $serverGroupListNames);
$channelGroupList = $this->server->r_channelgrouplist();
$channelGroupListNames = array();
for($i=0; $itemplate->assign('channelGroupList', $channelGroupList);
$this->template->assign('channelGroupListNames', $channelGroupListNames);
$channelList = $this->server->r_channellist();
$channelListNames = array();
for($i=0; $itemplate->assign('channelList', $channelList);
$this->template->assign('channelListNames', $channelListNames);
$this->template->display('vServerToken.tpl');
}
else if( isset($_GET['liveview']) )
{
$insertResult = array();
if( isset($_FILES['backup']) )
{
$insertResult = array('ERROR', 0, $this->language['e_upload_failed']);
$filename = 'modules/TS3Admin/templates_c/channelbackup_'.rand(111,999).rand(111,999).'.txt';
if( $_FILES['backup']['error'] == 0 && move_uploaded_file($_FILES['backup']['tmp_name'], $filename) )
{
if( $this->insertChannelBackup(file_get_contents($filename)) )
{
$insertResult = array('OK');
}
unlink($filename);
}
}
$this->template->assign('insertResult', $insertResult);
$this->template->assign('serverTree', $this->getLiveview($infoBoxData[0])); // serverinfo param for no double query
$this->template->assign('banList', $this->server->r_banlist());
$this->template->display('vServerLiveview.tpl');
}
else
{
global $db;
$is_parent_user = FALSE;
$subusers_installed = $db->isModuleInstalled('subusers');
if( $subusers_installed )
{
$assigned_info = getAssignedServerUsers();
if( isset($_POST['assign_subuser']) and
in_array($_POST['user_id'],$assigned_info['subusers']) )
{
$db->query("INSERT INTO OGP_DB_PREFIXts3_homes
(`rserver_id`, `ip`, `pwd`, `vserver_id`, `user_id`)
VALUES ('".$_SESSION['rserver_id']."', '".
TS3WEBINTERFACE_IP."', '".
TS3WEBINTERFACE_PWD."', '".
TS3WEBINTERFACE_VSERVER_ID."', '".
$_POST['user_id'].
"');");
$assigned_info = getAssignedServerUsers();
}
if( isset($_POST['unassign_subuser']) and
is_array($assigned_info['subusers']) and
in_array($_POST['user_id'],$assigned_info['users_assigned']) and
in_array($_POST['user_id'],$assigned_info['subusers']) )
{
$db->query( "DELETE FROM OGP_DB_PREFIXts3_homes WHERE vserver_id='".
TS3WEBINTERFACE_VSERVER_ID."' AND user_id='".
$_POST['user_id']."' AND rserver_id='".
$_SESSION['rserver_id'].
"';" );
$assigned_info = getAssignedServerUsers();
}
$this->template->assign('subusers_assigned', $assigned_info['subusers_assigned_list']);
$this->template->assign('subusers', $assigned_info['subusers_list']);
$is_parent_user = is_array($assigned_info['subusers']);
}
$this->template->assign('is_parent_user', $is_parent_user);
$this->template->assign('subusers_installed', $subusers_installed);
$this->template->assign('IP', $this->serverIP);
$this->template->display('vServerOverview.tpl');
}
$this->template->display('footer.tpl');
}
}
}
private function getLiveview($server=false)
{
if( !$server )
{
$server = $this->server->r_serverinfo();
if( !$server )
{
$errArray = $this->server->getError();
echo strtoupper($this->language['error']).' #'.$errArray[2].': '.$this->language['n_server_responded'].' \''.$errArray[3].'\'';
return false;
}
$server = $server[0];
}
else
{
if( !empty($server[0]) )
$server = $server[0];
}
$channels = $this->server->r_channellist(true, true, true, true);
if( !$channels )
{
$errArray = $this->server->getError();
echo strtoupper($this->language['error']).' #'.$errArray[2].': '.$this->language['n_server_responded'].' \''.$errArray[3].'\'';
return false;
}
$clients = $this->server->r_clientlist(true, true, true, true, true);
if( !$clients )
{
$errArray = $this->server->getError();
echo strtoupper($this->language['error']).' #'.$errArray[2].': '.$this->language['n_server_responded'].' \''.$errArray[3].'\'';
return false;
}
function sortClients($a, $b)
{
if( strpos(',', $a['client_servergroups']) !== false )
{
$aID = explode(',', $a['client_servergroups'], 2);
$aID = $aID[0];
}
else
{
$aID = $a['client_servergroups'];
}
if( strpos(',', $b['client_servergroups']) !== false )
{
$bID = explode(',', $b['client_servergroups'], 2);
$bID = $bID[0];
}
else
{
$bID = $b['client_servergroups'];
}
if( $aID > $bID ) return 1;
if( $aID < $bID ) return -1;
if( $aID = $bID ) return 0;
}
usort($clients, "sortClients");
$pidStack = array(0);
$lastLevel = array();
$cidConnection = array();
$channelNum = count($channels);
for($i=0; $i<$channelNum; $i++)
{
$cidConnection[$channels[$i]['cid']] = $i;
$channels[$i]['is_last_channel'] = false;
/*if( $channels[$i]['pid'] != $pidStack[count($pidStack)-1] )
{
if( in_array($channels[$i]['pid'], $pidStack) )
{
do
{
array_pop($pidStack);
} while( in_array($channels[$i]['pid'], $pidStack) && count($pidStack) > 1 );
//$pidStack[] = $channels[$i]['pid'];
$channels[$i]['is_last_channel'] = true;
}
else
{
$pidStack[] = $channels[$i]['pid'];
}
}*/
//$channels[$i]['level'] = count($pidStack)-1;
if( $channels[$i]['pid'] == 0 ) $channels[$i]['level'] = 0;
else $channels[$i]['level'] = $channels[$cidConnection[$channels[$i]['pid']]]['level'] + 1;
$channels[$i]['is_server'] = false;
$channels[$i]['clients'] = array();
$lastLevel[$channels[$i]['level']] = $i;
}
/*$reversedCounter = count($channels)-1;
do
{
if( $channels[$reversedCounter]['pid'] == 0 )
{
$channels[$reversedCounter]['is_last_channel'] = true;
break;
}
$reversedCounter--;
} while( $reversedCounter >= 0 );*/
for($i=0; $i<$channelNum; $i++)
{
if( !isset($channels[$i-1]) && !isset($channels[$i+1]) )
{
$channels[$i]['mode'] = 'l';
//continue;
}
else if( isset($channels[$i-1]) && !isset($channels[$i+1]) )
{
$channels[$i]['mode'] = 'l';
//continue;
}
else if( !isset($channels[$i-1]) && isset($channels[$i+1]) )
{
$channels[$i]['mode'] = 't';
//continue;
}
else if( $channels[$i]['level'] == $channels[$i+1]['level'] )
{
$channels[$i]['mode'] = 't';
}
else if( $channels[$i]['level'] > $channels[$i+1]['level'] )
{
$channels[$i]['mode'] = 'l';
}
else
{
if( $lastLevel[$channels[$i]['level']] == $i )
{
$channels[$i]['mode'] = 'l';
}
else
{
$channels[$i]['mode'] = 't';
}
}
//$channels[$i]['TEST'] = $i;
if( $channels[$i]['pid'] != 0 )
{
$before = array();
//$subtractLevels = 0;
//$tmp = $channels[$cidConnection[$channels[$i]['pid']]];
//$tmpPID = $channels[$i]['pid'];
//echo $tmpPID.' ';
$tmp = $channels[$cidConnection[$channels[$i]['pid']]];
//echo $channels[$i]['pid'].'='.$cidConnection[$channels[$i]['pid']].' ';
//var_dump($channels[$cidConnection[$channels[$i]['pid']]]['is_last_channel']);
$tmpPID = $channels[$i]['pid'];
//if( $tmp['mode'] == 'l' ) $subtractLevels++;
if( $tmp['mode'] != 'l' )
array_unshift($before, 'line_i');
else
array_unshift($before, 'spacer');
//for($ii=$channels[$i]['level']; $ii>0; $ii--)
while(true)
{
$tmpPID = $tmp['pid'];
if( /*$tmpPID != 0 &&*/ isset($cidConnection[$tmpPID]) && isset($channels[$cidConnection[$tmpPID]]) )
$tmp = $channels[$cidConnection[$tmpPID]];
else
break;
//echo $tmpPID.' ';
if( $tmp['mode'] != 'l' )
array_unshift($before, 'line_i');
else
array_unshift($before, 'spacer');
//if( $tmp['mode'] != 'l' ) break;
//$subtractLevels++;
}
$channels[$i]['draw_before'] = $before;
//print_r($before);
//$channels[$i]['num_i_lines'] = $channels[$i]['level'] - $subtractLevels;
//$channels[$i]['num_spacers'] = $subtractLevels;
}
}
$clientNum = count($clients);
for($i=0; $i<$clientNum; $i++)
{
if( $clients[$i]['client_input_hardware'] == '0' ) $clients[$i]['status_img'] = '16x16_hardware_input_muted';
else if( $clients[$i]['client_output_muted'] == '1' ) $clients[$i]['status_img'] = '16x16_output_muted';
else if( $clients[$i]['client_input_muted'] == '1' ) $clients[$i]['status_img'] = '16x16_input_muted';
else if( $clients[$i]['client_flag_talking'] == '1') $clients[$i]['status_img'] = '16x16_player_on';
else $clients[$i]['status_img'] = '16x16_player_off';
$channels[$cidConnection[$clients[$i]['cid']]]['clients'][] = $clients[$i];
$channels[$cidConnection[$clients[$i]['cid']]]['clients'][(count($channels[$cidConnection[$clients[$i]['cid']]]['clients']))-1]['level'] = $channels[$cidConnection[$clients[$i]['cid']]]['level'] + 1;
$clients[$i]['level'] = $channels[$cidConnection[$clients[$i]['cid']]]['level'] + 1;
}
array_unshift($channels, array(
'channel_name' => $server['virtualserver_name'],
'cid' => $server['virtualserver_id'],
'is_server' => true
));
return $channels;
}
private function getChannelBackupString()
{
$this->server->setDeEscapeResults(false);
$result = $this->server->r_channellist(true, true, true, true);
if( !$result )
{
$errArray = $ts->getError();
echo 'ERROR #'.$errArray[2].': the server returned: \''.$errArray[3].'\'';
return false;
}
$channels = array();
$cidConnection = array();
$channelNum = count($result);
for($i=0; $i<$channelNum; $i++ )
{
$cidConnection[$result[$i]['cid']] = $i;
$tmp = $this->server->r_channelinfo($result[$i]['cid']);
if( !$tmp )
{
echo "channelinfo failed\n";
return false;
}
else
{
$result[$i] = array_merge($result[$i], $tmp[0]);
}
if( $result[$i]['pid'] != 0 )
{
$result[$i]['pid'] = $cidConnection[$result[$i]['pid']];
}
if( $result[$i]['channel_order'] != 0 )
{
$result[$i]['channel_order'] = $cidConnection[$result[$i]['channel_order']];
}
unset($result[$i]['cid']);
unset($result[$i]['total_clients']);
unset($result[$i]['channel_filepath']);
}
$this->server->setDeEscapeResults(true);
return json_encode($result);
}
private function insertChannelBackup($backup)
{
if( !$backup = json_decode($backup, true) )
{
echo "json parse error\n";
return false;
}
$cidConnection = array();
$backupNum = count($backup);
for($i=0; $i<$backupNum; $i++)
{
$tmpCreate = array();
$channelPropNum = count($backup[$i]);
foreach($backup[$i] as $key => $value)
{
if( $key == 'pid' || $key == 'channel_order' || $key == 'channel_name' ) continue;
$tmpCreate[] = array($key, $value);
}
$tmp = $this->server->r_channelcreate($backup[$i]['channel_name'], $tmpCreate, '', false);
if( !$tmp )
{
echo "channelcreate error\n";
return false;
}
else
{
if( $backup[$i]['pid'] != 0 )
{
if( $backup[$i]['channel_order'] == 0 ) $channelOrder = 0;
else $channelOrder = $cidConnection[$backup[$i]['channel_order']];
if( !$this->server->r_channelmove($backup[$i]['cid'], $cidConnection[$backup[$i]['pid']], $channelOrder) )
{
echo "channelmove error, ".$backup[$i]['cid']." under ".$cidConnection[$backup[$i]['pid']]."\n";
return false;
}
}
}
}
return true;
}
private function resolveErrorID($id)
{
switch($id)
{
case 2568:
return $this->language['e_2568'];
break;
default:
return '';
}
}
public function parseTime($timeSeconds)
{
$timeSeconds = round($timeSeconds);
$days = floor($timeSeconds / 86400);
$daysForm = ( $days === 1 ) ? $this->language['time_day'] : $this->language['time_days'];
$hours = floor(($timeSeconds % 86400) / 3600);
$hoursForm = ( $days === 1 ) ? $this->language['time_hour'] : $this->language['time_hours'];
$minutes = floor(($timeSeconds % 3600) / 60);
$minutesForm = ( $days === 1 ) ? $this->language['time_minute'] : $this->language['time_minutes'];
$seconds = $timeSeconds % 60;
$secondsForm = ( $days === 1 ) ? $this->language['time_second'] : $this->language['time_seconds'];
return "$days $daysForm, $hours $hoursForm, $minutes $minutesForm, $seconds $secondsForm";
}
public function parseDate($timeSeconds, $add=0, $format='r')
{
if( $add != 0 ) $timeSeconds += $add;
return date($format, $timeSeconds);
}
public function convertByteToMB($num, $prec=2)
{
return round($num/1024/1024, $prec);
}
public function convertByteToKB($num, $prec=2)
{
return round($num/1024, $prec);
}
private function checkForUpdate()
{
return '';
}
}
?>