X-Git-Url: http://git.pk910.de/?p=PHP-P10.git;a=blobdiff_plain;f=Uplink%2FUplink.class.php;h=18468e76638cbbb3ebacb354cb56401eace77da4;hp=d90324bf3e6e30bfb08ce5c1e4102c59232e7df5;hb=811bc0c7a1f583fb624a0f8c3601146e063c5a25;hpb=31306844f33ddc639931d9d7173f4af9f7fb327b diff --git a/Uplink/Uplink.class.php b/Uplink/Uplink.class.php index d90324b..18468e7 100644 --- a/Uplink/Uplink.class.php +++ b/Uplink/Uplink.class.php @@ -1,6 +1,6 @@ recv_mode($from, $arguments); break; - case "AC": + case "AC": $this->recv_account($from, $arguments); break; + case "FA": + $this->recv_fakehost($from, $arguments); + break; + case "NFH": + $this->recv_newfakehost($from, $arguments); + break; //default default: //unknown cmd @@ -402,18 +408,18 @@ class Uplink { trigger_error("Server tries to quit an user that does not exist or was not found on recv_quit.", E_USER_ERROR); return; } + $user->quit($args[0]); if($this->eventHandler) $this->eventHandler->event_quit($user, $args[0]); - $user->quit($args[0]); } private function recv_burst($from, $args) { $name = $args[0]; $create_time = $args[1]; - if(count($args) == 2) { - //we've got an empty channel without any modes set??? dead channel! - return; - } + if(count($args) == 2) { + //we've got an empty channel without any modes set??? dead channel! + return; + } $channel = P10_Channel::getChannelByName($name); if($channel == null) $channel = new P10_Channel($name); @@ -432,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); @@ -442,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; } } @@ -453,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); } @@ -515,9 +523,9 @@ class Uplink { trigger_error("Server tries to kill an user that does not exist or was not found on recv_quit.", E_USER_ERROR); return; } + $user->quit($args[1]); if($this->eventHandler) $this->eventHandler->event_quit($user, "Killed (".$args[1].")"); - $user->quit($args[1]); } private function recv_privmsg($from, $args) { @@ -714,12 +722,21 @@ class Uplink { return; } $targetUser->getModes()->setModes($modes); - if($this->eventHandler) + $fakemodes = NULL; + if($targetUser->getModes()->hasMode("x") && $targetUser->getModes()->hasMode("r") && !$targetUser->getModes()->hasMode("f")) { + //user is registered and has umode +x set (automatically assign default fakehost) + $fakemodes = "+f ".$targetUser->getModes()->hasMode("r").".".$this->getSetting("his_usermask"); + $targetUser->getModes()->setModes($fakemodes); + } + if($this->eventHandler) { $this->eventHandler->event_usermode($targetUser, $modes); + if($fakemodes) + $this->eventHandler->event_usermode($targetUser, $fakemodes); + } } } - - private function recv_account($from, $args) { + + private function recv_account($from, $args) { $user = P10_User::getUserByNum($args[0]); if($user == null) { trigger_error("Server tries to send an auth announce from an user that does not exist or was not found on recv_account.", E_USER_ERROR); @@ -727,8 +744,43 @@ class Uplink { } $auth = $args[1]; $user->getModes()->setModes("+r ".$auth); - if($this->eventHandler) - $this->eventHandler->event_usermode($user, "+r ".$auth); + $fakemodes = NULL; + if($user->getModes()->hasMode("x") && !$user->getModes()->hasMode("f")) { + //user is registered and has umode +x set (automatically assign default fakehost) + $fakemodes = "+f ".$auth.".".$this->getSetting("his_usermask"); + $user->getModes()->setModes($fakemodes); + } + if($this->eventHandler) { + $this->eventHandler->event_usermode($user, "+r ".$auth); + if($fakemodes) + $this->eventHandler->event_usermode($user, $fakemodes); + } + } + + private function recv_fakehost($from, $args) { + $user = P10_User::getUserByNum($args[0]); + if($user == null) { + trigger_error("Server tries to send a fakehost change from an user that does not exist or was not found on recv_fakehost.", E_USER_ERROR); + return; + } + $fakehost = $args[1]; + $user->getModes()->setModes("+f ".$fakehost); + if($this->eventHandler) + $this->eventHandler->event_usermode($user, "+f ".$fakehost); + } + + private function recv_newfakehost($from, $args) { + $user = P10_User::getUserByNum($args[0]); + if($user == null) { + trigger_error("Server tries to send a fakehost change from an user that does not exist or was not found on recv_fakehost.", E_USER_ERROR); + return; + } + $fakeident = $args[1]; + $fakehost = $args[2]; + $user->setIdent($fakeident); + $user->getModes()->setModes("+f ".$fakehost); + if($this->eventHandler) + $this->eventHandler->event_usermode($user, "+f ".$fakehost); } /******************************************************************************************** @@ -748,38 +800,45 @@ 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 = pow(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 @@ -858,10 +917,11 @@ 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); + $this->send(($user->getModes()->hasMode('k') ? "M" : "OM"), $user->getNumeric(), $chanName, $modestr); } } if($this->eventHandler) @@ -907,7 +967,7 @@ class Uplink { $this->eventHandler->event_kick($user, $target, $channel, $reason); $channel->partUser($target, $reason); if(($this->flags & self::FLAG_CONNECTED)) - $this->send("K", $user->getNumeric(), $chanName, $target->getNumeric(), $reason); + $this->send("K", $user->getNumeric(), $channel->getName(), $target->getNumeric(), $reason); } public function privmsg($user, $target, $message) {