X-Git-Url: http://git.pk910.de/?a=blobdiff_plain;f=Uplink%2FP10_ModeSets.class.php;h=b003057c7b2e489cc08419cc014d6dcb72473c30;hb=2f0f5cc68df94a828efa64b55ba34be1a243c5a0;hp=7f58c7dd05edcb277eec8c17c5258e5a3c1fda27;hpb=3a0a29c5f349896d62e1cb4959bf52037d940c84;p=PHP-P10.git diff --git a/Uplink/P10_ModeSets.class.php b/Uplink/P10_ModeSets.class.php index 7f58c7d..b003057 100644 --- a/Uplink/P10_ModeSets.class.php +++ b/Uplink/P10_ModeSets.class.php @@ -1,22 +1,19 @@ . * * * ************************************************************************ * @@ -69,13 +66,20 @@ class P10_ChannelModeSet { "D" => self::MODE_TYPE_D, "d" => self::MODE_TYPE_D, "R" => self::MODE_TYPE_D, - "z" => self::MODE_TYPE_D + "z" => self::MODE_TYPE_D, + "S" => self::MODE_TYPE_D, + + //special behavior + "o" => self::MODE_TYPE_B, + "h" => self::MODE_TYPE_B, + "v" => self::MODE_TYPE_B ); private static $modevalues = null; private $modeflags = 0; private $modeparams = array(); + private $channel; - public __construct($modes) { + public function __construct($channel) { if(self::$modevalues == null) { //build modevalues array $flag = 1; @@ -85,10 +89,10 @@ class P10_ChannelModeSet { $flag <<= 1; } } - $this->parseModes($modes); + $this->channel = $channel; } - public parseModes($modes) { + public function parseModes($modes) { $args = explode(" ",$modes); $c = 1; for($i = 0; $i < strlen($args[0]); $i++) { @@ -103,15 +107,16 @@ class P10_ChannelModeSet { continue; } $flag = self::$modevalues[$mode]; - if(self::$modevalues[$mode] == self::MODE_TYPE_A) continue; //we shouldn't get such a mode on parseModes + if(self::$modes[$mode] == self::MODE_TYPE_A) continue; //we shouldn't get such a mode on parseModes $this->modeflags |= $flag; - if(self::$modevalues[$mode] == self::MODE_TYPE_B || self::$modevalues[$mode] == self::MODE_TYPE_C) { + if(self::$modes[$mode] == self::MODE_TYPE_B || self::$modes[$mode] == self::MODE_TYPE_C) { $this->modeparams[$mode] = $args[$c++]; } } + return $c-1; } - public setModes($modes, $returndiff = false) { + public function setModes($modes, $returndiff = false) { $args = explode(" ",$modes); $c = 1; $add = true; @@ -133,30 +138,53 @@ class P10_ChannelModeSet { trigger_error("unknown mode (".$mode.") on setModes (".$modes.").", E_USER_WARNING); continue; } + if($mode == "o" || $mode == "h" || $mode == "v") { + if($this->setPrivs($add, $mode, $args[$c++])) { + if($returndiff && $add) { + $modestradd .= $mode; + $paramstradd .= " ".$args[$c-1]; + } else if($returndiff && !$add) { + $modestrdel .= $mode; + $paramstrdel .= " ".$args[$c-1]; + } + } + continue; + } else if($mode == "b") { + if($this->handleBan($add, $mode, $args[$c++])) { + if($returndiff && $add) { + $modestradd .= $mode; + $paramstradd .= " ".$args[$c-1]; + } else if($returndiff && !$add) { + $modestrdel .= $mode; + $paramstrdel .= " ".$args[$c-1]; + } + } + continue; + } $flag = self::$modevalues[$mode]; if($add) { if($returndiff && !($this->modeflags & $flag)) { $modestradd .= $mode; - if(self::$modevalues[$mode] == self::MODE_TYPE_B || self::$modevalues[$mode] == self::MODE_TYPE_C) { + if(self::$modes[$mode] == self::MODE_TYPE_B || self::$modes[$mode] == self::MODE_TYPE_C) { $paramstradd .= " ".$args[$c]; } } $this->modeflags |= $flag; - if(self::$modevalues[$mode] == self::MODE_TYPE_B || self::$modevalues[$mode] == self::MODE_TYPE_C) { + if(self::$modes[$mode] == self::MODE_TYPE_B || self::$modes[$mode] == self::MODE_TYPE_C) { $this->modeparams[$mode] = $args[$c++]; } } else { if($returndiff && ($this->modeflags & $flag)) { $modestrdel .= $mode; - if(self::$modevalues[$mode] == self::MODE_TYPE_C) { + if(self::$modes[$mode] == self::MODE_TYPE_C) { $paramstrdel .= " ".$args[$c]; } } $this->modeflags &= ~$flag; - if(self::$modevalues[$mode] == self::MODE_TYPE_B || self::$modevalues[$mode] == self::MODE_TYPE_C) { + if(self::$modes[$mode] == self::MODE_TYPE_B || self::$modes[$mode] == self::MODE_TYPE_C) { unset($this->modeparams[$mode]); } - if(self::$modevalues[$mode] == self::MODE_TYPE_C) $c++; + if(self::$modes[$mode] == self::MODE_TYPE_C) $c++; } } if($returndiff) { @@ -167,13 +195,38 @@ class P10_ChannelModeSet { } } - public getModeString() { + private function handleBan($add, $mode, $mask) { + //no ban management right now... + return true; + } + + private function setPrivs($add, $mode, $user) { + $user = P10_User::getUserByNum($user); + if($user == null) { + trigger_error("Tried to set privs on a User that does not exist.", E_USER_ERROR); + return; + } + $privs = $this->channel->getUserPrivs($user); + $privFlag = 0; + if($mode == "o") $privFlag = P10_Channel::USERPRIV_OPED; + if($mode == "h") $privFlag = P10_Channel::USERPRIV_HALFOP; + if($mode == "v") $privFlag = P10_Channel::USERPRIV_VOICE; + if(!($add xor ($privs & $privFlag))) + return false; + if($add) $privs |= $privFlag; + else $privs &= ~$privFlag; + $this->channel->setUserPrivs($user, $privs); + return true; + + } + + public function getModeString() { $modestr = "+"; $paramstr = ""; foreach(self::$modevalues as $mode => $flag) { if(($this->modeflags & $flag)) { $modestr .= $mode; - if(self::$modevalues[$mode] == self::MODE_WITH_PARAMETER) { + if(self::$modes[$mode] == self::MODE_TYPE_B || self::$modes[$mode] == self::MODE_TYPE_C) { $paramstr .= " ".$this->modeparams[$mode]; } } @@ -181,6 +234,18 @@ class P10_ChannelModeSet { return $modestr.$paramstr; } + public function hasMode($mode) { + if(!array_key_exists($mode, self::$modevalues)) { + trigger_error("unknown mode (".$mode.") on setModes (".$modes.").", E_USER_WARNING); + continue; + } + $flag = self::$modevalues[$mode]; + if(self::$modes[$mode] == self::MODE_TYPE_B || self::$modes[$mode] == self::MODE_TYPE_C) { + return (($this->modeflags & $flag) ? $this->modeparams[$mode] : false); + } else + return ($this->modeflags & $flag); + } + } class P10_UserModeSet { @@ -193,7 +258,7 @@ class P10_UserModeSet { "s" => self::MODE_WITHOUT_PARAMETER, "d" => self::MODE_WITHOUT_PARAMETER, "k" => self::MODE_WITHOUT_PARAMETER, - "g" => self::MODE_WITH_PARAMETER, + "g" => self::MODE_WITHOUT_PARAMETER, "r" => self::MODE_WITH_PARAMETER, "f" => self::MODE_WITH_PARAMETER, "n" => self::MODE_WITHOUT_PARAMETER, @@ -211,7 +276,7 @@ class P10_UserModeSet { private $modeflags = 0; private $modeparams = array(); - public __construct($modes) { + public function __construct($modes) { if(self::$modevalues == null) { //build modevalues array $flag = 1; @@ -224,7 +289,7 @@ class P10_UserModeSet { $this->parseModes($modes); } - public parseModes($modes) { + public function parseModes($modes) { $args = explode(" ",$modes); $c = 1; for($i = 0; $i < strlen($args[0]); $i++) { @@ -240,13 +305,13 @@ class P10_UserModeSet { } $flag = self::$modevalues[$mode]; $this->modeflags |= $flag; - if(self::$modevalues[$mode] == self::MODE_WITH_PARAMETER) { + if(self::$modes[$mode] == self::MODE_WITH_PARAMETER) { $this->modeparams[$mode] = $args[$c++]; } } } - public setModes($modes, $returndiff = false) { + public function setModes($modes, $returndiff = false) { $args = explode(" ",$modes); $c = 1; $add = true; @@ -271,12 +336,12 @@ class P10_UserModeSet { if($add) { if($returndiff && !($this->modeflags & $flag)) { $modestradd .= $mode; - if(self::$modevalues[$mode] == self::MODE_WITH_PARAMETER) { + if(self::$modes[$mode] == self::MODE_WITH_PARAMETER) { $paramstradd .= " ".$args[$c]; } } $this->modeflags |= $flag; - if(self::$modevalues[$mode] == self::MODE_WITH_PARAMETER) { + if(self::$modes[$mode] == self::MODE_WITH_PARAMETER) { $this->modeparams[$mode] = $args[$c++]; } } else { @@ -294,13 +359,13 @@ class P10_UserModeSet { } } - public getModeString() { + public function getModeString() { $modestr = "+"; $paramstr = ""; foreach(self::$modevalues as $mode => $flag) { if(($this->modeflags & $flag)) { $modestr .= $mode; - if(self::$modevalues[$mode] == self::MODE_WITH_PARAMETER) { + if(self::$modes[$mode] == self::MODE_WITH_PARAMETER) { $paramstr .= " ".$this->modeparams[$mode]; } } @@ -308,6 +373,18 @@ class P10_UserModeSet { return $modestr.$paramstr; } + public function hasMode($mode) { + if(!array_key_exists($mode, self::$modevalues)) { + trigger_error("unknown mode (".$mode.") on setModes (".$modes.").", E_USER_WARNING); + continue; + } + $flag = self::$modevalues[$mode]; + if(self::$modes[$mode] == self::MODE_WITH_PARAMETER) { + return (($this->modeflags & $flag) ? $this->modeparams[$mode] : false); + } else + return ($this->modeflags & $flag); + } + } ?> \ No newline at end of file