3 class IRCConnection
extends IRC
{
5 var $scrollback = array();
6 var $server_options = array();
8 function ProcessMessage($message){
13 //debug("Message: ".print_r($message, 1));
14 deb(print_r($message, 1));
16 if(strlen($message['trailing']) && ord($message['trailing'][0]) == 1){
17 $message['trailing'] = trim($message['trailing'], chr(1));
18 if(strtoupper(substr($message['trailing'], 1, 6)) == 'ACTION'){
19 $message['command'] = 'ACTION';
21 $message['command'] = 'CTCP';
25 switch(strtoupper($message['command'])){
27 $buffer[] = json_encode(array(
30 'host'=>$args['server']
35 $opts = explode(' ', $message['params']);
37 foreach($opts as $pair){
38 $opt = explode('=', $pair, 2);
39 $name = strtoupper($opt[0]);
40 $val = isset($opt[1]) ?
$opt[1] : true;
41 $this->server_options
[$name] = $val;
43 if(in_array($name, array('NETWORK', 'PREFIX', 'CHANTYPES'))){
44 // Put the user prefixes (~&@ etc etc) into a more usable format
45 if($name == 'PREFIX'){
47 preg_match('/\(([^)]*)\)(.*)/', $val, $matches);
50 if(count($matches) == 3){
51 for($i=0; $i<strlen($matches[1]); $i++
){
52 $val[$matches[2][$i]] = $matches[1][$i];
56 $to_client[$name] = $val;
63 'options' => $to_client
65 $buffer[] = json_encode($data);
70 case RPL_WHOISOPERATOR
:
73 case RPL_WHOISCHANNELS
:
75 $tmp = explode(' ', $message['params']);
81 'msg' => $message['trailing']
83 $buffer[] = json_encode($data);
90 'msg' => $message['trailing']
92 $buffer[] = json_encode($data);
96 // NAMES command reply
97 list($nick,,$chan) = explode(" ", $message['params']);
98 $nicks = explode(" ", $message['trailing']);
101 'event' => 'userlist',
107 $prefixes = array('~', '&', '@','%','+');
110 foreach($nicks as $nick){
111 if(in_array($nick{0}, $prefixes)){
113 $nick = substr($nick,1);
117 $nicklist[$nick] = $prefix;
121 $tmp['users'] = $nicklist;
122 $buffer[] = json_encode($tmp);
130 if(count($nicklist)){
132 $tmp['users'] = $nicklist;
133 $buffer[] = json_encode($tmp);
135 //deb(print_r($data, 1));
139 list(,$chan) = explode(' ', $message['params']);
141 'event' => 'userlist_end',
145 $buffer[] = json_encode($data);
148 case ERR_LINKCHANNEL
:
149 list($nick, $source_chan, $dest_chan) = explode(' ', $message['params']);
151 'event' => 'channel_redirect',
152 'from' => $source_chan,
155 $buffer[] = json_encode($data);
165 'nick' => $message['nick'],
166 'ident' => $message['ident'],
167 'hostname' => $message['hostname'],
168 'channel' => $message['trailing'],
170 $buffer[] = json_encode($data);
172 deb("JOIN: {$message['nick']} / {$this->nick}");
173 if($message['nick'] == $this->nick
){
174 $this->stream
->Write("NAMES {$message['trailing']}\r\n");
182 'nick' => $message['nick'],
183 'ident' => $message['ident'],
184 'hostname' => $message['hostname'],
185 'channel' => trim($message['params']),
186 'message' => $message['trailing'],
188 $buffer[] = json_encode($data);
192 $tmp = explode(' ', $message['params']);
197 'nick' => $message['nick'],
198 'ident' => $message['ident'],
199 'hostname' => $message['hostname'],
200 'channel' => trim($tmp[0]),
201 'message' => $message['trailing'],
203 $buffer[] = json_encode($data);
209 'nick' => $message['nick'],
210 'ident' => $message['ident'],
211 'hostname' => $message['hostname'],
212 'message' => $message['trailing'],
214 $buffer[] = json_encode($data);
220 'nick' => $message['nick'],
221 'ident' => $message['ident'],
222 'hostname' => $message['hostname'],
223 'msg' => $message['trailing'],
225 $buffer[] = json_encode($data);
231 'nick' => $message['nick'],
232 'ident' => $message['ident'],
233 'hostname' => $message['hostname'],
234 'newnick' => $message['trailing'],
236 $buffer[] = json_encode($data);
242 'nick' => $message['nick'],
243 'channel' => $message['params'],
244 'topic' => $message['trailing']
246 $buffer[] = json_encode($data);
250 $tmp = explode(' ', $message['params']);
254 'channel' => $tmp[1],
255 'topic' => $message['trailing']
257 $buffer[] = json_encode($data);
263 'nick' => $message['nick'],
264 'msg' => trim(substr($message['trailing'], 8), chr(1)),
265 'channel' => $message['params'],
268 $buffer[] = json_encode($data);
274 'nick' => $message['nick'],
275 'msg' => trim(substr($message['trailing'], 8), chr(1)),
276 'channel' => $message['params'],
279 $buffer[] = json_encode($data);
283 $opts = explode(' ', $message['params']);
284 if(count($opts) == 1){
285 $effected_nick = $opts[0];
286 $mode = $message['trailing'];
287 } elseif(count($opts) == 2){
293 $effected_nick = $opts[2];
298 'nick' => $message['nick'],
302 if(isset($effected_nick)) $data['effected_nick'] = $effected_nick;
303 if(isset($channel)) $data['channel'] = $channel;
304 $buffer[] = json_encode($data);
310 $ret = str_replace('\n', ' ', print_r($message, 1));
316 $buffer[] = json_encode($data);
319 parent
::ProcessMessage($message);
325 function ProcessPrivMsg($message){
330 $msg = $message['trailing'];
331 $cmd = strtok($msg, ' ');
332 //debug(print_r($message));
333 //deb(print_r($message, 1));
336 'nick' => $message['nick'],
337 'msg' => $message['trailing'],
338 'channel' => $message['params'],
342 // Save it into the scrollback
343 if($config['scrollback_size']){
344 deb('Size: '.count($this->scrollback
));
345 if(count($this->scrollback
) >= $config['scrollback_size']){
347 for($i=1; $i<count($this->scrollback
); $i++
){
348 $this->scrollback
[$i-1] = $this->scrollback
[$i];
351 for($j=$i; $j<count($this->scrollback); $j++){
352 unset($this->scrollback[$i]);
354 //unset($this->scrollback[$i]);
356 $pos = count($this->scrollback
)-1;
359 $pos = count($this->scrollback
);
362 $this->scrollback
[$pos] = $data;
365 $buffer[] = json_encode($data);
366 parent
::ProcessPrivMsg($message);
372 private function isChannel($name){
373 return ($name[0] == "#");
377 private function formatMsgToHtml($inp){
381 if(strpos($tmp, chr(2))){
383 while(strpos($tmp, chr(2)) !== false){
384 $pos = strpos($tmp, chr(2));
385 $tmp = str_replace($tmp, chr(2), $next);
386 $next = ($next=='<b>') ?
'</b>' : '<b>';
388 if($next == '</b>') $tmp = $tmp . '</b>';