X-Git-Url: http://git.pk910.de/?p=PHP-P10.git;a=blobdiff_plain;f=Uplink%2FUplink.class.php;h=18468e76638cbbb3ebacb354cb56401eace77da4;hp=9d88ae523af513b05e5dd9b2223c2d1a0324767d;hb=811bc0c7a1f583fb624a0f8c3601146e063c5a25;hpb=0f30e96ae37491aee19e72b89cc54a6798d1f254 diff --git a/Uplink/Uplink.class.php b/Uplink/Uplink.class.php index 9d88ae5..18468e7 100644 --- a/Uplink/Uplink.class.php +++ b/Uplink/Uplink.class.php @@ -1,6 +1,6 @@ recv_mode($from, $arguments); break; + 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 @@ -399,21 +408,24 @@ 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; + } $channel = P10_Channel::getChannelByName($name); if($channel == null) $channel = new P10_Channel($name); $channel->setCreateTime($create_time); $modes = $channel->getModes(); $userstr = $args[count($args)-1]; - $modeparamcount = count($args)-3; if($userstr[0] == "%") { //ban list $banlist = explode(" ", substr($userstr, 1)); @@ -421,26 +433,26 @@ class Uplink { //TODO: save bans } $userstr = $args[count($args)-2]; - $modeparamcount--; } if($userstr[0] == "+") { //MODE String - $modeparamcount++; $userstr = ""; } $users = explode(",",$userstr); - $isop = false; $isvoice = false; + $isop = false; $ishalfop = false; $isvoice = false; foreach($users as $user) { if($user == "") continue; $uexp = explode(":", $user); if(strlen($uexp[0]) != 5) { - trigger_error("burst parse error: '".$uexp[0]."' is not an user numeric.", E_USER_ERROR); - return; + trigger_error("burst parse error: '".$uexp[0]."' is not an user numeric.", E_USER_WARNING); + break; } 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; } } @@ -449,11 +461,13 @@ 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); } - $modes->parseModes(implode(" ", array_slice($args, 2, $modeparamcount))); + $modestr = array_slice($args, 2); + if($modestr[0] == "+") + $modes->parseModes(implode(" ", $modestr)); } private function recv_join($from, $args) { @@ -509,15 +523,15 @@ 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) { $user = P10_User::getUserByNum($from); if($user == null) { - trigger_error("Server tries to send a privmsg from an user that does not exist or was not found on recv_privmsg.", E_USER_ERROR); + trigger_error("Server tries to send a privmsg from an user that does not exist or was not found on recv_privmsg.", E_USER_WARNING); return; } if($this->eventHandler) { @@ -534,10 +548,13 @@ class Uplink { $this->eventHandler->event_chanctcp($user, $channel, strtoupper($ctcpexp[0]), (count($ctcpexp) > 1 ? $ctcpexp[1] : null)); } else $this->eventHandler->event_chanmessage($user, $channel, $args[1]); + } else if($args[0][0] == "$") { + //"multicast" + $this->eventHandler->event_privmessage($user, NULL, $args[1]); } else { $targetUser = P10_User::getUserByNum($args[0]); if($targetUser == null) { - trigger_error("Server tries to send a privmsg to an user that does not exist or was not found on recv_privmsg.", E_USER_ERROR); + trigger_error("Server tries to send a privmsg to an user that does not exist or was not found on recv_privmsg.", E_USER_WARNING); return; } if(strlen($args[1]) > 0 && $args[1][0] == "\001") { @@ -556,7 +573,7 @@ class Uplink { private function recv_notice($from, $args) { $user = P10_User::getUserByNum($from); if($user == null) { - trigger_error("Server tries to send a notice from an user that does not exist or was not found on recv_notice.", E_USER_ERROR); + trigger_error("Server tries to send a notice from an user that does not exist or was not found on recv_notice.", E_USER_WARNING); return; } if($this->eventHandler) { @@ -573,10 +590,13 @@ class Uplink { $this->eventHandler->event_chanctcpreply($user, $channel, strtoupper($ctcpexp[0]), (count($ctcpexp) > 1 ? $ctcpexp[1] : null)); } else $this->eventHandler->event_channotice($user, $channel, $args[1]); + } else if($args[0][0] == "$") { + //"multicast" + $this->eventHandler->event_privnotice($user, NULL, $args[1]); } else { $targetUser = P10_User::getUserByNum($args[0]); if($targetUser == null) { - trigger_error("Server tries to send a notice to an user that does not exist or was not found on recv_notice.", E_USER_ERROR); + trigger_error("Server tries to send a notice to an user that does not exist or was not found on recv_notice.", E_USER_WARNING); return; } if(strlen($args[1]) > 0 && $args[1][0] == "\001") { @@ -683,7 +703,7 @@ class Uplink { private function recv_mode($from, $args) { $user = P10_User::getUserByNum($from); - if($user == null) { + if($user == null && strlen($from) != 2) { trigger_error("Server tries to send a modechange from an user that does not exist or was not found on recv_mode.", E_USER_ERROR); return; } @@ -693,7 +713,7 @@ class Uplink { if($channel == null) $channel = new P10_Channel($args[0]); $channel->getModes()->setModes($modes); - if($this->eventHandler) + if($this->eventHandler && strlen($from) != 2) $this->eventHandler->event_chanmode($user, $channel, $modes); } else { $targetUser = P10_User::getUserByNick($args[0]); @@ -702,11 +722,67 @@ 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) { + $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); + return; + } + $auth = $args[1]; + $user->getModes()->setModes("+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); + } + /******************************************************************************************** * SERVER FUNCTIONS * ********************************************************************************************/ @@ -724,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 @@ -834,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) @@ -883,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) { @@ -984,7 +1068,13 @@ class Uplink { } } + public function ctcp($user, $target, $command, $text) { + return $this->privmsg($user, $target, "\001".strtoupper($command)." ".$text."\001"); + } + public function ctcp_reply($user, $target, $command, $text) { + return $this->notice($user, $target, "\001".strtoupper($command)." ".$text."\001"); + } }