diff --git a/jobs/calc_user.php b/jobs/calc_user.php
index 3713bb8..8ed7af7 100644
--- a/jobs/calc_user.php
+++ b/jobs/calc_user.php
@@ -1,5 +1,6 @@
quote($client['client_nickname'], ENT_QUOTES);
@@ -65,9 +67,12 @@ function calc_user($ts3,$mysqlcon,$lang,$dbname,$slowmode,$timezone,$grouptime,$
}
$except = 0;
}
+
+ // Check if client exists in rank database
if(isset($select_arr['all_user'][$uid])) {
$idle = $select_arr['all_user'][$uid]['idle'] + $clientidle;
- $grpid = $select_arr['all_user'][$uid]['grpid'];
+ $grpid = null;
+ $grpidTime = null;
$nextup = $select_arr['all_user'][$uid]['nextup'];
$grpsince = $select_arr['all_user'][$uid]['grpsince'];
if ($select_arr['all_user'][$uid]['cldbid'] != $cldbid && $resetbydbchange == 1) {
@@ -117,12 +122,17 @@ function calc_user($ts3,$mysqlcon,$lang,$dbname,$slowmode,$timezone,$grouptime,$
$activetime = $count;
}
$dtT = new DateTime("@$activetime");
+
+ // Get client acquired top ranked group and this group required online time
foreach ($grouptime as $time => $groupid) {
if (isset($sgroups[$groupid])) {
$grpid = $groupid;
+ $grpidTime = $time;
break;
}
}
+
+ // Add new client server groups
$grpcount=0;
foreach ($grouptime as $time => $groupid) {
$grpcount++;
@@ -132,13 +142,16 @@ function calc_user($ts3,$mysqlcon,$lang,$dbname,$slowmode,$timezone,$grouptime,$
if($except != 2 && $except != 3) {
$except = 1;
}
- } elseif ($activetime > $time && !isset($exceptuuid[$uid]) && !array_intersect_key($sgroups, $exceptgroup)) {
- if ($select_arr['all_user'][$uid]['grpid'] != $groupid) {
- if ($select_arr['all_user'][$uid]['grpid'] != NULL && isset($sgroups[$select_arr['all_user'][$uid]['grpid']])) {
+ }
+
+ // Grant new rank if necessary online time has been reached
+ elseif ($activetime > $time && !isset($exceptuuid[$uid]) && !array_intersect_key($sgroups, $exceptgroup)) {
+ if ($grpid != $groupid && ($keephigherranks === 0 || $time > $grpidTime)) {
+ if ($grpid != NULL && isset($sgroups[$grpid])) {
usleep($slowmode);
try {
- $ts3->serverGroupClientDel($select_arr['all_user'][$uid]['grpid'], $cldbid);
- enter_logfile($logpath,$timezone,5,sprintf($lang['sgrprm'], $select_arr['groups'][$select_arr['all_user'][$uid]['grpid']]['sgidname'], $select_arr['all_user'][$uid]['grpid'], $name, $uid, $cldbid));
+ $ts3->serverGroupClientDel($grpid, $cldbid);
+ enter_logfile($logpath,$timezone,5,sprintf($lang['sgrprm'], $select_arr['groups'][$grpid]['sgidname'], $grpid, $name, $uid, $cldbid));
}
catch (Exception $e) {
enter_logfile($logpath,$timezone,2,"TS3 error: ".$e->getCode().': '.$e->getMessage()." ; ".sprintf($lang['sgrprerr'], $name, $uid, $cldbid, $select_arr['groups'][$groupid]['sgidname'], $groupid));
@@ -149,7 +162,7 @@ function calc_user($ts3,$mysqlcon,$lang,$dbname,$slowmode,$timezone,$grouptime,$
try {
$ts3->serverGroupClientAdd($groupid, $cldbid);
$grpsince = $nowtime;
- enter_logfile($logpath,$timezone,5,sprintf($lang['sgrpadd'], $select_arr['groups'][$groupid]['sgidname'], $groupid, $name, $uid, $cldbid));
+ enter_logfile($logpath,$timezone,5,sprintf($lang['sgrpadd'], $select_arr['groups'][$groupid]['sgidname'], $groupid, $name, $uid, $cldbid));
}
catch (Exception $e) {
enter_logfile($logpath,$timezone,2,"TS3 error: ".$e->getCode().': '.$e->getMessage()." ; ".sprintf($lang['sgrprerr'], $name, $uid, $cldbid, $select_arr['groups'][$groupid]['sgidname'], $groupid));
@@ -177,6 +190,22 @@ function calc_user($ts3,$mysqlcon,$lang,$dbname,$slowmode,$timezone,$grouptime,$
$nextup = $time - $activetime;
}
}
+
+ // Remove all server groups ranked lower than client top rank (prevents multiple ranks per client)
+ if ($forceremovelowerranks === 1) {
+ foreach ($grouptime as $time => $groupid) {
+ if ($grpid != $groupid && $time < $grpidTime && $groupid != 0 && isset($sgroups[$groupid])) {
+ usleep($slowmode);
+ try {
+ $ts3->serverGroupClientDel($groupid, $cldbid);
+ enter_logfile($logpath, $timezone, 5, sprintf($lang['sgrprm'], $select_arr['groups'][$groupid]['sgidname'], $groupid, $name, $uid, $cldbid));
+ } catch (Exception $e) {
+ enter_logfile($logpath, $timezone, 2, "TS3 error: " . $e->getCode() . ': ' . $e->getMessage() . " ; " . sprintf($lang['sgrprerr'], $name, $uid, $cldbid, $select_arr['groups'][$groupid]['sgidname'], $groupid));
+ }
+ }
+ }
+ }
+
$updatedata[] = array(
"uuid" => $mysqlcon->quote($client['client_unique_identifier'], ENT_QUOTES),
"cldbid" => $cldbid,
@@ -195,7 +224,10 @@ function calc_user($ts3,$mysqlcon,$lang,$dbname,$slowmode,$timezone,$grouptime,$
"grpsince" => $grpsince,
"cid" => $client['cid']
);
- } else {
+ }
+
+ // Client does not exist in ranksystem db, create new
+ else {
$grpid = '0';
foreach ($grouptime as $time => $groupid) {
if (isset($sgroups[$groupid])) {
diff --git a/jobs/check_db.php b/jobs/check_db.php
index c613e66..3244976 100644
--- a/jobs/check_db.php
+++ b/jobs/check_db.php
@@ -1,6 +1,6 @@
exec("DROP TABLE `$dbname`.`bak_stats_versions`") === false) { }
if($mysqlcon->exec("DROP TABLE `$dbname`.`bak_addon_assign_groups`") === false) { }
}
+ if(version_compare($currvers, '1.2.11.1', '<=')) {
+ if($mysqlcon->exec("ALTER TABLE $dbname.config ADD COLUMN forceremovelowerranks TINYINT(1) NOT NULL DEFAULT '0'") === false) { } else {
+ enter_logfile($logpath,$timezone,4," [1.2.11.1] Added config table column 'forceremovelowerranks'.");
+ }
+ if($mysqlcon->exec("ALTER TABLE $dbname.config ADD COLUMN keephigherranks TINYINT(1) NOT NULL DEFAULT '0'") === false) { } else {
+ enter_logfile($logpath,$timezone,4," [1.2.11.1] Added config table column 'keephigherranks'.");
+ }
+ }
$currvers = set_new_version($mysqlcon,$dbname,$timezone,$newversion,$logpath);
old_files($timezone,$logpath);
check_chmod($timezone,$logpath,$lang);
diff --git a/languages/core_ar.php b/languages/core_ar.php
index a6c7508..5794fa2 100644
--- a/languages/core_ar.php
+++ b/languages/core_ar.php
@@ -392,6 +392,10 @@
$lang['wiexuiddesc'] = "A comma seperated list of unique Client-IDs, which should not conside for the Ranksystem.
User in this list will be ignored for the rank up.";
$lang['wigrptime'] = "ترفيع رتبة";
$lang['wigrptimedesc'] = "Define here, after which time a user should get automatically a predefined servergroup.
time (seconds)=>servergroup ID
60=>9,120=>10,180=>11On this example a user receives servergroup 9 after 60 seconds, servergroup 10 after another 60 seconds, servergroup 11 after another 60 seconds."; +$lang['forceremovelowerranks'] = "Forced removal of lower ranks"; +$lang['forceremovelowerranksdesc'] = "If client has more than one ranksystem group, all, except one higher ranked, will be removed."; +$lang['keephigherranks'] = "Keep manually defined ranks"; +$lang['keephigherranksdesc'] = "Keep client rank, when it is higher than it should be by online time."; $lang['wihladm'] = "List Rankup (Admin-Mode)"; $lang['wihladm1'] = "Add online Time to User"; $lang['wihladm2'] = "Remove online Time from User"; diff --git a/languages/core_cz.php b/languages/core_cz.php index 24955c5..b8652b0 100644 --- a/languages/core_cz.php +++ b/languages/core_cz.php @@ -391,6 +391,10 @@ $lang['wiexuiddesc'] = "Čárka odděluje seznam jedinečných identifikátorů klientů, které by se neměly týkat systému Ranks.
čas (sekund)=>ID skupiny serverů
60=>9,120=>10,180=>11Na tomto uživatelé dostanou po 60 sekundách servergroup 9, poté po 60 sekundách servergroup 10 a tak dále ..."; +$lang['forceremovelowerranks'] = "Forced removal of lower ranks"; +$lang['forceremovelowerranksdesc'] = "If client has more than one ranksystem group, all, except one higher ranked, will be removed."; +$lang['keephigherranks'] = "Keep manually defined ranks"; +$lang['keephigherranksdesc'] = "Keep client rank, when it is higher than it should be by online time."; $lang['wihladm'] = "Seznam hodnocení (režim administrátora)"; $lang['wihladm1'] = "Přidat čas online uživateli"; $lang['wihladm2'] = "Remove online Time from User"; diff --git a/languages/core_de.php b/languages/core_de.php index 62c285e..103f041 100644 --- a/languages/core_de.php +++ b/languages/core_de.php @@ -391,6 +391,10 @@ $lang['wiexuiddesc'] = "Eine mit Komma getrennte Liste von eindeutigen Client-IDs, welche nicht am Ranksystem teilnehmen sollen.
Zeit (Sekunden)=>Servergruppen ID
60=>9,120=>10,180=>11In diesem Beispiel erhält ein User die Servergruppe 9 nach 60 Sekunden, die Servergruppe 10 nach weiteren 60 Sekunden, die Servergruppe 11 nach weiteren 60 Sekunden."; +$lang['forceremovelowerranks'] = "Forced removal of lower ranks"; +$lang['forceremovelowerranksdesc'] = "If client has more than one ranksystem group, all, except one higher ranked, will be removed."; +$lang['keephigherranks'] = "Keep manually defined ranks"; +$lang['keephigherranksdesc'] = "Keep client rank, when it is higher than it should be by online time."; $lang['wihladm'] = "List Rankup (Admin-Modus)"; $lang['wihladm1'] = "Zeit zu User hinzufügen"; $lang['wihladm2'] = "Zeit von User entfernen"; diff --git a/languages/core_en.php b/languages/core_en.php index 95ddee1..d8d8647 100644 --- a/languages/core_en.php +++ b/languages/core_en.php @@ -391,6 +391,10 @@ $lang['wiexuiddesc'] = "A comma separated list of unique Client-IDs, which should not consider for the Ranksystem.
time (seconds)=>servergroup ID
60=>9,120=>10,180=>11On this example a user receives servergroup 9 after 60 seconds, servergroup 10 after another 60 seconds, servergroup 11 after another 60 seconds."; +$lang['forceremovelowerranks'] = "Forced removal of lower ranks"; +$lang['forceremovelowerranksdesc'] = "If client has more than one ranksystem group, all, except one higher ranked, will be removed."; +$lang['keephigherranks'] = "Keep manually defined ranks"; +$lang['keephigherranksdesc'] = "Keep client rank, when it is higher than it should be by online time."; $lang['wihladm'] = "List Rankup (Admin-Mode)"; $lang['wihladm1'] = "Add online Time to User"; $lang['wihladm2'] = "Remove online Time from User"; diff --git a/languages/core_fr.php b/languages/core_fr.php index de34aa5..028b293 100644 --- a/languages/core_fr.php +++ b/languages/core_fr.php @@ -391,6 +391,10 @@ $lang['wiexuiddesc'] = "Des virgules séparent une liste d'indentifiant unique de client, qui ne doivent pas être prise en considération pour le système de rang (Ranksystem).
temps (secondes)=>ID du groupe de serveur
60=>9,120=>10,180=>11Sur ce un utilisateur obtient après 60 secondes le groupe de serveurs 9, à son tour après 60 secondes le groupe de serveurs 10, et ainsi de suite ..."; +$lang['forceremovelowerranks'] = "Forced removal of lower ranks"; +$lang['forceremovelowerranksdesc'] = "If client has more than one ranksystem group, all, except one higher ranked, will be removed."; +$lang['keephigherranks'] = "Keep manually defined ranks"; +$lang['keephigherranksdesc'] = "Keep client rank, when it is higher than it should be by online time."; $lang['wihladm'] = "Liste de classement (Mode-Admin)"; $lang['wihladm1'] = "Ajouter du temps en ligne à un utilisateur"; $lang['wihladm2'] = "Remove online Time from User"; diff --git a/languages/core_it.php b/languages/core_it.php index cf018b3..ed1c7cf 100644 --- a/languages/core_it.php +++ b/languages/core_it.php @@ -391,6 +391,10 @@ $lang['wiexuiddesc'] = "Lista degli utenti (ID Univoco) che non verranno contati dal Ranksystem (separati da virgola. es 5GFxciykQMojlrvugWti835Wdto=,YQf+7x/4LJ2Tw5cuQGItsVEn+S4=)
tempo (IN SECONDI)=>servergroup ID
60=>9,120=>10,180=>11Su queste basi un utente ottiene il servergroup 9 dopo 60 secondi, a sua volta il 10 dopo altri 60 secondi e così via..."; +$lang['forceremovelowerranks'] = "Forced removal of lower ranks"; +$lang['forceremovelowerranksdesc'] = "If client has more than one ranksystem group, all, except one higher ranked, will be removed."; +$lang['keephigherranks'] = "Keep manually defined ranks"; +$lang['keephigherranksdesc'] = "Keep client rank, when it is higher than it should be by online time."; $lang['wihladm'] = "Lista Utenti (Modalità Admin)"; $lang['wihladm1'] = "Aggiungi del tempo online ad un utente"; $lang['wihladm2'] = "Remove online Time from User"; diff --git a/languages/core_nl.php b/languages/core_nl.php index 879ae4a..8054ec4 100644 --- a/languages/core_nl.php +++ b/languages/core_nl.php @@ -391,6 +391,10 @@ $lang['wiexuiddesc'] = "A comma seperated list of unique Client-IDs, which should not conside for the Ranksystem.
time (seconds)=>servergroup ID
60=>9,120=>10,180=>11On this a user get after 60 seconds the servergroup 9, in turn after 60 seconds the servergroup 10, and so on..."; +$lang['forceremovelowerranks'] = "Forced removal of lower ranks"; +$lang['forceremovelowerranksdesc'] = "If client has more than one ranksystem group, all, except one higher ranked, will be removed."; +$lang['keephigherranks'] = "Keep manually defined ranks"; +$lang['keephigherranksdesc'] = "Keep client rank, when it is higher than it should be by online time."; $lang['wihladm'] = "List Rankup (Admin-Mode)"; $lang['wihladm1'] = "Add online Time to User"; $lang['wihladm2'] = "Remove online Time from User"; diff --git a/languages/core_pl.php b/languages/core_pl.php index 528a64c..c224063 100644 --- a/languages/core_pl.php +++ b/languages/core_pl.php @@ -391,6 +391,10 @@ $lang['wiexuiddesc'] = "Rozdzielona przecinkiem lista unikalnych identyfikatorow klientow, ktorych nie nalezy uwzgledniac w systemie Ranksystem.
czas (sekundy)=>identyfikator grupy serwerow
60=>9,120=>10,180=>11W tym przypadku uzytkownik dostaje po 60 sekundach grupe serwerow 9, po kolei po 60 sekundach grupa serwerow 10 itd."; +$lang['forceremovelowerranks'] = "Forced removal of lower ranks"; +$lang['forceremovelowerranksdesc'] = "If client has more than one ranksystem group, all, except one higher ranked, will be removed."; +$lang['keephigherranks'] = "Keep manually defined ranks"; +$lang['keephigherranksdesc'] = "Keep client rank, when it is higher than it should be by online time."; $lang['wihladm'] = "Lista Rankup (tryb administratora)"; $lang['wihladm1'] = "Dodaj czas online do uzytkownika"; $lang['wihladm2'] = "Remove online Time from User"; diff --git a/languages/core_pt.php b/languages/core_pt.php index 7839d22..74909f7 100644 --- a/languages/core_pt.php +++ b/languages/core_pt.php @@ -391,6 +391,10 @@ $lang['wiexuiddesc'] = "Uma lista separada de vírgulas de ID-Ùnica, que não deve considerar para o Sistema de Rank.
Tempo (em segundos)=>ID do grupo do servidor
60=>9,120=>10,180=>11Neste usuário, pegue após 60 segundos o grupo de servidores 9, por sua vez, após 60 segundos, o grupo de servidores 10 e assim por diante ..."; +$lang['forceremovelowerranks'] = "Forced removal of lower ranks"; +$lang['forceremovelowerranksdesc'] = "If client has more than one ranksystem group, all, except one higher ranked, will be removed."; +$lang['keephigherranks'] = "Keep manually defined ranks"; +$lang['keephigherranksdesc'] = "Keep client rank, when it is higher than it should be by online time."; $lang['wihladm'] = "Classificação (Modo Admin)"; $lang['wihladm1'] = "Adicionar tempo online ao usuário"; $lang['wihladm2'] = "Remove online Time from User"; diff --git a/languages/core_ro.php b/languages/core_ro.php index c1b0ca9..0e82edf 100644 --- a/languages/core_ro.php +++ b/languages/core_ro.php @@ -391,6 +391,10 @@ $lang['wiexuiddesc'] = "A comma seperated list of unique Client-IDs, which should not conside for the Ranksystem.
time (seconds)=>servergroup ID
60=>9,120=>10,180=>11On this example a user receives servergroup 9 after 60 seconds, servergroup 10 after another 60 seconds, servergroup 11 after another 60 seconds."; +$lang['forceremovelowerranks'] = "Forced removal of lower ranks"; +$lang['forceremovelowerranksdesc'] = "If client has more than one ranksystem group, all, except one higher ranked, will be removed."; +$lang['keephigherranks'] = "Keep manually defined ranks"; +$lang['keephigherranksdesc'] = "Keep client rank, when it is higher than it should be by online time."; $lang['wihladm'] = "Lista Rank(Mod Admin)"; $lang['wihladm1'] = "Adauga timp online"; $lang['wihladm2'] = "Remove online Time from User"; diff --git a/languages/core_ru.php b/languages/core_ru.php index 7318f56..864a9a0 100644 --- a/languages/core_ru.php +++ b/languages/core_ru.php @@ -390,6 +390,12 @@ $lang['wiexuid'] = "Исключенные пользователи"; $lang['wiexuiddesc'] = "Укажите через запятую уникальные идентификаторы пользователей (UID), которых система рангов будет игнорировать и им не будет засчитываться время, проведенное на сервере.
Время (в секундах)=>номер группы сервера (ServerGroupID)
60=>9,120=>10,180=>11По истечению 60 секунд пользователь получает сервер группу под SGID 9, по истечению еще 120 секунд пользователь получает сервер группу SGID 10, и так далее..."; $lang['wihladm'] = "Список пользователей (Режим администратора)"; $lang['wihladm1'] = "Начислить время пользователю"; diff --git a/other/config.php b/other/config.php index 6fd1fea..089a62d 100644 --- a/other/config.php +++ b/other/config.php @@ -210,6 +210,8 @@ function rem_session_ts3($rspathhex) { $avatar_delay = $config['avatar_delay']; $registercid = $config['registercid']; $iphash = $config['iphash']; + $forceremovelowerranks = (int)$config['forceremovelowerranks']; + $keephigherranks = (int)$config['keephigherranks']; } } elseif(!isset($_GET["lang"])) { $lang = set_language("en"); diff --git a/stats/list_rankup.php b/stats/list_rankup.php index ce0279f..2741eb5 100644 --- a/stats/list_rankup.php +++ b/stats/list_rankup.php @@ -301,15 +301,25 @@ function pagination($keysort,$keyorder,$user_pro_seite,$seiten_anzahl_gerundet,$ ksort($grouptime); if (count($sqlhis) > 0) { foreach ($sqlhis as $uuid => $value) { - if ($substridle == 1) { - $activetime = $value['count'] - $value['idle']; - } else { - $activetime = $value['count']; + // Get client next rank group and this group required online time + $grpcount = $curgroupid = $curgrpidTime = 0; + foreach ($grouptime as $time => $groupid) { + $grpcount++; + if ($grpcount === 1) { + $curgroupid = $groupid; + $curgrpidTime = $time; + } + if ($value['grpid'] == $groupid) { + $curgroupid = $groupid; + $curgrpidTime = $time; + break; + } } + $grpcount=0; foreach ($grouptime as $time => $groupid) { $grpcount++; - if ($activetime < $time || $grpcount == count($grouptime) && $value['nextup'] <= 0 && $showhighest == 1 || $grpcount == count($grouptime) && $value['nextup'] == 0 && $adminlogin == 1) { + if (($curgrpidTime < $time) || ($grpcount == count($grouptime) && $value['nextup'] <= 0 && $showhighest == 1) || ($grpcount == count($grouptime) && $value['nextup'] == 0 && $adminlogin == 1)) { echo '