2 /********************************* PHP-P10 ******************************
3 * P10 uplink class by pk910 (c)2011 pk910 *
4 ************************************************************************
7 * PHP-P10 is free software; you can redistribute it and/or modify *
8 * it under the terms of the GNU General Public License as published by *
9 * the Free Software Foundation; either version 2 of the License, or *
10 * (at your option) any later version. *
12 * This program is distributed in the hope that it will be useful, *
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
15 * GNU General Public License for more details. *
17 * You should have received a copy of the GNU General Public License *
18 * along with PHP-P10; if not, write to the Free Software Foundation, *
19 * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. *
21 ************************************************************************
23 * Uplink/P10_ModeSets.class.php
25 * classes to parse and store channel or user modes
29 class P10_ChannelModeSet {
30 const MODE_TYPE_A = 1, MODE_TYPE_B = 2, MODE_TYPE_C = 3, MODE_TYPE_D = 4;
31 /** http://www.irc.org/tech_docs/draft-brocklesby-irc-isupport-03.txt
32 * Section 3.3 CHANMODES
34 * Type A: Modes that add or remove an address to or from a list.
35 * These modes always take a parameter when sent by the server to a
36 * client; when sent by a client, they may be specified without a
37 * parameter, which requests the server to display the current
38 * contents of the corresponding list on the channel to the client.
40 * Type B: Modes that change a setting on the channel. These modes
41 * always take a parameter.
43 * Type C: Modes that change a setting on the channel. These modes
44 * take a parameter only when set; the parameter is absent when the
45 * mode is removed both in the client's and server's MODE command.
47 * Type D: Modes that change a setting on the channel. These modes
48 * never take a parameter.
50 private static $modes = array(
51 "b" => self::MODE_TYPE_A,
52 "k" => self::MODE_TYPE_B,
53 "a" => self::MODE_TYPE_C,
54 "l" => self::MODE_TYPE_C,
55 "f" => self::MODE_TYPE_C,
56 "F" => self::MODE_TYPE_C,
57 "c" => self::MODE_TYPE_D,
58 "C" => self::MODE_TYPE_D,
59 "i" => self::MODE_TYPE_D,
60 "m" => self::MODE_TYPE_D,
61 "M" => self::MODE_TYPE_D,
62 "n" => self::MODE_TYPE_D,
63 "N" => self::MODE_TYPE_D,
64 "p" => self::MODE_TYPE_D,
65 "r" => self::MODE_TYPE_D,
66 "s" => self::MODE_TYPE_D,
67 "t" => self::MODE_TYPE_D,
68 "u" => self::MODE_TYPE_D,
69 "D" => self::MODE_TYPE_D,
70 "d" => self::MODE_TYPE_D,
71 "R" => self::MODE_TYPE_D,
72 "z" => self::MODE_TYPE_D
74 private static $modevalues = null;
75 private $modeflags = 0;
76 private $modeparams = array();
78 public function __construct($modes) {
79 if(self::$modevalues == null) {
80 //build modevalues array
82 self::$modevalues = array();
83 foreach(self::$modes as $mode => $type) {
84 self::$modevalues[$mode] = $flag;
88 $this->parseModes($modes);
91 public function parseModes($modes) {
92 $args = explode(" ",$modes);
94 for($i = 0; $i < strlen($args[0]); $i++) {
96 if($mode == "+") continue;
97 if($mode == "-") { //we have no - flag on parseModes???
98 trigger_error("unexpected MODE_DEL (-) on parseModes (".$modes.").", E_USER_WARNING);
101 if(!array_key_exists($mode, self::$modevalues)) {
102 trigger_error("unknown mode (".$mode.") on parseModes (".$modes.").", E_USER_WARNING);
105 $flag = self::$modevalues[$mode];
106 if(self::$modevalues[$mode] == self::MODE_TYPE_A) continue; //we shouldn't get such a mode on parseModes
107 $this->modeflags |= $flag;
108 if(self::$modevalues[$mode] == self::MODE_TYPE_B || self::$modevalues[$mode] == self::MODE_TYPE_C) {
109 $this->modeparams[$mode] = $args[$c++];
114 public function setModes($modes, $returndiff = false) {
115 $args = explode(" ",$modes);
122 for($i = 0; $i < strlen($args[0]); $i++) {
123 $mode = $args[0][$i];
132 if(!array_key_exists($mode, self::$modevalues)) {
133 trigger_error("unknown mode (".$mode.") on setModes (".$modes.").", E_USER_WARNING);
136 $flag = self::$modevalues[$mode];
138 if($returndiff && !($this->modeflags & $flag)) {
139 $modestradd .= $mode;
140 if(self::$modevalues[$mode] == self::MODE_TYPE_B || self::$modevalues[$mode] == self::MODE_TYPE_C) {
141 $paramstradd .= " ".$args[$c];
144 $this->modeflags |= $flag;
145 if(self::$modevalues[$mode] == self::MODE_TYPE_B || self::$modevalues[$mode] == self::MODE_TYPE_C) {
146 $this->modeparams[$mode] = $args[$c++];
149 if($returndiff && ($this->modeflags & $flag)) {
150 $modestrdel .= $mode;
151 if(self::$modevalues[$mode] == self::MODE_TYPE_C) {
152 $paramstrdel .= " ".$args[$c];
155 $this->modeflags &= ~$flag;
156 if(self::$modevalues[$mode] == self::MODE_TYPE_B || self::$modevalues[$mode] == self::MODE_TYPE_C) {
157 unset($this->modeparams[$mode]);
159 if(self::$modevalues[$mode] == self::MODE_TYPE_C) $c++;
163 $modediff = ($modestradd == "+" ? "" : $modestradd);
164 $modediff .= ($modestrdel == "-" ? "" : $modestrdel);
165 $modediff .= $paramstradd.$paramstrdel;
170 public function getModeString() {
173 foreach(self::$modevalues as $mode => $flag) {
174 if(($this->modeflags & $flag)) {
176 if(self::$modevalues[$mode] == self::MODE_WITH_PARAMETER) {
177 $paramstr .= " ".$this->modeparams[$mode];
181 return $modestr.$paramstr;
186 class P10_UserModeSet {
187 const MODE_WITHOUT_PARAMETER = 1, MODE_WITH_PARAMETER = 2;
188 private static $modes = array(
189 "o" => self::MODE_WITHOUT_PARAMETER,
190 "O" => self::MODE_WITHOUT_PARAMETER,
191 "i" => self::MODE_WITHOUT_PARAMETER,
192 "w" => self::MODE_WITHOUT_PARAMETER,
193 "s" => self::MODE_WITHOUT_PARAMETER,
194 "d" => self::MODE_WITHOUT_PARAMETER,
195 "k" => self::MODE_WITHOUT_PARAMETER,
196 "g" => self::MODE_WITH_PARAMETER,
197 "r" => self::MODE_WITH_PARAMETER,
198 "f" => self::MODE_WITH_PARAMETER,
199 "n" => self::MODE_WITHOUT_PARAMETER,
200 "I" => self::MODE_WITHOUT_PARAMETER,
201 "X" => self::MODE_WITHOUT_PARAMETER,
202 "S" => self::MODE_WITHOUT_PARAMETER,
203 "H" => self::MODE_WITHOUT_PARAMETER,
204 "c" => self::MODE_WITHOUT_PARAMETER,
205 "W" => self::MODE_WITHOUT_PARAMETER,
206 "t" => self::MODE_WITHOUT_PARAMETER,
207 "D" => self::MODE_WITHOUT_PARAMETER,
208 "x" => self::MODE_WITHOUT_PARAMETER
210 private static $modevalues = null;
211 private $modeflags = 0;
212 private $modeparams = array();
214 public function __construct($modes) {
215 if(self::$modevalues == null) {
216 //build modevalues array
218 self::$modevalues = array();
219 foreach(self::$modes as $mode => $type) {
220 self::$modevalues[$mode] = $flag;
224 $this->parseModes($modes);
227 public function parseModes($modes) {
228 $args = explode(" ",$modes);
230 for($i = 0; $i < strlen($args[0]); $i++) {
231 $mode = $args[0][$i];
232 if($mode == "+") continue;
233 if($mode == "-") { //we have no - flag on parseModes???
234 trigger_error("unexpected MODE_DEL (-) on parseModes (".$modes.").", E_USER_WARNING);
237 if(!array_key_exists($mode, self::$modevalues)) {
238 trigger_error("unknown mode (".$mode.") on parseModes (".$modes.").", E_USER_WARNING);
241 $flag = self::$modevalues[$mode];
242 $this->modeflags |= $flag;
243 if(self::$modevalues[$mode] == self::MODE_WITH_PARAMETER) {
244 $this->modeparams[$mode] = $args[$c++];
249 public function setModes($modes, $returndiff = false) {
250 $args = explode(" ",$modes);
256 for($i = 0; $i < strlen($args[0]); $i++) {
257 $mode = $args[0][$i];
266 if(!array_key_exists($mode, self::$modevalues)) {
267 trigger_error("unknown mode (".$mode.") on setModes (".$modes.").", E_USER_WARNING);
270 $flag = self::$modevalues[$mode];
272 if($returndiff && !($this->modeflags & $flag)) {
273 $modestradd .= $mode;
274 if(self::$modevalues[$mode] == self::MODE_WITH_PARAMETER) {
275 $paramstradd .= " ".$args[$c];
278 $this->modeflags |= $flag;
279 if(self::$modevalues[$mode] == self::MODE_WITH_PARAMETER) {
280 $this->modeparams[$mode] = $args[$c++];
283 if($returndiff && ($this->modeflags & $flag)) {
284 $modestrdel .= $mode;
286 $this->modeflags &= ~$flag;
290 $modediff = ($modestradd == "+" ? "" : $modestradd);
291 $modediff .= ($modestrdel == "-" ? "" : $modestrdel);
292 $modediff .= $paramstradd;
297 public function getModeString() {
300 foreach(self::$modevalues as $mode => $flag) {
301 if(($this->modeflags & $flag)) {
303 if(self::$modevalues[$mode] == self::MODE_WITH_PARAMETER) {
304 $paramstr .= " ".$this->modeparams[$mode];
308 return $modestr.$paramstr;