X-Git-Url: http://git.pk910.de/?a=blobdiff_plain;f=Uplink%2FP10_ModeSets.class.php;h=264a53f94d7c86f711b25f6be3f80a37810937fa;hb=2ccc33c2d482035ba66316fd7dc9592bc2e2db7d;hp=83611b8df4fb1039156292acf415dba4b866ea08;hpb=7b82a138057d641a0ce2205b611fba2079f7500e;p=PHP-P10.git diff --git a/Uplink/P10_ModeSets.class.php b/Uplink/P10_ModeSets.class.php index 83611b8..264a53f 100644 --- a/Uplink/P10_ModeSets.class.php +++ b/Uplink/P10_ModeSets.class.php @@ -69,13 +69,18 @@ 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, + + //special behavior + "o" => self::MODE_TYPE_B, + "v" => self::MODE_TYPE_B ); private static $modevalues = null; private $modeflags = 0; private $modeparams = array(); + private $channel; - public function __construct($modes) { + public function __construct($channel) { if(self::$modevalues == null) { //build modevalues array $flag = 1; @@ -85,7 +90,7 @@ class P10_ChannelModeSet { $flag <<= 1; } } - $this->parseModes($modes); + $this->channel = $channel; } public function parseModes($modes) { @@ -109,6 +114,7 @@ class P10_ChannelModeSet { $this->modeparams[$mode] = $args[$c++]; } } + return $c-1; } public function setModes($modes, $returndiff = false) { @@ -133,6 +139,18 @@ class P10_ChannelModeSet { trigger_error("unknown mode (".$mode.") on setModes (".$modes.").", E_USER_WARNING); continue; } + if($mode == "o" || $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; + } $flag = self::$modevalues[$mode]; if($add) { if($returndiff && !($this->modeflags & $flag)) { @@ -167,6 +185,25 @@ class P10_ChannelModeSet { } } + 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 == "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 = "";