X-Git-Url: http://git.pk910.de/?p=PHP-P10.git;a=blobdiff_plain;f=Uplink%2FUplink.class.php;h=387f32406e207c71966fabda389990a0b783c4a5;hp=c88c2ea211c5870caa3e9e5441794b3be837650e;hb=2e900783aa961dd56ec4733231656fd8928aaa55;hpb=e4b8ef21756e63577c17f9e76d812c9a5a7f0bdc diff --git a/Uplink/Uplink.class.php b/Uplink/Uplink.class.php index c88c2ea..387f324 100644 --- a/Uplink/Uplink.class.php +++ b/Uplink/Uplink.class.php @@ -438,7 +438,7 @@ class Uplink { $userstr = ""; } $users = explode(",",$userstr); - $isop = false; $isvoice = false; + $isop = false; $ishalfop = false; $isvoice = false; foreach($users as $user) { if($user == "") continue; $uexp = explode(":", $user); @@ -448,9 +448,11 @@ class Uplink { } if(count($uexp) > 1) { $isop = false; + $ishalfop = false; $isvoice = false; for($i = 0; $i < strlen($uexp[1]); $i++) { if($uexp[1][0] == "@") $isop = true; + if($uexp[1][0] == "%") $ishalfop = true; if($uexp[1][0] == "+") $isvoice = true; } } @@ -459,7 +461,7 @@ class Uplink { trigger_error("burst parse error: cant find User '".$uexp[0]."'.", E_USER_ERROR); return; } - $channel->burstUser($user, $isop, $isvoice); + $channel->burstUser($user, $isop, $ishalfop, $isvoice); if($this->eventHandler) $this->eventHandler->event_join($user, $channel, true); } @@ -780,39 +782,46 @@ class Uplink { $this->send("N", $nick, $connect_time, $ident, $host, $modes, $ip, $numeric, $realname); } foreach(P10_Channel::getChannels() as $channel) { - $sorted_users = array('ov' => array(), 'o' => array(), 'v' => array(), '-' => array()); + $privs_to_burst = array('o', 'h', 'v' ); + $priv_values = array(P10_Channel::USERPRIV_OPED, P10_Channel::USERPRIV_HALFOP, P10_Channel::USERPRIV_VOICE ); + $priv_combinations = array(); + $sorted_users = array(); + $combinations = expr(2, count($privs_to_burst)); //binary possibilities => 2^count($privs_to_burst) + for($i = 0; $i < $combinations; $i++) { + //make a binary number out of $i + $binary = decbin($i); + while(strlen($binary) < count($privs_to_burst)) + $binary = '0'.$binary; + $combination_name = ''; + $combination_value = 0; + for($j = 0; $j < count($privs_to_burst); $j++) { + if($binary[$j] == '1') { + $combination_name .= $privs_to_burst[$j]; + $combination_value .= $priv_values[$j]; + } + } + $priv_combinations[] = array("name" => $combination_name, "value" => $combination_value); + $sorted_users[$combination_value] = array(); + } $local_users = false; foreach($channel->getUsers() as $user) { if(substr($user->getNumeric(), 0, 2) != $this->server->getNumeric()) continue; //skip users that are not on the local server $privs = $channel->getUserPrivs($user); - $strPrivs = ""; - if(($privs & P10_Channel::USERPRIV_OPED)) $strPrivs .= "o"; - if(($privs & P10_Channel::USERPRIV_VOICE)) $strPrivs .= "v"; - if($strPrivs == "") $strPrivs = "-"; $local_users = true; - $sorted_users[$strPrivs][] = $user; + $sorted_users[$privs][] = $user; } if(!$local_users) continue; $userStr = ""; - foreach($sorted_users['-'] as $user) { - if($userStr != "") $userStr.=","; - $userStr .= $user->getNumeric(); - } - foreach($sorted_users['ov'] as $i => $user) { - if($userStr != "") $userStr.=","; - $userStr .= $user->getNumeric(); - if($i == 0) $userStr .= ":ov"; - } - foreach($sorted_users['o'] as $i => $user) { - if($userStr != "") $userStr.=","; - $userStr .= $user->getNumeric(); - if($i == 0) $userStr .= ":o"; - } - foreach($sorted_users['v'] as $i => $user) { - if($userStr != "") $userStr.=","; - $userStr .= $user->getNumeric(); - if($i == 0) $userStr .= ":v"; - } + foreach($priv_combinations as $combination) { + $i = 0; + foreach($sorted_users[$combination['value']] as $user) { + if($userStr != "") $userStr.=","; + $userStr .= $user->getNumeric(); + if(($i++) == 0 && $combination['value'] > 0) { + $userStr .= $combination['name']; + } + } + } $banString = ""; //TODO: Build ban String $burstString = ""; @@ -890,8 +899,9 @@ class Uplink { if($privs != 0) { $channel->setUserPrivs($user, $privs); if(($this->flags & self::FLAG_CONNECTED)) { - $modestr = "+".(($privs & P10_Channel::USERPRIV_OPED) ? "o" : "").(($privs & P10_Channel::USERPRIV_VOICE) ? "v" : ""); + $modestr = "+".(($privs & P10_Channel::USERPRIV_OPED) ? "o" : "").(($privs & P10_Channel::USERPRIV_HALFOP) ? "h" : "").(($privs & P10_Channel::USERPRIV_VOICE) ? "v" : ""); $modestr .= (($privs & P10_Channel::USERPRIV_OPED) ? " ".$user->getNumeric() : ""); + $modestr .= (($privs & P10_Channel::USERPRIV_HALFOP) ? " ".$user->getNumeric() : ""); $modestr .= (($privs & P10_Channel::USERPRIV_VOICE) ? " ".$user->getNumeric() : ""); $this->send("OM", $user->getNumeric(), $chanName, $modestr); }