made changes
This commit is contained in:
172
install.php
Normal file
172
install.php
Normal file
@@ -0,0 +1,172 @@
|
||||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<title>TS-N.NET Ranksystem - Installation</title>
|
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
|
||||
<link rel="stylesheet" type="text/css" href="other/style.css.php" />
|
||||
</head>
|
||||
<body>
|
||||
<?php
|
||||
if(isset($_GET['lang']))
|
||||
{
|
||||
$language=$_GET['lang'];
|
||||
}
|
||||
|
||||
require_once('other/dbconfig.php');
|
||||
require_once('lang.php');
|
||||
|
||||
echo $test;
|
||||
if(isset($_POST['confweb']))
|
||||
{
|
||||
require_once('other/dbconfig.php');
|
||||
$user=$_POST['user'];
|
||||
$pass=$_POST['pass'];
|
||||
$mysqlcon=mysqli_connect($db['host'], $db['user'], $db['pass'], $db['dbname']);
|
||||
if(!$mysqlcon->query("INSERT INTO config (webuser,webpass,tshost,tsquery,tsvoice,tsuser,tspass,language,queryname,queryname2,grouptime,resetbydbchange,msgtouser,upcheck,uniqueid,updateinfotime,currvers,exceptuuid,exceptgroup,dateformat,showexgrp,showexcld,showcolcld,showcoluuid,showcoldbid,showcolot,showcolit,showcolat,showcolnx,showcolsg,bgcolor,hdcolor,txcolor,hvcolor,ifcolor,wncolor,sccolor,showgen) VALUES ('$user','$pass','localhost','10011','9987','serveradmin','querypass','en','http://ts-n.net/ranksystem.php','http://www.ts-n.net/ranksystem.php','31536000=>47,31536060=>50','1','1','1','xrTKhT/HDl4ea0WoFDQH2zOpmKg=,9odBYAU7z2E2feUz965sL0/MyBom=','7200','0.10-beta','xrTKhT/HDl4ea0WoFDQH2zOpmKg=','2,6','%a days, %h hours, %i mins, %s secs','1','1','1','1','1','1','1','1','1','1','#101010','#909090','#707070','#FFFFFF','#3366CC','#CC0000','#008000','1')"))
|
||||
{
|
||||
echo $lang['error'].'<wncolor>'.$mysqlcon->error.'.</wncolor>';
|
||||
}
|
||||
else
|
||||
{
|
||||
echo'<sccolor>'.$lang['isntwiusr'].'</sccolor><br><br>';
|
||||
echo'<wncolor>'.sprintf($lang['isntwidel'],"<a href=\"webinterface.php\">webinterface.php</a>").'</wncolor>';
|
||||
}
|
||||
}
|
||||
elseif($db['host']!='hostname')
|
||||
{
|
||||
echo'<wncolor>'.sprintf($lang['isntwidel'],"<a href=\"webinterface.php\">webinterface.php</a>").'</wncolor>';
|
||||
}
|
||||
else
|
||||
{
|
||||
if(isset($_POST['installdb']))
|
||||
{
|
||||
$host=$_POST['host'];
|
||||
$user=$_POST['user'];
|
||||
$pass=$_POST['pass'];
|
||||
$dbname=$_POST['dbname'];
|
||||
$mysqlcon=mysqli_connect($host, $user, $pass);
|
||||
|
||||
if(empty($host) or empty($user) or empty($pass) or empty($dbname) or mysqli_connect_errno())
|
||||
{
|
||||
echo '<form name="form" method="post">
|
||||
<table class="tabledefault">
|
||||
<tr><td class="center" colspan="2"><b><h1>'.$lang['instdb'].'</h1></b></td></tr>
|
||||
<tr><td> </td><td> </td></tr>
|
||||
<tr><td class="red" colspan="2">'.$lang['isntwidberr'].'</td></tr>';
|
||||
if(mysqli_connect_errno())
|
||||
{ echo '<tr><td> </td><td> </td></tr><tr><td class="red" colspan="2">'.$lang['isntwidbmsg'].mysqli_connect_error().'</td></tr><tr><td> </td><td> </td></tr>'; }
|
||||
if(empty($host))
|
||||
{ echo '<tr><td class="tdred">'.$lang['isntwidbhost'].'</td><td class="tdleft"><input type="text" name="host" value="',$host,'" style="width:35%"></td></tr>'; } else
|
||||
{ echo '<tr><td class="tdright">'.$lang['isntwidbhost'].'</td><td class="tdleft"><input type="text" name="host" value="',$host,'" style="width:35%"></td></tr>'; }
|
||||
if(empty($user))
|
||||
{ echo '<tr><td class="tdred">'.$lang['isntwidbusr'].'</td><td class="tdleft"><input type="text" name="user" value="',$user,'" style="width:35%;"></td></tr>'; } else
|
||||
{ echo '<tr><td class="tdright">'.$lang['isntwidbusr'].'</td><td class="tdleft"><input type="text" name="user" value="',$user,'" style="width:35%;"></td></tr>'; }
|
||||
if(empty($pass))
|
||||
{ echo '<tr><td class="tdred">'.$lang['isntwidbpass'].'</td><td class="tdleft"><input type="text" name="pass" value="',$pass,'" style="width:35%;"></td></tr>'; } else
|
||||
{ echo '<tr><td class="tdright">'.$lang['isntwidbpass'].'</td><td class="tdleft"><input type="text" name="pass" value="',$pass,'" style="width:35%;"></td></tr>'; }
|
||||
if(empty($dbname))
|
||||
{ echo '<tr><td class="tdred">'.$lang['isntwidbname'].'</td><td class="tdleft"><input type="text" name="dbname" value="',$dbname,'" style="width:35%"></td></tr>'; } else
|
||||
{ echo '<tr><td class="tdright">'.$lang['isntwidbname'].'</td><td class="tdleft"><input type="text" name="dbname" value="',$dbname,'" style="width:35%"></td></tr>'; }
|
||||
echo '<tr><td> </td><td class="tdleft"><br><input type="submit" name="installdb" class="button" value="'.$lang['instdbsubm'].'" style="width:150px"></td></tr>
|
||||
</table></form>';
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
$newconfig='<?php
|
||||
$db[\'host\']="'.$host.'";
|
||||
$db[\'user\']="'.$user.'";
|
||||
$db[\'pass\']="'.$pass.'";
|
||||
$db[\'dbname\']="'.$dbname.'";
|
||||
?>';
|
||||
$handle=fopen('./other/dbconfig.php','w');
|
||||
if(!fwrite($handle,$newconfig))
|
||||
{
|
||||
echo $lang['isntwicfg'];
|
||||
}
|
||||
else
|
||||
{
|
||||
echo '<br><br>'.$lang['instdb'].'<br>';
|
||||
$mysqlcon->query("DROP DATABASE $dbname");
|
||||
if(!$mysqlcon->query("CREATE DATABASE $dbname"))
|
||||
{
|
||||
echo $lang['instdberr'].'<wncolor>'.$mysqlcon->error.'</wncolor>';
|
||||
}
|
||||
else
|
||||
{
|
||||
echo'<sccolor>'.sprintf($lang['instdbsuc'],$dbname).'</sccolor>';
|
||||
$count++;
|
||||
}
|
||||
echo '<br><br>'.$lang['insttb'].'<br>';
|
||||
if(!$mysqlcon->query("CREATE TABLE $dbname.user (uuid text CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,cldbid int(10) NOT NULL,count int(11) NOT NULL,ip int(10) NOT NULL,name text CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,lastseen int(10) NOT NULL,grpid int(10) NOT NULL,nextup int(11) NOT NULL,idle int(11) NOT NULL,cldgroup text CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,online int(1) NOT NULL)"))
|
||||
{
|
||||
echo $lang['insttberr'].'<wncolor>'.$mysqlcon->error.'.</wncolor><br>';
|
||||
}
|
||||
else
|
||||
{
|
||||
echo '<sccolor>'.sprintf($lang['insttbsuc'],'user').'</sccolor><br>';
|
||||
$count++;
|
||||
}
|
||||
if(!$mysqlcon->query("CREATE TABLE $dbname.upcheck (timestamp int(10) NOT NULL)"))
|
||||
{
|
||||
echo $lang['insttberr'].'<wncolor>'.$mysqlcon->error.'.</wncolor>';
|
||||
$mysqlcon->query("INSERT INTO $dbname.upcheck (timestamp) VALUES ('1')");
|
||||
}
|
||||
else
|
||||
{
|
||||
echo '<sccolor>'.sprintf($lang['insttbsuc'],'upcheck').'</sccolor><br>';
|
||||
$count++;
|
||||
}
|
||||
if(!$mysqlcon->query("CREATE TABLE $dbname.groups (sgid int(10) NOT NULL,sgidname text CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL)"))
|
||||
{
|
||||
echo $lang['insttberr'].'<span class="red">'.$mysqlcon->error.'.</span><br>';
|
||||
}
|
||||
else
|
||||
{
|
||||
echo '<sccolor>'.sprintf($lang['insttbsuc'],'groups').'</sccolor><br>';
|
||||
$count++;
|
||||
}
|
||||
if(!$mysqlcon->query("CREATE TABLE $dbname.config (webuser text CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,webpass text CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,tshost text CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,tsquery int(5) NOT NULL,tsvoice int(5) NOT NULL,tsuser text CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,tspass text CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,language text CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,queryname text CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,queryname2 text CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,grouptime text CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,resetbydbchange int(1) NOT NULL,msgtouser int(1) NOT NULL,upcheck int(1) NOT NULL,uniqueid text CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,updateinfotime int(11) NOT NULL,currvers text CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,substridle int(1) NOT NULL,exceptuuid text CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,exceptgroup text CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,dateformat text CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,showexgrp int(1) NOT NULL,showexcld int(1) NOT NULL,showcolcld int(1) NOT NULL,showcoluuid int(1) NOT NULL,showcoldbid int(1) NOT NULL,showcolot int(1) NOT NULL,showcolit int(1) NOT NULL,showcolat int(1) NOT NULL,showcolnx int(1) NOT NULL,showcolsg int(1) NOT NULL,bgcolor text CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,hdcolor text CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,txcolor text CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,hvcolor text CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,ifcolor text CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,wncolor text CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,sccolor text CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,showgen int(1) NOT NULL)"))
|
||||
{
|
||||
echo $lang['insttberr'].'<wncolor>'.$mysqlcon->error.'.</wncolor>';
|
||||
}
|
||||
else
|
||||
{
|
||||
echo '<sccolor>'.sprintf($lang['insttbsuc'],'config').'</sccolor><br>';
|
||||
$count++;
|
||||
}
|
||||
if($count>1)
|
||||
{
|
||||
echo '<form name="form" method="post">
|
||||
<table class="tabledefault">
|
||||
<tr><td class="center" colspan="2"><b><h1>'.$lang['isntwiusrh'].'</h1></b></td></tr>
|
||||
<tr><td> </td><td> </td></tr>
|
||||
<tr><td class="center" colspan="2">'.$lang['isntwiusrdesc'].'</td></tr>
|
||||
<tr><td class="tdright">'.$lang['user'].'</td><td class="tdleft"><input type="text" name="user" value="" style="width:35%"></td></tr>
|
||||
<tr><td class="tdright">'.$lang['pass'].'</td><td class="tdleft"><input type="text" name="pass" value="" style="width:35%;"></td></tr>
|
||||
<tr><td> </td><td class="tdleft"><br><input type="submit" name="confweb" class="button" value="'.$lang['isntwiusrcr'].'" style="width:150px"></td></tr>
|
||||
</table></form>';
|
||||
}
|
||||
}
|
||||
fclose($handle);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
echo '<form name="form" method="post">
|
||||
<table class="tabledefault">
|
||||
<tr><td class="right" colspan="2">Language: <select name="lang" onchange="location.href=this.form.lang.options[this.form.lang.selectedIndex].value"><option></option><option value="install.php?lang=en">english</option><option value="install.php?lang=de">deutsch</option><option value="install.php?lang=ru">русский</option></select></td></tr>
|
||||
<tr><td class="center" colspan="2"><b><h1>'.$lang['insttb'].'</h1></b></td></tr>
|
||||
<tr><td> </td><td> </td></tr>
|
||||
<tr><td class="center" colspan="2">'.$lang['isntwidb'].'</td></tr>
|
||||
<tr><td class="tdright">'.$lang['isntwidbhost'].'</td><td class="tdleft"><input type="text" name="host" value="" style="width:35%"></td></tr>
|
||||
<tr><td class="tdright">'.$lang['isntwidbusr'].'</td><td class="tdleft"><input type="text" name="user" value="" style="width:35%;"></td></tr>
|
||||
<tr><td class="tdright">'.$lang['isntwidbpass'].'</td><td class="tdleft"><input type="text" name="pass" value="" style="width:35%;"></td></tr>
|
||||
<tr><td class="tdright">'.$lang['isntwidbname'].'</td><td class="tdleft"><input type="text" name="dbname" value="" style="width:35%"></td></tr>
|
||||
<tr><td> </td><td class="tdleft"><br><input type="submit" name="installdb" class="button" value="'.$lang['instdbsubm'].'" style="width:150px"></td></tr>
|
||||
</table></form>';
|
||||
}
|
||||
}
|
||||
?>
|
||||
</body>
|
||||
</html>
|
||||
52
jquerylib/README.md
Normal file
52
jquerylib/README.md
Normal file
@@ -0,0 +1,52 @@
|
||||
#jQuery Autocomplete Plugin 1.2.3#
|
||||
|
||||
##About this jQuery plugin##
|
||||
Jörn Zaefferer’s (now deprecated into jQuery UI) [jQuery Autocomplete Plugin](http://bassistance.de/jquery-plugins/jquery-plugin-autocomplete/), with a small modification to enable UP/DOWN arrow keys, allowing navigation of input element text. This is particularly useful in cases where autocomplete is used in a textarea element where navigation of text via UP/DOWN arrow keys may be necessary. The tiny fix is documented with comments in the relevant lines on the development file (jquery.autocomplete.js). The .min and .pack files have the fix without specific annotation within the code.
|
||||
|
||||
We use it in Claritty.com for when a user wants to write a twitter username or a previously used hashtag within a new tweet, so “@” and “#” are trigger the script. While not triggered, though, the plugin still hijacks the UP/DOWN arrow keys making navigation of the text a pain in the ass when the user has multiple lines. This modification prevents this behavior, hijacking the arrow keys only when the autocomplete script has been triggered.
|
||||
|
||||
The original plugin is now deprecated, but this mod works well with jQuery 1.3.2 thru 1.4.4.
|
||||
|
||||
##Documentation##
|
||||
Introduction to the original plugin, and an explanation of original plugin options are included in the docs folder. (Documentation at the jQuery site is expected to shut down eventually.)
|
||||
|
||||
This modification shouldn’t break any of the options discussed at the these documentation files.
|
||||
|
||||
##Abridged Changelog##
|
||||
####1.2.3 --AGA####
|
||||
* Merged disc’s fork: Removed depricated $.browser (jquery 1.9+)
|
||||
|
||||
* Merged miketaylr’s fork: account for retooled key events handling in newer Opera
|
||||
|
||||
* Correct typo introduced in one of the previous merges
|
||||
|
||||
* New minified and packed versions
|
||||
|
||||
####1.2.2 --AGA####
|
||||
* Merged agmcleaod’s fork: Added failure to the options hash: `failure`
|
||||
|
||||
* Merged borkor’s fork: New option not to jump to first or last position: `scrollJumpPosition`
|
||||
|
||||
* Deleted silly console.debug() line left over from testing.
|
||||
|
||||
####1.2.1 --AGA####
|
||||
* Added option to activate select list with one click instead of two. `clickFire` is false by default. (Requested/recommendation by fgosfacdjtq.)
|
||||
|
||||
* Added option to forgo input focus on item select. `inputFocus` is set to true by default, but setting it to false in the options will cancel this behavior.
|
||||
|
||||
* Circumvent browser JS bug when user clicked on results list scrollbar and then clicked outside of the list that caused the list to not hide.
|
||||
|
||||
* Changed hijacking of PAGEUP/PAGEDOWN keys to prevent default behavior only when selections list is visible. Helps text navigation inside input element.
|
||||
|
||||
####1.2 --AGA####
|
||||
* Use recursive merging when extending setOptions. (Request/recommendation by smarques.)
|
||||
|
||||
####1.1.1 --AGA####
|
||||
* Changed hijacking of UP/DOWN arrow keys to prevent default behavior only when selections list is visible. Helps text navigation inside input element.
|
||||
|
||||
_See_ changelog.txt _for pre-1.1.1 entries by original author._
|
||||
|
||||
##Licensing##
|
||||
As with the original Plugin, this modification is dual licensed under the MIT and GPL licenses:
|
||||
http://www.opensource.org/licenses/mit-license.php
|
||||
http://www.gnu.org/licenses/gpl.html
|
||||
116
jquerylib/jquery.ajaxQueue.js
Normal file
116
jquerylib/jquery.ajaxQueue.js
Normal file
@@ -0,0 +1,116 @@
|
||||
/**
|
||||
* Ajax Queue Plugin
|
||||
*
|
||||
* Homepage: http://jquery.com/plugins/project/ajaxqueue
|
||||
* Documentation: http://docs.jquery.com/AjaxQueue
|
||||
*/
|
||||
|
||||
/**
|
||||
|
||||
<script>
|
||||
$(function(){
|
||||
jQuery.ajaxQueue({
|
||||
url: "test.php",
|
||||
success: function(html){ jQuery("ul").append(html); }
|
||||
});
|
||||
jQuery.ajaxQueue({
|
||||
url: "test.php",
|
||||
success: function(html){ jQuery("ul").append(html); }
|
||||
});
|
||||
jQuery.ajaxSync({
|
||||
url: "test.php",
|
||||
success: function(html){ jQuery("ul").append("<b>"+html+"</b>"); }
|
||||
});
|
||||
jQuery.ajaxSync({
|
||||
url: "test.php",
|
||||
success: function(html){ jQuery("ul").append("<b>"+html+"</b>"); }
|
||||
});
|
||||
});
|
||||
</script>
|
||||
<ul style="position: absolute; top: 5px; right: 5px;"></ul>
|
||||
|
||||
*/
|
||||
/*
|
||||
* Queued Ajax requests.
|
||||
* A new Ajax request won't be started until the previous queued
|
||||
* request has finished.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Synced Ajax requests.
|
||||
* The Ajax request will happen as soon as you call this method, but
|
||||
* the callbacks (success/error/complete) won't fire until all previous
|
||||
* synced requests have been completed.
|
||||
*/
|
||||
|
||||
|
||||
(function($) {
|
||||
|
||||
var ajax = $.ajax;
|
||||
|
||||
var pendingRequests = {};
|
||||
|
||||
var synced = [];
|
||||
var syncedData = [];
|
||||
|
||||
$.ajax = function(settings) {
|
||||
// create settings for compatibility with ajaxSetup
|
||||
settings = jQuery.extend(settings, jQuery.extend({}, jQuery.ajaxSettings, settings));
|
||||
|
||||
var port = settings.port;
|
||||
|
||||
switch(settings.mode) {
|
||||
case "abort":
|
||||
if ( pendingRequests[port] ) {
|
||||
pendingRequests[port].abort();
|
||||
}
|
||||
return pendingRequests[port] = ajax.apply(this, arguments);
|
||||
case "queue":
|
||||
var _old = settings.complete;
|
||||
settings.complete = function(){
|
||||
if ( _old )
|
||||
_old.apply( this, arguments );
|
||||
jQuery([ajax]).dequeue("ajax" + port );;
|
||||
};
|
||||
|
||||
jQuery([ ajax ]).queue("ajax" + port, function(){
|
||||
ajax( settings );
|
||||
});
|
||||
return;
|
||||
case "sync":
|
||||
var pos = synced.length;
|
||||
|
||||
synced[ pos ] = {
|
||||
error: settings.error,
|
||||
success: settings.success,
|
||||
complete: settings.complete,
|
||||
done: false
|
||||
};
|
||||
|
||||
syncedData[ pos ] = {
|
||||
error: [],
|
||||
success: [],
|
||||
complete: []
|
||||
};
|
||||
|
||||
settings.error = function(){ syncedData[ pos ].error = arguments; };
|
||||
settings.success = function(){ syncedData[ pos ].success = arguments; };
|
||||
settings.complete = function(){
|
||||
syncedData[ pos ].complete = arguments;
|
||||
synced[ pos ].done = true;
|
||||
|
||||
if ( pos == 0 || !synced[ pos-1 ] )
|
||||
for ( var i = pos; i < synced.length && synced[i].done; i++ ) {
|
||||
if ( synced[i].error ) synced[i].error.apply( jQuery, syncedData[i].error );
|
||||
if ( synced[i].success ) synced[i].success.apply( jQuery, syncedData[i].success );
|
||||
if ( synced[i].complete ) synced[i].complete.apply( jQuery, syncedData[i].complete );
|
||||
|
||||
synced[i] = null;
|
||||
syncedData[i] = null;
|
||||
}
|
||||
};
|
||||
}
|
||||
return ajax.apply(this, arguments);
|
||||
};
|
||||
|
||||
})(jQuery);
|
||||
48
jquerylib/jquery.autocomplete.css
Normal file
48
jquerylib/jquery.autocomplete.css
Normal file
@@ -0,0 +1,48 @@
|
||||
.ac_results {
|
||||
padding: 0px;
|
||||
border: 1px solid black;
|
||||
background-color: white;
|
||||
overflow: hidden;
|
||||
z-index: 99999;
|
||||
}
|
||||
|
||||
.ac_results ul {
|
||||
width: 100%;
|
||||
list-style-position: outside;
|
||||
list-style: none;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.ac_results li {
|
||||
margin: 0px;
|
||||
padding: 2px 5px;
|
||||
cursor: default;
|
||||
display: block;
|
||||
/*
|
||||
if width will be 100% horizontal scrollbar will apear
|
||||
when scroll mode will be used
|
||||
*/
|
||||
/*width: 100%;*/
|
||||
font: menu;
|
||||
font-size: 12px;
|
||||
/*
|
||||
it is very important, if line-height not setted or setted
|
||||
in relative units scroll will be broken in firefox
|
||||
*/
|
||||
line-height: 16px;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.ac_loading {
|
||||
background: white url('indicator.gif') right center no-repeat;
|
||||
}
|
||||
|
||||
.ac_odd {
|
||||
background-color: #eee;
|
||||
}
|
||||
|
||||
.ac_over {
|
||||
background-color: #0A246A;
|
||||
color: white;
|
||||
}
|
||||
808
jquerylib/jquery.autocomplete.js
Normal file
808
jquerylib/jquery.autocomplete.js
Normal file
@@ -0,0 +1,808 @@
|
||||
/*
|
||||
* jQuery Autocomplete plugin 1.1
|
||||
*
|
||||
* Copyright (c) 2009 Jörn Zaefferer
|
||||
*
|
||||
* Dual licensed under the MIT and GPL licenses:
|
||||
* http://www.opensource.org/licenses/mit-license.php
|
||||
* http://www.gnu.org/licenses/gpl.html
|
||||
*
|
||||
* Revision: $Id: jquery.autocomplete.js 15 2009-08-22 10:30:27Z joern.zaefferer $
|
||||
*/
|
||||
|
||||
;(function($) {
|
||||
|
||||
$.fn.extend({
|
||||
autocomplete: function(urlOrData, options) {
|
||||
var isUrl = typeof urlOrData == "string";
|
||||
options = $.extend({}, $.Autocompleter.defaults, {
|
||||
url: isUrl ? urlOrData : null,
|
||||
data: isUrl ? null : urlOrData,
|
||||
delay: isUrl ? $.Autocompleter.defaults.delay : 10,
|
||||
max: options && !options.scroll ? 10 : 150
|
||||
}, options);
|
||||
|
||||
// if highlight is set to false, replace it with a do-nothing function
|
||||
options.highlight = options.highlight || function(value) { return value; };
|
||||
|
||||
// if the formatMatch option is not specified, then use formatItem for backwards compatibility
|
||||
options.formatMatch = options.formatMatch || options.formatItem;
|
||||
|
||||
return this.each(function() {
|
||||
new $.Autocompleter(this, options);
|
||||
});
|
||||
},
|
||||
result: function(handler) {
|
||||
return this.bind("result", handler);
|
||||
},
|
||||
search: function(handler) {
|
||||
return this.trigger("search", [handler]);
|
||||
},
|
||||
flushCache: function() {
|
||||
return this.trigger("flushCache");
|
||||
},
|
||||
setOptions: function(options){
|
||||
return this.trigger("setOptions", [options]);
|
||||
},
|
||||
unautocomplete: function() {
|
||||
return this.trigger("unautocomplete");
|
||||
}
|
||||
});
|
||||
|
||||
$.Autocompleter = function(input, options) {
|
||||
|
||||
var KEY = {
|
||||
UP: 38,
|
||||
DOWN: 40,
|
||||
DEL: 46,
|
||||
TAB: 9,
|
||||
RETURN: 13,
|
||||
ESC: 27,
|
||||
COMMA: 188,
|
||||
PAGEUP: 33,
|
||||
PAGEDOWN: 34,
|
||||
BACKSPACE: 8
|
||||
};
|
||||
|
||||
// Create $ object for input element
|
||||
var $input = $(input).attr("autocomplete", "off").addClass(options.inputClass);
|
||||
|
||||
var timeout;
|
||||
var previousValue = "";
|
||||
var cache = $.Autocompleter.Cache(options);
|
||||
var hasFocus = 0;
|
||||
var lastKeyPressCode;
|
||||
var config = {
|
||||
mouseDownOnSelect: false
|
||||
};
|
||||
var select = $.Autocompleter.Select(options, input, selectCurrent, config);
|
||||
|
||||
var blockSubmit;
|
||||
|
||||
// prevent form submit in opera when selecting with return key
|
||||
$.browser.opera && $(input.form).bind("submit.autocomplete", function() {
|
||||
if (blockSubmit) {
|
||||
blockSubmit = false;
|
||||
return false;
|
||||
}
|
||||
});
|
||||
|
||||
// only opera doesn't trigger keydown multiple times while pressed, others don't work with keypress at all
|
||||
$input.bind(($.browser.opera ? "keypress" : "keydown") + ".autocomplete", function(event) {
|
||||
// a keypress means the input has focus
|
||||
// avoids issue where input had focus before the autocomplete was applied
|
||||
hasFocus = 1;
|
||||
// track last key pressed
|
||||
lastKeyPressCode = event.keyCode;
|
||||
switch(event.keyCode) {
|
||||
|
||||
case KEY.UP:
|
||||
event.preventDefault();
|
||||
if ( select.visible() ) {
|
||||
select.prev();
|
||||
} else {
|
||||
onChange(0, true);
|
||||
}
|
||||
break;
|
||||
|
||||
case KEY.DOWN:
|
||||
event.preventDefault();
|
||||
if ( select.visible() ) {
|
||||
select.next();
|
||||
} else {
|
||||
onChange(0, true);
|
||||
}
|
||||
break;
|
||||
|
||||
case KEY.PAGEUP:
|
||||
event.preventDefault();
|
||||
if ( select.visible() ) {
|
||||
select.pageUp();
|
||||
} else {
|
||||
onChange(0, true);
|
||||
}
|
||||
break;
|
||||
|
||||
case KEY.PAGEDOWN:
|
||||
event.preventDefault();
|
||||
if ( select.visible() ) {
|
||||
select.pageDown();
|
||||
} else {
|
||||
onChange(0, true);
|
||||
}
|
||||
break;
|
||||
|
||||
// matches also semicolon
|
||||
case options.multiple && $.trim(options.multipleSeparator) == "," && KEY.COMMA:
|
||||
case KEY.TAB:
|
||||
case KEY.RETURN:
|
||||
if( selectCurrent() ) {
|
||||
// stop default to prevent a form submit, Opera needs special handling
|
||||
event.preventDefault();
|
||||
blockSubmit = true;
|
||||
return false;
|
||||
}
|
||||
break;
|
||||
|
||||
case KEY.ESC:
|
||||
select.hide();
|
||||
break;
|
||||
|
||||
default:
|
||||
clearTimeout(timeout);
|
||||
timeout = setTimeout(onChange, options.delay);
|
||||
break;
|
||||
}
|
||||
}).focus(function(){
|
||||
// track whether the field has focus, we shouldn't process any
|
||||
// results if the field no longer has focus
|
||||
hasFocus++;
|
||||
}).blur(function() {
|
||||
hasFocus = 0;
|
||||
if (!config.mouseDownOnSelect) {
|
||||
hideResults();
|
||||
}
|
||||
}).click(function() {
|
||||
// show select when clicking in a focused field
|
||||
if ( hasFocus++ > 1 && !select.visible() ) {
|
||||
onChange(0, true);
|
||||
}
|
||||
}).bind("search", function() {
|
||||
// TODO why not just specifying both arguments?
|
||||
var fn = (arguments.length > 1) ? arguments[1] : null;
|
||||
function findValueCallback(q, data) {
|
||||
var result;
|
||||
if( data && data.length ) {
|
||||
for (var i=0; i < data.length; i++) {
|
||||
if( data[i].result.toLowerCase() == q.toLowerCase() ) {
|
||||
result = data[i];
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if( typeof fn == "function" ) fn(result);
|
||||
else $input.trigger("result", result && [result.data, result.value]);
|
||||
}
|
||||
$.each(trimWords($input.val()), function(i, value) {
|
||||
request(value, findValueCallback, findValueCallback);
|
||||
});
|
||||
}).bind("flushCache", function() {
|
||||
cache.flush();
|
||||
}).bind("setOptions", function() {
|
||||
$.extend(options, arguments[1]);
|
||||
// if we've updated the data, repopulate
|
||||
if ( "data" in arguments[1] )
|
||||
cache.populate();
|
||||
}).bind("unautocomplete", function() {
|
||||
select.unbind();
|
||||
$input.unbind();
|
||||
$(input.form).unbind(".autocomplete");
|
||||
});
|
||||
|
||||
|
||||
function selectCurrent() {
|
||||
var selected = select.selected();
|
||||
if( !selected )
|
||||
return false;
|
||||
|
||||
var v = selected.result;
|
||||
previousValue = v;
|
||||
|
||||
if ( options.multiple ) {
|
||||
var words = trimWords($input.val());
|
||||
if ( words.length > 1 ) {
|
||||
var seperator = options.multipleSeparator.length;
|
||||
var cursorAt = $(input).selection().start;
|
||||
var wordAt, progress = 0;
|
||||
$.each(words, function(i, word) {
|
||||
progress += word.length;
|
||||
if (cursorAt <= progress) {
|
||||
wordAt = i;
|
||||
return false;
|
||||
}
|
||||
progress += seperator;
|
||||
});
|
||||
words[wordAt] = v;
|
||||
// TODO this should set the cursor to the right position, but it gets overriden somewhere
|
||||
//$.Autocompleter.Selection(input, progress + seperator, progress + seperator);
|
||||
v = words.join( options.multipleSeparator );
|
||||
}
|
||||
v += options.multipleSeparator;
|
||||
}
|
||||
|
||||
$input.val(v);
|
||||
hideResultsNow();
|
||||
$input.trigger("result", [selected.data, selected.value]);
|
||||
return true;
|
||||
}
|
||||
|
||||
function onChange(crap, skipPrevCheck) {
|
||||
if( lastKeyPressCode == KEY.DEL ) {
|
||||
select.hide();
|
||||
return;
|
||||
}
|
||||
|
||||
var currentValue = $input.val();
|
||||
|
||||
if ( !skipPrevCheck && currentValue == previousValue )
|
||||
return;
|
||||
|
||||
previousValue = currentValue;
|
||||
|
||||
currentValue = lastWord(currentValue);
|
||||
if ( currentValue.length >= options.minChars) {
|
||||
$input.addClass(options.loadingClass);
|
||||
if (!options.matchCase)
|
||||
currentValue = currentValue.toLowerCase();
|
||||
request(currentValue, receiveData, hideResultsNow);
|
||||
} else {
|
||||
stopLoading();
|
||||
select.hide();
|
||||
}
|
||||
};
|
||||
|
||||
function trimWords(value) {
|
||||
if (!value)
|
||||
return [""];
|
||||
if (!options.multiple)
|
||||
return [$.trim(value)];
|
||||
return $.map(value.split(options.multipleSeparator), function(word) {
|
||||
return $.trim(value).length ? $.trim(word) : null;
|
||||
});
|
||||
}
|
||||
|
||||
function lastWord(value) {
|
||||
if ( !options.multiple )
|
||||
return value;
|
||||
var words = trimWords(value);
|
||||
if (words.length == 1)
|
||||
return words[0];
|
||||
var cursorAt = $(input).selection().start;
|
||||
if (cursorAt == value.length) {
|
||||
words = trimWords(value)
|
||||
} else {
|
||||
words = trimWords(value.replace(value.substring(cursorAt), ""));
|
||||
}
|
||||
return words[words.length - 1];
|
||||
}
|
||||
|
||||
// fills in the input box w/the first match (assumed to be the best match)
|
||||
// q: the term entered
|
||||
// sValue: the first matching result
|
||||
function autoFill(q, sValue){
|
||||
// autofill in the complete box w/the first match as long as the user hasn't entered in more data
|
||||
// if the last user key pressed was backspace, don't autofill
|
||||
if( options.autoFill && (lastWord($input.val()).toLowerCase() == q.toLowerCase()) && lastKeyPressCode != KEY.BACKSPACE ) {
|
||||
// fill in the value (keep the case the user has typed)
|
||||
$input.val($input.val() + sValue.substring(lastWord(previousValue).length));
|
||||
// select the portion of the value not typed by the user (so the next character will erase)
|
||||
$(input).selection(previousValue.length, previousValue.length + sValue.length);
|
||||
}
|
||||
};
|
||||
|
||||
function hideResults() {
|
||||
clearTimeout(timeout);
|
||||
timeout = setTimeout(hideResultsNow, 200);
|
||||
};
|
||||
|
||||
function hideResultsNow() {
|
||||
var wasVisible = select.visible();
|
||||
select.hide();
|
||||
clearTimeout(timeout);
|
||||
stopLoading();
|
||||
if (options.mustMatch) {
|
||||
// call search and run callback
|
||||
$input.search(
|
||||
function (result){
|
||||
// if no value found, clear the input box
|
||||
if( !result ) {
|
||||
if (options.multiple) {
|
||||
var words = trimWords($input.val()).slice(0, -1);
|
||||
$input.val( words.join(options.multipleSeparator) + (words.length ? options.multipleSeparator : "") );
|
||||
}
|
||||
else {
|
||||
$input.val( "" );
|
||||
$input.trigger("result", null);
|
||||
}
|
||||
}
|
||||
}
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
function receiveData(q, data) {
|
||||
if ( data && data.length && hasFocus ) {
|
||||
stopLoading();
|
||||
select.display(data, q);
|
||||
autoFill(q, data[0].value);
|
||||
select.show();
|
||||
} else {
|
||||
hideResultsNow();
|
||||
}
|
||||
};
|
||||
|
||||
function request(term, success, failure) {
|
||||
if (!options.matchCase)
|
||||
term = term.toLowerCase();
|
||||
var data = cache.load(term);
|
||||
// recieve the cached data
|
||||
if (data && data.length) {
|
||||
success(term, data);
|
||||
// if an AJAX url has been supplied, try loading the data now
|
||||
} else if( (typeof options.url == "string") && (options.url.length > 0) ){
|
||||
|
||||
var extraParams = {
|
||||
timestamp: +new Date()
|
||||
};
|
||||
$.each(options.extraParams, function(key, param) {
|
||||
extraParams[key] = typeof param == "function" ? param() : param;
|
||||
});
|
||||
|
||||
$.ajax({
|
||||
// try to leverage ajaxQueue plugin to abort previous requests
|
||||
mode: "abort",
|
||||
// limit abortion to this input
|
||||
port: "autocomplete" + input.name,
|
||||
dataType: options.dataType,
|
||||
url: options.url,
|
||||
data: $.extend({
|
||||
q: lastWord(term),
|
||||
limit: options.max
|
||||
}, extraParams),
|
||||
success: function(data) {
|
||||
var parsed = options.parse && options.parse(data) || parse(data);
|
||||
cache.add(term, parsed);
|
||||
success(term, parsed);
|
||||
}
|
||||
});
|
||||
} else {
|
||||
// if we have a failure, we need to empty the list -- this prevents the the [TAB] key from selecting the last successful match
|
||||
select.emptyList();
|
||||
failure(term);
|
||||
}
|
||||
};
|
||||
|
||||
function parse(data) {
|
||||
var parsed = [];
|
||||
var rows = data.split("\n");
|
||||
for (var i=0; i < rows.length; i++) {
|
||||
var row = $.trim(rows[i]);
|
||||
if (row) {
|
||||
row = row.split("|");
|
||||
parsed[parsed.length] = {
|
||||
data: row,
|
||||
value: row[0],
|
||||
result: options.formatResult && options.formatResult(row, row[0]) || row[0]
|
||||
};
|
||||
}
|
||||
}
|
||||
return parsed;
|
||||
};
|
||||
|
||||
function stopLoading() {
|
||||
$input.removeClass(options.loadingClass);
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
$.Autocompleter.defaults = {
|
||||
inputClass: "ac_input",
|
||||
resultsClass: "ac_results",
|
||||
loadingClass: "ac_loading",
|
||||
minChars: 1,
|
||||
delay: 400,
|
||||
matchCase: false,
|
||||
matchSubset: true,
|
||||
matchContains: false,
|
||||
cacheLength: 10,
|
||||
max: 100,
|
||||
mustMatch: false,
|
||||
extraParams: {},
|
||||
selectFirst: true,
|
||||
formatItem: function(row) { return row[0]; },
|
||||
formatMatch: null,
|
||||
autoFill: false,
|
||||
width: 0,
|
||||
multiple: false,
|
||||
multipleSeparator: ", ",
|
||||
highlight: function(value, term) {
|
||||
return value.replace(new RegExp("(?![^&;]+;)(?!<[^<>]*)(" + term.replace(/([\^\$\(\)\[\]\{\}\*\.\+\?\|\\])/gi, "\\$1") + ")(?![^<>]*>)(?![^&;]+;)", "gi"), "<strong>$1</strong>");
|
||||
},
|
||||
scroll: true,
|
||||
scrollHeight: 180
|
||||
};
|
||||
|
||||
$.Autocompleter.Cache = function(options) {
|
||||
|
||||
var data = {};
|
||||
var length = 0;
|
||||
|
||||
function matchSubset(s, sub) {
|
||||
if (!options.matchCase)
|
||||
s = s.toLowerCase();
|
||||
var i = s.indexOf(sub);
|
||||
if (options.matchContains == "word"){
|
||||
i = s.toLowerCase().search("\\b" + sub.toLowerCase());
|
||||
}
|
||||
if (i == -1) return false;
|
||||
return i == 0 || options.matchContains;
|
||||
};
|
||||
|
||||
function add(q, value) {
|
||||
if (length > options.cacheLength){
|
||||
flush();
|
||||
}
|
||||
if (!data[q]){
|
||||
length++;
|
||||
}
|
||||
data[q] = value;
|
||||
}
|
||||
|
||||
function populate(){
|
||||
if( !options.data ) return false;
|
||||
// track the matches
|
||||
var stMatchSets = {},
|
||||
nullData = 0;
|
||||
|
||||
// no url was specified, we need to adjust the cache length to make sure it fits the local data store
|
||||
if( !options.url ) options.cacheLength = 1;
|
||||
|
||||
// track all options for minChars = 0
|
||||
stMatchSets[""] = [];
|
||||
|
||||
// loop through the array and create a lookup structure
|
||||
for ( var i = 0, ol = options.data.length; i < ol; i++ ) {
|
||||
var rawValue = options.data[i];
|
||||
// if rawValue is a string, make an array otherwise just reference the array
|
||||
rawValue = (typeof rawValue == "string") ? [rawValue] : rawValue;
|
||||
|
||||
var value = options.formatMatch(rawValue, i+1, options.data.length);
|
||||
if ( value === false )
|
||||
continue;
|
||||
|
||||
var firstChar = value.charAt(0).toLowerCase();
|
||||
// if no lookup array for this character exists, look it up now
|
||||
if( !stMatchSets[firstChar] )
|
||||
stMatchSets[firstChar] = [];
|
||||
|
||||
// if the match is a string
|
||||
var row = {
|
||||
value: value,
|
||||
data: rawValue,
|
||||
result: options.formatResult && options.formatResult(rawValue) || value
|
||||
};
|
||||
|
||||
// push the current match into the set list
|
||||
stMatchSets[firstChar].push(row);
|
||||
|
||||
// keep track of minChars zero items
|
||||
if ( nullData++ < options.max ) {
|
||||
stMatchSets[""].push(row);
|
||||
}
|
||||
};
|
||||
|
||||
// add the data items to the cache
|
||||
$.each(stMatchSets, function(i, value) {
|
||||
// increase the cache size
|
||||
options.cacheLength++;
|
||||
// add to the cache
|
||||
add(i, value);
|
||||
});
|
||||
}
|
||||
|
||||
// populate any existing data
|
||||
setTimeout(populate, 25);
|
||||
|
||||
function flush(){
|
||||
data = {};
|
||||
length = 0;
|
||||
}
|
||||
|
||||
return {
|
||||
flush: flush,
|
||||
add: add,
|
||||
populate: populate,
|
||||
load: function(q) {
|
||||
if (!options.cacheLength || !length)
|
||||
return null;
|
||||
/*
|
||||
* if dealing w/local data and matchContains than we must make sure
|
||||
* to loop through all the data collections looking for matches
|
||||
*/
|
||||
if( !options.url && options.matchContains ){
|
||||
// track all matches
|
||||
var csub = [];
|
||||
// loop through all the data grids for matches
|
||||
for( var k in data ){
|
||||
// don't search through the stMatchSets[""] (minChars: 0) cache
|
||||
// this prevents duplicates
|
||||
if( k.length > 0 ){
|
||||
var c = data[k];
|
||||
$.each(c, function(i, x) {
|
||||
// if we've got a match, add it to the array
|
||||
if (matchSubset(x.value, q)) {
|
||||
csub.push(x);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
return csub;
|
||||
} else
|
||||
// if the exact item exists, use it
|
||||
if (data[q]){
|
||||
return data[q];
|
||||
} else
|
||||
if (options.matchSubset) {
|
||||
for (var i = q.length - 1; i >= options.minChars; i--) {
|
||||
var c = data[q.substr(0, i)];
|
||||
if (c) {
|
||||
var csub = [];
|
||||
$.each(c, function(i, x) {
|
||||
if (matchSubset(x.value, q)) {
|
||||
csub[csub.length] = x;
|
||||
}
|
||||
});
|
||||
return csub;
|
||||
}
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
$.Autocompleter.Select = function (options, input, select, config) {
|
||||
var CLASSES = {
|
||||
ACTIVE: "ac_over"
|
||||
};
|
||||
|
||||
var listItems,
|
||||
active = -1,
|
||||
data,
|
||||
term = "",
|
||||
needsInit = true,
|
||||
element,
|
||||
list;
|
||||
|
||||
// Create results
|
||||
function init() {
|
||||
if (!needsInit)
|
||||
return;
|
||||
element = $("<div/>")
|
||||
.hide()
|
||||
.addClass(options.resultsClass)
|
||||
.css("position", "absolute")
|
||||
.appendTo(document.body);
|
||||
|
||||
list = $("<ul/>").appendTo(element).mouseover( function(event) {
|
||||
if(target(event).nodeName && target(event).nodeName.toUpperCase() == 'LI') {
|
||||
active = $("li", list).removeClass(CLASSES.ACTIVE).index(target(event));
|
||||
$(target(event)).addClass(CLASSES.ACTIVE);
|
||||
}
|
||||
}).click(function(event) {
|
||||
$(target(event)).addClass(CLASSES.ACTIVE);
|
||||
select();
|
||||
// TODO provide option to avoid setting focus again after selection? useful for cleanup-on-focus
|
||||
input.focus();
|
||||
return false;
|
||||
}).mousedown(function() {
|
||||
config.mouseDownOnSelect = true;
|
||||
}).mouseup(function() {
|
||||
config.mouseDownOnSelect = false;
|
||||
});
|
||||
|
||||
if( options.width > 0 )
|
||||
element.css("width", options.width);
|
||||
|
||||
needsInit = false;
|
||||
}
|
||||
|
||||
function target(event) {
|
||||
var element = event.target;
|
||||
while(element && element.tagName != "LI")
|
||||
element = element.parentNode;
|
||||
// more fun with IE, sometimes event.target is empty, just ignore it then
|
||||
if(!element)
|
||||
return [];
|
||||
return element;
|
||||
}
|
||||
|
||||
function moveSelect(step) {
|
||||
listItems.slice(active, active + 1).removeClass(CLASSES.ACTIVE);
|
||||
movePosition(step);
|
||||
var activeItem = listItems.slice(active, active + 1).addClass(CLASSES.ACTIVE);
|
||||
if(options.scroll) {
|
||||
var offset = 0;
|
||||
listItems.slice(0, active).each(function() {
|
||||
offset += this.offsetHeight;
|
||||
});
|
||||
if((offset + activeItem[0].offsetHeight - list.scrollTop()) > list[0].clientHeight) {
|
||||
list.scrollTop(offset + activeItem[0].offsetHeight - list.innerHeight());
|
||||
} else if(offset < list.scrollTop()) {
|
||||
list.scrollTop(offset);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
function movePosition(step) {
|
||||
active += step;
|
||||
if (active < 0) {
|
||||
active = listItems.size() - 1;
|
||||
} else if (active >= listItems.size()) {
|
||||
active = 0;
|
||||
}
|
||||
}
|
||||
|
||||
function limitNumberOfItems(available) {
|
||||
return options.max && options.max < available
|
||||
? options.max
|
||||
: available;
|
||||
}
|
||||
|
||||
function fillList() {
|
||||
list.empty();
|
||||
var max = limitNumberOfItems(data.length);
|
||||
for (var i=0; i < max; i++) {
|
||||
if (!data[i])
|
||||
continue;
|
||||
var formatted = options.formatItem(data[i].data, i+1, max, data[i].value, term);
|
||||
if ( formatted === false )
|
||||
continue;
|
||||
var li = $("<li/>").html( options.highlight(formatted, term) ).addClass(i%2 == 0 ? "ac_even" : "ac_odd").appendTo(list)[0];
|
||||
$.data(li, "ac_data", data[i]);
|
||||
}
|
||||
listItems = list.find("li");
|
||||
if ( options.selectFirst ) {
|
||||
listItems.slice(0, 1).addClass(CLASSES.ACTIVE);
|
||||
active = 0;
|
||||
}
|
||||
// apply bgiframe if available
|
||||
if ( $.fn.bgiframe )
|
||||
list.bgiframe();
|
||||
}
|
||||
|
||||
return {
|
||||
display: function(d, q) {
|
||||
init();
|
||||
data = d;
|
||||
term = q;
|
||||
fillList();
|
||||
},
|
||||
next: function() {
|
||||
moveSelect(1);
|
||||
},
|
||||
prev: function() {
|
||||
moveSelect(-1);
|
||||
},
|
||||
pageUp: function() {
|
||||
if (active != 0 && active - 8 < 0) {
|
||||
moveSelect( -active );
|
||||
} else {
|
||||
moveSelect(-8);
|
||||
}
|
||||
},
|
||||
pageDown: function() {
|
||||
if (active != listItems.size() - 1 && active + 8 > listItems.size()) {
|
||||
moveSelect( listItems.size() - 1 - active );
|
||||
} else {
|
||||
moveSelect(8);
|
||||
}
|
||||
},
|
||||
hide: function() {
|
||||
element && element.hide();
|
||||
listItems && listItems.removeClass(CLASSES.ACTIVE);
|
||||
active = -1;
|
||||
},
|
||||
visible : function() {
|
||||
return element && element.is(":visible");
|
||||
},
|
||||
current: function() {
|
||||
return this.visible() && (listItems.filter("." + CLASSES.ACTIVE)[0] || options.selectFirst && listItems[0]);
|
||||
},
|
||||
show: function() {
|
||||
var offset = $(input).offset();
|
||||
element.css({
|
||||
width: typeof options.width == "string" || options.width > 0 ? options.width : $(input).width(),
|
||||
top: offset.top + input.offsetHeight,
|
||||
left: offset.left
|
||||
}).show();
|
||||
if(options.scroll) {
|
||||
list.scrollTop(0);
|
||||
list.css({
|
||||
maxHeight: options.scrollHeight,
|
||||
overflow: 'auto'
|
||||
});
|
||||
|
||||
if($.browser.msie && typeof document.body.style.maxHeight === "undefined") {
|
||||
var listHeight = 0;
|
||||
listItems.each(function() {
|
||||
listHeight += this.offsetHeight;
|
||||
});
|
||||
var scrollbarsVisible = listHeight > options.scrollHeight;
|
||||
list.css('height', scrollbarsVisible ? options.scrollHeight : listHeight );
|
||||
if (!scrollbarsVisible) {
|
||||
// IE doesn't recalculate width when scrollbar disappears
|
||||
listItems.width( list.width() - parseInt(listItems.css("padding-left")) - parseInt(listItems.css("padding-right")) );
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
},
|
||||
selected: function() {
|
||||
var selected = listItems && listItems.filter("." + CLASSES.ACTIVE).removeClass(CLASSES.ACTIVE);
|
||||
return selected && selected.length && $.data(selected[0], "ac_data");
|
||||
},
|
||||
emptyList: function (){
|
||||
list && list.empty();
|
||||
},
|
||||
unbind: function() {
|
||||
element && element.remove();
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
$.fn.selection = function(start, end) {
|
||||
if (start !== undefined) {
|
||||
return this.each(function() {
|
||||
if( this.createTextRange ){
|
||||
var selRange = this.createTextRange();
|
||||
if (end === undefined || start == end) {
|
||||
selRange.move("character", start);
|
||||
selRange.select();
|
||||
} else {
|
||||
selRange.collapse(true);
|
||||
selRange.moveStart("character", start);
|
||||
selRange.moveEnd("character", end);
|
||||
selRange.select();
|
||||
}
|
||||
} else if( this.setSelectionRange ){
|
||||
this.setSelectionRange(start, end);
|
||||
} else if( this.selectionStart ){
|
||||
this.selectionStart = start;
|
||||
this.selectionEnd = end;
|
||||
}
|
||||
});
|
||||
}
|
||||
var field = this[0];
|
||||
if ( field.createTextRange ) {
|
||||
var range = document.selection.createRange(),
|
||||
orig = field.value,
|
||||
teststring = "<->",
|
||||
textLength = range.text.length;
|
||||
range.text = teststring;
|
||||
var caretAt = field.value.indexOf(teststring);
|
||||
field.value = orig;
|
||||
this.selection(caretAt, caretAt + textLength);
|
||||
return {
|
||||
start: caretAt,
|
||||
end: caretAt + textLength
|
||||
}
|
||||
} else if( field.selectionStart !== undefined ){
|
||||
return {
|
||||
start: field.selectionStart,
|
||||
end: field.selectionEnd
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
})(jQuery);
|
||||
13
jquerylib/jquery.autocomplete.min.js
vendored
Normal file
13
jquerylib/jquery.autocomplete.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
12
jquerylib/jquery.autocomplete.pack.js
Normal file
12
jquerylib/jquery.autocomplete.pack.js
Normal file
File diff suppressed because one or more lines are too long
10
jquerylib/jquery.bgiframe.min.js
vendored
Normal file
10
jquerylib/jquery.bgiframe.min.js
vendored
Normal file
@@ -0,0 +1,10 @@
|
||||
/* Copyright (c) 2006 Brandon Aaron (http://brandonaaron.net)
|
||||
* Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php)
|
||||
* and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses.
|
||||
*
|
||||
* $LastChangedDate: 2007-07-22 01:45:56 +0200 (Son, 22 Jul 2007) $
|
||||
* $Rev: 2447 $
|
||||
*
|
||||
* Version 2.1.1
|
||||
*/
|
||||
(function($){$.fn.bgIframe=$.fn.bgiframe=function(s){if($.browser.msie&&/6.0/.test(navigator.userAgent)){s=$.extend({top:'auto',left:'auto',width:'auto',height:'auto',opacity:true,src:'javascript:false;'},s||{});var prop=function(n){return n&&n.constructor==Number?n+'px':n;},html='<iframe class="bgiframe"frameborder="0"tabindex="-1"src="'+s.src+'"'+'style="display:block;position:absolute;z-index:-1;'+(s.opacity!==false?'filter:Alpha(Opacity=\'0\');':'')+'top:'+(s.top=='auto'?'expression(((parseInt(this.parentNode.currentStyle.borderTopWidth)||0)*-1)+\'px\')':prop(s.top))+';'+'left:'+(s.left=='auto'?'expression(((parseInt(this.parentNode.currentStyle.borderLeftWidth)||0)*-1)+\'px\')':prop(s.left))+';'+'width:'+(s.width=='auto'?'expression(this.parentNode.offsetWidth+\'px\')':prop(s.width))+';'+'height:'+(s.height=='auto'?'expression(this.parentNode.offsetHeight+\'px\')':prop(s.height))+';'+'"/>';return this.each(function(){if($('> iframe.bgiframe',this).length==0)this.insertBefore(document.createElement(html),this.firstChild);});}return this;};})(jQuery);
|
||||
53
jquerylib/jquery.css
Normal file
53
jquerylib/jquery.css
Normal file
@@ -0,0 +1,53 @@
|
||||
body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,form,fieldset,input,p,blockquote,th,td{margin:0;padding:0}
|
||||
table{border-collapse:collapse;border-spacing:0}
|
||||
fieldset,img{border:0}
|
||||
address,caption,cite,code,dfn,th,var{font-style:normal;font-weight:normal}
|
||||
ol,ul{list-style:none}
|
||||
caption,th{text-align:left}
|
||||
h1,h2,h3,h4,h5,h6{font-size:100%;font-style:normal;font-weight:normal}
|
||||
q:before,q:after{content:''}
|
||||
body{font:13px arial,helvetica,clean,sans-serif;font-size:small;}
|
||||
select,input,textarea{font:99% arial,helvetica,clean,sans-serif}
|
||||
pre,code{font:115% monospace;font-size:100%}
|
||||
body * {line-height:1.22em}
|
||||
body {
|
||||
color: #202020;
|
||||
}
|
||||
|
||||
h1 {
|
||||
color: #fff;
|
||||
background: #06b;
|
||||
padding: 10px;
|
||||
font-size: 200%;
|
||||
}
|
||||
|
||||
h2 {
|
||||
color: #000;
|
||||
font-size: 150%;
|
||||
padding: 10px 0;
|
||||
}
|
||||
|
||||
h3 {
|
||||
color: #000;
|
||||
font-size: 120%;
|
||||
padding: 10px 0;
|
||||
}
|
||||
|
||||
ul {
|
||||
list-style: disc inside;
|
||||
margin-left: 1em;
|
||||
}
|
||||
|
||||
#content {
|
||||
padding: 10px;
|
||||
}
|
||||
|
||||
label {
|
||||
float: left;
|
||||
width: 12em;
|
||||
}
|
||||
input[type=text] { width: 15em; }
|
||||
|
||||
#banner { padding: 15px; background-color: #06b; color: white; font-size: large; border-bottom: 1px solid #ccc;
|
||||
background: url(bg.gif) repeat-x; text-align: center }
|
||||
#banner a { color: white; }
|
||||
3558
jquerylib/jquery.js
vendored
Normal file
3558
jquerylib/jquery.js
vendored
Normal file
File diff suppressed because it is too large
Load Diff
216
jquerylib/localdata.js
vendored
Normal file
216
jquerylib/localdata.js
vendored
Normal file
@@ -0,0 +1,216 @@
|
||||
var months = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];
|
||||
var emails = [
|
||||
{ name: "Peter Pan", to: "peter@pan.de" },
|
||||
{ name: "Molly", to: "molly@yahoo.com" },
|
||||
{ name: "Forneria Marconi", to: "live@japan.jp" },
|
||||
{ name: "Master <em>Sync</em>", to: "205bw@samsung.com" },
|
||||
{ name: "Dr. <strong>Tech</strong> de Log", to: "g15@logitech.com" },
|
||||
{ name: "Don Corleone", to: "don@vegas.com" },
|
||||
{ name: "Mc Chick", to: "info@donalds.org" },
|
||||
{ name: "Donnie Darko", to: "dd@timeshift.info" },
|
||||
{ name: "Quake The Net", to: "webmaster@quakenet.org" },
|
||||
{ name: "Dr. Write", to: "write@writable.com" }
|
||||
];
|
||||
var cities = [
|
||||
"Aberdeen", "Ada", "Adamsville", "Addyston", "Adelphi", "Adena", "Adrian", "Akron",
|
||||
"Albany", "Alexandria", "Alger", "Alledonia", "Alliance", "Alpha", "Alvada",
|
||||
"Alvordton", "Amanda", "Amelia", "Amesville", "Amherst", "Amlin", "Amsden",
|
||||
"Amsterdam", "Andover", "Anna", "Ansonia", "Antwerp", "Apple Creek", "Arcadia",
|
||||
"Arcanum", "Archbold", "Arlington", "Ashland", "Ashley", "Ashtabula", "Ashville",
|
||||
"Athens", "Attica", "Atwater", "Augusta", "Aurora", "Austinburg", "Ava", "Avon",
|
||||
"Avon Lake", "Bainbridge", "Bakersville", "Baltic", "Baltimore", "Bannock",
|
||||
"Barberton", "Barlow", "Barnesville", "Bartlett", "Barton", "Bascom", "Batavia",
|
||||
"Bath", "Bay Village", "Beach City", "Beachwood", "Beallsville", "Beaver",
|
||||
"Beaverdam", "Bedford", "Bellaire", "Bellbrook", "Belle Center", "Belle Valley",
|
||||
"Bellefontaine", "Bellevue", "Bellville", "Belmont", "Belmore", "Beloit", "Belpre",
|
||||
"Benton Ridge", "Bentonville", "Berea", "Bergholz", "Berkey", "Berlin",
|
||||
"Berlin Center", "Berlin Heights", "Bethel", "Bethesda", "Bettsville", "Beverly",
|
||||
"Bidwell", "Big Prairie", "Birmingham", "Blacklick", "Bladensburg", "Blaine",
|
||||
"Blakeslee", "Blanchester", "Blissfield", "Bloomdale", "Bloomingburg",
|
||||
"Bloomingdale", "Bloomville", "Blue Creek", "Blue Rock", "Bluffton",
|
||||
"Bolivar", "Botkins", "Bourneville", "Bowerston", "Bowersville",
|
||||
"Bowling Green", "Bradford", "Bradner", "Brady Lake", "Brecksville",
|
||||
"Bremen", "Brewster", "Brice", "Bridgeport", "Brilliant", "Brinkhaven",
|
||||
"Bristolville", "Broadview Heights", "Broadway", "Brookfield", "Brookpark",
|
||||
"Brookville", "Brownsville", "Brunswick", "Bryan", "Buchtel", "Buckeye Lake",
|
||||
"Buckland", "Bucyrus", "Buffalo", "Buford", "Burbank", "Burghill", "Burgoon",
|
||||
"Burkettsville", "Burton", "Butler", "Byesville", "Cable", "Cadiz", "Cairo",
|
||||
"Caldwell", "Caledonia", "Cambridge", "Camden", "Cameron", "Camp Dennison",
|
||||
"Campbell", "Canal Fulton", "Canal Winchester", "Canfield", "Canton", "Carbon Hill",
|
||||
"Carbondale", "Cardington", "Carey", "Carroll", "Carrollton", "Casstown",
|
||||
"Castalia", "Catawba", "Cecil", "Cedarville", "Celina", "Centerburg",
|
||||
"Chagrin Falls", "Chandlersville", "Chardon", "Charm", "Chatfield", "Chauncey",
|
||||
"Cherry Fork", "Chesapeake", "Cheshire", "Chester", "Chesterhill", "Chesterland",
|
||||
"Chesterville", "Chickasaw", "Chillicothe", "Chilo", "Chippewa Lake",
|
||||
"Christiansburg", "Cincinnati", "Circleville", "Clarington", "Clarksburg",
|
||||
"Clarksville", "Clay Center", "Clayton", "Cleveland", "Cleves", "Clifton",
|
||||
"Clinton", "Cloverdale", "Clyde", "Coal Run", "Coalton", "Coldwater", "Colerain",
|
||||
"College Corner", "Collins", "Collinsville", "Colton", "Columbia Station",
|
||||
"Columbiana", "Columbus", "Columbus Grove", "Commercial Point", "Conesville",
|
||||
"Conneaut", "Conover", "Continental", "Convoy", "Coolville", "Corning", "Cortland",
|
||||
"Coshocton", "Covington", "Creola", "Crestline", "Creston", "Crooksville",
|
||||
"Croton", "Crown City", "Cuba", "Cumberland", "Curtice", "Custar", "Cutler",
|
||||
"Cuyahoga Falls", "Cygnet", "Cynthiana", "Dalton", "Damascus", "Danville",
|
||||
"Dayton", "De Graff", "Decatur", "Deerfield", "Deersville", "Defiance",
|
||||
"Delaware", "Dellroy", "Delphos", "Delta", "Dennison", "Derby", "Derwent",
|
||||
"Deshler", "Dexter City", "Diamond", "Dillonvale", "Dola", "Donnelsville",
|
||||
"Dorset", "Dover", "Doylestown", "Dresden", "Dublin", "Dunbridge", "Duncan Falls",
|
||||
"Dundee", "Dunkirk", "Dupont", "East Claridon", "East Fultonham",
|
||||
"East Liberty", "East Liverpool", "East Palestine", "East Rochester",
|
||||
"East Sparta", "East Springfield", "Eastlake", "Eaton", "Edgerton", "Edison",
|
||||
"Edon", "Eldorado", "Elgin", "Elkton", "Ellsworth", "Elmore", "Elyria",
|
||||
"Empire", "Englewood", "Enon", "Etna", "Euclid", "Evansport", "Fairborn",
|
||||
"Fairfield", "Fairpoint", "Fairview", "Farmdale", "Farmer", "Farmersville",
|
||||
"Fayette", "Fayetteville", "Feesburg", "Felicity", "Findlay", "Flat Rock",
|
||||
"Fleming", "Fletcher", "Flushing", "Forest", "Fort Jennings", "Fort Loramie",
|
||||
"Fort Recovery", "Fostoria", "Fowler", "Frankfort", "Franklin",
|
||||
"Franklin Furnace", "Frazeysburg", "Fredericksburg", "Fredericktown",
|
||||
"Freeport", "Fremont", "Fresno", "Friendship", "Fulton", "Fultonham",
|
||||
"Galena", "Galion", "Gallipolis", "Galloway", "Gambier", "Garrettsville",
|
||||
"Gates Mills", "Geneva", "Genoa", "Georgetown", "Germantown", "Gettysburg",
|
||||
"Gibsonburg", "Girard", "Glandorf", "Glencoe", "Glenford", "Glenmont",
|
||||
"Glouster", "Gnadenhutten", "Gomer", "Goshen", "Grafton", "Grand Rapids",
|
||||
"Grand River", "Granville", "Gratiot", "Gratis", "Graysville", "Graytown",
|
||||
"Green", "Green Camp", "Green Springs", "Greenfield", "Greenford",
|
||||
"Greentown", "Greenville", "Greenwich", "Grelton", "Grove City",
|
||||
"Groveport", "Grover Hill", "Guysville", "Gypsum", "Hallsville",
|
||||
"Hamden", "Hamersville", "Hamilton", "Hamler", "Hammondsville",
|
||||
"Hannibal", "Hanoverton", "Harbor View", "Harlem Springs", "Harpster",
|
||||
"Harrisburg", "Harrison", "Harrisville", "Harrod", "Hartford", "Hartville",
|
||||
"Harveysburg", "Haskins", "Haverhill", "Haviland", "Haydenville", "Hayesville",
|
||||
"Heath", "Hebron", "Helena", "Hicksville", "Higginsport", "Highland", "Hilliard",
|
||||
"Hillsboro", "Hinckley", "Hiram", "Hockingport", "Holgate", "Holland",
|
||||
"Hollansburg", "Holloway", "Holmesville", "Homer", "Homerville", "Homeworth",
|
||||
"Hooven", "Hopedale", "Hopewell", "Houston", "Howard", "Hoytville", "Hubbard",
|
||||
"Hudson", "Huntsburg", "Huntsville", "Huron", "Iberia", "Independence",
|
||||
"Irondale", "Ironton", "Irwin", "Isle Saint George", "Jackson", "Jackson Center",
|
||||
"Jacksontown", "Jacksonville", "Jacobsburg", "Jamestown", "Jasper",
|
||||
"Jefferson", "Jeffersonville", "Jenera", "Jeromesville", "Jerry City",
|
||||
"Jerusalem", "Jewell", "Jewett", "Johnstown", "Junction City", "Kalida",
|
||||
"Kansas", "Keene", "Kelleys Island", "Kensington", "Kent", "Kenton",
|
||||
"Kerr", "Kettlersville", "Kidron", "Kilbourne", "Killbuck", "Kimbolton",
|
||||
"Kings Mills", "Kingston", "Kingsville", "Kinsman", "Kipling", "Kipton",
|
||||
"Kirby", "Kirkersville", "Kitts Hill", "Kunkle", "La Rue", "Lacarne",
|
||||
"Lafayette", "Lafferty", "Lagrange", "Laings", "Lake Milton", "Lakemore",
|
||||
"Lakeside Marblehead", "Lakeview", "Lakeville", "Lakewood", "Lancaster",
|
||||
"Langsville", "Lansing", "Latham", "Latty", "Laura", "Laurelville",
|
||||
"Leavittsburg", "Lebanon", "Lees Creek", "Leesburg", "Leesville",
|
||||
"Leetonia", "Leipsic", "Lemoyne", "Lewis Center", "Lewisburg",
|
||||
"Lewistown", "Lewisville", "Liberty Center", "Lima", "Limaville",
|
||||
"Lindsey", "Lisbon", "Litchfield", "Lithopolis", "Little Hocking",
|
||||
"Lockbourne", "Lodi", "Logan", "London", "Londonderry",
|
||||
"Long Bottom", "Lorain", "Lore City", "Loudonville", "Louisville",
|
||||
"Loveland", "Lowell", "Lowellville", "Lower Salem", "Lucas",
|
||||
"Lucasville", "Luckey", "Ludlow Falls", "Lynchburg", "Lynx",
|
||||
"Lyons", "Macedonia", "Macksburg", "Madison", "Magnetic Springs",
|
||||
"Magnolia", "Maineville", "Malaga", "Malinta", "Malta", "Malvern",
|
||||
"Manchester", "Mansfield", "Mantua", "Maple Heights", "Maplewood",
|
||||
"Marathon", "Marengo", "Maria Stein", "Marietta", "Marion",
|
||||
"Mark Center", "Marshallville", "Martel", "Martin", "Martins Ferry",
|
||||
"Martinsburg", "Martinsville", "Marysville", "Mason", "Massillon",
|
||||
"Masury", "Maumee", "Maximo", "Maynard", "Mc Arthur", "Mc Clure",
|
||||
"Mc Comb", "Mc Connelsville", "Mc Cutchenville", "Mc Dermott",
|
||||
"Mc Donald", "Mc Guffey", "Mechanicsburg", "Mechanicstown",
|
||||
"Medina", "Medway", "Melmore", "Melrose", "Mendon", "Mentor",
|
||||
"Mesopotamia", "Metamora", "Miamisburg", "Miamitown", "Miamiville",
|
||||
"Middle Bass", "Middle Point", "Middlebranch", "Middleburg",
|
||||
"Middlefield", "Middleport", "Middletown", "Midland", "Midvale",
|
||||
"Milan", "Milford", "Milford Center", "Millbury", "Milledgeville",
|
||||
"Miller City", "Millersburg", "Millersport", "Millfield",
|
||||
"Milton Center", "Mineral City", "Mineral Ridge", "Minerva",
|
||||
"Minford", "Mingo", "Mingo Junction", "Minster", "Mogadore",
|
||||
"Monclova", "Monroe", "Monroeville", "Montezuma", "Montpelier",
|
||||
"Montville", "Morral", "Morristown", "Morrow", "Moscow",
|
||||
"Mount Blanchard", "Mount Cory", "Mount Eaton", "Mount Gilead",
|
||||
"Mount Hope", "Mount Liberty", "Mount Orab", "Mount Perry",
|
||||
"Mount Pleasant", "Mount Saint Joseph", "Mount Sterling",
|
||||
"Mount Vernon", "Mount Victory", "Mowrystown", "Moxahala",
|
||||
"Munroe Falls", "Murray City", "Nankin", "Napoleon", "Nashport",
|
||||
"Nashville", "Navarre", "Neapolis", "Neffs", "Negley",
|
||||
"Nelsonville", "Nevada", "Neville", "New Albany", "New Athens",
|
||||
"New Bavaria", "New Bloomington", "New Bremen", "New Carlisle",
|
||||
"New Concord", "New Hampshire", "New Haven", "New Holland",
|
||||
"New Knoxville", "New Lebanon", "New Lexington", "New London",
|
||||
"New Madison", "New Marshfield", "New Matamoras", "New Middletown",
|
||||
"New Paris", "New Philadelphia", "New Plymouth", "New Richmond",
|
||||
"New Riegel", "New Rumley", "New Springfield", "New Straitsville",
|
||||
"New Vienna", "New Washington", "New Waterford", "New Weston",
|
||||
"Newark", "Newbury", "Newcomerstown", "Newport", "Newton Falls",
|
||||
"Newtonsville", "Ney", "Niles", "North Baltimore", "North Bend",
|
||||
"North Benton", "North Bloomfield", "North Fairfield",
|
||||
"North Georgetown", "North Hampton", "North Jackson",
|
||||
"North Kingsville", "North Lawrence", "North Lewisburg",
|
||||
"North Lima", "North Olmsted", "North Ridgeville", "North Robinson",
|
||||
"North Royalton", "North Star", "Northfield", "Northwood", "Norwalk",
|
||||
"Norwich", "Nova", "Novelty", "Oak Harbor", "Oak Hill", "Oakwood",
|
||||
"Oberlin", "Oceola", "Ohio City", "Okeana", "Okolona", "Old Fort",
|
||||
"Old Washington", "Olmsted Falls", "Ontario", "Orangeville",
|
||||
"Oregon", "Oregonia", "Orient", "Orrville", "Orwell", "Osgood",
|
||||
"Ostrander", "Ottawa", "Ottoville", "Otway", "Overpeck",
|
||||
"Owensville", "Oxford", "Painesville", "Palestine", "Pandora",
|
||||
"Paris", "Parkman", "Pataskala", "Patriot", "Paulding", "Payne",
|
||||
"Pedro", "Peebles", "Pemberton", "Pemberville", "Peninsula",
|
||||
"Perry", "Perrysburg", "Perrysville", "Petersburg", "Pettisville",
|
||||
"Phillipsburg", "Philo", "Pickerington", "Piedmont", "Pierpont",
|
||||
"Piketon", "Piney Fork", "Pioneer", "Piqua", "Pitsburg",
|
||||
"Plain City", "Plainfield", "Pleasant City", "Pleasant Hill",
|
||||
"Pleasant Plain", "Pleasantville", "Plymouth", "Polk",
|
||||
"Pomeroy", "Port Clinton", "Port Jefferson", "Port Washington",
|
||||
"Port William", "Portage", "Portland", "Portsmouth", "Potsdam",
|
||||
"Powell", "Powhatan Point", "Proctorville", "Prospect", "Put in Bay",
|
||||
"Quaker City", "Quincy", "Racine", "Radnor", "Randolph", "Rarden",
|
||||
"Ravenna", "Rawson", "Ray", "Rayland", "Raymond", "Reedsville",
|
||||
"Reesville", "Reno", "Republic", "Reynoldsburg", "Richfield",
|
||||
"Richmond", "Richmond Dale", "Richwood", "Ridgeville Corners",
|
||||
"Ridgeway", "Rio Grande", "Ripley", "Risingsun", "Rittman",
|
||||
"Robertsville", "Rock Camp", "Rock Creek", "Rockbridge", "Rockford",
|
||||
"Rocky Ridge", "Rocky River", "Rogers", "Rome", "Rootstown", "Roseville",
|
||||
"Rosewood", "Ross", "Rossburg", "Rossford", "Roundhead", "Rudolph",
|
||||
"Rushsylvania", "Rushville", "Russells Point", "Russellville", "Russia",
|
||||
"Rutland", "Sabina", "Saint Clairsville", "Saint Henry", "Saint Johns",
|
||||
"Saint Louisville", "Saint Marys", "Saint Paris", "Salem", "Salesville",
|
||||
"Salineville", "Sandusky", "Sandyville", "Sarahsville", "Sardinia",
|
||||
"Sardis", "Savannah", "Scio", "Scioto Furnace", "Scott", "Scottown",
|
||||
"Seaman", "Sebring", "Sedalia", "Senecaville", "Seven Mile", "Seville",
|
||||
"Shade", "Shadyside", "Shandon", "Sharon Center", "Sharpsburg",
|
||||
"Shauck", "Shawnee", "Sheffield Lake", "Shelby", "Sherrodsville",
|
||||
"Sherwood", "Shiloh", "Short Creek", "Shreve", "Sidney", "Sinking Spring",
|
||||
"Smithfield", "Smithville", "Solon", "Somerdale", "Somerset",
|
||||
"Somerville", "South Bloomingville", "South Charleston", "South Lebanon",
|
||||
"South Point", "South Salem", "South Solon", "South Vienna",
|
||||
"South Webster", "Southington", "Sparta", "Spencer", "Spencerville",
|
||||
"Spring Valley", "Springboro", "Springfield", "Stafford", "Sterling",
|
||||
"Steubenville", "Stewart", "Stillwater", "Stockdale", "Stockport",
|
||||
"Stone Creek", "Stony Ridge", "Stout", "Stoutsville", "Stow", "Strasburg",
|
||||
"Stratton", "Streetsboro", "Strongsville", "Struthers", "Stryker",
|
||||
"Sugar Grove", "Sugarcreek", "Sullivan", "Sulphur Springs", "Summerfield",
|
||||
"Summit Station", "Summitville", "Sunbury", "Swanton", "Sycamore",
|
||||
"Sycamore Valley", "Sylvania", "Syracuse", "Tallmadge", "Tarlton",
|
||||
"Terrace Park", "The Plains", "Thompson", "Thornville", "Thurman",
|
||||
"Thurston", "Tiffin", "Tiltonsville", "Tipp City", "Tippecanoe", "Tiro",
|
||||
"Toledo", "Tontogany", "Torch", "Toronto", "Tremont City", "Trenton",
|
||||
"Trimble", "Trinway", "Troy", "Tuppers Plains", "Tuscarawas", "Twinsburg",
|
||||
"Uhrichsville", "Union City", "Union Furnace", "Unionport", "Uniontown",
|
||||
"Unionville", "Unionville Center", "Uniopolis", "Upper Sandusky", "Urbana",
|
||||
"Utica", "Valley City", "Van Buren", "Van Wert", "Vandalia", "Vanlue",
|
||||
"Vaughnsville", "Venedocia", "Vermilion", "Verona", "Versailles",
|
||||
"Vickery", "Vienna", "Vincent", "Vinton", "Wadsworth", "Wakefield",
|
||||
"Wakeman", "Walbridge", "Waldo", "Walhonding", "Walnut Creek", "Wapakoneta",
|
||||
"Warnock", "Warren", "Warsaw", "Washington Court House",
|
||||
"Washingtonville", "Waterford", "Waterloo", "Watertown", "Waterville",
|
||||
"Wauseon", "Waverly", "Wayland", "Wayne", "Waynesburg", "Waynesfield",
|
||||
"Waynesville", "Wellington", "Wellston", "Wellsville", "West Alexandria",
|
||||
"West Chester", "West Elkton", "West Farmington", "West Jefferson",
|
||||
"West Lafayette", "West Liberty", "West Manchester", "West Mansfield",
|
||||
"West Millgrove", "West Milton", "West Point", "West Portsmouth",
|
||||
"West Rushville", "West Salem", "West Union", "West Unity", "Westerville",
|
||||
"Westfield Center", "Westlake", "Weston", "Westville", "Wharton",
|
||||
"Wheelersburg", "Whipple", "White Cottage", "Whitehouse", "Wickliffe",
|
||||
"Wilberforce", "Wilkesville", "Willard", "Williamsburg", "Williamsfield",
|
||||
"Williamsport", "Williamstown", "Williston", "Willoughby", "Willow Wood",
|
||||
"Willshire", "Wilmington", "Wilmot", "Winchester", "Windham", "Windsor",
|
||||
"Winesburg", "Wingett Run", "Winona", "Wolf Run", "Woodsfield",
|
||||
"Woodstock", "Woodville", "Wooster", "Wren", "Xenia", "Yellow Springs",
|
||||
"Yorkshire", "Yorkville", "Youngstown", "Zaleski", "Zanesfield", "Zanesville",
|
||||
"Zoar"
|
||||
];
|
||||
10
jquerylib/thickbox-compressed.js
vendored
Normal file
10
jquerylib/thickbox-compressed.js
vendored
Normal file
File diff suppressed because one or more lines are too long
163
jquerylib/thickbox.css
Normal file
163
jquerylib/thickbox.css
Normal file
@@ -0,0 +1,163 @@
|
||||
/* ----------------------------------------------------------------------------------------------------------------*/
|
||||
/* ---------->>> global settings needed for thickbox <<<-----------------------------------------------------------*/
|
||||
/* ----------------------------------------------------------------------------------------------------------------*/
|
||||
*{padding: 0; margin: 0;}
|
||||
|
||||
/* ----------------------------------------------------------------------------------------------------------------*/
|
||||
/* ---------->>> thickbox specific link and font settings <<<------------------------------------------------------*/
|
||||
/* ----------------------------------------------------------------------------------------------------------------*/
|
||||
#TB_window {
|
||||
font: 12px Arial, Helvetica, sans-serif;
|
||||
color: #333333;
|
||||
}
|
||||
|
||||
#TB_secondLine {
|
||||
font: 10px Arial, Helvetica, sans-serif;
|
||||
color:#666666;
|
||||
}
|
||||
|
||||
#TB_window a:link {color: #666666;}
|
||||
#TB_window a:visited {color: #666666;}
|
||||
#TB_window a:hover {color: #000;}
|
||||
#TB_window a:active {color: #666666;}
|
||||
#TB_window a:focus{color: #666666;}
|
||||
|
||||
/* ----------------------------------------------------------------------------------------------------------------*/
|
||||
/* ---------->>> thickbox settings <<<-----------------------------------------------------------------------------*/
|
||||
/* ----------------------------------------------------------------------------------------------------------------*/
|
||||
#TB_overlay {
|
||||
position: fixed;
|
||||
z-index:100;
|
||||
top: 0px;
|
||||
left: 0px;
|
||||
height:100%;
|
||||
width:100%;
|
||||
}
|
||||
|
||||
.TB_overlayMacFFBGHack {background: url(macFFBgHack.png) repeat;}
|
||||
.TB_overlayBG {
|
||||
background-color:#000;
|
||||
filter:alpha(opacity=75);
|
||||
-moz-opacity: 0.75;
|
||||
opacity: 0.75;
|
||||
}
|
||||
|
||||
* html #TB_overlay { /* ie6 hack */
|
||||
position: absolute;
|
||||
height: expression(document.body.scrollHeight > document.body.offsetHeight ? document.body.scrollHeight : document.body.offsetHeight + 'px');
|
||||
}
|
||||
|
||||
#TB_window {
|
||||
position: fixed;
|
||||
background: #ffffff;
|
||||
z-index: 102;
|
||||
color:#000000;
|
||||
display:none;
|
||||
border: 4px solid #525252;
|
||||
text-align:left;
|
||||
top:50%;
|
||||
left:50%;
|
||||
}
|
||||
|
||||
* html #TB_window { /* ie6 hack */
|
||||
position: absolute;
|
||||
margin-top: expression(0 - parseInt(this.offsetHeight / 2) + (TBWindowMargin = document.documentElement && document.documentElement.scrollTop || document.body.scrollTop) + 'px');
|
||||
}
|
||||
|
||||
#TB_window img#TB_Image {
|
||||
display:block;
|
||||
margin: 15px 0 0 15px;
|
||||
border-right: 1px solid #ccc;
|
||||
border-bottom: 1px solid #ccc;
|
||||
border-top: 1px solid #666;
|
||||
border-left: 1px solid #666;
|
||||
}
|
||||
|
||||
#TB_caption{
|
||||
height:25px;
|
||||
padding:7px 30px 10px 25px;
|
||||
float:left;
|
||||
}
|
||||
|
||||
#TB_closeWindow{
|
||||
height:25px;
|
||||
padding:11px 25px 10px 0;
|
||||
float:right;
|
||||
}
|
||||
|
||||
#TB_closeAjaxWindow{
|
||||
padding:7px 10px 5px 0;
|
||||
margin-bottom:1px;
|
||||
text-align:right;
|
||||
float:right;
|
||||
}
|
||||
|
||||
#TB_ajaxWindowTitle{
|
||||
float:left;
|
||||
padding:7px 0 5px 10px;
|
||||
margin-bottom:1px;
|
||||
}
|
||||
|
||||
#TB_title{
|
||||
background-color:#e8e8e8;
|
||||
height:27px;
|
||||
}
|
||||
|
||||
#TB_ajaxContent{
|
||||
clear:both;
|
||||
padding:2px 15px 15px 15px;
|
||||
overflow:auto;
|
||||
text-align:left;
|
||||
line-height:1.4em;
|
||||
}
|
||||
|
||||
#TB_ajaxContent.TB_modal{
|
||||
padding:15px;
|
||||
}
|
||||
|
||||
#TB_ajaxContent p{
|
||||
padding:5px 0px 5px 0px;
|
||||
}
|
||||
|
||||
#TB_load{
|
||||
position: fixed;
|
||||
display:none;
|
||||
height:13px;
|
||||
width:208px;
|
||||
z-index:103;
|
||||
top: 50%;
|
||||
left: 50%;
|
||||
margin: -6px 0 0 -104px; /* -height/2 0 0 -width/2 */
|
||||
}
|
||||
|
||||
* html #TB_load { /* ie6 hack */
|
||||
position: absolute;
|
||||
margin-top: expression(0 - parseInt(this.offsetHeight / 2) + (TBWindowMargin = document.documentElement && document.documentElement.scrollTop || document.body.scrollTop) + 'px');
|
||||
}
|
||||
|
||||
#TB_HideSelect{
|
||||
z-index:99;
|
||||
position:fixed;
|
||||
top: 0;
|
||||
left: 0;
|
||||
background-color:#fff;
|
||||
border:none;
|
||||
filter:alpha(opacity=0);
|
||||
-moz-opacity: 0;
|
||||
opacity: 0;
|
||||
height:100%;
|
||||
width:100%;
|
||||
}
|
||||
|
||||
* html #TB_HideSelect { /* ie6 hack */
|
||||
position: absolute;
|
||||
height: expression(document.body.scrollHeight > document.body.offsetHeight ? document.body.scrollHeight : document.body.offsetHeight + 'px');
|
||||
}
|
||||
|
||||
#TB_iframeContent{
|
||||
clear:both;
|
||||
border:none;
|
||||
margin-bottom:-1px;
|
||||
margin-top:1px;
|
||||
_margin-bottom:1px;
|
||||
}
|
||||
487
lang.php
Normal file
487
lang.php
Normal file
@@ -0,0 +1,487 @@
|
||||
<?php
|
||||
$lang=array();
|
||||
|
||||
if($language=="de") {
|
||||
$lang['adduser']="User %s (eindeutige Client-ID: %s; Client-Datenbank-ID: %s) ist bisher unbekannt -> wurde nun zum Ranksystem hinzugefügt.";
|
||||
$lang['alrup']="Das Ranksystem ist bereits up to date. Bitte lösche diese Datei von deinem Webserver!";
|
||||
$lang['changedbid']="User %s (eindeutige Client-ID: %s) hat eine neue TeamSpeak Client-Datenbank-ID (%s). Ersetze die alte Client-Datenbank-ID (%s) und setze die gesammelte Zeiten zurück";
|
||||
$lang['crawl']="Scanne nach verbundenen Usern und sammle die online Zeit...";
|
||||
$lang['dbconerr']="Verbindung zur MySQL-Datenbank gescheitert: ";
|
||||
$lang['delclientsif']="%s Clients aus der Ranksystem Datenbank gelöscht!";
|
||||
$lang['delclientssc']="%s Clients aus der Ranksystem Datenbank erfolgreich gelöscht!";
|
||||
$lang['errlogin']="Benutzername und/oder Passwort sind falsch! Versuche es erneut...";
|
||||
$lang['error']="Fehler ";
|
||||
$lang['errremgrp']="Fehler beim Entfernen des Users mit der eindeutigen Client-ID %s aus der Servergruppe mit der Servergruppen-Datenbank-ID %s!";
|
||||
$lang['errremdb']="Fehler beim Löschen des Users mit der eindeutigen Client-ID % aus der Ranksystem Datenbank!";
|
||||
$lang['errukwn']="Unbekannter Fehler aufgetreten!";
|
||||
$lang['errupcount']="Fehler beim Überschreiben der ges. online Zeit %s bei User mit der eindeutigen Client-ID %s!";
|
||||
$lang['firstuse']="Scheint der erste Lauf zu sein. Starte loggen der Userhistorie...";
|
||||
$lang['instdb']="Installiere Datenbank:";
|
||||
$lang['instdberr']="Fehler beim Erstellen der Datenbank: ";
|
||||
$lang['instdbsubm']="Datenbank einrichten";
|
||||
$lang['instdbsuc']="Datenbank %s wurde erfolgreich angelegt.";
|
||||
$lang['insttb']="Installiere Tabellen:";
|
||||
$lang['insttberr']="Fehler beim Erstellen der Tabelle: ";
|
||||
$lang['insttbsuc']="Tabelle %s wurde erfolgreich angelegt.";
|
||||
$lang['isntwicfg']="Die Datenbankkonfigurationen konnten nicht gespeichert werden! Bitte versehe die 'other/dbconfig.php' mit einem chmod 0777 und versuche es anschließend erneut.";
|
||||
$lang['isntwidb']="Trage deine MySQL Datenbank Einstellungen ein:";
|
||||
$lang['isntwidberr']="Bitte überprüfe, ob alle Felder korrekt ausgefüllt wurden!";
|
||||
$lang['isntwidbhost']="Datenbank Hostadresse (IP oder DNS):";
|
||||
$lang['isntwidbmsg']="Meldung der MySQL-DB: ";
|
||||
$lang['isntwidbname']="Datenbank Name:";
|
||||
$lang['isntwidbpass']="Datenbank Passwort:";
|
||||
$lang['isntwidbusr']="Datenbank Benutzer:";
|
||||
$lang['isntwidel']="Bitte lösche noch die Datei 'install.php' und alle 'update_x-xx.php' Dateien vom Webserver und öffne danach das %s um das Ranksystem zu konfigurieren!";
|
||||
$lang['isntwiusr']="Benutzer für das Webinterface wurde erfolgreich erstellt.";
|
||||
$lang['isntwiusrcr']="erstelle Zugang";
|
||||
$lang['isntwiusrdesc']="Gib einen frei wählbaren Benutzer und ein Passwort für das Webinterface ein. Mit dem Webinterface wird das Ranksystem konfiguriert.";
|
||||
$lang['isntwiusrh']="Zugang - Webinterface";
|
||||
$lang['listcldbid']="Client-Datenbank-ID";
|
||||
$lang['listexgrp']="Ist vom Ranksystem ausgeschlossen (Servergruppen-Ausnahmen).";
|
||||
$lang['listexuid']="Ist vom Ranksystem ausgeschlossen (Client-Ausnahmen).";
|
||||
$lang['listnick']="Client-Name";
|
||||
$lang['listnxsg']="nächste Servergruppe";
|
||||
$lang['listnxup']="nächster Rang";
|
||||
$lang['listsuma']="ges. aktive Zeit";
|
||||
$lang['listsumi']="ges. idle Zeit";
|
||||
$lang['listsumo']="ges. online Zeit";
|
||||
$lang['listtime']="%s Tag(e), %s Std., %s Min., %s Sek.";
|
||||
$lang['listuid']="eindeutige Client-ID";
|
||||
$lang['nocount']="User %s (eindeutige Client-ID: %s; Client-Datenbank-ID %s) ist ein Query-User oder ist mehrmals online (nur erste Verbindung zählt) -> diese wird nicht gewertet!";
|
||||
$lang['noentry']="Keine Einträge gefunden; versuche erst einmal die worker.php zu starten..";
|
||||
$lang['pass']="Passwort: ";
|
||||
$lang['queryname']="Erster Queryname ist bereits in Verwendung. Versuche zweiten Querynamen zu nutzen...";
|
||||
$lang['sccrmcld']="User mit der eindeutigen Client-ID %s wurde erfolgreich aus der Ranksystem Datenbank gelöscht.";
|
||||
$lang['sccupcount']="User mit der eindeutigen Client-ID %s erhielt erfolgreich ein neue ges. online Zeit von %s.";
|
||||
$lang['setontime']="ges. online Zeit";
|
||||
$lang['setontimedesc']="Gib eine neue ges. online Zeit ein, welche bei den zuvor selektierten Usern hinterlegt werden soll. Mit dieser wird die alte ges. online Zeit überschrieben.<br><br>Die eingegeben ges. online Zeit wird für die nächsten Rangsteigerungen berücksichtigt.";
|
||||
$lang['sgrpadd']="Servergruppe %s zu User %s (eindeutige Client-ID: %s; Client-Datenbank-ID %s) hinzugefügt.";
|
||||
$lang['sgrprerr']="Es ist ein Problem mit den Servergruppen des Users %s (eindeutige Client-ID: %s; Client-Datenbank-ID %s) aufgetreten!";
|
||||
$lang['sgrprm']="Servergruppe %s von User %s (eindeutige Client-ID: %s; Client-Datenbank-ID %s) entfernt.";
|
||||
$lang['sitegen']="Seite generiert in %s Sekunden mit %s Clients.";
|
||||
$lang['updb']="Das Update muss nur ausgeführt werden, wenn das Ranksystem bereits mit einer älteren Version als %s genutzt wird!<br><br>Führe das Update nur einmal aus und lösche danach die 'update_%s.php' sofort von deinem Webserver.<br><br><br>Update Datenbank:<br>";
|
||||
$lang['updel']="Bitte lösche die folgenden Dateien vom Hauptverzeichnis des Ranksystems, sofern sie existieren:<br>%s";
|
||||
$lang['upinf']="Eine neu Version des Ranksystems ist verfügbar. Informiere Clients auf dem Server...";
|
||||
$lang['upmov']="Bitte verschiebe die Datei \'%s\' in das Unterverzeichnis \'%s\' und überschreibe dabei die dort vorhandene Datei!";
|
||||
$lang['upmsg']="\nHey, eine neue Version des [B]Ranksystems[/B] ist verfügbar!\n\naktuelle Version: %s\n[B]neue Version: %s[/B]\n\nBitte schaue auf unsere Homepage für weitere Informationen [URL]http://ts-n.net/ranksystem.php[/URL].";
|
||||
$lang['upsucc']="Datenbank-Update erfolgreich durchgeführt";
|
||||
$lang['upuser']="User %s (eindeutige Client-ID: %s; Client-Datenbank-ID %s) erhält eine neue ges. online Zeit von %s (davon aktiv: %s).";
|
||||
$lang['upusrerr']="Die eindeutige Client-ID %s konnte auf dem TeamSpeak nicht erreicht werden!";
|
||||
$lang['upusrinf']="User %s wurde erfolgreich benachrichtigt.";
|
||||
$lang['user']="Benutzername: ";
|
||||
$lang['usermsgactive']="\nHey, du bist im Rang gestiegen, da du eine Aktivität von %s Tagen, %s Stunden, %s Minuten und %s Sekunden erreicht hast.";
|
||||
$lang['usermsgonline']="\nHey, du bist im Rang gestiegen, da du bereits %s Tage, %s Stunden, %s Minuten und %s Sekunden online warst.";
|
||||
$lang['wiaction']="ausführen";
|
||||
$lang['wibgco']="Hintergrundfarbe:";
|
||||
$lang['wibgcodesc']="Lege eine Hintergrundfarbe fest<br>(gültiger HTML Code; muss mit # beginnen)";
|
||||
$lang['wichdbid']="Client-Datenbank-ID Reset";
|
||||
$lang['wichdbiddesc']="Setzt die online Zeit eines Users zurück, wenn sich seine TeamSpeak Client-Datenbank-ID ändert.<br><br>Beispiel:<br>Wird ein Client vom TeamSpeak Server gelöscht, so erhält er mit der nächsten Verbindung zum Server eine neue Client-Datenbank-ID.";
|
||||
$lang['widaform']="Datumsformat";
|
||||
$lang['widaformdesc']="Gebe ein Datumsformat zur Anzeige vor.<br><br>Beispiel:<br>%a Tage, %h Std., %i Min., %s Sek.";
|
||||
$lang['widelcld']="lösche Clients";
|
||||
$lang['widelclddesc']="Lösche zuvor selektierte User aus der Ranksystem Datenbank.<br><br>Hiermit bleiben die Userdaten auf dem TeamSpeak Server unberührt!";
|
||||
$lang['widelsg']="entferne aus Servergruppen";
|
||||
$lang['widelsgdesc']="Wähle, ob Clients auch aus den Servergruppen entfernt werden sollen, wenn sie aus der Ranksystem Datenbank gelöscht werden.<br><br>Es werden nur Servergruppen beachtet, welche das Ranksystem betreffen!";
|
||||
$lang['wideltime']="Löschzeitraum";
|
||||
$lang['wideltimedesc']="Lösche alte Clients aus aus der Ranksystem Datenbank.<br>Gib eine Zeit in Sekunden ein, welche ein User nicht mehr online war, damit er gelöscht wird.<br><br>Hiermit bleiben die Userdaten auf dem TeamSpeak Server unberührt!";
|
||||
$lang['wiexgrp']="Servergruppen-Ausnahmen";
|
||||
$lang['wiexgrpdesc']="Eine Komma getrennte Liste von Servergruppen-IDs, welche nicht am Ranksystem teilnehmen sollen.<br><br>User in mindestens einer dieser Gruppen sind von Rangsteigerungen ausgenommen.";
|
||||
$lang['wiexuid']="Client-Ausnahmen";
|
||||
$lang['wiexuiddesc']="Eine Komma getrennte Liste von eindeutigen Client-IDs, welche nicht am Ranksystem teilnehmen sollen.<br><br>Aufgelistete User sind von Rangsteigerungen ausgenommen.";
|
||||
$lang['wigrptime']="Rangsteigerung";
|
||||
$lang['wigrptimedesc']="Definiere hier, nach welcher Zeit ein User automatisch in eine vorgegebene Servergruppe gelangen soll.<br><br>Zeit (Sekunden)=>Servergruppen ID<br><br>Entscheidend hierfür ist die online Zeit des User bzw. wenn 'Idlezeit' aktiv, dann die aktive Zeit.<br><br>Jeder Eintrag ist vom nächsten durch ein Komma zu separieren.<br><br>Die Zeiten sind kummulativ zu hinterlegen.<br><br>Beispiel:<br>60=>9,120=>10,180=>11<br><br>Hier werden die User nach 60 Sekunden in die Servergruppe 9, nach wiederum 60 Sekunden in die Servergruppe 10, usw..., hinzugefügt.";
|
||||
$lang['wihdco']="Überschriftenfarbe:";
|
||||
$lang['wihdcodesc']="Lege eine Überschriftenfarbe fest.<br>(gültiger HTML Code; muss mit # beginnen)";
|
||||
$lang['wihl']="Webinterface - Ranksystem";
|
||||
$lang['wihlcfg']="Kern-Einstellungen";
|
||||
$lang['wihlclg']="Clients editieren (Global)";
|
||||
$lang['wihlcls']="Clients edidieren (Selektiv)";
|
||||
$lang['wihlsty']="Style-Einstellungen";
|
||||
$lang['wihlts']="TeamSpeak-Einstellungen";
|
||||
$lang['wihvco']="Hoverfarbe:";
|
||||
$lang['wihvcodesc']="Lege eine Hoverfarbe fest.<br>(gültiger HTML Code; muss mit # beginnen)";
|
||||
$lang['wiifco']="Infotextfarbe:";
|
||||
$lang['wiifcodesc']="Lege eine Infotextfarbe fest.<br>(gültiger HTML Code; muss mit # beginnen)";
|
||||
$lang['wilogout']="Abmelden";
|
||||
$lang['wimsgusr']="Benachrichtigung";
|
||||
$lang['wimsgusrdesc']="Informiere den User per privater Textnachricht über seine Rangsteigerung.<br><br>Definiere die Nachricht in der 'lang.php'<br>(usermsgonline bzw. usermsgactive)";
|
||||
$lang['wiscco']="Erfolgsmeldungsfarbe:";
|
||||
$lang['wisccodesc']="Lege eine Erfolgsmeldungsfarbe fest.<br>(gültiger HTML Code; muss mit # beginnen)";
|
||||
$lang['wiselcld']="selektiere User";
|
||||
$lang['wiselclddesc']="Wähle User anhand des letzt bekannten Usernamen aus. Hierfür einfach losschreiben.<br>Mehrfachselektionen sind kommagetrennt möglich, welche automatisch vorgenommen werden.<br><br>Mit den selektierten Usern kann im nächsten Schritt eine Aktion gewählt werden.";
|
||||
$lang['wishcolat']="aktive Zeit";
|
||||
$lang['wishcolatdesc']="Zeige Spalte 'ges. aktive Zeit' in der list_rankup.php";
|
||||
$lang['wishcolcld']="Client-Name";
|
||||
$lang['wishcolclddesc']="Zeige Spalte 'Client-Name' in der list_rankup.php";
|
||||
$lang['wishcoldbid']="Datenbank-ID";
|
||||
$lang['wishcoldbiddesc']="Zeige Spalte 'Client-Datenbank-ID' in der list_rankup.php";
|
||||
$lang['wishcolit']="idle Zeit";
|
||||
$lang['wishcolitdesc']="Zeige Spalte 'ges. idle Zeit' in der list_rankup.php";
|
||||
$lang['wishcolnx']="nächster rank up";
|
||||
$lang['wishcolnxdesc']="Zeige Spalte 'nächster Rang' in der list_rankup.php";
|
||||
$lang['wishcolot']="online Zeit";
|
||||
$lang['wishcolotdesc']="Zeige Spalte 'ges. online Zeit' in der list_rankup.php";
|
||||
$lang['wishcolsg']="nächste Servergruppe";
|
||||
$lang['wishcolsgdesc']="Zeige Spalte 'nächste Servergruppe' in der list_rankup.php";
|
||||
$lang['wishcoluuid']="Client-ID";
|
||||
$lang['wishcoluuiddesc']="Zeige Spalte 'eindeutige Client-ID' in der list_rankup.php";
|
||||
$lang['wishexcld']="ausgeschl. Clients";
|
||||
$lang['wishexclddesc']="Zeige User in der list_rankup.php, welche über die 'Client-Ausnahmen' nicht am Ranksystem teilnehmen.";
|
||||
$lang['wishexgrp']="ausgeschl. Servergruppen";
|
||||
$lang['wishexgrpdesc']="Zeige User in der list_rankup.php, welche über die 'Servergruppen-Ausnahmen' nicht am Ranksystem teilnehmen.";
|
||||
$lang['wishgen']="Seitengenerierung";
|
||||
$lang['wishgendesc']="Zeige die Zeit, welche zur Generierung der Seite benötigt wird, am Ende der Seite.";
|
||||
$lang['wisupidle']="Idlezeit";
|
||||
$lang['wisupidledesc']="Ist diese Funktion aktiv, wird die 'ges. idle Zeit' eines Users von der 'ges. online Zeit' abgezogen. Anstelle der 'ges. online Zeit' wird somit die vorgenannte Differenz für Rangsteigerungen herangezogen.";
|
||||
$lang['wisvconf']="speichern";
|
||||
$lang['wisvsuc']="Änderungen erfolgreich gesichert!";
|
||||
$lang['wits3host']="TS3 Hostadresse";
|
||||
$lang['wits3hostdesc']="TeamSpeak 3 Server Adresse<br>(IP oder DNS)";
|
||||
$lang['wits3qnm']="Queryname";
|
||||
$lang['wits3qnm2']="2. Queryname";
|
||||
$lang['wits3qnm2desc']="Ein zweiter Queryname, falls der erste bereits genutzt wird.";
|
||||
$lang['wits3qnmdesc']="Der Name, mit dem die Query-Verbindung augebaut werden soll.<br>Der Name kann frei gewählt werden.";
|
||||
$lang['wits3querpw']="TS3 Query-Passwort";
|
||||
$lang['wits3querpwdesc']="TeamSpeak 3 Query Passwort<br>Passwort des Query Benutzers";
|
||||
$lang['wits3querusr']="TS3 Query-Benutzer";
|
||||
$lang['wits3querusrdesc']="TeamSpeak 3 Query Benutzername<br>Standard ist serveradmin<br>Natürlich kann auch ein gesonderter Query-Benutzer erstellt und genutzt werden.<br>Die benötigten Rechte sind hier aufgelistet:<br>http://ts-n.net/ranksystem.php";
|
||||
$lang['wits3query']="TS3 Query-Port";
|
||||
$lang['wits3querydesc']="TeamSpeak 3 Query Port<br>Standard ist 10011 (TCP)<br>andere Werte sollten in der 'ts3server.ini' zu finden sein.";
|
||||
$lang['wits3voice']="TS3 Voice-Port";
|
||||
$lang['wits3voicedesc']="TeamSpeak 3 Voice Port<br>Standard ist 9987 (UDP)<br>Dieser Port wird zum Verbinden mit dem TS3 Client genutzt.";
|
||||
$lang['witxco']="Textfarbe:";
|
||||
$lang['witxcodesc']="Lege eine Textfarbe fest.<br>(gültiger HTML Code; muss mit # beginnen)";
|
||||
$lang['wiupcheck']="Update-Prüfung";
|
||||
$lang['wiupcheckdesc']="Ist die Update-Prüfung aktiv, werden nachfolgend genannte User mit einer privaten Textnachricht informiert, sobald ein Update verfügbar ist.";
|
||||
$lang['wiuptime']="Prüfungsintervall";
|
||||
$lang['wiuptimedesc']="Gib an alle wie viel Sekunden das Ranksystem prüfen soll, ob ein Update verfügbar ist.<br>Beachte, bei jeder Prüfung werden die hinterlegten User über ein verfügbares Update benachrichtigt. Ist kein hinterlegter User online, wird mit dem nächsten Intervall versucht zu benachrichtigen.";
|
||||
$lang['wiupuid']="Empfänger";
|
||||
$lang['wiupuiddesc']="Eine Komma getrennte Liste von eindeutigen Client-IDs, welche via privater Textnachricht auf dem TeamSpeak über ein Update informiert werden sollen.";
|
||||
$lang['wiversion']="(verwendete Version %s)";
|
||||
$lang['wivlang']="Sprache";
|
||||
$lang['wivlangdesc']="Sprache des Ranksystems<br><br>de - Deutsch<br>en - english<br>ru - русский";
|
||||
$lang['wiwnco']="Warntextfarbe:";
|
||||
$lang['wiwncodesc']="Lege eine Warntextfarbe fest.<br>(gültiger HTML Code; muss mit # beginnen)";
|
||||
} elseif($language=="ru") {
|
||||
$lang['adduser']="Пользователь %s (unique Client-ID: %s; Client-database-ID %s) не известен -> добавлен к Ранг Системе.";
|
||||
$lang['alrup']="Вы уже обновили свою базу данных. Пожалуйста, удалите этот файл из своего веб-сервера!";
|
||||
$lang['changedbid']="Пользователь %s (unique Client-ID: %s) got a new TeamSpeak Client-database-ID (%s). Update the old Client-database-ID (%s) and reset collected times!";
|
||||
$lang['crawl']="Сканирование активности подключенных пользователей...";
|
||||
$lang['dbconerr']="Ошибка подключения к базе данных MySQL: ";
|
||||
$lang['delclientsif']="%s Клиент(ов) удалено из базы данных Ранг Системы!";
|
||||
$lang['delclientssc']="%s Клиент(ов) успешно удалено из базы данных Ранг Системы!";
|
||||
$lang['errlogin']="Логин и/или пароль не верны! Попробуйте снова...";
|
||||
$lang['error']="Ошибка ";
|
||||
$lang['errremgrp']="Ошибка удаления пользователя с уникальным идентификатором UID: %s из сервер группы SID: %s!";
|
||||
$lang['errremdb']="Ошибка удаления пользователя с уникальным идентификатором UID % из базы данных Ранг Системы!";
|
||||
$lang['errukwn']="Произошла неизвестная ошибка!";
|
||||
$lang['errupcount']="Ошибка подсчета суммарного времени подключения %s пользователя с UCI %s";
|
||||
$lang['firstuse']="Кажется это первый запуск. Начинаю вести Исторю Пользователей...";
|
||||
$lang['instdb']="Установка Базы данных:";
|
||||
$lang['instdberr']="Ошибка создания базы данных: ";
|
||||
$lang['instdbsubm']="Создание Базы данных";
|
||||
$lang['instdbsuc']="База данных %s успешно создана.";
|
||||
$lang['insttb']="Установка таблиц:";
|
||||
$lang['insttberr']="Ошибка при установке таблиц: ";
|
||||
$lang['insttbsuc']="Таблица %s успешно создана.";
|
||||
$lang['isntwicfg']="Не получилось записать настройки базы данных! Пожалуйста установите права на запись 'dbconfig.php' chmod 0777 и попробуйте снова.";
|
||||
$lang['isntwidb']="Укажите настройки для подключения к базе данных Mysql:";
|
||||
$lang['isntwidberr']="Пожалуйста, проверьте, все ли поля были заполнены а так же корректность заполнения!";
|
||||
$lang['isntwidbhost']="Адрес Базы Данных (IP или DNS):";
|
||||
$lang['isntwidbmsg']="MySQL database says: ";
|
||||
$lang['isntwidbname']="Имя Базы Данных:";
|
||||
$lang['isntwidbpass']="Пароль Базы Данных:";
|
||||
$lang['isntwidbusr']="Пользователь Базы Данных:";
|
||||
$lang['isntwidel']="Пожалуйста удалите файл 'install.php' и файлы 'update_x-xx.php' с вашего Веб-Сервера и откройте %s для настройки Ранг Системы!";
|
||||
$lang['isntwiusr']="Пользователь Веб-Панели успешно создан.";
|
||||
$lang['isntwiusrcr']="создание доступа";
|
||||
$lang['isntwiusrdesc']="Введите имя пользователя и пароль для доступа в Веб-Панель. С помощью Веб-Панели вы сможете настроить ранг систему.";
|
||||
$lang['isntwiusrh']="Доступ - Веб-Панель";
|
||||
$lang['listcldbid']="ИД клиента в базе данных";
|
||||
$lang['listexgrp']="Will not conside for the Ranksystem (servergroup exception).";
|
||||
$lang['listexuid']="Will not conside for the Ranksystem (client exception).";
|
||||
$lang['listnick']="Ник";
|
||||
$lang['listnxsg']="следующая сервер группа";
|
||||
$lang['listnxup']="следующая rank up";
|
||||
$lang['listsuma']="сумм. время активности";
|
||||
$lang['listsumi']="сумм. время простоя";
|
||||
$lang['listsumo']="сумм. время подключения";
|
||||
$lang['listtime']="%s день(й), %s час(ов), %s мин., %s сек.";
|
||||
$lang['listuid']="уникальный ID клиента";
|
||||
$lang['nocount']="Пользователь %s (unique Client-ID: %s; Client-database-ID %s) is a query-user or is several times online (only first connection counts) -> this will not count!";
|
||||
$lang['noentry']="Записей не найдено; Для начала запустите worker.php..";
|
||||
$lang['pass']="Пароль: ";
|
||||
$lang['queryname']="Первый Queryname уже используется. Попробуйте вторым Queryname...";
|
||||
$lang['sccrmcld']="Пользователь с уникальным ID %s успешно удален из базы данных Ранг Системы.";
|
||||
$lang['sccupcount']="Пользователь с уникальным ID %s успешно переписан с итоговым временем онлайн %s.";
|
||||
$lang['setontime']="сумм. время подключения";
|
||||
$lang['setontimedesc']="Enter a new summary online time, which should be set to the previous selected clients. With this gets the old summary online overwritten.<br><br>The entered summary online time will be considered for the rank up.";
|
||||
$lang['sgrpadd']="Выдана сервер группа %s пользователю %s (unique Client-ID: %s; Client-database-ID %s).";
|
||||
$lang['sgrprerr']="Что то пошло не так, проблема с сервер группой пользователя %s (unique Client-ID: %s; Client-database-ID %s)!";
|
||||
$lang['sgrprm']="С пользователя %s (unique Client-ID: %s; Client-database-ID %s) удалена сервер-группа %s.";
|
||||
$lang['sitegen']="Сайт генерирован за %s секунд для %s пользователей.";
|
||||
$lang['updb']="You have only to run this, if you want to update the Ranksystem from an older version to %s!<br><br>Run this once time and delete the update_%s.php file after from your webserver.<br><br><br>Update Database:<br>";
|
||||
$lang['updel']="Please remove the following files from the root directory of the ranksystem, if they are still existing:<br>%s";
|
||||
$lang['upinf']="Доступна новая версия Ranksystem; Сообщите Клиентам на Сервере...";
|
||||
$lang['upmov']="Please move the \'%s\' into the subfolder \'%s\' and overwrite the existing one!";
|
||||
$lang['upmsg']="\nЭй, доступнка новая версия [B]Ранг Системы[/B]!\n\nтекущая версия: %s\n[B]новая версия: %s[/B]\n\nПожалуйста посетите наш сайт [URL]http://ts-n.net/Ranksystem.php[/URL] для получения более подробной информации.";
|
||||
$lang['upsucc']="Обновление базы данных успешно выполнено.";
|
||||
$lang['upuser']="User %s (unique Client-ID: %s; Client-database-ID %s) gets a new count (sum. online time) of %s (thereof active %s).";
|
||||
$lang['upusrerr']="The unique Client-ID %s couldn't reached on the TeamSpeak!";
|
||||
$lang['upusrinf']="Пользователь %s был успешно информирован.";
|
||||
$lang['user']="Логин: ";
|
||||
$lang['usermsgactive']="\nЭй, вы получили новый Ранг, так как были активны в течении %s дней, %s часов, %s минут и %s секунд.";
|
||||
$lang['usermsgonline']="\nЭй, вы получили новый Ранг, так как были онлайн в течении %s дней, %s часов, %s минут и %s секунд.";
|
||||
$lang['wiaction']="действие";
|
||||
$lang['wibgco']="Цвет фона:";
|
||||
$lang['wibgcodesc']="Укажите код цвета фона.<br>(только HTML код; должно начинаться с # )";
|
||||
$lang['wichdbid']="Client-database-ID reset";
|
||||
$lang['wichdbiddesc']="Reset the online time of an user, if his TeamSpeak Client-database-ID changed.<br><br>Example:<br>If a clients gets removed from the TeamSpeak server, it gets a new Client-database-ID with the next connect to the server.";
|
||||
$lang['widaform']="Формат даты";
|
||||
$lang['widaformdesc']="Выберите формат показа даты.<br><br>Пример:<br>%a дней, %h часов, %i минут, %s секунд";
|
||||
$lang['widelcld']="удаление пользователей";
|
||||
$lang['widelclddesc']="Удаление выбраных клиентов из базы данных Ранг-Системы.<br><br>Клиент непосредственно на сервере Teamspeak не будет удален.";
|
||||
$lang['widelsg']="удаление из сервер групп";
|
||||
$lang['widelsgdesc']="Choose, if the clients should also be removed out of the last known servergroup, when you delete clients out of the Ranksystem database.<br><br>Будет затронуты только те сервер группы, которые указанны в настройках Ранг Системы";
|
||||
$lang['wideltime']="Время удаления";
|
||||
$lang['wideltimedesc']="Отчистка базы данных Ранг Системы от старых клиентов.<br>Entry a time in seconds which a client was not seen to delete it.<br><br>The Userdatas on the TeamSpeak server are with this untouched!";
|
||||
$lang['wiexgrp']="Исключения сервер групп";
|
||||
$lang['wiexgrpdesc']="Укажите через запятую какие сервер группы будут игнорироваться Ранг Системой.<br>Если пользователь находится хоты бы в одной из этих групп то Ранг Система будет игнорировать его.";
|
||||
$lang['wiexuid']="Исключения CID";
|
||||
$lang['wiexuiddesc']="Укажите через запятую уникальные идентификаторы клиентов Client-IDs, которых будет игнорировать Ranksystem.<br>Пользователи в этом списке будет проигнорированы Ранг-системой.";
|
||||
$lang['wigrptime']="Ранги";
|
||||
$lang['wigrptimedesc']="Укажите через какой промежуток времени будет выданная сервер группа.<br><br>Время (в секундах)=>номер сервер группы SID<br><br>Важным условием для этого, является учет времени онлайн пользователя или если включен учет 'Время простоя'.<br><br>Каждый параметр должен разделяться запятой.<br><br>Так же время должно быть указанно по 'нарастающей'<br><br>Пример:<br>60=>9,120=>10,180=>11<br><br>По истечению 60 секунд пользователь получает сервер группу под SID 9, по истечению еще 60 секунд пользователь получает сервер группу SID 10, и так далее...";
|
||||
$lang['wihdco']="Цвет заголовка:";
|
||||
$lang['wihdcodesc']="Укажите код цвета заголовка.<br>(только HTML код; должно начинаться с # )";
|
||||
$lang['wihl']="Веб Панель - Система Рангов";
|
||||
$lang['wihlcfg']="Настройка Ядра";
|
||||
$lang['wihlclg']="редактирование клиентов (глобальное)";
|
||||
$lang['wihlcls']="редактирование клиентов (выборочное)";
|
||||
$lang['wihlsty']="Настройки стиля";
|
||||
$lang['wihlts']="Настройки TeamSpeak";
|
||||
$lang['wihvco']="Цвет Hover:";
|
||||
$lang['wihvcodesc']="Укажите код цвета hover.<br>(только HTML код; должно начинаться с # )";
|
||||
$lang['wiifco']="Цвет Текста оповещения:";
|
||||
$lang['wiifcodesc']="Укажите код цвета Текста оповещения.<br>(только HTML код; должно начинаться с # )";
|
||||
$lang['wilogout']="Выход";
|
||||
$lang['wimsgusr']="Уведомление";
|
||||
$lang['wimsgusrdesc']="Сообщение пользователю о повышение ранга.<br>Отредактируйте сообщение в 'lang.php'<br>(usermsgonline или usermsgactive)";
|
||||
$lang['wiscco']="Цвет Successtext:";
|
||||
$lang['wisccodesc']="Укажите код цвета success-text.<br>(только HTML код; должно начинаться с # )";
|
||||
$lang['wiselcld']="select clients";
|
||||
$lang['wiselclddesc']="Select the clients by the last known username. For this you only have to start typing.<br>Multiple selections are comma separated, which does the system automatically.<br><br>With the selection you can choose with the next step an action.";
|
||||
$lang['wishcolat']="Время активности";
|
||||
$lang['wishcolatdesc']="Показ колонки 'суммарное время активности' в list_rankup.php";
|
||||
$lang['wishcolcld']="Ник клиента";
|
||||
$lang['wishcolclddesc']="Показ колонки 'Ник клиента' в list_rankup.php";
|
||||
$lang['wishcoldbid']="ID в Базе данных";
|
||||
$lang['wishcoldbiddesc']="Показ колонки 'ID в Базе данных' в list_rankup.php";
|
||||
$lang['wishcolit']="Время простоя";
|
||||
$lang['wishcolitdesc']="Показ колонки 'суммарное время простоя' в list_rankup.php";
|
||||
$lang['wishcolnx']="Следующий Ранг";
|
||||
$lang['wishcolnxdesc']="Показ колонки 'Следующий Ранг' в list_rankup.php";
|
||||
$lang['wishcolot']="Время подключения";
|
||||
$lang['wishcolotdesc']="Показ колонки 'суммарное время подключения' в list_rankup.php";
|
||||
$lang['wishcolsg']="Следующая сервер группа";
|
||||
$lang['wishcolsgdesc']="Показ колонки 'следующая сервер группа' в list_rankup.php";
|
||||
$lang['wishcoluuid']="Client-ID";
|
||||
$lang['wishcoluuiddesc']="Показ колонки 'уникальный ID клиента' в list_rankup.php";
|
||||
$lang['wishexcld']="Пользователи исключения";
|
||||
$lang['wishexclddesc']="Показывать клиентов в list_rankup.php,<br>которые исключены по параметру uniqueID.";
|
||||
$lang['wishexgrp']="Группы исключения";
|
||||
$lang['wishexgrpdesc']="Show clients in list_rankup.php, which are in the list 'client exception' and shouldn't be conside for the Ranksystem.";
|
||||
$lang['wishgen']="Sitegen";
|
||||
$lang['wishgendesc']="Показывать время генерации списка в конце страницы.";
|
||||
$lang['wisupidle']="Время простоя";
|
||||
$lang['wisupidledesc']="If this function is active, the 'sum. idle time' will be substrate from the 'sum. online time'. Instead of the 'sum. online time', the previoused substration will consided for the rank up.";
|
||||
$lang['wisvconf']="сохранить";
|
||||
$lang['wisvsuc']="Изменения успешно сохранены!";
|
||||
$lang['wits3host']="TS3 Hostaddress";
|
||||
$lang['wits3hostdesc']="Адрес TeamSpeak 3 Сервера<br>(IP или DNS)";
|
||||
$lang['wits3qnm']="Queryname";
|
||||
$lang['wits3qnm2']="2е Queryname";
|
||||
$lang['wits3qnm2desc']="Это queryname, будет использоваться если первое уже занято.";
|
||||
$lang['wits3qnmdesc']="Имя, под которым будет сидеть Ранг система.<br>Убедитесь что оно не занято.";
|
||||
$lang['wits3querpw']="TS3 Query-Пароль";
|
||||
$lang['wits3querpwdesc']="TeamSpeak 3 query Пароль<br>Ваш пароль от query пользователя.";
|
||||
$lang['wits3querusr']="TS3 Query-Логин";
|
||||
$lang['wits3querusrdesc']="TeamSpeak 3 query Логин<br>По умолчанию: serveradmin<br>Конечно вы можете указать другой логин для Ranksystem.<br>Необходимые разрешения привилегий вы можете найти на:<br>http://ts-n.net/ranksystem.php";
|
||||
$lang['wits3query']="TS3 Query-Порт";
|
||||
$lang['wits3querydesc']="TeamSpeak 3 query Порт<br>По умолчанию: 10011 (TCP)<br>Если порт изменен, то укажите его согласно настройкам из 'ts3server.ini'.";
|
||||
$lang['wits3voice']="TS3 Voice-Порт";
|
||||
$lang['wits3voicedesc']="TeamSpeak 3 voice Порт<br>По умолчанию: 9987 (UDP)<br>Этот порт используется Teamspeak3 клиентом для подключения к серверу.";
|
||||
$lang['witxco']="Цвет текста:";
|
||||
$lang['witxcodesc']="Укажите код цвета текста.<br>(только HTML код; должно начинаться с # )";
|
||||
$lang['wiupcheck']="Проверка обновлений";
|
||||
$lang['wiupcheckdesc']="Если проверка обнолений включена, то пользователь получит приватное сообщение, когда обновление доступно.";
|
||||
$lang['wiuptime']="Интервал проверки";
|
||||
$lang['wiuptimedesc']="Enter here how much seconds have to gone till the Ranksystem should check for available updates.<br>Attention, for each check the listed user gets a notification. If no one of the listed users is online, the Ranksystem will try to notificate with the next interval.";
|
||||
$lang['wiupuid']="Получатель";
|
||||
$lang['wiupuiddesc']="Укажите через запятую уникальные ID клиентов, которые будут проинформированы о доступных обновлениях посредством приватного сообщения через TeamSpeak.";
|
||||
$lang['wiversion']="(текущая версия %s)";
|
||||
$lang['wivlang']="Язык";
|
||||
$lang['wivlangdesc']="Язык Ранг Системы<br><br>de - Немецкий<br>en - Английский<br>ru - Русский";
|
||||
$lang['wiwnco']="Цвет текста предупреждений:";
|
||||
$lang['wiwncodesc']="Укажите цвет текста предупреждения.<br>(только HTML код; должно начинаться с # )";
|
||||
} else {
|
||||
$lang['adduser']="User %s (unique Client-ID: %s; Client-database-ID %s) is unkown -> added to the Ranksystem now.";
|
||||
$lang['alrup']="You already updated your database. Please delete this file from your webspace!";
|
||||
$lang['changedbid']="User %s (unique Client-ID: %s) got a new TeamSpeak Client-database-ID (%s). Update the old Client-database-ID (%s) and reset collected times!";
|
||||
$lang['crawl']="Scan for connected user and count the activity...";
|
||||
$lang['dbconerr']="Failed to connect to MySQL-Database: ";
|
||||
$lang['delclientsif']="%s Clients deleted out of the Ranksystem database!";
|
||||
$lang['delclientssc']="%s Clients successfully deleted out of the Ranksystem database!";
|
||||
$lang['errlogin']="Username and/or password are incorrect! Try again...";
|
||||
$lang['error']="Error ";
|
||||
$lang['errremgrp']="Error by removing user with unique Client-ID %s out of the servergroup with servergroup-database-ID %s!";
|
||||
$lang['errremdb']="Error by removing user with unique Client-ID % out of the Ranksystem database!";
|
||||
$lang['errukwn']="Unkown error happens!";
|
||||
$lang['errupcount']="Error by renewing the summary online time of %s by user with the unique Client-ID %s";
|
||||
$lang['firstuse']="Seems to be the first run. Start logging the Userhistory...";
|
||||
$lang['instdb']="Install database:";
|
||||
$lang['instdberr']="Error by creating the database: ";
|
||||
$lang['instdbsubm']="Create database";
|
||||
$lang['instdbsuc']="Database %s successfully created.";
|
||||
$lang['insttb']="Install Tables:";
|
||||
$lang['insttberr']="Error by creating table: ";
|
||||
$lang['insttbsuc']="Table %s successfully created.";
|
||||
$lang['isntwicfg']="Can't save the database configuration! Please edit the 'other/dbconfig.php' with a chmod 0777 and try again after.";
|
||||
$lang['isntwidb']="Enter your MySQL database settings:";
|
||||
$lang['isntwidberr']="Please check, if you filled out all fields and the values are correctly!";
|
||||
$lang['isntwidbhost']="Database hostaddress (IP or DNS):";
|
||||
$lang['isntwidbmsg']="MySQL database says: ";
|
||||
$lang['isntwidbname']="Database name:";
|
||||
$lang['isntwidbpass']="Database password:";
|
||||
$lang['isntwidbusr']="Database user:";
|
||||
$lang['isntwidel']="Please delete the file 'install.php' and all 'update_x-xx.php' files from your webserver and open the %s to config the Ranksystem!";
|
||||
$lang['isntwiusr']="User for the webinterface successfully created.";
|
||||
$lang['isntwiusrcr']="create access";
|
||||
$lang['isntwiusrdesc']="Enter an username and password for access the webinterface. With the webinterface you can configurate the ranksytem.";
|
||||
$lang['isntwiusrh']="Access - Webinterface";
|
||||
$lang['listcldbid']="Client-database-ID";
|
||||
$lang['listexgrp']="Will not conside for the Ranksystem (servergroup exception).";
|
||||
$lang['listexuid']="Will not conside for the Ranksystem (client exception).";
|
||||
$lang['listnick']="Clientname";
|
||||
$lang['listnxsg']="next servergroup";
|
||||
$lang['listnxup']="next rank up";
|
||||
$lang['listsuma']="sum. active time";
|
||||
$lang['listsumi']="sum. idle time";
|
||||
$lang['listsumo']="sum. online time";
|
||||
$lang['listtime']="%s day(s), %s hour(s), %s min., %s sec.";
|
||||
$lang['listuid']="unique Client-ID";
|
||||
$lang['nocount']="User %s (unique Client-ID: %s; Client-database-ID %s) is a query-user or is several times online (only first connection counts) -> this will not count!";
|
||||
$lang['noentry']="No entries found; try to run the worker.php first..";
|
||||
$lang['pass']="Password: ";
|
||||
$lang['queryname']="First Queryname already in use. Try with second Queryname...";
|
||||
$lang['sccrmcld']="User with unique Client-ID %s successfull removed out of the Ranksystem database.";
|
||||
$lang['sccupcount']="User with the unique Client-ID %s successfull overwritten with a summary online time of %s.";
|
||||
$lang['setontime']="sum. online time";
|
||||
$lang['setontimedesc']="Enter a new summary online time, which should be set to the previous selected clients. With this gets the old summary online overwritten.<br><br>The entered summary online time will be considered for the rank up.";
|
||||
$lang['sgrpadd']="Grant servergroup %s to user %s (unique Client-ID: %s; Client-database-ID %s).";
|
||||
$lang['sgrprerr']="It happened a problem with the servergroup of the user %s (unique Client-ID: %s; Client-database-ID %s)!";
|
||||
$lang['sgrprm']="Removed servergroup %s from user %s (unique Client-ID: %s; Client-database-ID %s).";
|
||||
$lang['sitegen']="Site generated in %s seconds with %s clients.";
|
||||
$lang['updb']="You have only to run this, if you want to update the Ranksystem from an older version to %s!<br><br>Run this once time and delete the update_%s.php file after from your webserver.<br><br><br>Update Database:<br>";
|
||||
$lang['updel']="Please remove the following files from the root directory of the ranksystem, if they are still existing:<br>%s";
|
||||
$lang['upinf']="A new Version of the Ranksystem is available; Inform Clients on Server...";
|
||||
$lang['upmov']="Please move the \'%s\' into the subfolder \'%s\' and overwrite the existing one!";
|
||||
$lang['upmsg']="\nHey, a new version of the [B]Ranksystem[/B] is available!\n\ncurrent version: %s\n[B]new version: %s[/B]\n\nPlease check out our site for more informations [URL]http://ts-n.net/Ranksystem.php[/URL].";
|
||||
$lang['upsucc']="Database update successfully executed.";
|
||||
$lang['upuser']="User %s (unique Client-ID: %s; Client-database-ID %s) gets a new count (sum. online time) of %s (thereof active %s).";
|
||||
$lang['upusrerr']="The unique Client-ID %s couldn't reached on the TeamSpeak!";
|
||||
$lang['upusrinf']="User %s was successfully informed.";
|
||||
$lang['user']="Username: ";
|
||||
$lang['usermsgactive']="\nHey, you got a rank up, cause you reached an activity of %s days, %s hours, %s minutes and %s seconds.";
|
||||
$lang['usermsgonline']="\nHey, you got a rank up, cause you reached an online time of %s days, %s hours, %s minutes and %s seconds.";
|
||||
$lang['wiaction']="action";
|
||||
$lang['wibgco']="Background color:";
|
||||
$lang['wibgcodesc']="Define a background color.<br>(valid HTML Code; have to beginn with # )";
|
||||
$lang['wichdbid']="Client-database-ID reset";
|
||||
$lang['wichdbiddesc']="Reset the online time of an user, if his TeamSpeak Client-database-ID changed.<br><br>Example:<br>If a clients gets removed from the TeamSpeak server, it gets a new Client-database-ID with the next connect to the server.";
|
||||
$lang['widaform']="Date format";
|
||||
$lang['widaformdesc']="Choose the showing date format.<br><br>Example:<br>%a days, %h hours, %i mins, %s secs";
|
||||
$lang['widelcld']="delete clients";
|
||||
$lang['widelclddesc']="Delete the before selected clients out of the Ranksystem database.<br><br>With this deletion are the clients on the TeamSpeak Server untouched.";
|
||||
$lang['widelsg']="remove out of servergroups";
|
||||
$lang['widelsgdesc']="Choose, if the clients should also be removed out of the last known servergroup, when you delete clients out of the Ranksystem database.<br><br>It will only considered servergroups, which concerned the Ranksystem";
|
||||
$lang['wideltime']="Deletiontime";
|
||||
$lang['wideltimedesc']="Clean old clients out of the Ranksystem database.<br>Entry a time in seconds which a client was not seen to delete it.<br><br>The Userdatas on the TeamSpeak server are with this untouched!";
|
||||
$lang['wiexgrp']="servergroup exception";
|
||||
$lang['wiexgrpdesc']="A comma seperate list of servergroup-IDs, which should not conside for the Ranksystem.<br>User in at least one of this servergroups IDs will be ignored for the rank up.";
|
||||
$lang['wiexuid']="client exception";
|
||||
$lang['wiexuiddesc']="A comma seperate list of unique Client-IDs, which should not conside for the Ranksystem.<br>User in this list will be ignored for the rank up.";
|
||||
$lang['wigrptime']="rank up";
|
||||
$lang['wigrptimedesc']="Define here after which time a user should get automatically a predefined servergroup.<br><br>time (seconds)=>servergroup ID<br><br>Important for this is the online time of an user or if 'Idletime' is active, the active time.<br><br>Each entry have to separate from next with a comma.<br><br>The time must be entered cumulative<br><br>Example:<br>60=>9,120=>10,180=>11<br><br>On this a user get after 60 seconds the servergroup 9, in turn after 60 seconds the servergroup 10, and so on...";
|
||||
$lang['wihdco']="Headline color:";
|
||||
$lang['wihdcodesc']="Define a headline color.<br>(valid HTML Code; have to beginn with # )";
|
||||
$lang['wihl']="Webinterface - Ranksystem";
|
||||
$lang['wihlcfg']="Core Settings";
|
||||
$lang['wihlclg']="edit clients (global)";
|
||||
$lang['wihlcls']="edit clients (selective)";
|
||||
$lang['wihlsty']="Style Settings";
|
||||
$lang['wihlts']="TeamSpeak Settings";
|
||||
$lang['wihvco']="Hover color:";
|
||||
$lang['wihvcodesc']="Define a hover color.<br>(valid HTML Code; have to beginn with # )";
|
||||
$lang['wiifco']="Infotext color:";
|
||||
$lang['wiifcodesc']="Define a info-text color.<br>(valid HTML Code; have to beginn with # )";
|
||||
$lang['wilogout']="LogOut";
|
||||
$lang['wimsgusr']="Notification";
|
||||
$lang['wimsgusrdesc']="Inform an user with a private text message about his rank up.<br>Define the message in 'lang.php'<br>(usermsgonline or usermsgactive)";
|
||||
$lang['wiscco']="Successtext color:";
|
||||
$lang['wisccodesc']="Define a success-text color.<br>(valid HTML Code; have to beginn with # )";
|
||||
$lang['wiselcld']="select clients";
|
||||
$lang['wiselclddesc']="Select the clients by the last known username. For this you only have to start typing.<br>Multiple selections are comma separated, which does the system automatically.<br><br>With the selection you can choose with the next step an action.";
|
||||
$lang['wishcolat']="active time";
|
||||
$lang['wishcolatdesc']="Show column 'sum. active time' in list_rankup.php";
|
||||
$lang['wishcolcld']="Client-name";
|
||||
$lang['wishcolclddesc']="Show column 'Client-name' in list_rankup.php";
|
||||
$lang['wishcoldbid']="database-ID";
|
||||
$lang['wishcoldbiddesc']="Show column 'Client-database-ID' in list_rankup.php";
|
||||
$lang['wishcolit']="idle time";
|
||||
$lang['wishcolitdesc']="Show column 'sum idle time' in list_rankup.php";
|
||||
$lang['wishcolnx']="next rank up";
|
||||
$lang['wishcolnxdesc']="Show column 'next rank up' in list_rankup.php";
|
||||
$lang['wishcolot']="online time";
|
||||
$lang['wishcolotdesc']="Show column 'sum. online time' in list_rankup.php";
|
||||
$lang['wishcolsg']="next servergroup";
|
||||
$lang['wishcolsgdesc']="Show column 'next servergroup' in list_rankup.php";
|
||||
$lang['wishcoluuid']="Client-ID";
|
||||
$lang['wishcoluuiddesc']="Show column 'unique Client-ID' in list_rankup.php";
|
||||
$lang['wishexcld']="excepted client";
|
||||
$lang['wishexclddesc']="Show clients in list_rankup.php,<br>which are excepted by his uniqueID.";
|
||||
$lang['wishexgrp']="excepted groups";
|
||||
$lang['wishexgrpdesc']="Show clients in list_rankup.php, which are in the list 'client exception' and shouldn't be conside for the Ranksystem.";
|
||||
$lang['wishgen']="Sitegen";
|
||||
$lang['wishgendesc']="Show the needed time for the generation of the site at the end of the site.";
|
||||
$lang['wisupidle']="Idletime";
|
||||
$lang['wisupidledesc']="If this function is active, the 'sum. idle time' will be substrate from the 'sum. online time'. Instead of the 'sum. online time', the previoused substration will consided for the rank up.";
|
||||
$lang['wisvconf']="save";
|
||||
$lang['wisvsuc']="Changes successfully saved!";
|
||||
$lang['wits3host']="TS3 Hostaddress";
|
||||
$lang['wits3hostdesc']="TeamSpeak 3 Server address<br>(IP oder DNS)";
|
||||
$lang['wits3qnm']="Queryname";
|
||||
$lang['wits3qnm2']="2nd Queryname";
|
||||
$lang['wits3qnm2desc']="A fallback queryname, if the first one is already in use.";
|
||||
$lang['wits3qnmdesc']="The name, with this the query-connection will be established.<br>You can name it free.";
|
||||
$lang['wits3querpw']="TS3 Query-Password";
|
||||
$lang['wits3querpwdesc']="TeamSpeak 3 query password<br>Password for the query user.";
|
||||
$lang['wits3querusr']="TS3 Query-User";
|
||||
$lang['wits3querusrdesc']="TeamSpeak 3 query username<br>Default is serveradmin<br>Of course, you can also create an additional serverquery account only for the Ranksystem.<br>The needed permissions you find on:<br>http://ts-n.net/ranksystem.php";
|
||||
$lang['wits3query']="TS3 Query-Port";
|
||||
$lang['wits3querydesc']="TeamSpeak 3 query port<br>Default is 10011 (TCP)<br>If its not default, you should find it in your 'ts3server.ini'.";
|
||||
$lang['wits3voice']="TS3 Voice-Port";
|
||||
$lang['wits3voicedesc']="TeamSpeak 3 voice port<br>Default is 9987 (UDP)<br>This is the port, you uses also to connect with the TS3 Client.";
|
||||
$lang['witxco']="Text color:";
|
||||
$lang['witxcodesc']="Define a text color.<br>(valid HTML Code; have to beginn with # )";
|
||||
$lang['wiupcheck']="Update-Check";
|
||||
$lang['wiupcheckdesc']="If the Update-Check is enable, the listed user gets a notification with a private text message, once an update is available.";
|
||||
$lang['wiuptime']="Checkinterval";
|
||||
$lang['wiuptimedesc']="Enter here how much seconds have to gone till the Ranksystem should check for available updates.<br>Attention, for each check the listed user gets a notification. If no one of the listed users is online, the Ranksystem will try to notificate with the next interval.";
|
||||
$lang['wiupuid']="Recipient";
|
||||
$lang['wiupuiddesc']="A comma separate list of unique Client-IDs, which shoud be informed on the TeamSpeak via private message for available updates.";
|
||||
$lang['wiversion']="(current version %s)";
|
||||
$lang['wivlang']="Language";
|
||||
$lang['wivlangdesc']="Language for the Ranksystem<br><br>de - Deutsch<br>en - English<br>ru - русский";
|
||||
$lang['wiwnco']="Warntext color:";
|
||||
$lang['wiwncodesc']="Define a warntext color.<br>(valid HTML Code; have to beginn with # )";
|
||||
}
|
||||
674
license.txt
Normal file
674
license.txt
Normal file
@@ -0,0 +1,674 @@
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
Version 3, 29 June 2007
|
||||
|
||||
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
Preamble
|
||||
|
||||
The GNU General Public License is a free, copyleft license for
|
||||
software and other kinds of works.
|
||||
|
||||
The licenses for most software and other practical works are designed
|
||||
to take away your freedom to share and change the works. By contrast,
|
||||
the GNU General Public License is intended to guarantee your freedom to
|
||||
share and change all versions of a program--to make sure it remains free
|
||||
software for all its users. We, the Free Software Foundation, use the
|
||||
GNU General Public License for most of our software; it applies also to
|
||||
any other work released this way by its authors. You can apply it to
|
||||
your programs, too.
|
||||
|
||||
When we speak of free software, we are referring to freedom, not
|
||||
price. Our General Public Licenses are designed to make sure that you
|
||||
have the freedom to distribute copies of free software (and charge for
|
||||
them if you wish), that you receive source code or can get it if you
|
||||
want it, that you can change the software or use pieces of it in new
|
||||
free programs, and that you know you can do these things.
|
||||
|
||||
To protect your rights, we need to prevent others from denying you
|
||||
these rights or asking you to surrender the rights. Therefore, you have
|
||||
certain responsibilities if you distribute copies of the software, or if
|
||||
you modify it: responsibilities to respect the freedom of others.
|
||||
|
||||
For example, if you distribute copies of such a program, whether
|
||||
gratis or for a fee, you must pass on to the recipients the same
|
||||
freedoms that you received. You must make sure that they, too, receive
|
||||
or can get the source code. And you must show them these terms so they
|
||||
know their rights.
|
||||
|
||||
Developers that use the GNU GPL protect your rights with two steps:
|
||||
(1) assert copyright on the software, and (2) offer you this License
|
||||
giving you legal permission to copy, distribute and/or modify it.
|
||||
|
||||
For the developers' and authors' protection, the GPL clearly explains
|
||||
that there is no warranty for this free software. For both users' and
|
||||
authors' sake, the GPL requires that modified versions be marked as
|
||||
changed, so that their problems will not be attributed erroneously to
|
||||
authors of previous versions.
|
||||
|
||||
Some devices are designed to deny users access to install or run
|
||||
modified versions of the software inside them, although the manufacturer
|
||||
can do so. This is fundamentally incompatible with the aim of
|
||||
protecting users' freedom to change the software. The systematic
|
||||
pattern of such abuse occurs in the area of products for individuals to
|
||||
use, which is precisely where it is most unacceptable. Therefore, we
|
||||
have designed this version of the GPL to prohibit the practice for those
|
||||
products. If such problems arise substantially in other domains, we
|
||||
stand ready to extend this provision to those domains in future versions
|
||||
of the GPL, as needed to protect the freedom of users.
|
||||
|
||||
Finally, every program is threatened constantly by software patents.
|
||||
States should not allow patents to restrict development and use of
|
||||
software on general-purpose computers, but in those that do, we wish to
|
||||
avoid the special danger that patents applied to a free program could
|
||||
make it effectively proprietary. To prevent this, the GPL assures that
|
||||
patents cannot be used to render the program non-free.
|
||||
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow.
|
||||
|
||||
TERMS AND CONDITIONS
|
||||
|
||||
0. Definitions.
|
||||
|
||||
"This License" refers to version 3 of the GNU General Public License.
|
||||
|
||||
"Copyright" also means copyright-like laws that apply to other kinds of
|
||||
works, such as semiconductor masks.
|
||||
|
||||
"The Program" refers to any copyrightable work licensed under this
|
||||
License. Each licensee is addressed as "you". "Licensees" and
|
||||
"recipients" may be individuals or organizations.
|
||||
|
||||
To "modify" a work means to copy from or adapt all or part of the work
|
||||
in a fashion requiring copyright permission, other than the making of an
|
||||
exact copy. The resulting work is called a "modified version" of the
|
||||
earlier work or a work "based on" the earlier work.
|
||||
|
||||
A "covered work" means either the unmodified Program or a work based
|
||||
on the Program.
|
||||
|
||||
To "propagate" a work means to do anything with it that, without
|
||||
permission, would make you directly or secondarily liable for
|
||||
infringement under applicable copyright law, except executing it on a
|
||||
computer or modifying a private copy. Propagation includes copying,
|
||||
distribution (with or without modification), making available to the
|
||||
public, and in some countries other activities as well.
|
||||
|
||||
To "convey" a work means any kind of propagation that enables other
|
||||
parties to make or receive copies. Mere interaction with a user through
|
||||
a computer network, with no transfer of a copy, is not conveying.
|
||||
|
||||
An interactive user interface displays "Appropriate Legal Notices"
|
||||
to the extent that it includes a convenient and prominently visible
|
||||
feature that (1) displays an appropriate copyright notice, and (2)
|
||||
tells the user that there is no warranty for the work (except to the
|
||||
extent that warranties are provided), that licensees may convey the
|
||||
work under this License, and how to view a copy of this License. If
|
||||
the interface presents a list of user commands or options, such as a
|
||||
menu, a prominent item in the list meets this criterion.
|
||||
|
||||
1. Source Code.
|
||||
|
||||
The "source code" for a work means the preferred form of the work
|
||||
for making modifications to it. "Object code" means any non-source
|
||||
form of a work.
|
||||
|
||||
A "Standard Interface" means an interface that either is an official
|
||||
standard defined by a recognized standards body, or, in the case of
|
||||
interfaces specified for a particular programming language, one that
|
||||
is widely used among developers working in that language.
|
||||
|
||||
The "System Libraries" of an executable work include anything, other
|
||||
than the work as a whole, that (a) is included in the normal form of
|
||||
packaging a Major Component, but which is not part of that Major
|
||||
Component, and (b) serves only to enable use of the work with that
|
||||
Major Component, or to implement a Standard Interface for which an
|
||||
implementation is available to the public in source code form. A
|
||||
"Major Component", in this context, means a major essential component
|
||||
(kernel, window system, and so on) of the specific operating system
|
||||
(if any) on which the executable work runs, or a compiler used to
|
||||
produce the work, or an object code interpreter used to run it.
|
||||
|
||||
The "Corresponding Source" for a work in object code form means all
|
||||
the source code needed to generate, install, and (for an executable
|
||||
work) run the object code and to modify the work, including scripts to
|
||||
control those activities. However, it does not include the work's
|
||||
System Libraries, or general-purpose tools or generally available free
|
||||
programs which are used unmodified in performing those activities but
|
||||
which are not part of the work. For example, Corresponding Source
|
||||
includes interface definition files associated with source files for
|
||||
the work, and the source code for shared libraries and dynamically
|
||||
linked subprograms that the work is specifically designed to require,
|
||||
such as by intimate data communication or control flow between those
|
||||
subprograms and other parts of the work.
|
||||
|
||||
The Corresponding Source need not include anything that users
|
||||
can regenerate automatically from other parts of the Corresponding
|
||||
Source.
|
||||
|
||||
The Corresponding Source for a work in source code form is that
|
||||
same work.
|
||||
|
||||
2. Basic Permissions.
|
||||
|
||||
All rights granted under this License are granted for the term of
|
||||
copyright on the Program, and are irrevocable provided the stated
|
||||
conditions are met. This License explicitly affirms your unlimited
|
||||
permission to run the unmodified Program. The output from running a
|
||||
covered work is covered by this License only if the output, given its
|
||||
content, constitutes a covered work. This License acknowledges your
|
||||
rights of fair use or other equivalent, as provided by copyright law.
|
||||
|
||||
You may make, run and propagate covered works that you do not
|
||||
convey, without conditions so long as your license otherwise remains
|
||||
in force. You may convey covered works to others for the sole purpose
|
||||
of having them make modifications exclusively for you, or provide you
|
||||
with facilities for running those works, provided that you comply with
|
||||
the terms of this License in conveying all material for which you do
|
||||
not control copyright. Those thus making or running the covered works
|
||||
for you must do so exclusively on your behalf, under your direction
|
||||
and control, on terms that prohibit them from making any copies of
|
||||
your copyrighted material outside their relationship with you.
|
||||
|
||||
Conveying under any other circumstances is permitted solely under
|
||||
the conditions stated below. Sublicensing is not allowed; section 10
|
||||
makes it unnecessary.
|
||||
|
||||
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
|
||||
|
||||
No covered work shall be deemed part of an effective technological
|
||||
measure under any applicable law fulfilling obligations under article
|
||||
11 of the WIPO copyright treaty adopted on 20 December 1996, or
|
||||
similar laws prohibiting or restricting circumvention of such
|
||||
measures.
|
||||
|
||||
When you convey a covered work, you waive any legal power to forbid
|
||||
circumvention of technological measures to the extent such circumvention
|
||||
is effected by exercising rights under this License with respect to
|
||||
the covered work, and you disclaim any intention to limit operation or
|
||||
modification of the work as a means of enforcing, against the work's
|
||||
users, your or third parties' legal rights to forbid circumvention of
|
||||
technological measures.
|
||||
|
||||
4. Conveying Verbatim Copies.
|
||||
|
||||
You may convey verbatim copies of the Program's source code as you
|
||||
receive it, in any medium, provided that you conspicuously and
|
||||
appropriately publish on each copy an appropriate copyright notice;
|
||||
keep intact all notices stating that this License and any
|
||||
non-permissive terms added in accord with section 7 apply to the code;
|
||||
keep intact all notices of the absence of any warranty; and give all
|
||||
recipients a copy of this License along with the Program.
|
||||
|
||||
You may charge any price or no price for each copy that you convey,
|
||||
and you may offer support or warranty protection for a fee.
|
||||
|
||||
5. Conveying Modified Source Versions.
|
||||
|
||||
You may convey a work based on the Program, or the modifications to
|
||||
produce it from the Program, in the form of source code under the
|
||||
terms of section 4, provided that you also meet all of these conditions:
|
||||
|
||||
a) The work must carry prominent notices stating that you modified
|
||||
it, and giving a relevant date.
|
||||
|
||||
b) The work must carry prominent notices stating that it is
|
||||
released under this License and any conditions added under section
|
||||
7. This requirement modifies the requirement in section 4 to
|
||||
"keep intact all notices".
|
||||
|
||||
c) You must license the entire work, as a whole, under this
|
||||
License to anyone who comes into possession of a copy. This
|
||||
License will therefore apply, along with any applicable section 7
|
||||
additional terms, to the whole of the work, and all its parts,
|
||||
regardless of how they are packaged. This License gives no
|
||||
permission to license the work in any other way, but it does not
|
||||
invalidate such permission if you have separately received it.
|
||||
|
||||
d) If the work has interactive user interfaces, each must display
|
||||
Appropriate Legal Notices; however, if the Program has interactive
|
||||
interfaces that do not display Appropriate Legal Notices, your
|
||||
work need not make them do so.
|
||||
|
||||
A compilation of a covered work with other separate and independent
|
||||
works, which are not by their nature extensions of the covered work,
|
||||
and which are not combined with it such as to form a larger program,
|
||||
in or on a volume of a storage or distribution medium, is called an
|
||||
"aggregate" if the compilation and its resulting copyright are not
|
||||
used to limit the access or legal rights of the compilation's users
|
||||
beyond what the individual works permit. Inclusion of a covered work
|
||||
in an aggregate does not cause this License to apply to the other
|
||||
parts of the aggregate.
|
||||
|
||||
6. Conveying Non-Source Forms.
|
||||
|
||||
You may convey a covered work in object code form under the terms
|
||||
of sections 4 and 5, provided that you also convey the
|
||||
machine-readable Corresponding Source under the terms of this License,
|
||||
in one of these ways:
|
||||
|
||||
a) Convey the object code in, or embodied in, a physical product
|
||||
(including a physical distribution medium), accompanied by the
|
||||
Corresponding Source fixed on a durable physical medium
|
||||
customarily used for software interchange.
|
||||
|
||||
b) Convey the object code in, or embodied in, a physical product
|
||||
(including a physical distribution medium), accompanied by a
|
||||
written offer, valid for at least three years and valid for as
|
||||
long as you offer spare parts or customer support for that product
|
||||
model, to give anyone who possesses the object code either (1) a
|
||||
copy of the Corresponding Source for all the software in the
|
||||
product that is covered by this License, on a durable physical
|
||||
medium customarily used for software interchange, for a price no
|
||||
more than your reasonable cost of physically performing this
|
||||
conveying of source, or (2) access to copy the
|
||||
Corresponding Source from a network server at no charge.
|
||||
|
||||
c) Convey individual copies of the object code with a copy of the
|
||||
written offer to provide the Corresponding Source. This
|
||||
alternative is allowed only occasionally and noncommercially, and
|
||||
only if you received the object code with such an offer, in accord
|
||||
with subsection 6b.
|
||||
|
||||
d) Convey the object code by offering access from a designated
|
||||
place (gratis or for a charge), and offer equivalent access to the
|
||||
Corresponding Source in the same way through the same place at no
|
||||
further charge. You need not require recipients to copy the
|
||||
Corresponding Source along with the object code. If the place to
|
||||
copy the object code is a network server, the Corresponding Source
|
||||
may be on a different server (operated by you or a third party)
|
||||
that supports equivalent copying facilities, provided you maintain
|
||||
clear directions next to the object code saying where to find the
|
||||
Corresponding Source. Regardless of what server hosts the
|
||||
Corresponding Source, you remain obligated to ensure that it is
|
||||
available for as long as needed to satisfy these requirements.
|
||||
|
||||
e) Convey the object code using peer-to-peer transmission, provided
|
||||
you inform other peers where the object code and Corresponding
|
||||
Source of the work are being offered to the general public at no
|
||||
charge under subsection 6d.
|
||||
|
||||
A separable portion of the object code, whose source code is excluded
|
||||
from the Corresponding Source as a System Library, need not be
|
||||
included in conveying the object code work.
|
||||
|
||||
A "User Product" is either (1) a "consumer product", which means any
|
||||
tangible personal property which is normally used for personal, family,
|
||||
or household purposes, or (2) anything designed or sold for incorporation
|
||||
into a dwelling. In determining whether a product is a consumer product,
|
||||
doubtful cases shall be resolved in favor of coverage. For a particular
|
||||
product received by a particular user, "normally used" refers to a
|
||||
typical or common use of that class of product, regardless of the status
|
||||
of the particular user or of the way in which the particular user
|
||||
actually uses, or expects or is expected to use, the product. A product
|
||||
is a consumer product regardless of whether the product has substantial
|
||||
commercial, industrial or non-consumer uses, unless such uses represent
|
||||
the only significant mode of use of the product.
|
||||
|
||||
"Installation Information" for a User Product means any methods,
|
||||
procedures, authorization keys, or other information required to install
|
||||
and execute modified versions of a covered work in that User Product from
|
||||
a modified version of its Corresponding Source. The information must
|
||||
suffice to ensure that the continued functioning of the modified object
|
||||
code is in no case prevented or interfered with solely because
|
||||
modification has been made.
|
||||
|
||||
If you convey an object code work under this section in, or with, or
|
||||
specifically for use in, a User Product, and the conveying occurs as
|
||||
part of a transaction in which the right of possession and use of the
|
||||
User Product is transferred to the recipient in perpetuity or for a
|
||||
fixed term (regardless of how the transaction is characterized), the
|
||||
Corresponding Source conveyed under this section must be accompanied
|
||||
by the Installation Information. But this requirement does not apply
|
||||
if neither you nor any third party retains the ability to install
|
||||
modified object code on the User Product (for example, the work has
|
||||
been installed in ROM).
|
||||
|
||||
The requirement to provide Installation Information does not include a
|
||||
requirement to continue to provide support service, warranty, or updates
|
||||
for a work that has been modified or installed by the recipient, or for
|
||||
the User Product in which it has been modified or installed. Access to a
|
||||
network may be denied when the modification itself materially and
|
||||
adversely affects the operation of the network or violates the rules and
|
||||
protocols for communication across the network.
|
||||
|
||||
Corresponding Source conveyed, and Installation Information provided,
|
||||
in accord with this section must be in a format that is publicly
|
||||
documented (and with an implementation available to the public in
|
||||
source code form), and must require no special password or key for
|
||||
unpacking, reading or copying.
|
||||
|
||||
7. Additional Terms.
|
||||
|
||||
"Additional permissions" are terms that supplement the terms of this
|
||||
License by making exceptions from one or more of its conditions.
|
||||
Additional permissions that are applicable to the entire Program shall
|
||||
be treated as though they were included in this License, to the extent
|
||||
that they are valid under applicable law. If additional permissions
|
||||
apply only to part of the Program, that part may be used separately
|
||||
under those permissions, but the entire Program remains governed by
|
||||
this License without regard to the additional permissions.
|
||||
|
||||
When you convey a copy of a covered work, you may at your option
|
||||
remove any additional permissions from that copy, or from any part of
|
||||
it. (Additional permissions may be written to require their own
|
||||
removal in certain cases when you modify the work.) You may place
|
||||
additional permissions on material, added by you to a covered work,
|
||||
for which you have or can give appropriate copyright permission.
|
||||
|
||||
Notwithstanding any other provision of this License, for material you
|
||||
add to a covered work, you may (if authorized by the copyright holders of
|
||||
that material) supplement the terms of this License with terms:
|
||||
|
||||
a) Disclaiming warranty or limiting liability differently from the
|
||||
terms of sections 15 and 16 of this License; or
|
||||
|
||||
b) Requiring preservation of specified reasonable legal notices or
|
||||
author attributions in that material or in the Appropriate Legal
|
||||
Notices displayed by works containing it; or
|
||||
|
||||
c) Prohibiting misrepresentation of the origin of that material, or
|
||||
requiring that modified versions of such material be marked in
|
||||
reasonable ways as different from the original version; or
|
||||
|
||||
d) Limiting the use for publicity purposes of names of licensors or
|
||||
authors of the material; or
|
||||
|
||||
e) Declining to grant rights under trademark law for use of some
|
||||
trade names, trademarks, or service marks; or
|
||||
|
||||
f) Requiring indemnification of licensors and authors of that
|
||||
material by anyone who conveys the material (or modified versions of
|
||||
it) with contractual assumptions of liability to the recipient, for
|
||||
any liability that these contractual assumptions directly impose on
|
||||
those licensors and authors.
|
||||
|
||||
All other non-permissive additional terms are considered "further
|
||||
restrictions" within the meaning of section 10. If the Program as you
|
||||
received it, or any part of it, contains a notice stating that it is
|
||||
governed by this License along with a term that is a further
|
||||
restriction, you may remove that term. If a license document contains
|
||||
a further restriction but permits relicensing or conveying under this
|
||||
License, you may add to a covered work material governed by the terms
|
||||
of that license document, provided that the further restriction does
|
||||
not survive such relicensing or conveying.
|
||||
|
||||
If you add terms to a covered work in accord with this section, you
|
||||
must place, in the relevant source files, a statement of the
|
||||
additional terms that apply to those files, or a notice indicating
|
||||
where to find the applicable terms.
|
||||
|
||||
Additional terms, permissive or non-permissive, may be stated in the
|
||||
form of a separately written license, or stated as exceptions;
|
||||
the above requirements apply either way.
|
||||
|
||||
8. Termination.
|
||||
|
||||
You may not propagate or modify a covered work except as expressly
|
||||
provided under this License. Any attempt otherwise to propagate or
|
||||
modify it is void, and will automatically terminate your rights under
|
||||
this License (including any patent licenses granted under the third
|
||||
paragraph of section 11).
|
||||
|
||||
However, if you cease all violation of this License, then your
|
||||
license from a particular copyright holder is reinstated (a)
|
||||
provisionally, unless and until the copyright holder explicitly and
|
||||
finally terminates your license, and (b) permanently, if the copyright
|
||||
holder fails to notify you of the violation by some reasonable means
|
||||
prior to 60 days after the cessation.
|
||||
|
||||
Moreover, your license from a particular copyright holder is
|
||||
reinstated permanently if the copyright holder notifies you of the
|
||||
violation by some reasonable means, this is the first time you have
|
||||
received notice of violation of this License (for any work) from that
|
||||
copyright holder, and you cure the violation prior to 30 days after
|
||||
your receipt of the notice.
|
||||
|
||||
Termination of your rights under this section does not terminate the
|
||||
licenses of parties who have received copies or rights from you under
|
||||
this License. If your rights have been terminated and not permanently
|
||||
reinstated, you do not qualify to receive new licenses for the same
|
||||
material under section 10.
|
||||
|
||||
9. Acceptance Not Required for Having Copies.
|
||||
|
||||
You are not required to accept this License in order to receive or
|
||||
run a copy of the Program. Ancillary propagation of a covered work
|
||||
occurring solely as a consequence of using peer-to-peer transmission
|
||||
to receive a copy likewise does not require acceptance. However,
|
||||
nothing other than this License grants you permission to propagate or
|
||||
modify any covered work. These actions infringe copyright if you do
|
||||
not accept this License. Therefore, by modifying or propagating a
|
||||
covered work, you indicate your acceptance of this License to do so.
|
||||
|
||||
10. Automatic Licensing of Downstream Recipients.
|
||||
|
||||
Each time you convey a covered work, the recipient automatically
|
||||
receives a license from the original licensors, to run, modify and
|
||||
propagate that work, subject to this License. You are not responsible
|
||||
for enforcing compliance by third parties with this License.
|
||||
|
||||
An "entity transaction" is a transaction transferring control of an
|
||||
organization, or substantially all assets of one, or subdividing an
|
||||
organization, or merging organizations. If propagation of a covered
|
||||
work results from an entity transaction, each party to that
|
||||
transaction who receives a copy of the work also receives whatever
|
||||
licenses to the work the party's predecessor in interest had or could
|
||||
give under the previous paragraph, plus a right to possession of the
|
||||
Corresponding Source of the work from the predecessor in interest, if
|
||||
the predecessor has it or can get it with reasonable efforts.
|
||||
|
||||
You may not impose any further restrictions on the exercise of the
|
||||
rights granted or affirmed under this License. For example, you may
|
||||
not impose a license fee, royalty, or other charge for exercise of
|
||||
rights granted under this License, and you may not initiate litigation
|
||||
(including a cross-claim or counterclaim in a lawsuit) alleging that
|
||||
any patent claim is infringed by making, using, selling, offering for
|
||||
sale, or importing the Program or any portion of it.
|
||||
|
||||
11. Patents.
|
||||
|
||||
A "contributor" is a copyright holder who authorizes use under this
|
||||
License of the Program or a work on which the Program is based. The
|
||||
work thus licensed is called the contributor's "contributor version".
|
||||
|
||||
A contributor's "essential patent claims" are all patent claims
|
||||
owned or controlled by the contributor, whether already acquired or
|
||||
hereafter acquired, that would be infringed by some manner, permitted
|
||||
by this License, of making, using, or selling its contributor version,
|
||||
but do not include claims that would be infringed only as a
|
||||
consequence of further modification of the contributor version. For
|
||||
purposes of this definition, "control" includes the right to grant
|
||||
patent sublicenses in a manner consistent with the requirements of
|
||||
this License.
|
||||
|
||||
Each contributor grants you a non-exclusive, worldwide, royalty-free
|
||||
patent license under the contributor's essential patent claims, to
|
||||
make, use, sell, offer for sale, import and otherwise run, modify and
|
||||
propagate the contents of its contributor version.
|
||||
|
||||
In the following three paragraphs, a "patent license" is any express
|
||||
agreement or commitment, however denominated, not to enforce a patent
|
||||
(such as an express permission to practice a patent or covenant not to
|
||||
sue for patent infringement). To "grant" such a patent license to a
|
||||
party means to make such an agreement or commitment not to enforce a
|
||||
patent against the party.
|
||||
|
||||
If you convey a covered work, knowingly relying on a patent license,
|
||||
and the Corresponding Source of the work is not available for anyone
|
||||
to copy, free of charge and under the terms of this License, through a
|
||||
publicly available network server or other readily accessible means,
|
||||
then you must either (1) cause the Corresponding Source to be so
|
||||
available, or (2) arrange to deprive yourself of the benefit of the
|
||||
patent license for this particular work, or (3) arrange, in a manner
|
||||
consistent with the requirements of this License, to extend the patent
|
||||
license to downstream recipients. "Knowingly relying" means you have
|
||||
actual knowledge that, but for the patent license, your conveying the
|
||||
covered work in a country, or your recipient's use of the covered work
|
||||
in a country, would infringe one or more identifiable patents in that
|
||||
country that you have reason to believe are valid.
|
||||
|
||||
If, pursuant to or in connection with a single transaction or
|
||||
arrangement, you convey, or propagate by procuring conveyance of, a
|
||||
covered work, and grant a patent license to some of the parties
|
||||
receiving the covered work authorizing them to use, propagate, modify
|
||||
or convey a specific copy of the covered work, then the patent license
|
||||
you grant is automatically extended to all recipients of the covered
|
||||
work and works based on it.
|
||||
|
||||
A patent license is "discriminatory" if it does not include within
|
||||
the scope of its coverage, prohibits the exercise of, or is
|
||||
conditioned on the non-exercise of one or more of the rights that are
|
||||
specifically granted under this License. You may not convey a covered
|
||||
work if you are a party to an arrangement with a third party that is
|
||||
in the business of distributing software, under which you make payment
|
||||
to the third party based on the extent of your activity of conveying
|
||||
the work, and under which the third party grants, to any of the
|
||||
parties who would receive the covered work from you, a discriminatory
|
||||
patent license (a) in connection with copies of the covered work
|
||||
conveyed by you (or copies made from those copies), or (b) primarily
|
||||
for and in connection with specific products or compilations that
|
||||
contain the covered work, unless you entered into that arrangement,
|
||||
or that patent license was granted, prior to 28 March 2007.
|
||||
|
||||
Nothing in this License shall be construed as excluding or limiting
|
||||
any implied license or other defenses to infringement that may
|
||||
otherwise be available to you under applicable patent law.
|
||||
|
||||
12. No Surrender of Others' Freedom.
|
||||
|
||||
If conditions are imposed on you (whether by court order, agreement or
|
||||
otherwise) that contradict the conditions of this License, they do not
|
||||
excuse you from the conditions of this License. If you cannot convey a
|
||||
covered work so as to satisfy simultaneously your obligations under this
|
||||
License and any other pertinent obligations, then as a consequence you may
|
||||
not convey it at all. For example, if you agree to terms that obligate you
|
||||
to collect a royalty for further conveying from those to whom you convey
|
||||
the Program, the only way you could satisfy both those terms and this
|
||||
License would be to refrain entirely from conveying the Program.
|
||||
|
||||
13. Use with the GNU Affero General Public License.
|
||||
|
||||
Notwithstanding any other provision of this License, you have
|
||||
permission to link or combine any covered work with a work licensed
|
||||
under version 3 of the GNU Affero General Public License into a single
|
||||
combined work, and to convey the resulting work. The terms of this
|
||||
License will continue to apply to the part which is the covered work,
|
||||
but the special requirements of the GNU Affero General Public License,
|
||||
section 13, concerning interaction through a network will apply to the
|
||||
combination as such.
|
||||
|
||||
14. Revised Versions of this License.
|
||||
|
||||
The Free Software Foundation may publish revised and/or new versions of
|
||||
the GNU General Public License from time to time. Such new versions will
|
||||
be similar in spirit to the present version, but may differ in detail to
|
||||
address new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the
|
||||
Program specifies that a certain numbered version of the GNU General
|
||||
Public License "or any later version" applies to it, you have the
|
||||
option of following the terms and conditions either of that numbered
|
||||
version or of any later version published by the Free Software
|
||||
Foundation. If the Program does not specify a version number of the
|
||||
GNU General Public License, you may choose any version ever published
|
||||
by the Free Software Foundation.
|
||||
|
||||
If the Program specifies that a proxy can decide which future
|
||||
versions of the GNU General Public License can be used, that proxy's
|
||||
public statement of acceptance of a version permanently authorizes you
|
||||
to choose that version for the Program.
|
||||
|
||||
Later license versions may give you additional or different
|
||||
permissions. However, no additional obligations are imposed on any
|
||||
author or copyright holder as a result of your choosing to follow a
|
||||
later version.
|
||||
|
||||
15. Disclaimer of Warranty.
|
||||
|
||||
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
|
||||
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
|
||||
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
|
||||
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
|
||||
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
|
||||
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
|
||||
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
|
||||
|
||||
16. Limitation of Liability.
|
||||
|
||||
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
|
||||
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
|
||||
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
|
||||
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
|
||||
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
|
||||
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
|
||||
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
|
||||
SUCH DAMAGES.
|
||||
|
||||
17. Interpretation of Sections 15 and 16.
|
||||
|
||||
If the disclaimer of warranty and limitation of liability provided
|
||||
above cannot be given local legal effect according to their terms,
|
||||
reviewing courts shall apply local law that most closely approximates
|
||||
an absolute waiver of all civil liability in connection with the
|
||||
Program, unless a warranty or assumption of liability accompanies a
|
||||
copy of the Program in return for a fee.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
How to Apply These Terms to Your New Programs
|
||||
|
||||
If you develop a new program, and you want it to be of the greatest
|
||||
possible use to the public, the best way to achieve this is to make it
|
||||
free software which everyone can redistribute and change under these terms.
|
||||
|
||||
To do so, attach the following notices to the program. It is safest
|
||||
to attach them to the start of each source file to most effectively
|
||||
state the exclusion of warranty; and each file should have at least
|
||||
the "copyright" line and a pointer to where the full notice is found.
|
||||
|
||||
<one line to give the program's name and a brief idea of what it does.>
|
||||
Copyright (C) <year> <name of author>
|
||||
|
||||
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/>.
|
||||
|
||||
Also add information on how to contact you by electronic and paper mail.
|
||||
|
||||
If the program does terminal interaction, make it output a short
|
||||
notice like this when it starts in an interactive mode:
|
||||
|
||||
<program> Copyright (C) <year> <name of author>
|
||||
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
||||
This is free software, and you are welcome to redistribute it
|
||||
under certain conditions; type `show c' for details.
|
||||
|
||||
The hypothetical commands `show w' and `show c' should show the appropriate
|
||||
parts of the General Public License. Of course, your program's commands
|
||||
might be different; for a GUI interface, you would use an "about box".
|
||||
|
||||
You should also get your employer (if you work as a programmer) or school,
|
||||
if any, to sign a "copyright disclaimer" for the program, if necessary.
|
||||
For more information on this, and how to apply and follow the GNU GPL, see
|
||||
<http://www.gnu.org/licenses/>.
|
||||
|
||||
The GNU General Public License does not permit incorporating your program
|
||||
into proprietary programs. If your program is a subroutine library, you
|
||||
may consider it more useful to permit linking proprietary applications with
|
||||
the library. If this is what you want to do, use the GNU Lesser General
|
||||
Public License instead of this License. But first, please read
|
||||
<http://www.gnu.org/philosophy/why-not-lgpl.html>.
|
||||
226
list_rankup.php
Normal file
226
list_rankup.php
Normal file
@@ -0,0 +1,226 @@
|
||||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<title>TS-N.NET Ranksystem</title>
|
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
|
||||
<link rel="stylesheet" type="text/css" href="other/style.css.php" />
|
||||
<?php
|
||||
echo'</head><body>';
|
||||
$starttime=microtime(true);
|
||||
require_once('other/config.php');
|
||||
require_once('lang.php');
|
||||
|
||||
if (mysqli_connect_errno())
|
||||
{
|
||||
echo "Failed to connect to MySQL-Database: ".mysqli_connect_error();
|
||||
}
|
||||
|
||||
$keysort='';
|
||||
$keyorder='';
|
||||
|
||||
if(isset($_GET['sort']))
|
||||
{
|
||||
$keysort=$_GET['sort'];
|
||||
}
|
||||
if($keysort!='uuid' && $keysort!='cldbid' && $keysort!='count' && $keysort!='name' && $keysort!='idle' && $keysort!='active')
|
||||
{
|
||||
$keysort='nextup';
|
||||
}
|
||||
|
||||
if(isset($_GET['order']))
|
||||
{
|
||||
$keyorder=$_GET['order'];
|
||||
}
|
||||
|
||||
if($keyorder=='desc')
|
||||
{
|
||||
$keyorder='DESC';
|
||||
}
|
||||
else
|
||||
{
|
||||
$keyorder='ASC';
|
||||
}
|
||||
|
||||
$countentries=0;
|
||||
if($keysort=='active' && $keyorder=='ASC')
|
||||
{
|
||||
$dbdata=$mysqlcon->query("SELECT * FROM user ORDER BY (count - idle)");
|
||||
}
|
||||
elseif($keysort=='active' && $keyorder=='DESC')
|
||||
{
|
||||
$dbdata=$mysqlcon->query("SELECT * FROM user ORDER BY (idle - count)");
|
||||
}
|
||||
else
|
||||
{
|
||||
$dbdata=$mysqlcon->query("SELECT * FROM user ORDER BY $keysort $keyorder");
|
||||
}
|
||||
while($uuid=$dbdata->fetch_assoc())
|
||||
{
|
||||
if($uuid['uuid']!="lastscantime")
|
||||
{
|
||||
$sqlhis[$uuid['uuid']]=array("cldbid"=>$uuid['cldbid'],"count"=>$uuid['count'],"name"=>$uuid['name'],"idle"=>$uuid['idle'],"cldgroup"=>$uuid['cldgroup'],"online"=>$uuid['online']);
|
||||
$uidarr[]=$uuid['uuid'];
|
||||
$countentries=$countentries+1;
|
||||
}
|
||||
else
|
||||
{
|
||||
$scantime=$uuid['lastseen'];
|
||||
}
|
||||
}
|
||||
$sumentries=$dbdata->num_rows;
|
||||
$lifetime=time() - $scantime;
|
||||
|
||||
$dbgroups=$mysqlcon->query("SELECT * FROM groups");
|
||||
while($servergroup=$dbgroups->fetch_assoc())
|
||||
{
|
||||
$sqlhisgroup[$servergroup['sgid']]=$servergroup['sgidname'];
|
||||
}
|
||||
|
||||
switch($keyorder)
|
||||
{
|
||||
case "ASC": $keyorder2="desc"; break;
|
||||
case "DESC": $keyorder2="asc";
|
||||
}
|
||||
|
||||
echo'<table class="tabledefault"><tr>';
|
||||
if($showcolcld==1) echo ($keysort=='name') ? '<th><a href="?sort=name&order='.$keyorder2.'"><hdcolor>'.$lang['listnick'].'</hdcolor></a></th>' : '<th><a href="?sort=name&order='.$keyorder.'"><hdcolor>'.$lang['listnick'].'</hdcolor></a></th>';
|
||||
if($showcoluuid==1) echo '<th><a href="?sort=uuid&order='.$keyorder2.'"><hdcolor>'.$lang['listuid'].'</hdcolor></a></th>';
|
||||
if($showcoldbid==1) echo'<th><a href="?sort=cldbid&order='.$keyorder2.'"><hdcolor>'.$lang['listcldbid'].'</hdcolor></a></th>';
|
||||
if($showcolot==1) echo'<th><a href="?sort=count&order='.$keyorder2.'"><hdcolor>'.$lang['listsumo'].'</hdcolor></a></th>';
|
||||
if($showcolit==1) echo'<th><a href="?sort=idle&order='.$keyorder2.'"><hdcolor>'.$lang['listsumi'].'</hdcolor></a></th>';
|
||||
if($showcolat==1) echo'<th><a href="?sort=active&order='.$keyorder2.'"><hdcolor>'.$lang['listsuma'].'</hdcolor></a></th>';
|
||||
if($showcolnx==1) echo ($keysort=='nextup') ? '<th><a href="?sort=nextup&order='.$keyorder2.'"><hdcolor>'.$lang['listnxup'].'</hdcolor></a></th>' : '<th><a href="?sort=nextup&order='.$keyorder.'"><hdcolor>'.$lang['listnxup'].'</hdcolor></a></th>';
|
||||
if($showcolsg==1) echo'<th><a href="?sort=nextsgrp&order='.$keyorder2.'"><hdcolor>'.$lang['listnxsg'].'</hdcolor></a></th>';
|
||||
echo'</tr>';
|
||||
|
||||
ksort($grouptime);
|
||||
|
||||
if($countentries>0)
|
||||
{
|
||||
foreach($uidarr as $uid)
|
||||
{
|
||||
$cldgroup=$sqlhis[$uid]['cldgroup'];
|
||||
$count=$sqlhis[$uid]['count'];
|
||||
$idle=$sqlhis[$uid]['idle'];
|
||||
$status=$sqlhis[$uid]['online'];
|
||||
$sgroups=explode(",",$cldgroup);
|
||||
$active=$count - $idle;
|
||||
if($substridle==1)
|
||||
{
|
||||
$activetime=$count - $idle;
|
||||
}
|
||||
else
|
||||
{
|
||||
$activetime=$count;
|
||||
}
|
||||
foreach($grouptime as $time => $groupid)
|
||||
{
|
||||
$showrow=1;
|
||||
if(array_intersect($sgroups, $exceptgroup) && $showexgrp!=1)
|
||||
{
|
||||
$showrow=0;
|
||||
}
|
||||
if(in_array($uid, $exceptuuid) && $showexcld!=1)
|
||||
{
|
||||
$showrow=0;
|
||||
}
|
||||
|
||||
if($activetime<$time && $showrow==1)
|
||||
{
|
||||
if($status==1)
|
||||
{
|
||||
$neededtime=$time - $activetime - $lifetime;
|
||||
} else
|
||||
{
|
||||
$neededtime=$time - $activetime;
|
||||
}
|
||||
echo'<tr>';
|
||||
if($showcolcld==1)
|
||||
{
|
||||
echo'<td class="center">'.$sqlhis[$uid]['name'].'</td>';
|
||||
}
|
||||
if($showcoluuid==1)
|
||||
{
|
||||
echo'<td class="center">'.$uid.'</td>';
|
||||
}
|
||||
if($showcoldbid==1)
|
||||
{
|
||||
echo'<td class="center">'.$sqlhis[$uid]['cldbid'].'</td>';
|
||||
}
|
||||
if($showcolot==1)
|
||||
{
|
||||
echo'<td class="center">';
|
||||
$dtF=new DateTime("@0");
|
||||
$dtT=new DateTime("@$count");
|
||||
$timecount=$dtF->diff($dtT)->format($timeformat);
|
||||
echo $timecount;
|
||||
}
|
||||
if($showcolit==1)
|
||||
{
|
||||
echo'<td class="center">';
|
||||
$dtF=new DateTime("@0");
|
||||
$dtT=new DateTime("@$idle");
|
||||
$timecount=$dtF->diff($dtT)->format($timeformat);
|
||||
echo $timecount;
|
||||
}
|
||||
if($showcolat==1)
|
||||
{
|
||||
echo'<td class="center">';
|
||||
$dtF=new DateTime("@0");
|
||||
$dtT=new DateTime("@$active");
|
||||
$timecount=$dtF->diff($dtT)->format($timeformat);
|
||||
echo $timecount;
|
||||
}
|
||||
if($showcolnx==1)
|
||||
{
|
||||
echo'<td class="center">';
|
||||
$dtF=new DateTime("@0");
|
||||
$dtT=new DateTime("@$neededtime");
|
||||
$timecount=$dtF->diff($dtT)->format($timeformat);
|
||||
|
||||
if(!in_array($uid, $exceptuuid) && !array_intersect($sgroups, $exceptgroup) && $neededtime>0)
|
||||
{
|
||||
echo $timecount.'</td>';
|
||||
}
|
||||
elseif(!in_array($uid, $exceptuuid) && !array_intersect($sgroups, $exceptgroup))
|
||||
{
|
||||
$timecount=0;
|
||||
echo $timecount.'</td>';
|
||||
}
|
||||
elseif(in_array($uid, $exceptuuid))
|
||||
{
|
||||
echo $lang['listexuid'].'</td>';
|
||||
}
|
||||
elseif(array_intersect($sgroups, $exceptgroup))
|
||||
{
|
||||
echo $lang['listexgrp'].'</td>';
|
||||
}
|
||||
else
|
||||
{
|
||||
echo $lang['errukwn'];
|
||||
}
|
||||
}
|
||||
if($showcolsg==1)
|
||||
{
|
||||
echo'<td class="center">'.$sqlhisgroup[$groupid].'</td>';
|
||||
}
|
||||
echo'</tr>';
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
echo'<tr><td colspan="6">'.$lang['noentry'].'</td></tr>';
|
||||
}
|
||||
echo'</table>';
|
||||
|
||||
if($showgen==1)
|
||||
{
|
||||
$buildtime=microtime(true)-$starttime;
|
||||
echo'<span class="tabledefault">'.sprintf($lang['sitegen'],$buildtime,$sumentries).'</span>';
|
||||
}
|
||||
?>
|
||||
</body>
|
||||
</html>
|
||||
65
other/config.php
Normal file
65
other/config.php
Normal file
@@ -0,0 +1,65 @@
|
||||
<?php
|
||||
require_once('dbconfig.php');
|
||||
$mysqlprob=true;
|
||||
if(!$mysqlcon=mysqli_connect($db['host'], $db['user'], $db['pass'], $db['dbname']))
|
||||
{
|
||||
$mysqlprob=false;
|
||||
}
|
||||
if($mysqlprob==false || !$config=$mysqlcon->query("SELECT * FROM config"))
|
||||
{
|
||||
$bgcolor='#101010';
|
||||
$hdcolor='#909090';
|
||||
$txcolor='#707070';
|
||||
$hvcolor='#FFFFFF';
|
||||
$ifcolor='#3366CC';
|
||||
$wncolor='#CC0000';
|
||||
$sccolor='#008000';
|
||||
$showgen='1';
|
||||
}
|
||||
else
|
||||
{
|
||||
$config=$config->fetch_row();
|
||||
$ts['host']=$config[2];
|
||||
$ts['query']=$config[3];
|
||||
$ts['voice']=$config[4];
|
||||
$ts['user']=$config[5];
|
||||
$ts['pass']=$config[6];
|
||||
$language=$config[7];
|
||||
$queryname=$config[8];
|
||||
$queryname2=$config[9];
|
||||
$grouptimearr=explode(',',$config[10]);
|
||||
foreach($grouptimearr as $entry)
|
||||
{
|
||||
list($key,$value)=explode('=>',$entry);
|
||||
$grouptime[$key]=$value;
|
||||
}
|
||||
$resetbydbchange=$config[11];
|
||||
$msgtouser=$config[12];
|
||||
$update=$config[13];
|
||||
$uniqueid=explode(',',$config[14]);
|
||||
$updateinfotime=$config[15];
|
||||
$currvers=$config[16];
|
||||
$substridle=$config[17];
|
||||
$exceptuuid=explode(',',$config[18]);
|
||||
$exceptgroup=explode(',',$config[19]);
|
||||
$timeformat=$config[20];
|
||||
$showexgrp=$config[21];
|
||||
$showexcld=$config[22];
|
||||
$showcolcld=$config[23];
|
||||
$showcoluuid=$config[24];
|
||||
$showcoldbid=$config[25];
|
||||
$showcolot=$config[26];
|
||||
$showcolit=$config[27];
|
||||
$showcolat=$config[28];
|
||||
$showcolnx=$config[29];
|
||||
$showcolsg=$config[30];
|
||||
$bgcolor=$config[31];
|
||||
$hdcolor=$config[32];
|
||||
$txcolor=$config[33];
|
||||
$hvcolor=$config[34];
|
||||
$ifcolor=$config[35];
|
||||
$wncolor=$config[36];
|
||||
$sccolor=$config[37];
|
||||
$showgen=$config[38];
|
||||
}
|
||||
?>
|
||||
6
other/dbconfig.php
Normal file
6
other/dbconfig.php
Normal file
@@ -0,0 +1,6 @@
|
||||
<?php
|
||||
$db['host']="hostname";
|
||||
$db['user']="dbuser";
|
||||
$db['pass']="dbpass";
|
||||
$db['dbname']="ts3_ranksystem";
|
||||
?>
|
||||
18
other/search.php
Normal file
18
other/search.php
Normal file
@@ -0,0 +1,18 @@
|
||||
<?php
|
||||
|
||||
$q = strtolower($_GET["q"]);
|
||||
if (!$q) return;
|
||||
require_once('config.php');
|
||||
$dbuserlist=$mysqlcon->query("SELECT * FROM user ORDER BY online DESC");
|
||||
$items=array();
|
||||
while($userlist=$dbuserlist->fetch_assoc())
|
||||
{
|
||||
$items[$userlist['name']]=$userlist['uuid'];
|
||||
}
|
||||
|
||||
foreach ($items as $key=>$value) {
|
||||
if (strpos(strtolower($key), $q) !== false) {
|
||||
echo "$key|$value\n";
|
||||
}
|
||||
}
|
||||
?>
|
||||
48
other/style.css.php
Normal file
48
other/style.css.php
Normal file
@@ -0,0 +1,48 @@
|
||||
<?php
|
||||
header('Content-type: text/css');
|
||||
require_once('config.php');
|
||||
?>
|
||||
|
||||
body{font-family:Century Gothic,sans-serif;font-size:15px;color:<?=$txcolor?>;background-color:<?=$bgcolor?>;}
|
||||
|
||||
a:link{text-decoration:none;color:<?=$txcolor?>;}
|
||||
a:visited{text-decoration:none;color:<?=$txcolor?>;}
|
||||
a:hover{text-decoration:none;color:<?=$hvcolor?>;}
|
||||
|
||||
th{font-weight:bold;text-align:center;}
|
||||
|
||||
hdcolor{color:<?=$hdcolor?>;}
|
||||
ifcolor{color:<?=$ifcolor?>;}
|
||||
wncolor{color:<?=$wncolor?>;}
|
||||
sccolor{color:<?=$sccolor?>;}
|
||||
|
||||
.tabledefault{width:95%;top:10;left:10;border:0;text-align:center;font-family:Verdana;font-size:10pt;margin:0 auto;}
|
||||
.tablefunction{max-width:500px;width:100%;top:10;left:10;border:0;text-align:center;font-family:Verdana;font-size:10pt;margin:0 auto;}
|
||||
.tablelogin{position:fixed;top:50%;left:50%;margin-top:-40px;margin-left:-150px;}
|
||||
.tdleft{width:55%;text-align:left;}
|
||||
.tdlefth{width:50%;text-align:left;vertical-align:top;}
|
||||
.tdred{width:45%;text-align:right;color:red;}
|
||||
.tdright{width:45%;text-align:right;}
|
||||
.tdrighth{width:50%;text-align:right;vertical-align:top;}
|
||||
|
||||
.tdheadline{text-align:center;background-color:#0A1B2A;}
|
||||
.tdheadline:hover{text-align:center;background-color:#0B243B;}
|
||||
|
||||
.center{text-align:center;}
|
||||
.right{text-align:right;}
|
||||
|
||||
size1{font-size:24px;font-weight:bold;}
|
||||
size2{font-size:16px;font-weight:bold;}
|
||||
|
||||
select{width:140px;}
|
||||
input.switch:empty {margin-left:-9999px;}
|
||||
input.switch:empty ~ label{position:relative;float:left;line-height:1.3em;text-indent:4em;margin:0.2em 0 0 90px;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;}
|
||||
input.switch:empty ~ label:before, input.switch:empty ~ label:after{position:absolute;display:block;top:0;bottom:0;left:0;content:'';width:3em;background-color:#CC0000;border-radius:1em;-webkit-transition: all 50ms ease-in;transition: all 50ms ease-in;}
|
||||
input.switch:empty ~ label:after{width:1.2em;top:0.1em;bottom:0.1em;margin-left:0.2em;background-color:#fff;border-radius:0.8em;}
|
||||
input.switch:checked ~ label:before{background-color:green;}
|
||||
input.switch:checked ~ label:after{margin-left:1.5em;}
|
||||
|
||||
tooltip {position:relative;display:inline;}
|
||||
tooltip span{width:350px;position:absolute;color:#000;background:#CCCCCC;padding:10px 10px 10px 10px;line-height:16px;text-align:center;visibility:hidden;border-radius:5px;box-shadow:0px 1px 2px #0B243B;}
|
||||
tooltip span:after{content:'';position:absolute;top:7px;left:100%;width:0;height:0;border-left:12px solid #CCCCCC;border-top:12px solid transparent;border-bottom:12px solid transparent;}
|
||||
tooltip:hover span{visibility:visible;right:110%;margin-top:-10px;margin-right:15px;z-index:999;}
|
||||
248
other/webinterface_list.php
Normal file
248
other/webinterface_list.php
Normal file
@@ -0,0 +1,248 @@
|
||||
<?PHP
|
||||
$access=$mysqlcon->query("SELECT * FROM config");
|
||||
$access=$access->fetch_row();
|
||||
echo'
|
||||
<table class="tabledefault">
|
||||
<tr><td class="right" colspan="2"><a href="webinterface.php?logout=true">'.$lang['wilogout'].'</a></td></tr>
|
||||
<tr><td class="center" colspan="4"><size1>'.$lang['wihl'].'<size1></td></tr>
|
||||
<tr><td class="center" colspan="4">'.sprintf($lang['wiversion'],$access[16]).'</td></tr>
|
||||
<tr><td class="center" colspan="4"><div id="alert"><sccolor>',$alert,'</sccolor></div></td></tr>
|
||||
</table>
|
||||
|
||||
<table class="tablefunction">
|
||||
<tr><td> </td></tr>
|
||||
<tr><td class="tdheadline">
|
||||
<a href="javascript:void(0)" title="" onclick="toggle(0);" style="display:block;"><size2>'.$lang['wihlts'].'</size2></a>
|
||||
</td></tr>
|
||||
<tr><td class="center">
|
||||
<div class="layers" style="display:none;">
|
||||
<form name="updatets" method="post">
|
||||
<input type="hidden" name="savesettings" value="true">
|
||||
<table class="tabledefault">
|
||||
<tr><td> </td></tr>
|
||||
<tr><td class="tdrighth"><tooltip>'.$lang['wits3host'].'<span>'.$lang['wits3hostdesc'].'</span></tooltip></td>
|
||||
<td class="tdlefth"><input type="text" name="tshost" value="',$access[2],'" tabindex="1"></td></tr>
|
||||
<tr><td class="tdrighth"><tooltip>'.$lang['wits3query'].'<span>'.$lang['wits3querydesc'].'</span></tooltip></td>
|
||||
<td class="tdlefth"><input type="text" name="tsquery" value="',$access[3],'" tabindex="2"></td></tr>
|
||||
<tr><td class="tdrighth"><tooltip>'.$lang['wits3voice'].'<span>'.$lang['wits3voicedesc'].'</span></tooltip></td>
|
||||
<td class="tdlefth"><input type="text" name="tsvoice" value="',$access[4],'" tabindex="3"></td></tr>
|
||||
<tr><td class="tdrighth"><tooltip>'.$lang['wits3querusr'].'<span>'.$lang['wits3querusrdesc'].'</span></tooltip></td>
|
||||
<td class="tdlefth"><input type="text" name="tsuser" value="',$access[5],'" tabindex="4"></td></tr>
|
||||
<tr><td class="tdrighth"><tooltip>'.$lang['wits3querpw'].'<span>'.$lang['wits3querpwdesc'].'</span></tooltip></td>
|
||||
<td class="tdlefth"><input type="text" name="tspass" value="',$access[6],'" tabindex="5"></td></tr>
|
||||
<tr><td> </td></tr>
|
||||
<tr><td class="tdrighth"><tooltip>'.$lang['wits3qnm'].'<span>'.$lang['wits3qnmdesc'].'</span></tooltip></td>
|
||||
<td class="tdlefth"><input type="text" name="queryname" value="',$access[8],'" tabindex="6"></td></tr>
|
||||
<tr><td class="tdrighth"><tooltip>'.$lang['wits3qnm2'].'<span>'.$lang['wits3qnm2desc'].'</span></tooltip></td>
|
||||
<td class="tdlefth"><input type="text" name="queryname2" value="',$access[9],'" tabindex="7"></td></tr>
|
||||
<tr><td> </td></tr>
|
||||
<tr><td> </td><td class="tdlefth"><input type="submit" name="updatets" value="'.$lang['wisvconf'].'" tabindex="8"></td></tr>
|
||||
</table></form>
|
||||
</div>
|
||||
</td></tr>
|
||||
|
||||
<tr><td> </td></tr>
|
||||
<tr><td class="tdheadline">
|
||||
<a href="javascript:void(0)" title="" onclick="toggle(1);" style="display:block;"><size2>'.$lang['wihlcfg'].'</size2></a>
|
||||
</td></tr>
|
||||
<tr><td class="center">
|
||||
<div class="layers" style="display:none;">
|
||||
<form name="updatecore" method="post">
|
||||
<input type="hidden" name="savesettings" value="true">
|
||||
<table class="tabledefault">
|
||||
<tr><td> </td></tr>
|
||||
<tr><td class="tdrighth"><tooltip>'.$lang['wigrptime'].'<span>'.$lang['wigrptimedesc'].'</span></tooltip></td>
|
||||
<td class="tdlefth"><textarea rows="2" cols="30" name="grouptime" tabindex="1">',$access[10],'</textarea></td></tr>
|
||||
<tr><td class="tdrighth"><tooltip>'.$lang['wisupidle'].'<span>'.$lang['wisupidledesc'].'</span></tooltip></td>';
|
||||
if($access[17]==1)
|
||||
{ echo'<td class="tdlefth"><div><input type="checkbox" id="switch1" name="substridle" class="switch" checked tabindex="2">
|
||||
<label for="switch1"> </label></div></td></tr>'; } else
|
||||
{ echo'<td class="tdlefth"><div><input type="checkbox" id="switch1" name="substridle" class="switch" tabindex="2">
|
||||
<label for="switch1"> </label></div></td></tr>'; }
|
||||
echo'<tr><td class="tdrighth"><tooltip>'.$lang['wimsgusr'].'<span>'.$lang['wimsgusrdesc'].'</span></tooltip></td>';
|
||||
if($access[12]==1)
|
||||
{ echo'<td class="tdlefth"><div><input type="checkbox" id="switch2" name="msgtouser" class="switch" checked tabindex="3">
|
||||
<label for="switch2"> </label></div></td></tr>'; } else
|
||||
{ echo'<td class="tdlefth"><div><input type="checkbox" id="switch2" name="msgtouser" class="switch" tabindex="3">
|
||||
<label for="switch2"> </label></div></td></tr>'; }
|
||||
echo'<tr><td class="tdrighth"><tooltip>'.$lang['wiexgrp'].'<span>'.$lang['wiexgrpdesc'].'</span></tooltip></td>
|
||||
<td class="tdlefth"><textarea rows="1" cols="30" name="exceptgroup" tabindex="4">',$access[19],'</textarea></td></tr>
|
||||
<tr><td class="tdrighth"><tooltip>'.$lang['wiexuid'].'<span>'.$lang['wiexuiddesc'].'</span></tooltip></td>
|
||||
<td class="tdlefth"><textarea rows="2" cols="30" name="exceptuuid" tabindex="5">',$access[18],'</textarea></td></tr>
|
||||
<tr><td class="tdrighth"><tooltip>'.$lang['wichdbid'].'<span>'.$lang['wichdbiddesc'].'</span></tooltip></td>';
|
||||
if($access[11]==1)
|
||||
{ echo'<td class="tdlefth"><div><input type="checkbox" id="switch3" name="resetbydbchange" class="switch" checked tabindex="6">
|
||||
<label for="switch3"> </label></div></td></tr>'; } else
|
||||
{ echo'<td class="tdlefth"><div><input type="checkbox" id="switch3" name="resetbydbchange" class="switch" tabindex="6">
|
||||
<label for="switch3"> </label></div></td></tr>'; }
|
||||
echo '<tr><td> </td></tr>
|
||||
<tr><td class="tdrighth"><tooltip>'.$lang['wiupcheck'].'<span>'.$lang['wiupcheckdesc'].'</span></tooltip></td>';
|
||||
if($access[13]==1)
|
||||
{ echo'<td class="tdlefth"><div><input type="checkbox" id="switch4" name="upcheck" class="switch" checked tabindex="7">
|
||||
<label for="switch4"> </label></div></td></tr>'; } else
|
||||
{ echo'<td class="tdlefth"><div><input type="checkbox" id="switch4" name="upcheck" class="switch" tabindex="7">
|
||||
<label for="switch4"> </label></div></td></tr>'; }
|
||||
echo '<tr><td class="tdrighth"><tooltip>'.$lang['wiupuid'].'<span>'.$lang['wiupuiddesc'].'</span></tooltip></td>
|
||||
<td class="tdlefth"><textarea rows="2" cols="30" name="uniqueid" tabindex="8">',$access[14],'</textarea></td></tr>
|
||||
<tr><td class="tdrighth"><tooltip>'.$lang['wiuptime'].'<span>'.$lang['wiuptimedesc'].'</span></tooltip></td>
|
||||
<td class="tdlefth"><input type="text" name="updateinfotime" value="',$access[15],'" tabindex="8"></td></tr>
|
||||
<tr><td class="center" colspan="2"></td></tr>
|
||||
<tr><td> </td></tr>
|
||||
<tr><td> </td><td class="tdlefth"><input type="submit" name="updatecore" value="'.$lang['wisvconf'].'" tabindex="10"></td></tr>
|
||||
</table></form>
|
||||
</div>
|
||||
<tr><td class="center">
|
||||
|
||||
</td></tr>
|
||||
|
||||
<tr><td> </td></tr>
|
||||
<tr><td class="tdheadline">
|
||||
<a href="javascript:void(0)" title="" onclick="toggle(2);" style="display:block;"><size2>'.$lang['wihlsty'].'</size2></a>
|
||||
</td></tr>
|
||||
<tr><td class="center">
|
||||
<div class="layers" style="display:none;">
|
||||
<table class="tabledefault">
|
||||
<form name="updatestyle" method="post">
|
||||
<input type="hidden" name="savesettings" value="true">
|
||||
<tr><td> </td></tr>
|
||||
<tr><td class="tdrighth"><tooltip>'.$lang['wivlang'].'<span>'.sprintf($lang['wivlangdesc'],"<br>").'</span></tooltip></td>
|
||||
<td class="tdlefth"><select name="languagedb" tabindex="1">';
|
||||
echo ($language === 'en' ? '<option value="en" selected="selected">english</option>' : '<option value="en">english</option>');
|
||||
echo ($language === 'de' ? '<option value="de" selected="selected">german</option>' : '<option value="de">german</option>');
|
||||
echo ($language === 'ru' ? '<option value="ru" selected="selected">русский</option>' : '<option value="ru">русский</option>');
|
||||
echo'</select></td></tr>
|
||||
<tr><td class="tdrighth"><tooltip>'.$lang['widaform'].'<span>'.$lang['widaformdesc'].'</span></tooltip></td>
|
||||
<td class="tdlefth"><input type="text" name="dateformat" value="',$access[20],'" tabindex="2"></td></tr>
|
||||
<tr><td> </td></tr>
|
||||
<tr><td class="tdrighth"><tooltip>'.$lang['wishexgrp'].'<span>'.$lang['wishexgrpdesc'].'</span></tooltip></td>';
|
||||
if($access[21]==1)
|
||||
{ echo'<td class="tdlefth"><div><input type="checkbox" id="switch5" name="showexgrp" class="switch" checked tabindex="3">
|
||||
<label for="switch5"> </label></div></td></tr>'; } else
|
||||
{ echo'<td class="tdlefth"><div><input type="checkbox" id="switch5" name="showexgrp" class="switch" tabindex="3">
|
||||
<label for="switch5"> </label></div></td></tr>'; }
|
||||
echo'<tr><td class="tdrighth"><tooltip>'.$lang['wishexcld'].'<span>'.$lang['wishexclddesc'].'</span></tooltip></td>';
|
||||
if($access[22]==1)
|
||||
{ echo'<td class="tdlefth"><div><input type="checkbox" id="switch6" name="showexcld" class="switch" checked tabindex="4">
|
||||
<label for="switch6"> </label></div></td></tr>'; } else
|
||||
{ echo'<td class="tdlefth"><div><input type="checkbox" id="switch6" name="showexcld" class="switch" tabindex="4">
|
||||
<label for="switch6"> </label></div></td></tr>'; }
|
||||
echo'<tr><td> </td></tr>
|
||||
<tr><td class="tdrighth"><tooltip>'.$lang['wishcolcld'].'<span>'.$lang['wishcolclddesc'].'</span></tooltip></td>';
|
||||
if($access[23]==1)
|
||||
{ echo'<td class="tdlefth"><div><input type="checkbox" id="switch7" name="showcolcld" class="switch" checked tabindex="5">
|
||||
<label for="switch7"> </label></div></td></tr>'; } else
|
||||
{ echo'<td class="tdlefth"><div><input type="checkbox" id="switch7" name="showcolcld" class="switch" tabindex="5">
|
||||
<label for="switch7"> </label></div></td></tr>'; }
|
||||
echo'<tr><td class="tdrighth"><tooltip>'.$lang['wishcoluuid'].'<span>'.$lang['wishcoluuiddesc'].'</span></tooltip></td>';
|
||||
if($access[24]==1)
|
||||
{ echo'<td class="tdlefth"><div><input type="checkbox" id="switch8" name="showcoluuid" class="switch" checked tabindex="6">
|
||||
<label for="switch8"> </label></div></td></tr>'; } else
|
||||
{ echo'<td class="tdlefth"><div><input type="checkbox" id="switch8" name="showcoluuid" class="switch" tabindex="6">
|
||||
<label for="switch8"> </label></div></td></tr>'; }
|
||||
echo'<tr><td class="tdrighth"><tooltip>'.$lang['wishcoldbid'].'<span>'.$lang['wishcoldbiddesc'].'</span></tooltip></td>';
|
||||
if($access[25]==1)
|
||||
{ echo'<td class="tdlefth"><div><input type="checkbox" id="switch9" name="showcoldbid" class="switch" checked tabindex="7">
|
||||
<label for="switch9"> </label></div></td></tr>'; } else
|
||||
{ echo'<td class="tdlefth"><div><input type="checkbox" id="switch9" name="showcoldbid" class="switch" tabindex="7">
|
||||
<label for="switch9"> </label></div></td></tr>'; }
|
||||
echo'<tr><td class="tdrighth"><tooltip>'.$lang['wishcolot'].'<span>'.$lang['wishcolotdesc'].'</span></tooltip></td>';
|
||||
if($access[26]==1)
|
||||
{ echo'<td class="tdlefth"><div><input type="checkbox" id="switch10" name="showcolot" class="switch" checked tabindex="8">
|
||||
<label for="switch10"> </label></div></td></tr>'; } else
|
||||
{ echo'<td class="tdlefth"><div><input type="checkbox" id="switch10" name="showcolot" class="switch" tabindex="8">
|
||||
<label for="switch10"> </label></div></td></tr>'; }
|
||||
echo'<tr><td class="tdrighth"><tooltip>'.$lang['wishcolit'].'<span>'.$lang['wishcolitdesc'].'</span></tooltip></td>';
|
||||
if($access[27]==1)
|
||||
{ echo'<td class="tdlefth"><div><input type="checkbox" id="switch11" name="showcolit" class="switch" checked tabindex="9">
|
||||
<label for="switch11"> </label></div></td></tr>'; } else
|
||||
{ echo'<td class="tdlefth"><div><input type="checkbox" id="switch11" name="showcolit" class="switch" tabindex="9">
|
||||
<label for="switch11"> </label></div></td></tr>'; }
|
||||
echo'<tr><td class="tdrighth"><tooltip>'.$lang['wishcolat'].'<span>'.$lang['wishcolatdesc'].'</span></tooltip></td>';
|
||||
if($access[28]==1)
|
||||
{ echo'<td class="tdlefth"><div><input type="checkbox" id="switch12" name="showcolat" class="switch" checked tabindex="10">
|
||||
<label for="switch12"> </label></div></td></tr>'; } else
|
||||
{ echo'<td class="tdlefth"><div><input type="checkbox" id="switch12" name="showcolat" class="switch" tabindex="10">
|
||||
<label for="switch12"> </label></div></td></tr>'; }
|
||||
echo'<tr><td class="tdrighth"><tooltip>'.$lang['wishcolnx'].'<span>'.$lang['wishcolnxdesc'].'</span></tooltip></td>';
|
||||
if($access[29]==1)
|
||||
{ echo'<td class="tdlefth"><div><input type="checkbox" id="switch13" name="showcolnx" class="switch" checked tabindex="11">
|
||||
<label for="switch13"> </label></div></td></tr>'; } else
|
||||
{ echo'<td class="tdlefth"><div><input type="checkbox" id="switch13" name="showcolnx" class="switch" tabindex="11">
|
||||
<label for="switch13"> </label></div></td></tr>'; }
|
||||
echo'<tr><td class="tdrighth"><tooltip>'.$lang['wishcolsg'].'<span>'.$lang['wishcolsgdesc'].'</span></tooltip></td>';
|
||||
if($access[30]==1)
|
||||
{ echo'<td class="tdlefth"><div><input type="checkbox" id="switch14" name="showcolsg" class="switch" checked tabindex="12">
|
||||
<label for="switch14"> </label></div></td></tr>'; } else
|
||||
{ echo'<td class="tdlefth"><div><input type="checkbox" id="switch14" name="showcolsg" class="switch" tabindex="12">
|
||||
<label for="switch14"> </label></div></td></tr>'; }
|
||||
echo'<tr><td> </td></tr>
|
||||
<tr><td class="tdrighth"><tooltip>'.$lang['wibgco'].'<span>'.$lang['wibgcodesc'].'</span></tooltip></td>
|
||||
<td class="tdlefth"><input type="text" name="bgcolor" value="',$access[31],'" tabindex="13"></td></tr>
|
||||
<tr><td class="tdrighth"><tooltip>'.$lang['wihdco'].'<span>'.$lang['wihdcodesc'].'</span></tooltip></td>
|
||||
<td class="tdlefth"><input type="text" name="hdcolor" value="',$access[32],'" tabindex="14"></td></tr>
|
||||
<tr><td class="tdrighth"><tooltip>'.$lang['witxco'].'<span>'.$lang['witxcodesc'].'</span></tooltip></td>
|
||||
<td class="tdlefth"><input type="text" name="txcolor" value="',$access[33],'" tabindex="15"></td></tr>
|
||||
<tr><td class="tdrighth"><tooltip>'.$lang['wihvco'].'<span>'.$lang['wihvcodesc'].'</span></tooltip></td>
|
||||
<td class="tdlefth"><input type="text" name="hvcolor" value="',$access[34],'" tabindex="16"></td></tr>
|
||||
<tr><td class="tdrighth"><tooltip>'.$lang['wiifco'].'<span>'.$lang['wiifcodesc'].'</span></tooltip></td>
|
||||
<td class="tdlefth"><input type="text" name="ifcolor" value="',$access[35],'" tabindex="17"></td></tr>
|
||||
<tr><td class="tdrighth"><tooltip>'.$lang['wiwnco'].'<span>'.$lang['wiwncodesc'].'</span></tooltip></td>
|
||||
<td class="tdlefth"><input type="text" name="wncolor" value="',$access[36],'" tabindex="18"></td></tr>
|
||||
<tr><td class="tdrighth"><tooltip>'.$lang['wiscco'].'<span>'.$lang['wisccodesc'].'</span></tooltip></td>
|
||||
<td class="tdlefth"><input type="text" name="sccolor" value="',$access[37],'" tabindex="19"></td></tr>
|
||||
<tr><td> </td></tr>
|
||||
<tr><td class="tdrighth"><tooltip>'.$lang['wishgen'].'<span>'.$lang['wishgendesc'].'</span></tooltip></td>';
|
||||
if($access[38]==1)
|
||||
{ echo'<td class="tdlefth"><div><input type="checkbox" id="switch15" name="showgen" class="switch" checked tabindex="20">
|
||||
<label for="switch15"> </label></div></td></tr>'; } else
|
||||
{ echo'<td class="tdlefth"><div><input type="checkbox" id="switch15" name="showgen" class="switch" tabindex="20">
|
||||
<label for="switch15"> </label></div></td></tr>'; }
|
||||
echo'<tr><td> </td></tr>
|
||||
<tr><td> </td><td class="tdlefth"><input type="submit" name="updatestyle" value="'.$lang['wisvconf'].'" tabindex="21"></td></tr>
|
||||
</table></form>
|
||||
</div>
|
||||
</td></tr>
|
||||
|
||||
<tr><td> </td></tr>
|
||||
<tr><td class="tdheadline">
|
||||
<a href="javascript:void(0)" title="" onclick="toggle(3);" style="display:block;"><size2>'.$lang['wihlcls'].'</size2></a>
|
||||
</td></tr>
|
||||
<tr><td class="center">
|
||||
<div class="layers" style="display:none;">
|
||||
<form name="selectivclients" method="post">
|
||||
<table class="tabledefault">
|
||||
<tr><td class="tdrighth"><p><tooltip>'.$lang['wiselcld'].'<span>'.$lang['wiselclddesc'].'</span></a></p></td><td class="tdlefth"><p><textarea rows="2" cols="30" id="clients" name="selectedclients" tabindex="1"></textarea></p><p><textarea style="display:none;" name="selecteduuids"></textarea></p></td></tr>
|
||||
<tr><td colspan="2"><b><i>and choose</i></b></td></tr>
|
||||
<tr><td> </td></tr>
|
||||
<tr><td class="tdrighth"><tooltip>'.$lang['widelcld'].'<span>'.$lang['widelclddesc'].'</span></tooltip></td><td class="tdlefth"><div><input type="checkbox" id="switch16" name="delclients" class="switch" tabindex="2">
|
||||
<label for="switch16"> </label></div></td></tr>
|
||||
<tr><td class="tdrighth"><tooltip>'.$lang['widelsg'].'<span>'.$lang['widelsgdesc'].'</span></tooltip></td><td class="tdlefth"><div><input type="checkbox" id="switch17" name="delsrvgrp" class="switch" checked tabindex="3"><label for="switch17"> </label></div></td></tr>
|
||||
<tr><td> </td></tr>
|
||||
<tr><td colspan="2"><b><i>or</i></b></td></tr>
|
||||
<tr><td> </td></tr>
|
||||
<tr><td class="tdrighth"><tooltip>'.$lang['setontime'].'<span>'.$lang['setontimedesc'].'</span></tooltip></td><td class="tdlefth"><input type="text" name="counttime" value="0" tabindex="4"></td></tr>
|
||||
<tr><td> </td></tr>
|
||||
<tr><td> </td><td class="tdlefth"><input type="submit" value="'.$lang['wiaction'].'" name="selectivclients" tabindex="5"></td></tr>
|
||||
</table></form>
|
||||
</div>
|
||||
</td></tr>
|
||||
|
||||
<tr><td> </td></tr>
|
||||
<tr><td class="tdheadline">
|
||||
<a href="javascript:void(0)" title="" onclick="toggle(4);" style="display:block;"><size2>'.$lang['wihlclg'].'</size2></a>
|
||||
</td></tr>
|
||||
<tr><td class="center">
|
||||
<div class="layers" style="display:none;">
|
||||
<form name="globalclients" method="post">
|
||||
<table class="tabledefault">
|
||||
<tr><td> </td></tr>
|
||||
<tr><td class="tdrighth"><tooltip>'.$lang['wideltime'].'<span>'.$lang['wideltimedesc'].'</span></tooltip></td><td class="tdlefth"><input type="text" name="cleantime" value="31536000" tabindex="1"></td></tr>
|
||||
<tr><td class="tdrighth"><tooltip>'.$lang['widelsg'].'<span>'.$lang['widelsgdesc'].'</span></tooltip></td><td class="tdlefth"><div><input type="checkbox" id="switch16" name="delsrvgrp" class="switch" checked tabindex="2">
|
||||
<label for="switch16"> </label></div></td></tr>
|
||||
<tr><td> </td></tr>
|
||||
<tr><td> </td><td class="tdlefth"><input type="submit" name="globalclients" value="'.$lang['wiaction'].'" tabindex="3"></td></tr>
|
||||
</table></form>
|
||||
</div>
|
||||
</td></tr>
|
||||
</table>';
|
||||
?>
|
||||
13
other/webinterface_login.php
Normal file
13
other/webinterface_login.php
Normal file
@@ -0,0 +1,13 @@
|
||||
<?php
|
||||
echo'<form name="form" method="post">
|
||||
<table class="tablelogin">';
|
||||
if(showerrlogin==1)
|
||||
{
|
||||
echo'<tr><td colspan="2" class="center">'.$lang['errlogin'].'<br><br></td></tr>';
|
||||
}
|
||||
echo'<tr><td class="center">'.$lang['user'].'</td><td class="center"><input type="text" name="username"></td></tr>
|
||||
<tr><td class="center">'.$lang['pass'].'</td><td class="center"><input type="password" name="password"></td></tr>
|
||||
<tr><td class="center" colspan="2"><input type="submit" name="abschicken" class="button" value="login" style="width:50px"></td></tr>
|
||||
</table></form>
|
||||
<script type="text/javascript" language="JavaScript">document.forms["form"].elements["username"].focus();</script>';
|
||||
?>
|
||||
160
ts3_lib/Adapter/Abstract.php
Normal file
160
ts3_lib/Adapter/Abstract.php
Normal file
@@ -0,0 +1,160 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @file
|
||||
* TeamSpeak 3 PHP Framework
|
||||
*
|
||||
* $Id: Abstract.php 10/11/2013 11:35:21 scp@orilla $
|
||||
*
|
||||
* 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
|
||||
* @version 1.1.23
|
||||
* @author Sven 'ScP' Paulsen
|
||||
* @copyright Copyright (c) 2010 by Planet TeamSpeak. All rights reserved.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @class TeamSpeak3_Adapter_Abstract
|
||||
* @brief Provides low-level methods for concrete adapters to communicate with a TeamSpeak 3 Server.
|
||||
*/
|
||||
abstract class TeamSpeak3_Adapter_Abstract
|
||||
{
|
||||
/**
|
||||
* Stores user-provided options.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $options = null;
|
||||
|
||||
/**
|
||||
* Stores an TeamSpeak3_Transport_Abstract object.
|
||||
*
|
||||
* @var TeamSpeak3_Transport_Abstract
|
||||
*/
|
||||
protected $transport = null;
|
||||
|
||||
/**
|
||||
* The TeamSpeak3_Adapter_Abstract constructor.
|
||||
*
|
||||
* @param array $options
|
||||
* @return TeamSpeak3_Adapter_Abstract
|
||||
*/
|
||||
public function __construct(array $options)
|
||||
{
|
||||
$this->options = $options;
|
||||
|
||||
if($this->transport === null)
|
||||
{
|
||||
$this->syn();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* The TeamSpeak3_Adapter_Abstract destructor.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
abstract public function __destruct();
|
||||
|
||||
/**
|
||||
* Connects the TeamSpeak3_Transport_Abstract object and performs initial actions on the remote
|
||||
* server.
|
||||
*
|
||||
* @throws TeamSpeak3_Adapter_Exception
|
||||
* @return void
|
||||
*/
|
||||
abstract protected function syn();
|
||||
|
||||
/**
|
||||
* Commit pending data.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function __sleep()
|
||||
{
|
||||
return array("options");
|
||||
}
|
||||
|
||||
/**
|
||||
* Reconnects to the remote server.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function __wakeup()
|
||||
{
|
||||
$this->syn();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the profiler timer used for this connection adapter.
|
||||
*
|
||||
* @return TeamSpeak3_Helper_Profiler_Timer
|
||||
*/
|
||||
public function getProfiler()
|
||||
{
|
||||
return TeamSpeak3_Helper_Profiler::get(spl_object_hash($this));
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the transport object used for this connection adapter.
|
||||
*
|
||||
* @return TeamSpeak3_Transport_Abstract
|
||||
*/
|
||||
public function getTransport()
|
||||
{
|
||||
return $this->transport;
|
||||
}
|
||||
|
||||
/**
|
||||
* Loads the transport object object used for the connection adapter and passes a given set
|
||||
* of options.
|
||||
*
|
||||
* @param array $options
|
||||
* @param string $transport
|
||||
* @throws TeamSpeak3_Adapter_Exception
|
||||
* @return void
|
||||
*/
|
||||
protected function initTransport($options, $transport = "TeamSpeak3_Transport_TCP")
|
||||
{
|
||||
if(!is_array($options))
|
||||
{
|
||||
throw new TeamSpeak3_Adapter_Exception("transport parameters must provided in an array");
|
||||
}
|
||||
|
||||
$this->transport = new $transport($options);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the hostname or IPv4 address the underlying TeamSpeak3_Transport_Abstract object
|
||||
* is connected to.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getTransportHost()
|
||||
{
|
||||
return $this->getTransport()->getConfig("host", "0.0.0.0");
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the port number of the server the underlying TeamSpeak3_Transport_Abstract object
|
||||
* is connected to.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getTransportPort()
|
||||
{
|
||||
return $this->getTransport()->getConfig("port", "0");
|
||||
}
|
||||
}
|
||||
119
ts3_lib/Adapter/Blacklist.php
Normal file
119
ts3_lib/Adapter/Blacklist.php
Normal file
@@ -0,0 +1,119 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @file
|
||||
* TeamSpeak 3 PHP Framework
|
||||
*
|
||||
* $Id: Blacklist.php 10/11/2013 11:35:21 scp@orilla $
|
||||
*
|
||||
* 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
|
||||
* @version 1.1.23
|
||||
* @author Sven 'ScP' Paulsen
|
||||
* @copyright Copyright (c) 2010 by Planet TeamSpeak. All rights reserved.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @class TeamSpeak3_Adapter_Blacklist
|
||||
* @brief Provides methods to check if an IP address is currently blacklisted.
|
||||
*/
|
||||
class TeamSpeak3_Adapter_Blacklist extends TeamSpeak3_Adapter_Abstract
|
||||
{
|
||||
/**
|
||||
* The IPv4 address or FQDN of the TeamSpeak Systems update server.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $default_host = "blacklist.teamspeak.com";
|
||||
|
||||
/**
|
||||
* The UDP port number of the TeamSpeak Systems update server.
|
||||
*
|
||||
* @var integer
|
||||
*/
|
||||
protected $default_port = 17385;
|
||||
|
||||
/**
|
||||
* Stores an array containing the latest build numbers.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $build_numbers = null;
|
||||
|
||||
/**
|
||||
* Connects the TeamSpeak3_Transport_Abstract object and performs initial actions on the remote
|
||||
* server.
|
||||
*
|
||||
* @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));
|
||||
|
||||
TeamSpeak3_Helper_Signal::getInstance()->emit("blacklistConnected", $this);
|
||||
}
|
||||
|
||||
/**
|
||||
* The TeamSpeak3_Adapter_Blacklist destructor.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function __destruct()
|
||||
{
|
||||
if($this->getTransport() instanceof TeamSpeak3_Transport_Abstract && $this->getTransport()->isConnected())
|
||||
{
|
||||
$this->getTransport()->disconnect();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns TRUE if a specified $host IP address is currently blacklisted.
|
||||
*
|
||||
* @param string $host
|
||||
* @throws TeamSpeak3_Adapter_Blacklist_Exception
|
||||
* @return boolean
|
||||
*/
|
||||
public function isBlacklisted($host)
|
||||
{
|
||||
if(ip2long($host) === FALSE)
|
||||
{
|
||||
$addr = gethostbyname($host);
|
||||
|
||||
if($addr == $host)
|
||||
{
|
||||
throw new TeamSpeak3_Adapter_Blacklist_Exception("unable to resolve IPv4 address (" . $host . ")");
|
||||
}
|
||||
|
||||
$host = $addr;
|
||||
}
|
||||
|
||||
$this->getTransport()->send("ip4:" . $host);
|
||||
$repl = $this->getTransport()->read(1);
|
||||
$this->getTransport()->disconnect();
|
||||
|
||||
if(!count($repl))
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
return ($repl->toInt()) ? FALSE : TRUE;
|
||||
}
|
||||
}
|
||||
32
ts3_lib/Adapter/Blacklist/Exception.php
Normal file
32
ts3_lib/Adapter/Blacklist/Exception.php
Normal file
@@ -0,0 +1,32 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @file
|
||||
* TeamSpeak 3 PHP Framework
|
||||
*
|
||||
* $Id: Exception.php 10/11/2013 11:35:21 scp@orilla $
|
||||
*
|
||||
* 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
|
||||
* @version 1.1.23
|
||||
* @author Sven 'ScP' Paulsen
|
||||
* @copyright Copyright (c) 2010 by Planet TeamSpeak. All rights reserved.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @class TeamSpeak3_Adapter_Blacklist_Exception
|
||||
* @brief Enhanced exception class for TeamSpeak3_Adapter_Blacklist objects.
|
||||
*/
|
||||
class TeamSpeak3_Adapter_Blacklist_Exception extends TeamSpeak3_Adapter_Exception {}
|
||||
32
ts3_lib/Adapter/Exception.php
Normal file
32
ts3_lib/Adapter/Exception.php
Normal file
@@ -0,0 +1,32 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @file
|
||||
* TeamSpeak 3 PHP Framework
|
||||
*
|
||||
* $Id: Exception.php 10/11/2013 11:35:21 scp@orilla $
|
||||
*
|
||||
* 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
|
||||
* @version 1.1.23
|
||||
* @author Sven 'ScP' Paulsen
|
||||
* @copyright Copyright (c) 2010 by Planet TeamSpeak. All rights reserved.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @class TeamSpeak3_Adapter_Exception
|
||||
* @brief Enhanced exception class for TeamSpeak3_Adapter_Abstract objects.
|
||||
*/
|
||||
class TeamSpeak3_Adapter_Exception extends TeamSpeak3_Exception {}
|
||||
190
ts3_lib/Adapter/FileTransfer.php
Normal file
190
ts3_lib/Adapter/FileTransfer.php
Normal file
@@ -0,0 +1,190 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @file
|
||||
* TeamSpeak 3 PHP Framework
|
||||
*
|
||||
* $Id: FileTransfer.php 10/11/2013 11:35:21 scp@orilla $
|
||||
*
|
||||
* 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
|
||||
* @version 1.1.23
|
||||
* @author Sven 'ScP' Paulsen
|
||||
* @copyright Copyright (c) 2010 by Planet TeamSpeak. All rights reserved.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @class TeamSpeak3_Adapter_FileTransfer
|
||||
* @brief Provides low-level methods for file transfer communication with a TeamSpeak 3 Server.
|
||||
*/
|
||||
class TeamSpeak3_Adapter_FileTransfer extends TeamSpeak3_Adapter_Abstract
|
||||
{
|
||||
/**
|
||||
* Connects the TeamSpeak3_Transport_Abstract object and performs initial actions on the remote
|
||||
* server.
|
||||
*
|
||||
* @throws TeamSpeak3_Adapter_Exception
|
||||
* @return void
|
||||
*/
|
||||
public function syn()
|
||||
{
|
||||
$this->initTransport($this->options);
|
||||
$this->transport->setAdapter($this);
|
||||
|
||||
TeamSpeak3_Helper_Profiler::init(spl_object_hash($this));
|
||||
|
||||
TeamSpeak3_Helper_Signal::getInstance()->emit("filetransferConnected", $this);
|
||||
}
|
||||
|
||||
/**
|
||||
* The TeamSpeak3_Adapter_FileTransfer destructor.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function __destruct()
|
||||
{
|
||||
if($this->getTransport() instanceof TeamSpeak3_Transport_Abstract && $this->getTransport()->isConnected())
|
||||
{
|
||||
$this->getTransport()->disconnect();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Sends a valid file transfer key to the server to initialize the file transfer.
|
||||
*
|
||||
* @param string $ftkey
|
||||
* @throws TeamSpeak3_Adapter_FileTransfer_Exception
|
||||
* @return void
|
||||
*/
|
||||
protected function init($ftkey)
|
||||
{
|
||||
if(strlen($ftkey) != 32)
|
||||
{
|
||||
throw new TeamSpeak3_Adapter_FileTransfer_Exception("invalid file transfer key format");
|
||||
}
|
||||
|
||||
$this->getProfiler()->start();
|
||||
$this->getTransport()->send($ftkey);
|
||||
|
||||
TeamSpeak3_Helper_Signal::getInstance()->emit("filetransferHandshake", $this);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sends the content of a file to the server.
|
||||
*
|
||||
* @param string $ftkey
|
||||
* @param integer $seek
|
||||
* @param string $data
|
||||
* @throws TeamSpeak3_Adapter_FileTransfer_Exception
|
||||
* @return void
|
||||
*/
|
||||
public function upload($ftkey, $seek, $data)
|
||||
{
|
||||
$this->init($ftkey);
|
||||
|
||||
$size = strlen($data);
|
||||
$seek = intval($seek);
|
||||
$pack = 4096;
|
||||
|
||||
TeamSpeak3_Helper_Signal::getInstance()->emit("filetransferUploadStarted", $ftkey, $seek, $size);
|
||||
|
||||
for(;$seek < $size;)
|
||||
{
|
||||
$rest = $size-$seek;
|
||||
$pack = $rest < $pack ? $rest : $pack;
|
||||
$buff = substr($data, $seek, $pack);
|
||||
$seek = $seek+$pack;
|
||||
|
||||
$this->getTransport()->send($buff);
|
||||
|
||||
TeamSpeak3_Helper_Signal::getInstance()->emit("filetransferUploadProgress", $ftkey, $seek, $size);
|
||||
}
|
||||
|
||||
$this->getProfiler()->stop();
|
||||
|
||||
TeamSpeak3_Helper_Signal::getInstance()->emit("filetransferUploadFinished", $ftkey, $seek, $size);
|
||||
|
||||
if($seek < $size)
|
||||
{
|
||||
throw new TeamSpeak3_Adapter_FileTransfer_Exception("incomplete file upload (" . $seek . " of " . $size . " bytes)");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the content of a downloaded file as a TeamSpeak3_Helper_String object.
|
||||
*
|
||||
* @param string $ftkey
|
||||
* @param integer $size
|
||||
* @param boolean $passthru
|
||||
* @throws TeamSpeak3_Adapter_FileTransfer_Exception
|
||||
* @return TeamSpeak3_Helper_String
|
||||
*/
|
||||
public function download($ftkey, $size, $passthru = FALSE)
|
||||
{
|
||||
$this->init($ftkey);
|
||||
|
||||
if($passthru)
|
||||
{
|
||||
return $this->passthru($size);
|
||||
}
|
||||
|
||||
$buff = new TeamSpeak3_Helper_String("");
|
||||
$size = intval($size);
|
||||
$pack = 4096;
|
||||
|
||||
TeamSpeak3_Helper_Signal::getInstance()->emit("filetransferDownloadStarted", $ftkey, count($buff), $size);
|
||||
|
||||
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);
|
||||
|
||||
TeamSpeak3_Helper_Signal::getInstance()->emit("filetransferDownloadProgress", $ftkey, count($buff), $size);
|
||||
}
|
||||
|
||||
$this->getProfiler()->stop();
|
||||
|
||||
TeamSpeak3_Helper_Signal::getInstance()->emit("filetransferDownloadFinished", $ftkey, count($buff), $size);
|
||||
|
||||
if(strlen($buff) != $size)
|
||||
{
|
||||
throw new TeamSpeak3_Adapter_FileTransfer_Exception("incomplete file download (" . count($buff) . " of " . $size . " bytes)");
|
||||
}
|
||||
|
||||
return $buff;
|
||||
}
|
||||
|
||||
/**
|
||||
* Outputs all remaining data on a TeamSpeak 3 file transfer stream using PHP's fpassthru()
|
||||
* function.
|
||||
*
|
||||
* @param integer $size
|
||||
* @throws TeamSpeak3_Adapter_FileTransfer_Exception
|
||||
* @return void
|
||||
*/
|
||||
protected function passthru($size)
|
||||
{
|
||||
$buff_size = fpassthru($this->getTransport()->getStream());
|
||||
|
||||
if($buff_size != $size)
|
||||
{
|
||||
throw new TeamSpeak3_Adapter_FileTransfer_Exception("incomplete file download (" . intval($buff_size) . " of " . $size . " bytes)");
|
||||
}
|
||||
}
|
||||
}
|
||||
32
ts3_lib/Adapter/FileTransfer/Exception.php
Normal file
32
ts3_lib/Adapter/FileTransfer/Exception.php
Normal file
@@ -0,0 +1,32 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @file
|
||||
* TeamSpeak 3 PHP Framework
|
||||
*
|
||||
* $Id: Exception.php 10/11/2013 11:35:21 scp@orilla $
|
||||
*
|
||||
* 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
|
||||
* @version 1.1.23
|
||||
* @author Sven 'ScP' Paulsen
|
||||
* @copyright Copyright (c) 2010 by Planet TeamSpeak. All rights reserved.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @class TeamSpeak3_Adapter_FileTransfer_Exception
|
||||
* @brief Enhanced exception class for TeamSpeak3_Adapter_FileTransfer objects.
|
||||
*/
|
||||
class TeamSpeak3_Adapter_FileTransfer_Exception extends TeamSpeak3_Adapter_Exception {}
|
||||
261
ts3_lib/Adapter/ServerQuery.php
Normal file
261
ts3_lib/Adapter/ServerQuery.php
Normal file
@@ -0,0 +1,261 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @file
|
||||
* TeamSpeak 3 PHP Framework
|
||||
*
|
||||
* $Id: ServerQuery.php 10/11/2013 11:35:21 scp@orilla $
|
||||
*
|
||||
* 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
|
||||
* @version 1.1.23
|
||||
* @author Sven 'ScP' Paulsen
|
||||
* @copyright Copyright (c) 2010 by 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));
|
||||
|
||||
if(!$this->getTransport()->readLine()->startsWith(TeamSpeak3::READY))
|
||||
{
|
||||
throw new TeamSpeak3_Adapter_Exception("invalid reply from the server");
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
170
ts3_lib/Adapter/ServerQuery/Event.php
Normal file
170
ts3_lib/Adapter/ServerQuery/Event.php
Normal file
@@ -0,0 +1,170 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @file
|
||||
* TeamSpeak 3 PHP Framework
|
||||
*
|
||||
* $Id: Event.php 10/11/2013 11:35:21 scp@orilla $
|
||||
*
|
||||
* 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
|
||||
* @version 1.1.23
|
||||
* @author Sven 'ScP' Paulsen
|
||||
* @copyright Copyright (c) 2010 by Planet TeamSpeak. All rights reserved.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @class TeamSpeak3_Adapter_ServerQuery_Event
|
||||
* @brief Provides methods to analyze and format a ServerQuery event.
|
||||
*/
|
||||
class TeamSpeak3_Adapter_ServerQuery_Event implements ArrayAccess
|
||||
{
|
||||
/**
|
||||
* Stores the event type.
|
||||
*
|
||||
* @var TeamSpeak3_Helper_String
|
||||
*/
|
||||
protected $type = null;
|
||||
|
||||
/**
|
||||
* Stores the event data.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $data = null;
|
||||
|
||||
/**
|
||||
* Stores the event data as an unparsed string.
|
||||
*
|
||||
* @var TeamSpeak3_Helper_String
|
||||
*/
|
||||
protected $mesg = null;
|
||||
|
||||
/**
|
||||
* 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);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the event type string.
|
||||
*
|
||||
* @return TeamSpeak3_Helper_String
|
||||
*/
|
||||
public function getType()
|
||||
{
|
||||
return $this->type;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the event data array.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function getData()
|
||||
{
|
||||
return $this->data;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the event data as an unparsed string.
|
||||
*
|
||||
* @return TeamSpeak3_Helper_String
|
||||
*/
|
||||
public function getMessage()
|
||||
{
|
||||
return $this->mesg;
|
||||
}
|
||||
|
||||
/**
|
||||
* @ignore
|
||||
*/
|
||||
public function offsetExists($offset)
|
||||
{
|
||||
return array_key_exists($offset, $this->data) ? TRUE : FALSE;
|
||||
}
|
||||
|
||||
/**
|
||||
* @ignore
|
||||
*/
|
||||
public function offsetGet($offset)
|
||||
{
|
||||
if(!$this->offsetExists($offset))
|
||||
{
|
||||
throw new TeamSpeak3_Adapter_ServerQuery_Exception("invalid parameter", 0x602);
|
||||
}
|
||||
|
||||
return $this->data[$offset];
|
||||
}
|
||||
|
||||
/**
|
||||
* @ignore
|
||||
*/
|
||||
public function offsetSet($offset, $value)
|
||||
{
|
||||
throw new TeamSpeak3_Node_Exception("event '" . $this->getType() . "' is read only");
|
||||
}
|
||||
|
||||
/**
|
||||
* @ignore
|
||||
*/
|
||||
public function offsetUnset($offset)
|
||||
{
|
||||
unset($this->data[$offset]);
|
||||
}
|
||||
|
||||
/**
|
||||
* @ignore
|
||||
*/
|
||||
public function __get($offset)
|
||||
{
|
||||
return $this->offsetGet($offset);
|
||||
}
|
||||
|
||||
/**
|
||||
* @ignore
|
||||
*/
|
||||
public function __set($offset, $value)
|
||||
{
|
||||
$this->offsetSet($offset, $value);
|
||||
}
|
||||
}
|
||||
32
ts3_lib/Adapter/ServerQuery/Exception.php
Normal file
32
ts3_lib/Adapter/ServerQuery/Exception.php
Normal file
@@ -0,0 +1,32 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @file
|
||||
* TeamSpeak 3 PHP Framework
|
||||
*
|
||||
* $Id: Exception.php 10/11/2013 11:35:21 scp@orilla $
|
||||
*
|
||||
* 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
|
||||
* @version 1.1.23
|
||||
* @author Sven 'ScP' Paulsen
|
||||
* @copyright Copyright (c) 2010 by Planet TeamSpeak. All rights reserved.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @class TeamSpeak3_Adapter_ServerQuery_Exception
|
||||
* @brief Enhanced exception class for TeamSpeak3_Adapter_ServerQuery objects.
|
||||
*/
|
||||
class TeamSpeak3_Adapter_ServerQuery_Exception extends TeamSpeak3_Adapter_Exception {}
|
||||
346
ts3_lib/Adapter/ServerQuery/Reply.php
Normal file
346
ts3_lib/Adapter/ServerQuery/Reply.php
Normal file
@@ -0,0 +1,346 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @file
|
||||
* TeamSpeak 3 PHP Framework
|
||||
*
|
||||
* $Id: Reply.php 10/11/2013 11:35:21 scp@orilla $
|
||||
*
|
||||
* 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
|
||||
* @version 1.1.23
|
||||
* @author Sven 'ScP' Paulsen
|
||||
* @copyright Copyright (c) 2010 by Planet TeamSpeak. All rights reserved.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @class TeamSpeak3_Adapter_ServerQuery_Reply
|
||||
* @brief Provides methods to analyze and format a ServerQuery reply.
|
||||
*/
|
||||
class TeamSpeak3_Adapter_ServerQuery_Reply
|
||||
{
|
||||
/**
|
||||
* Stores the command used to get this reply.
|
||||
*
|
||||
* @var TeamSpeak3_Helper_String
|
||||
*/
|
||||
protected $cmd = null;
|
||||
|
||||
/**
|
||||
* Stores the servers reply (if available).
|
||||
*
|
||||
* @var TeamSpeak3_Helper_String
|
||||
*/
|
||||
protected $rpl = null;
|
||||
|
||||
/**
|
||||
* Stores connected TeamSpeak3_Node_Host object.
|
||||
*
|
||||
* @var TeamSpeak3_Node_Host
|
||||
*/
|
||||
protected $con = null;
|
||||
|
||||
/**
|
||||
* Stores an assoc array containing the error info for this reply.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $err = array();
|
||||
|
||||
/**
|
||||
* Sotres an array of events that occured before or during this reply.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $evt = array();
|
||||
|
||||
/**
|
||||
* Indicates whether exceptions should be thrown or not.
|
||||
*
|
||||
* @var boolean
|
||||
*/
|
||||
protected $exp = TRUE;
|
||||
|
||||
/**
|
||||
* Creates a new TeamSpeak3_Adapter_ServerQuery_Reply object.
|
||||
*
|
||||
* @param array $rpl
|
||||
* @param string $cmd
|
||||
* @param boolean $exp
|
||||
* @param TeamSpeak3_Node_Host $con
|
||||
* @return TeamSpeak3_Adapter_ServerQuery_Reply
|
||||
*/
|
||||
public function __construct(array $rpl, $cmd = null, TeamSpeak3_Node_Host $con = null, $exp = TRUE)
|
||||
{
|
||||
$this->cmd = new TeamSpeak3_Helper_String($cmd);
|
||||
$this->con = $con;
|
||||
$this->exp = (bool) $exp;
|
||||
|
||||
$this->fetchError(array_pop($rpl));
|
||||
$this->fetchReply($rpl);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the reply as an TeamSpeak3_Helper_String object.
|
||||
*
|
||||
* @return TeamSpeak3_Helper_String
|
||||
*/
|
||||
public function toString()
|
||||
{
|
||||
return (!func_num_args()) ? $this->rpl->unescape() : $this->rpl;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the reply as a standard PHP array where each element represents one item.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function toLines()
|
||||
{
|
||||
if(!count($this->rpl)) return array();
|
||||
|
||||
$list = $this->toString(0)->split(TeamSpeak3::SEPARATOR_LIST);
|
||||
|
||||
if(!func_num_args())
|
||||
{
|
||||
for($i = 0; $i < count($list); $i++) $list[$i]->unescape();
|
||||
}
|
||||
|
||||
return $list;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the reply as a standard PHP array where each element represents one item in table format.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function toTable()
|
||||
{
|
||||
$table = array();
|
||||
|
||||
foreach($this->toLines(0) as $cells)
|
||||
{
|
||||
$pairs = $cells->split(TeamSpeak3::SEPARATOR_CELL);
|
||||
|
||||
if(!func_num_args())
|
||||
{
|
||||
for($i = 0; $i < count($pairs); $i++) $pairs[$i]->unescape();
|
||||
}
|
||||
|
||||
$table[] = $pairs;
|
||||
}
|
||||
|
||||
return $table;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a multi-dimensional array containing the reply splitted in multiple rows and columns.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function toArray()
|
||||
{
|
||||
$array = array();
|
||||
$table = $this->toTable(1);
|
||||
|
||||
for($i = 0; $i < count($table); $i++)
|
||||
{
|
||||
foreach($table[$i] as $pair)
|
||||
{
|
||||
if(!count($pair))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
if(!$pair->contains(TeamSpeak3::SEPARATOR_PAIR))
|
||||
{
|
||||
$array[$i][$pair->toString()] = null;
|
||||
}
|
||||
else
|
||||
{
|
||||
list($ident, $value) = $pair->split(TeamSpeak3::SEPARATOR_PAIR, 2);
|
||||
|
||||
$array[$i][$ident->toString()] = $value->isInt() ? $value->toInt() : (!func_num_args() ? $value->unescape() : $value);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return $array;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a multi-dimensional assoc array containing the reply splitted in multiple rows and columns.
|
||||
* The identifier specified by key will be used while indexing the array.
|
||||
*
|
||||
* @param $key
|
||||
* @return array
|
||||
*/
|
||||
public function toAssocArray($ident)
|
||||
{
|
||||
$nodes = (func_num_args() > 1) ? $this->toArray(1) : $this->toArray();
|
||||
$array = array();
|
||||
|
||||
foreach($nodes as $node)
|
||||
{
|
||||
if(array_key_exists($ident, $node))
|
||||
{
|
||||
$array[(is_object($node[$ident])) ? $node[$ident]->toString() : $node[$ident]] = $node;
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new TeamSpeak3_Adapter_ServerQuery_Exception("invalid parameter", 0x602);
|
||||
}
|
||||
}
|
||||
|
||||
return $array;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns an array containing the reply splitted in multiple rows and columns.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function toList()
|
||||
{
|
||||
$array = func_num_args() ? $this->toArray(1) : $this->toArray();
|
||||
|
||||
if(count($array) == 1)
|
||||
{
|
||||
return array_shift($array);
|
||||
}
|
||||
|
||||
return $array;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns an array containing stdClass objects.
|
||||
*
|
||||
* @return ArrayObject
|
||||
*/
|
||||
public function toObjectArray()
|
||||
{
|
||||
$array = (func_num_args() > 1) ? $this->toArray(1) : $this->toArray();
|
||||
|
||||
for($i = 0; $i < count($array); $i++)
|
||||
{
|
||||
$array[$i] = (object) $array[$i];
|
||||
}
|
||||
|
||||
return $array;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the command used to get this reply.
|
||||
*
|
||||
* @return TeamSpeak3_Helper_String
|
||||
*/
|
||||
public function getCommandString()
|
||||
{
|
||||
return new TeamSpeak3_Helper_String($this->cmd);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns an array of events that occured before or during this reply.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function getNotifyEvents()
|
||||
{
|
||||
return $this->evt;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the value for a specified error property.
|
||||
*
|
||||
* @param string $ident
|
||||
* @param mixed $default
|
||||
* @return mixed
|
||||
*/
|
||||
public function getErrorProperty($ident, $default = null)
|
||||
{
|
||||
return (array_key_exists($ident, $this->err)) ? $this->err[$ident] : $default;
|
||||
}
|
||||
|
||||
/**
|
||||
* 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", 0x00) != 0x00 && $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"));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Parses a ServerQuery reply and creates a TeamSpeak3_Helper_String object.
|
||||
*
|
||||
* @param string $rpl
|
||||
* @return void
|
||||
*/
|
||||
protected function fetchReply($rpl)
|
||||
{
|
||||
foreach($rpl as $key => $val)
|
||||
{
|
||||
if($val->startsWith(TeamSpeak3::GREET))
|
||||
{
|
||||
unset($rpl[$key]);
|
||||
}
|
||||
elseif($val->startsWith(TeamSpeak3::EVENT))
|
||||
{
|
||||
$this->evt[] = new TeamSpeak3_Adapter_ServerQuery_Event($rpl[$key], $this->con);
|
||||
unset($rpl[$key]);
|
||||
}
|
||||
}
|
||||
|
||||
$this->rpl = new TeamSpeak3_Helper_String(implode(TeamSpeak3::SEPARATOR_LIST, $rpl));
|
||||
}
|
||||
}
|
||||
95
ts3_lib/Adapter/TSDNS.php
Normal file
95
ts3_lib/Adapter/TSDNS.php
Normal file
@@ -0,0 +1,95 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @file
|
||||
* TeamSpeak 3 PHP Framework
|
||||
*
|
||||
* $Id: TSDNS.php 10/11/2013 11:35:21 scp@orilla $
|
||||
*
|
||||
* 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
|
||||
* @version 1.1.23
|
||||
* @author Sven 'ScP' Paulsen
|
||||
* @copyright Copyright (c) 2010 by Planet TeamSpeak. All rights reserved.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @class TeamSpeak3_Adapter_TSDNS
|
||||
* @brief Provides methods to query a TSDNS server.
|
||||
*/
|
||||
class TeamSpeak3_Adapter_TSDNS extends TeamSpeak3_Adapter_Abstract
|
||||
{
|
||||
/**
|
||||
* The TCP port number used by any TSDNS server.
|
||||
*
|
||||
* @var integer
|
||||
*/
|
||||
protected $default_port = 41144;
|
||||
|
||||
/**
|
||||
* Connects the TeamSpeak3_Transport_Abstract object and performs initial actions on the remote
|
||||
* server.
|
||||
*
|
||||
* @throws TeamSpeak3_Adapter_Exception
|
||||
* @return void
|
||||
*/
|
||||
public function syn()
|
||||
{
|
||||
if(!isset($this->options["port"]) || empty($this->options["port"])) $this->options["port"] = $this->default_port;
|
||||
|
||||
$this->initTransport($this->options);
|
||||
$this->transport->setAdapter($this);
|
||||
|
||||
TeamSpeak3_Helper_Profiler::init(spl_object_hash($this));
|
||||
|
||||
TeamSpeak3_Helper_Signal::getInstance()->emit("tsdnsConnected", $this);
|
||||
}
|
||||
|
||||
/**
|
||||
* The TeamSpeak3_Adapter_FileTransfer destructor.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function __destruct()
|
||||
{
|
||||
if($this->getTransport() instanceof TeamSpeak3_Transport_Abstract && $this->getTransport()->isConnected())
|
||||
{
|
||||
$this->getTransport()->disconnect();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Queries the TSDNS server for a specified virtual hostname and returns the result.
|
||||
*
|
||||
* @param string $tsdns
|
||||
* @throws TeamSpeak3_Adapter_TSDNS_Exception
|
||||
* @return TeamSpeak3_Helper_String
|
||||
*/
|
||||
public function resolve($tsdns)
|
||||
{
|
||||
$this->getTransport()->sendLine($tsdns);
|
||||
$repl = $this->getTransport()->readLine();
|
||||
$this->getTransport()->disconnect();
|
||||
|
||||
if($repl->section(":", 0)->toInt() == 404)
|
||||
{
|
||||
throw new TeamSpeak3_Adapter_TSDNS_Exception("unable to resolve TSDNS hostname (" . $tsdns . ")");
|
||||
}
|
||||
|
||||
TeamSpeak3_Helper_Signal::getInstance()->emit("tsdnsResolved", $tsdns, $repl);
|
||||
|
||||
return $repl;
|
||||
}
|
||||
}
|
||||
32
ts3_lib/Adapter/TSDNS/Exception.php
Normal file
32
ts3_lib/Adapter/TSDNS/Exception.php
Normal file
@@ -0,0 +1,32 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @file
|
||||
* TeamSpeak 3 PHP Framework
|
||||
*
|
||||
* $Id: Exception.php 10/11/2013 11:35:21 scp@orilla $
|
||||
*
|
||||
* 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
|
||||
* @version 1.1.23
|
||||
* @author Sven 'ScP' Paulsen
|
||||
* @copyright Copyright (c) 2010 by Planet TeamSpeak. All rights reserved.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @class TeamSpeak3_Adapter_TSDNS_Exception
|
||||
* @brief Enhanced exception class for TeamSpeak3_Adapter_TSDNS objects.
|
||||
*/
|
||||
class TeamSpeak3_Adapter_TSDNS_Exception extends TeamSpeak3_Adapter_Exception {}
|
||||
217
ts3_lib/Adapter/Update.php
Normal file
217
ts3_lib/Adapter/Update.php
Normal file
@@ -0,0 +1,217 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @file
|
||||
* TeamSpeak 3 PHP Framework
|
||||
*
|
||||
* $Id: Update.php 10/11/2013 11:35:21 scp@orilla $
|
||||
*
|
||||
* 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
|
||||
* @version 1.1.23
|
||||
* @author Sven 'ScP' Paulsen
|
||||
* @copyright Copyright (c) 2010 by Planet TeamSpeak. All rights reserved.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @class TeamSpeak3_Adapter_Update
|
||||
* @brief Provides methods to query the latest TeamSpeak 3 build numbers from the master server.
|
||||
*/
|
||||
class TeamSpeak3_Adapter_Update extends TeamSpeak3_Adapter_Abstract
|
||||
{
|
||||
/**
|
||||
* The IPv4 address or FQDN of the TeamSpeak Systems update server.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $default_host = "update.teamspeak.com";
|
||||
|
||||
/**
|
||||
* The UDP port number of the TeamSpeak Systems update server.
|
||||
*
|
||||
* @var integer
|
||||
*/
|
||||
protected $default_port = 17384;
|
||||
|
||||
/**
|
||||
* Stores an array containing the latest build numbers (integer timestamps).
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $build_datetimes = null;
|
||||
|
||||
/**
|
||||
* Stores an array containing the latest version strings.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $version_strings = null;
|
||||
|
||||
/**
|
||||
* 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(33));
|
||||
|
||||
if(!preg_match_all("/,?(\d+)#([0-9a-zA-Z\._-]+),?/", $this->getTransport()->read(96), $matches) || !isset($matches[1]) || !isset($matches[2]))
|
||||
{
|
||||
throw new TeamSpeak3_Adapter_Update_Exception("invalid reply from the server");
|
||||
}
|
||||
|
||||
$this->build_datetimes = $matches[1];
|
||||
$this->version_strings = $matches[2];
|
||||
|
||||
TeamSpeak3_Helper_Signal::getInstance()->emit("updateConnected", $this);
|
||||
}
|
||||
|
||||
/**
|
||||
* The TeamSpeak3_Adapter_Update destructor.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function __destruct()
|
||||
{
|
||||
if($this->getTransport() instanceof TeamSpeak3_Transport_Abstract && $this->getTransport()->isConnected())
|
||||
{
|
||||
$this->getTransport()->disconnect();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the current build number for a specified update channel. Note that since version
|
||||
* 3.0.0, the build number represents an integer timestamp. $channel must be set to one of
|
||||
* the following values:
|
||||
*
|
||||
* - stable
|
||||
* - beta
|
||||
* - alpha
|
||||
* - server
|
||||
*
|
||||
* @param string $channel
|
||||
* @throws TeamSpeak3_Adapter_Update_Exception
|
||||
* @return integer
|
||||
*/
|
||||
public function getRev($channel = "stable")
|
||||
{
|
||||
switch($channel)
|
||||
{
|
||||
case "stable":
|
||||
return isset($this->build_datetimes[0]) ? $this->build_datetimes[0] : null;
|
||||
|
||||
case "beta":
|
||||
return isset($this->build_datetimes[1]) ? $this->build_datetimes[1] : null;
|
||||
|
||||
case "alpha":
|
||||
return isset($this->build_datetimes[2]) ? $this->build_datetimes[2] : null;
|
||||
|
||||
case "server":
|
||||
return isset($this->build_datetimes[3]) ? $this->build_datetimes[3] : null;
|
||||
|
||||
default:
|
||||
throw new TeamSpeak3_Adapter_Update_Exception("invalid update channel identifier (" . $channel . ")");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the current version string for a specified update channel. $channel must be set to
|
||||
* one of the following values:
|
||||
*
|
||||
* - stable
|
||||
* - beta
|
||||
* - alpha
|
||||
* - server
|
||||
*
|
||||
* @param string $channel
|
||||
* @throws TeamSpeak3_Adapter_Update_Exception
|
||||
* @return integer
|
||||
*/
|
||||
public function getVersion($channel = "stable")
|
||||
{
|
||||
switch($channel)
|
||||
{
|
||||
case "stable":
|
||||
return isset($this->version_strings[0]) ? $this->version_strings[0] : null;
|
||||
|
||||
case "beta":
|
||||
return isset($this->version_strings[1]) ? $this->version_strings[1] : null;
|
||||
|
||||
case "alpha":
|
||||
return isset($this->version_strings[2]) ? $this->version_strings[2] : null;
|
||||
|
||||
case "server":
|
||||
return isset($this->version_strings[3]) ? $this->version_strings[3] : null;
|
||||
|
||||
default:
|
||||
throw new TeamSpeak3_Adapter_Update_Exception("invalid update channel identifier (" . $channel . ")");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Alias for getRev() using the 'stable' update channel.
|
||||
*
|
||||
* @param string $channel
|
||||
* @return integer
|
||||
*/
|
||||
public function getClientRev()
|
||||
{
|
||||
return $this->getRev("stable");
|
||||
}
|
||||
|
||||
/**
|
||||
* Alias for getRev() using the 'server' update channel.
|
||||
*
|
||||
* @param string $channel
|
||||
* @return integer
|
||||
*/
|
||||
public function getServerRev()
|
||||
{
|
||||
return $this->getRev("server");
|
||||
}
|
||||
|
||||
/**
|
||||
* Alias for getVersion() using the 'stable' update channel.
|
||||
*
|
||||
* @param string $channel
|
||||
* @return integer
|
||||
*/
|
||||
public function getClientVersion()
|
||||
{
|
||||
return $this->getVersion("stable");
|
||||
}
|
||||
|
||||
/**
|
||||
* Alias for getVersion() using the 'server' update channel.
|
||||
*
|
||||
* @param string $channel
|
||||
* @return integer
|
||||
*/
|
||||
public function getServerVersion()
|
||||
{
|
||||
return $this->getVersion("server");
|
||||
}
|
||||
}
|
||||
32
ts3_lib/Adapter/Update/Exception.php
Normal file
32
ts3_lib/Adapter/Update/Exception.php
Normal file
@@ -0,0 +1,32 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @file
|
||||
* TeamSpeak 3 PHP Framework
|
||||
*
|
||||
* $Id: Exception.php 10/11/2013 11:35:21 scp@orilla $
|
||||
*
|
||||
* 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
|
||||
* @version 1.1.23
|
||||
* @author Sven 'ScP' Paulsen
|
||||
* @copyright Copyright (c) 2010 by Planet TeamSpeak. All rights reserved.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @class TeamSpeak3_Adapter_Update_Exception
|
||||
* @brief Enhanced exception class for TeamSpeak3_Adapter_Update objects.
|
||||
*/
|
||||
class TeamSpeak3_Adapter_Update_Exception extends TeamSpeak3_Adapter_Exception {}
|
||||
129
ts3_lib/Exception.php
Normal file
129
ts3_lib/Exception.php
Normal file
@@ -0,0 +1,129 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @file
|
||||
* TeamSpeak 3 PHP Framework
|
||||
*
|
||||
* $Id: Exception.php 10/11/2013 11:35:21 scp@orilla $
|
||||
*
|
||||
* 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
|
||||
* @version 1.1.23
|
||||
* @author Sven 'ScP' Paulsen
|
||||
* @copyright Copyright (c) 2010 by Planet TeamSpeak. All rights reserved.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @class TeamSpeak3_Exception
|
||||
* @brief Enhanced exception class for TeamSpeak3 objects.
|
||||
*/
|
||||
class TeamSpeak3_Exception extends Exception
|
||||
{
|
||||
/**
|
||||
* Stores custom error messages.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected static $messages = array();
|
||||
|
||||
/**
|
||||
* The TeamSpeak3_Exception constructor.
|
||||
*
|
||||
* @param string $mesg
|
||||
* @param integer $code
|
||||
* @return TeamSpeak3_Exception
|
||||
*/
|
||||
public function __construct($mesg, $code = 0x00)
|
||||
{
|
||||
parent::__construct($mesg, $code);
|
||||
|
||||
if(array_key_exists((int) $code, self::$messages))
|
||||
{
|
||||
$this->message = $this->prepareCustomMessage(self::$messages[intval($code)]);
|
||||
}
|
||||
|
||||
TeamSpeak3_Helper_Signal::getInstance()->emit("errorException", $this);
|
||||
}
|
||||
|
||||
/**
|
||||
* 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();
|
||||
}
|
||||
|
||||
/**
|
||||
* Registers a custom error message to $code.
|
||||
*
|
||||
* @param integer $code
|
||||
* @param string $mesg
|
||||
* @throws TeamSpeak3_Exception
|
||||
* @return void
|
||||
*/
|
||||
public static function registerCustomMessage($code, $mesg)
|
||||
{
|
||||
if(array_key_exists((int) $code, self::$messages))
|
||||
{
|
||||
throw new self("custom message for code 0x" . strtoupper(dechex($code)) . " is already registered");
|
||||
}
|
||||
|
||||
if(!is_string($mesg))
|
||||
{
|
||||
throw new self("custom message for code 0x" . strtoupper(dechex($code)) . " must be a string");
|
||||
}
|
||||
|
||||
self::$messages[(int) $code] = new TeamSpeak3_Helper_String($mesg);
|
||||
}
|
||||
|
||||
/**
|
||||
* Unregisters a custom error message from $code.
|
||||
*
|
||||
* @param integer $code
|
||||
* @throws TeamSpeak3_Exception
|
||||
* @return void
|
||||
*/
|
||||
public static function unregisterCustomMessage($code)
|
||||
{
|
||||
if(!array_key_exists((int) $code, self::$messages))
|
||||
{
|
||||
throw new self("custom message for code 0x" . strtoupper(dechex($code)) . " is not registered");
|
||||
}
|
||||
|
||||
unset(self::$messages[intval($code)]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the class from which the exception was thrown.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getSender()
|
||||
{
|
||||
$trace = $this->getTrace();
|
||||
|
||||
return (isset($trace[0]["class"])) ? $trace[0]["class"] : "{main}";
|
||||
}
|
||||
}
|
||||
269
ts3_lib/Helper/Char.php
Normal file
269
ts3_lib/Helper/Char.php
Normal file
@@ -0,0 +1,269 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @file
|
||||
* TeamSpeak 3 PHP Framework
|
||||
*
|
||||
* $Id: Char.php 10/11/2013 11:35:21 scp@orilla $
|
||||
*
|
||||
* 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
|
||||
* @version 1.1.23
|
||||
* @author Sven 'ScP' Paulsen
|
||||
* @copyright Copyright (c) 2010 by Planet TeamSpeak. All rights reserved.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @class TeamSpeak3_Helper_Char
|
||||
* @brief Helper class for char handling.
|
||||
*/
|
||||
class TeamSpeak3_Helper_Char
|
||||
{
|
||||
/**
|
||||
* Stores the original character.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $char = null;
|
||||
|
||||
/**
|
||||
* The TeamSpeak3_Helper_Char constructor.
|
||||
*
|
||||
* @param string $var
|
||||
* @throws TeamSpeak3_Helper_Exception
|
||||
* @return TeamSpeak3_Helper_Char
|
||||
*/
|
||||
public function __construct($char)
|
||||
{
|
||||
if(strlen($char) != 1)
|
||||
{
|
||||
throw new TeamSpeak3_Helper_Exception("char parameter may not contain more or less than one character");
|
||||
}
|
||||
|
||||
$this->char = strval($char);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns true if the character is a letter.
|
||||
*
|
||||
* @return boolean
|
||||
*/
|
||||
public function isLetter()
|
||||
{
|
||||
return ctype_alpha($this->char);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns true if the character is a decimal digit.
|
||||
*
|
||||
* @return boolean
|
||||
*/
|
||||
public function isDigit()
|
||||
{
|
||||
return ctype_digit($this->char);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns true if the character is a space.
|
||||
*
|
||||
* @return boolean
|
||||
*/
|
||||
public function isSpace()
|
||||
{
|
||||
return ctype_space($this->char);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns true if the character is a mark.
|
||||
*
|
||||
* @return boolean
|
||||
*/
|
||||
public function isMark()
|
||||
{
|
||||
return ctype_punct($this->char);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns true if the character is a control character (i.e. "\t").
|
||||
*
|
||||
* @return boolean
|
||||
*/
|
||||
public function isControl()
|
||||
{
|
||||
return ctype_cntrl($this->char);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns true if the character is a printable character.
|
||||
*
|
||||
* @return boolean
|
||||
*/
|
||||
public function isPrintable()
|
||||
{
|
||||
return ctype_print($this->char);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns true if the character is the Unicode character 0x0000 ("\0").
|
||||
*
|
||||
* @return boolean
|
||||
*/
|
||||
public function isNull()
|
||||
{
|
||||
return ($this->char === "\0") ? TRUE : FALSE;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns true if the character is an uppercase letter.
|
||||
*
|
||||
* @return boolean
|
||||
*/
|
||||
public function isUpper()
|
||||
{
|
||||
return ($this->char === strtoupper($this->char)) ? TRUE : FALSE;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns true if the character is a lowercase letter.
|
||||
*
|
||||
* @return boolean
|
||||
*/
|
||||
public function isLower()
|
||||
{
|
||||
return ($this->char === strtolower($this->char)) ? TRUE : FALSE;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the uppercase equivalent if the character is lowercase.
|
||||
*
|
||||
* @return TeamSpeak3_Helper_Char
|
||||
*/
|
||||
public function toUpper()
|
||||
{
|
||||
return ($this->isUpper()) ? $this : new self(strtoupper($this));
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the lowercase equivalent if the character is uppercase.
|
||||
*
|
||||
* @return TeamSpeak3_Helper_Char
|
||||
*/
|
||||
public function toLower()
|
||||
{
|
||||
return ($this->isLower()) ? $this : new self(strtolower($this));
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the ascii value of the character.
|
||||
*
|
||||
* @return integer
|
||||
*/
|
||||
public function toAscii()
|
||||
{
|
||||
return ord($this->char);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the Unicode value of the character.
|
||||
*
|
||||
* @return integer
|
||||
*/
|
||||
public function toUnicode()
|
||||
{
|
||||
$h = ord($this->char{0});
|
||||
|
||||
if($h <= 0x7F)
|
||||
{
|
||||
return $h;
|
||||
}
|
||||
else if($h < 0xC2)
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
else if($h <= 0xDF)
|
||||
{
|
||||
return ($h & 0x1F) << 6 | (ord($this->char{1}) & 0x3F);
|
||||
}
|
||||
else if($h <= 0xEF)
|
||||
{
|
||||
return ($h & 0x0F) << 12 | (ord($this->char{1}) & 0x3F) << 6 | (ord($this->char{2}) & 0x3F);
|
||||
}
|
||||
else if($h <= 0xF4)
|
||||
{
|
||||
return ($h & 0x0F) << 18 | (ord($this->char{1}) & 0x3F) << 12 | (ord($this->char{2}) & 0x3F) << 6 | (ord($this->char{3}) & 0x3F);
|
||||
}
|
||||
else
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the hexadecimal value of the char.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function toHex()
|
||||
{
|
||||
return strtoupper(dechex($this->toAscii()));
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the TeamSpeak3_Helper_Char based on a given hex value.
|
||||
*
|
||||
* @param string $hex
|
||||
* @throws TeamSpeak3_Helper_Exception
|
||||
* @return TeamSpeak3_Helper_Char
|
||||
*/
|
||||
public static function fromHex($hex)
|
||||
{
|
||||
if(strlen($hex) != 2)
|
||||
{
|
||||
throw new TeamSpeak3_Helper_Exception("given parameter '" . $hex . "' is not a valid hexadecimal number");
|
||||
}
|
||||
|
||||
return new self(chr(hexdec($hex)));
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the character as a standard string.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function toString()
|
||||
{
|
||||
return $this->char;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the integer value of the character.
|
||||
*
|
||||
* @return integer
|
||||
*/
|
||||
public function toInt()
|
||||
{
|
||||
return intval($this->char);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the character as a standard string.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function __toString()
|
||||
{
|
||||
return $this->char;
|
||||
}
|
||||
}
|
||||
349
ts3_lib/Helper/Convert.php
Normal file
349
ts3_lib/Helper/Convert.php
Normal file
@@ -0,0 +1,349 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @file
|
||||
* TeamSpeak 3 PHP Framework
|
||||
*
|
||||
* $Id: Convert.php 10/11/2013 11:35:21 scp@orilla $
|
||||
*
|
||||
* 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
|
||||
* @version 1.1.23
|
||||
* @author Sven 'ScP' Paulsen
|
||||
* @copyright Copyright (c) 2010 by Planet TeamSpeak. All rights reserved.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @class TeamSpeak3_Helper_Convert
|
||||
* @brief Helper class for data conversion.
|
||||
*/
|
||||
class TeamSpeak3_Helper_Convert
|
||||
{
|
||||
/**
|
||||
* Converts bytes to a human readable value.
|
||||
*
|
||||
* @param integer $bytes
|
||||
* @return string
|
||||
*/
|
||||
public static function bytes($bytes)
|
||||
{
|
||||
$kbytes = sprintf("%.02f", $bytes/1024);
|
||||
$mbytes = sprintf("%.02f", $kbytes/1024);
|
||||
$gbytes = sprintf("%.02f", $mbytes/1024);
|
||||
$tbytes = sprintf("%.02f", $gbytes/1024);
|
||||
|
||||
if($tbytes >= 1)
|
||||
return $tbytes . " TB";
|
||||
if($gbytes >= 1)
|
||||
return $gbytes . " GB";
|
||||
if($mbytes >= 1)
|
||||
return $mbytes . " MB";
|
||||
if($kbytes >= 1)
|
||||
return $kbytes . " KB";
|
||||
|
||||
return $bytes . " B";
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts seconds/milliseconds to a human readable value.
|
||||
*
|
||||
* @param integer $seconds
|
||||
* @param boolean $is_ms
|
||||
* @param string $format
|
||||
* @return string
|
||||
*/
|
||||
public static function seconds($seconds, $is_ms = FALSE, $format = "%dD %02d:%02d:%02d")
|
||||
{
|
||||
if($is_ms) $seconds = $seconds/1000;
|
||||
|
||||
return sprintf($format, $seconds/60/60/24, ($seconds/60/60)%24, ($seconds/60)%60, $seconds%60);
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts a given codec ID to a human readable name.
|
||||
*
|
||||
* @param integer $codec
|
||||
* @return string
|
||||
*/
|
||||
public static function codec($codec)
|
||||
{
|
||||
if($codec == TeamSpeak3::CODEC_SPEEX_NARROWBAND)
|
||||
return "Speex Narrowband";
|
||||
if($codec == TeamSpeak3::CODEC_SPEEX_WIDEBAND)
|
||||
return "Speex Wideband";
|
||||
if($codec == TeamSpeak3::CODEC_SPEEX_ULTRAWIDEBAND)
|
||||
return "Speex Ultra-Wideband";
|
||||
if($codec == TeamSpeak3::CODEC_CELT_MONO)
|
||||
return "CELT Mono";
|
||||
if($codec == TeamSpeak3::CODEC_OPUS_VOICE)
|
||||
return "Opus Voice";
|
||||
if($codec == TeamSpeak3::CODEC_OPUS_MUSIC)
|
||||
return "Opus Music";
|
||||
|
||||
return "Unknown";
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts a given group type ID to a human readable name.
|
||||
*
|
||||
* @param integer $type
|
||||
* @return string
|
||||
*/
|
||||
public static function groupType($type)
|
||||
{
|
||||
if($type == TeamSpeak3::GROUP_DBTYPE_TEMPLATE)
|
||||
return "Template";
|
||||
if($type == TeamSpeak3::GROUP_DBTYPE_REGULAR)
|
||||
return "Regular";
|
||||
if($type == TeamSpeak3::GROUP_DBTYPE_SERVERQUERY)
|
||||
return "ServerQuery";
|
||||
|
||||
return "Unknown";
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts a given permission type ID to a human readable name.
|
||||
*
|
||||
* @param integer $type
|
||||
* @return string
|
||||
*/
|
||||
public static function permissionType($type)
|
||||
{
|
||||
if($type == TeamSpeak3::PERM_TYPE_SERVERGROUP)
|
||||
return "Server Group";
|
||||
if($type == TeamSpeak3::PERM_TYPE_CLIENT)
|
||||
return "Client";
|
||||
if($type == TeamSpeak3::PERM_TYPE_CHANNEL)
|
||||
return "Channel";
|
||||
if($type == TeamSpeak3::PERM_TYPE_CHANNELGROUP)
|
||||
return "Channel Group";
|
||||
if($type == TeamSpeak3::PERM_TYPE_CHANNELCLIENT)
|
||||
return "Channel Client";
|
||||
|
||||
return "Unknown";
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts a given permission category value to a human readable name.
|
||||
*
|
||||
* @param integer $pcat
|
||||
* @return string
|
||||
*/
|
||||
public static function permissionCategory($pcat)
|
||||
{
|
||||
if($pcat == TeamSpeak3::PERM_CAT_GLOBAL)
|
||||
return "Global";
|
||||
if($pcat == TeamSpeak3::PERM_CAT_GLOBAL_INFORMATION)
|
||||
return "Global / Information";
|
||||
if($pcat == TeamSpeak3::PERM_CAT_GLOBAL_SERVER_MGMT)
|
||||
return "Global / Virtual Server Management";
|
||||
if($pcat == TeamSpeak3::PERM_CAT_GLOBAL_ADM_ACTIONS)
|
||||
return "Global / Administration";
|
||||
if($pcat == TeamSpeak3::PERM_CAT_GLOBAL_SETTINGS)
|
||||
return "Global / Settings";
|
||||
if($pcat == TeamSpeak3::PERM_CAT_SERVER)
|
||||
return "Virtual Server";
|
||||
if($pcat == TeamSpeak3::PERM_CAT_SERVER_INFORMATION)
|
||||
return "Virtual Server / Information";
|
||||
if($pcat == TeamSpeak3::PERM_CAT_SERVER_ADM_ACTIONS)
|
||||
return "Virtual Server / Administration";
|
||||
if($pcat == TeamSpeak3::PERM_CAT_SERVER_SETTINGS)
|
||||
return "Virtual Server / Settings";
|
||||
if($pcat == TeamSpeak3::PERM_CAT_CHANNEL)
|
||||
return "Channel";
|
||||
if($pcat == TeamSpeak3::PERM_CAT_CHANNEL_INFORMATION)
|
||||
return "Channel / Information";
|
||||
if($pcat == TeamSpeak3::PERM_CAT_CHANNEL_CREATE)
|
||||
return "Channel / Create";
|
||||
if($pcat == TeamSpeak3::PERM_CAT_CHANNEL_MODIFY)
|
||||
return "Channel / Modify";
|
||||
if($pcat == TeamSpeak3::PERM_CAT_CHANNEL_DELETE)
|
||||
return "Channel / Delete";
|
||||
if($pcat == TeamSpeak3::PERM_CAT_CHANNEL_ACCESS)
|
||||
return "Channel / Access";
|
||||
if($pcat == TeamSpeak3::PERM_CAT_GROUP)
|
||||
return "Group";
|
||||
if($pcat == TeamSpeak3::PERM_CAT_GROUP_INFORMATION)
|
||||
return "Group / Information";
|
||||
if($pcat == TeamSpeak3::PERM_CAT_GROUP_CREATE)
|
||||
return "Group / Create";
|
||||
if($pcat == TeamSpeak3::PERM_CAT_GROUP_MODIFY)
|
||||
return "Group / Modify";
|
||||
if($pcat == TeamSpeak3::PERM_CAT_GROUP_DELETE)
|
||||
return "Group / Delete";
|
||||
if($pcat == TeamSpeak3::PERM_CAT_CLIENT)
|
||||
return "Client";
|
||||
if($pcat == TeamSpeak3::PERM_CAT_CLIENT_INFORMATION)
|
||||
return "Client / Information";
|
||||
if($pcat == TeamSpeak3::PERM_CAT_CLIENT_ADM_ACTIONS)
|
||||
return "Client / Admin";
|
||||
if($pcat == TeamSpeak3::PERM_CAT_CLIENT_BASICS)
|
||||
return "Client / Basics";
|
||||
if($pcat == TeamSpeak3::PERM_CAT_CLIENT_MODIFY)
|
||||
return "Client / Modify";
|
||||
if($pcat == TeamSpeak3::PERM_CAT_FILETRANSFER)
|
||||
return "File Transfer";
|
||||
if($pcat == TeamSpeak3::PERM_CAT_NEEDED_MODIFY_POWER)
|
||||
return "Grant";
|
||||
|
||||
return "Unknown";
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts a given log level ID to a human readable name and vice versa.
|
||||
*
|
||||
* @param mixed $level
|
||||
* @return string
|
||||
*/
|
||||
public static function logLevel($level)
|
||||
{
|
||||
if(is_numeric($level))
|
||||
{
|
||||
if($level == TeamSpeak3::LOGLEVEL_CRITICAL)
|
||||
return "CRITICAL";
|
||||
if($level == TeamSpeak3::LOGLEVEL_ERROR)
|
||||
return "ERROR";
|
||||
if($level == TeamSpeak3::LOGLEVEL_DEBUG)
|
||||
return "DEBUG";
|
||||
if($level == TeamSpeak3::LOGLEVEL_WARNING)
|
||||
return "WARNING";
|
||||
if($level == TeamSpeak3::LOGLEVEL_INFO)
|
||||
return "INFO";
|
||||
|
||||
return "DEVELOP";
|
||||
}
|
||||
else
|
||||
{
|
||||
if(strtoupper($level) == "CRITICAL")
|
||||
return TeamSpeak3::LOGLEVEL_CRITICAL;
|
||||
if(strtoupper($level) == "ERROR")
|
||||
return TeamSpeak3::LOGLEVEL_ERROR;
|
||||
if(strtoupper($level) == "DEBUG")
|
||||
return TeamSpeak3::LOGLEVEL_DEBUG;
|
||||
if(strtoupper($level) == "WARNING")
|
||||
return TeamSpeak3::LOGLEVEL_WARNING;
|
||||
if(strtoupper($level) == "INFO")
|
||||
return TeamSpeak3::LOGLEVEL_INFO;
|
||||
|
||||
return TeamSpeak3::LOGLEVEL_DEVEL;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts a specified log entry string into an array containing the data.
|
||||
*
|
||||
* @param string $entry
|
||||
* @return array
|
||||
*/
|
||||
public static function logEntry($entry)
|
||||
{
|
||||
$parts = explode("|", $entry, 5);
|
||||
$array = array();
|
||||
|
||||
if(count($parts) != 5)
|
||||
{
|
||||
$array["timestamp"] = 0;
|
||||
$array["level"] = TeamSpeak3::LOGLEVEL_ERROR;
|
||||
$array["channel"] = "ParamParser";
|
||||
$array["server_id"] = "";
|
||||
$array["msg"] = TeamSpeak3_Helper_String::factory("convert error (" . trim($entry) . ")");
|
||||
$array["msg_plain"] = $entry;
|
||||
$array["malformed"] = TRUE;
|
||||
}
|
||||
else
|
||||
{
|
||||
$array["timestamp"] = strtotime(trim($parts[0]));
|
||||
$array["level"] = self::logLevel(trim($parts[1]));
|
||||
$array["channel"] = trim($parts[2]);
|
||||
$array["server_id"] = trim($parts[3]);
|
||||
$array["msg"] = TeamSpeak3_Helper_String::factory(trim($parts[4]));
|
||||
$array["msg_plain"] = $entry;
|
||||
$array["malformed"] = FALSE;
|
||||
}
|
||||
|
||||
return $array;
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts a given string to a ServerQuery password hash.
|
||||
*
|
||||
* @param string $plain
|
||||
* @return string
|
||||
*/
|
||||
public static function password($plain)
|
||||
{
|
||||
return base64_encode(sha1($plain, TRUE));
|
||||
}
|
||||
|
||||
/**
|
||||
* 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) . ")");
|
||||
}
|
||||
|
||||
/**
|
||||
* 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);
|
||||
}
|
||||
|
||||
/**
|
||||
* Tries to detect the type of an image by a given string and returns it.
|
||||
*
|
||||
* @param string $binary
|
||||
* @return string
|
||||
*/
|
||||
public static function imageMimeType($binary)
|
||||
{
|
||||
if(!preg_match('/\A(?:(\xff\xd8\xff)|(GIF8[79]a)|(\x89PNG\x0d\x0a)|(BM)|(\x49\x49(\x2a\x00|\x00\x4a))|(FORM.{4}ILBM))/', $binary, $matches))
|
||||
{
|
||||
return "application/octet-stream";
|
||||
}
|
||||
|
||||
$type = array(
|
||||
1 => "image/jpeg",
|
||||
2 => "image/gif",
|
||||
3 => "image/png",
|
||||
4 => "image/x-windows-bmp",
|
||||
5 => "image/tiff",
|
||||
6 => "image/x-ilbm",
|
||||
);
|
||||
|
||||
return $type[count($matches)-1];
|
||||
}
|
||||
}
|
||||
482
ts3_lib/Helper/Crypt.php
Normal file
482
ts3_lib/Helper/Crypt.php
Normal file
@@ -0,0 +1,482 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @file
|
||||
* TeamSpeak 3 PHP Framework
|
||||
*
|
||||
* $Id: Crypt.php 10/11/2013 11:35:21 scp@orilla $
|
||||
*
|
||||
* 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
|
||||
* @version 1.1.23
|
||||
* @author Sven 'ScP' Paulsen
|
||||
* @copyright Copyright (c) 2010 by Planet TeamSpeak. All rights reserved.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @class TeamSpeak3_Helper_Crypt
|
||||
* @brief Helper class for data encryption.
|
||||
*/
|
||||
class TeamSpeak3_Helper_Crypt
|
||||
{
|
||||
/**
|
||||
* Stores the secret passphrase to encrypt or decrypt a given string.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $passphrase = null;
|
||||
|
||||
/**
|
||||
* Stores an array containing 18 32-bit entries.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $p = array();
|
||||
|
||||
/**
|
||||
* Stores an array containing 4 sub-arrays with 256 32-bit entries.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $s = array();
|
||||
|
||||
/**
|
||||
* The TeamSpeak3_Helper_Crypt constructor.
|
||||
*
|
||||
* @param string $secret
|
||||
* @return TeamSpeak3_Helper_Crypt
|
||||
*/
|
||||
public function __construct($secret)
|
||||
{
|
||||
$this->setDefaultKeys();
|
||||
$this->setSecretKey($secret);
|
||||
}
|
||||
|
||||
/**
|
||||
* Encrypts a given string.
|
||||
*
|
||||
* @param string $string
|
||||
* @return string
|
||||
*/
|
||||
public function encrypt($string)
|
||||
{
|
||||
$string = trim($string);
|
||||
$encryp = "";
|
||||
$length = strlen($string);
|
||||
$string .= str_repeat(chr(0), (8-($length%8))%8);
|
||||
|
||||
for($i = 0; $i < $length; $i += 8)
|
||||
{
|
||||
list(,$xl,$xr) = unpack("N2", substr($string, $i, 8));
|
||||
$this->encipher($xl, $xr);
|
||||
$encryp .= pack("N2", $xl, $xr);
|
||||
}
|
||||
|
||||
return base64_encode($encryp);
|
||||
}
|
||||
|
||||
/**
|
||||
* Decrypts a given string.
|
||||
*
|
||||
* @param string $string
|
||||
* @return string
|
||||
*/
|
||||
public function decrypt($string)
|
||||
{
|
||||
$string = base64_decode($string);
|
||||
$decryp = "";
|
||||
$length = strlen($string);
|
||||
$string .= str_repeat(chr(0), (8-($length%8))%8);
|
||||
|
||||
for($i = 0; $i < $length; $i += 8)
|
||||
{
|
||||
list(,$xl,$xr) = unpack("N2", substr($string, $i, 8));
|
||||
$this->decipher($xl, $xr);
|
||||
$decryp .= pack("N2", $xl, $xr);
|
||||
}
|
||||
|
||||
return trim($decryp);
|
||||
}
|
||||
|
||||
/**
|
||||
* Enciphers a single 64-bit block.
|
||||
*
|
||||
* @param integer $xl
|
||||
* @param integer $xr
|
||||
*/
|
||||
protected function encipher(&$xl, &$xr)
|
||||
{
|
||||
for($i = 0; $i < 16; $i++)
|
||||
{
|
||||
$temp = $xl ^ $this->p[$i];
|
||||
$xl = ((($this->s[0][($temp>>24) & 255] + $this->s[1][($temp>>16) & 255]) ^ $this->s[2][($temp>>8) & 255]) + $this->s[3][$temp & 255]) ^ $xr;
|
||||
$xr = $temp;
|
||||
}
|
||||
|
||||
$xr = $xl ^ $this->p[16];
|
||||
$xl = $temp ^ $this->p[17];
|
||||
}
|
||||
|
||||
/**
|
||||
* Deciphers a single 64-bit block
|
||||
*
|
||||
* @param integer $xl
|
||||
* @param integer $xr
|
||||
* @return void
|
||||
*/
|
||||
protected function decipher(&$xl, &$xr)
|
||||
{
|
||||
for($i = 17; $i > 1; $i--)
|
||||
{
|
||||
$temp = $xl ^ $this->p[$i];
|
||||
$xl = ((($this->s[0][($temp>>24) & 255] + $this->s[1][($temp>>16) & 255]) ^ $this->s[2][($temp>>8) & 255]) + $this->s[3][$temp & 255]) ^ $xr;
|
||||
$xr = $temp;
|
||||
}
|
||||
|
||||
$xr = $xl ^ $this->p[1];
|
||||
$xl = $temp ^ $this->p[0];
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the secret key using the specified pasphrase.
|
||||
*
|
||||
* @param string $passphrase
|
||||
* @throws Habitat_Exception
|
||||
* @return void
|
||||
*/
|
||||
protected function setSecretKey($passphrase)
|
||||
{
|
||||
$length = strlen($passphrase);
|
||||
|
||||
if(strlen($passphrase) < 1 || strlen($passphrase) > 56)
|
||||
{
|
||||
throw new TeamSpeak3_Helper_Exception("secret passphrase must contain at least one but less than 56 characters");
|
||||
}
|
||||
|
||||
$k = 0;
|
||||
$data = 0;
|
||||
$datal = 0;
|
||||
$datar = 0;
|
||||
|
||||
for($i = 0; $i < 18; $i++)
|
||||
{
|
||||
$data = 0;
|
||||
for($j = 4; $j > 0; $j--)
|
||||
{
|
||||
$data = $data << 8 | ord($passphrase{$k});
|
||||
$k = ($k+1) % $length;
|
||||
}
|
||||
$this->p[$i] ^= $data;
|
||||
}
|
||||
|
||||
|
||||
for($i = 0; $i <= 16; $i += 2)
|
||||
{
|
||||
$this->encipher($datal, $datar);
|
||||
$this->p[$i] = $datal;
|
||||
$this->p[$i+1] = $datar;
|
||||
}
|
||||
|
||||
foreach($this->s as $key => $val)
|
||||
{
|
||||
for ($i = 0; $i < 256; $i += 2)
|
||||
{
|
||||
$this->encipher($datal, $datar);
|
||||
$this->s[$key][$i] = $datal;
|
||||
$this->s[$key][$i+1] = $datar;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the defult p and s keys.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
protected function setDefaultKeys()
|
||||
{
|
||||
$this->p = array(
|
||||
0x243F6A88, 0x85A308D3, 0x13198A2E, 0x03707344, 0xA4093822, 0x299F31D0,
|
||||
0x082EFA98, 0xEC4E6C89, 0x452821E6, 0x38D01377, 0xBE5466CF, 0x34E90C6C,
|
||||
0xC0AC29B7, 0xC97C50DD, 0x3F84D5B5, 0xB5470917, 0x9216D5D9, 0x8979FB1B,
|
||||
);
|
||||
$this->s = array(
|
||||
array(
|
||||
0xD1310BA6, 0x98DFB5AC, 0x2FFD72DB, 0xD01ADFB7,
|
||||
0xB8E1AFED, 0x6A267E96, 0xBA7C9045, 0xF12C7F99,
|
||||
0x24A19947, 0xB3916CF7, 0x0801F2E2, 0x858EFC16,
|
||||
0x636920D8, 0x71574E69, 0xA458FEA3, 0xF4933D7E,
|
||||
0x0D95748F, 0x728EB658, 0x718BCD58, 0x82154AEE,
|
||||
0x7B54A41D, 0xC25A59B5, 0x9C30D539, 0x2AF26013,
|
||||
0xC5D1B023, 0x286085F0, 0xCA417918, 0xB8DB38EF,
|
||||
0x8E79DCB0, 0x603A180E, 0x6C9E0E8B, 0xB01E8A3E,
|
||||
0xD71577C1, 0xBD314B27, 0x78AF2FDA, 0x55605C60,
|
||||
0xE65525F3, 0xAA55AB94, 0x57489862, 0x63E81440,
|
||||
0x55CA396A, 0x2AAB10B6, 0xB4CC5C34, 0x1141E8CE,
|
||||
0xA15486AF, 0x7C72E993, 0xB3EE1411, 0x636FBC2A,
|
||||
0x2BA9C55D, 0x741831F6, 0xCE5C3E16, 0x9B87931E,
|
||||
0xAFD6BA33, 0x6C24CF5C, 0x7A325381, 0x28958677,
|
||||
0x3B8F4898, 0x6B4BB9AF, 0xC4BFE81B, 0x66282193,
|
||||
0x61D809CC, 0xFB21A991, 0x487CAC60, 0x5DEC8032,
|
||||
0xEF845D5D, 0xE98575B1, 0xDC262302, 0xEB651B88,
|
||||
0x23893E81, 0xD396ACC5, 0x0F6D6FF3, 0x83F44239,
|
||||
0x2E0B4482, 0xA4842004, 0x69C8F04A, 0x9E1F9B5E,
|
||||
0x21C66842, 0xF6E96C9A, 0x670C9C61, 0xABD388F0,
|
||||
0x6A51A0D2, 0xD8542F68, 0x960FA728, 0xAB5133A3,
|
||||
0x6EEF0B6C, 0x137A3BE4, 0xBA3BF050, 0x7EFB2A98,
|
||||
0xA1F1651D, 0x39AF0176, 0x66CA593E, 0x82430E88,
|
||||
0x8CEE8619, 0x456F9FB4, 0x7D84A5C3, 0x3B8B5EBE,
|
||||
0xE06F75D8, 0x85C12073, 0x401A449F, 0x56C16AA6,
|
||||
0x4ED3AA62, 0x363F7706, 0x1BFEDF72, 0x429B023D,
|
||||
0x37D0D724, 0xD00A1248, 0xDB0FEAD3, 0x49F1C09B,
|
||||
0x075372C9, 0x80991B7B, 0x25D479D8, 0xF6E8DEF7,
|
||||
0xE3FE501A, 0xB6794C3B, 0x976CE0BD, 0x04C006BA,
|
||||
0xC1A94FB6, 0x409F60C4, 0x5E5C9EC2, 0x196A2463,
|
||||
0x68FB6FAF, 0x3E6C53B5, 0x1339B2EB, 0x3B52EC6F,
|
||||
0x6DFC511F, 0x9B30952C, 0xCC814544, 0xAF5EBD09,
|
||||
0xBEE3D004, 0xDE334AFD, 0x660F2807, 0x192E4BB3,
|
||||
0xC0CBA857, 0x45C8740F, 0xD20B5F39, 0xB9D3FBDB,
|
||||
0x5579C0BD, 0x1A60320A, 0xD6A100C6, 0x402C7279,
|
||||
0x679F25FE, 0xFB1FA3CC, 0x8EA5E9F8, 0xDB3222F8,
|
||||
0x3C7516DF, 0xFD616B15, 0x2F501EC8, 0xAD0552AB,
|
||||
0x323DB5FA, 0xFD238760, 0x53317B48, 0x3E00DF82,
|
||||
0x9E5C57BB, 0xCA6F8CA0, 0x1A87562E, 0xDF1769DB,
|
||||
0xD542A8F6, 0x287EFFC3, 0xAC6732C6, 0x8C4F5573,
|
||||
0x695B27B0, 0xBBCA58C8, 0xE1FFA35D, 0xB8F011A0,
|
||||
0x10FA3D98, 0xFD2183B8, 0x4AFCB56C, 0x2DD1D35B,
|
||||
0x9A53E479, 0xB6F84565, 0xD28E49BC, 0x4BFB9790,
|
||||
0xE1DDF2DA, 0xA4CB7E33, 0x62FB1341, 0xCEE4C6E8,
|
||||
0xEF20CADA, 0x36774C01, 0xD07E9EFE, 0x2BF11FB4,
|
||||
0x95DBDA4D, 0xAE909198, 0xEAAD8E71, 0x6B93D5A0,
|
||||
0xD08ED1D0, 0xAFC725E0, 0x8E3C5B2F, 0x8E7594B7,
|
||||
0x8FF6E2FB, 0xF2122B64, 0x8888B812, 0x900DF01C,
|
||||
0x4FAD5EA0, 0x688FC31C, 0xD1CFF191, 0xB3A8C1AD,
|
||||
0x2F2F2218, 0xBE0E1777, 0xEA752DFE, 0x8B021FA1,
|
||||
0xE5A0CC0F, 0xB56F74E8, 0x18ACF3D6, 0xCE89E299,
|
||||
0xB4A84FE0, 0xFD13E0B7, 0x7CC43B81, 0xD2ADA8D9,
|
||||
0x165FA266, 0x80957705, 0x93CC7314, 0x211A1477,
|
||||
0xE6AD2065, 0x77B5FA86, 0xC75442F5, 0xFB9D35CF,
|
||||
0xEBCDAF0C, 0x7B3E89A0, 0xD6411BD3, 0xAE1E7E49,
|
||||
0x00250E2D, 0x2071B35E, 0x226800BB, 0x57B8E0AF,
|
||||
0x2464369B, 0xF009B91E, 0x5563911D, 0x59DFA6AA,
|
||||
0x78C14389, 0xD95A537F, 0x207D5BA2, 0x02E5B9C5,
|
||||
0x83260376, 0x6295CFA9, 0x11C81968, 0x4E734A41,
|
||||
0xB3472DCA, 0x7B14A94A, 0x1B510052, 0x9A532915,
|
||||
0xD60F573F, 0xBC9BC6E4, 0x2B60A476, 0x81E67400,
|
||||
0x08BA6FB5, 0x571BE91F, 0xF296EC6B, 0x2A0DD915,
|
||||
0xB6636521, 0xE7B9F9B6, 0xFF34052E, 0xC5855664,
|
||||
0x53B02D5D, 0xA99F8FA1, 0x08BA4799, 0x6E85076A
|
||||
),
|
||||
array(
|
||||
0x4B7A70E9, 0xB5B32944, 0xDB75092E, 0xC4192623,
|
||||
0xAD6EA6B0, 0x49A7DF7D, 0x9CEE60B8, 0x8FEDB266,
|
||||
0xECAA8C71, 0x699A17FF, 0x5664526C, 0xC2B19EE1,
|
||||
0x193602A5, 0x75094C29, 0xA0591340, 0xE4183A3E,
|
||||
0x3F54989A, 0x5B429D65, 0x6B8FE4D6, 0x99F73FD6,
|
||||
0xA1D29C07, 0xEFE830F5, 0x4D2D38E6, 0xF0255DC1,
|
||||
0x4CDD2086, 0x8470EB26, 0x6382E9C6, 0x021ECC5E,
|
||||
0x09686B3F, 0x3EBAEFC9, 0x3C971814, 0x6B6A70A1,
|
||||
0x687F3584, 0x52A0E286, 0xB79C5305, 0xAA500737,
|
||||
0x3E07841C, 0x7FDEAE5C, 0x8E7D44EC, 0x5716F2B8,
|
||||
0xB03ADA37, 0xF0500C0D, 0xF01C1F04, 0x0200B3FF,
|
||||
0xAE0CF51A, 0x3CB574B2, 0x25837A58, 0xDC0921BD,
|
||||
0xD19113F9, 0x7CA92FF6, 0x94324773, 0x22F54701,
|
||||
0x3AE5E581, 0x37C2DADC, 0xC8B57634, 0x9AF3DDA7,
|
||||
0xA9446146, 0x0FD0030E, 0xECC8C73E, 0xA4751E41,
|
||||
0xE238CD99, 0x3BEA0E2F, 0x3280BBA1, 0x183EB331,
|
||||
0x4E548B38, 0x4F6DB908, 0x6F420D03, 0xF60A04BF,
|
||||
0x2CB81290, 0x24977C79, 0x5679B072, 0xBCAF89AF,
|
||||
0xDE9A771F, 0xD9930810, 0xB38BAE12, 0xDCCF3F2E,
|
||||
0x5512721F, 0x2E6B7124, 0x501ADDE6, 0x9F84CD87,
|
||||
0x7A584718, 0x7408DA17, 0xBC9F9ABC, 0xE94B7D8C,
|
||||
0xEC7AEC3A, 0xDB851DFA, 0x63094366, 0xC464C3D2,
|
||||
0xEF1C1847, 0x3215D908, 0xDD433B37, 0x24C2BA16,
|
||||
0x12A14D43, 0x2A65C451, 0x50940002, 0x133AE4DD,
|
||||
0x71DFF89E, 0x10314E55, 0x81AC77D6, 0x5F11199B,
|
||||
0x043556F1, 0xD7A3C76B, 0x3C11183B, 0x5924A509,
|
||||
0xF28FE6ED, 0x97F1FBFA, 0x9EBABF2C, 0x1E153C6E,
|
||||
0x86E34570, 0xEAE96FB1, 0x860E5E0A, 0x5A3E2AB3,
|
||||
0x771FE71C, 0x4E3D06FA, 0x2965DCB9, 0x99E71D0F,
|
||||
0x803E89D6, 0x5266C825, 0x2E4CC978, 0x9C10B36A,
|
||||
0xC6150EBA, 0x94E2EA78, 0xA5FC3C53, 0x1E0A2DF4,
|
||||
0xF2F74EA7, 0x361D2B3D, 0x1939260F, 0x19C27960,
|
||||
0x5223A708, 0xF71312B6, 0xEBADFE6E, 0xEAC31F66,
|
||||
0xE3BC4595, 0xA67BC883, 0xB17F37D1, 0x018CFF28,
|
||||
0xC332DDEF, 0xBE6C5AA5, 0x65582185, 0x68AB9802,
|
||||
0xEECEA50F, 0xDB2F953B, 0x2AEF7DAD, 0x5B6E2F84,
|
||||
0x1521B628, 0x29076170, 0xECDD4775, 0x619F1510,
|
||||
0x13CCA830, 0xEB61BD96, 0x0334FE1E, 0xAA0363CF,
|
||||
0xB5735C90, 0x4C70A239, 0xD59E9E0B, 0xCBAADE14,
|
||||
0xEECC86BC, 0x60622CA7, 0x9CAB5CAB, 0xB2F3846E,
|
||||
0x648B1EAF, 0x19BDF0CA, 0xA02369B9, 0x655ABB50,
|
||||
0x40685A32, 0x3C2AB4B3, 0x319EE9D5, 0xC021B8F7,
|
||||
0x9B540B19, 0x875FA099, 0x95F7997E, 0x623D7DA8,
|
||||
0xF837889A, 0x97E32D77, 0x11ED935F, 0x16681281,
|
||||
0x0E358829, 0xC7E61FD6, 0x96DEDFA1, 0x7858BA99,
|
||||
0x57F584A5, 0x1B227263, 0x9B83C3FF, 0x1AC24696,
|
||||
0xCDB30AEB, 0x532E3054, 0x8FD948E4, 0x6DBC3128,
|
||||
0x58EBF2EF, 0x34C6FFEA, 0xFE28ED61, 0xEE7C3C73,
|
||||
0x5D4A14D9, 0xE864B7E3, 0x42105D14, 0x203E13E0,
|
||||
0x45EEE2B6, 0xA3AAABEA, 0xDB6C4F15, 0xFACB4FD0,
|
||||
0xC742F442, 0xEF6ABBB5, 0x654F3B1D, 0x41CD2105,
|
||||
0xD81E799E, 0x86854DC7, 0xE44B476A, 0x3D816250,
|
||||
0xCF62A1F2, 0x5B8D2646, 0xFC8883A0, 0xC1C7B6A3,
|
||||
0x7F1524C3, 0x69CB7492, 0x47848A0B, 0x5692B285,
|
||||
0x095BBF00, 0xAD19489D, 0x1462B174, 0x23820E00,
|
||||
0x58428D2A, 0x0C55F5EA, 0x1DADF43E, 0x233F7061,
|
||||
0x3372F092, 0x8D937E41, 0xD65FECF1, 0x6C223BDB,
|
||||
0x7CDE3759, 0xCBEE7460, 0x4085F2A7, 0xCE77326E,
|
||||
0xA6078084, 0x19F8509E, 0xE8EFD855, 0x61D99735,
|
||||
0xA969A7AA, 0xC50C06C2, 0x5A04ABFC, 0x800BCADC,
|
||||
0x9E447A2E, 0xC3453484, 0xFDD56705, 0x0E1E9EC9,
|
||||
0xDB73DBD3, 0x105588CD, 0x675FDA79, 0xE3674340,
|
||||
0xC5C43465, 0x713E38D8, 0x3D28F89E, 0xF16DFF20,
|
||||
0x153E21E7, 0x8FB03D4A, 0xE6E39F2B, 0xDB83ADF7
|
||||
),
|
||||
array(
|
||||
0xE93D5A68, 0x948140F7, 0xF64C261C, 0x94692934,
|
||||
0x411520F7, 0x7602D4F7, 0xBCF46B2E, 0xD4A20068,
|
||||
0xD4082471, 0x3320F46A, 0x43B7D4B7, 0x500061AF,
|
||||
0x1E39F62E, 0x97244546, 0x14214F74, 0xBF8B8840,
|
||||
0x4D95FC1D, 0x96B591AF, 0x70F4DDD3, 0x66A02F45,
|
||||
0xBFBC09EC, 0x03BD9785, 0x7FAC6DD0, 0x31CB8504,
|
||||
0x96EB27B3, 0x55FD3941, 0xDA2547E6, 0xABCA0A9A,
|
||||
0x28507825, 0x530429F4, 0x0A2C86DA, 0xE9B66DFB,
|
||||
0x68DC1462, 0xD7486900, 0x680EC0A4, 0x27A18DEE,
|
||||
0x4F3FFEA2, 0xE887AD8C, 0xB58CE006, 0x7AF4D6B6,
|
||||
0xAACE1E7C, 0xD3375FEC, 0xCE78A399, 0x406B2A42,
|
||||
0x20FE9E35, 0xD9F385B9, 0xEE39D7AB, 0x3B124E8B,
|
||||
0x1DC9FAF7, 0x4B6D1856, 0x26A36631, 0xEAE397B2,
|
||||
0x3A6EFA74, 0xDD5B4332, 0x6841E7F7, 0xCA7820FB,
|
||||
0xFB0AF54E, 0xD8FEB397, 0x454056AC, 0xBA489527,
|
||||
0x55533A3A, 0x20838D87, 0xFE6BA9B7, 0xD096954B,
|
||||
0x55A867BC, 0xA1159A58, 0xCCA92963, 0x99E1DB33,
|
||||
0xA62A4A56, 0x3F3125F9, 0x5EF47E1C, 0x9029317C,
|
||||
0xFDF8E802, 0x04272F70, 0x80BB155C, 0x05282CE3,
|
||||
0x95C11548, 0xE4C66D22, 0x48C1133F, 0xC70F86DC,
|
||||
0x07F9C9EE, 0x41041F0F, 0x404779A4, 0x5D886E17,
|
||||
0x325F51EB, 0xD59BC0D1, 0xF2BCC18F, 0x41113564,
|
||||
0x257B7834, 0x602A9C60, 0xDFF8E8A3, 0x1F636C1B,
|
||||
0x0E12B4C2, 0x02E1329E, 0xAF664FD1, 0xCAD18115,
|
||||
0x6B2395E0, 0x333E92E1, 0x3B240B62, 0xEEBEB922,
|
||||
0x85B2A20E, 0xE6BA0D99, 0xDE720C8C, 0x2DA2F728,
|
||||
0xD0127845, 0x95B794FD, 0x647D0862, 0xE7CCF5F0,
|
||||
0x5449A36F, 0x877D48FA, 0xC39DFD27, 0xF33E8D1E,
|
||||
0x0A476341, 0x992EFF74, 0x3A6F6EAB, 0xF4F8FD37,
|
||||
0xA812DC60, 0xA1EBDDF8, 0x991BE14C, 0xDB6E6B0D,
|
||||
0xC67B5510, 0x6D672C37, 0x2765D43B, 0xDCD0E804,
|
||||
0xF1290DC7, 0xCC00FFA3, 0xB5390F92, 0x690FED0B,
|
||||
0x667B9FFB, 0xCEDB7D9C, 0xA091CF0B, 0xD9155EA3,
|
||||
0xBB132F88, 0x515BAD24, 0x7B9479BF, 0x763BD6EB,
|
||||
0x37392EB3, 0xCC115979, 0x8026E297, 0xF42E312D,
|
||||
0x6842ADA7, 0xC66A2B3B, 0x12754CCC, 0x782EF11C,
|
||||
0x6A124237, 0xB79251E7, 0x06A1BBE6, 0x4BFB6350,
|
||||
0x1A6B1018, 0x11CAEDFA, 0x3D25BDD8, 0xE2E1C3C9,
|
||||
0x44421659, 0x0A121386, 0xD90CEC6E, 0xD5ABEA2A,
|
||||
0x64AF674E, 0xDA86A85F, 0xBEBFE988, 0x64E4C3FE,
|
||||
0x9DBC8057, 0xF0F7C086, 0x60787BF8, 0x6003604D,
|
||||
0xD1FD8346, 0xF6381FB0, 0x7745AE04, 0xD736FCCC,
|
||||
0x83426B33, 0xF01EAB71, 0xB0804187, 0x3C005E5F,
|
||||
0x77A057BE, 0xBDE8AE24, 0x55464299, 0xBF582E61,
|
||||
0x4E58F48F, 0xF2DDFDA2, 0xF474EF38, 0x8789BDC2,
|
||||
0x5366F9C3, 0xC8B38E74, 0xB475F255, 0x46FCD9B9,
|
||||
0x7AEB2661, 0x8B1DDF84, 0x846A0E79, 0x915F95E2,
|
||||
0x466E598E, 0x20B45770, 0x8CD55591, 0xC902DE4C,
|
||||
0xB90BACE1, 0xBB8205D0, 0x11A86248, 0x7574A99E,
|
||||
0xB77F19B6, 0xE0A9DC09, 0x662D09A1, 0xC4324633,
|
||||
0xE85A1F02, 0x09F0BE8C, 0x4A99A025, 0x1D6EFE10,
|
||||
0x1AB93D1D, 0x0BA5A4DF, 0xA186F20F, 0x2868F169,
|
||||
0xDCB7DA83, 0x573906FE, 0xA1E2CE9B, 0x4FCD7F52,
|
||||
0x50115E01, 0xA70683FA, 0xA002B5C4, 0x0DE6D027,
|
||||
0x9AF88C27, 0x773F8641, 0xC3604C06, 0x61A806B5,
|
||||
0xF0177A28, 0xC0F586E0, 0x006058AA, 0x30DC7D62,
|
||||
0x11E69ED7, 0x2338EA63, 0x53C2DD94, 0xC2C21634,
|
||||
0xBBCBEE56, 0x90BCB6DE, 0xEBFC7DA1, 0xCE591D76,
|
||||
0x6F05E409, 0x4B7C0188, 0x39720A3D, 0x7C927C24,
|
||||
0x86E3725F, 0x724D9DB9, 0x1AC15BB4, 0xD39EB8FC,
|
||||
0xED545578, 0x08FCA5B5, 0xD83D7CD3, 0x4DAD0FC4,
|
||||
0x1E50EF5E, 0xB161E6F8, 0xA28514D9, 0x6C51133C,
|
||||
0x6FD5C7E7, 0x56E14EC4, 0x362ABFCE, 0xDDC6C837,
|
||||
0xD79A3234, 0x92638212, 0x670EFA8E, 0x406000E0
|
||||
),
|
||||
array(
|
||||
0x3A39CE37, 0xD3FAF5CF, 0xABC27737, 0x5AC52D1B,
|
||||
0x5CB0679E, 0x4FA33742, 0xD3822740, 0x99BC9BBE,
|
||||
0xD5118E9D, 0xBF0F7315, 0xD62D1C7E, 0xC700C47B,
|
||||
0xB78C1B6B, 0x21A19045, 0xB26EB1BE, 0x6A366EB4,
|
||||
0x5748AB2F, 0xBC946E79, 0xC6A376D2, 0x6549C2C8,
|
||||
0x530FF8EE, 0x468DDE7D, 0xD5730A1D, 0x4CD04DC6,
|
||||
0x2939BBDB, 0xA9BA4650, 0xAC9526E8, 0xBE5EE304,
|
||||
0xA1FAD5F0, 0x6A2D519A, 0x63EF8CE2, 0x9A86EE22,
|
||||
0xC089C2B8, 0x43242EF6, 0xA51E03AA, 0x9CF2D0A4,
|
||||
0x83C061BA, 0x9BE96A4D, 0x8FE51550, 0xBA645BD6,
|
||||
0x2826A2F9, 0xA73A3AE1, 0x4BA99586, 0xEF5562E9,
|
||||
0xC72FEFD3, 0xF752F7DA, 0x3F046F69, 0x77FA0A59,
|
||||
0x80E4A915, 0x87B08601, 0x9B09E6AD, 0x3B3EE593,
|
||||
0xE990FD5A, 0x9E34D797, 0x2CF0B7D9, 0x022B8B51,
|
||||
0x96D5AC3A, 0x017DA67D, 0xD1CF3ED6, 0x7C7D2D28,
|
||||
0x1F9F25CF, 0xADF2B89B, 0x5AD6B472, 0x5A88F54C,
|
||||
0xE029AC71, 0xE019A5E6, 0x47B0ACFD, 0xED93FA9B,
|
||||
0xE8D3C48D, 0x283B57CC, 0xF8D56629, 0x79132E28,
|
||||
0x785F0191, 0xED756055, 0xF7960E44, 0xE3D35E8C,
|
||||
0x15056DD4, 0x88F46DBA, 0x03A16125, 0x0564F0BD,
|
||||
0xC3EB9E15, 0x3C9057A2, 0x97271AEC, 0xA93A072A,
|
||||
0x1B3F6D9B, 0x1E6321F5, 0xF59C66FB, 0x26DCF319,
|
||||
0x7533D928, 0xB155FDF5, 0x03563482, 0x8ABA3CBB,
|
||||
0x28517711, 0xC20AD9F8, 0xABCC5167, 0xCCAD925F,
|
||||
0x4DE81751, 0x3830DC8E, 0x379D5862, 0x9320F991,
|
||||
0xEA7A90C2, 0xFB3E7BCE, 0x5121CE64, 0x774FBE32,
|
||||
0xA8B6E37E, 0xC3293D46, 0x48DE5369, 0x6413E680,
|
||||
0xA2AE0810, 0xDD6DB224, 0x69852DFD, 0x09072166,
|
||||
0xB39A460A, 0x6445C0DD, 0x586CDECF, 0x1C20C8AE,
|
||||
0x5BBEF7DD, 0x1B588D40, 0xCCD2017F, 0x6BB4E3BB,
|
||||
0xDDA26A7E, 0x3A59FF45, 0x3E350A44, 0xBCB4CDD5,
|
||||
0x72EACEA8, 0xFA6484BB, 0x8D6612AE, 0xBF3C6F47,
|
||||
0xD29BE463, 0x542F5D9E, 0xAEC2771B, 0xF64E6370,
|
||||
0x740E0D8D, 0xE75B1357, 0xF8721671, 0xAF537D5D,
|
||||
0x4040CB08, 0x4EB4E2CC, 0x34D2466A, 0x0115AF84,
|
||||
0xE1B00428, 0x95983A1D, 0x06B89FB4, 0xCE6EA048,
|
||||
0x6F3F3B82, 0x3520AB82, 0x011A1D4B, 0x277227F8,
|
||||
0x611560B1, 0xE7933FDC, 0xBB3A792B, 0x344525BD,
|
||||
0xA08839E1, 0x51CE794B, 0x2F32C9B7, 0xA01FBAC9,
|
||||
0xE01CC87E, 0xBCC7D1F6, 0xCF0111C3, 0xA1E8AAC7,
|
||||
0x1A908749, 0xD44FBD9A, 0xD0DADECB, 0xD50ADA38,
|
||||
0x0339C32A, 0xC6913667, 0x8DF9317C, 0xE0B12B4F,
|
||||
0xF79E59B7, 0x43F5BB3A, 0xF2D519FF, 0x27D9459C,
|
||||
0xBF97222C, 0x15E6FC2A, 0x0F91FC71, 0x9B941525,
|
||||
0xFAE59361, 0xCEB69CEB, 0xC2A86459, 0x12BAA8D1,
|
||||
0xB6C1075E, 0xE3056A0C, 0x10D25065, 0xCB03A442,
|
||||
0xE0EC6E0E, 0x1698DB3B, 0x4C98A0BE, 0x3278E964,
|
||||
0x9F1F9532, 0xE0D392DF, 0xD3A0342B, 0x8971F21E,
|
||||
0x1B0A7441, 0x4BA3348C, 0xC5BE7120, 0xC37632D8,
|
||||
0xDF359F8D, 0x9B992F2E, 0xE60B6F47, 0x0FE3F11D,
|
||||
0xE54CDA54, 0x1EDAD891, 0xCE6279CF, 0xCD3E7E6F,
|
||||
0x1618B166, 0xFD2C1D05, 0x848FD2C5, 0xF6FB2299,
|
||||
0xF523F357, 0xA6327623, 0x93A83531, 0x56CCCD02,
|
||||
0xACF08162, 0x5A75EBB5, 0x6E163697, 0x88D273CC,
|
||||
0xDE966292, 0x81B949D0, 0x4C50901B, 0x71C65614,
|
||||
0xE6C6C7BD, 0x327A140A, 0x45E1D006, 0xC3F27B9A,
|
||||
0xC9AA53FD, 0x62A80F00, 0xBB25BFE2, 0x35BDD2F6,
|
||||
0x71126905, 0xB2040222, 0xB6CBCF7C, 0xCD769C2B,
|
||||
0x53113EC0, 0x1640E3D3, 0x38ABBD60, 0x2547ADF0,
|
||||
0xBA38209C, 0xF746CE76, 0x77AFA1C5, 0x20756060,
|
||||
0x85CBFE4E, 0x8AE88DD8, 0x7AAAF9B0, 0x4CF9AA7E,
|
||||
0x1948C25C, 0x02FB8A8C, 0x01C36AE4, 0xD6EBE1F9,
|
||||
0x90D4F869, 0xA65CDEA0, 0x3F09252D, 0xC208E69F,
|
||||
0xB74E6132, 0xCE77E25B, 0x578FDFE3, 0x3AC372E6
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
32
ts3_lib/Helper/Exception.php
Normal file
32
ts3_lib/Helper/Exception.php
Normal file
@@ -0,0 +1,32 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @file
|
||||
* TeamSpeak 3 PHP Framework
|
||||
*
|
||||
* $Id: Exception.php 10/11/2013 11:35:21 scp@orilla $
|
||||
*
|
||||
* 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
|
||||
* @version 1.1.23
|
||||
* @author Sven 'ScP' Paulsen
|
||||
* @copyright Copyright (c) 2010 by Planet TeamSpeak. All rights reserved.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @class TeamSpeak3_Helper_Exception
|
||||
* @brief Enhanced exception class for TeamSpeak3_Helper_* objects.
|
||||
*/
|
||||
class TeamSpeak3_Helper_Exception extends TeamSpeak3_Exception {}
|
||||
101
ts3_lib/Helper/Profiler.php
Normal file
101
ts3_lib/Helper/Profiler.php
Normal file
@@ -0,0 +1,101 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @file
|
||||
* TeamSpeak 3 PHP Framework
|
||||
*
|
||||
* $Id: Profiler.php 10/11/2013 11:35:21 scp@orilla $
|
||||
*
|
||||
* 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
|
||||
* @version 1.1.23
|
||||
* @author Sven 'ScP' Paulsen
|
||||
* @copyright Copyright (c) 2010 by Planet TeamSpeak. All rights reserved.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @class TeamSpeak3_Helper_Profiler
|
||||
* @brief Helper class for profiler handling.
|
||||
*/
|
||||
class TeamSpeak3_Helper_Profiler
|
||||
{
|
||||
/**
|
||||
* Stores various timers for code profiling.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected static $timers = array();
|
||||
|
||||
/**
|
||||
* Inits a timer.
|
||||
*
|
||||
* @param string $name
|
||||
* @return void
|
||||
*/
|
||||
public static function init($name = "default")
|
||||
{
|
||||
self::$timers[$name] = new TeamSpeak3_Helper_Profiler_Timer($name);
|
||||
}
|
||||
|
||||
/**
|
||||
* Starts a timer.
|
||||
*
|
||||
* @param string $name
|
||||
* @return void
|
||||
*/
|
||||
public static function start($name = "default")
|
||||
{
|
||||
if(array_key_exists($name, self::$timers))
|
||||
{
|
||||
self::$timers[$name]->start();
|
||||
}
|
||||
else
|
||||
{
|
||||
self::$timers[$name] = new TeamSpeak3_Helper_Profiler_Timer($name);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Stops a timer.
|
||||
*
|
||||
* @param string $name
|
||||
* @return void
|
||||
*/
|
||||
public static function stop($name = "default")
|
||||
{
|
||||
if(!array_key_exists($name, self::$timers))
|
||||
{
|
||||
self::init($name);
|
||||
}
|
||||
|
||||
self::$timers[$name]->stop();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a timer.
|
||||
*
|
||||
* @param string $name
|
||||
* @return TeamSpeak3_Helper_Profiler_Timer
|
||||
*/
|
||||
public static function get($name = "default")
|
||||
{
|
||||
if(!array_key_exists($name, self::$timers))
|
||||
{
|
||||
self::init($name);
|
||||
}
|
||||
|
||||
return self::$timers[$name];
|
||||
}
|
||||
}
|
||||
32
ts3_lib/Helper/Profiler/Exception.php
Normal file
32
ts3_lib/Helper/Profiler/Exception.php
Normal file
@@ -0,0 +1,32 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @file
|
||||
* TeamSpeak 3 PHP Framework
|
||||
*
|
||||
* $Id: Exception.php 10/11/2013 11:35:21 scp@orilla $
|
||||
*
|
||||
* 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
|
||||
* @version 1.1.23
|
||||
* @author Sven 'ScP' Paulsen
|
||||
* @copyright Copyright (c) 2010 by Planet TeamSpeak. All rights reserved.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @class TeamSpeak3_Helper_Profiler_Exception
|
||||
* @brief Enhanced exception class for TeamSpeak3_Helper_Profiler objects.
|
||||
*/
|
||||
class TeamSpeak3_Helper_Profiler_Exception extends TeamSpeak3_Helper_Exception {}
|
||||
154
ts3_lib/Helper/Profiler/Timer.php
Normal file
154
ts3_lib/Helper/Profiler/Timer.php
Normal file
@@ -0,0 +1,154 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @file
|
||||
* TeamSpeak 3 PHP Framework
|
||||
*
|
||||
* $Id: Timer.php 10/11/2013 11:35:21 scp@orilla $
|
||||
*
|
||||
* 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
|
||||
* @version 1.1.23
|
||||
* @author Sven 'ScP' Paulsen
|
||||
* @copyright Copyright (c) 2010 by Planet TeamSpeak. All rights reserved.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @class TeamSpeak3_Helper_Profiler_Timer
|
||||
* @brief Helper class providing profiler timers.
|
||||
*/
|
||||
class TeamSpeak3_Helper_Profiler_Timer
|
||||
{
|
||||
/**
|
||||
* Indicates wether the timer is running or not.
|
||||
*
|
||||
* @var boolean
|
||||
*/
|
||||
protected $running = FALSE;
|
||||
|
||||
/**
|
||||
* Stores the timestamp when the timer was last started.
|
||||
*
|
||||
* @var integer
|
||||
*/
|
||||
protected $started = 0;
|
||||
|
||||
/**
|
||||
* Stores the timer name.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $name = null;
|
||||
|
||||
/**
|
||||
* Stores various information about the server environment.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $data = array();
|
||||
|
||||
/**
|
||||
* The TeamSpeak3_Helper_Profiler_Timer constructor.
|
||||
*
|
||||
* @param string $name
|
||||
* @return TeamSpeak3_Helper_Profiler_Timer
|
||||
*/
|
||||
public function __construct($name)
|
||||
{
|
||||
$this->name = (string) $name;
|
||||
|
||||
$this->data["runtime"] = 0;
|
||||
$this->data["realmem"] = 0;
|
||||
$this->data["emalloc"] = 0;
|
||||
|
||||
$this->start();
|
||||
}
|
||||
|
||||
/**
|
||||
* Starts the timer.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function start()
|
||||
{
|
||||
if($this->isRunning()) return;
|
||||
|
||||
$this->data["realmem_start"] = memory_get_usage(TRUE);
|
||||
$this->data["emalloc_start"] = memory_get_usage();
|
||||
|
||||
$this->started = microtime(TRUE);
|
||||
$this->running = TRUE;
|
||||
}
|
||||
|
||||
/**
|
||||
* Stops the timer.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function stop()
|
||||
{
|
||||
if(!$this->isRunning()) return;
|
||||
|
||||
$this->data["runtime"] += microtime(TRUE) - $this->started;
|
||||
$this->data["realmem"] += memory_get_usage(TRUE) - $this->data["realmem_start"];
|
||||
$this->data["emalloc"] += memory_get_usage() - $this->data["emalloc_start"];
|
||||
|
||||
$this->started = 0;
|
||||
$this->running = FALSE;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the timer runtime.
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
public function getRuntime()
|
||||
{
|
||||
if($this->isRunning())
|
||||
{
|
||||
$this->stop();
|
||||
$this->start();
|
||||
}
|
||||
|
||||
return $this->data["runtime"];
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the amount of memory allocated to PHP in bytes.
|
||||
*
|
||||
* @param boolean $realmem
|
||||
* @return integer
|
||||
*/
|
||||
public function getMemUsage($realmem = FALSE)
|
||||
{
|
||||
if($this->isRunning())
|
||||
{
|
||||
$this->stop();
|
||||
$this->start();
|
||||
}
|
||||
|
||||
return ($realmem !== FALSE) ? $this->data["realmem"] : $this->data["emalloc"];
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns TRUE if the timer is running.
|
||||
*
|
||||
* @return boolean
|
||||
*/
|
||||
public function isRunning()
|
||||
{
|
||||
return $this->running;
|
||||
}
|
||||
}
|
||||
213
ts3_lib/Helper/Signal.php
Normal file
213
ts3_lib/Helper/Signal.php
Normal file
@@ -0,0 +1,213 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @file
|
||||
* TeamSpeak 3 PHP Framework
|
||||
*
|
||||
* $Id: Signal.php 10/11/2013 11:35:21 scp@orilla $
|
||||
*
|
||||
* 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
|
||||
* @version 1.1.23
|
||||
* @author Sven 'ScP' Paulsen
|
||||
* @copyright Copyright (c) 2010 by Planet TeamSpeak. All rights reserved.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @class TeamSpeak3_Helper_Signal
|
||||
* @brief Helper class for signal slots.
|
||||
*/
|
||||
class TeamSpeak3_Helper_Signal
|
||||
{
|
||||
/**
|
||||
* Stores the TeamSpeak3_Helper_Signal object.
|
||||
*
|
||||
* @var TeamSpeak3_Helper_Signal
|
||||
*/
|
||||
protected static $instance = null;
|
||||
|
||||
/**
|
||||
* Stores subscribed signals and their slots.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $sigslots = array();
|
||||
|
||||
/**
|
||||
* Emits a signal with a given set of parameters.
|
||||
*
|
||||
* @param string $signal
|
||||
* @param mixed $params
|
||||
* @return mixed
|
||||
*/
|
||||
public function emit($signal, $params = null)
|
||||
{
|
||||
if(!$this->hasHandlers($signal))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if(!is_array($params))
|
||||
{
|
||||
$params = func_get_args();
|
||||
$params = array_slice($params, 1);
|
||||
}
|
||||
|
||||
foreach($this->sigslots[$signal] as $slot)
|
||||
{
|
||||
$return = $slot->call($params);
|
||||
}
|
||||
|
||||
return $return;
|
||||
}
|
||||
|
||||
/**
|
||||
* Generates a MD5 hash based on a given callback.
|
||||
*
|
||||
* @param mixed $callback
|
||||
* @param string
|
||||
* @return void
|
||||
*/
|
||||
public function getCallbackHash($callback)
|
||||
{
|
||||
if(!is_callable($callback, TRUE, $callable_name))
|
||||
{
|
||||
throw new TeamSpeak3_Helper_Signal_Exception("invalid callback specified");
|
||||
}
|
||||
|
||||
return md5($callable_name);
|
||||
}
|
||||
|
||||
/**
|
||||
* Subscribes to a signal and returns the signal handler.
|
||||
*
|
||||
* @param string $signal
|
||||
* @param mixed $callback
|
||||
* @return TeamSpeak3_Helper_Signal_Handler
|
||||
*/
|
||||
public function subscribe($signal, $callback)
|
||||
{
|
||||
if(empty($this->sigslots[$signal]))
|
||||
{
|
||||
$this->sigslots[$signal] = array();
|
||||
}
|
||||
|
||||
$index = $this->getCallbackHash($callback);
|
||||
|
||||
if(!array_key_exists($index, $this->sigslots[$signal]))
|
||||
{
|
||||
$this->sigslots[$signal][$index] = new TeamSpeak3_Helper_Signal_Handler($signal, $callback);
|
||||
}
|
||||
|
||||
return $this->sigslots[$signal][$index];
|
||||
}
|
||||
|
||||
/**
|
||||
* Unsubscribes from a signal.
|
||||
*
|
||||
* @param string $signal
|
||||
* @param mixed $callback
|
||||
* @return void
|
||||
*/
|
||||
public function unsubscribe($signal, $callback = null)
|
||||
{
|
||||
if(!$this->hasHandlers($signal))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if($callback !== null)
|
||||
{
|
||||
$index = $this->getCallbackHash($callback);
|
||||
|
||||
if(!array_key_exists($index, $this->sigslots[$signal]))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
unset($this->sigslots[$signal][$index]);
|
||||
}
|
||||
else
|
||||
{
|
||||
unset($this->sigslots[$signal]);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns all registered signals.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function getSignals()
|
||||
{
|
||||
return array_keys($this->sigslots);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns TRUE there are slots subscribed for a specified signal.
|
||||
*
|
||||
* @param string $signal
|
||||
* @return boolean
|
||||
*/
|
||||
public function hasHandlers($signal)
|
||||
{
|
||||
return empty($this->sigslots[$signal]) ? FALSE : TRUE;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns all slots for a specified signal.
|
||||
*
|
||||
* @param string $signal
|
||||
* @return array
|
||||
*/
|
||||
public function getHandlers($signal)
|
||||
{
|
||||
if(!$this->hasHandlers($signal))
|
||||
{
|
||||
return $this->sigslots[$signal];
|
||||
}
|
||||
|
||||
return array();
|
||||
}
|
||||
|
||||
/**
|
||||
* Clears all slots for a specified signal.
|
||||
*
|
||||
* @param string $signal
|
||||
* @return void
|
||||
*/
|
||||
public function clearHandlers($signal)
|
||||
{
|
||||
if(!$this->hasHandlers($signal))
|
||||
{
|
||||
unset($this->sigslots[$signal]);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a singleton instance of TeamSpeak3_Helper_Signal.
|
||||
*
|
||||
* @return TeamSpeak3_Helper_Signal
|
||||
*/
|
||||
public static function getInstance()
|
||||
{
|
||||
if(self::$instance === null)
|
||||
{
|
||||
self::$instance = new self();
|
||||
}
|
||||
|
||||
return self::$instance;
|
||||
}
|
||||
}
|
||||
32
ts3_lib/Helper/Signal/Exception.php
Normal file
32
ts3_lib/Helper/Signal/Exception.php
Normal file
@@ -0,0 +1,32 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @file
|
||||
* TeamSpeak 3 PHP Framework
|
||||
*
|
||||
* $Id: Exception.php 10/11/2013 11:35:21 scp@orilla $
|
||||
*
|
||||
* 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
|
||||
* @version 1.1.23
|
||||
* @author Sven 'ScP' Paulsen
|
||||
* @copyright Copyright (c) 2010 by Planet TeamSpeak. All rights reserved.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @class TeamSpeak3_Helper_Signal_Exception
|
||||
* @brief Enhanced exception class for TeamSpeak3_Helper_Signal objects.
|
||||
*/
|
||||
class TeamSpeak3_Helper_Signal_Exception extends TeamSpeak3_Helper_Exception {}
|
||||
78
ts3_lib/Helper/Signal/Handler.php
Normal file
78
ts3_lib/Helper/Signal/Handler.php
Normal file
@@ -0,0 +1,78 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @file
|
||||
* TeamSpeak 3 PHP Framework
|
||||
*
|
||||
* $Id: Handler.php 10/11/2013 11:35:21 scp@orilla $
|
||||
*
|
||||
* 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
|
||||
* @version 1.1.23
|
||||
* @author Sven 'ScP' Paulsen
|
||||
* @copyright Copyright (c) 2010 by Planet TeamSpeak. All rights reserved.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @class TeamSpeak3_Helper_Signal_Handler
|
||||
* @brief Helper class providing handler functions for signals.
|
||||
*/
|
||||
class TeamSpeak3_Helper_Signal_Handler
|
||||
{
|
||||
/**
|
||||
* Stores the name of the subscribed signal.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $signal = null;
|
||||
|
||||
/**
|
||||
* Stores the callback function for the subscribed signal.
|
||||
*
|
||||
* @var mixed
|
||||
*/
|
||||
protected $callback = null;
|
||||
|
||||
/**
|
||||
* The TeamSpeak3_Helper_Signal_Handler constructor.
|
||||
*
|
||||
* @param string $signal
|
||||
* @param mixed $callback
|
||||
* @throws TeamSpeak3_Helper_Signal_Exception
|
||||
* @return TeamSpeak3_Helper_Signal_Handler
|
||||
*/
|
||||
public function __construct($signal, $callback)
|
||||
{
|
||||
$this->signal = (string) $signal;
|
||||
|
||||
if(!is_callable($callback))
|
||||
{
|
||||
throw new TeamSpeak3_Helper_Signal_Exception("invalid callback specified for signal '" . $signal . "'");
|
||||
}
|
||||
|
||||
$this->callback = $callback;
|
||||
}
|
||||
|
||||
/**
|
||||
* Invoke the signal handler.
|
||||
*
|
||||
* @param array $args
|
||||
* @return mixed
|
||||
*/
|
||||
public function call(array $args = array())
|
||||
{
|
||||
return call_user_func_array($this->callback, $args);
|
||||
}
|
||||
}
|
||||
353
ts3_lib/Helper/Signal/Interface.php
Normal file
353
ts3_lib/Helper/Signal/Interface.php
Normal file
@@ -0,0 +1,353 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @file
|
||||
* TeamSpeak 3 PHP Framework
|
||||
*
|
||||
* $Id: Interface.php 10/11/2013 11:35:21 scp@orilla $
|
||||
*
|
||||
* 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
|
||||
* @version 1.1.23
|
||||
* @author Sven 'ScP' Paulsen
|
||||
* @copyright Copyright (c) 2010 by Planet TeamSpeak. All rights reserved.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @class TeamSpeak3_Helper_Signal_Interface
|
||||
* @brief Interface class describing the layout for TeamSpeak3_Helper_Signal callbacks.
|
||||
*/
|
||||
interface TeamSpeak3_Helper_Signal_Interface
|
||||
{
|
||||
/**
|
||||
* Possible callback for '<adapter>Connected' signals.
|
||||
*
|
||||
* === Examples ===
|
||||
* - TeamSpeak3_Helper_Signal::getInstance()->subscribe("serverqueryConnected", array($object, "onConnect"));
|
||||
* - TeamSpeak3_Helper_Signal::getInstance()->subscribe("filetransferConnected", array($object, "onConnect"));
|
||||
* - TeamSpeak3_Helper_Signal::getInstance()->subscribe("blacklistConnected", array($object, "onConnect"));
|
||||
* - TeamSpeak3_Helper_Signal::getInstance()->subscribe("updateConnected", array($object, "onConnect"));
|
||||
*
|
||||
* @param TeamSpeak3_Adapter_Abstract $adapter
|
||||
* @return void
|
||||
*/
|
||||
public function onConnect(TeamSpeak3_Adapter_Abstract $adapter);
|
||||
|
||||
/**
|
||||
* Possible callback for '<adapter>Disconnected' signals.
|
||||
*
|
||||
* === Examples ===
|
||||
* - TeamSpeak3_Helper_Signal::getInstance()->subscribe("serverqueryDisconnected", array($object, "onDisconnect"));
|
||||
* - TeamSpeak3_Helper_Signal::getInstance()->subscribe("filetransferDisconnected", array($object, "onDisconnect"));
|
||||
* - TeamSpeak3_Helper_Signal::getInstance()->subscribe("blacklistDisconnected", array($object, "onDisconnect"));
|
||||
* - TeamSpeak3_Helper_Signal::getInstance()->subscribe("updateDisconnected", array($object, "onDisconnect"));
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function onDisconnect();
|
||||
|
||||
/**
|
||||
* Possible callback for 'serverqueryCommandStarted' signals.
|
||||
*
|
||||
* === Examples ===
|
||||
* - TeamSpeak3_Helper_Signal::getInstance()->subscribe("serverqueryCommandStarted", array($object, "onCommandStarted"));
|
||||
*
|
||||
* @param string $cmd
|
||||
* @return void
|
||||
*/
|
||||
public function onCommandStarted($cmd);
|
||||
|
||||
/**
|
||||
* Possible callback for 'serverqueryCommandFinished' signals.
|
||||
*
|
||||
* === Examples ===
|
||||
* - TeamSpeak3_Helper_Signal::getInstance()->subscribe("serverqueryCommandFinished", array($object, "onCommandFinished"));
|
||||
*
|
||||
* @param string $cmd
|
||||
* @param TeamSpeak3_Adapter_ServerQuery_Reply $reply
|
||||
* @return void
|
||||
*/
|
||||
public function onCommandFinished($cmd, TeamSpeak3_Adapter_ServerQuery_Reply $reply);
|
||||
|
||||
/**
|
||||
* Possible callback for 'notifyEvent' signals.
|
||||
*
|
||||
* === Examples ===
|
||||
* - TeamSpeak3_Helper_Signal::getInstance()->subscribe("notifyEvent", array($object, "onEvent"));
|
||||
*
|
||||
* @param TeamSpeak3_Adapter_ServerQuery_Event $event
|
||||
* @param TeamSpeak3_Node_Host $host
|
||||
* @return void
|
||||
*/
|
||||
public function onEvent(TeamSpeak3_Adapter_ServerQuery_Event $event, TeamSpeak3_Node_Host $host);
|
||||
|
||||
/**
|
||||
* Possible callback for 'notifyError' signals.
|
||||
*
|
||||
* === Examples ===
|
||||
* - TeamSpeak3_Helper_Signal::getInstance()->subscribe("notifyError", array($object, "onError"));
|
||||
*
|
||||
* @param TeamSpeak3_Adapter_ServerQuery_Reply $reply
|
||||
* @return void
|
||||
*/
|
||||
public function onError(TeamSpeak3_Adapter_ServerQuery_Reply $reply);
|
||||
|
||||
/**
|
||||
* Possible callback for 'notifyServerselected' signals.
|
||||
*
|
||||
* === Examples ===
|
||||
* - TeamSpeak3_Helper_Signal::getInstance()->subscribe("notifyServerselected", array($object, "onServerselected"));
|
||||
*
|
||||
* @param TeamSpeak3_Node_Host $host
|
||||
* @return void
|
||||
*/
|
||||
public function onServerselected(TeamSpeak3_Node_Host $host);
|
||||
|
||||
/**
|
||||
* Possible callback for 'notifyServercreated' signals.
|
||||
*
|
||||
* === Examples ===
|
||||
* - TeamSpeak3_Helper_Signal::getInstance()->subscribe("notifyServercreated", array($object, "onServercreated"));
|
||||
*
|
||||
* @param TeamSpeak3_Node_Host $host
|
||||
* @param integer $sid
|
||||
* @return void
|
||||
*/
|
||||
public function onServercreated(TeamSpeak3_Node_Host $host, $sid);
|
||||
|
||||
/**
|
||||
* Possible callback for 'notifyServerdeleted' signals.
|
||||
*
|
||||
* === Examples ===
|
||||
* - TeamSpeak3_Helper_Signal::getInstance()->subscribe("notifyServerdeleted", array($object, "onServerdeleted"));
|
||||
*
|
||||
* @param TeamSpeak3_Node_Host $host
|
||||
* @param integer $sid
|
||||
* @return void
|
||||
*/
|
||||
public function onServerdeleted(TeamSpeak3_Node_Host $host, $sid);
|
||||
|
||||
/**
|
||||
* Possible callback for 'notifyServerstarted' signals.
|
||||
*
|
||||
* === Examples ===
|
||||
* - TeamSpeak3_Helper_Signal::getInstance()->subscribe("notifyServerstarted", array($object, "onServerstarted"));
|
||||
*
|
||||
* @param TeamSpeak3_Node_Host $host
|
||||
* @param integer $sid
|
||||
* @return void
|
||||
*/
|
||||
public function onServerstarted(TeamSpeak3_Node_Host $host, $sid);
|
||||
|
||||
/**
|
||||
* Possible callback for 'notifyServerstopped' signals.
|
||||
*
|
||||
* === Examples ===
|
||||
* - TeamSpeak3_Helper_Signal::getInstance()->subscribe("notifyServerstopped", array($object, "onServerstopped"));
|
||||
*
|
||||
* @param TeamSpeak3_Node_Host $host
|
||||
* @param integer $sid
|
||||
* @return void
|
||||
*/
|
||||
public function onServerstopped(TeamSpeak3_Node_Host $host, $sid);
|
||||
|
||||
/**
|
||||
* Possible callback for 'notifyServershutdown' signals.
|
||||
*
|
||||
* === Examples ===
|
||||
* - TeamSpeak3_Helper_Signal::getInstance()->subscribe("notifyServershutdown", array($object, "onServershutdown"));
|
||||
*
|
||||
* @param TeamSpeak3_Node_Host $host
|
||||
* @return void
|
||||
*/
|
||||
public function onServershutdown(TeamSpeak3_Node_Host $host);
|
||||
|
||||
/**
|
||||
* Possible callback for 'notifyLogin' signals.
|
||||
*
|
||||
* === Examples ===
|
||||
* - TeamSpeak3_Helper_Signal::getInstance()->subscribe("notifyLogin", array($object, "onLogin"));
|
||||
*
|
||||
* @param TeamSpeak3_Node_Host $host
|
||||
* @return void
|
||||
*/
|
||||
public function onLogin(TeamSpeak3_Node_Host $host);
|
||||
|
||||
/**
|
||||
* Possible callback for 'notifyLogout' signals.
|
||||
*
|
||||
* === Examples ===
|
||||
* - TeamSpeak3_Helper_Signal::getInstance()->subscribe("notifyLogout", array($object, "onLogout"));
|
||||
*
|
||||
* @param TeamSpeak3_Node_Host $host
|
||||
* @return void
|
||||
*/
|
||||
public function onLogout(TeamSpeak3_Node_Host $host);
|
||||
|
||||
/**
|
||||
* Possible callback for 'notifyTokencreated' signals.
|
||||
*
|
||||
* === Examples ===
|
||||
* - TeamSpeak3_Helper_Signal::getInstance()->subscribe("notifyTokencreated", array($object, "onTokencreated"));
|
||||
*
|
||||
* @param TeamSpeak3_Node_Server $server
|
||||
* @param string $token
|
||||
* @return void
|
||||
*/
|
||||
public function onTokencreated(TeamSpeak3_Node_Server $server, $token);
|
||||
|
||||
/**
|
||||
* Possible callback for 'filetransferHandshake' signals.
|
||||
*
|
||||
* === Examples ===
|
||||
* - TeamSpeak3_Helper_Signal::getInstance()->subscribe("filetransferHandshake", array($object, "onFtHandshake"));
|
||||
*
|
||||
* @param TeamSpeak3_Adapter_FileTransfer $adapter
|
||||
* @return void
|
||||
*/
|
||||
public function onFtHandshake(TeamSpeak3_Adapter_FileTransfer $adapter);
|
||||
|
||||
/**
|
||||
* Possible callback for 'filetransferUploadStarted' signals.
|
||||
*
|
||||
* === Examples ===
|
||||
* - TeamSpeak3_Helper_Signal::getInstance()->subscribe("filetransferUploadStarted", array($object, "onFtUploadStarted"));
|
||||
*
|
||||
* @param string $ftkey
|
||||
* @param integer $seek
|
||||
* @param integer $size
|
||||
* @return void
|
||||
*/
|
||||
public function onFtUploadStarted($ftkey, $seek, $size);
|
||||
|
||||
/**
|
||||
* Possible callback for 'filetransferUploadProgress' signals.
|
||||
*
|
||||
* === Examples ===
|
||||
* - TeamSpeak3_Helper_Signal::getInstance()->subscribe("filetransferUploadProgress", array($object, "onFtUploadProgress"));
|
||||
*
|
||||
* @param string $ftkey
|
||||
* @param integer $seek
|
||||
* @param integer $size
|
||||
* @return void
|
||||
*/
|
||||
public function onFtUploadProgress($ftkey, $seek, $size);
|
||||
|
||||
/**
|
||||
* Possible callback for 'filetransferUploadFinished' signals.
|
||||
*
|
||||
* === Examples ===
|
||||
* - TeamSpeak3_Helper_Signal::getInstance()->subscribe("filetransferUploadFinished", array($object, "onFtUploadFinished"));
|
||||
*
|
||||
* @param string $ftkey
|
||||
* @param integer $seek
|
||||
* @param integer $size
|
||||
* @return void
|
||||
*/
|
||||
public function onFtUploadFinished($ftkey, $seek, $size);
|
||||
|
||||
/**
|
||||
* Possible callback for 'filetransferDownloadStarted' signals.
|
||||
*
|
||||
* === Examples ===
|
||||
* - TeamSpeak3_Helper_Signal::getInstance()->subscribe("filetransferDownloadStarted", array($object, "onFtDownloadStarted"));
|
||||
*
|
||||
* @param string $ftkey
|
||||
* @param integer $buff
|
||||
* @param integer $size
|
||||
* @return void
|
||||
*/
|
||||
public function onFtDownloadStarted($ftkey, $buff, $size);
|
||||
|
||||
/**
|
||||
* Possible callback for 'filetransferDownloadProgress' signals.
|
||||
*
|
||||
* === Examples ===
|
||||
* - TeamSpeak3_Helper_Signal::getInstance()->subscribe("filetransferDownloadProgress", array($object, "onFtDownloadProgress"));
|
||||
*
|
||||
* @param string $ftkey
|
||||
* @param integer $buff
|
||||
* @param integer $size
|
||||
* @return void
|
||||
*/
|
||||
public function onFtDownloadProgress($ftkey, $buff, $size);
|
||||
|
||||
/**
|
||||
* Possible callback for 'filetransferDownloadFinished' signals.
|
||||
*
|
||||
* === Examples ===
|
||||
* - TeamSpeak3_Helper_Signal::getInstance()->subscribe("filetransferDownloadFinished", array($object, "onFtDownloadFinished"));
|
||||
*
|
||||
* @param string $ftkey
|
||||
* @param integer $buff
|
||||
* @param integer $size
|
||||
* @return void
|
||||
*/
|
||||
public function onFtDownloadFinished($ftkey, $buff, $size);
|
||||
|
||||
/**
|
||||
* Possible callback for '<adapter>DataRead' signals.
|
||||
*
|
||||
* === Examples ===
|
||||
* - TeamSpeak3_Helper_Signal::getInstance()->subscribe("serverqueryDataRead", array($object, "onDebugDataRead"));
|
||||
* - TeamSpeak3_Helper_Signal::getInstance()->subscribe("filetransferDataRead", array($object, "onDebugDataRead"));
|
||||
* - TeamSpeak3_Helper_Signal::getInstance()->subscribe("blacklistDataRead", array($object, "onDebugDataRead"));
|
||||
* - TeamSpeak3_Helper_Signal::getInstance()->subscribe("updateDataRead", array($object, "onDebugDataRead"));
|
||||
*
|
||||
* @param string $data
|
||||
* @return void
|
||||
*/
|
||||
public function onDebugDataRead($data);
|
||||
|
||||
/**
|
||||
* Possible callback for '<adapter>DataSend' signals.
|
||||
*
|
||||
* === Examples ===
|
||||
* - TeamSpeak3_Helper_Signal::getInstance()->subscribe("serverqueryDataSend", array($object, "onDebugDataSend"));
|
||||
* - TeamSpeak3_Helper_Signal::getInstance()->subscribe("filetransferDataSend", array($object, "onDebugDataSend"));
|
||||
* - TeamSpeak3_Helper_Signal::getInstance()->subscribe("blacklistDataSend", array($object, "onDebugDataSend"));
|
||||
* - TeamSpeak3_Helper_Signal::getInstance()->subscribe("updateDataSend", array($object, "onDebugDataSend"));
|
||||
*
|
||||
* @param string $data
|
||||
* @return void
|
||||
*/
|
||||
public function onDebugDataSend($data);
|
||||
|
||||
/**
|
||||
* Possible callback for '<adapter>WaitTimeout' signals.
|
||||
*
|
||||
* === Examples ===
|
||||
* - TeamSpeak3_Helper_Signal::getInstance()->subscribe("serverqueryWaitTimeout", array($object, "onWaitTimeout"));
|
||||
* - TeamSpeak3_Helper_Signal::getInstance()->subscribe("filetransferWaitTimeout", array($object, "onWaitTimeout"));
|
||||
* - TeamSpeak3_Helper_Signal::getInstance()->subscribe("blacklistWaitTimeout", array($object, "onWaitTimeout"));
|
||||
* - TeamSpeak3_Helper_Signal::getInstance()->subscribe("updateWaitTimeout", array($object, "onWaitTimeout"));
|
||||
*
|
||||
* @param integer $time
|
||||
* @param TeamSpeak3_Adapter_Abstract $adapter
|
||||
* @return void
|
||||
*/
|
||||
public function onWaitTimeout($time, TeamSpeak3_Adapter_Abstract $adapter);
|
||||
|
||||
/**
|
||||
* Possible callback for 'errorException' signals.
|
||||
*
|
||||
* === Examples ===
|
||||
* - TeamSpeak3_Helper_Signal::getInstance()->subscribe("errorException", array($object, "onException"));
|
||||
*
|
||||
* @param TeamSpeak3_Exception $e
|
||||
* @return void
|
||||
*/
|
||||
public function onException(TeamSpeak3_Exception $e);
|
||||
}
|
||||
939
ts3_lib/Helper/String.php
Normal file
939
ts3_lib/Helper/String.php
Normal file
@@ -0,0 +1,939 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @file
|
||||
* TeamSpeak 3 PHP Framework
|
||||
*
|
||||
* $Id: String.php 10/11/2013 11:35:21 scp@orilla $
|
||||
*
|
||||
* 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
|
||||
* @version 1.1.23
|
||||
* @author Sven 'ScP' Paulsen
|
||||
* @copyright Copyright (c) 2010 by Planet TeamSpeak. All rights reserved.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @class TeamSpeak3_Helper_String
|
||||
* @brief Helper class for string handling.
|
||||
*/
|
||||
class TeamSpeak3_Helper_String implements ArrayAccess, Iterator, Countable
|
||||
{
|
||||
/**
|
||||
* Stores the original string.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $string;
|
||||
|
||||
/**
|
||||
* @ignore
|
||||
*/
|
||||
protected $position = 0;
|
||||
|
||||
/**
|
||||
* The TeamSpeak3_Helper_String constructor.
|
||||
*
|
||||
* @param string $string
|
||||
* @return TeamSpeak3_Helper_String
|
||||
*/
|
||||
public function __construct($string)
|
||||
{
|
||||
$this->string = strval($string);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a TeamSpeak3_Helper_String object for thegiven string.
|
||||
*
|
||||
* @param string $string
|
||||
* @return TeamSpeak3_Helper_String
|
||||
*/
|
||||
public static function factory($string)
|
||||
{
|
||||
return new self($string);
|
||||
}
|
||||
|
||||
/**
|
||||
* Replaces every occurrence of the string $search with the string $replace.
|
||||
*
|
||||
* @param string $search
|
||||
* @param string $replace
|
||||
* @param boolean $caseSensitivity
|
||||
* @return TeamSpeak3_Helper_String
|
||||
*/
|
||||
public function replace($search, $replace, $caseSensitivity = TRUE)
|
||||
{
|
||||
if($caseSensitivity)
|
||||
{
|
||||
$this->string = str_replace($search, $replace, $this->string);
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->string = str_ireplace($search, $replace, $this->string);
|
||||
}
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* This function replaces indexed or associative signs with given values.
|
||||
*
|
||||
* @param array $args
|
||||
* @param string $char
|
||||
* @return TeamSpeak3_Helper_String
|
||||
*/
|
||||
public function arg(array $args, $char = "%")
|
||||
{
|
||||
$args = array_reverse($args, TRUE);
|
||||
|
||||
foreach($args as $key => $val)
|
||||
{
|
||||
$args[$char . $key] = $val;
|
||||
unset($args[$key]);
|
||||
}
|
||||
|
||||
$this->string = strtr($this->string, $args);
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns true if the string starts with $pattern.
|
||||
*
|
||||
* @param string $pattern
|
||||
* @return boolean
|
||||
*/
|
||||
public function startsWith($pattern)
|
||||
{
|
||||
return (substr($this->string, 0, strlen($pattern)) == $pattern) ? TRUE : FALSE;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns true if the string ends with $pattern.
|
||||
*
|
||||
* @param string $pattern
|
||||
* @return boolean
|
||||
*/
|
||||
public function endsWith($pattern)
|
||||
{
|
||||
return (substr($this->string, strlen($pattern)*-1) == $pattern) ? TRUE : FALSE;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the position of the first occurrence of a char in a string.
|
||||
*
|
||||
* @param string $needle
|
||||
* @return integer
|
||||
*/
|
||||
public function findFirst($needle)
|
||||
{
|
||||
return strpos($this->string, $needle);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the position of the last occurrence of a char in a string.
|
||||
*
|
||||
* @param string $needle
|
||||
* @return integer
|
||||
*/
|
||||
public function findLast($needle)
|
||||
{
|
||||
return strrpos($this->string, $needle);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the lowercased string.
|
||||
*
|
||||
* @return TeamSpeak3_Helper_String
|
||||
*/
|
||||
public function toLower()
|
||||
{
|
||||
return new self(strtolower($this->string));
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the uppercased string.
|
||||
*
|
||||
* @return TeamSpeak3_Helper_String
|
||||
*/
|
||||
public function toUpper()
|
||||
{
|
||||
return new self(strtoupper($this->string));
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns true if the string contains $pattern.
|
||||
*
|
||||
* @param string $pattern
|
||||
* @param booean $regexp
|
||||
* @return boolean
|
||||
*/
|
||||
public function contains($pattern, $regexp = FALSE)
|
||||
{
|
||||
if(empty($pattern))
|
||||
{
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
if($regexp)
|
||||
{
|
||||
return (preg_match("/" . $pattern . "/i", $this->string)) ? TRUE : FALSE;
|
||||
}
|
||||
else
|
||||
{
|
||||
return (stristr($this->string, $pattern) !== FALSE) ? TRUE : FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns part of a string.
|
||||
*
|
||||
* @param integer $start
|
||||
* @param integer $length
|
||||
* @return TeamSpeak3_Helper_String
|
||||
*/
|
||||
public function substr($start, $length = null)
|
||||
{
|
||||
$string = ($length !== null) ? substr($this->string, $start, $length) : substr($this->string, $start);
|
||||
|
||||
return new self($string);
|
||||
}
|
||||
|
||||
/**
|
||||
* Splits the string into substrings wherever $separator occurs.
|
||||
*
|
||||
* @param string $separator
|
||||
* @param integer $limit
|
||||
* @return array
|
||||
*/
|
||||
public function split($separator, $limit = 0)
|
||||
{
|
||||
$parts = explode($separator, $this->string, ($limit) ? intval($limit) : $this->count());
|
||||
|
||||
foreach($parts as $key => $val)
|
||||
{
|
||||
$parts[$key] = new self($val);
|
||||
}
|
||||
|
||||
return $parts;
|
||||
}
|
||||
|
||||
/**
|
||||
* Appends $part to the string.
|
||||
*
|
||||
* @param string $part
|
||||
* @return TeamSpeak3_Helper_String
|
||||
*/
|
||||
public function append($part)
|
||||
{
|
||||
$this->string = $this->string . strval($part);
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Prepends $part to the string.
|
||||
*
|
||||
* @param string $part
|
||||
* @return TeamSpeak3_Helper_String
|
||||
*/
|
||||
public function prepend($part)
|
||||
{
|
||||
$this->string = strval($part) . $this->string;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a section of the string.
|
||||
*
|
||||
* @param string $separator
|
||||
* @param integer $first
|
||||
* @param integer $last
|
||||
* @return TeamSpeak3_Helper_String
|
||||
*/
|
||||
public function section($separator, $first = 0, $last = 0)
|
||||
{
|
||||
$sections = explode($separator, $this->string);
|
||||
|
||||
$total = count($sections);
|
||||
$first = intval($first);
|
||||
$last = intval($last);
|
||||
|
||||
if($first > $total) return null;
|
||||
if($first > $last) $last = $first;
|
||||
|
||||
for($i = 0; $i < $total; $i++)
|
||||
{
|
||||
if($i < $first || $i > $last)
|
||||
{
|
||||
unset($sections[$i]);
|
||||
}
|
||||
}
|
||||
|
||||
$string = implode($separator, $sections);
|
||||
|
||||
return new self($string);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the size of the string to $size characters.
|
||||
*
|
||||
* @param integer $size
|
||||
* @param string $char
|
||||
* @return TeamSpeak3_Helper_String
|
||||
*/
|
||||
public function resize($size, $char = "\0")
|
||||
{
|
||||
$chars = ($size - $this->count());
|
||||
|
||||
if($chars < 0)
|
||||
{
|
||||
$this->string = substr($this->string, 0, $chars);
|
||||
}
|
||||
elseif($chars > 0)
|
||||
{
|
||||
$this->string = str_pad($this->string, $size, strval($char));
|
||||
}
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Strips whitespaces (or other characters) from the beginning and end of the string.
|
||||
*
|
||||
* @return TeamSpeak3_Helper_String
|
||||
*/
|
||||
public function trim()
|
||||
{
|
||||
$this->string = trim($this->string);
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Escapes a string using the TeamSpeak 3 escape patterns.
|
||||
*
|
||||
* @return TeamSpeak3_Helper_String
|
||||
*/
|
||||
public function escape()
|
||||
{
|
||||
foreach(TeamSpeak3::getEscapePatterns() as $search => $replace)
|
||||
{
|
||||
$this->string = str_replace($search, $replace, $this->string);
|
||||
}
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Unescapes a string using the TeamSpeak 3 escape patterns.
|
||||
*
|
||||
* @return TeamSpeak3_Helper_String
|
||||
*/
|
||||
public function unescape()
|
||||
{
|
||||
$this->string = strtr($this->string, array_flip(TeamSpeak3::getEscapePatterns()));
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Removes any non alphanumeric characters from the string.
|
||||
*
|
||||
* @return TeamSpeak3_Helper_String
|
||||
*/
|
||||
public function filterAlnum()
|
||||
{
|
||||
$this->string = preg_replace("/[^[:alnum:]]/", "", $this->string);
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Removes any non alphabetic characters from the string.
|
||||
*
|
||||
* @return TeamSpeak3_Helper_String
|
||||
*/
|
||||
public function filterAlpha()
|
||||
{
|
||||
$this->string = preg_replace("/[^[:alpha:]]/", "", $this->string);
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Removes any non numeric characters from the string.
|
||||
*
|
||||
* @return TeamSpeak3_Helper_String
|
||||
*/
|
||||
public function filterDigits()
|
||||
{
|
||||
$this->string = preg_replace("/[^[:digit:]]/", "", $this->string);
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns TRUE if the string is a numeric value.
|
||||
*
|
||||
* @return boolean
|
||||
*/
|
||||
public function isInt()
|
||||
{
|
||||
return (is_numeric($this->string) && !$this->contains(".")) ? TRUE : FALSE;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the integer value of the string.
|
||||
*
|
||||
* @return float
|
||||
* @return integer
|
||||
*/
|
||||
public function toInt()
|
||||
{
|
||||
if($this->string == pow(2, 63) || $this->string == pow(2, 64))
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
return ($this->string > pow(2, 31)) ? floatval($this->string) : intval($this->string);
|
||||
}
|
||||
|
||||
/**
|
||||
* Calculates and returns the crc32 polynomial of the string.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function toCrc32()
|
||||
{
|
||||
return crc32($this->string);
|
||||
}
|
||||
|
||||
/**
|
||||
* Calculates and returns the md5 checksum of the string.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function toMd5()
|
||||
{
|
||||
return md5($this->string);
|
||||
}
|
||||
|
||||
/**
|
||||
* Calculates and returns the sha1 checksum of the string.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function toSha1()
|
||||
{
|
||||
return sha1($this->string);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns TRUE if the string is UTF-8 encoded. This method searches for non-ascii multibyte
|
||||
* sequences in the UTF-8 range.
|
||||
*
|
||||
* @return boolean
|
||||
*/
|
||||
public function isUtf8()
|
||||
{
|
||||
$pattern = array();
|
||||
|
||||
$pattern[] = "[\xC2-\xDF][\x80-\xBF]"; // non-overlong 2-byte
|
||||
$pattern[] = "\xE0[\xA0-\xBF][\x80-\xBF]"; // excluding overlongs
|
||||
$pattern[] = "[\xE1-\xEC\xEE\xEF][\x80-\xBF]{2}"; // straight 3-byte
|
||||
$pattern[] = "\xED[\x80-\x9F][\x80-\xBF]"; // excluding surrogates
|
||||
$pattern[] = "\xF0[\x90-\xBF][\x80-\xBF]{2}"; // planes 1-3
|
||||
$pattern[] = "[\xF1-\xF3][\x80-\xBF]{3}"; // planes 4-15
|
||||
$pattern[] = "\xF4[\x80-\x8F][\x80-\xBF]{2}"; // plane 16
|
||||
|
||||
return preg_match("%(?:" . implode("|", $pattern) . ")+%xs", $this->string);
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts the string to UTF-8.
|
||||
*
|
||||
* @return TeamSpeak3_Helper_String
|
||||
*/
|
||||
public function toUtf8()
|
||||
{
|
||||
if(!$this->isUtf8())
|
||||
{
|
||||
$this->string = utf8_encode($this->string);
|
||||
}
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Encodes the string with MIME base64 and returns the result.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function toBase64()
|
||||
{
|
||||
return base64_encode($this->string);
|
||||
}
|
||||
|
||||
/**
|
||||
* Decodes the string with MIME base64 and returns the result as an TeamSpeak3_Helper_String
|
||||
*
|
||||
* @param string
|
||||
* @return TeamSpeak3_Helper_String
|
||||
*/
|
||||
public static function fromBase64($base64)
|
||||
{
|
||||
return new self(base64_decode($base64));
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the hexadecimal value of the string.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function toHex()
|
||||
{
|
||||
$hex = "";
|
||||
|
||||
foreach($this as $char)
|
||||
{
|
||||
$hex .= $char->toHex();
|
||||
}
|
||||
|
||||
return $hex;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the TeamSpeak3_Helper_String based on a given hex value.
|
||||
*
|
||||
* @param string
|
||||
* @throws TeamSpeak3_Helper_Exception
|
||||
* @return TeamSpeak3_Helper_String
|
||||
*/
|
||||
public static function fromHex($hex)
|
||||
{
|
||||
$string = "";
|
||||
|
||||
if(strlen($hex)%2 == 1)
|
||||
{
|
||||
throw new TeamSpeak3_Helper_Exception("given parameter '" . $hex . "' is not a valid hexadecimal number");
|
||||
}
|
||||
|
||||
foreach(str_split($hex, 2) as $chunk)
|
||||
{
|
||||
$string .= chr(hexdec($chunk));
|
||||
}
|
||||
|
||||
return new self($string);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the string transliterated from UTF-8 to Latin.
|
||||
*
|
||||
* @return TeamSpeak3_Helper_String
|
||||
*/
|
||||
public function transliterate()
|
||||
{
|
||||
$utf8_accents = array(
|
||||
"à" => "a",
|
||||
"ô" => "o",
|
||||
"<EFBFBD>?" => "d",
|
||||
"ḟ" => "f",
|
||||
"ë" => "e",
|
||||
"š" => "s",
|
||||
"ơ" => "o",
|
||||
"ß" => "ss",
|
||||
"ă" => "a",
|
||||
"ř" => "r",
|
||||
"ț" => "t",
|
||||
"ň" => "n",
|
||||
"<EFBFBD>?" => "a",
|
||||
"ķ" => "k",
|
||||
"<EFBFBD>?" => "s",
|
||||
"ỳ" => "y",
|
||||
"ņ" => "n",
|
||||
"ĺ" => "l",
|
||||
"ħ" => "h",
|
||||
"ṗ" => "p",
|
||||
"ó" => "o",
|
||||
"ú" => "u",
|
||||
"ě" => "e",
|
||||
"é" => "e",
|
||||
"ç" => "c",
|
||||
"<EFBFBD><EFBFBD>?" => "w",
|
||||
"ċ" => "c",
|
||||
"õ" => "o",
|
||||
"ṡ" => "s",
|
||||
"ø" => "o",
|
||||
"ģ" => "g",
|
||||
"ŧ" => "t",
|
||||
"ș" => "s",
|
||||
"ė" => "e",
|
||||
"ĉ" => "c",
|
||||
"ś" => "s",
|
||||
"î" => "i",
|
||||
"ű" => "u",
|
||||
"ć" => "c",
|
||||
"ę" => "e",
|
||||
"ŵ" => "w",
|
||||
"ṫ" => "t",
|
||||
"ū" => "u",
|
||||
"<EFBFBD>?" => "c",
|
||||
"ö" => "oe",
|
||||
"è" => "e",
|
||||
"ŷ" => "y",
|
||||
"ą" => "a",
|
||||
"ł" => "l",
|
||||
"ų" => "u",
|
||||
"ů" => "u",
|
||||
"ş" => "s",
|
||||
"ğ" => "g",
|
||||
"ļ" => "l",
|
||||
"ƒ" => "f",
|
||||
"ž" => "z",
|
||||
"ẃ" => "w",
|
||||
"ḃ" => "b",
|
||||
"å" => "a",
|
||||
"ì" => "i",
|
||||
"ï" => "i",
|
||||
"ḋ" => "d",
|
||||
"ť" => "t",
|
||||
"ŗ" => "r",
|
||||
"ä" => "ae",
|
||||
"í" => "i",
|
||||
"ŕ" => "r",
|
||||
"ê" => "e",
|
||||
"ü" => "ue",
|
||||
"ò" => "o",
|
||||
"ē" => "e",
|
||||
"ñ" => "n",
|
||||
"ń" => "n",
|
||||
"ĥ" => "h",
|
||||
"<EFBFBD>?" => "g",
|
||||
"đ" => "d",
|
||||
"ĵ" => "j",
|
||||
"ÿ" => "y",
|
||||
"ũ" => "u",
|
||||
"ŭ" => "u",
|
||||
"ư" => "u",
|
||||
"ţ" => "t",
|
||||
"ý" => "y",
|
||||
"ő" => "o",
|
||||
"â" => "a",
|
||||
"ľ" => "l",
|
||||
"ẅ" => "w",
|
||||
"ż" => "z",
|
||||
"ī" => "i",
|
||||
"ã" => "a",
|
||||
"ġ" => "g",
|
||||
"<EFBFBD><EFBFBD>?" => "m",
|
||||
"<EFBFBD>?" => "o",
|
||||
"ĩ" => "i",
|
||||
"ù" => "u",
|
||||
"į" => "i",
|
||||
"ź" => "z",
|
||||
"á" => "a",
|
||||
"û" => "u",
|
||||
"þ" => "th",
|
||||
"ð" => "dh",
|
||||
"æ" => "ae",
|
||||
"µ" => "u",
|
||||
"ĕ" => "e",
|
||||
"œ" => "oe",
|
||||
"À" => "A",
|
||||
"Ô" => "O",
|
||||
"Ď" => "D",
|
||||
"Ḟ" => "F",
|
||||
"Ë" => "E",
|
||||
"Š" => "S",
|
||||
"Ơ" => "O",
|
||||
"Ă" => "A",
|
||||
"Ř" => "R",
|
||||
"Ț" => "T",
|
||||
"Ň" => "N",
|
||||
"Ā" => "A",
|
||||
"Ķ" => "K",
|
||||
"Ŝ" => "S",
|
||||
"Ỳ" => "Y",
|
||||
"Ņ" => "N",
|
||||
"Ĺ" => "L",
|
||||
"Ħ" => "H",
|
||||
"Ṗ" => "P",
|
||||
"Ó" => "O",
|
||||
"Ú" => "U",
|
||||
"Ě" => "E",
|
||||
"É" => "E",
|
||||
"Ç" => "C",
|
||||
"Ẁ" => "W",
|
||||
"Ċ" => "C",
|
||||
"Õ" => "O",
|
||||
"Ṡ" => "S",
|
||||
"Ø" => "O",
|
||||
"Ģ" => "G",
|
||||
"Ŧ" => "T",
|
||||
"Ș" => "S",
|
||||
"Ė" => "E",
|
||||
"Ĉ" => "C",
|
||||
"Ś" => "S",
|
||||
"Î" => "I",
|
||||
"Ű" => "U",
|
||||
"Ć" => "C",
|
||||
"Ę" => "E",
|
||||
"Ŵ" => "W",
|
||||
"Ṫ" => "T",
|
||||
"Ū" => "U",
|
||||
"Č" => "C",
|
||||
"Ö" => "Oe",
|
||||
"È" => "E",
|
||||
"Ŷ" => "Y",
|
||||
"Ą" => "A",
|
||||
"<EFBFBD>?" => "L",
|
||||
"Ų" => "U",
|
||||
"Ů" => "U",
|
||||
"Ş" => "S",
|
||||
"Ğ" => "G",
|
||||
"Ļ" => "L",
|
||||
"Ƒ" => "F",
|
||||
"Ž" => "Z",
|
||||
"Ẃ" => "W",
|
||||
"Ḃ" => "B",
|
||||
"Å" => "A",
|
||||
"Ì" => "I",
|
||||
"<EFBFBD>?" => "I",
|
||||
"Ḋ" => "D",
|
||||
"Ť" => "T",
|
||||
"Ŗ" => "R",
|
||||
"Ä" => "Ae",
|
||||
"<EFBFBD>?" => "I",
|
||||
"Ŕ" => "R",
|
||||
"Ê" => "E",
|
||||
"Ü" => "Ue",
|
||||
"Ò" => "O",
|
||||
"Ē" => "E",
|
||||
"Ñ" => "N",
|
||||
"Ń" => "N",
|
||||
"Ĥ" => "H",
|
||||
"Ĝ" => "G",
|
||||
"<EFBFBD>?" => "D",
|
||||
"Ĵ" => "J",
|
||||
"Ÿ" => "Y",
|
||||
"Ũ" => "U",
|
||||
"Ŭ" => "U",
|
||||
"Ư" => "U",
|
||||
"Ţ" => "T",
|
||||
"<EFBFBD>?" => "Y",
|
||||
"<EFBFBD>?" => "O",
|
||||
"Â" => "A",
|
||||
"Ľ" => "L",
|
||||
"Ẅ" => "W",
|
||||
"Ż" => "Z",
|
||||
"Ī" => "I",
|
||||
"Ã" => "A",
|
||||
"Ġ" => "G",
|
||||
"Ṁ" => "M",
|
||||
"Ō" => "O",
|
||||
"Ĩ" => "I",
|
||||
"Ù" => "U",
|
||||
"Į" => "I",
|
||||
"Ź" => "Z",
|
||||
"<EFBFBD>?" => "A",
|
||||
"Û" => "U",
|
||||
"Þ" => "Th",
|
||||
"<EFBFBD>?" => "Dh",
|
||||
"Æ" => "Ae",
|
||||
"Ĕ" => "E",
|
||||
"Œ" => "Oe",
|
||||
);
|
||||
|
||||
return new self($this->toUtf8()->replace(array_keys($utf8_accents), array_values($utf8_accents)));
|
||||
}
|
||||
|
||||
/**
|
||||
* Processes the string and replaces all accented UTF-8 characters by unaccented ASCII-7 "equivalents",
|
||||
* whitespaces are replaced by a pre-defined spacer and the string is lowercase.
|
||||
*
|
||||
* @param string $spacer
|
||||
* @return TeamSpeak3_Helper_String
|
||||
*/
|
||||
public function uriSafe($spacer = "-")
|
||||
{
|
||||
$this->string = str_replace($spacer, " ", $this->string);
|
||||
$this->string = $this->transliterate();
|
||||
$this->string = preg_replace("/(\s|[^A-Za-z0-9\-])+/", $spacer, trim(strtolower($this->string)));
|
||||
$this->string = trim($this->string, $spacer);
|
||||
|
||||
return new self($this->string);
|
||||
}
|
||||
|
||||
/**
|
||||
* Replaces space characters with percent encoded strings.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function spaceToPercent()
|
||||
{
|
||||
return str_replace(" ", "%20", $this->string);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the string as a standard string
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function toString()
|
||||
{
|
||||
return $this->string;
|
||||
}
|
||||
|
||||
/**
|
||||
* Magical function that allows you to call PHP's built-in string functions on the TeamSpeak3_Helper_String object.
|
||||
*
|
||||
* @param string $function
|
||||
* @param array $args
|
||||
* @throws TeamSpeak3_Helper_Exception
|
||||
* @return TeamSpeak3_Helper_String
|
||||
*/
|
||||
public function __call($function, $args)
|
||||
{
|
||||
if(!function_exists($function))
|
||||
{
|
||||
throw new TeamSpeak3_Helper_Exception("cannot call undefined function '" . $function . "' on this object");
|
||||
}
|
||||
|
||||
if(count($args))
|
||||
{
|
||||
if(($key = array_search($this, $args, TRUE)) !== FALSE)
|
||||
{
|
||||
$args[$key] = $this->string;
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new TeamSpeak3_Helper_Exception("cannot call undefined function '" . $function . "' without the " . __CLASS__ . " object parameter");
|
||||
}
|
||||
|
||||
$return = call_user_func_array($function, $args);
|
||||
}
|
||||
else
|
||||
{
|
||||
$return = call_user_func($function, $this->string);
|
||||
}
|
||||
|
||||
if(is_string($return))
|
||||
{
|
||||
$this->string = $return;
|
||||
}
|
||||
else
|
||||
{
|
||||
return $return;
|
||||
}
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the character as a standard string.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function __toString()
|
||||
{
|
||||
return (string) $this->string;
|
||||
}
|
||||
|
||||
/**
|
||||
* @ignore
|
||||
*/
|
||||
public function count()
|
||||
{
|
||||
return strlen($this->string);
|
||||
}
|
||||
|
||||
/**
|
||||
* @ignore
|
||||
*/
|
||||
public function rewind()
|
||||
{
|
||||
$this->position = 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* @ignore
|
||||
*/
|
||||
public function valid()
|
||||
{
|
||||
return $this->position < $this->count();
|
||||
}
|
||||
|
||||
/**
|
||||
* @ignore
|
||||
*/
|
||||
public function key()
|
||||
{
|
||||
return $this->position;
|
||||
}
|
||||
|
||||
/**
|
||||
* @ignore
|
||||
*/
|
||||
public function current()
|
||||
{
|
||||
return new TeamSpeak3_Helper_Char($this->string{$this->position});
|
||||
}
|
||||
|
||||
/**
|
||||
* @ignore
|
||||
*/
|
||||
public function next()
|
||||
{
|
||||
$this->position++;
|
||||
}
|
||||
|
||||
/**
|
||||
* @ignore
|
||||
*/
|
||||
public function offsetExists($offset)
|
||||
{
|
||||
return ($offset < strlen($this->string)) ? TRUE : FALSE;
|
||||
}
|
||||
|
||||
/**
|
||||
* @ignore
|
||||
*/
|
||||
public function offsetGet($offset)
|
||||
{
|
||||
return ($this->offsetExists($offset)) ? new TeamSpeak3_Helper_Char($this->string{$offset}) : null;
|
||||
}
|
||||
|
||||
/**
|
||||
* @ignore
|
||||
*/
|
||||
public function offsetSet($offset, $value)
|
||||
{
|
||||
if(!$this->offsetExists($offset)) return;
|
||||
|
||||
$this->string{$offset} = strval($value);
|
||||
}
|
||||
|
||||
/**
|
||||
* @ignore
|
||||
*/
|
||||
public function offsetUnset($offset)
|
||||
{
|
||||
if(!$this->offsetExists($offset)) return;
|
||||
|
||||
$this->string = substr_replace($this->string, "", $offset, 1);
|
||||
}
|
||||
}
|
||||
717
ts3_lib/Helper/Uri.php
Normal file
717
ts3_lib/Helper/Uri.php
Normal file
@@ -0,0 +1,717 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @file
|
||||
* TeamSpeak 3 PHP Framework
|
||||
*
|
||||
* $Id: Uri.php 10/11/2013 11:35:21 scp@orilla $
|
||||
*
|
||||
* 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
|
||||
* @version 1.1.23
|
||||
* @author Sven 'ScP' Paulsen
|
||||
* @copyright Copyright (c) 2010 by Planet TeamSpeak. All rights reserved.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @class TeamSpeak3_Helper_Uri
|
||||
* @brief Helper class for URI handling.
|
||||
*/
|
||||
class TeamSpeak3_Helper_Uri
|
||||
{
|
||||
/**
|
||||
* Stores the URI scheme.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $scheme = null;
|
||||
|
||||
/**
|
||||
* Stores the URI username
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $user = null;
|
||||
|
||||
/**
|
||||
* Stores the URI password.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $pass = null;
|
||||
|
||||
/**
|
||||
* Stores the URI host.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $host = null;
|
||||
|
||||
/**
|
||||
* Stores the URI port.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $port = null;
|
||||
|
||||
/**
|
||||
* Stores the URI path.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $path = null;
|
||||
|
||||
/**
|
||||
* Stores the URI query string.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $query = null;
|
||||
|
||||
/**
|
||||
* Stores the URI fragment string.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $fragment = null;
|
||||
|
||||
/**
|
||||
* Stores grammar rules for validation via regex.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $regex = array();
|
||||
|
||||
/**
|
||||
* The TeamSpeak3_Helper_Uri constructor.
|
||||
*
|
||||
* @param string $uri
|
||||
* @throws TeamSpeak3_Helper_Exception
|
||||
* @return TeamSpeak3_Helper_Uri
|
||||
*/
|
||||
public function __construct($uri)
|
||||
{
|
||||
$uri = explode(":", strval($uri), 2);
|
||||
|
||||
$this->scheme = strtolower($uri[0]);
|
||||
$uriString = isset($uri[1]) ? $uri[1] : "";
|
||||
|
||||
if(!ctype_alnum($this->scheme))
|
||||
{
|
||||
throw new TeamSpeak3_Helper_Exception("invalid URI scheme '" . $this->scheme . "' supplied");
|
||||
}
|
||||
|
||||
/* grammar rules for validation */
|
||||
$this->regex["alphanum"] = "[^\W_]";
|
||||
$this->regex["escaped"] = "(?:%[\da-fA-F]{2})";
|
||||
$this->regex["mark"] = "[-_.!~*'()\[\]]";
|
||||
$this->regex["reserved"] = "[;\/?:@&=+$,]";
|
||||
$this->regex["unreserved"] = "(?:" . $this->regex["alphanum"] . "|" . $this->regex["mark"] . ")";
|
||||
$this->regex["segment"] = "(?:(?:" . $this->regex["unreserved"] . "|" . $this->regex["escaped"] . "|[:@&=+$,;])*)";
|
||||
$this->regex["path"] = "(?:\/" . $this->regex["segment"] . "?)+";
|
||||
$this->regex["uric"] = "(?:" . $this->regex["reserved"] . "|" . $this->regex["unreserved"] . "|" . $this->regex["escaped"] . ")";
|
||||
|
||||
if(strlen($uriString) > 0)
|
||||
{
|
||||
$this->parseUri($uriString);
|
||||
}
|
||||
|
||||
if(!$this->isValid())
|
||||
{
|
||||
throw new TeamSpeak3_Helper_Exception("invalid URI supplied");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Parses the scheme-specific portion of the URI and place its parts into instance variables.
|
||||
*
|
||||
* @throws TeamSpeak3_Helper_Exception
|
||||
* @return void
|
||||
*/
|
||||
protected function parseUri($uriString = '')
|
||||
{
|
||||
$status = @preg_match("~^((//)([^/?#]*))([^?#]*)(\?([^#]*))?(#(.*))?$~", $uriString, $matches);
|
||||
|
||||
if($status === FALSE)
|
||||
{
|
||||
throw new TeamSpeak3_Helper_Exception("URI scheme-specific decomposition failed");
|
||||
}
|
||||
|
||||
if(!$status) return;
|
||||
|
||||
$this->path = (isset($matches[4])) ? $matches[4] : '';
|
||||
$this->query = (isset($matches[6])) ? $matches[6] : '';
|
||||
$this->fragment = (isset($matches[8])) ? $matches[8] : '';
|
||||
|
||||
$status = @preg_match("~^(([^:@]*)(:([^@]*))?@)?([^:]+)(:(.*))?$~", (isset($matches[3])) ? $matches[3] : "", $matches);
|
||||
|
||||
if($status === FALSE)
|
||||
{
|
||||
throw new TeamSpeak3_Helper_Exception("URI scheme-specific authority decomposition failed");
|
||||
}
|
||||
|
||||
if(!$status) return;
|
||||
|
||||
$this->user = isset($matches[2]) ? $matches[2] : "";
|
||||
$this->pass = isset($matches[4]) ? $matches[4] : "";
|
||||
$this->host = isset($matches[5]) ? $matches[5] : "";
|
||||
$this->port = isset($matches[7]) ? $matches[7] : "";
|
||||
}
|
||||
|
||||
/**
|
||||
* Validate the current URI from the instance variables.
|
||||
*
|
||||
* @return boolean
|
||||
*/
|
||||
public function isValid()
|
||||
{
|
||||
return ($this->checkUser() && $this->checkPass() && $this->checkHost() && $this->checkPort() && $this->checkPath() && $this->checkQuery() && $this->checkFragment());
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns TRUE if a given URI is valid.
|
||||
*
|
||||
* @param string $uri
|
||||
* @return boolean
|
||||
*/
|
||||
public static function check($uri)
|
||||
{
|
||||
try
|
||||
{
|
||||
$uri = new self(strval($uri));
|
||||
}
|
||||
catch(Exception $e)
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
return $uri->valid();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns TRUE if the URI has a scheme.
|
||||
*
|
||||
* @return boolean
|
||||
*/
|
||||
public function hasScheme()
|
||||
{
|
||||
return strlen($this->scheme) ? TRUE : FALSE;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the scheme.
|
||||
*
|
||||
* @param mixed default
|
||||
* @return TeamSpeak3_Helper_String
|
||||
*/
|
||||
public function getScheme($default = null)
|
||||
{
|
||||
return ($this->hasScheme()) ? new TeamSpeak3_Helper_String($this->scheme) : $default;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns TRUE if the username is valid.
|
||||
*
|
||||
* @param string $username
|
||||
* @throws TeamSpeak3_Helper_Exception
|
||||
* @return boolean
|
||||
*/
|
||||
public function checkUser($username = null)
|
||||
{
|
||||
if($username === null)
|
||||
{
|
||||
$username = $this->user;
|
||||
}
|
||||
|
||||
if(strlen($username) == 0)
|
||||
{
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
$pattern = "/^(" . $this->regex["alphanum"] . "|" . $this->regex["mark"] . "|" . $this->regex["escaped"] . "|[;:&=+$,])+$/";
|
||||
$status = @preg_match($pattern, $username);
|
||||
|
||||
if($status === FALSE)
|
||||
{
|
||||
throw new TeamSpeak3_Helper_Exception("URI username validation failed");
|
||||
}
|
||||
|
||||
return ($status == 1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns TRUE if the URI has a username.
|
||||
*
|
||||
* @return boolean
|
||||
*/
|
||||
public function hasUser()
|
||||
{
|
||||
return strlen($this->user) ? TRUE : FALSE;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the username.
|
||||
*
|
||||
* @param mixed default
|
||||
* @return TeamSpeak3_Helper_String
|
||||
*/
|
||||
public function getUser($default = null)
|
||||
{
|
||||
return ($this->hasUser()) ? new TeamSpeak3_Helper_String($this->user) : $default;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns TRUE if the password is valid.
|
||||
*
|
||||
* @param string $password
|
||||
* @throws TeamSpeak3_Helper_Exception
|
||||
* @return boolean
|
||||
*/
|
||||
public function checkPass($password = null)
|
||||
{
|
||||
if($password === null) {
|
||||
$password = $this->pass;
|
||||
}
|
||||
|
||||
if(strlen($password) == 0)
|
||||
{
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
$pattern = "/^(" . $this->regex["alphanum"] . "|" . $this->regex["mark"] . "|" . $this->regex["escaped"] . "|[;:&=+$,])+$/";
|
||||
$status = @preg_match($pattern, $password);
|
||||
|
||||
if($status === FALSE)
|
||||
{
|
||||
throw new TeamSpeak3_Helper_Exception("URI password validation failed");
|
||||
}
|
||||
|
||||
return ($status == 1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns TRUE if the URI has a password.
|
||||
*
|
||||
* @return boolean
|
||||
*/
|
||||
public function hasPass()
|
||||
{
|
||||
return strlen($this->pass) ? TRUE : FALSE;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the password.
|
||||
*
|
||||
* @param mixed default
|
||||
* @return TeamSpeak3_Helper_String
|
||||
*/
|
||||
public function getPass($default = null)
|
||||
{
|
||||
return ($this->hasPass()) ? new TeamSpeak3_Helper_String($this->pass) : $default;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns TRUE if the host is valid.
|
||||
*
|
||||
* @param string $host
|
||||
* @return boolean
|
||||
*/
|
||||
public function checkHost($host = null)
|
||||
{
|
||||
if($host === null)
|
||||
{
|
||||
$host = $this->host;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns TRUE if the URI has a host.
|
||||
*
|
||||
* @return boolean
|
||||
*/
|
||||
public function hasHost()
|
||||
{
|
||||
return strlen($this->host) ? TRUE : FALSE;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the host.
|
||||
*
|
||||
* @param mixed default
|
||||
* @return TeamSpeak3_Helper_String
|
||||
*/
|
||||
public function getHost($default = null)
|
||||
{
|
||||
return ($this->hasHost()) ? new TeamSpeak3_Helper_String($this->host) : $default;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns TRUE if the port is valid.
|
||||
*
|
||||
* @param integer $port
|
||||
* @return boolean
|
||||
*/
|
||||
public function checkPort($port = null)
|
||||
{
|
||||
if($port === null)
|
||||
{
|
||||
$port = $this->port;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns TRUE if the URI has a port.
|
||||
*
|
||||
* @return boolean
|
||||
*/
|
||||
public function hasPort()
|
||||
{
|
||||
return strlen($this->port) ? TRUE : FALSE;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the port.
|
||||
*
|
||||
* @param mixed default
|
||||
* @return integer
|
||||
*/
|
||||
public function getPort($default = null)
|
||||
{
|
||||
return ($this->hasPort()) ? intval($this->port) : $default;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns TRUE if the path is valid.
|
||||
*
|
||||
* @param string $path
|
||||
* @throws TeamSpeak3_Helper_Exception
|
||||
* @return boolean
|
||||
*/
|
||||
public function checkPath($path = null)
|
||||
{
|
||||
if($path === null)
|
||||
{
|
||||
$path = $this->path;
|
||||
}
|
||||
|
||||
if(strlen($path) == 0)
|
||||
{
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
$pattern = "/^" . $this->regex["path"] . "$/";
|
||||
$status = @preg_match($pattern, $path);
|
||||
|
||||
if($status === FALSE)
|
||||
{
|
||||
throw new TeamSpeak3_Helper_Exception("URI path validation failed");
|
||||
}
|
||||
|
||||
return ($status == 1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns TRUE if the URI has a path.
|
||||
*
|
||||
* @return boolean
|
||||
*/
|
||||
public function hasPath()
|
||||
{
|
||||
return strlen($this->path) ? TRUE : FALSE;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the path.
|
||||
*
|
||||
* @param mixed default
|
||||
* @return TeamSpeak3_Helper_String
|
||||
*/
|
||||
public function getPath($default = null)
|
||||
{
|
||||
return ($this->hasPath()) ? new TeamSpeak3_Helper_String($this->path) : $default;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns TRUE if the query string is valid.
|
||||
*
|
||||
* @param string $query
|
||||
* @throws TeamSpeak3_Helper_Exception
|
||||
* @return boolean
|
||||
*/
|
||||
public function checkQuery($query = null)
|
||||
{
|
||||
if($query === null)
|
||||
{
|
||||
$query = $this->query;
|
||||
}
|
||||
|
||||
if(strlen($query) == 0)
|
||||
{
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
$pattern = "/^" . $this->regex["uric"] . "*$/";
|
||||
$status = @preg_match($pattern, $query);
|
||||
|
||||
if($status === FALSE)
|
||||
{
|
||||
throw new TeamSpeak3_Helper_Exception("URI query string validation failed");
|
||||
}
|
||||
|
||||
return ($status == 1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns TRUE if the URI has a query string.
|
||||
*
|
||||
* @return boolean
|
||||
*/
|
||||
public function hasQuery()
|
||||
{
|
||||
return strlen($this->query) ? TRUE : FALSE;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns an array containing the query string elements.
|
||||
*
|
||||
* @param mixed $default
|
||||
* @return array
|
||||
*/
|
||||
public function getQuery($default = array())
|
||||
{
|
||||
if(!$this->hasQuery())
|
||||
{
|
||||
return $default;
|
||||
}
|
||||
|
||||
parse_str($this->query, $queryArray);
|
||||
|
||||
return $queryArray;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns TRUE if the URI has a query variable.
|
||||
*
|
||||
* @return boolean
|
||||
*/
|
||||
public function hasQueryVar($key)
|
||||
{
|
||||
if(!$this->hasQuery()) return FALSE;
|
||||
|
||||
parse_str($this->query, $queryArray);
|
||||
|
||||
return array_key_exists($key, $queryArray) ? TRUE : FALSE;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a single variable from the query string.
|
||||
*
|
||||
* @param string $key
|
||||
* @param mixed $default
|
||||
* @return mixed
|
||||
*/
|
||||
public function getQueryVar($key, $default = null)
|
||||
{
|
||||
if(!$this->hasQuery()) return $default;
|
||||
|
||||
parse_str($this->query, $queryArray);
|
||||
|
||||
if(array_key_exists($key, $queryArray))
|
||||
{
|
||||
$val = $queryArray[$key];
|
||||
|
||||
if(ctype_digit($val))
|
||||
{
|
||||
return intval($val);
|
||||
}
|
||||
elseif(is_string($val))
|
||||
{
|
||||
return new TeamSpeak3_Helper_String($val);
|
||||
}
|
||||
else
|
||||
{
|
||||
return $val;
|
||||
}
|
||||
}
|
||||
|
||||
return $default;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns TRUE if the fragment string is valid.
|
||||
*
|
||||
* @param string $fragment
|
||||
* @throws TeamSpeak3_Helper_Exception
|
||||
* @return boolean
|
||||
*/
|
||||
public function checkFragment($fragment = null)
|
||||
{
|
||||
if($fragment === null)
|
||||
{
|
||||
$fragment = $this->fragment;
|
||||
}
|
||||
|
||||
if(strlen($fragment) == 0)
|
||||
{
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
$pattern = "/^" . $this->regex["uric"] . "*$/";
|
||||
$status = @preg_match($pattern, $fragment);
|
||||
|
||||
if($status === FALSE)
|
||||
{
|
||||
throw new TeamSpeak3_Helper_Exception("URI fragment validation failed");
|
||||
}
|
||||
|
||||
return ($status == 1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns TRUE if the URI has a fragment string.
|
||||
*
|
||||
* @return boolean
|
||||
*/
|
||||
public function hasFragment()
|
||||
{
|
||||
return strlen($this->fragment) ? TRUE : FALSE;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the fragment.
|
||||
*
|
||||
* @param mixed default
|
||||
* @return TeamSpeak3_Helper_String
|
||||
*/
|
||||
public function getFragment($default = null)
|
||||
{
|
||||
return ($this->hasFragment()) ? new TeamSpeak3_Helper_String($this->fragment) : $default;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a specified instance parameter from the $_REQUEST array.
|
||||
*
|
||||
* @param string $key
|
||||
* @param mixed $default
|
||||
* @return mixed
|
||||
*/
|
||||
public static function getUserParam($key, $default = null)
|
||||
{
|
||||
return (array_key_exists($key, $_REQUEST) && !empty($_REQUEST[$key])) ? self::stripslashesRecursive($_REQUEST[$key]) : $default;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a specified environment parameter from the $_SERVER array.
|
||||
*
|
||||
* @param string $key
|
||||
* @param mixed $default
|
||||
* @return mixed
|
||||
*/
|
||||
public static function getHostParam($key, $default = null)
|
||||
{
|
||||
return (array_key_exists($key, $_SERVER) && !empty($_SERVER[$key])) ? $_SERVER[$key] : $default;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a specified session parameter from the $_SESSION array.
|
||||
*
|
||||
* @param string $key
|
||||
* @param mixed $default
|
||||
* @return mixed
|
||||
*/
|
||||
public static function getSessParam($key, $default = null)
|
||||
{
|
||||
return (array_key_exists($key, $_SESSION) && !empty($_SESSION[$key])) ? $_SESSION[$key] : $default;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns an array containing the three main parts of a FQDN (Fully Qualified Domain Name), including the
|
||||
* top-level domain, the second-level domains or hostname and the third-level domain.
|
||||
*
|
||||
* @param string $hostname
|
||||
* @return array
|
||||
*/
|
||||
public static function getFQDNParts($hostname)
|
||||
{
|
||||
if(!preg_match("/^([a-z0-9][a-z0-9-]{0,62}\.)*([a-z0-9][a-z0-9-]{0,62}\.)+([a-z]{2,6})$/i", $hostname, $matches))
|
||||
{
|
||||
return array();
|
||||
}
|
||||
|
||||
$parts["tld"] = $matches[3];
|
||||
$parts["2nd"] = $matches[2];
|
||||
$parts["3rd"] = $matches[1];
|
||||
|
||||
return $parts;
|
||||
}
|
||||
|
||||
/**
|
||||
* 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);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the applications base address.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public static function getBaseUri()
|
||||
{
|
||||
$scriptPath = new TeamSpeak3_Helper_String(dirname(self::getHostParam("SCRIPT_NAME")));
|
||||
|
||||
return self::getHostUri()->append(($scriptPath == DIRECTORY_SEPARATOR ? "" : $scriptPath) . "/");
|
||||
}
|
||||
|
||||
/**
|
||||
* Strips slashes from each element of an array using stripslashes().
|
||||
*
|
||||
* @param mixed $var
|
||||
* @return mixed
|
||||
*/
|
||||
protected static function stripslashesRecursive($var)
|
||||
{
|
||||
if(!is_array($var))
|
||||
{
|
||||
return stripslashes(strval($var));
|
||||
}
|
||||
|
||||
foreach($var as $key => $val)
|
||||
{
|
||||
$var[$key] = (is_array($val)) ? stripslashesRecursive($val) : stripslashes(strval($val));
|
||||
}
|
||||
|
||||
return $var;
|
||||
}
|
||||
}
|
||||
625
ts3_lib/Node/Abstract.php
Normal file
625
ts3_lib/Node/Abstract.php
Normal file
@@ -0,0 +1,625 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @file
|
||||
* TeamSpeak 3 PHP Framework
|
||||
*
|
||||
* $Id: Abstract.php 10/11/2013 11:35:21 scp@orilla $
|
||||
*
|
||||
* 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
|
||||
* @version 1.1.23
|
||||
* @author Sven 'ScP' Paulsen
|
||||
* @copyright Copyright (c) 2010 by Planet TeamSpeak. All rights reserved.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @class TeamSpeak3_Node_Abstract
|
||||
* @brief Abstract class describing a TeamSpeak 3 node and all it's parameters.
|
||||
*/
|
||||
abstract class TeamSpeak3_Node_Abstract implements RecursiveIterator, ArrayAccess, Countable
|
||||
{
|
||||
/**
|
||||
* @ignore
|
||||
*/
|
||||
protected $parent = null;
|
||||
|
||||
/**
|
||||
* @ignore
|
||||
*/
|
||||
protected $server = null;
|
||||
|
||||
/**
|
||||
* @ignore
|
||||
*/
|
||||
protected $nodeId = 0x00;
|
||||
|
||||
/**
|
||||
* @ignore
|
||||
*/
|
||||
protected $nodeList = null;
|
||||
|
||||
/**
|
||||
* @ignore
|
||||
*/
|
||||
protected $nodeInfo = array();
|
||||
|
||||
/**
|
||||
* @ignore
|
||||
*/
|
||||
protected $storage = array();
|
||||
|
||||
/**
|
||||
* Sends a prepared command to the server and returns the result.
|
||||
*
|
||||
* @param string $cmd
|
||||
* @param boolean $throw
|
||||
* @return TeamSpeak3_Adapter_ServerQuery_Reply
|
||||
*/
|
||||
public function request($cmd, $throw = TRUE)
|
||||
{
|
||||
return $this->getParent()->request($cmd, $throw);
|
||||
}
|
||||
|
||||
/**
|
||||
* Uses given parameters and returns a prepared ServerQuery command.
|
||||
*
|
||||
* @param string $cmd
|
||||
* @param array $params
|
||||
* @return TeamSpeak3_Helper_String
|
||||
*/
|
||||
public function prepare($cmd, array $params = array())
|
||||
{
|
||||
return $this->getParent()->prepare($cmd, $params);
|
||||
}
|
||||
|
||||
/**
|
||||
* Prepares and executes a ServerQuery command and returns the result.
|
||||
*
|
||||
* @param string $cmd
|
||||
* @param array $params
|
||||
* @return TeamSpeak3_Adapter_ServerQuery_Reply
|
||||
*/
|
||||
public function execute($cmd, array $params = array())
|
||||
{
|
||||
return $this->request($this->prepare($cmd, $params));
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the parent object of the current node.
|
||||
*
|
||||
* @return TeamSpeak3_Adapter_ServerQuery
|
||||
* @return TeamSpeak3_Node_Abstract
|
||||
*/
|
||||
public function getParent()
|
||||
{
|
||||
return $this->parent;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the primary ID of the current node.
|
||||
*
|
||||
* @return integer
|
||||
*/
|
||||
public function getId()
|
||||
{
|
||||
return $this->nodeId;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns TRUE if the node icon has a local source.
|
||||
*
|
||||
* @param string $key
|
||||
* @return boolean
|
||||
*/
|
||||
public function iconIsLocal($key)
|
||||
{
|
||||
return ($this[$key] > 0 && $this[$key] < 1000) ? TRUE : FALSE;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the internal path of the node icon.
|
||||
*
|
||||
* @param string $key
|
||||
* @return TeamSpeak3_Helper_String
|
||||
*/
|
||||
public function iconGetName($key)
|
||||
{
|
||||
$iconid = ($this[$key] < 0) ? (pow(2, 32))-($this[$key]*-1) : $this[$key];
|
||||
|
||||
return new TeamSpeak3_Helper_String("/icon_" . $iconid);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a possible classname for the node which can be used as a HTML property.
|
||||
*
|
||||
* @param string $prefix
|
||||
* @return string
|
||||
*/
|
||||
public function getClass($prefix = "ts3_")
|
||||
{
|
||||
if($this instanceof TeamSpeak3_Node_Channel && $this->isSpacer())
|
||||
{
|
||||
return $prefix . "spacer";
|
||||
}
|
||||
elseif($this instanceof TeamSpeak3_Node_Client && $this["client_type"])
|
||||
{
|
||||
return $prefix . "query";
|
||||
}
|
||||
|
||||
return $prefix . TeamSpeak3_Helper_String::factory(get_class($this))->section("_", 2)->toLower();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a unique identifier for the node which can be used as a HTML property.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
abstract public function getUniqueId();
|
||||
|
||||
/**
|
||||
* Returns the name of a possible icon to display the node object.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
abstract public function getIcon();
|
||||
|
||||
/**
|
||||
* Returns a symbol representing the node.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
abstract public function getSymbol();
|
||||
|
||||
/**
|
||||
* Returns the HTML code to display a TeamSpeak 3 viewer.
|
||||
*
|
||||
* @param TeamSpeak3_Viewer_Interface $viewer
|
||||
* @return string
|
||||
*/
|
||||
public function getViewer(TeamSpeak3_Viewer_Interface $viewer)
|
||||
{
|
||||
$html = $viewer->fetchObject($this);
|
||||
|
||||
$iterator = new RecursiveIteratorIterator($this, RecursiveIteratorIterator::SELF_FIRST);
|
||||
|
||||
foreach($iterator as $node)
|
||||
{
|
||||
$siblings = array();
|
||||
|
||||
for($level = 0; $level < $iterator->getDepth(); $level++)
|
||||
{
|
||||
$siblings[] = ($iterator->getSubIterator($level)->hasNext()) ? 1 : 0;
|
||||
}
|
||||
|
||||
$siblings[] = (!$iterator->getSubIterator($level)->hasNext()) ? 1 : 0;
|
||||
|
||||
$html .= $viewer->fetchObject($node, $siblings);
|
||||
}
|
||||
|
||||
return $html;
|
||||
}
|
||||
|
||||
/**
|
||||
* Filters given node list array using specified filter rules.
|
||||
*
|
||||
* @param array $nodes
|
||||
* @param array $rules
|
||||
* @return array
|
||||
*/
|
||||
protected function filterList(array $nodes = array(), array $rules = array())
|
||||
{
|
||||
if(!empty($rules))
|
||||
{
|
||||
foreach($nodes as $node)
|
||||
{
|
||||
if(!$node instanceof TeamSpeak3_Node_Abstract) continue;
|
||||
|
||||
$props = $node->getInfo(FALSE);
|
||||
$props = array_intersect_key($props, $rules);
|
||||
$match = TRUE;
|
||||
|
||||
foreach($props as $key => $val)
|
||||
{
|
||||
if($val instanceof TeamSpeak3_Helper_String)
|
||||
{
|
||||
$match = $val->contains($rules[$key], TRUE);
|
||||
}
|
||||
else
|
||||
{
|
||||
$match = $val == $rules[$key];
|
||||
}
|
||||
|
||||
if($match === FALSE)
|
||||
{
|
||||
unset($nodes[$node->getId()]);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return $nodes;
|
||||
}
|
||||
|
||||
/**
|
||||
* 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("_version"))
|
||||
{
|
||||
$info[$key->toString()] = TeamSpeak3_Helper_Convert::version($val);
|
||||
}
|
||||
elseif($key->endsWith("_icon_id"))
|
||||
{
|
||||
$info[$key->toString()] = $this->iconGetName($key)->filterDigits();
|
||||
}
|
||||
}
|
||||
|
||||
return $info;
|
||||
}
|
||||
|
||||
return $this->nodeInfo;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the specified property or a pre-defined default value from the node info array.
|
||||
*
|
||||
* @param string $property
|
||||
* @param mixed $default
|
||||
* @return mixed
|
||||
*/
|
||||
public function getProperty($property, $default = null)
|
||||
{
|
||||
if(!$this->offsetExists($property))
|
||||
{
|
||||
$this->fetchNodeInfo();
|
||||
}
|
||||
|
||||
if(!$this->offsetExists($property))
|
||||
{
|
||||
return $default;
|
||||
}
|
||||
|
||||
return $this->nodeInfo[(string) $property];
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a string representation of this node.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function __toString()
|
||||
{
|
||||
return get_class($this);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a string representation of this node.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function toString()
|
||||
{
|
||||
return $this->__toString();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns an assoc array filled with current node info properties.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function toArray()
|
||||
{
|
||||
return $this->nodeList;
|
||||
}
|
||||
|
||||
/**
|
||||
* Called whenever we're using an unknown method.
|
||||
*
|
||||
* @param string $name
|
||||
* @param array $args
|
||||
* @throws TeamSpeak3_Node_Exception
|
||||
* @return mixed
|
||||
*/
|
||||
public function __call($name, array $args)
|
||||
{
|
||||
if($this->getParent() instanceof TeamSpeak3_Node_Abstract)
|
||||
{
|
||||
return call_user_func_array(array($this->getParent(), $name), $args);
|
||||
}
|
||||
|
||||
throw new TeamSpeak3_Node_Exception("node method '" . $name . "()' does not exist");
|
||||
}
|
||||
|
||||
/**
|
||||
* Writes data to the internal storage array.
|
||||
*
|
||||
* @param string $key
|
||||
* @param mixed $val
|
||||
* @return void
|
||||
*/
|
||||
protected function setStorage($key, $val)
|
||||
{
|
||||
$this->storage[$key] = $val;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns data from the internal storage array.
|
||||
*
|
||||
* @param string $key
|
||||
* @param mixed $default
|
||||
* @return mixed
|
||||
*/
|
||||
protected function getStorage($key, $default = null)
|
||||
{
|
||||
return (array_key_exists($key, $this->storage) && !empty($this->storage[$key])) ? $this->storage[$key] : $default;
|
||||
}
|
||||
|
||||
/**
|
||||
* Deletes data from the internal storage array.
|
||||
*
|
||||
* @param string $key
|
||||
* @return void
|
||||
*/
|
||||
protected function delStorage($key)
|
||||
{
|
||||
unset($this->storage[$key]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Commit pending data.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function __sleep()
|
||||
{
|
||||
return array("parent", "storage", "nodeId");
|
||||
}
|
||||
|
||||
/**
|
||||
* @ignore
|
||||
*/
|
||||
protected function fetchNodeList()
|
||||
{
|
||||
$this->nodeList = array();
|
||||
}
|
||||
|
||||
/**
|
||||
* @ignore
|
||||
*/
|
||||
protected function fetchNodeInfo()
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
/**
|
||||
* @ignore
|
||||
*/
|
||||
protected function resetNodeInfo()
|
||||
{
|
||||
$this->nodeInfo = array();
|
||||
}
|
||||
|
||||
/**
|
||||
* @ignore
|
||||
*/
|
||||
protected function verifyNodeList()
|
||||
{
|
||||
if($this->nodeList === null)
|
||||
{
|
||||
$this->fetchNodeList();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @ignore
|
||||
*/
|
||||
protected function resetNodeList()
|
||||
{
|
||||
$this->nodeList = null;
|
||||
}
|
||||
|
||||
/**
|
||||
* @ignore
|
||||
*/
|
||||
public function count()
|
||||
{
|
||||
$this->verifyNodeList();
|
||||
|
||||
return count($this->nodeList);
|
||||
}
|
||||
|
||||
/**
|
||||
* @ignore
|
||||
*/
|
||||
public function current()
|
||||
{
|
||||
$this->verifyNodeList();
|
||||
|
||||
return current($this->nodeList);
|
||||
}
|
||||
|
||||
/**
|
||||
* @ignore
|
||||
*/
|
||||
public function getChildren()
|
||||
{
|
||||
$this->verifyNodeList();
|
||||
|
||||
return $this->current();
|
||||
}
|
||||
|
||||
/**
|
||||
* @ignore
|
||||
*/
|
||||
public function hasChildren()
|
||||
{
|
||||
$this->verifyNodeList();
|
||||
|
||||
return $this->current()->count() > 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* @ignore
|
||||
*/
|
||||
public function hasNext()
|
||||
{
|
||||
$this->verifyNodeList();
|
||||
|
||||
return $this->key()+1 < $this->count();
|
||||
}
|
||||
|
||||
/**
|
||||
* @ignore
|
||||
*/
|
||||
public function key()
|
||||
{
|
||||
$this->verifyNodeList();
|
||||
|
||||
return key($this->nodeList);
|
||||
}
|
||||
|
||||
/**
|
||||
* @ignore
|
||||
*/
|
||||
public function valid()
|
||||
{
|
||||
$this->verifyNodeList();
|
||||
|
||||
return $this->key() !== null;
|
||||
}
|
||||
|
||||
/**
|
||||
* @ignore
|
||||
*/
|
||||
public function next()
|
||||
{
|
||||
$this->verifyNodeList();
|
||||
|
||||
return next($this->nodeList);
|
||||
}
|
||||
|
||||
/**
|
||||
* @ignore
|
||||
*/
|
||||
public function rewind()
|
||||
{
|
||||
$this->verifyNodeList();
|
||||
|
||||
return reset($this->nodeList);
|
||||
}
|
||||
|
||||
/**
|
||||
* @ignore
|
||||
*/
|
||||
public function offsetExists($offset)
|
||||
{
|
||||
return array_key_exists((string) $offset, $this->nodeInfo) ? TRUE : FALSE;
|
||||
}
|
||||
|
||||
/**
|
||||
* @ignore
|
||||
*/
|
||||
public function offsetGet($offset)
|
||||
{
|
||||
if(!$this->offsetExists($offset))
|
||||
{
|
||||
$this->fetchNodeInfo();
|
||||
}
|
||||
|
||||
if(!$this->offsetExists($offset))
|
||||
{
|
||||
throw new TeamSpeak3_Adapter_ServerQuery_Exception("invalid parameter", 0x602);
|
||||
}
|
||||
|
||||
return $this->nodeInfo[(string) $offset];
|
||||
}
|
||||
|
||||
/**
|
||||
* @ignore
|
||||
*/
|
||||
public function offsetSet($offset, $value)
|
||||
{
|
||||
if(method_exists($this, "modify"))
|
||||
{
|
||||
return $this->modify(array((string) $offset => $value));
|
||||
}
|
||||
|
||||
throw new TeamSpeak3_Node_Exception("node '" . get_class($this) . "' is read only");
|
||||
}
|
||||
|
||||
/**
|
||||
* @ignore
|
||||
*/
|
||||
public function offsetUnset($offset)
|
||||
{
|
||||
unset($this->nodeInfo[(string) $offset]);
|
||||
}
|
||||
|
||||
/**
|
||||
* @ignore
|
||||
*/
|
||||
public function __get($offset)
|
||||
{
|
||||
return $this->offsetGet($offset);
|
||||
}
|
||||
|
||||
/**
|
||||
* @ignore
|
||||
*/
|
||||
public function __set($offset, $value)
|
||||
{
|
||||
$this->offsetSet($offset, $value);
|
||||
}
|
||||
}
|
||||
588
ts3_lib/Node/Channel.php
Normal file
588
ts3_lib/Node/Channel.php
Normal file
@@ -0,0 +1,588 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @file
|
||||
* TeamSpeak 3 PHP Framework
|
||||
*
|
||||
* $Id: Channel.php 10/11/2013 11:35:21 scp@orilla $
|
||||
*
|
||||
* 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
|
||||
* @version 1.1.23
|
||||
* @author Sven 'ScP' Paulsen
|
||||
* @copyright Copyright (c) 2010 by Planet TeamSpeak. All rights reserved.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @class TeamSpeak3_Node_Channel
|
||||
* @brief Class describing a TeamSpeak 3 channel and all it's parameters.
|
||||
*/
|
||||
class TeamSpeak3_Node_Channel extends TeamSpeak3_Node_Abstract
|
||||
{
|
||||
/**
|
||||
* The TeamSpeak3_Node_Channel constructor.
|
||||
*
|
||||
* @param TeamSpeak3_Node_Server $server
|
||||
* @param array $info
|
||||
* @param string $index
|
||||
* @throws TeamSpeak3_Adapter_ServerQuery_Exception
|
||||
* @return TeamSpeak3_Node_Channel
|
||||
*/
|
||||
public function __construct(TeamSpeak3_Node_Server $server, array $info, $index = "cid")
|
||||
{
|
||||
$this->parent = $server;
|
||||
$this->nodeInfo = $info;
|
||||
|
||||
if(!array_key_exists($index, $this->nodeInfo))
|
||||
{
|
||||
throw new TeamSpeak3_Adapter_ServerQuery_Exception("invalid channelID", 0x300);
|
||||
}
|
||||
|
||||
$this->nodeId = $this->nodeInfo[$index];
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns an array filled with TeamSpeak3_Node_Channel objects.
|
||||
*
|
||||
* @param array $filter
|
||||
* @return array
|
||||
*/
|
||||
public function subChannelList(array $filter = array())
|
||||
{
|
||||
$channels = array();
|
||||
|
||||
foreach($this->getParent()->channelList() as $channel)
|
||||
{
|
||||
if($channel["pid"] == $this->getId())
|
||||
{
|
||||
$channels[$channel->getId()] = $channel;
|
||||
}
|
||||
}
|
||||
|
||||
return $this->filterList($channels, $filter);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the TeamSpeak3_Node_Channel object matching the given ID.
|
||||
*
|
||||
* @param integer $cid
|
||||
* @throws TeamSpeak3_Adapter_ServerQuery_Exception
|
||||
* @return TeamSpeak3_Node_Channel
|
||||
*/
|
||||
public function subChannelGetById($cid)
|
||||
{
|
||||
if(!array_key_exists((string) $cid, $this->subChannelList()))
|
||||
{
|
||||
throw new TeamSpeak3_Adapter_ServerQuery_Exception("invalid channelID", 0x300);
|
||||
}
|
||||
|
||||
return $this->channelList[(string) $cid];
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the TeamSpeak3_Node_Channel object matching the given name.
|
||||
*
|
||||
* @param integer $name
|
||||
* @throws TeamSpeak3_Adapter_ServerQuery_Exception
|
||||
* @return TeamSpeak3_Node_Channel
|
||||
*/
|
||||
public function subChannelGetByName($name)
|
||||
{
|
||||
foreach($this->subChannelList() as $channel)
|
||||
{
|
||||
if($channel["channel_name"] == $name) return $channel;
|
||||
}
|
||||
|
||||
throw new TeamSpeak3_Adapter_ServerQuery_Exception("invalid channelID", 0x300);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns an array filled with TeamSpeak3_Node_Client objects.
|
||||
*
|
||||
* @param array $filter
|
||||
* @return array
|
||||
*/
|
||||
public function clientList(array $filter = array())
|
||||
{
|
||||
$clients = array();
|
||||
|
||||
foreach($this->getParent()->clientList() as $client)
|
||||
{
|
||||
if($client["cid"] == $this->getId())
|
||||
{
|
||||
$clients[$client->getId()] = $client;
|
||||
}
|
||||
}
|
||||
|
||||
return $this->filterList($clients, $filter);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the TeamSpeak3_Node_Client object matching the given ID.
|
||||
*
|
||||
* @param integer $clid
|
||||
* @throws TeamSpeak3_Adapter_ServerQuery_Exception
|
||||
* @return TeamSpeak3_Node_Client
|
||||
*/
|
||||
public function clientGetById($clid)
|
||||
{
|
||||
if(!array_key_exists($clid, $this->clientList()))
|
||||
{
|
||||
throw new TeamSpeak3_Adapter_ServerQuery_Exception("invalid clientID", 0x200);
|
||||
}
|
||||
|
||||
return $this->clientList[intval($clid)];
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the TeamSpeak3_Node_Client object matching the given name.
|
||||
*
|
||||
* @param integer $name
|
||||
* @throws TeamSpeak3_Adapter_ServerQuery_Exception
|
||||
* @return TeamSpeak3_Node_Client
|
||||
*/
|
||||
public function clientGetByName($name)
|
||||
{
|
||||
foreach($this->clientList() as $client)
|
||||
{
|
||||
if($client["client_nickname"] == $name) return $client;
|
||||
}
|
||||
|
||||
throw new TeamSpeak3_Adapter_ServerQuery_Exception("invalid clientID", 0x200);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a list of permissions defined for a client in the channel.
|
||||
*
|
||||
* @param integer $cldbid
|
||||
* @param boolean $permsid
|
||||
* @return void
|
||||
*/
|
||||
public function clientPermList($cldbid, $permsid = FALSE)
|
||||
{
|
||||
return $this->getParent()->channelClientPermList($this->getId(), $cldbid, $permsid);
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds a set of specified permissions to a client in a specific channel. Multiple permissions can be added by
|
||||
* providing the two parameters of each permission.
|
||||
*
|
||||
* @param integer $cldbid
|
||||
* @param integer $permid
|
||||
* @param integer $permvalue
|
||||
* @return void
|
||||
*/
|
||||
public function clientPermAssign($cldbid, $permid, $permvalue)
|
||||
{
|
||||
return $this->getParent()->channelClientPermAssign($this->getId(), $cldbid, $permid, $permvalue);
|
||||
}
|
||||
|
||||
/**
|
||||
* Alias for clientPermAssign().
|
||||
*
|
||||
* @deprecated
|
||||
*/
|
||||
public function clientPermAssignByName($cldbid, $permname, $permvalue)
|
||||
{
|
||||
return $this->clientPermAssign($cldbid, $permname, $permvalue);
|
||||
}
|
||||
|
||||
/**
|
||||
* Removes a set of specified permissions from a client in the channel. Multiple permissions can be removed at once.
|
||||
*
|
||||
* @param integer $cldbid
|
||||
* @param integer $permid
|
||||
* @return void
|
||||
*/
|
||||
public function clientPermRemove($cldbid, $permid)
|
||||
{
|
||||
return $this->getParent()->channelClientPermRemove($this->getId(), $cldbid, $permid);
|
||||
}
|
||||
|
||||
/**
|
||||
* Alias for clientPermRemove().
|
||||
*
|
||||
* @deprecated
|
||||
*/
|
||||
public function clientPermRemoveByName($cldbid, $permname)
|
||||
{
|
||||
return $this->clientPermRemove($cldbid, $permname);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a list of permissions defined for the channel.
|
||||
*
|
||||
* @param boolean $permsid
|
||||
* @return array
|
||||
*/
|
||||
public function permList($permsid = FALSE)
|
||||
{
|
||||
return $this->getParent()->channelPermList($this->getId(), $permsid);
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds a set of specified permissions to the channel. Multiple permissions can be added by
|
||||
* providing the two parameters of each permission.
|
||||
*
|
||||
* @param integer $permid
|
||||
* @param integer $permvalue
|
||||
* @return void
|
||||
*/
|
||||
public function permAssign($permid, $permvalue)
|
||||
{
|
||||
return $this->getParent()->channelPermAssign($this->getId(), $permid, $permvalue);
|
||||
}
|
||||
|
||||
/**
|
||||
* Alias for permAssign().
|
||||
*
|
||||
* @deprecated
|
||||
*/
|
||||
public function permAssignByName($permname, $permvalue)
|
||||
{
|
||||
return $this->permAssign($permname, $permvalue);
|
||||
}
|
||||
|
||||
/**
|
||||
* Removes a set of specified permissions from the channel. Multiple permissions can be removed at once.
|
||||
*
|
||||
* @param integer $permid
|
||||
* @return void
|
||||
*/
|
||||
public function permRemove($permid)
|
||||
{
|
||||
return $this->getParent()->channelPermRemove($this->getId(), $permid);
|
||||
}
|
||||
|
||||
/**
|
||||
* Alias for permRemove().
|
||||
*
|
||||
* @deprecated
|
||||
*/
|
||||
public function permRemoveByName($permname)
|
||||
{
|
||||
return $this->permRemove($permname);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a list of files and directories stored in the channels file repository.
|
||||
*
|
||||
* @param string $cpw
|
||||
* @param string $path
|
||||
* @param boolean $recursive
|
||||
* @return void
|
||||
*/
|
||||
public function fileList($cpw = "", $path = "/", $recursive = FALSE)
|
||||
{
|
||||
return $this->getParent()->channelFileList($this->getId(), $cpw, $path, $recursive);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns detailed information about the specified file stored in the channels file repository.
|
||||
*
|
||||
* @param string $cpw
|
||||
* @param string $name
|
||||
* @return array
|
||||
*/
|
||||
public function fileInfo($cpw = "", $name = "/")
|
||||
{
|
||||
return $this->getParent()->channelFileInfo($this->getId(), $cpw, $name);
|
||||
}
|
||||
|
||||
/**
|
||||
* Renames a file in the channels file repository. If the two parameters $tcid and $tcpw are specified, the file
|
||||
* will be moved into another channels file repository.
|
||||
*
|
||||
* @param string $cpw
|
||||
* @param string $oldname
|
||||
* @param string $newname
|
||||
* @param integer $tcid
|
||||
* @param string $tcpw
|
||||
* @return void
|
||||
*/
|
||||
public function fileRename($cpw = "", $oldname = "/", $newname = "/", $tcid = null, $tcpw = null)
|
||||
{
|
||||
return $this->getParent()->channelFileRename($this->getId(), $cpw, $oldname, $newname, $tcid, $tcpw);
|
||||
}
|
||||
|
||||
/**
|
||||
* Deletes one or more files stored in the channels file repository.
|
||||
*
|
||||
* @param string $cpw
|
||||
* @param string $path
|
||||
* @return void
|
||||
*/
|
||||
public function fileDelete($cpw = "", $name = "/")
|
||||
{
|
||||
return $this->getParent()->channelFileDelete($this->getId(), $cpw, $name);
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates new directory in a channels file repository.
|
||||
*
|
||||
* @param string $cpw
|
||||
* @param string $dirname
|
||||
* @return void
|
||||
*/
|
||||
public function dirCreate($cpw = "", $dirname = "/")
|
||||
{
|
||||
return $this->getParent()->channelDirCreate($this->getId(), $cpw, $dirname);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the level of the channel.
|
||||
*
|
||||
* @return integer
|
||||
*/
|
||||
public function getLevel()
|
||||
{
|
||||
return $this->getParent()->channelGetLevel($this->getId());
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the pathway of the channel which can be used as a clients default channel.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getPathway()
|
||||
{
|
||||
return $this->getParent()->channelGetPathway($this->getId());
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the possible spacer type of the channel.
|
||||
*
|
||||
* @return integer
|
||||
*/
|
||||
public function spacerGetType()
|
||||
{
|
||||
return $this->getParent()->channelSpacerGetType($this->getId());
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the possible spacer alignment of the channel.
|
||||
*
|
||||
* @return integer
|
||||
*/
|
||||
public function spacerGetAlign()
|
||||
{
|
||||
return $this->getParent()->channelSpacerGetAlign($this->getId());
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns TRUE if the channel is a spacer.
|
||||
*
|
||||
* @return boolean
|
||||
*/
|
||||
public function isSpacer()
|
||||
{
|
||||
return $this->getParent()->channelIsSpacer($this);
|
||||
}
|
||||
|
||||
/**
|
||||
* Downloads and returns the channels icon file content.
|
||||
*
|
||||
* @return TeamSpeak3_Helper_String
|
||||
*/
|
||||
public function iconDownload()
|
||||
{
|
||||
if($this->iconIsLocal("channel_icon_id") || $this["channel_icon_id"] == 0) return;
|
||||
|
||||
$download = $this->getParent()->transferInitDownload(rand(0x0000, 0xFFFF), 0, $this->iconGetName("channel_icon_id"));
|
||||
$transfer = TeamSpeak3::factory("filetransfer://" . $download["host"] . ":" . $download["port"]);
|
||||
|
||||
return $transfer->download($download["ftkey"], $download["size"]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Changes the channel configuration using given properties.
|
||||
*
|
||||
* @param array $properties
|
||||
* @return void
|
||||
*/
|
||||
public function modify(array $properties)
|
||||
{
|
||||
$properties["cid"] = $this->getId();
|
||||
|
||||
$this->execute("channeledit", $properties);
|
||||
$this->resetNodeInfo();
|
||||
}
|
||||
|
||||
/**
|
||||
* Sends a text message to all clients in the channel.
|
||||
*
|
||||
* @param string $msg
|
||||
* @param string $cpw
|
||||
* @return void
|
||||
*/
|
||||
public function message($msg, $cpw = null)
|
||||
{
|
||||
if($this->getId() != $this->getParent()->whoamiGet("client_channel_id"))
|
||||
{
|
||||
$this->getParent()->clientMove($this->getParent()->whoamiGet("client_id"), $this->getId(), $cpw);
|
||||
}
|
||||
|
||||
$this->execute("sendtextmessage", array("msg" => $msg, "target" => $this->getId(), "targetmode" => TeamSpeak3::TEXTMSG_CHANNEL));
|
||||
}
|
||||
|
||||
/**
|
||||
* Deletes the channel.
|
||||
*
|
||||
* @param boolean $force
|
||||
* @return void
|
||||
*/
|
||||
public function delete($force = FALSE)
|
||||
{
|
||||
$this->getParent()->channelDelete($this->getId(), $force);
|
||||
|
||||
unset($this);
|
||||
}
|
||||
|
||||
/**
|
||||
* Moves the channel to the parent channel specified with $pid.
|
||||
*
|
||||
* @param integer $pid
|
||||
* @param integer $order
|
||||
* @return void
|
||||
*/
|
||||
public function move($pid, $order = null)
|
||||
{
|
||||
$this->getParent()->channelMove($this->getId(), $pid, $order);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sends a plugin command to all clients in the channel.
|
||||
*
|
||||
* @param string $plugin
|
||||
* @param string $data
|
||||
* @param string $cpw
|
||||
* @param boolean $subscribed
|
||||
* @return void
|
||||
*/
|
||||
public function sendPluginCmd($plugin, $data, $cpw = null, $subscribed = FALSE)
|
||||
{
|
||||
if($this->getId() != $this->getParent()->whoamiGet("client_channel_id"))
|
||||
{
|
||||
$this->getParent()->clientMove($this->getParent()->whoamiGet("client_id"), $this->getId(), $cpw);
|
||||
}
|
||||
|
||||
$this->execute("plugincmd", array("name" => $plugin, "data" => $data, "targetmode" => $subscribed ? TeamSpeak3::PLUGINCMD_CHANNEL_SUBSCRIBED : TeamSpeak3::PLUGINCMD_CHANNEL));
|
||||
}
|
||||
|
||||
/**
|
||||
* @ignore
|
||||
*/
|
||||
protected function fetchNodeList()
|
||||
{
|
||||
$this->nodeList = array();
|
||||
|
||||
if($this->getParent()->getLoadClientlistFirst())
|
||||
{
|
||||
foreach($this->clientList() as $client)
|
||||
{
|
||||
if($client["cid"] == $this->getId())
|
||||
{
|
||||
$this->nodeList[] = $client;
|
||||
}
|
||||
}
|
||||
|
||||
foreach($this->subChannelList() as $channel)
|
||||
{
|
||||
if($channel["pid"] == $this->getId())
|
||||
{
|
||||
$this->nodeList[] = $channel;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
foreach($this->subChannelList() as $channel)
|
||||
{
|
||||
if($channel["pid"] == $this->getId())
|
||||
{
|
||||
$this->nodeList[] = $channel;
|
||||
}
|
||||
}
|
||||
|
||||
foreach($this->clientList() as $client)
|
||||
{
|
||||
if($client["cid"] == $this->getId())
|
||||
{
|
||||
$this->nodeList[] = $client;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @ignore
|
||||
*/
|
||||
protected function fetchNodeInfo()
|
||||
{
|
||||
$this->nodeInfo = array_merge($this->nodeInfo, $this->execute("channelinfo", array("cid" => $this->getId()))->toList());
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a unique identifier for the node which can be used as a HTML property.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getUniqueId()
|
||||
{
|
||||
return $this->getParent()->getUniqueId() . "_ch" . $this->getId();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the name of a possible icon to display the node object.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getIcon()
|
||||
{
|
||||
if($this["channel_maxclients"] != -1 && $this["channel_maxclients"] <= $this["total_clients"])
|
||||
{
|
||||
return "channel_full";
|
||||
}
|
||||
elseif($this["channel_flag_password"])
|
||||
{
|
||||
return "channel_pass";
|
||||
}
|
||||
else
|
||||
{
|
||||
return "channel_open";
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a symbol representing the node.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getSymbol()
|
||||
{
|
||||
return "#";
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a string representation of this node.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function __toString()
|
||||
{
|
||||
return (string) $this["channel_name"];
|
||||
}
|
||||
}
|
||||
|
||||
276
ts3_lib/Node/Channelgroup.php
Normal file
276
ts3_lib/Node/Channelgroup.php
Normal file
@@ -0,0 +1,276 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @file
|
||||
* TeamSpeak 3 PHP Framework
|
||||
*
|
||||
* $Id: Channelgroup.php 10/11/2013 11:35:21 scp@orilla $
|
||||
*
|
||||
* 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
|
||||
* @version 1.1.23
|
||||
* @author Sven 'ScP' Paulsen
|
||||
* @copyright Copyright (c) 2010 by Planet TeamSpeak. All rights reserved.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @class TeamSpeak3_Node_Channelgroup
|
||||
* @brief Class describing a TeamSpeak 3 channel group and all it's parameters.
|
||||
*/
|
||||
class TeamSpeak3_Node_Channelgroup extends TeamSpeak3_Node_Abstract
|
||||
{
|
||||
/**
|
||||
* The TeamSpeak3_Node_Channelgroup constructor.
|
||||
*
|
||||
* @param TeamSpeak3_Node_Server $server
|
||||
* @param array $info
|
||||
* @param string $index
|
||||
* @throws TeamSpeak3_Adapter_ServerQuery_Exception
|
||||
* @return TeamSpeak3_Node_Channelgroup
|
||||
*/
|
||||
public function __construct(TeamSpeak3_Node_Server $server, array $info, $index = "cgid")
|
||||
{
|
||||
$this->parent = $server;
|
||||
$this->nodeInfo = $info;
|
||||
|
||||
if(!array_key_exists($index, $this->nodeInfo))
|
||||
{
|
||||
throw new TeamSpeak3_Adapter_ServerQuery_Exception("invalid groupID", 0xA00);
|
||||
}
|
||||
|
||||
$this->nodeId = $this->nodeInfo[$index];
|
||||
}
|
||||
|
||||
/**
|
||||
* Renames the channel group specified.
|
||||
*
|
||||
* @param string $name
|
||||
* @return void
|
||||
*/
|
||||
public function rename($name)
|
||||
{
|
||||
return $this->getParent()->channelGroupRename($this->getId(), $name);
|
||||
}
|
||||
|
||||
/**
|
||||
* Deletes the channel group. If $force is set to TRUE, the channel group will be
|
||||
* deleted even if there are clients within.
|
||||
*
|
||||
* @param boolean $force
|
||||
* @return void
|
||||
*/
|
||||
public function delete($force = FALSE)
|
||||
{
|
||||
$this->getParent()->channelGroupDelete($this->getId(), $force);
|
||||
|
||||
unset($this);
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a copy of the channel group and returns the new groups ID.
|
||||
*
|
||||
* @param string $name
|
||||
* @param integer $tcgid
|
||||
* @param integer $type
|
||||
* @return integer
|
||||
*/
|
||||
public function copy($name = null, $tcgid = 0, $type = TeamSpeak3::GROUP_DBTYPE_REGULAR)
|
||||
{
|
||||
return $this->getParent()->channelGroupCopy($this->getId(), $name, $tcgid, $type);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a list of permissions assigned to the channel group.
|
||||
*
|
||||
* @param boolean $permsid
|
||||
* @return array
|
||||
*/
|
||||
public function permList($permsid = FALSE)
|
||||
{
|
||||
return $this->getParent()->channelGroupPermList($this->getId(), $permsid);
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds a set of specified permissions to the channel group. Multiple permissions
|
||||
* can be added by providing the two parameters of each permission in separate arrays.
|
||||
*
|
||||
* @param integer $permid
|
||||
* @param integer $permvalue
|
||||
* @return void
|
||||
*/
|
||||
public function permAssign($permid, $permvalue)
|
||||
{
|
||||
return $this->getParent()->channelGroupPermAssign($this->getId(), $permid, $permvalue);
|
||||
}
|
||||
|
||||
/**
|
||||
* Alias for permAssign().
|
||||
*
|
||||
* @deprecated
|
||||
*/
|
||||
public function permAssignByName($permname, $permvalue)
|
||||
{
|
||||
return $this->permAssign($permname, $permvalue);
|
||||
}
|
||||
|
||||
/**
|
||||
* Removes a set of specified permissions from the channel group. Multiple
|
||||
* permissions can be removed at once.
|
||||
*
|
||||
* @param integer $permid
|
||||
* @return void
|
||||
*/
|
||||
public function permRemove($permid)
|
||||
{
|
||||
return $this->getParent()->channelGroupPermRemove($this->getId(), $permid);
|
||||
}
|
||||
|
||||
/**
|
||||
* Alias for permAssign().
|
||||
*
|
||||
* @deprecated
|
||||
*/
|
||||
public function permRemoveByName($permname)
|
||||
{
|
||||
return $this->permRemove($permname);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a list of clients assigned to the server group specified.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function clientList()
|
||||
{
|
||||
return $this->getParent()->channelGroupClientList($this->getId());
|
||||
}
|
||||
|
||||
/**
|
||||
* Alias for privilegeKeyCreate().
|
||||
*
|
||||
* @deprecated
|
||||
*/
|
||||
public function tokenCreate($cid, $description = null, $customset = null)
|
||||
{
|
||||
return $this->privilegeKeyCreate($cid, $description, $customset);
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new privilege key (token) for the channel group and returns the key.
|
||||
*
|
||||
* @param integer $cid
|
||||
* @param string $description
|
||||
* @param string $customset
|
||||
* @return TeamSpeak3_Helper_String
|
||||
*/
|
||||
public function privilegeKeyCreate($cid, $description = null, $customset = null)
|
||||
{
|
||||
return $this->getParent()->privilegeKeyCreate(TeamSpeak3::TOKEN_CHANNELGROUP, $this->getId(), $cid, $description, $customset);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sends a text message to all clients residing in the channel group on the virtual server.
|
||||
*
|
||||
* @param string $msg
|
||||
* @return void
|
||||
*/
|
||||
public function message($msg)
|
||||
{
|
||||
foreach($this as $client)
|
||||
{
|
||||
try
|
||||
{
|
||||
$this->execute("sendtextmessage", array("msg" => $msg, "target" => $client, "targetmode" => TeamSpeak3::TEXTMSG_CLIENT));
|
||||
}
|
||||
catch(TeamSpeak3_Adapter_ServerQuery_Exception $e)
|
||||
{
|
||||
/* ERROR_client_invalid_id */
|
||||
if($e->getCode() != 0x0200) throw $e;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Downloads and returns the channel groups icon file content.
|
||||
*
|
||||
* @return TeamSpeak3_Helper_String
|
||||
*/
|
||||
public function iconDownload()
|
||||
{
|
||||
if($this->iconIsLocal("iconid") || $this["iconid"] == 0) return;
|
||||
|
||||
$download = $this->getParent()->transferInitDownload(rand(0x0000, 0xFFFF), 0, $this->iconGetName("iconid"));
|
||||
$transfer = TeamSpeak3::factory("filetransfer://" . $download["host"] . ":" . $download["port"]);
|
||||
|
||||
return $transfer->download($download["ftkey"], $download["size"]);
|
||||
}
|
||||
|
||||
/**
|
||||
* @ignore
|
||||
*/
|
||||
protected function fetchNodeList()
|
||||
{
|
||||
$this->nodeList = array();
|
||||
|
||||
foreach($this->getParent()->clientList() as $client)
|
||||
{
|
||||
if($client["client_channel_group_id"] == $this->getId())
|
||||
{
|
||||
$this->nodeList[] = $client;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a unique identifier for the node which can be used as a HTML property.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getUniqueId()
|
||||
{
|
||||
return $this->getParent()->getUniqueId() . "_cg" . $this->getId();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the name of a possible icon to display the node object.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getIcon()
|
||||
{
|
||||
return "group_channel";
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a symbol representing the node.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getSymbol()
|
||||
{
|
||||
return "%";
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a string representation of this node.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function __toString()
|
||||
{
|
||||
return (string) $this["name"];
|
||||
}
|
||||
}
|
||||
|
||||
441
ts3_lib/Node/Client.php
Normal file
441
ts3_lib/Node/Client.php
Normal file
@@ -0,0 +1,441 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @file
|
||||
* TeamSpeak 3 PHP Framework
|
||||
*
|
||||
* $Id: Client.php 10/11/2013 11:35:21 scp@orilla $
|
||||
*
|
||||
* 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
|
||||
* @version 1.1.23
|
||||
* @author Sven 'ScP' Paulsen
|
||||
* @copyright Copyright (c) 2010 by Planet TeamSpeak. All rights reserved.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @class TeamSpeak3_Node_Client
|
||||
* @brief Class describing a TeamSpeak 3 client and all it's parameters.
|
||||
*/
|
||||
class TeamSpeak3_Node_Client extends TeamSpeak3_Node_Abstract
|
||||
{
|
||||
/**
|
||||
* The TeamSpeak3_Node_Client constructor.
|
||||
*
|
||||
* @param TeamSpeak3_Node_Server $server
|
||||
* @param array $info
|
||||
* @param string $index
|
||||
* @throws TeamSpeak3_Adapter_ServerQuery_Exception
|
||||
* @return TeamSpeak3_Node_Client
|
||||
*/
|
||||
public function __construct(TeamSpeak3_Node_Server $server, array $info, $index = "clid")
|
||||
{
|
||||
$this->parent = $server;
|
||||
$this->nodeInfo = $info;
|
||||
|
||||
if(!array_key_exists($index, $this->nodeInfo))
|
||||
{
|
||||
throw new TeamSpeak3_Adapter_ServerQuery_Exception("invalid clientID", 0x200);
|
||||
}
|
||||
|
||||
$this->nodeId = $this->nodeInfo[$index];
|
||||
}
|
||||
|
||||
/**
|
||||
* Changes the clients properties using given properties.
|
||||
*
|
||||
* @param array $properties
|
||||
* @return void
|
||||
*/
|
||||
public function modify(array $properties)
|
||||
{
|
||||
$properties["clid"] = $this->getId();
|
||||
|
||||
$this->execute("clientedit", $properties);
|
||||
$this->resetNodeInfo();
|
||||
}
|
||||
|
||||
/**
|
||||
* Changes the clients properties using given properties.
|
||||
*
|
||||
* @param array $properties
|
||||
* @return void
|
||||
*/
|
||||
public function modifyDb(array $properties)
|
||||
{
|
||||
return $this->getParent()->clientModifyDb($this["client_database_id"], $properties);
|
||||
}
|
||||
|
||||
/**
|
||||
* Deletes the clients properties from the database.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function deleteDb()
|
||||
{
|
||||
return $this->getParent()->clientDeleteDb($this["client_database_id"]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a list of properties from the database for the client.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function infoDb()
|
||||
{
|
||||
return $this->getParent()->clientInfoDb($this["client_database_id"]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sends a text message to the client.
|
||||
*
|
||||
* @param string $msg
|
||||
* @return void
|
||||
*/
|
||||
public function message($msg)
|
||||
{
|
||||
$this->execute("sendtextmessage", array("msg" => $msg, "target" => $this->getId(), "targetmode" => TeamSpeak3::TEXTMSG_CLIENT));
|
||||
}
|
||||
|
||||
/**
|
||||
* Moves the client to another channel.
|
||||
*
|
||||
* @param integer $cid
|
||||
* @param string $cpw
|
||||
* @return void
|
||||
*/
|
||||
public function move($cid, $cpw = null)
|
||||
{
|
||||
return $this->getParent()->clientMove($this->getId(), $cid, $cpw);
|
||||
}
|
||||
|
||||
/**
|
||||
* Kicks the client from his currently joined channel or from the server.
|
||||
*
|
||||
* @param integer $reasonid
|
||||
* @param string $reasonmsg
|
||||
* @return void
|
||||
*/
|
||||
public function kick($reasonid = TeamSpeak3::KICK_CHANNEL, $reasonmsg = null)
|
||||
{
|
||||
return $this->getParent()->clientKick($this->getId(), $reasonid, $reasonmsg);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sends a poke message to the client.
|
||||
*
|
||||
* @param string $msg
|
||||
* @return void
|
||||
*/
|
||||
public function poke($msg)
|
||||
{
|
||||
return $this->getParent()->clientPoke($this->getId(), $msg);
|
||||
}
|
||||
|
||||
/**
|
||||
* Bans the client from the server. Please note that this will create two separate
|
||||
* ban rules for the targeted clients IP address and his unique identifier.
|
||||
*
|
||||
* @param integer $timeseconds
|
||||
* @param string $reason
|
||||
* @return array
|
||||
*/
|
||||
public function ban($timeseconds = null, $reason = null)
|
||||
{
|
||||
return $this->getParent()->clientBan($this->getId(), $timeseconds, $reason);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a list of custom properties for the client.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function customInfo()
|
||||
{
|
||||
return $this->getParent()->customInfo($this["client_database_id"]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns an array containing the permission overview of the client.
|
||||
*
|
||||
* @param integer $cid
|
||||
* @return array
|
||||
*/
|
||||
public function permOverview($cid)
|
||||
{
|
||||
return $this->execute("permoverview", array("cldbid" => $this["client_database_id"], "cid" => $cid, "permid" => 0))->toArray();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a list of permissions defined for the client.
|
||||
*
|
||||
* @param boolean $permsid
|
||||
* @return array
|
||||
*/
|
||||
public function permList($permsid = FALSE)
|
||||
{
|
||||
return $this->getParent()->clientPermList($this["client_database_id"], $permsid);
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds a set of specified permissions to the client. Multiple permissions can be added by providing
|
||||
* the three parameters of each permission.
|
||||
*
|
||||
* @param integer $permid
|
||||
* @param integer $permvalue
|
||||
* @param integer $permskip
|
||||
* @return void
|
||||
*/
|
||||
public function permAssign($permid, $permvalue, $permskip = FALSE)
|
||||
{
|
||||
return $this->getParent()->clientPermAssign($this["client_database_id"], $permid, $permvalue, $permskip);
|
||||
}
|
||||
|
||||
/**
|
||||
* Alias for permAssign().
|
||||
*
|
||||
* @deprecated
|
||||
*/
|
||||
public function permAssignByName($permname, $permvalue, $permskip = FALSE)
|
||||
{
|
||||
return $this->permAssign($permname, $permvalue, $permskip);
|
||||
}
|
||||
|
||||
/**
|
||||
* Removes a set of specified permissions from a client. Multiple permissions can be removed at once.
|
||||
*
|
||||
* @param integer $permid
|
||||
* @return void
|
||||
*/
|
||||
public function permRemove($permid)
|
||||
{
|
||||
return $this->getParent()->clientPermRemove($this["client_database_id"], $permid);
|
||||
}
|
||||
|
||||
/**
|
||||
* Alias for permRemove().
|
||||
*
|
||||
* @deprecated
|
||||
*/
|
||||
public function permRemoveByName($permname)
|
||||
{
|
||||
return $this->permRemove($permname);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the channel group of a client to the ID specified.
|
||||
*
|
||||
* @param integer $cid
|
||||
* @param integer $cgid
|
||||
* @return void
|
||||
*/
|
||||
public function setChannelGroup($cid, $cgid)
|
||||
{
|
||||
return $this->getParent()->clientSetChannelGroup($this["client_database_id"], $cid, $cgid);
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds the client to the server group specified with $sgid.
|
||||
*
|
||||
* @param integer $sgid
|
||||
* @return void
|
||||
*/
|
||||
public function addServerGroup($sgid)
|
||||
{
|
||||
return $this->getParent()->serverGroupClientAdd($sgid, $this["client_database_id"]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Removes the client from the server group specified with $sgid.
|
||||
*
|
||||
* @param integer $sgid
|
||||
* @return void
|
||||
*/
|
||||
public function remServerGroup($sgid)
|
||||
{
|
||||
return $this->getParent()->serverGroupClientDel($sgid, $this["client_database_id"]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the possible name of the clients avatar.
|
||||
*
|
||||
* @return TeamSpeak3_Helper_String
|
||||
*/
|
||||
public function avatarGetName()
|
||||
{
|
||||
return new TeamSpeak3_Helper_String("/avatar_" . $this["client_base64HashClientUID"]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Downloads and returns the clients avatar file content.
|
||||
*
|
||||
* @return TeamSpeak3_Helper_String
|
||||
*/
|
||||
public function avatarDownload()
|
||||
{
|
||||
if($this["client_flag_avatar"] == 0) return;
|
||||
|
||||
$download = $this->getParent()->transferInitDownload(rand(0x0000, 0xFFFF), 0, $this->avatarGetName());
|
||||
$transfer = TeamSpeak3::factory("filetransfer://" . $download["host"] . ":" . $download["port"]);
|
||||
|
||||
return $transfer->download($download["ftkey"], $download["size"]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a list of client connections using the same identity as this client.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function getClones()
|
||||
{
|
||||
return $this->execute("clientgetids", array("cluid" => $this["client_unique_identifier"]))->toAssocArray("clid");
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the revision/build number from the clients version string.
|
||||
*
|
||||
* @return integer
|
||||
*/
|
||||
public function getRev()
|
||||
{
|
||||
return $this["client_type"] ? null : $this["client_version"]->section("[", 1)->filterDigits();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns all server and channel groups the client is currently residing in.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function memberOf()
|
||||
{
|
||||
$groups = array($this->getParent()->channelGroupGetById($this["client_channel_group_id"]));
|
||||
|
||||
foreach(explode(",", $this["client_servergroups"]) as $sgid)
|
||||
{
|
||||
$groups[] = $this->getParent()->serverGroupGetById($sgid);
|
||||
}
|
||||
|
||||
return $groups;
|
||||
}
|
||||
|
||||
/**
|
||||
* Downloads and returns the clients icon file content.
|
||||
*
|
||||
* @return TeamSpeak3_Helper_String
|
||||
*/
|
||||
public function iconDownload()
|
||||
{
|
||||
if($this->iconIsLocal("client_icon_id") || $this["client_icon_id"] == 0) return;
|
||||
|
||||
$download = $this->getParent()->transferInitDownload(rand(0x0000, 0xFFFF), 0, $this->iconGetName("client_icon_id"));
|
||||
$transfer = TeamSpeak3::factory("filetransfer://" . $download["host"] . ":" . $download["port"]);
|
||||
|
||||
return $transfer->download($download["ftkey"], $download["size"]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sends a plugin command to the client.
|
||||
*
|
||||
* @param string $plugin
|
||||
* @param string $data
|
||||
* @return void
|
||||
*/
|
||||
public function sendPluginCmd($plugin, $data)
|
||||
{
|
||||
$this->execute("plugincmd", array("name" => $plugin, "data" => $data, "targetmode" => TeamSpeak3::PLUGINCMD_CLIENT, "target" => $this->getId()));
|
||||
}
|
||||
|
||||
/**
|
||||
* @ignore
|
||||
*/
|
||||
protected function fetchNodeInfo()
|
||||
{
|
||||
if($this["client_type"] == 1) return;
|
||||
|
||||
$this->nodeInfo = array_merge($this->nodeInfo, $this->execute("clientinfo", array("clid" => $this->getId()))->toList());
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a unique identifier for the node which can be used as a HTML property.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getUniqueId()
|
||||
{
|
||||
return $this->getParent()->getUniqueId() . "_cl" . $this->getId();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the name of a possible icon to display the node object.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getIcon()
|
||||
{
|
||||
if($this["client_type"])
|
||||
{
|
||||
return "client_query";
|
||||
}
|
||||
elseif($this["client_away"])
|
||||
{
|
||||
return "client_away";
|
||||
}
|
||||
elseif(!$this["client_output_hardware"])
|
||||
{
|
||||
return "client_snd_disabled";
|
||||
}
|
||||
elseif($this["client_output_muted"])
|
||||
{
|
||||
return "client_snd_muted";
|
||||
}
|
||||
elseif(!$this["client_input_hardware"])
|
||||
{
|
||||
return "client_mic_disabled";
|
||||
}
|
||||
elseif($this["client_input_muted"])
|
||||
{
|
||||
return "client_mic_muted";
|
||||
}
|
||||
elseif($this["client_is_channel_commander"])
|
||||
{
|
||||
return $this["client_flag_talking"] ? "client_cc_talk" : "client_cc_idle";
|
||||
}
|
||||
else
|
||||
{
|
||||
return $this["client_flag_talking"] ? "client_talk" : "client_idle";
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a symbol representing the node.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getSymbol()
|
||||
{
|
||||
return "@";
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a string representation of this node.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function __toString()
|
||||
{
|
||||
return (string) $this["client_nickname"];
|
||||
}
|
||||
}
|
||||
|
||||
32
ts3_lib/Node/Exception.php
Normal file
32
ts3_lib/Node/Exception.php
Normal file
@@ -0,0 +1,32 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @file
|
||||
* TeamSpeak 3 PHP Framework
|
||||
*
|
||||
* $Id: Exception.php 10/11/2013 11:35:21 scp@orilla $
|
||||
*
|
||||
* 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
|
||||
* @version 1.1.23
|
||||
* @author Sven 'ScP' Paulsen
|
||||
* @copyright Copyright (c) 2010 by Planet TeamSpeak. All rights reserved.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @class TeamSpeak3_Node_Exception
|
||||
* @brief Enhanced exception class for TeamSpeak3_Node_Abstract objects.
|
||||
*/
|
||||
class TeamSpeak3_Node_Exception extends TeamSpeak3_Exception {}
|
||||
1193
ts3_lib/Node/Host.php
Normal file
1193
ts3_lib/Node/Host.php
Normal file
File diff suppressed because it is too large
Load Diff
2536
ts3_lib/Node/Server.php
Normal file
2536
ts3_lib/Node/Server.php
Normal file
File diff suppressed because it is too large
Load Diff
300
ts3_lib/Node/Servergroup.php
Normal file
300
ts3_lib/Node/Servergroup.php
Normal file
@@ -0,0 +1,300 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @file
|
||||
* TeamSpeak 3 PHP Framework
|
||||
*
|
||||
* $Id: Servergroup.php 10/11/2013 11:35:21 scp@orilla $
|
||||
*
|
||||
* 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
|
||||
* @version 1.1.23
|
||||
* @author Sven 'ScP' Paulsen
|
||||
* @copyright Copyright (c) 2010 by Planet TeamSpeak. All rights reserved.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @class TeamSpeak3_Node_Servergroup
|
||||
* @brief Class describing a TeamSpeak 3 server group and all it's parameters.
|
||||
*/
|
||||
class TeamSpeak3_Node_Servergroup extends TeamSpeak3_Node_Abstract
|
||||
{
|
||||
/**
|
||||
* The TeamSpeak3_Node_Servergroup constructor.
|
||||
*
|
||||
* @param TeamSpeak3_Node_Server $server
|
||||
* @param array $info
|
||||
* @param string $index
|
||||
* @throws TeamSpeak3_Node_Exception
|
||||
* @return TeamSpeak3_Node_Servergroup
|
||||
*/
|
||||
public function __construct(TeamSpeak3_Node_Server $server, array $info, $index = "sgid")
|
||||
{
|
||||
$this->parent = $server;
|
||||
$this->nodeInfo = $info;
|
||||
|
||||
if(!array_key_exists($index, $this->nodeInfo))
|
||||
{
|
||||
throw new TeamSpeak3_Node_Exception("invalid groupID", 0xA00);
|
||||
}
|
||||
|
||||
$this->nodeId = $this->nodeInfo[$index];
|
||||
}
|
||||
|
||||
/**
|
||||
* Renames the server group specified.
|
||||
*
|
||||
* @param string $name
|
||||
* @return void
|
||||
*/
|
||||
public function rename($name)
|
||||
{
|
||||
return $this->getParent()->serverGroupRename($this->getId(), $name);
|
||||
}
|
||||
|
||||
/**
|
||||
* Deletes the server group. If $force is set to 1, the server group will be
|
||||
* deleted even if there are clients within.
|
||||
*
|
||||
* @param boolean $force
|
||||
* @return void
|
||||
*/
|
||||
public function delete($force = FALSE)
|
||||
{
|
||||
$this->getParent()->serverGroupDelete($this->getId(), $force);
|
||||
|
||||
unset($this);
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a copy of the server group and returns the new groups ID.
|
||||
*
|
||||
* @param string $name
|
||||
* @param integer $tsgid
|
||||
* @param integer $type
|
||||
* @return integer
|
||||
*/
|
||||
public function copy($name = null, $tsgid = 0, $type = TeamSpeak3::GROUP_DBTYPE_REGULAR)
|
||||
{
|
||||
return $this->getParent()->serverGroupCopy($this->getId(), $name, $tsgid, $type);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a list of permissions assigned to the server group.
|
||||
*
|
||||
* @param boolean $permsid
|
||||
* @return array
|
||||
*/
|
||||
public function permList($permsid = FALSE)
|
||||
{
|
||||
return $this->getParent()->serverGroupPermList($this->getId(), $permsid);
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds a set of specified permissions to the server group. Multiple permissions
|
||||
* can be added by providing the four parameters of each permission in separate arrays.
|
||||
*
|
||||
* @param integer $permid
|
||||
* @param integer $permvalue
|
||||
* @param integer $permnegated
|
||||
* @param integer $permskip
|
||||
* @return void
|
||||
*/
|
||||
public function permAssign($permid, $permvalue, $permnegated = FALSE, $permskip = FALSE)
|
||||
{
|
||||
return $this->getParent()->serverGroupPermAssign($this->getId(), $permid, $permvalue, $permnegated, $permskip);
|
||||
}
|
||||
|
||||
/**
|
||||
* Alias for permAssign().
|
||||
*
|
||||
* @deprecated
|
||||
*/
|
||||
public function permAssignByName($permname, $permvalue, $permnegated = FALSE, $permskip = FALSE)
|
||||
{
|
||||
return $this->permAssign($permname, $permvalue, $permnegated, $permskip);
|
||||
}
|
||||
|
||||
/**
|
||||
* Removes a set of specified permissions from the server group. Multiple
|
||||
* permissions can be removed at once.
|
||||
*
|
||||
* @param integer $permid
|
||||
* @return void
|
||||
*/
|
||||
public function permRemove($permid)
|
||||
{
|
||||
return $this->getParent()->serverGroupPermRemove($this->getId(), $permid);
|
||||
}
|
||||
|
||||
/**
|
||||
* Alias for permRemove().
|
||||
*
|
||||
* @deprecated
|
||||
*/
|
||||
public function permRemoveByName($permname)
|
||||
{
|
||||
return $this->permRemove($permname);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a list of clients assigned to the server group specified.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function clientList()
|
||||
{
|
||||
return $this->getParent()->serverGroupClientList($this->getId());
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds a client to the server group specified. Please note that a client cannot be
|
||||
* added to default groups or template groups.
|
||||
*
|
||||
* @param integer $cldbid
|
||||
* @return void
|
||||
*/
|
||||
public function clientAdd($cldbid)
|
||||
{
|
||||
return $this->getParent()->serverGroupClientAdd($this->getId(), $cldbid);
|
||||
}
|
||||
|
||||
/**
|
||||
* Removes a client from the server group.
|
||||
*
|
||||
* @param integer $cldbid
|
||||
* @return void
|
||||
*/
|
||||
public function clientDel($cldbid)
|
||||
{
|
||||
return $this->getParent()->serverGroupClientDel($this->getId(), $cldbid);
|
||||
}
|
||||
|
||||
/**
|
||||
* Alias for privilegeKeyCreate().
|
||||
*
|
||||
* @deprecated
|
||||
*/
|
||||
public function tokenCreate($description = null, $customset = null)
|
||||
{
|
||||
return $this->privilegeKeyCreate($description, $customset);
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new privilege key (token) for the server group and returns the key.
|
||||
*
|
||||
* @param string $description
|
||||
* @param string $customset
|
||||
* @return TeamSpeak3_Helper_String
|
||||
*/
|
||||
public function privilegeKeyCreate($description = null, $customset = null)
|
||||
{
|
||||
return $this->getParent()->privilegeKeyCreate(TeamSpeak3::TOKEN_SERVERGROUP, $this->getId(), 0, $description, $customset);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sends a text message to all clients residing in the server group on the virtual server.
|
||||
*
|
||||
* @param string $msg
|
||||
* @return void
|
||||
*/
|
||||
public function message($msg)
|
||||
{
|
||||
foreach($this as $client)
|
||||
{
|
||||
try
|
||||
{
|
||||
$this->execute("sendtextmessage", array("msg" => $msg, "target" => $client, "targetmode" => TeamSpeak3::TEXTMSG_CLIENT));
|
||||
}
|
||||
catch(TeamSpeak3_Adapter_ServerQuery_Exception $e)
|
||||
{
|
||||
/* ERROR_client_invalid_id */
|
||||
if($e->getCode() != 0x0200) throw $e;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Downloads and returns the server groups icon file content.
|
||||
*
|
||||
* @return TeamSpeak3_Helper_String
|
||||
*/
|
||||
public function iconDownload()
|
||||
{
|
||||
if($this->iconIsLocal("iconid") || $this["iconid"] == 0) return;
|
||||
|
||||
$download = $this->getParent()->transferInitDownload(rand(0x0000, 0xFFFF), 0, $this->iconGetName("iconid"));
|
||||
$transfer = TeamSpeak3::factory("filetransfer://" . $download["host"] . ":" . $download["port"]);
|
||||
|
||||
return $transfer->download($download["ftkey"], $download["size"]);
|
||||
}
|
||||
|
||||
/**
|
||||
* @ignore
|
||||
*/
|
||||
protected function fetchNodeList()
|
||||
{
|
||||
$this->nodeList = array();
|
||||
|
||||
foreach($this->getParent()->clientList() as $client)
|
||||
{
|
||||
if(in_array($this->getId(), explode(",", $client["client_servergroups"])))
|
||||
{
|
||||
$this->nodeList[] = $client;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a unique identifier for the node which can be used as a HTML property.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getUniqueId()
|
||||
{
|
||||
return $this->getParent()->getUniqueId() . "_sg" . $this->getId();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the name of a possible icon to display the node object.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getIcon()
|
||||
{
|
||||
return "group_server";
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a symbol representing the node.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getSymbol()
|
||||
{
|
||||
return "%";
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a string representation of this node.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function __toString()
|
||||
{
|
||||
return (string) $this["name"];
|
||||
}
|
||||
}
|
||||
|
||||
980
ts3_lib/TeamSpeak3.php
Normal file
980
ts3_lib/TeamSpeak3.php
Normal file
@@ -0,0 +1,980 @@
|
||||
<?php
|
||||
/**
|
||||
* @file
|
||||
* TeamSpeak 3 PHP Framework
|
||||
*
|
||||
* $Id: TeamSpeak3.php 10/11/2013 11:35:21 scp@orilla $
|
||||
*
|
||||
* 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
|
||||
* @version 1.1.23
|
||||
* @author Sven 'ScP' Paulsen
|
||||
* @copyright Copyright (c) 2010 by Planet TeamSpeak. All rights reserved.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @class TeamSpeak3
|
||||
* @brief Factory class all for TeamSpeak 3 PHP Framework objects.
|
||||
*/
|
||||
class TeamSpeak3
|
||||
{
|
||||
/**
|
||||
* TeamSpeak 3 protocol welcome message.
|
||||
*/
|
||||
const READY = "TS3";
|
||||
|
||||
/**
|
||||
* TeamSpeak 3 protocol greeting message prefix.
|
||||
*/
|
||||
const GREET = "Welcome";
|
||||
|
||||
/**
|
||||
* TeamSpeak 3 protocol error message prefix.
|
||||
*/
|
||||
const ERROR = "error";
|
||||
|
||||
/**
|
||||
* TeamSpeak 3 protocol event message prefix.
|
||||
*/
|
||||
const EVENT = "notify";
|
||||
|
||||
/**
|
||||
* TeamSpeak 3 protocol server connection handler ID prefix.
|
||||
*/
|
||||
const SCHID = "selected";
|
||||
|
||||
/**
|
||||
* TeamSpeak 3 PHP Framework version.
|
||||
*/
|
||||
const LIB_VERSION = "1.1.23";
|
||||
|
||||
/*@
|
||||
* TeamSpeak 3 protocol separators.
|
||||
*/
|
||||
const SEPARATOR_LINE = "\n"; //!< protocol line separator
|
||||
const SEPARATOR_LIST = "|"; //!< protocol list separator
|
||||
const SEPARATOR_CELL = " "; //!< protocol cell separator
|
||||
const SEPARATOR_PAIR = "="; //!< protocol pair separator
|
||||
|
||||
/*@
|
||||
* TeamSpeak 3 log levels.
|
||||
*/
|
||||
const LOGLEVEL_CRITICAL = 0x00; //!< 0: these messages stop the program
|
||||
const LOGLEVEL_ERROR = 0x01; //!< 1: everything that is really bad
|
||||
const LOGLEVEL_WARNING = 0x02; //!< 2: everything that might be bad
|
||||
const LOGLEVEL_DEBUG = 0x03; //!< 3: output that might help find a problem
|
||||
const LOGLEVEL_INFO = 0x04; //!< 4: informational output
|
||||
const LOGLEVEL_DEVEL = 0x05; //!< 5: development output
|
||||
|
||||
/*@
|
||||
* TeamSpeak 3 token types.
|
||||
*/
|
||||
const TOKEN_SERVERGROUP = 0x00; //!< 0: server group token (id1={groupID} id2=0)
|
||||
const TOKEN_CHANNELGROUP = 0x01; //!< 1: channel group token (id1={groupID} id2={channelID})
|
||||
|
||||
/*@
|
||||
* TeamSpeak 3 codec identifiers.
|
||||
*/
|
||||
const CODEC_SPEEX_NARROWBAND = 0x00; //!< 0: speex narrowband (mono, 16bit, 8kHz)
|
||||
const CODEC_SPEEX_WIDEBAND = 0x01; //!< 1: speex wideband (mono, 16bit, 16kHz)
|
||||
const CODEC_SPEEX_ULTRAWIDEBAND = 0x02; //!< 2: speex ultra-wideband (mono, 16bit, 32kHz)
|
||||
const CODEC_CELT_MONO = 0x03; //!< 3: celt mono (mono, 16bit, 48kHz)
|
||||
const CODEC_OPUS_VOICE = 0x04; //!< 3: opus voice (interactive)
|
||||
const CODEC_OPUS_MUSIC = 0x05; //!< 3: opus music (interactive)
|
||||
|
||||
/*@
|
||||
* TeamSpeak 3 codec encryption modes.
|
||||
*/
|
||||
const CODEC_CRYPT_INDIVIDUAL = 0x00; //!< 0: configure per channel
|
||||
const CODEC_CRYPT_DISABLED = 0x01; //!< 1: globally disabled
|
||||
const CODEC_CRYPT_ENABLED = 0x02; //!< 2: globally enabled
|
||||
|
||||
/*@
|
||||
* TeamSpeak 3 kick reason types.
|
||||
*/
|
||||
const KICK_CHANNEL = 0x04; //!< 4: kick client from channel
|
||||
const KICK_SERVER = 0x05; //!< 5: kick client from server
|
||||
|
||||
/*@
|
||||
* TeamSpeak 3 text message target modes.
|
||||
*/
|
||||
const TEXTMSG_CLIENT = 0x01; //!< 1: target is a client
|
||||
const TEXTMSG_CHANNEL = 0x02; //!< 2: target is a channel
|
||||
const TEXTMSG_SERVER = 0x03; //!< 3: target is a virtual server
|
||||
|
||||
/*@
|
||||
* TeamSpeak 3 plugin command target modes.
|
||||
*/
|
||||
const PLUGINCMD_CHANNEL = 0x01; //!< 1: send plugincmd to all clients in current channel
|
||||
const PLUGINCMD_SERVER = 0x02; //!< 2: send plugincmd to all clients on server
|
||||
const PLUGINCMD_CLIENT = 0x03; //!< 3: send plugincmd to all given client ids
|
||||
const PLUGINCMD_CHANNEL_SUBSCRIBED = 0x04; //!< 4: send plugincmd to all subscribed clients in current channel
|
||||
|
||||
/*@
|
||||
* TeamSpeak 3 host message modes.
|
||||
*/
|
||||
const HOSTMSG_NONE = 0x00; //!< 0: display no message
|
||||
const HOSTMSG_LOG = 0x01; //!< 1: display message in chatlog
|
||||
const HOSTMSG_MODAL = 0x02; //!< 2: display message in modal dialog
|
||||
const HOSTMSG_MODALQUIT = 0x03; //!< 3: display message in modal dialog and close connection
|
||||
|
||||
/*@
|
||||
* TeamSpeak 3 host banner modes.
|
||||
*/
|
||||
const HOSTBANNER_NO_ADJUST = 0x00; //!< 0: do not adjust
|
||||
const HOSTBANNER_IGNORE_ASPECT = 0x01; //!< 1: adjust but ignore aspect ratio
|
||||
const HOSTBANNER_KEEP_ASPECT = 0x02; //!< 2: adjust and keep aspect ratio
|
||||
|
||||
/*@
|
||||
* TeamSpeak 3 client identification types.
|
||||
*/
|
||||
const CLIENT_TYPE_REGULAR = 0x00; //!< 0: regular client
|
||||
const CLIENT_TYPE_SERVERQUERY = 0x01; //!< 1: query client
|
||||
|
||||
/*@
|
||||
* TeamSpeak 3 permission group database types.
|
||||
*/
|
||||
const GROUP_DBTYPE_TEMPLATE = 0x00; //!< 0: template group (used for new virtual servers)
|
||||
const GROUP_DBTYPE_REGULAR = 0x01; //!< 1: regular group (used for regular clients)
|
||||
const GROUP_DBTYPE_SERVERQUERY = 0x02; //!< 2: global query group (used for ServerQuery clients)
|
||||
|
||||
/*@
|
||||
* TeamSpeak 3 permission group name modes.
|
||||
*/
|
||||
const GROUP_NAMEMODE_HIDDEN = 0x00; //!< 0: display no name
|
||||
const GROUP_NAMEMODE_BEFORE = 0x01; //!< 1: display name before client nickname
|
||||
const GROUP_NAMEMODE_BEHIND = 0x02; //!< 2: display name after client nickname
|
||||
|
||||
/*@
|
||||
* TeamSpeak 3 permission group identification types.
|
||||
*/
|
||||
const GROUP_IDENTIFIY_STRONGEST = 0x01; //!< 1: identify most powerful group
|
||||
const GROUP_IDENTIFIY_WEAKEST = 0x02; //!< 2: identify weakest group
|
||||
|
||||
/*@
|
||||
* TeamSpeak 3 permission types.
|
||||
*/
|
||||
const PERM_TYPE_SERVERGROUP = 0x00; //!< 0: server group permission
|
||||
const PERM_TYPE_CLIENT = 0x01; //!< 1: client specific permission
|
||||
const PERM_TYPE_CHANNEL = 0x02; //!< 2: channel specific permission
|
||||
const PERM_TYPE_CHANNELGROUP = 0x03; //!< 3: channel group permission
|
||||
const PERM_TYPE_CHANNELCLIENT = 0x04; //!< 4: channel-client specific permission
|
||||
|
||||
/*@
|
||||
* TeamSpeak 3 permission categories.
|
||||
*/
|
||||
const PERM_CAT_GLOBAL = 0x10; //!< 00010000: global permissions
|
||||
const PERM_CAT_GLOBAL_INFORMATION = 0x11; //!< 00010001: global permissions -> global information
|
||||
const PERM_CAT_GLOBAL_SERVER_MGMT = 0x12; //!< 00010010: global permissions -> virtual server management
|
||||
const PERM_CAT_GLOBAL_ADM_ACTIONS = 0x13; //!< 00010011: global permissions -> global administrative actions
|
||||
const PERM_CAT_GLOBAL_SETTINGS = 0x14; //!< 00010100: global permissions -> global settings
|
||||
const PERM_CAT_SERVER = 0x20; //!< 00100000: virtual server permissions
|
||||
const PERM_CAT_SERVER_INFORMATION = 0x21; //!< 00100001: virtual server permissions -> virtual server information
|
||||
const PERM_CAT_SERVER_ADM_ACTIONS = 0x22; //!< 00100010: virtual server permissions -> virtual server administrative actions
|
||||
const PERM_CAT_SERVER_SETTINGS = 0x23; //!< 00100011: virtual server permissions -> virtual server settings
|
||||
const PERM_CAT_CHANNEL = 0x30; //!< 00110000: channel permissions
|
||||
const PERM_CAT_CHANNEL_INFORMATION = 0x31; //!< 00110001: channel permissions -> channel information
|
||||
const PERM_CAT_CHANNEL_CREATE = 0x32; //!< 00110010: channel permissions -> create channels
|
||||
const PERM_CAT_CHANNEL_MODIFY = 0x33; //!< 00110011: channel permissions -> edit channels
|
||||
const PERM_CAT_CHANNEL_DELETE = 0x34; //!< 00110100: channel permissions -> delete channels
|
||||
const PERM_CAT_CHANNEL_ACCESS = 0x35; //!< 00110101: channel permissions -> access channels
|
||||
const PERM_CAT_GROUP = 0x40; //!< 01000000: group permissions
|
||||
const PERM_CAT_GROUP_INFORMATION = 0x41; //!< 01000001: group permissions -> group information
|
||||
const PERM_CAT_GROUP_CREATE = 0x42; //!< 01000010: group permissions -> create groups
|
||||
const PERM_CAT_GROUP_MODIFY = 0x43; //!< 01000011: group permissions -> edit groups
|
||||
const PERM_CAT_GROUP_DELETE = 0x44; //!< 01000100: group permissions -> delete groups
|
||||
const PERM_CAT_CLIENT = 0x50; //!< 01010000: client permissions
|
||||
const PERM_CAT_CLIENT_INFORMATION = 0x51; //!< 01010001: client permissions -> client information
|
||||
const PERM_CAT_CLIENT_ADM_ACTIONS = 0x52; //!< 01010010: client permissions -> client administrative actions
|
||||
const PERM_CAT_CLIENT_BASICS = 0x53; //!< 01010011: client permissions -> client basic communication
|
||||
const PERM_CAT_CLIENT_MODIFY = 0x54; //!< 01010100: client permissions -> edit clients
|
||||
const PERM_CAT_FILETRANSFER = 0x60; //!< 01100000: file transfer permissions
|
||||
const PERM_CAT_NEEDED_MODIFY_POWER = 0xFF; //!< 11111111: needed permission modify power (grant) permissions
|
||||
|
||||
/*@
|
||||
* TeamSpeak 3 file types.
|
||||
*/
|
||||
const FILE_TYPE_DIRECTORY = 0x00; //!< 0: file is directory
|
||||
const FILE_TYPE_REGULAR = 0x01; //!< 1: file is regular
|
||||
|
||||
/*@
|
||||
* TeamSpeak 3 server snapshot types.
|
||||
*/
|
||||
const SNAPSHOT_STRING = 0x00; //!< 0: default string
|
||||
const SNAPSHOT_BASE64 = 0x01; //!< 1: base64 string
|
||||
const SNAPSHOT_HEXDEC = 0x02; //!< 2: hexadecimal string
|
||||
|
||||
/*@
|
||||
* TeamSpeak 3 channel spacer types.
|
||||
*/
|
||||
const SPACER_SOLIDLINE = 0x00; //!< 0: solid line
|
||||
const SPACER_DASHLINE = 0x01; //!< 1: dash line
|
||||
const SPACER_DOTLINE = 0x02; //!< 2: dot line
|
||||
const SPACER_DASHDOTLINE = 0x03; //!< 3: dash dot line
|
||||
const SPACER_DASHDOTDOTLINE = 0x04; //!< 4: dash dot dot line
|
||||
const SPACER_CUSTOM = 0x05; //!< 5: custom format
|
||||
|
||||
/*@
|
||||
* TeamSpeak 3 channel spacer alignments.
|
||||
*/
|
||||
const SPACER_ALIGN_LEFT = 0x00; //!< 0: alignment left
|
||||
const SPACER_ALIGN_RIGHT = 0x01; //!< 1: alignment right
|
||||
const SPACER_ALIGN_CENTER = 0x02; //!< 2: alignment center
|
||||
const SPACER_ALIGN_REPEAT = 0x03; //!< 3: repeat until the whole line is filled
|
||||
|
||||
/*@
|
||||
* TeamSpeak 3 reason identifiers.
|
||||
*/
|
||||
const REASON_NONE = 0x00; //!< 0: no reason
|
||||
const REASON_MOVE = 0x01; //!< 1: channel switched or moved
|
||||
const REASON_SUBSCRIPTION = 0x02; //!< 2: subscription added or removed
|
||||
const REASON_TIMEOUT = 0x03; //!< 3: client connection timed out
|
||||
const REASON_CHANNEL_KICK = 0x04; //!< 4: client kicked from channel
|
||||
const REASON_SERVER_KICK = 0x05; //!< 5: client kicked from server
|
||||
const REASON_SERVER_BAN = 0x06; //!< 6: client banned from server
|
||||
const REASON_SERVER_STOP = 0x07; //!< 7: server stopped
|
||||
const REASON_DISCONNECT = 0x08; //!< 8: client disconnected
|
||||
const REASON_CHANNEL_UPDATE = 0x09; //!< 9: channel information updated
|
||||
const REASON_CHANNEL_EDIT = 0x0A; //!< 10: channel information edited
|
||||
const REASON_DISCONNECT_SHUTDOWN = 0x0B; //!< 11: client disconnected on server shutdown
|
||||
|
||||
/**
|
||||
* Stores an array containing various chars which need to be escaped while communicating
|
||||
* with a TeamSpeak 3 Server.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected static $escape_patterns = array(
|
||||
"\\" => "\\\\", // backslash
|
||||
"/" => "\\/", // slash
|
||||
" " => "\\s", // whitespace
|
||||
"|" => "\\p", // pipe
|
||||
";" => "\\;", // semicolon
|
||||
"\a" => "\\a", // bell
|
||||
"\b" => "\\b", // backspace
|
||||
"\f" => "\\f", // formfeed
|
||||
"\n" => "\\n", // newline
|
||||
"\r" => "\\r", // carriage return
|
||||
"\t" => "\\t", // horizontal tab
|
||||
"\v" => "\\v" // vertical tab
|
||||
);
|
||||
|
||||
/**
|
||||
* Factory for TeamSpeak3_Adapter_Abstract classes. $uri must be formatted as
|
||||
* "<adapter>://<user>:<pass>@<host>:<port>/<options>#<flags>". All parameters
|
||||
* except adapter, host and port are optional.
|
||||
*
|
||||
* === Supported Options ===
|
||||
* - timeout
|
||||
* - blocking
|
||||
* - nickname
|
||||
* - no_query_clients
|
||||
* - use_offline_as_virtual
|
||||
* - clients_before_channels
|
||||
* - server_id|server_uid|server_port|server_name|server_tsdns
|
||||
* - channel_id|channel_name
|
||||
* - client_id|client_uid|client_name
|
||||
*
|
||||
* === Supported Flags (only one per $uri) ===
|
||||
* - no_query_clients
|
||||
* - use_offline_as_virtual
|
||||
* - clients_before_channels
|
||||
*
|
||||
* === URI Examples ===
|
||||
* - serverquery://127.0.0.1:10011/
|
||||
* - serverquery://127.0.0.1:10011/?server_port=9987&channel_id=1
|
||||
* - serverquery://127.0.0.1:10011/?server_port=9987&channel_id=1#no_query_clients
|
||||
* - serverquery://127.0.0.1:10011/?server_port=9987&client_name=ScP
|
||||
* - filetransfer://127.0.0.1:30011/
|
||||
* - blacklist
|
||||
* - update
|
||||
*
|
||||
* @param string $uri
|
||||
* @return TeamSpeak3_Adapter_Abstract
|
||||
* @return TeamSpeak3_Node_Abstract
|
||||
*/
|
||||
public static function factory($uri)
|
||||
{
|
||||
self::init();
|
||||
|
||||
$uri = new TeamSpeak3_Helper_Uri($uri);
|
||||
|
||||
$adapter = self::getAdapterName($uri->getScheme());
|
||||
$options = array("host" => $uri->getHost(), "port" => $uri->getPort(), "timeout" => intval($uri->getQueryVar("timeout", 10)), "blocking" => intval($uri->getQueryVar("blocking", 1)));
|
||||
|
||||
self::loadClass($adapter);
|
||||
|
||||
$object = new $adapter($options);
|
||||
|
||||
if($object instanceof TeamSpeak3_Adapter_ServerQuery)
|
||||
{
|
||||
$node = $object->getHost();
|
||||
|
||||
if($uri->hasUser() && $uri->hasPass())
|
||||
{
|
||||
$node->login($uri->getUser(), $uri->getPass());
|
||||
}
|
||||
|
||||
/* option to pre-define nickname */
|
||||
if($uri->hasQueryVar("nickname"))
|
||||
{
|
||||
$node->setPredefinedQueryName($uri->getQueryVar("nickname"));
|
||||
}
|
||||
|
||||
/* flag to use offline servers in virtual mode */
|
||||
if($uri->getFragment() == "use_offline_as_virtual")
|
||||
{
|
||||
$node->setUseOfflineAsVirtual(TRUE);
|
||||
}
|
||||
elseif($uri->hasQueryVar("use_offline_as_virtual"))
|
||||
{
|
||||
$node->setUseOfflineAsVirtual($uri->getQueryVar("use_offline_as_virtual") ? TRUE : FALSE);
|
||||
}
|
||||
|
||||
/* flag to fetch clients before sub-channels */
|
||||
if($uri->getFragment() == "clients_before_channels")
|
||||
{
|
||||
$node->setLoadClientlistFirst(TRUE);
|
||||
}
|
||||
elseif($uri->hasQueryVar("clients_before_channels"))
|
||||
{
|
||||
$node->setLoadClientlistFirst($uri->getQueryVar("clients_before_channels") ? TRUE : FALSE);
|
||||
}
|
||||
|
||||
/* flag to hide ServerQuery clients */
|
||||
if($uri->getFragment() == "no_query_clients")
|
||||
{
|
||||
$node->setExcludeQueryClients(TRUE);
|
||||
}
|
||||
elseif($uri->hasQueryVar("no_query_clients"))
|
||||
{
|
||||
$node->setExcludeQueryClients($uri->getQueryVar("no_query_clients") ? TRUE : FALSE);
|
||||
}
|
||||
|
||||
/* access server node object */
|
||||
if($uri->hasQueryVar("server_id"))
|
||||
{
|
||||
$node = $node->serverGetById($uri->getQueryVar("server_id"));
|
||||
}
|
||||
elseif($uri->hasQueryVar("server_uid"))
|
||||
{
|
||||
$node = $node->serverGetByUid($uri->getQueryVar("server_uid"));
|
||||
}
|
||||
elseif($uri->hasQueryVar("server_port"))
|
||||
{
|
||||
$node = $node->serverGetByPort($uri->getQueryVar("server_port"));
|
||||
}
|
||||
elseif($uri->hasQueryVar("server_name"))
|
||||
{
|
||||
$node = $node->serverGetByName($uri->getQueryVar("server_name"));
|
||||
}
|
||||
elseif($uri->hasQueryVar("server_tsdns"))
|
||||
{
|
||||
$node = $node->serverGetByTSDNS($uri->getQueryVar("server_tsdns"));
|
||||
}
|
||||
|
||||
/* direct access to node objects */
|
||||
if($node instanceof TeamSpeak3_Node_Server)
|
||||
{
|
||||
/* access channel node object */
|
||||
if($uri->hasQueryVar("channel_id"))
|
||||
{
|
||||
$node = $node->channelGetById($uri->getQueryVar("channel_id"));
|
||||
}
|
||||
elseif($uri->hasQueryVar("channel_name"))
|
||||
{
|
||||
$node = $node->channelGetByName($uri->getQueryVar("channel_name"));
|
||||
}
|
||||
|
||||
/* access client node object */
|
||||
if($uri->hasQueryVar("client_id"))
|
||||
{
|
||||
$node = $node->clientGetById($uri->getQueryVar("client_id"));
|
||||
}
|
||||
if($uri->hasQueryVar("client_uid"))
|
||||
{
|
||||
$node = $node->clientGetByUid($uri->getQueryVar("client_uid"));
|
||||
}
|
||||
elseif($uri->hasQueryVar("client_name"))
|
||||
{
|
||||
$node = $node->clientGetByName($uri->getQueryVar("client_name"));
|
||||
}
|
||||
}
|
||||
|
||||
return $node;
|
||||
}
|
||||
|
||||
return $object;
|
||||
}
|
||||
|
||||
/**
|
||||
* Loads a class from a PHP file. The filename must be formatted as "$class.php".
|
||||
*
|
||||
* include() is not prefixed with the @ operator because if the file is loaded and
|
||||
* contains a parse error, execution will halt silently and this is difficult to debug.
|
||||
*
|
||||
* @param string $class
|
||||
* @throws LogicException
|
||||
* @return boolean
|
||||
*/
|
||||
protected static function loadClass($class)
|
||||
{
|
||||
if(class_exists($class, FALSE) || interface_exists($class, FALSE))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if(preg_match("/[^a-z0-9\\/\\\\_.-]/i", $class))
|
||||
{
|
||||
throw new LogicException("illegal characters in classname '" . $class . "'");
|
||||
}
|
||||
|
||||
$file = self::getFilePath($class) . ".php";
|
||||
|
||||
if(!file_exists($file) || !is_readable($file))
|
||||
{
|
||||
throw new LogicException("file '" . $file . "' does not exist or is not readable");
|
||||
}
|
||||
|
||||
if(class_exists($class, FALSE) || interface_exists($class, FALSE))
|
||||
{
|
||||
throw new LogicException("class '" . $class . "' does not exist");
|
||||
}
|
||||
|
||||
return include_once($file);
|
||||
}
|
||||
|
||||
/**
|
||||
* Generates a possible file path for $name.
|
||||
*
|
||||
* @param string $name
|
||||
* @return string
|
||||
*/
|
||||
protected static function getFilePath($name)
|
||||
{
|
||||
$path = str_replace("_", DIRECTORY_SEPARATOR, $name);
|
||||
$path = str_replace(__CLASS__, dirname(__FILE__), $path);
|
||||
|
||||
return $path;
|
||||
}
|
||||
|
||||
/**
|
||||
* 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");
|
||||
}
|
||||
|
||||
/**
|
||||
* spl_autoload() suitable implementation for supporting class autoloading.
|
||||
*
|
||||
* @param string $class
|
||||
* @return boolean
|
||||
*/
|
||||
public static function autoload($class)
|
||||
{
|
||||
if(substr($class, 0, strlen(__CLASS__)) != __CLASS__) return;
|
||||
|
||||
try
|
||||
{
|
||||
self::loadClass($class);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
catch(Exception $e)
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks for required PHP features, enables autoloading and starts a default profiler.
|
||||
*
|
||||
* @throws LogicException
|
||||
* @return void
|
||||
*/
|
||||
public static function init()
|
||||
{
|
||||
if(version_compare(phpversion(), "5.2.1") == -1)
|
||||
{
|
||||
throw new LogicException("this particular software cannot be used with the installed version of PHP");
|
||||
}
|
||||
|
||||
if(!function_exists("stream_socket_client"))
|
||||
{
|
||||
throw new LogicException("network functions are not available in this PHP installation");
|
||||
}
|
||||
|
||||
if(!function_exists("spl_autoload_register"))
|
||||
{
|
||||
throw new LogicException("autoload functions are not available in this PHP installation");
|
||||
}
|
||||
|
||||
if(!class_exists("TeamSpeak3_Helper_Profiler"))
|
||||
{
|
||||
spl_autoload_register(array(__CLASS__, "autoload"));
|
||||
}
|
||||
|
||||
TeamSpeak3_Helper_Profiler::start();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns an assoc array containing all escape patterns available on a TeamSpeak 3
|
||||
* Server.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public static function getEscapePatterns()
|
||||
{
|
||||
return self::$escape_patterns;
|
||||
}
|
||||
|
||||
/**
|
||||
* Debug helper function. This is a wrapper for var_dump() that adds the pre-format tags,
|
||||
* cleans up newlines and indents, and runs htmlentities() before output.
|
||||
*
|
||||
* @param mixed $var
|
||||
* @param bool $echo
|
||||
* @return string
|
||||
*/
|
||||
public static function dump($var, $echo = TRUE)
|
||||
{
|
||||
ob_start();
|
||||
var_dump($var);
|
||||
|
||||
$output = ob_get_clean();
|
||||
$output = preg_replace("/\]\=\>\n(\s+)/m", "] => ", $output);
|
||||
|
||||
if(PHP_SAPI == "cli")
|
||||
{
|
||||
$output = PHP_EOL . PHP_EOL . $output . PHP_EOL;
|
||||
}
|
||||
else
|
||||
{
|
||||
$output = "<pre>" . htmlspecialchars($output, ENT_QUOTES) . "</pre>";
|
||||
}
|
||||
|
||||
if($echo) echo($output);
|
||||
|
||||
return $output;
|
||||
}
|
||||
}
|
||||
|
||||
/*!
|
||||
* \mainpage API Documentation
|
||||
*
|
||||
* \section welcome_sec Introduction
|
||||
*
|
||||
* \subsection welcome1 What is the TS3 PHP Framework?
|
||||
* Initially released in January 2010, the TS3 PHP Framework is a powerful, open source, object-oriented framework
|
||||
* implemented in PHP 5 and licensed under the GNU General Public License. It's based on simplicity and a rigorously
|
||||
* tested agile codebase. Extend the functionality of your servers with scripts or create powerful web applications
|
||||
* to manage all features of your TeamSpeak 3 Server instances.
|
||||
*
|
||||
* Tested. Thoroughly. Enterprise-ready and built with agile methods, the TS3 PHP Framework has been unit-tested from
|
||||
* the start to ensure that all code remains stable and easy for you to extend, re-test with your extensions, and
|
||||
* further maintain.
|
||||
*
|
||||
* \subsection welcome2 Why should I use the TS3 PHP Framework rather than other PHP libraries?
|
||||
* The TS3 PHP Framework is a is a modern use-at-will framework that provides individual components to communicate
|
||||
* with the TeamSpeak 3 Server.
|
||||
*
|
||||
* There are lots of arguments for the TS3 PHP Framework in comparison with other PHP based libraries. It is the most
|
||||
* dynamic and feature-rich piece of software in its class. In addition, it's always up-to-date and 100% compatible to
|
||||
* almost any TeamSpeak 3 Server version available.
|
||||
*
|
||||
* \section sysreqs_sec Requirements
|
||||
* The TS3 PHP Framework currently supports PHP 5.2.1 or later, but we strongly recommend the most current release of
|
||||
* PHP for critical security and performance enhancements. If you want to create a web application using the TS3 PHP
|
||||
* Framework, you need a PHP 5 interpreter with a web server configured to handle PHP scripts correctly.
|
||||
*
|
||||
* Note that the majority of TS3 PHP Framework development and deployment is done on nginx, so there is more community
|
||||
* experience and testing performed on nginx than on other web servers.
|
||||
*
|
||||
* \section feature_sec Features
|
||||
* Features of the TS3 PHP Framework include:
|
||||
*
|
||||
* - Fully object-oriented PHP 5 and E_STRICT compliant components
|
||||
* - Access to all TeamSpeak 3 Server features via ServerQuery
|
||||
* - Integrated full featured and customizable TSViewer interfaces
|
||||
* - Full support for file transfers to up- and /or download custom icons and other stuff
|
||||
* - Powerful error handling capablities using exceptions and customizable error messages
|
||||
* - Query mechanisms for several official services such as the blacklist and auto-update servers
|
||||
* - Dynamic signal slots for event based scripting
|
||||
* - ...
|
||||
*
|
||||
* \section example_sec Usage Examples
|
||||
*
|
||||
* \subsection example1 1. Kick a single Client from a Virtual Server
|
||||
* @code
|
||||
* // load framework files
|
||||
* require_once("libraries/TeamSpeak3/TeamSpeak3.php");
|
||||
*
|
||||
* // connect to local server, authenticate and spawn an object for the virtual server on port 9987
|
||||
* $ts3_VirtualServer = TeamSpeak3::factory("serverquery://username:password@127.0.0.1:10011/?server_port=9987");
|
||||
*
|
||||
* // kick the client with ID 123 from the server
|
||||
* $ts3_VirtualServer->clientKick(123, TeamSpeak3::KICK_SERVER, "evil kick XD");
|
||||
*
|
||||
* // spawn an object for the client by unique identifier and do the kick
|
||||
* $ts3_VirtualServer->clientGetByUid("FPMPSC6MXqXq751dX7BKV0JniSo=")->kick(TeamSpeak3::KICK_SERVER, "evil kick XD");
|
||||
*
|
||||
* // spawn an object for the client by current nickname and do the kick
|
||||
* $ts3_VirtualServer->clientGetByName("ScP")->kick(TeamSpeak3::KICK_SERVER, "evil kick XD");
|
||||
* @endcode
|
||||
*
|
||||
* \subsection example2 2. Kick all Clients from a Virtual Server
|
||||
* @code
|
||||
* // load framework files
|
||||
* require_once("libraries/TeamSpeak3/TeamSpeak3.php");
|
||||
*
|
||||
* // connect to local server, authenticate and spawn an object for the virtual server on port 9987
|
||||
* $ts3_VirtualServer = TeamSpeak3::factory("serverquery://username:password@127.0.0.1:10011/?server_port=9987");
|
||||
*
|
||||
* // query clientlist from virtual server
|
||||
* $arr_ClientList = $ts3_VirtualServer->clientList();
|
||||
*
|
||||
* // kick all clients online with a single command
|
||||
* $ts3_VirtualServer->clientKick($arr_ClientList, TeamSpeak3::KICK_SERVER, "evil kick XD");
|
||||
* @endcode
|
||||
*
|
||||
* \subsection example3 3. Print the Nicknames of connected Android Clients
|
||||
* @code
|
||||
* // load framework files
|
||||
* require_once("libraries/TeamSpeak3/TeamSpeak3.php");
|
||||
*
|
||||
* // connect to local server, authenticate and spawn an object for the virtual server on port 9987
|
||||
* $ts3_VirtualServer = TeamSpeak3::factory("serverquery://username:password@127.0.0.1:10011/?server_port=9987");
|
||||
*
|
||||
* // query clientlist from virtual server and filter by platform
|
||||
* $arr_ClientList = $ts3_VirtualServer->clientList(array("client_platform" => "Android"));
|
||||
*
|
||||
* // walk through list of clients
|
||||
* foreach($arr_ClientList as $ts3_Client)
|
||||
* {
|
||||
* echo $ts3_Client . " is using " . $ts3_Client["client_platform"] . "<br />\n";
|
||||
* }
|
||||
* @endcode
|
||||
*
|
||||
* \subsection example4 4. Modify the Settings of each Virtual Server
|
||||
* @code
|
||||
* // load framework files
|
||||
* require_once("libraries/TeamSpeak3/TeamSpeak3.php");
|
||||
*
|
||||
* // connect to local server, authenticate and spawn an object for the server instance
|
||||
* $ts3_ServerInstance = TeamSpeak3::factory("serverquery://username:password@127.0.0.1:10011/");
|
||||
*
|
||||
* // walk through list of virtual servers
|
||||
* foreach($ts3_ServerInstance as $ts3_VirtualServer)
|
||||
* {
|
||||
* // modify the virtual servers hostbanner URL only using the ArrayAccess interface
|
||||
* $ts3_VirtualServer["virtualserver_hostbanner_gfx_url"] = "http://www.example.com/banners/banner01_468x60.jpg";
|
||||
*
|
||||
* // modify the virtual servers hostbanner URL only using property overloading
|
||||
* $ts3_VirtualServer->virtualserver_hostbanner_gfx_url = "http://www.example.com/banners/banner01_468x60.jpg";
|
||||
*
|
||||
* // modify multiple virtual server properties at once
|
||||
* $ts3_VirtualServer->modify(array(
|
||||
* "virtualserver_hostbutton_tooltip" => "My Company",
|
||||
* "virtualserver_hostbutton_url" => "http://www.example.com",
|
||||
* "virtualserver_hostbutton_gfx_url" => "http://www.example.com/buttons/button01_24x24.jpg",
|
||||
* ));
|
||||
* }
|
||||
* @endcode
|
||||
*
|
||||
* \subsection example5 5. Create a Privilege Key for a Server Group
|
||||
* @code
|
||||
* // load framework files
|
||||
* require_once("libraries/TeamSpeak3/TeamSpeak3.php");
|
||||
*
|
||||
* // connect to local server, authenticate and spawn an object for the virtual server on port 9987
|
||||
* $ts3_VirtualServer = TeamSpeak3::factory("serverquery://username:password@127.0.0.1:10011/?server_port=9987");
|
||||
*
|
||||
* // spawn an object for the group using a specified name
|
||||
* $arr_ServerGroup = $ts3_VirtualServer->serverGroupGetByName("Admins");
|
||||
*
|
||||
* // create the privilege key
|
||||
* $ts3_PrivilegeKey = $arr_ServerGroup->privilegeKeyCreate();
|
||||
* @endcode
|
||||
*
|
||||
* \subsection example6 6. Modify the Permissions of Admins on each Virtual Server
|
||||
* @code
|
||||
* // load framework files
|
||||
* require_once("libraries/TeamSpeak3/TeamSpeak3.php");
|
||||
*
|
||||
* // connect to local server, authenticate and spawn an object for the server instance
|
||||
* $ts3_ServerInstance = TeamSpeak3::factory("serverquery://username:password@127.0.0.1:10011/");
|
||||
*
|
||||
* // walk through list of virtual servers
|
||||
* foreach($ts3_ServerInstance as $ts3_VirtualServer)
|
||||
* {
|
||||
* // identify the most powerful group on the virtual server
|
||||
* $ts3_ServerGroup = $ts3_VirtualServer->serverGroupIdentify();
|
||||
*
|
||||
* // assign a new permission
|
||||
* $ts3_ServerGroup->permAssign("b_virtualserver_modify_hostbanner", TRUE);
|
||||
*
|
||||
* // revoke an existing permission
|
||||
* $ts3_ServerGroup->permRemove("b_virtualserver_modify_maxclients");
|
||||
* }
|
||||
* @endcode
|
||||
*
|
||||
* \subsection example7 7. Create a new Virtual Server
|
||||
* @code
|
||||
* // load framework files
|
||||
* require_once("libraries/TeamSpeak3/TeamSpeak3.php");
|
||||
*
|
||||
* // connect to local server, authenticate and spawn an object for the server instance
|
||||
* $ts3_ServerInstance = TeamSpeak3::factory("serverquery://username:password@127.0.0.1:10011/");
|
||||
*
|
||||
* // create a virtual server and get its ID
|
||||
* $new_sid = $ts3_ServerInstance->serverCreate(array(
|
||||
* "virtualserver_name" => "My TeamSpeak 3 Server",
|
||||
* "virtualserver_maxclients" => 64,
|
||||
* "virtualserver_hostbutton_tooltip" => "My Company",
|
||||
* "virtualserver_hostbutton_url" => "http://www.example.com",
|
||||
* "virtualserver_hostbutton_gfx_url" => "http://www.example.com/buttons/button01_24x24.jpg",
|
||||
* ));
|
||||
* @endcode
|
||||
*
|
||||
* \subsection example8 8. Create a hierarchical Channel Stucture
|
||||
* @code
|
||||
* // load framework files
|
||||
* require_once("libraries/TeamSpeak3/TeamSpeak3.php");
|
||||
*
|
||||
* // connect to local server, authenticate and spawn an object for the virtual server on port 9987
|
||||
* $ts3_VirtualServer = TeamSpeak3::factory("serverquery://username:password@127.0.0.1:10011/?server_port=9987");
|
||||
*
|
||||
* // create a top-level channel and get its ID
|
||||
* $top_cid = $ts3_VirtualServer->channelCreate(array(
|
||||
* "channel_name" => "My Channel",
|
||||
* "channel_topic" => "This is a top-level channel",
|
||||
* "channel_codec" => TeamSpeak3::CODEC_SPEEX_WIDEBAND,
|
||||
* "channel_flag_permanent" => TRUE,
|
||||
* ));
|
||||
*
|
||||
* // create a sub-level channel and get its ID
|
||||
* $sub_cid = $ts3_VirtualServer->channelCreate(array(
|
||||
* "channel_name" => "My Sub-Channel",
|
||||
* "channel_topic" => "This is a sub-level channel",
|
||||
* "channel_codec" => TeamSpeak3::CODEC_SPEEX_NARROWBAND,
|
||||
* "channel_flag_permanent" => TRUE,
|
||||
* "cpid" => $top_cid,
|
||||
* ));
|
||||
* @endcode
|
||||
*
|
||||
* \subsection example9 9. Send a Text Message to outdated Clients
|
||||
* @code
|
||||
* // load framework files
|
||||
* require_once("libraries/TeamSpeak3/TeamSpeak3.php");
|
||||
*
|
||||
* // connect to local server, authenticate and spawn an object for the virtual server on port 9987
|
||||
* $ts3_VirtualServer = TeamSpeak3::factory("serverquery://username:password@127.0.0.1:10011/?server_port=9987");
|
||||
*
|
||||
* // connect to default update server
|
||||
* $ts3_UpdateServer = TeamSpeak3::factory("update");
|
||||
*
|
||||
* // walk through list of clients on virtual server
|
||||
* foreach($ts3_VirtualServer->clientList() as $ts3_Client)
|
||||
* {
|
||||
* // skip query clients
|
||||
* if($ts3_Client["client_type"]) continue;
|
||||
*
|
||||
* // send test message if client build is outdated
|
||||
* if($ts3_Client->getRev() < $ts3_UpdateServer->getClientRev())
|
||||
* {
|
||||
* $ts3_Client->message("[COLOR=red]your client is [B]outdated[/B]... update to [U]" . $ts3_UpdateServer->getClientVersion() . "[/U] now![/COLOR]");
|
||||
* }
|
||||
* }
|
||||
* @endcode
|
||||
*
|
||||
* \subsection example10 10. Check if the Server Instance is Outdated or Blacklisted
|
||||
* @code
|
||||
* // load framework files
|
||||
* require_once("libraries/TeamSpeak3/TeamSpeak3.php");
|
||||
*
|
||||
* // connect to local server, authenticate and spawn an object for the server instance
|
||||
* $ts3_ServerInstance = TeamSpeak3::factory("serverquery://username:password@127.0.0.1:10011/");
|
||||
*
|
||||
* // connect to default update server
|
||||
* $ts3_UpdateServer = TeamSpeak3::factory("update");
|
||||
*
|
||||
* // send global text message if the server is outdated
|
||||
* if($ts3_ServerInstance->version("build") < $ts3_UpdateServer->getServerRev())
|
||||
* {
|
||||
* $ts3_ServerInstance->message("[COLOR=red]your server is [B]outdated[/B]... update to [U]" . $ts3_UpdateServer->getServerVersion() . "[/U] now![/COLOR]");
|
||||
* }
|
||||
*
|
||||
* // connect to default blacklist server
|
||||
* $ts3_BlacklistServer = TeamSpeak3::factory("blacklist");
|
||||
*
|
||||
* // send global text message if the server is blacklisted
|
||||
* if($ts3_BlacklistServer->isBlacklisted($ts3_ServerInstance))
|
||||
* {
|
||||
* $ts3_ServerInstance->message("[COLOR=red]your server is [B]blacklisted[/B]... disconnect now![/COLOR]");
|
||||
* }
|
||||
* @endcode
|
||||
*
|
||||
* \subsection example11 11. Create a simple TSViewer for your Website
|
||||
* @code
|
||||
* // load framework files
|
||||
* require_once("libraries/TeamSpeak3/TeamSpeak3.php");
|
||||
*
|
||||
* // connect to local server, authenticate and spawn an object for the virtual server on port 9987
|
||||
* $ts3_VirtualServer = TeamSpeak3::factory("serverquery://username:password@127.0.0.1:10011/?server_port=9987");
|
||||
*
|
||||
* // build and display HTML treeview using custom image paths (remote icons will be embedded using data URI sheme)
|
||||
* echo $ts3_VirtualServer->getViewer(new TeamSpeak3_Viewer_Html("images/viewericons/", "images/countryflags/", "data:image"));
|
||||
* @endcode
|
||||
*
|
||||
* \subsection example12 12. Update all outdated Audio Codecs to their Opus equivalent
|
||||
* @code
|
||||
* // load framework files
|
||||
* require_once("libraries/TeamSpeak3/TeamSpeak3.php");
|
||||
*
|
||||
* // connect to local server, authenticate and spawn an object for the virtual server on port 9987
|
||||
* $ts3_VirtualServer = TeamSpeak3::factory("serverquery://username:password@127.0.0.1:10011/?server_port=9987");
|
||||
*
|
||||
* // walk through list of chanels
|
||||
* foreach($ts3_VirtualServer->channelList() as $ts3_Channel)
|
||||
* {
|
||||
* if($ts3_Channel["channel_codec"] == TeamSpeak3::CODEC_CELT_MONO)
|
||||
* {
|
||||
* $ts3_Channel["channel_codec"] = TeamSpeak3::CODEC_OPUS_MUSIC;
|
||||
* }
|
||||
* elseif($ts3_Channel["channel_codec"] != TeamSpeak3::CODEC_OPUS_MUSIC)
|
||||
* {
|
||||
* $ts3_Channel["channel_codec"] = TeamSpeak3::CODEC_OPUS_VOICE;
|
||||
* }
|
||||
* }
|
||||
* @endcode
|
||||
*
|
||||
* \subsection example13 13. Display the Avatar of a connected User
|
||||
* @code
|
||||
* // load framework files
|
||||
* require_once("libraries/TeamSpeak3/TeamSpeak3.php");
|
||||
*
|
||||
* // connect to local server, authenticate and spawn an object for the virtual server on port 9987
|
||||
* $ts3_VirtualServer = TeamSpeak3::factory("serverquery://username:password@127.0.0.1:10011/?server_port=9987");
|
||||
*
|
||||
* // spawn an object for the client using a specified nickname
|
||||
* $ts3_Client = $ts3_VirtualServer->clientGetByName("John Doe");
|
||||
*
|
||||
* // download the clients avatar file
|
||||
* $avatar = $ts3_Client->avatarDownload();
|
||||
*
|
||||
* // send header and display image
|
||||
* header("Content-Type: " . TeamSpeak3_Helper_Convert::imageMimeType($avatar));
|
||||
* echo $avatar;
|
||||
* @endcode
|
||||
*
|
||||
* \subsection example14 14. Create a Simple Bot waiting for Events
|
||||
* @code
|
||||
* // load framework files
|
||||
* require_once("libraries/TeamSpeak3/TeamSpeak3.php");
|
||||
*
|
||||
* // connect to local server in non-blocking mode, authenticate and spawn an object for the virtual server on port 9987
|
||||
* $ts3_VirtualServer = TeamSpeak3::factory("serverquery://username:password@127.0.0.1:10011/?server_port=9987&blocking=0");
|
||||
*
|
||||
* // get notified on incoming private messages
|
||||
* $ts3_VirtualServer->notifyRegister("textprivate");
|
||||
*
|
||||
* // register a callback for notifyTextmessage events
|
||||
* TeamSpeak3_Helper_Signal::getInstance()->subscribe("notifyTextmessage", "onTextmessage");
|
||||
*
|
||||
* // wait for events
|
||||
* while(1) $ts3_VirtualServer->getAdapter()->wait();
|
||||
*
|
||||
* // define a callback function
|
||||
* function onTextmessage(TeamSpeak3_Adapter_ServerQuery_Event $event, TeamSpeak3_Node_Host $host)
|
||||
* {
|
||||
* echo "Client " . $event["invokername"] . " sent textmessage: " . $event["msg"];
|
||||
* }
|
||||
* @endcode
|
||||
*
|
||||
* \subsection example15 15. Handle Errors using Exceptions and Custom Error Messages
|
||||
* @code
|
||||
* // load framework files
|
||||
* require_once("libraries/TeamSpeak3/TeamSpeak3.php");
|
||||
*
|
||||
* // register custom error message (supported placeholders are: %file, %line, %code and %mesg)
|
||||
* TeamSpeak3_Exception::registerCustomMessage(0x300, "The specified channel does not exist; server said: %mesg");
|
||||
*
|
||||
* try
|
||||
* {
|
||||
* // connect to local server, authenticate and spawn an object for the virtual server on port 9987
|
||||
* $ts3_VirtualServer = TeamSpeak3::factory("serverquery://username:password@127.0.0.1:10011/?server_port=9987");
|
||||
*
|
||||
* // spawn an object for the channel using a specified name
|
||||
* $ts3_Channel = $ts3_VirtualServer->channelGetByName("I do not exist");
|
||||
* }
|
||||
* catch(TeamSpeak3_Exception $e)
|
||||
* {
|
||||
* // print the error message returned by the server
|
||||
* echo "Error " . $e->getCode() . ": " . $e->getMessage();
|
||||
* }
|
||||
* @endcode
|
||||
*
|
||||
* \subsection example16 16. Save Connection State in Persistent Session Variable
|
||||
* @code
|
||||
* // load framework files
|
||||
* require_once("libraries/TeamSpeak3/TeamSpeak3.php");
|
||||
*
|
||||
* // start a PHP session
|
||||
* session_start();
|
||||
*
|
||||
* // connect to local server, authenticate and spawn an object for the virtual server on port 9987
|
||||
* $ts3_VirtualServer = TeamSpeak3::factory("serverquery://username:password@127.0.0.1:10011/?server_port=9987");
|
||||
*
|
||||
* // save connection state (including login and selected virtual server)
|
||||
* $_SESSION["_TS3"] = serialize($ts3_VirtualServer);
|
||||
* @endcode
|
||||
*
|
||||
* \subsection example17 17. Restore Connection State from Persistent Session Variable
|
||||
* @code
|
||||
* // load framework files
|
||||
* require_once("libraries/TeamSpeak3/TeamSpeak3.php");
|
||||
*
|
||||
* // start a PHP session
|
||||
* session_start();
|
||||
*
|
||||
* // restore connection state
|
||||
* $ts3_VirtualServer = unserialize($_SESSION["_TS3"]);
|
||||
*
|
||||
* // send a text message to the server
|
||||
* $ts3_VirtualServer->message("Hello World!");
|
||||
* @endcode
|
||||
*
|
||||
* Speed up new development and reduce maintenance costs by using the TS3 PHP Framework!
|
||||
*/
|
||||
268
ts3_lib/Transport/Abstract.php
Normal file
268
ts3_lib/Transport/Abstract.php
Normal file
@@ -0,0 +1,268 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @file
|
||||
* TeamSpeak 3 PHP Framework
|
||||
*
|
||||
* $Id: Abstract.php 10/11/2013 11:35:22 scp@orilla $
|
||||
*
|
||||
* 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
|
||||
* @version 1.1.23
|
||||
* @author Sven 'ScP' Paulsen
|
||||
* @copyright Copyright (c) 2010 by Planet TeamSpeak. All rights reserved.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @class TeamSpeak3_Transport_Abstract
|
||||
* @brief Abstract class for connecting to a TeamSpeak 3 Server through different ways of transport.
|
||||
*/
|
||||
abstract class TeamSpeak3_Transport_Abstract
|
||||
{
|
||||
/**
|
||||
* Stores user-provided configuration settings.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $config = null;
|
||||
|
||||
/**
|
||||
* Stores the stream resource of the connection.
|
||||
*
|
||||
* @var resource
|
||||
*/
|
||||
protected $stream = null;
|
||||
|
||||
/**
|
||||
* Stores the TeamSpeak3_Adapter_Abstract object using this transport.
|
||||
*
|
||||
* @var TeamSpeak3_Adapter_Abstract
|
||||
*/
|
||||
protected $adapter = null;
|
||||
|
||||
/**
|
||||
* The TeamSpeak3_Transport_Abstract constructor.
|
||||
*
|
||||
* @param array $config
|
||||
* @throws TeamSpeak3_Transport_Exception
|
||||
* @return TeamSpeak3_Transport_Abstract
|
||||
*/
|
||||
public function __construct(array $config)
|
||||
{
|
||||
if(!array_key_exists("host", $config))
|
||||
{
|
||||
throw new TeamSpeak3_Transport_Exception("config must have a key for 'host' which specifies the server host name");
|
||||
}
|
||||
|
||||
if(!array_key_exists("port", $config))
|
||||
{
|
||||
throw new TeamSpeak3_Transport_Exception("config must have a key for 'port' which specifies the server port number");
|
||||
}
|
||||
|
||||
if(!array_key_exists("timeout", $config))
|
||||
{
|
||||
$config["timeout"] = 10;
|
||||
}
|
||||
|
||||
if(!array_key_exists("blocking", $config))
|
||||
{
|
||||
$config["blocking"] = 1;
|
||||
}
|
||||
|
||||
$this->config = $config;
|
||||
}
|
||||
|
||||
/**
|
||||
* Commit pending data.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function __sleep()
|
||||
{
|
||||
return array("config");
|
||||
}
|
||||
|
||||
/**
|
||||
* Reconnects to the remote server.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function __wakeup()
|
||||
{
|
||||
$this->connect();
|
||||
}
|
||||
|
||||
/**
|
||||
* The TeamSpeak3_Transport_Abstract destructor.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function __destruct()
|
||||
{
|
||||
if($this->adapter instanceof TeamSpeak3_Adapter_Abstract)
|
||||
{
|
||||
$this->adapter->__destruct();
|
||||
}
|
||||
|
||||
$this->disconnect();
|
||||
}
|
||||
|
||||
/**
|
||||
* Connects to a remote server.
|
||||
*
|
||||
* @throws TeamSpeak3_Transport_Exception
|
||||
* @return void
|
||||
*/
|
||||
abstract public function connect();
|
||||
|
||||
/**
|
||||
* Disconnects from a remote server.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
abstract public function disconnect();
|
||||
|
||||
/**
|
||||
* Reads data from the stream.
|
||||
*
|
||||
* @param integer $length
|
||||
* @throws TeamSpeak3_Transport_Exception
|
||||
* @return TeamSpeak3_Helper_String
|
||||
*/
|
||||
abstract public function read($length = 4096);
|
||||
|
||||
/**
|
||||
* Writes data to the stream.
|
||||
*
|
||||
* @param string $data
|
||||
* @return void
|
||||
*/
|
||||
abstract public function send($data);
|
||||
|
||||
/**
|
||||
* Returns the underlying stream resource.
|
||||
*
|
||||
* @return resource
|
||||
*/
|
||||
public function getStream()
|
||||
{
|
||||
return $this->stream;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the configuration variables in this adapter.
|
||||
*
|
||||
* @param string $key
|
||||
* @param mixed $default
|
||||
* @return array
|
||||
*/
|
||||
public function getConfig($key = null, $default = null)
|
||||
{
|
||||
if($key !== null)
|
||||
{
|
||||
return array_key_exists($key, $this->config) ? $this->config[$key] : $default;
|
||||
}
|
||||
|
||||
return $this->config;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the TeamSpeak3_Adapter_Abstract object using this transport.
|
||||
*
|
||||
* @param TeamSpeak3_Adapter_Abstract $adapter
|
||||
* @return void
|
||||
*/
|
||||
public function setAdapter(TeamSpeak3_Adapter_Abstract $adapter)
|
||||
{
|
||||
$this->adapter = $adapter;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the TeamSpeak3_Adapter_Abstract object using this transport.
|
||||
*
|
||||
* @return TeamSpeak3_Adapter_Abstract
|
||||
*/
|
||||
public function getAdapter()
|
||||
{
|
||||
return $this->adapter;
|
||||
}
|
||||
|
||||
/**
|
||||
* 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";
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns header/meta data from stream pointer.
|
||||
*
|
||||
* @throws TeamSpeak3_Transport_Exception
|
||||
* @return array
|
||||
*/
|
||||
public function getMetaData()
|
||||
{
|
||||
if($this->stream === null)
|
||||
{
|
||||
throw new TeamSpeak3_Transport_Exception("unable to retrieve header/meta data from stream pointer");
|
||||
}
|
||||
|
||||
return stream_get_meta_data($this->stream);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns TRUE if the transport is connected.
|
||||
*
|
||||
* @return boolean
|
||||
*/
|
||||
public function isConnected()
|
||||
{
|
||||
return (is_resource($this->stream)) ? TRUE : FALSE;
|
||||
}
|
||||
|
||||
/**
|
||||
* Blocks a stream until data is available for reading if the stream is connected
|
||||
* in non-blocking mode.
|
||||
*
|
||||
* @param integer $time
|
||||
* @return void
|
||||
*/
|
||||
protected function waitForReadyRead($time = 0)
|
||||
{
|
||||
if(!$this->isConnected() || $this->config["blocking"]) return;
|
||||
|
||||
do {
|
||||
$read = array($this->stream);
|
||||
$null = null;
|
||||
|
||||
if($time)
|
||||
{
|
||||
TeamSpeak3_Helper_Signal::getInstance()->emit(strtolower($this->getAdapterType()) . "WaitTimeout", $time, $this->getAdapter());
|
||||
}
|
||||
|
||||
$time = $time+$this->config["timeout"];
|
||||
} while(@stream_select($read, $null, $null, $this->config["timeout"]) == 0);
|
||||
}
|
||||
}
|
||||
32
ts3_lib/Transport/Exception.php
Normal file
32
ts3_lib/Transport/Exception.php
Normal file
@@ -0,0 +1,32 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @file
|
||||
* TeamSpeak 3 PHP Framework
|
||||
*
|
||||
* $Id: Exception.php 10/11/2013 11:35:22 scp@orilla $
|
||||
*
|
||||
* 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
|
||||
* @version 1.1.23
|
||||
* @author Sven 'ScP' Paulsen
|
||||
* @copyright Copyright (c) 2010 by Planet TeamSpeak. All rights reserved.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @class TeamSpeak3_Transport_Exception
|
||||
* @brief Enhanced exception class for TeamSpeak3_Transport_Abstract objects.
|
||||
*/
|
||||
class TeamSpeak3_Transport_Exception extends TeamSpeak3_Exception {}
|
||||
179
ts3_lib/Transport/TCP.php
Normal file
179
ts3_lib/Transport/TCP.php
Normal file
@@ -0,0 +1,179 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @file
|
||||
* TeamSpeak 3 PHP Framework
|
||||
*
|
||||
* $Id: TCP.php 10/11/2013 11:35:22 scp@orilla $
|
||||
*
|
||||
* 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
|
||||
* @version 1.1.23
|
||||
* @author Sven 'ScP' Paulsen
|
||||
* @copyright Copyright (c) 2010 by Planet TeamSpeak. All rights reserved.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @class TeamSpeak3_Transport_TCP
|
||||
* @brief Class for connecting to a remote server through TCP.
|
||||
*/
|
||||
class TeamSpeak3_Transport_TCP extends TeamSpeak3_Transport_Abstract
|
||||
{
|
||||
/**
|
||||
* 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 = "tcp://" . $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);
|
||||
}
|
||||
|
||||
/**
|
||||
* Disconnects from a remote server.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function disconnect()
|
||||
{
|
||||
if($this->stream === null) return;
|
||||
|
||||
$this->stream = null;
|
||||
|
||||
TeamSpeak3_Helper_Signal::getInstance()->emit(strtolower($this->getAdapterType()) . "Disconnected");
|
||||
}
|
||||
|
||||
/**
|
||||
* Reads data from the stream.
|
||||
*
|
||||
* @param integer $length
|
||||
* @throws TeamSpeak3_Transport_Exception
|
||||
* @return TeamSpeak3_Helper_String
|
||||
*/
|
||||
public function read($length = 4096)
|
||||
{
|
||||
$this->connect();
|
||||
$this->waitForReadyRead();
|
||||
|
||||
$data = @stream_get_contents($this->stream, $length);
|
||||
|
||||
TeamSpeak3_Helper_Signal::getInstance()->emit(strtolower($this->getAdapterType()) . "DataRead", $data);
|
||||
|
||||
if($data === FALSE)
|
||||
{
|
||||
throw new TeamSpeak3_Transport_Exception("connection to server '" . $this->config["host"] . ":" . $this->config["port"] . "' lost");
|
||||
}
|
||||
|
||||
return new TeamSpeak3_Helper_String($data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 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();
|
||||
}
|
||||
|
||||
/**
|
||||
* Writes data to the stream.
|
||||
*
|
||||
* @param string $data
|
||||
* @return void
|
||||
*/
|
||||
public function send($data)
|
||||
{
|
||||
$this->connect();
|
||||
|
||||
@stream_socket_sendto($this->stream, $data);
|
||||
|
||||
TeamSpeak3_Helper_Signal::getInstance()->emit(strtolower($this->getAdapterType()) . "DataSend", $data);
|
||||
}
|
||||
|
||||
/**
|
||||
* Writes a line of data to the stream.
|
||||
*
|
||||
* @param string $data
|
||||
* @param string $separator
|
||||
* @return void
|
||||
*/
|
||||
public function sendLine($data, $separator = "\n")
|
||||
{
|
||||
$size = strlen($data);
|
||||
$pack = 4096;
|
||||
|
||||
for($seek = 0 ;$seek < $size;)
|
||||
{
|
||||
$rest = $size-$seek;
|
||||
$pack = $rest < $pack ? $rest : $pack;
|
||||
$buff = substr($data, $seek, $pack);
|
||||
$seek = $seek+$pack;
|
||||
|
||||
if($seek >= $size) $buff .= $separator;
|
||||
|
||||
$this->send($buff);
|
||||
}
|
||||
}
|
||||
}
|
||||
113
ts3_lib/Transport/UDP.php
Normal file
113
ts3_lib/Transport/UDP.php
Normal file
@@ -0,0 +1,113 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @file
|
||||
* TeamSpeak 3 PHP Framework
|
||||
*
|
||||
* $Id: UDP.php 10/11/2013 11:35:22 scp@orilla $
|
||||
*
|
||||
* 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
|
||||
* @version 1.1.23
|
||||
* @author Sven 'ScP' Paulsen
|
||||
* @copyright Copyright (c) 2010 by Planet TeamSpeak. All rights reserved.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @class TeamSpeak3_Transport_UDP
|
||||
* @brief Class for connecting to a remote server through UDP.
|
||||
*/
|
||||
class TeamSpeak3_Transport_UDP extends TeamSpeak3_Transport_Abstract
|
||||
{
|
||||
/**
|
||||
* 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);
|
||||
}
|
||||
|
||||
/**
|
||||
* Disconnects from a remote server.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function disconnect()
|
||||
{
|
||||
if($this->stream === null) return;
|
||||
|
||||
$this->stream = null;
|
||||
|
||||
TeamSpeak3_Helper_Signal::getInstance()->emit(strtolower($this->getAdapterType()) . "Disconnected");
|
||||
}
|
||||
|
||||
/**
|
||||
* Reads data from the stream.
|
||||
*
|
||||
* @param integer $length
|
||||
* @throws TeamSpeak3_Transport_Exception
|
||||
* @return TeamSpeak3_Helper_String
|
||||
*/
|
||||
public function read($length = 4096)
|
||||
{
|
||||
$this->connect();
|
||||
$this->waitForReadyRead();
|
||||
|
||||
$data = @fread($this->stream, $length);
|
||||
|
||||
TeamSpeak3_Helper_Signal::getInstance()->emit(strtolower($this->getAdapterType()) . "DataRead", $data);
|
||||
|
||||
if($data === FALSE)
|
||||
{
|
||||
throw new TeamSpeak3_Transport_Exception("connection to server '" . $this->config["host"] . ":" . $this->config["port"] . "' lost");
|
||||
}
|
||||
|
||||
return new TeamSpeak3_Helper_String($data);
|
||||
}
|
||||
|
||||
/**
|
||||
* Writes data to the stream.
|
||||
*
|
||||
* @param string $data
|
||||
* @return void
|
||||
*/
|
||||
public function send($data)
|
||||
{
|
||||
$this->connect();
|
||||
|
||||
@stream_socket_sendto($this->stream, $data);
|
||||
|
||||
TeamSpeak3_Helper_Signal::getInstance()->emit(strtolower($this->getAdapterType()) . "DataSend", $data);
|
||||
}
|
||||
}
|
||||
670
ts3_lib/Viewer/Html.php
Normal file
670
ts3_lib/Viewer/Html.php
Normal file
@@ -0,0 +1,670 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @file
|
||||
* TeamSpeak 3 PHP Framework
|
||||
*
|
||||
* $Id: Text.php 10/11/2013 11:35:22 scp@orilla $
|
||||
*
|
||||
* 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
|
||||
* @version 1.1.23
|
||||
* @author Sven 'ScP' Paulsen
|
||||
* @copyright Copyright (c) 2010 by Planet TeamSpeak. All rights reserved.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @class TeamSpeak3_Viewer_Html
|
||||
* @brief Renders nodes used in HTML-based TeamSpeak 3 viewers.
|
||||
*/
|
||||
class TeamSpeak3_Viewer_Html implements TeamSpeak3_Viewer_Interface
|
||||
{
|
||||
/**
|
||||
* A pre-defined pattern used to display a node in a TeamSpeak 3 viewer.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $pattern = "<table id='%0' class='%1' summary='%2'><tr class='%3'><td class='%4'>%5</td><td class='%6' title='%7'>%8 %9</td><td class='%10'>%11%12</td></tr></table>\n";
|
||||
|
||||
/**
|
||||
* The TeamSpeak3_Node_Abstract object which is currently processed.
|
||||
*
|
||||
* @var TeamSpeak3_Node_Abstract
|
||||
*/
|
||||
protected $currObj = null;
|
||||
|
||||
/**
|
||||
* An array filled with siblingsfor the TeamSpeak3_Node_Abstract object which is currently
|
||||
* processed.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $currSib = null;
|
||||
|
||||
/**
|
||||
* An internal counter indicating the number of fetched TeamSpeak3_Node_Abstract objects.
|
||||
*
|
||||
* @var integer
|
||||
*/
|
||||
protected $currNum = 0;
|
||||
|
||||
/**
|
||||
* The relative URI path where the images used by the viewer can be found.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $iconpath = null;
|
||||
|
||||
/**
|
||||
* The relative URI path where the country flag icons used by the viewer can be found.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $flagpath = null;
|
||||
|
||||
/**
|
||||
* The relative path of the file transter client script on the server.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $ftclient = null;
|
||||
|
||||
/**
|
||||
* Stores an array of local icon IDs.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $cachedIcons = array(100, 200, 300, 400, 500, 600);
|
||||
|
||||
/**
|
||||
* Stores an array of remote icon IDs.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $remoteIcons = array();
|
||||
|
||||
/**
|
||||
* The TeamSpeak3_Viewer_Html constructor.
|
||||
*
|
||||
* @param string $iconpath
|
||||
* @param string $flagpath
|
||||
* @param string $ftclient
|
||||
* @param string $pattern
|
||||
* @return void
|
||||
*/
|
||||
public function __construct($iconpath = "images/viewer/", $flagpath = null, $ftclient = null, $pattern = null)
|
||||
{
|
||||
$this->iconpath = $iconpath;
|
||||
$this->flagpath = $flagpath;
|
||||
$this->ftclient = $ftclient;
|
||||
|
||||
if($pattern)
|
||||
{
|
||||
$this->pattern = $pattern;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 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);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a unique identifier for the current node which can be used as a HTML id
|
||||
* property.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
protected function getContainerIdent()
|
||||
{
|
||||
return $this->currObj->getUniqueId();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a dynamic string for the current container element which can be used as
|
||||
* a HTML class property.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
protected function getContainerClass()
|
||||
{
|
||||
return "ts3_viewer " . $this->currObj->getClass(null);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the ID of the current node which will be used as a summary element for
|
||||
* the container element.
|
||||
*
|
||||
* @return integer
|
||||
*/
|
||||
protected function getContainerSummary()
|
||||
{
|
||||
return $this->currObj->getId();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a dynamic string for the current row element which can be used as a HTML
|
||||
* class property.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
protected function getRowClass()
|
||||
{
|
||||
return ++$this->currNum%2 ? "row1" : "row2";
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a string for the current prefix element which can be used as a HTML class
|
||||
* property.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
protected function getPrefixClass()
|
||||
{
|
||||
return "prefix " . $this->currObj->getClass(null);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the HTML img tags to display the prefix of the current node.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
protected function getPrefix()
|
||||
{
|
||||
$prefix = "";
|
||||
|
||||
if(count($this->currSib))
|
||||
{
|
||||
$last = array_pop($this->currSib);
|
||||
|
||||
foreach($this->currSib as $sibling)
|
||||
{
|
||||
$prefix .= ($sibling) ? $this->getImage("tree_line.gif") : $this->getImage("tree_blank.png");
|
||||
}
|
||||
|
||||
$prefix .= ($last) ? $this->getImage("tree_end.gif") : $this->getImage("tree_mid.gif");
|
||||
}
|
||||
|
||||
return $prefix;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a string for the current corpus element which can be used as a HTML class
|
||||
* property. If the current node is a channel spacer the class string will contain
|
||||
* additional class names to allow further customization of the content via CSS.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
protected function getCorpusClass()
|
||||
{
|
||||
$extras = "";
|
||||
|
||||
if($this->currObj instanceof TeamSpeak3_Node_Channel && $this->currObj->isSpacer())
|
||||
{
|
||||
switch($this->currObj->spacerGetType())
|
||||
{
|
||||
case (string) TeamSpeak3::SPACER_SOLIDLINE:
|
||||
$extras .= " solidline";
|
||||
break;
|
||||
|
||||
case (string) TeamSpeak3::SPACER_DASHLINE:
|
||||
$extras .= " dashline";
|
||||
break;
|
||||
|
||||
case (string) TeamSpeak3::SPACER_DASHDOTLINE:
|
||||
$extras .= " dashdotline";
|
||||
break;
|
||||
|
||||
case (string) TeamSpeak3::SPACER_DASHDOTDOTLINE:
|
||||
$extras .= " dashdotdotline";
|
||||
break;
|
||||
|
||||
case (string) TeamSpeak3::SPACER_DOTLINE:
|
||||
$extras .= " dotline";
|
||||
break;
|
||||
}
|
||||
|
||||
switch($this->currObj->spacerGetAlign())
|
||||
{
|
||||
case TeamSpeak3::SPACER_ALIGN_CENTER:
|
||||
$extras .= " center";
|
||||
break;
|
||||
|
||||
case TeamSpeak3::SPACER_ALIGN_RIGHT:
|
||||
$extras .= " right";
|
||||
break;
|
||||
|
||||
case TeamSpeak3::SPACER_ALIGN_LEFT:
|
||||
$extras .= " left";
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return "corpus " . $this->currObj->getClass(null) . $extras;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the HTML img tags which can be used to display the various icons for a
|
||||
* TeamSpeak_Node_Abstract object.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
protected function getCorpusTitle()
|
||||
{
|
||||
if($this->currObj instanceof TeamSpeak3_Node_Server)
|
||||
{
|
||||
return "ID: " . $this->currObj->getId() . " | Clients: " . $this->currObj->clientCount() . "/" . $this->currObj["virtualserver_maxclients"] . " | Uptime: " . TeamSpeak3_Helper_Convert::seconds($this->currObj["virtualserver_uptime"]);
|
||||
}
|
||||
elseif($this->currObj instanceof TeamSpeak3_Node_Channel && !$this->currObj->isSpacer())
|
||||
{
|
||||
return "ID: " . $this->currObj->getId() . " | Codec: " . TeamSpeak3_Helper_Convert::codec($this->currObj["channel_codec"]) . " | Quality: " . $this->currObj["channel_codec_quality"];
|
||||
}
|
||||
elseif($this->currObj instanceof TeamSpeak3_Node_Client)
|
||||
{
|
||||
return "ID: " . $this->currObj->getId() . " | Version: " . TeamSpeak3_Helper_Convert::versionShort($this->currObj["client_version"]) . " | Platform: " . $this->currObj["client_platform"];
|
||||
}
|
||||
elseif($this->currObj instanceof TeamSpeak3_Node_Servergroup || $this->currObj instanceof TeamSpeak3_Node_Channelgroup)
|
||||
{
|
||||
return "ID: " . $this->currObj->getId() . " | Type: " . TeamSpeak3_Helper_Convert::groupType($this->currObj["type"]) . " (" . ($this->currObj["savedb"] ? "Permanent" : "Temporary") . ")";
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a HTML img tag which can be used to display the status icon for a
|
||||
* TeamSpeak_Node_Abstract object.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
protected function getCorpusIcon()
|
||||
{
|
||||
if($this->currObj instanceof TeamSpeak3_Node_Channel && $this->currObj->isSpacer()) return;
|
||||
|
||||
return $this->getImage($this->currObj->getIcon() . ".png");
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a string for the current corpus element which contains the display name
|
||||
* for the current TeamSpeak_Node_Abstract object.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
protected function getCorpusName()
|
||||
{
|
||||
if($this->currObj instanceof TeamSpeak3_Node_Channel && $this->currObj->isSpacer())
|
||||
{
|
||||
if($this->currObj->spacerGetType() != TeamSpeak3::SPACER_CUSTOM) return;
|
||||
|
||||
$string = $this->currObj["channel_name"]->section("]", 1, 99);
|
||||
|
||||
if($this->currObj->spacerGetAlign() == TeamSpeak3::SPACER_ALIGN_REPEAT)
|
||||
{
|
||||
$string->resize(30, $string);
|
||||
}
|
||||
|
||||
return htmlspecialchars($string);
|
||||
}
|
||||
|
||||
if($this->currObj instanceof TeamSpeak3_Node_Client)
|
||||
{
|
||||
$before = array();
|
||||
$behind = array();
|
||||
|
||||
foreach($this->currObj->memberOf() as $group)
|
||||
{
|
||||
if($group->getProperty("namemode") == TeamSpeak3::GROUP_NAMEMODE_BEFORE)
|
||||
{
|
||||
$before[] = "[" . htmlspecialchars($group["name"]) . "]";
|
||||
}
|
||||
elseif($group->getProperty("namemode") == TeamSpeak3::GROUP_NAMEMODE_BEHIND)
|
||||
{
|
||||
$behind[] = "[" . htmlspecialchars($group["name"]) . "]";
|
||||
}
|
||||
}
|
||||
|
||||
return implode("", $before) . " " . htmlspecialchars($this->currObj) . " " . implode("", $behind);
|
||||
}
|
||||
|
||||
return htmlspecialchars($this->currObj);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a string for the current suffix element which can be used as a HTML
|
||||
* class property.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
protected function getSuffixClass()
|
||||
{
|
||||
return "suffix " . $this->currObj->getClass(null);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the HTML img tags which can be used to display the various icons for a
|
||||
* TeamSpeak_Node_Abstract object.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
protected function getSuffixIcon()
|
||||
{
|
||||
if($this->currObj instanceof TeamSpeak3_Node_Server)
|
||||
{
|
||||
return $this->getSuffixIconServer();
|
||||
}
|
||||
elseif($this->currObj instanceof TeamSpeak3_Node_Channel)
|
||||
{
|
||||
return $this->getSuffixIconChannel();
|
||||
}
|
||||
elseif($this->currObj instanceof TeamSpeak3_Node_Client)
|
||||
{
|
||||
return $this->getSuffixIconClient();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the HTML img tags which can be used to display the various icons for a
|
||||
* TeamSpeak_Node_Server object.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
protected function getSuffixIconServer()
|
||||
{
|
||||
$html = "";
|
||||
|
||||
if($this->currObj["virtualserver_icon_id"])
|
||||
{
|
||||
if(!$this->currObj->iconIsLocal("virtualserver_icon_id") && $this->ftclient)
|
||||
{
|
||||
if(!isset($this->cacheIcon[$this->currObj["virtualserver_icon_id"]]))
|
||||
{
|
||||
$download = $this->currObj->transferInitDownload(rand(0x0000, 0xFFFF), 0, $this->currObj->iconGetName("virtualserver_icon_id"));
|
||||
|
||||
if($this->ftclient == "data:image")
|
||||
{
|
||||
$download = TeamSpeak3::factory("filetransfer://" . $download["host"] . ":" . $download["port"])->download($download["ftkey"], $download["size"]);
|
||||
}
|
||||
|
||||
$this->cacheIcon[$this->currObj["virtualserver_icon_id"]] = $download;
|
||||
}
|
||||
else
|
||||
{
|
||||
$download = $this->cacheIcon[$this->currObj["virtualserver_icon_id"]];
|
||||
}
|
||||
|
||||
if($this->ftclient == "data:image")
|
||||
{
|
||||
$html .= $this->getImage("data:" . TeamSpeak3_Helper_Convert::imageMimeType($download) . ";base64," . base64_encode($download), "Server Icon", null, FALSE);
|
||||
}
|
||||
else
|
||||
{
|
||||
$html .= $this->getImage($this->ftclient . "?ftdata=" . base64_encode(serialize($download)), "Server Icon", null, FALSE);
|
||||
}
|
||||
}
|
||||
elseif(in_array($this->currObj["virtualserver_icon_id"], $this->cachedIcons))
|
||||
{
|
||||
$html .= $this->getImage("group_icon_" . $this->currObj["virtualserver_icon_id"] . ".png", "Server Icon");
|
||||
}
|
||||
}
|
||||
|
||||
return $html;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the HTML img tags which can be used to display the various icons for a
|
||||
* TeamSpeak_Node_Channel object.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
protected function getSuffixIconChannel()
|
||||
{
|
||||
if($this->currObj instanceof TeamSpeak3_Node_Channel && $this->currObj->isSpacer()) return;
|
||||
|
||||
$html = "";
|
||||
|
||||
if($this->currObj["channel_flag_default"])
|
||||
{
|
||||
$html .= $this->getImage("channel_flag_default.png", "Default Channel");
|
||||
}
|
||||
|
||||
if($this->currObj["channel_flag_password"])
|
||||
{
|
||||
$html .= $this->getImage("channel_flag_password.png", "Password-protected");
|
||||
}
|
||||
|
||||
if($this->currObj["channel_codec"] == TeamSpeak3::CODEC_CELT_MONO || $this->currObj["channel_codec"] == TeamSpeak3::CODEC_OPUS_MUSIC)
|
||||
{
|
||||
$html .= $this->getImage("channel_flag_music.png", "Music Codec");
|
||||
}
|
||||
|
||||
if($this->currObj["channel_needed_talk_power"])
|
||||
{
|
||||
$html .= $this->getImage("channel_flag_moderated.png", "Moderated");
|
||||
}
|
||||
|
||||
if($this->currObj["channel_icon_id"])
|
||||
{
|
||||
if(!$this->currObj->iconIsLocal("channel_icon_id") && $this->ftclient)
|
||||
{
|
||||
if(!isset($this->cacheIcon[$this->currObj["channel_icon_id"]]))
|
||||
{
|
||||
$download = $this->currObj->getParent()->transferInitDownload(rand(0x0000, 0xFFFF), 0, $this->currObj->iconGetName("channel_icon_id"));
|
||||
|
||||
if($this->ftclient == "data:image")
|
||||
{
|
||||
$download = TeamSpeak3::factory("filetransfer://" . $download["host"] . ":" . $download["port"])->download($download["ftkey"], $download["size"]);
|
||||
}
|
||||
|
||||
$this->cacheIcon[$this->currObj["channel_icon_id"]] = $download;
|
||||
}
|
||||
else
|
||||
{
|
||||
$download = $this->cacheIcon[$this->currObj["channel_icon_id"]];
|
||||
}
|
||||
|
||||
if($this->ftclient == "data:image")
|
||||
{
|
||||
$html .= $this->getImage("data:" . TeamSpeak3_Helper_Convert::imageMimeType($download) . ";base64," . base64_encode($download), "Channel Icon", null, FALSE);
|
||||
}
|
||||
else
|
||||
{
|
||||
$html .= $this->getImage($this->ftclient . "?ftdata=" . base64_encode(serialize($download)), "Channel Icon", null, FALSE);
|
||||
}
|
||||
}
|
||||
elseif(in_array($this->currObj["channel_icon_id"], $this->cachedIcons))
|
||||
{
|
||||
$html .= $this->getImage("group_icon_" . $this->currObj["channel_icon_id"] . ".png", "Channel Icon");
|
||||
}
|
||||
}
|
||||
|
||||
return $html;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the HTML img tags which can be used to display the various icons for a
|
||||
* TeamSpeak_Node_Client object.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
protected function getSuffixIconClient()
|
||||
{
|
||||
$html = "";
|
||||
|
||||
if($this->currObj["client_is_priority_speaker"])
|
||||
{
|
||||
$html .= $this->getImage("client_priority.png", "Priority Speaker");
|
||||
}
|
||||
|
||||
if($this->currObj["client_is_channel_commander"])
|
||||
{
|
||||
$html .= $this->getImage("client_cc.png", "Channel Commander");
|
||||
}
|
||||
|
||||
if($this->currObj["client_is_talker"])
|
||||
{
|
||||
$html .= $this->getImage("client_talker.png", "Talk Power granted");
|
||||
}
|
||||
elseif($cntp = $this->currObj->getParent()->channelGetById($this->currObj["cid"])->channel_needed_talk_power)
|
||||
{
|
||||
if($cntp > $this->currObj["client_talk_power"])
|
||||
{
|
||||
$html .= $this->getImage("client_mic_muted.png", "Insufficient Talk Power");
|
||||
}
|
||||
}
|
||||
|
||||
foreach($this->currObj->memberOf() as $group)
|
||||
{
|
||||
if(!$group["iconid"]) continue;
|
||||
|
||||
$type = ($group instanceof TeamSpeak3_Node_Servergroup) ? "Server Group" : "Channel Group";
|
||||
|
||||
if(!$group->iconIsLocal("iconid") && $this->ftclient)
|
||||
{
|
||||
if(!isset($this->cacheIcon[$group["iconid"]]))
|
||||
{
|
||||
$download = $group->getParent()->transferInitDownload(rand(0x0000, 0xFFFF), 0, $group->iconGetName("iconid"));
|
||||
|
||||
if($this->ftclient == "data:image")
|
||||
{
|
||||
$download = TeamSpeak3::factory("filetransfer://" . $download["host"] . ":" . $download["port"])->download($download["ftkey"], $download["size"]);
|
||||
}
|
||||
|
||||
$this->cacheIcon[$group["iconid"]] = $download;
|
||||
}
|
||||
else
|
||||
{
|
||||
$download = $this->cacheIcon[$group["iconid"]];
|
||||
}
|
||||
|
||||
if($this->ftclient == "data:image")
|
||||
{
|
||||
$html .= $this->getImage("data:" . TeamSpeak3_Helper_Convert::imageMimeType($download) . ";base64," . base64_encode($download), $group . " [" . $type . "]", null, FALSE);
|
||||
}
|
||||
else
|
||||
{
|
||||
$html .= $this->getImage($this->ftclient . "?ftdata=" . base64_encode(serialize($download)), $group . " [" . $type . "]", null, FALSE);
|
||||
}
|
||||
}
|
||||
elseif(in_array($group["iconid"], $this->cachedIcons))
|
||||
{
|
||||
$html .= $this->getImage("group_icon_" . $group["iconid"] . ".png", $group . " [" . $type . "]");
|
||||
}
|
||||
}
|
||||
|
||||
if($this->currObj["client_icon_id"])
|
||||
{
|
||||
if(!$this->currObj->iconIsLocal("client_icon_id") && $this->ftclient)
|
||||
{
|
||||
if(!isset($this->cacheIcon[$this->currObj["client_icon_id"]]))
|
||||
{
|
||||
$download = $this->currObj->getParent()->transferInitDownload(rand(0x0000, 0xFFFF), 0, $this->currObj->iconGetName("client_icon_id"));
|
||||
|
||||
if($this->ftclient == "data:image")
|
||||
{
|
||||
$download = TeamSpeak3::factory("filetransfer://" . $download["host"] . ":" . $download["port"])->download($download["ftkey"], $download["size"]);
|
||||
}
|
||||
|
||||
$this->cacheIcon[$this->currObj["client_icon_id"]] = $download;
|
||||
}
|
||||
else
|
||||
{
|
||||
$download = $this->cacheIcon[$this->currObj["client_icon_id"]];
|
||||
}
|
||||
|
||||
if($this->ftclient == "data:image")
|
||||
{
|
||||
$html .= $this->getImage("data:" . TeamSpeak3_Helper_Convert::imageMimeType($download) . ";base64," . base64_encode($download), "Client Icon", null, FALSE);
|
||||
}
|
||||
else
|
||||
{
|
||||
$html .= $this->getImage($this->ftclient . "?ftdata=" . base64_encode(serialize($download)), "Client Icon", null, FALSE);
|
||||
}
|
||||
}
|
||||
elseif(in_array($this->currObj["client_icon_id"], $this->cachedIcons))
|
||||
{
|
||||
$html .= $this->getImage("group_icon_" . $this->currObj["client_icon_id"] . ".png", "Client Icon");
|
||||
}
|
||||
}
|
||||
|
||||
return $html;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a HTML img tag which can be used to display the country flag for a
|
||||
* TeamSpeak_Node_Client object.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
protected function getSuffixFlag()
|
||||
{
|
||||
if(!$this->currObj instanceof TeamSpeak3_Node_Client) return;
|
||||
|
||||
if($this->flagpath && $this->currObj["client_country"])
|
||||
{
|
||||
return $this->getImage($this->currObj["client_country"]->toLower() . ".png", $this->currObj["client_country"], null, FALSE, TRUE);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the code to display a custom HTML img tag.
|
||||
*
|
||||
* @param string $name
|
||||
* @param string $text
|
||||
* @param string $class
|
||||
* @param boolean $iconpath
|
||||
* @param boolean $flagpath
|
||||
* @return string
|
||||
*/
|
||||
protected function getImage($name, $text = "", $class = null, $iconpath = TRUE, $flagpath = FALSE)
|
||||
{
|
||||
$src = "";
|
||||
|
||||
if($iconpath)
|
||||
{
|
||||
$src = $this->iconpath;
|
||||
}
|
||||
|
||||
if($flagpath)
|
||||
{
|
||||
$src = $this->flagpath;
|
||||
}
|
||||
|
||||
return "<img src='" . $src . $name . "' title='" . $text . "' alt='' align='top' />";
|
||||
}
|
||||
}
|
||||
42
ts3_lib/Viewer/Interface.php
Normal file
42
ts3_lib/Viewer/Interface.php
Normal file
@@ -0,0 +1,42 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @file
|
||||
* TeamSpeak 3 PHP Framework
|
||||
*
|
||||
* $Id: Interface.php 10/11/2013 11:35:22 scp@orilla $
|
||||
*
|
||||
* 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
|
||||
* @version 1.1.23
|
||||
* @author Sven 'ScP' Paulsen
|
||||
* @copyright Copyright (c) 2010 by Planet TeamSpeak. All rights reserved.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @class TeamSpeak3_Viewer_Interface
|
||||
* @brief Interface class describing a TeamSpeak 3 viewer.
|
||||
*/
|
||||
interface TeamSpeak3_Viewer_Interface
|
||||
{
|
||||
/**
|
||||
* 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());
|
||||
}
|
||||
107
ts3_lib/Viewer/Text.php
Normal file
107
ts3_lib/Viewer/Text.php
Normal file
@@ -0,0 +1,107 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @file
|
||||
* TeamSpeak 3 PHP Framework
|
||||
*
|
||||
* $Id: Text.php 10/11/2013 11:35:22 scp@orilla $
|
||||
*
|
||||
* 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
|
||||
* @version 1.1.23
|
||||
* @author Sven 'ScP' Paulsen
|
||||
* @copyright Copyright (c) 2010 by Planet TeamSpeak. All rights reserved.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @class TeamSpeak3_Viewer_Text
|
||||
* @brief Renders nodes used in ASCII-based TeamSpeak 3 viewers.
|
||||
*/
|
||||
class TeamSpeak3_Viewer_Text implements TeamSpeak3_Viewer_Interface
|
||||
{
|
||||
/**
|
||||
* A pre-defined pattern used to display a node in a TeamSpeak 3 viewer.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $pattern = "%0%1 %2\n";
|
||||
|
||||
/**
|
||||
* 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);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the ASCII string to display the prefix of the current node.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
protected function getPrefix()
|
||||
{
|
||||
$prefix = "";
|
||||
|
||||
if(count($this->currSib))
|
||||
{
|
||||
$last = array_pop($this->currSib);
|
||||
|
||||
foreach($this->currSib as $sibling)
|
||||
{
|
||||
$prefix .= ($sibling) ? "| " : " ";
|
||||
}
|
||||
|
||||
$prefix .= ($last) ? "\\-" : "|-";
|
||||
}
|
||||
|
||||
return $prefix;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns an ASCII string which can be used to display the status icon for a
|
||||
* TeamSpeak_Node_Abstract object.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
protected function getCorpusIcon()
|
||||
{
|
||||
return $this->currObj->getSymbol();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a string for the current corpus element which contains the display name
|
||||
* for the current TeamSpeak_Node_Abstract object.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
protected function getCorpusName()
|
||||
{
|
||||
return $this->currObj;
|
||||
}
|
||||
}
|
||||
674
ts3_lib/license.txt
Normal file
674
ts3_lib/license.txt
Normal file
@@ -0,0 +1,674 @@
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
Version 3, 29 June 2007
|
||||
|
||||
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
Preamble
|
||||
|
||||
The GNU General Public License is a free, copyleft license for
|
||||
software and other kinds of works.
|
||||
|
||||
The licenses for most software and other practical works are designed
|
||||
to take away your freedom to share and change the works. By contrast,
|
||||
the GNU General Public License is intended to guarantee your freedom to
|
||||
share and change all versions of a program--to make sure it remains free
|
||||
software for all its users. We, the Free Software Foundation, use the
|
||||
GNU General Public License for most of our software; it applies also to
|
||||
any other work released this way by its authors. You can apply it to
|
||||
your programs, too.
|
||||
|
||||
When we speak of free software, we are referring to freedom, not
|
||||
price. Our General Public Licenses are designed to make sure that you
|
||||
have the freedom to distribute copies of free software (and charge for
|
||||
them if you wish), that you receive source code or can get it if you
|
||||
want it, that you can change the software or use pieces of it in new
|
||||
free programs, and that you know you can do these things.
|
||||
|
||||
To protect your rights, we need to prevent others from denying you
|
||||
these rights or asking you to surrender the rights. Therefore, you have
|
||||
certain responsibilities if you distribute copies of the software, or if
|
||||
you modify it: responsibilities to respect the freedom of others.
|
||||
|
||||
For example, if you distribute copies of such a program, whether
|
||||
gratis or for a fee, you must pass on to the recipients the same
|
||||
freedoms that you received. You must make sure that they, too, receive
|
||||
or can get the source code. And you must show them these terms so they
|
||||
know their rights.
|
||||
|
||||
Developers that use the GNU GPL protect your rights with two steps:
|
||||
(1) assert copyright on the software, and (2) offer you this License
|
||||
giving you legal permission to copy, distribute and/or modify it.
|
||||
|
||||
For the developers' and authors' protection, the GPL clearly explains
|
||||
that there is no warranty for this free software. For both users' and
|
||||
authors' sake, the GPL requires that modified versions be marked as
|
||||
changed, so that their problems will not be attributed erroneously to
|
||||
authors of previous versions.
|
||||
|
||||
Some devices are designed to deny users access to install or run
|
||||
modified versions of the software inside them, although the manufacturer
|
||||
can do so. This is fundamentally incompatible with the aim of
|
||||
protecting users' freedom to change the software. The systematic
|
||||
pattern of such abuse occurs in the area of products for individuals to
|
||||
use, which is precisely where it is most unacceptable. Therefore, we
|
||||
have designed this version of the GPL to prohibit the practice for those
|
||||
products. If such problems arise substantially in other domains, we
|
||||
stand ready to extend this provision to those domains in future versions
|
||||
of the GPL, as needed to protect the freedom of users.
|
||||
|
||||
Finally, every program is threatened constantly by software patents.
|
||||
States should not allow patents to restrict development and use of
|
||||
software on general-purpose computers, but in those that do, we wish to
|
||||
avoid the special danger that patents applied to a free program could
|
||||
make it effectively proprietary. To prevent this, the GPL assures that
|
||||
patents cannot be used to render the program non-free.
|
||||
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow.
|
||||
|
||||
TERMS AND CONDITIONS
|
||||
|
||||
0. Definitions.
|
||||
|
||||
"This License" refers to version 3 of the GNU General Public License.
|
||||
|
||||
"Copyright" also means copyright-like laws that apply to other kinds of
|
||||
works, such as semiconductor masks.
|
||||
|
||||
"The Program" refers to any copyrightable work licensed under this
|
||||
License. Each licensee is addressed as "you". "Licensees" and
|
||||
"recipients" may be individuals or organizations.
|
||||
|
||||
To "modify" a work means to copy from or adapt all or part of the work
|
||||
in a fashion requiring copyright permission, other than the making of an
|
||||
exact copy. The resulting work is called a "modified version" of the
|
||||
earlier work or a work "based on" the earlier work.
|
||||
|
||||
A "covered work" means either the unmodified Program or a work based
|
||||
on the Program.
|
||||
|
||||
To "propagate" a work means to do anything with it that, without
|
||||
permission, would make you directly or secondarily liable for
|
||||
infringement under applicable copyright law, except executing it on a
|
||||
computer or modifying a private copy. Propagation includes copying,
|
||||
distribution (with or without modification), making available to the
|
||||
public, and in some countries other activities as well.
|
||||
|
||||
To "convey" a work means any kind of propagation that enables other
|
||||
parties to make or receive copies. Mere interaction with a user through
|
||||
a computer network, with no transfer of a copy, is not conveying.
|
||||
|
||||
An interactive user interface displays "Appropriate Legal Notices"
|
||||
to the extent that it includes a convenient and prominently visible
|
||||
feature that (1) displays an appropriate copyright notice, and (2)
|
||||
tells the user that there is no warranty for the work (except to the
|
||||
extent that warranties are provided), that licensees may convey the
|
||||
work under this License, and how to view a copy of this License. If
|
||||
the interface presents a list of user commands or options, such as a
|
||||
menu, a prominent item in the list meets this criterion.
|
||||
|
||||
1. Source Code.
|
||||
|
||||
The "source code" for a work means the preferred form of the work
|
||||
for making modifications to it. "Object code" means any non-source
|
||||
form of a work.
|
||||
|
||||
A "Standard Interface" means an interface that either is an official
|
||||
standard defined by a recognized standards body, or, in the case of
|
||||
interfaces specified for a particular programming language, one that
|
||||
is widely used among developers working in that language.
|
||||
|
||||
The "System Libraries" of an executable work include anything, other
|
||||
than the work as a whole, that (a) is included in the normal form of
|
||||
packaging a Major Component, but which is not part of that Major
|
||||
Component, and (b) serves only to enable use of the work with that
|
||||
Major Component, or to implement a Standard Interface for which an
|
||||
implementation is available to the public in source code form. A
|
||||
"Major Component", in this context, means a major essential component
|
||||
(kernel, window system, and so on) of the specific operating system
|
||||
(if any) on which the executable work runs, or a compiler used to
|
||||
produce the work, or an object code interpreter used to run it.
|
||||
|
||||
The "Corresponding Source" for a work in object code form means all
|
||||
the source code needed to generate, install, and (for an executable
|
||||
work) run the object code and to modify the work, including scripts to
|
||||
control those activities. However, it does not include the work's
|
||||
System Libraries, or general-purpose tools or generally available free
|
||||
programs which are used unmodified in performing those activities but
|
||||
which are not part of the work. For example, Corresponding Source
|
||||
includes interface definition files associated with source files for
|
||||
the work, and the source code for shared libraries and dynamically
|
||||
linked subprograms that the work is specifically designed to require,
|
||||
such as by intimate data communication or control flow between those
|
||||
subprograms and other parts of the work.
|
||||
|
||||
The Corresponding Source need not include anything that users
|
||||
can regenerate automatically from other parts of the Corresponding
|
||||
Source.
|
||||
|
||||
The Corresponding Source for a work in source code form is that
|
||||
same work.
|
||||
|
||||
2. Basic Permissions.
|
||||
|
||||
All rights granted under this License are granted for the term of
|
||||
copyright on the Program, and are irrevocable provided the stated
|
||||
conditions are met. This License explicitly affirms your unlimited
|
||||
permission to run the unmodified Program. The output from running a
|
||||
covered work is covered by this License only if the output, given its
|
||||
content, constitutes a covered work. This License acknowledges your
|
||||
rights of fair use or other equivalent, as provided by copyright law.
|
||||
|
||||
You may make, run and propagate covered works that you do not
|
||||
convey, without conditions so long as your license otherwise remains
|
||||
in force. You may convey covered works to others for the sole purpose
|
||||
of having them make modifications exclusively for you, or provide you
|
||||
with facilities for running those works, provided that you comply with
|
||||
the terms of this License in conveying all material for which you do
|
||||
not control copyright. Those thus making or running the covered works
|
||||
for you must do so exclusively on your behalf, under your direction
|
||||
and control, on terms that prohibit them from making any copies of
|
||||
your copyrighted material outside their relationship with you.
|
||||
|
||||
Conveying under any other circumstances is permitted solely under
|
||||
the conditions stated below. Sublicensing is not allowed; section 10
|
||||
makes it unnecessary.
|
||||
|
||||
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
|
||||
|
||||
No covered work shall be deemed part of an effective technological
|
||||
measure under any applicable law fulfilling obligations under article
|
||||
11 of the WIPO copyright treaty adopted on 20 December 1996, or
|
||||
similar laws prohibiting or restricting circumvention of such
|
||||
measures.
|
||||
|
||||
When you convey a covered work, you waive any legal power to forbid
|
||||
circumvention of technological measures to the extent such circumvention
|
||||
is effected by exercising rights under this License with respect to
|
||||
the covered work, and you disclaim any intention to limit operation or
|
||||
modification of the work as a means of enforcing, against the work's
|
||||
users, your or third parties' legal rights to forbid circumvention of
|
||||
technological measures.
|
||||
|
||||
4. Conveying Verbatim Copies.
|
||||
|
||||
You may convey verbatim copies of the Program's source code as you
|
||||
receive it, in any medium, provided that you conspicuously and
|
||||
appropriately publish on each copy an appropriate copyright notice;
|
||||
keep intact all notices stating that this License and any
|
||||
non-permissive terms added in accord with section 7 apply to the code;
|
||||
keep intact all notices of the absence of any warranty; and give all
|
||||
recipients a copy of this License along with the Program.
|
||||
|
||||
You may charge any price or no price for each copy that you convey,
|
||||
and you may offer support or warranty protection for a fee.
|
||||
|
||||
5. Conveying Modified Source Versions.
|
||||
|
||||
You may convey a work based on the Program, or the modifications to
|
||||
produce it from the Program, in the form of source code under the
|
||||
terms of section 4, provided that you also meet all of these conditions:
|
||||
|
||||
a) The work must carry prominent notices stating that you modified
|
||||
it, and giving a relevant date.
|
||||
|
||||
b) The work must carry prominent notices stating that it is
|
||||
released under this License and any conditions added under section
|
||||
7. This requirement modifies the requirement in section 4 to
|
||||
"keep intact all notices".
|
||||
|
||||
c) You must license the entire work, as a whole, under this
|
||||
License to anyone who comes into possession of a copy. This
|
||||
License will therefore apply, along with any applicable section 7
|
||||
additional terms, to the whole of the work, and all its parts,
|
||||
regardless of how they are packaged. This License gives no
|
||||
permission to license the work in any other way, but it does not
|
||||
invalidate such permission if you have separately received it.
|
||||
|
||||
d) If the work has interactive user interfaces, each must display
|
||||
Appropriate Legal Notices; however, if the Program has interactive
|
||||
interfaces that do not display Appropriate Legal Notices, your
|
||||
work need not make them do so.
|
||||
|
||||
A compilation of a covered work with other separate and independent
|
||||
works, which are not by their nature extensions of the covered work,
|
||||
and which are not combined with it such as to form a larger program,
|
||||
in or on a volume of a storage or distribution medium, is called an
|
||||
"aggregate" if the compilation and its resulting copyright are not
|
||||
used to limit the access or legal rights of the compilation's users
|
||||
beyond what the individual works permit. Inclusion of a covered work
|
||||
in an aggregate does not cause this License to apply to the other
|
||||
parts of the aggregate.
|
||||
|
||||
6. Conveying Non-Source Forms.
|
||||
|
||||
You may convey a covered work in object code form under the terms
|
||||
of sections 4 and 5, provided that you also convey the
|
||||
machine-readable Corresponding Source under the terms of this License,
|
||||
in one of these ways:
|
||||
|
||||
a) Convey the object code in, or embodied in, a physical product
|
||||
(including a physical distribution medium), accompanied by the
|
||||
Corresponding Source fixed on a durable physical medium
|
||||
customarily used for software interchange.
|
||||
|
||||
b) Convey the object code in, or embodied in, a physical product
|
||||
(including a physical distribution medium), accompanied by a
|
||||
written offer, valid for at least three years and valid for as
|
||||
long as you offer spare parts or customer support for that product
|
||||
model, to give anyone who possesses the object code either (1) a
|
||||
copy of the Corresponding Source for all the software in the
|
||||
product that is covered by this License, on a durable physical
|
||||
medium customarily used for software interchange, for a price no
|
||||
more than your reasonable cost of physically performing this
|
||||
conveying of source, or (2) access to copy the
|
||||
Corresponding Source from a network server at no charge.
|
||||
|
||||
c) Convey individual copies of the object code with a copy of the
|
||||
written offer to provide the Corresponding Source. This
|
||||
alternative is allowed only occasionally and noncommercially, and
|
||||
only if you received the object code with such an offer, in accord
|
||||
with subsection 6b.
|
||||
|
||||
d) Convey the object code by offering access from a designated
|
||||
place (gratis or for a charge), and offer equivalent access to the
|
||||
Corresponding Source in the same way through the same place at no
|
||||
further charge. You need not require recipients to copy the
|
||||
Corresponding Source along with the object code. If the place to
|
||||
copy the object code is a network server, the Corresponding Source
|
||||
may be on a different server (operated by you or a third party)
|
||||
that supports equivalent copying facilities, provided you maintain
|
||||
clear directions next to the object code saying where to find the
|
||||
Corresponding Source. Regardless of what server hosts the
|
||||
Corresponding Source, you remain obligated to ensure that it is
|
||||
available for as long as needed to satisfy these requirements.
|
||||
|
||||
e) Convey the object code using peer-to-peer transmission, provided
|
||||
you inform other peers where the object code and Corresponding
|
||||
Source of the work are being offered to the general public at no
|
||||
charge under subsection 6d.
|
||||
|
||||
A separable portion of the object code, whose source code is excluded
|
||||
from the Corresponding Source as a System Library, need not be
|
||||
included in conveying the object code work.
|
||||
|
||||
A "User Product" is either (1) a "consumer product", which means any
|
||||
tangible personal property which is normally used for personal, family,
|
||||
or household purposes, or (2) anything designed or sold for incorporation
|
||||
into a dwelling. In determining whether a product is a consumer product,
|
||||
doubtful cases shall be resolved in favor of coverage. For a particular
|
||||
product received by a particular user, "normally used" refers to a
|
||||
typical or common use of that class of product, regardless of the status
|
||||
of the particular user or of the way in which the particular user
|
||||
actually uses, or expects or is expected to use, the product. A product
|
||||
is a consumer product regardless of whether the product has substantial
|
||||
commercial, industrial or non-consumer uses, unless such uses represent
|
||||
the only significant mode of use of the product.
|
||||
|
||||
"Installation Information" for a User Product means any methods,
|
||||
procedures, authorization keys, or other information required to install
|
||||
and execute modified versions of a covered work in that User Product from
|
||||
a modified version of its Corresponding Source. The information must
|
||||
suffice to ensure that the continued functioning of the modified object
|
||||
code is in no case prevented or interfered with solely because
|
||||
modification has been made.
|
||||
|
||||
If you convey an object code work under this section in, or with, or
|
||||
specifically for use in, a User Product, and the conveying occurs as
|
||||
part of a transaction in which the right of possession and use of the
|
||||
User Product is transferred to the recipient in perpetuity or for a
|
||||
fixed term (regardless of how the transaction is characterized), the
|
||||
Corresponding Source conveyed under this section must be accompanied
|
||||
by the Installation Information. But this requirement does not apply
|
||||
if neither you nor any third party retains the ability to install
|
||||
modified object code on the User Product (for example, the work has
|
||||
been installed in ROM).
|
||||
|
||||
The requirement to provide Installation Information does not include a
|
||||
requirement to continue to provide support service, warranty, or updates
|
||||
for a work that has been modified or installed by the recipient, or for
|
||||
the User Product in which it has been modified or installed. Access to a
|
||||
network may be denied when the modification itself materially and
|
||||
adversely affects the operation of the network or violates the rules and
|
||||
protocols for communication across the network.
|
||||
|
||||
Corresponding Source conveyed, and Installation Information provided,
|
||||
in accord with this section must be in a format that is publicly
|
||||
documented (and with an implementation available to the public in
|
||||
source code form), and must require no special password or key for
|
||||
unpacking, reading or copying.
|
||||
|
||||
7. Additional Terms.
|
||||
|
||||
"Additional permissions" are terms that supplement the terms of this
|
||||
License by making exceptions from one or more of its conditions.
|
||||
Additional permissions that are applicable to the entire Program shall
|
||||
be treated as though they were included in this License, to the extent
|
||||
that they are valid under applicable law. If additional permissions
|
||||
apply only to part of the Program, that part may be used separately
|
||||
under those permissions, but the entire Program remains governed by
|
||||
this License without regard to the additional permissions.
|
||||
|
||||
When you convey a copy of a covered work, you may at your option
|
||||
remove any additional permissions from that copy, or from any part of
|
||||
it. (Additional permissions may be written to require their own
|
||||
removal in certain cases when you modify the work.) You may place
|
||||
additional permissions on material, added by you to a covered work,
|
||||
for which you have or can give appropriate copyright permission.
|
||||
|
||||
Notwithstanding any other provision of this License, for material you
|
||||
add to a covered work, you may (if authorized by the copyright holders of
|
||||
that material) supplement the terms of this License with terms:
|
||||
|
||||
a) Disclaiming warranty or limiting liability differently from the
|
||||
terms of sections 15 and 16 of this License; or
|
||||
|
||||
b) Requiring preservation of specified reasonable legal notices or
|
||||
author attributions in that material or in the Appropriate Legal
|
||||
Notices displayed by works containing it; or
|
||||
|
||||
c) Prohibiting misrepresentation of the origin of that material, or
|
||||
requiring that modified versions of such material be marked in
|
||||
reasonable ways as different from the original version; or
|
||||
|
||||
d) Limiting the use for publicity purposes of names of licensors or
|
||||
authors of the material; or
|
||||
|
||||
e) Declining to grant rights under trademark law for use of some
|
||||
trade names, trademarks, or service marks; or
|
||||
|
||||
f) Requiring indemnification of licensors and authors of that
|
||||
material by anyone who conveys the material (or modified versions of
|
||||
it) with contractual assumptions of liability to the recipient, for
|
||||
any liability that these contractual assumptions directly impose on
|
||||
those licensors and authors.
|
||||
|
||||
All other non-permissive additional terms are considered "further
|
||||
restrictions" within the meaning of section 10. If the Program as you
|
||||
received it, or any part of it, contains a notice stating that it is
|
||||
governed by this License along with a term that is a further
|
||||
restriction, you may remove that term. If a license document contains
|
||||
a further restriction but permits relicensing or conveying under this
|
||||
License, you may add to a covered work material governed by the terms
|
||||
of that license document, provided that the further restriction does
|
||||
not survive such relicensing or conveying.
|
||||
|
||||
If you add terms to a covered work in accord with this section, you
|
||||
must place, in the relevant source files, a statement of the
|
||||
additional terms that apply to those files, or a notice indicating
|
||||
where to find the applicable terms.
|
||||
|
||||
Additional terms, permissive or non-permissive, may be stated in the
|
||||
form of a separately written license, or stated as exceptions;
|
||||
the above requirements apply either way.
|
||||
|
||||
8. Termination.
|
||||
|
||||
You may not propagate or modify a covered work except as expressly
|
||||
provided under this License. Any attempt otherwise to propagate or
|
||||
modify it is void, and will automatically terminate your rights under
|
||||
this License (including any patent licenses granted under the third
|
||||
paragraph of section 11).
|
||||
|
||||
However, if you cease all violation of this License, then your
|
||||
license from a particular copyright holder is reinstated (a)
|
||||
provisionally, unless and until the copyright holder explicitly and
|
||||
finally terminates your license, and (b) permanently, if the copyright
|
||||
holder fails to notify you of the violation by some reasonable means
|
||||
prior to 60 days after the cessation.
|
||||
|
||||
Moreover, your license from a particular copyright holder is
|
||||
reinstated permanently if the copyright holder notifies you of the
|
||||
violation by some reasonable means, this is the first time you have
|
||||
received notice of violation of this License (for any work) from that
|
||||
copyright holder, and you cure the violation prior to 30 days after
|
||||
your receipt of the notice.
|
||||
|
||||
Termination of your rights under this section does not terminate the
|
||||
licenses of parties who have received copies or rights from you under
|
||||
this License. If your rights have been terminated and not permanently
|
||||
reinstated, you do not qualify to receive new licenses for the same
|
||||
material under section 10.
|
||||
|
||||
9. Acceptance Not Required for Having Copies.
|
||||
|
||||
You are not required to accept this License in order to receive or
|
||||
run a copy of the Program. Ancillary propagation of a covered work
|
||||
occurring solely as a consequence of using peer-to-peer transmission
|
||||
to receive a copy likewise does not require acceptance. However,
|
||||
nothing other than this License grants you permission to propagate or
|
||||
modify any covered work. These actions infringe copyright if you do
|
||||
not accept this License. Therefore, by modifying or propagating a
|
||||
covered work, you indicate your acceptance of this License to do so.
|
||||
|
||||
10. Automatic Licensing of Downstream Recipients.
|
||||
|
||||
Each time you convey a covered work, the recipient automatically
|
||||
receives a license from the original licensors, to run, modify and
|
||||
propagate that work, subject to this License. You are not responsible
|
||||
for enforcing compliance by third parties with this License.
|
||||
|
||||
An "entity transaction" is a transaction transferring control of an
|
||||
organization, or substantially all assets of one, or subdividing an
|
||||
organization, or merging organizations. If propagation of a covered
|
||||
work results from an entity transaction, each party to that
|
||||
transaction who receives a copy of the work also receives whatever
|
||||
licenses to the work the party's predecessor in interest had or could
|
||||
give under the previous paragraph, plus a right to possession of the
|
||||
Corresponding Source of the work from the predecessor in interest, if
|
||||
the predecessor has it or can get it with reasonable efforts.
|
||||
|
||||
You may not impose any further restrictions on the exercise of the
|
||||
rights granted or affirmed under this License. For example, you may
|
||||
not impose a license fee, royalty, or other charge for exercise of
|
||||
rights granted under this License, and you may not initiate litigation
|
||||
(including a cross-claim or counterclaim in a lawsuit) alleging that
|
||||
any patent claim is infringed by making, using, selling, offering for
|
||||
sale, or importing the Program or any portion of it.
|
||||
|
||||
11. Patents.
|
||||
|
||||
A "contributor" is a copyright holder who authorizes use under this
|
||||
License of the Program or a work on which the Program is based. The
|
||||
work thus licensed is called the contributor's "contributor version".
|
||||
|
||||
A contributor's "essential patent claims" are all patent claims
|
||||
owned or controlled by the contributor, whether already acquired or
|
||||
hereafter acquired, that would be infringed by some manner, permitted
|
||||
by this License, of making, using, or selling its contributor version,
|
||||
but do not include claims that would be infringed only as a
|
||||
consequence of further modification of the contributor version. For
|
||||
purposes of this definition, "control" includes the right to grant
|
||||
patent sublicenses in a manner consistent with the requirements of
|
||||
this License.
|
||||
|
||||
Each contributor grants you a non-exclusive, worldwide, royalty-free
|
||||
patent license under the contributor's essential patent claims, to
|
||||
make, use, sell, offer for sale, import and otherwise run, modify and
|
||||
propagate the contents of its contributor version.
|
||||
|
||||
In the following three paragraphs, a "patent license" is any express
|
||||
agreement or commitment, however denominated, not to enforce a patent
|
||||
(such as an express permission to practice a patent or covenant not to
|
||||
sue for patent infringement). To "grant" such a patent license to a
|
||||
party means to make such an agreement or commitment not to enforce a
|
||||
patent against the party.
|
||||
|
||||
If you convey a covered work, knowingly relying on a patent license,
|
||||
and the Corresponding Source of the work is not available for anyone
|
||||
to copy, free of charge and under the terms of this License, through a
|
||||
publicly available network server or other readily accessible means,
|
||||
then you must either (1) cause the Corresponding Source to be so
|
||||
available, or (2) arrange to deprive yourself of the benefit of the
|
||||
patent license for this particular work, or (3) arrange, in a manner
|
||||
consistent with the requirements of this License, to extend the patent
|
||||
license to downstream recipients. "Knowingly relying" means you have
|
||||
actual knowledge that, but for the patent license, your conveying the
|
||||
covered work in a country, or your recipient's use of the covered work
|
||||
in a country, would infringe one or more identifiable patents in that
|
||||
country that you have reason to believe are valid.
|
||||
|
||||
If, pursuant to or in connection with a single transaction or
|
||||
arrangement, you convey, or propagate by procuring conveyance of, a
|
||||
covered work, and grant a patent license to some of the parties
|
||||
receiving the covered work authorizing them to use, propagate, modify
|
||||
or convey a specific copy of the covered work, then the patent license
|
||||
you grant is automatically extended to all recipients of the covered
|
||||
work and works based on it.
|
||||
|
||||
A patent license is "discriminatory" if it does not include within
|
||||
the scope of its coverage, prohibits the exercise of, or is
|
||||
conditioned on the non-exercise of one or more of the rights that are
|
||||
specifically granted under this License. You may not convey a covered
|
||||
work if you are a party to an arrangement with a third party that is
|
||||
in the business of distributing software, under which you make payment
|
||||
to the third party based on the extent of your activity of conveying
|
||||
the work, and under which the third party grants, to any of the
|
||||
parties who would receive the covered work from you, a discriminatory
|
||||
patent license (a) in connection with copies of the covered work
|
||||
conveyed by you (or copies made from those copies), or (b) primarily
|
||||
for and in connection with specific products or compilations that
|
||||
contain the covered work, unless you entered into that arrangement,
|
||||
or that patent license was granted, prior to 28 March 2007.
|
||||
|
||||
Nothing in this License shall be construed as excluding or limiting
|
||||
any implied license or other defenses to infringement that may
|
||||
otherwise be available to you under applicable patent law.
|
||||
|
||||
12. No Surrender of Others' Freedom.
|
||||
|
||||
If conditions are imposed on you (whether by court order, agreement or
|
||||
otherwise) that contradict the conditions of this License, they do not
|
||||
excuse you from the conditions of this License. If you cannot convey a
|
||||
covered work so as to satisfy simultaneously your obligations under this
|
||||
License and any other pertinent obligations, then as a consequence you may
|
||||
not convey it at all. For example, if you agree to terms that obligate you
|
||||
to collect a royalty for further conveying from those to whom you convey
|
||||
the Program, the only way you could satisfy both those terms and this
|
||||
License would be to refrain entirely from conveying the Program.
|
||||
|
||||
13. Use with the GNU Affero General Public License.
|
||||
|
||||
Notwithstanding any other provision of this License, you have
|
||||
permission to link or combine any covered work with a work licensed
|
||||
under version 3 of the GNU Affero General Public License into a single
|
||||
combined work, and to convey the resulting work. The terms of this
|
||||
License will continue to apply to the part which is the covered work,
|
||||
but the special requirements of the GNU Affero General Public License,
|
||||
section 13, concerning interaction through a network will apply to the
|
||||
combination as such.
|
||||
|
||||
14. Revised Versions of this License.
|
||||
|
||||
The Free Software Foundation may publish revised and/or new versions of
|
||||
the GNU General Public License from time to time. Such new versions will
|
||||
be similar in spirit to the present version, but may differ in detail to
|
||||
address new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the
|
||||
Program specifies that a certain numbered version of the GNU General
|
||||
Public License "or any later version" applies to it, you have the
|
||||
option of following the terms and conditions either of that numbered
|
||||
version or of any later version published by the Free Software
|
||||
Foundation. If the Program does not specify a version number of the
|
||||
GNU General Public License, you may choose any version ever published
|
||||
by the Free Software Foundation.
|
||||
|
||||
If the Program specifies that a proxy can decide which future
|
||||
versions of the GNU General Public License can be used, that proxy's
|
||||
public statement of acceptance of a version permanently authorizes you
|
||||
to choose that version for the Program.
|
||||
|
||||
Later license versions may give you additional or different
|
||||
permissions. However, no additional obligations are imposed on any
|
||||
author or copyright holder as a result of your choosing to follow a
|
||||
later version.
|
||||
|
||||
15. Disclaimer of Warranty.
|
||||
|
||||
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
|
||||
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
|
||||
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
|
||||
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
|
||||
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
|
||||
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
|
||||
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
|
||||
|
||||
16. Limitation of Liability.
|
||||
|
||||
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
|
||||
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
|
||||
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
|
||||
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
|
||||
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
|
||||
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
|
||||
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
|
||||
SUCH DAMAGES.
|
||||
|
||||
17. Interpretation of Sections 15 and 16.
|
||||
|
||||
If the disclaimer of warranty and limitation of liability provided
|
||||
above cannot be given local legal effect according to their terms,
|
||||
reviewing courts shall apply local law that most closely approximates
|
||||
an absolute waiver of all civil liability in connection with the
|
||||
Program, unless a warranty or assumption of liability accompanies a
|
||||
copy of the Program in return for a fee.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
How to Apply These Terms to Your New Programs
|
||||
|
||||
If you develop a new program, and you want it to be of the greatest
|
||||
possible use to the public, the best way to achieve this is to make it
|
||||
free software which everyone can redistribute and change under these terms.
|
||||
|
||||
To do so, attach the following notices to the program. It is safest
|
||||
to attach them to the start of each source file to most effectively
|
||||
state the exclusion of warranty; and each file should have at least
|
||||
the "copyright" line and a pointer to where the full notice is found.
|
||||
|
||||
<one line to give the program's name and a brief idea of what it does.>
|
||||
Copyright (C) <year> <name of author>
|
||||
|
||||
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/>.
|
||||
|
||||
Also add information on how to contact you by electronic and paper mail.
|
||||
|
||||
If the program does terminal interaction, make it output a short
|
||||
notice like this when it starts in an interactive mode:
|
||||
|
||||
<program> Copyright (C) <year> <name of author>
|
||||
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
||||
This is free software, and you are welcome to redistribute it
|
||||
under certain conditions; type `show c' for details.
|
||||
|
||||
The hypothetical commands `show w' and `show c' should show the appropriate
|
||||
parts of the General Public License. Of course, your program's commands
|
||||
might be different; for a GUI interface, you would use an "about box".
|
||||
|
||||
You should also get your employer (if you work as a programmer) or school,
|
||||
if any, to sign a "copyright disclaimer" for the program, if necessary.
|
||||
For more information on this, and how to apply and follow the GNU GPL, see
|
||||
<http://www.gnu.org/licenses/>.
|
||||
|
||||
The GNU General Public License does not permit incorporating your program
|
||||
into proprietary programs. If your program is a subroutine library, you
|
||||
may consider it more useful to permit linking proprietary applications with
|
||||
the library. If this is what you want to do, use the GNU Lesser General
|
||||
Public License instead of this License. But first, please read
|
||||
<http://www.gnu.org/philosophy/why-not-lgpl.html>.
|
||||
40
update_0-02.php
Normal file
40
update_0-02.php
Normal file
@@ -0,0 +1,40 @@
|
||||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<title>TS-N.NET ranksystem - Update 0.02</title>
|
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
|
||||
<link rel="stylesheet" type="text/css" href="other/style.css.php" />
|
||||
</head>
|
||||
<body>
|
||||
<?php
|
||||
require_once('other/config.php');
|
||||
require_once('lang.php');
|
||||
$dbname=$db['dbname'];
|
||||
|
||||
if($currvers=='0.02-alpha')
|
||||
{
|
||||
echo'<wncolor>'.$lang['alrup'].'</wncolor>';
|
||||
} else
|
||||
{
|
||||
echo sprintf($lang['updb'],'0.02','0-02');
|
||||
|
||||
if(!$mysqlcon->query("ALTER TABLE $dbname.config ADD (dateformat text CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,showexgrp int(1) NOT NULL,showexcld int(1) NOT NULL,showcolcld int(1) NOT NULL,showcoluuid int(1) NOT NULL,showcoldbid int(1) NOT NULL,showcolot int(1) NOT NULL,showcolit int(1) NOT NULL,showcolat int(1) NOT NULL,showcolnx int(1) NOT NULL)"))
|
||||
{
|
||||
printf("Errormessage: %s\n", $mysqlcon->error);
|
||||
}
|
||||
if(!$mysqlcon->query("ALTER TABLE $dbname.user ADD (online int(1) NOT NULL)"))
|
||||
{
|
||||
printf("Errormessage: %s\n", $mysqlcon->error);
|
||||
}
|
||||
if(!$mysqlcon->query("UPDATE config set currvers='0.02-alpha',dateformat='%a days, %h hours, %i mins, %s secs',showexgrp='1',showexcld='1',showcolcld='1',showcoluuid='1',showcoldbid='1',showcolot='1',showcolit='1',showcolat='1',showcolnx='1'"))
|
||||
{
|
||||
printf("Errormessage: %s\n", $mysqlcon->error);
|
||||
}
|
||||
else
|
||||
{
|
||||
echo'<sccolor>'.$lang['upsucc'].'</sccolor><br><br>';
|
||||
}
|
||||
}
|
||||
?>
|
||||
</body>
|
||||
</html>
|
||||
73
update_0-10.php
Normal file
73
update_0-10.php
Normal file
@@ -0,0 +1,73 @@
|
||||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<title>TS-N.NET ranksystem - Update 0.10</title>
|
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
|
||||
<link rel="stylesheet" type="text/css" href="other/style.css.php" />
|
||||
</head>
|
||||
<body>
|
||||
<?php
|
||||
require_once('other/config.php');
|
||||
require_once('lang.php');
|
||||
$dbname=$db['dbname'];
|
||||
|
||||
if(is_file('dbconfig.php'))
|
||||
{
|
||||
if(is_file('other/dbconfig.php'))
|
||||
{
|
||||
unlink('other/dbconfig.php');
|
||||
}
|
||||
rename('dbconfig.php','other/dbconfig.php');
|
||||
}
|
||||
if(is_file('install.php') or is_file('config.php') or is_file('mysql_connect.php') or is_file('webinterface_list.php') or is_file('update_0-02.php') or is_file('style.css'))
|
||||
{
|
||||
unlink('install.php');
|
||||
unlink('config.php');
|
||||
unlink('mysql_connect.php');
|
||||
unlink('webinterface_list.php');
|
||||
unlink('update_0-02.php');
|
||||
unlink('style.css');
|
||||
}
|
||||
|
||||
if(is_file('dbconfig.php'))
|
||||
{
|
||||
echo '<wncolor>'.sprintf($lang['upmov'],'dbconfig.php','other').'</wncolor><br><br>';
|
||||
echo '<wncolor>'.sprintf($lang['updel'],'config.php<br>install.php<br>mysql_connect.php<br>style.css<br>update_0-02.php<br>webinterface_list.php').'</wncolor>';
|
||||
}
|
||||
elseif(is_file('install.php') or is_file('config.php') or is_file('mysql_connect.php') or is_file('webinterface_list.php') or is_file('update_0-02.php') or is_file('style.css'))
|
||||
{
|
||||
echo '<wncolor>'.sprintf($lang['updel'],'config.php<br>install.php<br>mysql_connect.php<br>style.css<br>update_0-02.php<br>webinterface_list.php').'</wncolor>';
|
||||
}
|
||||
elseif($currvers=='0.10-beta')
|
||||
{
|
||||
echo'<wncolor>'.$lang['alrup'].'</wncolor><br>';
|
||||
}
|
||||
else
|
||||
{
|
||||
echo sprintf($lang['updb'],'0.10','0-10');
|
||||
echo '<form name="updateranksystem" method="post"><input type="submit" name="updateranksystem" value="update"></form>';
|
||||
}
|
||||
|
||||
if(isset($_POST['updateranksystem']))
|
||||
{
|
||||
if(!$mysqlcon->query("ALTER TABLE $dbname.config ADD (showcolsg int(1) NOT NULL,bgcolor text CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,hdcolor text CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,txcolor text CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,hvcolor text CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,ifcolor text CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,wncolor text CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,sccolor text CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,showgen int(1) NOT NULL)"))
|
||||
{
|
||||
printf("Errormessage: %s\n", $mysqlcon->error);
|
||||
}
|
||||
echo '<br><br>'.$lang['insttb'].'<br>';
|
||||
if(!$mysqlcon->query("CREATE TABLE $dbname.groups (sgid int(10) NOT NULL,sgidname text CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL)"))
|
||||
{
|
||||
echo $lang['insttberr'].'<wncolor>'.$mysqlcon->error.'.</wncolor><br>';
|
||||
}
|
||||
if(!$mysqlcon->query("UPDATE config set currvers='0.10-beta',showcolsg='1',bgcolor='#101010',hdcolor='#909090',txcolor='#707070',hvcolor='#FFFFFF',ifcolor='#3366CC',wncolor='#CC0000',sccolor='#008000',showgen='1'"))
|
||||
{
|
||||
printf("Errormessage: %s\n", $mysqlcon->error);
|
||||
}
|
||||
else
|
||||
{
|
||||
echo'<sccolor>'.$lang['upsucc'].'</sccolor><br><br>';
|
||||
}
|
||||
}
|
||||
?>
|
||||
</body>
|
||||
</html>
|
||||
339
webinterface.php
Normal file
339
webinterface.php
Normal file
@@ -0,0 +1,339 @@
|
||||
<?php
|
||||
session_start();
|
||||
?>
|
||||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<title>TS-N.NET Ranksystem - Webinterface</title>
|
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
|
||||
<link rel="stylesheet" type="text/css" href="other/style.css.php" />
|
||||
<link rel="stylesheet" type="text/css" href="jquerylib/jquery.autocomplete.css" />
|
||||
<script type="text/javascript" src="jquerylib/jquery.js"></script>
|
||||
<script type='text/javascript' src='jquerylib/jquery.autocomplete.js'></script>
|
||||
<script type="text/javascript">
|
||||
function disablediv(div)
|
||||
{
|
||||
var objDiv = document.getElementById(div);
|
||||
objDiv.innerHTML=" ";
|
||||
}
|
||||
window.setTimeout("disablediv('alert')",10000);
|
||||
|
||||
var toggle = function (number) {
|
||||
var layers = document.getElementsByClassName('layers');
|
||||
for(var i = 0; i < layers.length; ++i)
|
||||
{
|
||||
if(i == number)
|
||||
{
|
||||
layers[i].style.display = 'block';
|
||||
}
|
||||
else
|
||||
{
|
||||
layers[i].style.display = 'none';
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$().ready(function() {
|
||||
|
||||
function log(event, data, formatted) {
|
||||
$("<li>").html( !data ? "No match!" : "Selected: " + formatted).appendTo("#result");
|
||||
}
|
||||
|
||||
function formatItem(row) {
|
||||
return row[0] + " (<i>uuid: " + row[1] + "</i>)";
|
||||
}
|
||||
function formatResult(row) {
|
||||
return row[0].replace(/(<.+?>)/gi, '');
|
||||
}
|
||||
|
||||
$("#clients").autocomplete('other/search.php', {
|
||||
width: 420,
|
||||
scrollHeight: 300,
|
||||
max: 999,
|
||||
multiple: true,
|
||||
matchContains: true,
|
||||
formatItem: formatItem,
|
||||
formatResult: formatResult
|
||||
});
|
||||
|
||||
$(":text, textarea").result(log).next().click(function() {
|
||||
$(this).prev().search();
|
||||
});
|
||||
$("#clients").result(function(event, data, formatted) {
|
||||
var hidden = $(this).parent().next().find(">:input");
|
||||
hidden.val( (hidden.val() ? hidden.val() + "," : hidden.val()) + data[1]);
|
||||
});
|
||||
|
||||
});
|
||||
</script>
|
||||
<?PHP
|
||||
echo'</head><body>';
|
||||
$starttime=microtime(true);
|
||||
require_once('other/config.php');
|
||||
require_once('lang.php');
|
||||
|
||||
$alert=" ";
|
||||
|
||||
if(isset($_POST['changeclients']))
|
||||
{
|
||||
$selectedclients=$_POST["selectedclients"];
|
||||
echo $selectedclients;
|
||||
echo '<br>';
|
||||
$selecteduuids=$_POST["selecteduuids"];
|
||||
echo $selecteduuids;
|
||||
}
|
||||
if(isset($_POST['updatets']))
|
||||
{
|
||||
$tshost=$_POST["tshost"];
|
||||
$tsquery=$_POST["tsquery"];
|
||||
$tsvoice=$_POST["tsvoice"];
|
||||
$tsuser=$_POST["tsuser"];
|
||||
$tspass=$_POST["tspass"];
|
||||
$queryname=$_POST["queryname"];
|
||||
$queryname2=$_POST["queryname2"];
|
||||
if(!$mysqlcon->query("UPDATE config set tshost='$tshost',tsquery='$tsquery',tsvoice='$tsvoice',tsuser='$tsuser',tspass='$tspass',queryname='$queryname',queryname2='$queryname2'"))
|
||||
{
|
||||
$alert='<wncolor>'.$lang['error'].$mysqlcon->error.'</wncolor>';
|
||||
}
|
||||
else
|
||||
{
|
||||
$alert='<sccolor>'.$lang['wisvsuc'].'</sccolor>';
|
||||
}
|
||||
require_once('other/webinterface_list.php');
|
||||
}
|
||||
if(isset($_POST['updatecore']))
|
||||
{
|
||||
$grouptime=$_POST["grouptime"];
|
||||
$resetbydbchange=$_POST["resetbydbchange"];
|
||||
if($resetbydbchange=="on"){$resetbydbchange=1;}else{$resetbydbchange=0;}
|
||||
$msgtouser=$_POST["msgtouser"];
|
||||
if($msgtouser=="on"){$msgtouser=1;}else{$msgtouser=0;}
|
||||
$upcheck=$_POST["upcheck"];
|
||||
if($upcheck=="on"){$upcheck=1;}else{$upcheck=0;}
|
||||
$uniqueid=$_POST["uniqueid"];
|
||||
$updateinfotime=$_POST["updateinfotime"];
|
||||
$substridle=$_POST["substridle"];
|
||||
if($substridle=="on"){$substridle=1;}else{$substridle=0;}
|
||||
$exceptuuid=$_POST["exceptuuid"];
|
||||
$exceptgroup=$_POST["exceptgroup"];
|
||||
if(!$mysqlcon->query("UPDATE config set grouptime='$grouptime',resetbydbchange='$resetbydbchange',msgtouser='$msgtouser',upcheck='$upcheck',uniqueid='$uniqueid',updateinfotime='$updateinfotime',substridle='$substridle',exceptuuid='$exceptuuid',exceptgroup='$exceptgroup'"))
|
||||
{
|
||||
$alert='<wncolor>'.$lang['error'].$mysqlcon->error.'</wncolor>';
|
||||
}
|
||||
else
|
||||
{
|
||||
$alert='<sccolor>'.$lang['wisvsuc'].'</sccolor>';
|
||||
}
|
||||
require_once('other/webinterface_list.php');
|
||||
}
|
||||
if(isset($_POST['updatestyle']))
|
||||
{
|
||||
$language=$_POST["languagedb"];
|
||||
$dateformat=$_POST["dateformat"];
|
||||
$showexgrp=$_POST["showexgrp"];
|
||||
if($showexgrp=="on"){$showexgrp=1;}else{$showexgrp=0;}
|
||||
$showexcld=$_POST["showexcld"];
|
||||
if($showexcld=="on"){$showexcld=1;}else{$showexcld=0;}
|
||||
$showcolcld=$_POST["showcolcld"];
|
||||
if($showcolcld=="on"){$showcolcld=1;}else{$showcolcld=0;}
|
||||
$showcoluuid=$_POST["showcoluuid"];
|
||||
if($showcoluuid=="on"){$showcoluuid=1;}else{$showcoluuid=0;}
|
||||
$showcoldbid=$_POST["showcoldbid"];
|
||||
if($showcoldbid=="on"){$showcoldbid=1;}else{$showcoldbid=0;}
|
||||
$showcolot=$_POST["showcolot"];
|
||||
if($showcolot=="on"){$showcolot=1;}else{$showcolot=0;}
|
||||
$showcolit=$_POST["showcolit"];
|
||||
if($showcolit=="on"){$showcolit=1;}else{$showcolit=0;}
|
||||
$showcolat=$_POST["showcolat"];
|
||||
if($showcolat=="on"){$showcolat=1;}else{$showcolat=0;}
|
||||
$showcolnx=$_POST["showcolnx"];
|
||||
if($showcolnx=="on"){$showcolnx=1;}else{$showcolnx=0;}
|
||||
$showcolsg=$_POST["showcolsg"];
|
||||
if($showcolsg=="on"){$showcolsg=1;}else{$showcolsg=0;}
|
||||
$bgcolor=$_POST["bgcolor"];
|
||||
$hdcolor=$_POST["hdcolor"];
|
||||
$txcolor=$_POST["txcolor"];
|
||||
$hvcolor=$_POST["hvcolor"];
|
||||
$ifcolor=$_POST["ifcolor"];
|
||||
$wncolor=$_POST["wncolor"];
|
||||
$sccolor=$_POST["sccolor"];
|
||||
$showgen=$_POST["showgen"];
|
||||
if($showgen=="on"){$showgen=1;}else{$showgen=0;}
|
||||
include('lang.php');
|
||||
|
||||
if(!$mysqlcon->query("UPDATE config set language='$language',dateformat='$dateformat',showexgrp='$showexgrp',showexcld='$showexcld',showcolcld='$showcolcld',showcoluuid='$showcoluuid',showcoldbid='$showcoldbid',showcolot='$showcolot',showcolit='$showcolit',showcolat='$showcolat',showcolnx='$showcolnx',showcolsg='$showcolsg',bgcolor='$bgcolor',hdcolor='$hdcolor',txcolor='$txcolor',hvcolor='$hvcolor',ifcolor='$ifcolor',wncolor='$wncolor',sccolor='$sccolor',showgen='$showgen'"))
|
||||
{
|
||||
$alert='<wncolor>'.$lang['error'].$mysqlcon->error.'</wncolor>';
|
||||
}
|
||||
else
|
||||
{
|
||||
$alert='<sccolor>'.$lang['wisvsuc'].'</sccolor>';
|
||||
}
|
||||
require_once('other/webinterface_list.php');
|
||||
}
|
||||
if(isset($_POST['selectivclients']))
|
||||
{
|
||||
$seluuid=$_POST["selecteduuids"];
|
||||
$uuidarr=explode(',',$seluuid);
|
||||
$counttime=$_POST["counttime"];
|
||||
if($_POST["delclients"]=="on" && $seluuid!='' && $counttime==0)
|
||||
{
|
||||
require_once('ts3_lib/TeamSpeak3.php');
|
||||
$ts3_VirtualServer=TeamSpeak3::factory("serverquery://".$ts['user'].":".$ts['pass']."@".$ts['host'].":".$ts['query']."/?server_port=".$ts['voice']);
|
||||
try
|
||||
{
|
||||
$ts3_VirtualServer->selfUpdate(array('client_nickname'=>$queryname));
|
||||
}
|
||||
catch(Exception $e)
|
||||
{
|
||||
try
|
||||
{
|
||||
$ts3_VirtualServer->selfUpdate(array('client_nickname'=>$queryname2));
|
||||
}
|
||||
catch(Exception $e)
|
||||
{
|
||||
echo $lang['error'].$e->getCode().': '.$e->getMessage();
|
||||
}
|
||||
}
|
||||
foreach($uuidarr as $uuid)
|
||||
{
|
||||
if($_POST['delsrvgrp']=="on")
|
||||
{
|
||||
$dbremsgrp=$mysqlcon->query("SELECT cldbid,grpid from user where uuid='$uuid'");
|
||||
while($remsgrp=$dbremsgrp->fetch_assoc())
|
||||
{
|
||||
if($remsgrp["grpid"]!=0)
|
||||
{
|
||||
try
|
||||
{
|
||||
$ts3_VirtualServer->serverGroupClientDel($remsgrp["grpid"],$remsgrp["cldbid"]);
|
||||
}
|
||||
catch(Exception $e)
|
||||
{
|
||||
$alert=$alert.'<wncolor>'.sprintf($lang['errremgrp'],$uuid,$remsgrp["grpid"]).$e->getCode().': '.$e->getMessage().'</wncolor><br>';
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if(!$mysqlcon->query("DELETE FROM user WHERE uuid='$uuid'") || $mysqlcon->affected_rows==0)
|
||||
{
|
||||
$alert=$alert.'<wncolor>'.sprintf($lang['errremdb'],$uuid).$mysqlcon->error.'</wncolor><br>';
|
||||
}
|
||||
else
|
||||
{
|
||||
$alert=$alert.'<sccolor>'.sprintf($lang['sccrmcld'],$uuid).'</sccolor><br>';
|
||||
}
|
||||
}
|
||||
}
|
||||
elseif($_POST["delclients"]=="" && $seluuid!='' && $counttime!=0)
|
||||
{
|
||||
$dtF=new DateTime("@0");
|
||||
$dtT=new DateTime("@$counttime");
|
||||
$timecount=$dtF->diff($dtT)->format($timeformat);
|
||||
foreach($uuidarr as $uuid)
|
||||
{
|
||||
if(!$mysqlcon->query("UPDATE user SET count='$counttime' WHERE uuid='$uuid'") || $mysqlcon->affected_rows==0)
|
||||
{
|
||||
$alert=$alert.'<wncolor>'.sprintf($lang['errupcount'],$timecount,$uuid).$mysqlcon->error.'</wncolor><br>';
|
||||
}
|
||||
else
|
||||
{
|
||||
$alert=$alert.'<sccolor>'.sprintf($lang['sccupcount'],$uuid,$timecount).'</sccolor><br>';
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
echo $_POST["delclients"];
|
||||
$alert='<wncolor>error by choosing selections</wncolor>';
|
||||
}
|
||||
require_once('other/webinterface_list.php');
|
||||
}
|
||||
if(isset($_POST['globalclients']))
|
||||
{
|
||||
$selectbefore=$mysqlcon->query("SELECT count(*) from user");
|
||||
$before=$selectbefore->fetch_row();
|
||||
$cleantime=time() - $_POST["cleantime"];
|
||||
if($_POST['delsrvgrp']=="on")
|
||||
{
|
||||
require_once('ts3_lib/TeamSpeak3.php');
|
||||
$ts3_VirtualServer=TeamSpeak3::factory("serverquery://".$ts['user'].":".$ts['pass']."@".$ts['host'].":".$ts['query']."/?server_port=".$ts['voice']);
|
||||
try
|
||||
{
|
||||
$ts3_VirtualServer->selfUpdate(array('client_nickname'=>$queryname));
|
||||
}
|
||||
catch(Exception $e)
|
||||
{
|
||||
try
|
||||
{
|
||||
$ts3_VirtualServer->selfUpdate(array('client_nickname'=>$queryname2));
|
||||
}
|
||||
catch(Exception $e)
|
||||
{
|
||||
echo $lang['error'].$e->getCode().': '.$e->getMessage();
|
||||
}
|
||||
}
|
||||
$dbremsgrp=$mysqlcon->query("SELECT cldbid,grpid from user where lastseen<'$cleantime'");
|
||||
while($remsgrp=$dbremsgrp->fetch_assoc())
|
||||
{
|
||||
if($remsgrp["grpid"]!=0)
|
||||
{
|
||||
$ts3_VirtualServer->serverGroupClientDel($remsgrp["grpid"],$remsgrp["cldbid"]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if($_POST["cleantime"]<1)
|
||||
{
|
||||
$dbcount=$mysqlcon->query("DELETE from user");
|
||||
}
|
||||
else
|
||||
{
|
||||
$dbcount=$mysqlcon->query("DELETE from user where lastseen<'$cleantime'");
|
||||
}
|
||||
$selectafter=$mysqlcon->query("SELECT count(*) from user");
|
||||
$after=$selectafter->fetch_row();
|
||||
$countdel=$before[0] - $after[0];
|
||||
if($countdel==0)
|
||||
{
|
||||
$alert='<ifcolor>'.sprintf($lang['delclientsif'],$countdel).'</ifcolor>';
|
||||
}
|
||||
else
|
||||
{
|
||||
$alert='<sccolor>'.sprintf($lang['delclientssc'],$countdel).'</sccolor>';
|
||||
}
|
||||
require_once('other/webinterface_list.php');
|
||||
}
|
||||
if(is_file('install.php') || is_file('update_0-02.php') || is_file('update_0-10.php'))
|
||||
{
|
||||
echo sprintf($lang['isntwidel'],"<a href=\"webinterface.php\">webinterface.php</a>");
|
||||
}
|
||||
else
|
||||
{
|
||||
if(isset($_GET['logout'])=="true")
|
||||
{
|
||||
session_destroy();
|
||||
header("location:webinterface.php");
|
||||
}
|
||||
elseif(isset($_POST['abschicken']) || isset($_SESSION['username']))
|
||||
{
|
||||
$access=$mysqlcon->query("SELECT * FROM config");
|
||||
$access=$access->fetch_row();
|
||||
if(isset($_SESSION['username']) || ($_POST["username"]==$access[0] && $_POST["password"]==$access[1]))
|
||||
{
|
||||
$_SESSION['username']=$access[0];
|
||||
require_once('other/webinterface_list.php');
|
||||
}
|
||||
else
|
||||
{
|
||||
$showerrlogin=1;
|
||||
require_once('other/webinterface_login.php');
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
session_destroy();
|
||||
require_once('other/webinterface_login.php');
|
||||
}
|
||||
}
|
||||
?>
|
||||
429
worker.php
Normal file
429
worker.php
Normal file
@@ -0,0 +1,429 @@
|
||||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<title>TS-N.NET Ranksystem</title>
|
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
|
||||
<link rel="stylesheet" type="text/css" href="other/style.css.php" />
|
||||
<?PHP
|
||||
echo'</head><body>';
|
||||
$starttime=microtime(true);
|
||||
require_once('other/config.php');
|
||||
require_once('lang.php');
|
||||
require_once('ts3_lib/TeamSpeak3.php');
|
||||
|
||||
if (mysqli_connect_errno())
|
||||
{
|
||||
echo "Failed to connect to MySQL-Database: ".mysqli_connect_error();
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
$ts3_VirtualServer=TeamSpeak3::factory("serverquery://".$ts['user'].":".$ts['pass']."@".$ts['host'].":".$ts['query']."/?server_port=".$ts['voice']);
|
||||
|
||||
$nowtime=time();
|
||||
|
||||
try
|
||||
{
|
||||
$ts3_VirtualServer->selfUpdate(array('client_nickname'=>$queryname));
|
||||
}
|
||||
catch(Exception $e)
|
||||
{
|
||||
try
|
||||
{
|
||||
$ts3_VirtualServer->selfUpdate(array('client_nickname'=>$queryname2));
|
||||
echo $lang['queryname'].'<br><br>';
|
||||
}
|
||||
catch(Exception $e)
|
||||
{
|
||||
echo $lang['error'].$e->getCode().': '.$e->getMessage();
|
||||
}
|
||||
}
|
||||
|
||||
if($update==1)
|
||||
{
|
||||
$updatetime=$nowtime-$updateinfotime;
|
||||
$lastupdate=$mysqlcon->query("SELECT * FROM upcheck");
|
||||
$lastupdate=$lastupdate->fetch_row();
|
||||
if($lastupdate[0]<$updatetime)
|
||||
{
|
||||
$newversion=file_get_contents('http://ts-n.net/ranksystem/version');
|
||||
if(substr($newversion,0,4)!=substr($currvers,0,4))
|
||||
{
|
||||
echo'<b>'.$lang['upinf'].'</b><br>';
|
||||
foreach($uniqueid as $clientid)
|
||||
{
|
||||
try
|
||||
{
|
||||
$ts3_VirtualServer->clientGetByUid($clientid)->message(sprintf($lang['upmsg'],$currvers,$newversion));
|
||||
echo'<sccolor>'.sprintf($lang['upusrinf'],$clientid).'</sccolor><br>';
|
||||
}
|
||||
catch(Exception $e)
|
||||
{
|
||||
echo'<wncolor>'.sprintf($lang['upusrerr'],$clientid).'</wncolor><br>';
|
||||
}
|
||||
}
|
||||
echo'<br><br>';
|
||||
}
|
||||
if(!$mysqlcon->query("UPDATE upcheck SET timestamp=$nowtime"))
|
||||
{
|
||||
echo $lang['error'].'<wncolor>'.$mysqlcon->error.'.</wncolor><br>';
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
echo'<hdcolor><b>'.$lang['crawl'].'</b></hdcolor><br>';
|
||||
$dbdata=$mysqlcon->query("SELECT * FROM user");
|
||||
if($dbdata->num_rows==0)
|
||||
{
|
||||
echo $lang['firstuse'].'<br><br>';
|
||||
$uidarr[]="firstrun";
|
||||
$count=1;
|
||||
if(!$mysqlcon->query("INSERT INTO user (uuid, lastseen) VALUES ('lastscantime','$nowtime')"))
|
||||
{
|
||||
echo $lang['error'].'<wncolor>'.$mysqlcon->error.'.</wncolor><br>';
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if(!$mysqlcon->query("UPDATE user SET lastseen='$nowtime' WHERE uuid='lastscantime'"))
|
||||
{
|
||||
echo $lang['error'].'<wncolor>'.$mysqlcon->error.'.</wncolor><br>';
|
||||
}
|
||||
while($uuid=$dbdata->fetch_assoc())
|
||||
{
|
||||
$sqlhis[$uuid['uuid']]=array("cldbid"=>$uuid['cldbid'],"count"=>$uuid['count'],"lastseen"=>$uuid['lastseen'],"grpid"=>$uuid['grpid'],"nextup"=>$uuid['nextup'],"idle"=>$uuid['idle'],"cldgroup"=>$uuid['cldgroup']);
|
||||
$uidarr[]=$uuid['uuid'];
|
||||
}
|
||||
}
|
||||
|
||||
$allclients=$ts3_VirtualServer->clientList();
|
||||
$ts3groups=$ts3_VirtualServer->serverGroupList();
|
||||
$yetonline[]='';
|
||||
$insertdata='';
|
||||
krsort($grouptime);
|
||||
$nextupforinsert = key($grouptime) - 1;
|
||||
foreach($allclients as $client)
|
||||
{
|
||||
$sumentries++;
|
||||
$cldbid=$client['client_database_id'];
|
||||
$ip=ip2long($client['connection_client_ip']);
|
||||
$name=htmlspecialchars($client['client_nickname'],ENT_QUOTES);
|
||||
$uid=htmlspecialchars($client['client_unique_identifier'],ENT_QUOTES);
|
||||
$cldgroup=$client['client_servergroups'];
|
||||
$sgroups=explode(",",$cldgroup);
|
||||
if(!in_array($uid,$yetonline) && $client['client_version']!="ServerQuery")
|
||||
{
|
||||
$clientidle=floor($client['client_idle_time'] / 1000);
|
||||
$yetonline[]=$uid;
|
||||
if(in_array($uid,$uidarr))
|
||||
{
|
||||
$idle=$sqlhis[$uid]["idle"]+$clientidle;
|
||||
$grpid=$sqlhis[$uid]["grpid"];
|
||||
$nextup=$sqlhis[$uid]["nextup"];
|
||||
if($sqlhis[$uid]["cldbid"]!=$cldbid && $resetbydbchange==1)
|
||||
{
|
||||
echo'<wncolor>'.sprintf($lang['changedbid'],$name,$uid,$cldbid,$sqlhis[$uid]["cldbid"]).'</wncolor><br>';
|
||||
$count=1;
|
||||
$idle=0;
|
||||
}
|
||||
else
|
||||
{
|
||||
$count=$nowtime-$sqlhis["lastscantime"]["lastseen"]+$sqlhis[$uid]["count"];
|
||||
if($clientidle>($nowtime - $sqlhis["lastscantime"]["lastseen"]))
|
||||
{
|
||||
$idle=$nowtime - $sqlhis["lastscantime"]["lastseen"]+$sqlhis[$uid]["idle"];
|
||||
}
|
||||
}
|
||||
$dtF=new DateTime("@0");
|
||||
if($substridle==1)
|
||||
{
|
||||
$activetime=$count - $idle;
|
||||
}
|
||||
else
|
||||
{
|
||||
$activetime=$count;
|
||||
}
|
||||
$dtT=new DateTime("@$activetime");
|
||||
foreach($grouptime as $time => $groupid)
|
||||
{
|
||||
if(in_array($groupid,$sgroups))
|
||||
{
|
||||
$grpid=$groupid;
|
||||
break;
|
||||
}
|
||||
}
|
||||
foreach($grouptime as $time => $groupid)
|
||||
{
|
||||
|
||||
if($activetime>$time && !in_array($uid, $exceptuuid) && !array_intersect($sgroups, $exceptgroup))
|
||||
{
|
||||
if($sqlhis[$uid]["grpid"]!=$groupid)
|
||||
{
|
||||
if($sqlhis[$uid]["grpid"]!=0 && in_array($sqlhis[$uid]["grpid"],$sgroups))
|
||||
{
|
||||
try
|
||||
{
|
||||
$ts3_VirtualServer->serverGroupClientDel($sqlhis[$uid]["grpid"],$cldbid);
|
||||
echo'<sifcolor>'.sprintf($lang['sgrprm'],$sqlhis[$uid]["grpid"],$name,$uid,$cldbid).'</ifcolor><br>';
|
||||
}
|
||||
catch(Exception $e)
|
||||
{
|
||||
echo'<wncolor>'.sprintf($lang['sgrprerr'],$name,$uid,$cldbid).'</wncolor><br>';
|
||||
}
|
||||
}
|
||||
if(!in_array($groupid,$sgroups))
|
||||
{
|
||||
try
|
||||
{
|
||||
$ts3_VirtualServer->serverGroupClientAdd($groupid,$cldbid);
|
||||
echo'<ifcolor>'.sprintf($lang['sgrpadd'],$groupid,$name,$uid,$cldbid).'</ifcolor><br>';
|
||||
}
|
||||
catch(Exception $e)
|
||||
{
|
||||
echo'<wncolor>'.sprintf($lang['sgrprerr'],$name,$uid,$cldbid).'</wncolor><br>';
|
||||
}
|
||||
}
|
||||
$grpid=$groupid;
|
||||
if($msgtouser==1)
|
||||
{
|
||||
$days=$dtF->diff($dtT)->format('%a');
|
||||
$hours=$dtF->diff($dtT)->format('%h');
|
||||
$mins=$dtF->diff($dtT)->format('%i');
|
||||
$secs=$dtF->diff($dtT)->format('%s');
|
||||
if($substridle==1)
|
||||
{
|
||||
$ts3_VirtualServer->clientGetByUid($uid)->message(sprintf($lang['usermsgactive'],$days,$hours,$mins,$secs));
|
||||
}
|
||||
else
|
||||
{
|
||||
$ts3_VirtualServer->clientGetByUid($uid)->message(sprintf($lang['usermsgonline'],$days,$hours,$mins,$secs));
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
$nextup=$time - $activetime;
|
||||
}
|
||||
}
|
||||
$updatedata[]=array("uuid"=>$uid,"cldbid"=>$cldbid,"count"=>$count,"ip"=>$ip,"name"=>$name,"lastseen"=>$nowtime,"grpid"=>$grpid,"nextup"=>$nextup,"idle"=>$idle,"cldgroup"=>$cldgroup);
|
||||
echo sprintf($lang['upuser'],$name,$uid,$cldbid,$count,$activetime).'<br>';
|
||||
}
|
||||
else
|
||||
{
|
||||
$grpid='0';
|
||||
foreach($grouptime as $time => $groupid)
|
||||
{
|
||||
if(in_array($groupid,$sgroups))
|
||||
{
|
||||
$grpid=$groupid;
|
||||
break;
|
||||
}
|
||||
}
|
||||
$insertdata[]=array("uuid"=>$uid,"cldbid"=>$cldbid,"count"=>"1","ip"=>$ip,"name"=>$name,"lastseen"=>$nowtime,"grpid"=>$grpid,"nextup"=>$nextupforinsert,"cldgroup"=>$cldgroup);
|
||||
echo'<sccolor>'.sprintf($lang['adduser'],$name,$uid,$cldbid).'</sccolor><br>';
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
echo'<wncolor>'.sprintf($lang['nocount'],$name,$uid,$cldbid).'</wncolor><br>';
|
||||
}
|
||||
}
|
||||
|
||||
if(!$mysqlcon->query("UPDATE user SET online=''"))
|
||||
{
|
||||
echo $lang['error'].'<wncolor>'.$mysqlcon->error.'.</wncolor><br>';
|
||||
}
|
||||
|
||||
if($insertdata!='')
|
||||
{
|
||||
$allinsertdata='';
|
||||
foreach($insertdata as $insertarr)
|
||||
{
|
||||
$allinsertdata=$allinsertdata."('".$insertarr["uuid"]."', '".$insertarr["cldbid"]."', '".$insertarr["count"]."', '".$insertarr["ip"]."', '".$insertarr["name"]."', '".$insertarr["lastseen"]."', '".$insertarr["grpid"]."', '".$insertarr["nextup"]."', '".$insertarr["cldgroup"]."','1'),";
|
||||
}
|
||||
$allinsertdata=substr($allinsertdata,0,-1);
|
||||
|
||||
if($allinsertdata!='')
|
||||
{
|
||||
if(!$mysqlcon->query("INSERT INTO user (uuid, cldbid, count, ip, name, lastseen, grpid, nextup, cldgroup, online) VALUES $allinsertdata"))
|
||||
{
|
||||
echo $lang['error'].'<wncolor>'.$mysqlcon->error.'.</wncolor><br>';
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if($updatedata!=0)
|
||||
{
|
||||
$allupdateuuid='';
|
||||
$allupdatecldbid='';
|
||||
$allupdatecount='';
|
||||
$allupdateip='';
|
||||
$allupdatename='';
|
||||
$allupdatelastseen='';
|
||||
$allupdategrpid='';
|
||||
$allupdatenextup='';
|
||||
$allupdateidle='';
|
||||
$allupdatecldgroup='';
|
||||
foreach($updatedata as $updatearr)
|
||||
{
|
||||
$allupdateuuid=$allupdateuuid."'".$updatearr["uuid"]."',";
|
||||
$allupdatecldbid=$allupdatecldbid."WHEN '".$updatearr["uuid"]."' THEN '".$updatearr["cldbid"]."' ";
|
||||
$allupdatecount=$allupdatecount."WHEN '".$updatearr["uuid"]."' THEN '".$updatearr["count"]."' ";
|
||||
$allupdateip=$allupdateip."WHEN '".$updatearr["uuid"]."' THEN '".$updatearr["ip"]."' ";
|
||||
$allupdatename=$allupdatename."WHEN '".$updatearr["uuid"]."' THEN '".$updatearr["name"]."' ";
|
||||
$allupdatelastseen=$allupdatelastseen."WHEN '".$updatearr["uuid"]."' THEN '".$updatearr["lastseen"]."' ";
|
||||
$allupdategrpid=$allupdategrpid."WHEN '".$updatearr["uuid"]."' THEN '".$updatearr["grpid"]."' ";
|
||||
$allupdatenextup=$allupdatenextup."WHEN '".$updatearr["uuid"]."' THEN '".$updatearr["nextup"]."' ";
|
||||
$allupdateidle=$allupdateidle."WHEN '".$updatearr["uuid"]."' THEN '".$updatearr["idle"]."' ";
|
||||
$allupdatecldgroup=$allupdatecldgroup."WHEN '".$updatearr["uuid"]."' THEN '".$updatearr["cldgroup"]."' ";
|
||||
}
|
||||
$allupdateuuid=substr($allupdateuuid,0,-1);
|
||||
|
||||
if(!$mysqlcon->query("UPDATE user set cldbid = CASE uuid $allupdatecldbid END, count = CASE uuid $allupdatecount END, ip = CASE uuid $allupdateip END, name = CASE uuid $allupdatename END, lastseen = CASE uuid $allupdatelastseen END, grpid = CASE uuid $allupdategrpid END, nextup = CASE uuid $allupdatenextup END, idle = CASE uuid $allupdateidle END, cldgroup = CASE uuid $allupdatecldgroup END, online = 1 WHERE uuid IN ($allupdateuuid)"))
|
||||
{
|
||||
echo $lang['error'].'<wncolor>this'.$mysqlcon->error.'.</wncolor><br>';
|
||||
}
|
||||
}
|
||||
|
||||
$dbdata=$mysqlcon->query("SELECT * FROM user WHERE online<>1");
|
||||
if($dbdata->num_rows!=0)
|
||||
{
|
||||
while($uuid=$dbdata->fetch_assoc())
|
||||
{
|
||||
$idle=$uuid["idle"];
|
||||
$count=$uuid["count"];
|
||||
$grpid=$uuid["grpid"];
|
||||
$cldgroup=$uuid['cldgroup'];
|
||||
$sgroups=explode(",",$cldgroup);
|
||||
if($substridle==1)
|
||||
{
|
||||
$activetime=$count - $idle;
|
||||
$dtF=new DateTime("@0");
|
||||
$dtT=new DateTime("@$activetime");
|
||||
}
|
||||
else
|
||||
{
|
||||
$activetime=$count;
|
||||
$dtF=new DateTime("@0");
|
||||
$dtT=new DateTime("@$count");
|
||||
}
|
||||
foreach($grouptime as $time => $groupid)
|
||||
{
|
||||
if($activetime>$time)
|
||||
{
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
$nextup=$time - $activetime;
|
||||
}
|
||||
}
|
||||
if($uuid['uuid']!="lastscantime")
|
||||
{
|
||||
$updatenextup[]=array("uuid"=>$uuid['uuid'],"nextup"=>$nextup);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if($updatenextup!=0)
|
||||
{
|
||||
$allupdateuuid='';
|
||||
$allupdatenextup='';
|
||||
foreach($updatenextup as $updatedata)
|
||||
{
|
||||
$allupdateuuid=$allupdateuuid."'".$updatedata["uuid"]."',";
|
||||
$allupdatenextup=$allupdatenextup."WHEN '".$updatedata["uuid"]."' THEN '".$updatedata["nextup"]."' ";
|
||||
}
|
||||
$allupdateuuid=substr($allupdateuuid,0,-1);
|
||||
|
||||
if(!$mysqlcon->query("UPDATE user set nextup = CASE uuid $allupdatenextup END WHERE uuid IN ($allupdateuuid)"))
|
||||
{
|
||||
echo $lang['error'].'<wncolor>'.$mysqlcon->error.'.</wncolor><br>';
|
||||
}
|
||||
}
|
||||
|
||||
$dbgroups=$mysqlcon->query("SELECT * FROM groups");
|
||||
if($dbgroups->num_rows==0)
|
||||
{
|
||||
$sqlhisgroup="empty";
|
||||
}
|
||||
else
|
||||
{
|
||||
while($servergroup=$dbgroups->fetch_assoc())
|
||||
{
|
||||
$sqlhisgroup[$servergroup['sgid']]=$servergroup['sgidname'];
|
||||
}
|
||||
}
|
||||
|
||||
foreach($ts3groups as $servergroup)
|
||||
{
|
||||
if($sqlhisgroup!="empty")
|
||||
{
|
||||
foreach($sqlhisgroup as $sgid => $sname)
|
||||
{
|
||||
if($sgid==$servergroup['sgid'])
|
||||
{
|
||||
$gefunden=1;
|
||||
$updategroups[]=array("sgid"=>$servergroup['sgid'],"sgidname"=>$servergroup['name']);
|
||||
break;
|
||||
}
|
||||
}
|
||||
if($gefunden!=1)
|
||||
{
|
||||
$insertgroups[]=array("sgid"=>$servergroup['sgid'],"sgidname"=>$servergroup['name']);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$insertgroups[]=array("sgid"=>$servergroup['sgid'],"sgidname"=>$servergroup['name']);
|
||||
}
|
||||
}
|
||||
if($insertgroups!='')
|
||||
{
|
||||
$allinsertdata='';
|
||||
foreach($insertgroups as $insertarr)
|
||||
{
|
||||
$allinsertdata=$allinsertdata."('".$insertarr["sgid"]."', '".$insertarr["sgidname"]."'),";
|
||||
}
|
||||
$allinsertdata=substr($allinsertdata,0,-1);
|
||||
|
||||
if($allinsertdata!='')
|
||||
{
|
||||
if(!$mysqlcon->query("INSERT INTO groups (sgid, sgidname) VALUES $allinsertdata"))
|
||||
{
|
||||
echo $lang['error'].'<wncolor>'.$mysqlcon->error.'.</wncolor><br>';
|
||||
}
|
||||
}
|
||||
}
|
||||
if($updategroups!=0)
|
||||
{
|
||||
$allsgids='';
|
||||
$allupdatesgid='';
|
||||
foreach($updategroups as $updatedata)
|
||||
{
|
||||
$allsgids=$allsgids."'".$updatedata["sgid"]."',";
|
||||
$allupdatesgid=$allupdatesgid."WHEN '".$updatedata["sgid"]."' THEN '".$updatedata["sgidname"]."' ";
|
||||
}
|
||||
$allsgids=substr($allsgids,0,-1);
|
||||
|
||||
if(!$mysqlcon->query("UPDATE groups set sgidname = CASE sgid $allupdatesgid END WHERE sgid IN ($allsgids)"))
|
||||
{
|
||||
echo $lang['error'].'<wncolor>'.$mysqlcon->error.'.</wncolor><br>';
|
||||
}
|
||||
}
|
||||
}
|
||||
catch(Exception $e)
|
||||
{
|
||||
echo $lang['error'].$e->getCode().': '.$e->getMessage();
|
||||
}
|
||||
|
||||
if($showgen==1)
|
||||
{
|
||||
$buildtime=microtime(true)-$starttime;
|
||||
echo'<br>'.sprintf($lang['sitegen'],$buildtime,$sumentries).'<br>';
|
||||
}
|
||||
?>
|
||||
</body>
|
||||
</html>
|
||||
Reference in New Issue
Block a user