diff --git a/install.php b/install.php index f5023ad..1b3f7e2 100644 --- a/install.php +++ b/install.php @@ -1,6 +1,6 @@  @@ -194,7 +194,7 @@ $db[\'dbname\']=\''.$dbname.'\'; $count++; } - if($mysqlcon->exec("INSERT INTO `$dbname`.`addons_config` (`param`,`value`) VALUES ('assign_groups_active','0'),('assign_groups_groupids',''),('assign_groups_limit','')") === false) { + if($mysqlcon->exec("INSERT INTO `$dbname`.`addons_config` (`param`,`value`) VALUES ('assign_groups_active','0'),('assign_groups_excepted_groupids',''),('assign_groups_groupids',''),('assign_groups_limit','')") === false) { $err_msg .= $lang['isntwidbmsg'].$mysqlcon->errorCode()." ".print_r($mysqlcon->errorInfo(), true).'
'; $err_lvl = 2; $count++; } diff --git a/jobs/calc_userstats.php b/jobs/calc_userstats.php index 1610ed3..53b6822 100644 --- a/jobs/calc_userstats.php +++ b/jobs/calc_userstats.php @@ -14,11 +14,6 @@ function calc_userstats($ts3,$mysqlcon,$cfg,$dbname,&$db_cache) { } $sqlhis = array_slice($db_cache['all_user'],$job_begin ,10); - - $sqlfile = $cfg['logs_path'].'temp_sqlhis.sql'; - $sqldump = fopen($sqlfile, 'wa+'); - fwrite($sqldump, DateTime::createFromFormat('U.u', number_format(microtime(true), 6, '.', ''))->setTimeZone(new DateTimeZone($cfg['logs_timezone']))->format("Y-m-d H:i:s.u ").' SQL: '.print_r($sqlhis, true)."\n"); - fclose($sqldump); $cldbids = ''; foreach ($sqlhis as $uuid => $userstats) { @@ -38,37 +33,37 @@ function calc_userstats($ts3,$mysqlcon,$cfg,$dbname,&$db_cache) { } $allupdateuuid = ''; - + foreach ($sqlhis as $uuid => $userstats) { check_shutdown($cfg); usleep($cfg['teamspeak_query_command_delay']); + + $keybase = array_search($db_cache['job_check']['last_snapshot_id']['timestamp'], array_column($userdata[$userstats['cldbid']], 'id')); + $keyweek = array_search($weekago, array_column($userdata[$userstats['cldbid']], 'id')); + $keymonth = array_search($monthago, array_column($userdata[$userstats['cldbid']], 'id')); + + if(isset($userdata[$userstats['cldbid']]) && isset($userdata[$userstats['cldbid']][$keyweek]) && $userdata[$userstats['cldbid']][$keyweek]['id'] == $weekago) { + $count_week = $userdata[$userstats['cldbid']][$keybase]['count'] - $userdata[$userstats['cldbid']][$keyweek]['count']; + $idle_week = $userdata[$userstats['cldbid']][$keybase]['idle'] - $userdata[$userstats['cldbid']][$keyweek]['idle']; + $active_week = $count_week - $idle_week; + } else { + $count_week = 0; + $idle_week = 0; + $active_week = 0; + } + if(isset($userdata[$userstats['cldbid']]) && isset($userdata[$userstats['cldbid']][$keymonth]) && $userdata[$userstats['cldbid']][$keymonth]['id'] == $monthago) { + $count_month = $userdata[$userstats['cldbid']][$keybase]['count'] - $userdata[$userstats['cldbid']][$keymonth]['count']; + $idle_month = $userdata[$userstats['cldbid']][$keybase]['idle'] - $userdata[$userstats['cldbid']][$keymonth]['idle']; + $active_month = $count_month - $idle_month; + } else { + $count_month = 0; + $idle_month = 0; + $active_month = 0; + } + try { $clientinfo = $ts3->clientInfoDb($userstats['cldbid']); - $keybase = array_search($db_cache['job_check']['last_snapshot_id']['timestamp'], array_column($userdata[$userstats['cldbid']], 'id')); - $keyweek = array_search($weekago, array_column($userdata[$userstats['cldbid']], 'id')); - $keymonth = array_search($monthago, array_column($userdata[$userstats['cldbid']], 'id')); - - if(isset($userdata[$userstats['cldbid']]) && isset($userdata[$userstats['cldbid']][$keyweek]) && $userdata[$userstats['cldbid']][$keyweek]['id'] == $weekago) { - $count_week = $userdata[$userstats['cldbid']][$keybase]['count'] - $userdata[$userstats['cldbid']][$keyweek]['count']; - $idle_week = $userdata[$userstats['cldbid']][$keybase]['idle'] - $userdata[$userstats['cldbid']][$keyweek]['idle']; - $active_week = $count_week - $idle_week; - } else { - $count_week = 0; - $idle_week = 0; - $active_week = 0; - } - if(isset($userdata[$userstats['cldbid']]) && isset($userdata[$userstats['cldbid']][$keymonth]) && $userdata[$userstats['cldbid']][$keymonth]['id'] == $monthago) { - $count_month = $userdata[$userstats['cldbid']][$keybase]['count'] - $userdata[$userstats['cldbid']][$keymonth]['count']; - $idle_month = $userdata[$userstats['cldbid']][$keybase]['idle'] - $userdata[$userstats['cldbid']][$keymonth]['idle']; - $active_month = $count_month - $idle_month; - } else { - $count_month = 0; - $idle_month = 0; - $active_month = 0; - } - $clientdesc = $mysqlcon->quote($clientinfo['client_description'], ENT_QUOTES); if($clientinfo['client_totalconnections'] > 16777215) $clientinfo['client_totalconnections'] = 16777215; - $allupdateuuid .= "('$uuid',$count_week,$count_month,$idle_week,$idle_month,$active_week,$active_month,{$clientinfo['client_totalconnections']},'{$clientinfo['client_base64HashClientUID']}',{$clientinfo['client_total_bytes_uploaded']},{$clientinfo['client_total_bytes_downloaded']},$clientdesc,$nowtime),"; } catch (Exception $e) { if($e->getCode() == 512 || $e->getCode() == 1281) { enter_logfile($cfg,6,"Client (uuid: ".$uuid." cldbid: ".$userstats['cldbid'].") known by Ranksystem is missing in TS database, perhaps its already deleted or cldbid changed. Try to search for client by uuid."); @@ -78,10 +73,19 @@ function calc_userstats($ts3,$mysqlcon,$cfg,$dbname,&$db_cache) { enter_logfile($cfg,4," Client (uuid: ".$uuid." cldbid: ".$userstats['cldbid'].") known by the Ranksystem changed its cldbid. New cldbid is ".$getcldbid[0]."."); if($cfg['rankup_client_database_id_change_switch'] == 1) { $db_cache['all_user'][$uuid]['cldbid'] = $getcldbid[0]; - $sqlexec .= "UPDATE `$dbname`.`user` SET `count`=0,`idle`=0 WHERE `uuid`='$uuid';\nUPDATE `$dbname`.`stats_user` SET `count_week`=0,`count_month`=0,`idle_week`=0,`idle_month`=0,`achiev_time`=0,`achiev_time_perc`=0,`active_week`=0,`active_month`=0 WHERE `uuid`='$uuid';\nDELETE FROM `$dbname`.`user_snapshot` WHERE `cldbid`='{$userstats['cldbid']}';\n"; + $sqlexec .= "UPDATE `$dbname`.`user` SET `count`=0,`idle`=0 WHERE `uuid`='$uuid';\nUPDATE `$dbname`.`stats_user` SET `count_week`=0,`count_month`=0,`idle_week`=0,`idle_month`=0,`active_week`=0,`active_month`=0 WHERE `uuid`='$uuid';\nDELETE FROM `$dbname`.`user_snapshot` WHERE `cldbid`='{$userstats['cldbid']}';\n"; enter_logfile($cfg,4," ".sprintf($lang['changedbid'], $userstats['name'], $uuid, $userstats['cldbid'], $getcldbid[0])); } else { $sqlexec .= "UPDATE `$dbname`.`user` SET `cldbid`={$getcldbid[0]} WHERE `uuid`='$uuid';\n"; + // select current user_snapshot entries and insert this with the new database-ID + foreach($userdata[$userstats['cldbid']] as $id => $data) { + $allinsert .= "('{$getcldbid[0]}',$id,{$data['count']},{$data['idle']}),"; + } + if ($allinsert != '') { + $allinsert = substr($allinsert, 0, -1); + $sqlexec .= "INSERT INTO `$dbname`.`user_snapshot` (`cldbid`,`id`,`count`,`idle`) VALUES $allinsert ON DUPLICATE KEY UPDATE `count_week`=VALUES(`count_week`),`count_month`=VALUES(`count_month`),`idle_week`=VALUES(`idle_week`);\nDELETE FROM `$dbname`.`user_snapshot` WHERE `cldbid`='{$userstats['cldbid']}';\n"; + } + unset($allinsert); enter_logfile($cfg,4," Store new cldbid ".$getcldbid[0]." for client (uuid: ".$uuid." old cldbid: ".$userstats['cldbid'].")"); } } else { @@ -91,13 +95,19 @@ function calc_userstats($ts3,$mysqlcon,$cfg,$dbname,&$db_cache) { if($e->getCode() == 2568) { enter_logfile($cfg,4,$e->getCode() . ': ' . $e->getMessage()."; Error due command clientdbfind (permission: b_virtualserver_client_dbsearch needed)."); } else { - enter_logfile($cfg,6,$e->getCode() . ': ' . $e->getMessage()."; Client (uuid: ".$uuid." cldbid: ".$userstats['cldbid'].") is missing in TS database, it seems to be deleted. Run !clean to correct this."); + enter_logfile($cfg,6,$e->getCode() . ': ' . $e->getMessage()."; Client (uuid: ".$uuid." cldbid: ".$userstats['cldbid'].") is missing in TS database, it seems to be deleted. Run the !clean command to correct this."); + $sqlexec .= "UPDATE `$dbname`.`stats_user` SET `count_week`=0,`count_month`=0,`idle_week`=0,`idle_month`=0,`active_week`=0,`active_month`=0,`removed`=1 WHERE `uuid`='$uuid';\n"; } } } else { enter_logfile($cfg,2,$lang['errorts3'].$e->getCode().': '.$e->getMessage()."; Error due command clientdbinfo for client-database-ID {$userstats['cldbid']} (permission: b_virtualserver_client_dbinfo needed)."); } + + $clientdesc = $clientinfo['client_base64HashClientUID'] = $mysqlcon->quote('', ENT_QUOTES); + $clientinfo['client_totalconnections'] = $clientinfo['client_total_bytes_uploaded'] = $clientinfo['client_total_bytes_downloaded'] = 0; } + + $allupdateuuid .= "('$uuid',$count_week,$count_month,$idle_week,$idle_month,$active_week,$active_month,{$clientinfo['client_totalconnections']},'{$clientinfo['client_base64HashClientUID']}',{$clientinfo['client_total_bytes_uploaded']},{$clientinfo['client_total_bytes_downloaded']},$clientdesc,$nowtime),"; } unset($sqlhis,$userdataweekbegin,$userdataend,$userdatamonthbegin,$clientinfo,$count_week,$idle_week,$active_week,$count_month,$idle_month,$active_month,$clientdesc); diff --git a/jobs/check_db.php b/jobs/check_db.php index 99f4d11..d1eee21 100644 --- a/jobs/check_db.php +++ b/jobs/check_db.php @@ -1,6 +1,6 @@ exec("DELETE FROM `$dbname`.`admin_addtime`;") === false) { } - if($mysqlcon->exec("DELETE FROM `$dbname`.`addon_assign_groups`;") === false) { } - if($mysqlcon->exec("ALTER TABLE `$dbname`.`stats_user` ADD COLUMN `last_calculated` int(10) UNSIGNED NOT NULL default '0';") === false) { } else { enter_logfile($cfg,4," [1.3.10] Added new stats_user values."); } - if($mysqlcon->exec("ALTER TABLE `$dbname`.`stats_user` MODIFY COLUMN `total_connections` MEDIUMINT(8) UNSIGNED NOT NULL default '0';") === false) { } else { enter_logfile($cfg,4," [1.3.10] Adjusted table stats_user successfully."); } + } + + if(version_compare($cfg['version_current_using'], '1.3.11', '<')) { + if($mysqlcon->exec("DELETE FROM `$dbname`.`admin_addtime`;") === false) { } + if($mysqlcon->exec("DELETE FROM `$dbname`.`addon_assign_groups`;") === false) { } + + if($mysqlcon->exec("INSERT INTO `$dbname`.`addons_config` (`param`,`value`) VALUES ('assign_groups_excepted_groupids','');") === false) { } else { + enter_logfile($cfg,4," [1.3.11] Adjusted table addons_config successfully."); + } if($mysqlcon->exec("CREATE INDEX `snapshot_id` ON `$dbname`.`user_snapshot` (`id`)") === false) { } if($mysqlcon->exec("CREATE INDEX `snapshot_cldbid` ON `$dbname`.`user_snapshot` (`cldbid`)") === false) { } diff --git a/jobs/reset_rs.php b/jobs/reset_rs.php index 3cae15e..b24ca2c 100644 --- a/jobs/reset_rs.php +++ b/jobs/reset_rs.php @@ -80,7 +80,7 @@ function reset_rs($ts3,$mysqlcon,$lang,$cfg,$dbname,&$db_cache) { } else { enter_logfile($cfg,4," Reset Server statistics summary (table: stats_server)"); } - if($mysqlcon->exec("UPDATE `$dbname`.`stats_user` SET `rank`='0', `count_week`='0', `count_month`='0', `idle_week`='0', `idle_month`='0', `achiev_count`='0', `achiev_time`='0', `achiev_connects`='0', `achiev_time_perc`='0', `achiev_connects_perc`='0', `total_connections`='0', `active_week`='0', `active_month`='0';") === false) { + if($mysqlcon->exec("UPDATE `$dbname`.`stats_user` SET `count_week`='0', `count_month`='0', `idle_week`='0', `idle_month`='0', `total_connections`='0', `active_week`='0', `active_month`='0';") === false) { enter_logfile($cfg,2," Executing SQL commands failed: ".print_r($mysqlcon->errorInfo(), true)); $err++; } else { diff --git a/languages/core_ar_العربية_arab.php b/languages/core_ar_العربية_arab.php index bacb209..dbeaba5 100644 --- a/languages/core_ar_العربية_arab.php +++ b/languages/core_ar_العربية_arab.php @@ -5,6 +5,7 @@ $lang['adduser'] = "User %s (unique Client-ID: %s; Client-database-ID %s) is u $lang['api'] = "API"; $lang['apikey'] = "API Key"; $lang['asc'] = "ascending"; +$lang['autooff'] = "autostart is deactivated"; $lang['botoff'] = "Bot is stopped."; $lang['boton'] = "Bot is running..."; $lang['brute'] = "Much incorrect logins detected on the webinterface. Blocked login for 300 seconds! Last access from IP %s."; @@ -151,6 +152,8 @@ $lang['stag0014'] = "Turn the Addon on (enabled) or off (disabled).

On $lang['stag0015'] = "%sيمكن العثور على TeamSpeak%s. يرجى النقر هنا للتحقق من نفسك أولا."; $lang['stag0016'] = "verification needed!"; $lang['stag0017'] = "verificate here.."; +$lang['stag0018'] = "A list of excepted servergroups. If a user owns one of this servergroups, he will not be able to use the Add-on."; +$lang['stag0019'] = "You are excepted from this function because you own the servergroup: %s (ID: %s)."; $lang['stix0001'] = "حالة الخادم"; $lang['stix0002'] = "مجموع المستخدمين"; $lang['stix0003'] = "عرض التفاصيل"; @@ -528,8 +531,12 @@ $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['wishhicld'] = "Clients in highest Level"; $lang['wishhiclddesc'] = "Show clients in list_rankup.php, which reached the highest level in the Ranksystem."; -$lang['wishmax'] = "show max. Clients"; -$lang['wishmaxdesc'] = "Show the max. Clients as line inside the server usage graph on 'stats/' page."; +$lang['wishmax'] = "Server usage graph"; +$lang['wishmax0'] = "show all stats"; +$lang['wishmax1'] = "hide max. clients"; +$lang['wishmax2'] = "hide channel"; +$lang['wishmax3'] = "hide max. clients + channel"; +$lang['wishmaxdesc'] = "Choose which stats should be displayed on the server usage graph on 'stats/' page.

By default, all stats are visible. You can hide here some stats, if needed."; $lang['wishnav'] = "show site-navigation"; $lang['wishnavdesc'] = "Show the site navigation on 'stats/' page.

If this option is deactivated on the stats page the site navigation will be hidden.
You can then take each site i.e. 'stats/list_rankup.php' and embed this as frame in your existing website or bulletin board."; $lang['wishsort'] = "default sorting order"; diff --git a/languages/core_az_Azərbaycan_az.php b/languages/core_az_Azərbaycan_az.php index 65fc770..07733d0 100644 --- a/languages/core_az_Azərbaycan_az.php +++ b/languages/core_az_Azərbaycan_az.php @@ -5,6 +5,7 @@ $lang['adduser'] = "%s istifadəçisi % (unikal Müştəri-ID: %s; Müştəri $lang['api'] = "API"; $lang['apikey'] = "API Key"; $lang['asc'] = "yüksələn"; +$lang['autooff'] = "autostart is deactivated"; $lang['botoff'] = "Bot dayandırılıb."; $lang['boton'] = "Bot çalışır..."; $lang['brute'] = "Veb interfeysə çox yanlış girişlər aşkar olundu. Giriş 300 saniyə ərzində bloklandı! IP %s ünvanından giriş oldu."; @@ -151,6 +152,8 @@ $lang['stag0014'] = "Əlavəni aktivləşdirin və ya söndürün.

Əla $lang['stag0015'] = "TeamSpeak serverində tapıla bilmədiniz. Xahiş edirik, burada özünüzü doğrulamaq üçün %sburaya basın%s."; $lang['stag0016'] = "Onaysız!"; $lang['stag0017'] = "Onaylama"; +$lang['stag0018'] = "A list of excepted servergroups. If a user owns one of this servergroups, he will not be able to use the Add-on."; +$lang['stag0019'] = "You are excepted from this function because you own the servergroup: %s (ID: %s)."; $lang['stix0001'] = "Server statistika"; $lang['stix0002'] = "Ümumi istifadəçi"; $lang['stix0003'] = "Ətraflı məlumat"; @@ -528,8 +531,12 @@ $lang['wishexgrp'] = "istisna qruplar"; $lang['wishexgrpdesc'] = "Müştərilərə göstər list_rankup.php, siyahıda olanlar 'client exception' və shouldn't Ranksystem üçün nəzərə alınmalıdır."; $lang['wishhicld'] = "Ən yüksək səviyyəli müştərilər"; $lang['wishhiclddesc'] = "Müştərilərə göstər list_rankup.php, Ranksystem-da ən yüksək səviyyəyə çatdı."; -$lang['wishmax'] = "show max. Clients"; -$lang['wishmaxdesc'] = "Show the max. Clients as line inside the server usage graph on 'stats/' page."; +$lang['wishmax'] = "Server usage graph"; +$lang['wishmax0'] = "show all stats"; +$lang['wishmax1'] = "hide max. clients"; +$lang['wishmax2'] = "hide channel"; +$lang['wishmax3'] = "hide max. clients + channel"; +$lang['wishmaxdesc'] = "Choose which stats should be displayed on the server usage graph on 'stats/' page.

By default, all stats are visible. You can hide here some stats, if needed."; $lang['wishnav'] = "sayt-naviqasiya göstər"; $lang['wishnavdesc'] = "Saytın naviqasiyasını göstər 'stats/' səhifəsi.

Bu seçim stats səhifəsində ləğv olunarsa, sayt naviqasiyası gizlənəcəkdir.
Daha sonra hər bir saytı məs. 'stats/list_rankup.php' və mövcud saytda və ya reklam lövhəsində bir çərçivə kimi əlavə edin."; $lang['wishsort'] = "susmaya görə sıralama qaydası "; diff --git a/languages/core_cz_Čeština_cz.php b/languages/core_cz_Čeština_cz.php index c173bb0..6f871ce 100644 --- a/languages/core_cz_Čeština_cz.php +++ b/languages/core_cz_Čeština_cz.php @@ -5,6 +5,7 @@ $lang['adduser'] = "Uživatel %s (unique Client-ID: %s; Client-database-ID %s) $lang['api'] = "API"; $lang['apikey'] = "API Key"; $lang['asc'] = "vzestupně"; +$lang['autooff'] = "autostart is deactivated"; $lang['botoff'] = "Bot je zastaven."; $lang['boton'] = "Bot je spuštěn..."; $lang['brute'] = "Mnoho nepovedených přihlášení do Ranksystému. Přihlášení bylo zablokováno na 300 sekund! Poslední přístup byl z IP adresy %s."; @@ -151,6 +152,8 @@ $lang['stag0014'] = "Zapněte doplněk ON (enabled) nebo OFF (disabled).
=b}},d.prototype.onInput=function(b){var c=this,d=a(b.target),e="focusout"!==b.type;this.validateInput(d,e).done(function(){c.toggleSubmit()})},d.prototype.validateInput=function(c,d){var e=b(c),f=c.data("bs.validator.previous"),g=c.data("bs.validator.errors");if(f===e)return a.Deferred().resolve();c.data("bs.validator.previous",e),c.is('[type="radio"]')&&(c=this.$element.find('input[name="'+c.attr("name")+'"]'));var h=a.Event("validate.bs.validator",{relatedTarget:c[0]});if(this.$element.trigger(h),!h.isDefaultPrevented()){var i=this;return this.runValidators(c).done(function(b){c.data("bs.validator.errors",b),b.length?d?i.defer(c,i.showErrors):i.showErrors(c):i.clearErrors(c),g&&b.toString()===g.toString()||(h=b.length?a.Event("invalid.bs.validator",{relatedTarget:c[0],detail:b}):a.Event("valid.bs.validator",{relatedTarget:c[0],detail:g}),i.$element.trigger(h)),i.toggleSubmit(),i.$element.trigger(a.Event("validated.bs.validator",{relatedTarget:c[0]}))})}},d.prototype.runValidators=function(c){function e(a){return c.data(a+"-error")||c.data("error")||"native"==a&&c[0].validationMessage||h.errors[a]}var f=[],g=a.Deferred(),h=this.options;return c.data("bs.validator.deferred")&&c.data("bs.validator.deferred").reject(),c.data("bs.validator.deferred",g),a.each(d.VALIDATORS,a.proxy(function(a,d){if((b(c)||c.attr("required"))&&(c.data(a)||"native"==a)&&!d.call(this,c)){var g=e(a);!~f.indexOf(g)&&f.push(g)}},this)),!f.length&&b(c)&&c.data("remote")?this.defer(c,function(){var d={};d[c.attr("name")]=b(c),a.get(c.data("remote"),d).fail(function(a,b,c){f.push(e("remote")||c)}).always(function(){g.resolve(f)})}):g.resolve(f),g.promise()},d.prototype.validate=function(){var b=this;return a.when(this.$inputs.map(function(){return b.validateInput(a(this),!1)})).then(function(){b.toggleSubmit(),b.focusError()}),this},d.prototype.focusError=function(){if(this.options.focus){var b=a(".has-error:first :input");0!==b.length&&(a(document.body).animate({scrollTop:b.offset().top-d.FOCUS_OFFSET},250),b.focus())}},d.prototype.showErrors=function(b){var c=this.options.html?"html":"text",d=b.data("bs.validator.errors"),e=b.closest(".form-group"),f=e.find(".help-block.with-errors"),g=e.find(".form-control-feedback");d.length&&(d=a("