annotate unrealircdlink/unrealircdlink.php @ 1:7f01316130e8

Basic support for private messages in unrealircd proxy
author Ivo Smits <Ivo@UCIS.nl>
date Fri, 01 Apr 2011 17:02:41 +0200
parents dd81c38b513a
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1 <?php
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2 /* Copyright 2010 Ivo Smits <Ivo@UCIS.nl>. All rights reserved.
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
3 Redistribution and use in source and binary forms, with or without modification, are
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
4 permitted provided that the following conditions are met:
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
5
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
6 1. Redistributions of source code must retain the above copyright notice, this list of
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
7 conditions and the following disclaimer.
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
8
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
9 2. Redistributions in binary form must reproduce the above copyright notice, this list
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
10 of conditions and the following disclaimer in the documentation and/or other materials
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
11 provided with the distribution.
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
12
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
13 THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
14 WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
15 FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
16 CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
17 CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
18 SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
19 ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
20 NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
21 ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
22
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
23 The views and conclusions contained in the software and documentation are those of the
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
24 authors and should not be interpreted as representing official policies, either expressed
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
25 or implied, of Ivo Smits.*/
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
26
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
27 if (defined('APP_LOADED')) return;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
28 define('APP_LOADED', TRUE);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
29 if (!defined('CONFIGFILE')) define('CONFIGFILE', './config.php');
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
30
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
31 print("UCIS IRC Relay bot (c) 2010 Ivo Smits <Ivo@UCIS.nl>\n");
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
32 print("More information: http://wiki.qontrol.nl/IRCRelay\n");
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
33 print("\n");
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
34
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
35 class UUser {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
36 public $iname = NULL;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
37 public $unet = NULL;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
38 public $uname = NULL;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
39 public $channels = array();
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
40 public $seen = 0;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
41 public $explicit = FALSE;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
42 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
43 class IUser {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
44 public $iname = NULL;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
45 public $channels = array();
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
46 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
47 class Channel {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
48 public $name = NULL;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
49 public $iname = NULL;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
50 public $uname = NULL;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
51 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
52
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
53 $iusers = array();
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
54 $uusers = array();
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
55 $ichannels = array();
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
56 $uchannels = array();
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
57
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
58 $ircd_socket = NULL;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
59 $ircd_buffer = '';
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
60 $ircd_name = '';
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
61
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
62 $udpmsg_socket = NULL;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
63 $udpmsg_buffer = '';
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
64 $udpmsg_config = array();
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
65
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
66 $bot_nick = NULL;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
67
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
68 srand();
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
69
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
70 print("Loading configuration...\n");
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
71 if (!isset($config)) require constant('CONFIGFILE');
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
72
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
73 $ircd_socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
74 socket_connect($ircd_socket, $config['ircd']['host'], $config['ircd']['port']);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
75 $ircd_name = $config['ircd']['name'];
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
76 $bot_nick = $config['ircd']['bot_nick'];
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
77 if (!strlen($bot_nick)) $bot_nick = NULL;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
78 ircd_send('PROTOCTL');
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
79 ircd_send('PASS :'.$config['ircd']['password']);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
80 ircd_send('SERVER '.$ircd_name.' 0 0 :'.$config['ircd']['desc']);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
81 ircd_send('AO 0 0 0 0 - 0 :Kwaaknet.org');
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
82 if ($bot_nick) ircd_send('NICK '.$bot_nick.' 0 0 gateway '.$ircd_name.' '.$ircd_name.' 0 :'.$config['ircd']['desc']);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
83 ircd_send('ES');
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
84 $udpmsg_socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
85 socket_connect($udpmsg_socket, $config['udpmsg']['host'], $config['udpmsg']['port']);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
86 foreach ($config['channels'] as $iname => $uname) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
87 $ch = new Channel();
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
88 $ch->iname = $iname;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
89 $ch->uname = $uname;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
90 $ch->name = $iname;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
91 $uchannels[$ch->uname] = $ch;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
92 $ichannels[strtoupper($ch->iname)] = $ch;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
93 if ($bot_nick) ircd_send(':'.$bot_nick.' JOIN :'.$ch->iname);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
94 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
95 $iusers[strtoupper($bot_nick)] = new IUser();
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
96 $iusers[strtoupper($bot_nick)]->iname = $bot_nick;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
97
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
98 function reconfigure() {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
99 global $config;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
100 include constant('CONFIGFILE');
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
101 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
102
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
103 $ntime = 0;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
104 $atime = 0;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
105 print("Running\n");
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
106 while (TRUE) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
107 $selread = array($udpmsg_socket, $ircd_socket);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
108 $selwrite = NULL;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
109 $selerror = array($udpmsg_socket, $ircd_socket);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
110 socket_select(&$selread, &$selwrite, &$selerror, 60);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
111 if (in_array($udpmsg_socket, $selerror)) die("UDPMSG: Error: select error.\n");
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
112 if (in_array($ircd_socket, $selerror)) die("IRCd: Error: select error.\n");
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
113 if (in_array($udpmsg_socket, $selread) && !udpmsg_read()) die("UDPMSG: Error: closing connection.\n");
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
114 if (in_array($ircd_socket, $selread) && !ircd_read()) die("IRCd: read error.\n");
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
115 $ctime = time();
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
116 if ($ntime < $ctime) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
117 foreach ($uusers as $usr) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
118 if ($usr->seen > $ctime - $config['udpmsg'][$usr->explicit ? 'timeout_explicit' : 'timeout_implicit']) continue;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
119 unset($uusers[$usr->uname]);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
120 unset($iusers[strtoupper($usr->iname)]);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
121 ircd_send(':'.$usr->iname.' QUIT :Inactivity');
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
122 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
123 $ntime = $ctime + 120; //min($config['udpmsg']['timeout_explicit'], $config['udpmsg']['timeout_implicit']);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
124 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
125 if ($atime < $ctime) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
126 foreach ($iusers as $usr) if (is_a($usr, 'IUser')) ircd_userchannels($usr, array('CMD' => 'ALIVE'));
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
127 $atime = $ctime + (isset($config['udpmsg']['send_alive']) ? $config['udpmsg']['send_alive'] : 1800);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
128 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
129 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
130
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
131 function udpmsg_read() {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
132 global $udpmsg_socket, $udpmsg_buffer;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
133 $msg = socket_read($udpmsg_socket, 1024);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
134 if (!strlen($msg)) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
135 fprintf(STDERR, "UDPMSG: End of file\n");
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
136 return FALSE;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
137 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
138 $udpmsg_buffer .= $msg;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
139 while (strlen($udpmsg_buffer) > 2) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
140 $len = ord($udpmsg_buffer[0]) * 256 + ord($udpmsg_buffer[1]);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
141 if ($len <= 0 || $len > 1024) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
142 fprintf(STDERR, "UDPMSG: Error: protocol error\n");
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
143 return FALSE;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
144 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
145 if (strlen($udpmsg_buffer) < 2 + $len) break;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
146 $msg = substr($udpmsg_buffer, 2, $len);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
147 $udpmsg_buffer = substr($udpmsg_buffer, 2 + $len);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
148 $parts = explode("\0", $msg);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
149 $ret = array();
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
150 for ($i = 0; $i < count($parts)-1; $i += 2) $ret[$parts[$i]] = $parts[$i+1];
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
151 udpmsg_process($ret);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
152 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
153 return TRUE;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
154 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
155
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
156 function udpmsg_send($arr) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
157 global $udpmsg_socket, $config;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
158 $tmp = array();
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
159 $arr['DUMMY'] = rand(0, 999999);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
160 $arr['NET'] = $config['udpmsg']['netname'];
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
161 foreach ($arr as $key => $value) { $tmp[] = $key; $tmp[] = $value; }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
162 $tmp[] = '';
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
163 $msg = implode("\0", $tmp);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
164 $len = strlen($msg);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
165 if ($len > 1024) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
166 fprintf(STDERR, "UDPMSG: Error: message too long!\n");
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
167 return;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
168 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
169 $lens = chr(floor($len / 256)).chr($len % 256);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
170 socket_write($udpmsg_socket, $lens.$msg);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
171 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
172
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
173 function ircd_read() {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
174 global $ircd_socket, $ircd_buffer;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
175 $newdata = socket_read($ircd_socket, 1024);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
176 if ($newdata === FALSE || !strlen($newdata)) return FALSE;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
177 $ircd_buffer .= $newdata;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
178 $offset = 0;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
179 $len = strlen($ircd_buffer);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
180 while ($offset < $len) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
181 $posa = strpos($ircd_buffer, "\n", $offset);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
182 $posb = strpos($ircd_buffer, "\r", $offset);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
183 if ($posa !== FALSE && $posb !== FALSE) $pos = min($posa, $posb);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
184 else if ($posa !== FALSE) $pos = $posa;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
185 else if ($posb !== FALSE) $pos = $posb;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
186 else break;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
187 $line = substr($ircd_buffer, $offset, $pos - $offset);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
188 if (strlen($line) && !ircd_process($line)) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
189 fprintf(STDERR, "IRCd: process error\n");
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
190 return FALSE;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
191 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
192 $offset = $pos + 1;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
193 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
194 $ircd_buffer = ($offset == $len) ? '' : substr($ircd_buffer, $offset);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
195 return TRUE;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
196 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
197
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
198 function ircd_send($line) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
199 global $ircd_socket;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
200 print('IW: '.$line."\n");
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
201 $line .= "\r\n";
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
202 socket_send($ircd_socket, $line, strlen($line), 0);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
203 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
204
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
205 function udpmsg_process($ret) {
1
7f01316130e8 Basic support for private messages in unrealircd proxy
Ivo Smits <Ivo@UCIS.nl>
parents: 0
diff changeset
206 global $uchannels, $config;
7f01316130e8 Basic support for private messages in unrealircd proxy
Ivo Smits <Ivo@UCIS.nl>
parents: 0
diff changeset
207 if (!isset($ret['CHN']) || !isset($ret['CMD']) || !isset($ret['USR']) || !array_key_exists($ret['CHN'], $uchannels)) {
7f01316130e8 Basic support for private messages in unrealircd proxy
Ivo Smits <Ivo@UCIS.nl>
parents: 0
diff changeset
208 $ch = NULL;
7f01316130e8 Basic support for private messages in unrealircd proxy
Ivo Smits <Ivo@UCIS.nl>
parents: 0
diff changeset
209 } else {
7f01316130e8 Basic support for private messages in unrealircd proxy
Ivo Smits <Ivo@UCIS.nl>
parents: 0
diff changeset
210 $ch = $uchannels[$ret['CHN']];
7f01316130e8 Basic support for private messages in unrealircd proxy
Ivo Smits <Ivo@UCIS.nl>
parents: 0
diff changeset
211 }
0
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
212 $net = isset($ret['NET']) ? $ret['NET'] : NULL;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
213 switch ($ret['CMD']) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
214 case 'MSG':
1
7f01316130e8 Basic support for private messages in unrealircd proxy
Ivo Smits <Ivo@UCIS.nl>
parents: 0
diff changeset
215 if ($ch === NULL || !isset($ret['MSG'])) break;
0
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
216 $usr = udpmsg_join($ret['USR'], $ch, $net);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
217 ircd_send(':'.$usr->iname.' PRIVMSG '.$ch->iname.' :'.preg_replace('/[\x00\x10-\x13]/', '', $ret['MSG']));
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
218 break;
1
7f01316130e8 Basic support for private messages in unrealircd proxy
Ivo Smits <Ivo@UCIS.nl>
parents: 0
diff changeset
219 case 'PMSG':
7f01316130e8 Basic support for private messages in unrealircd proxy
Ivo Smits <Ivo@UCIS.nl>
parents: 0
diff changeset
220 if (!isset($ret['DUSR']) || !isset($ret['MSG'])) break;
7f01316130e8 Basic support for private messages in unrealircd proxy
Ivo Smits <Ivo@UCIS.nl>
parents: 0
diff changeset
221 if (isset($ret['DNET']) && $ret['DNET'] != $config['udpmsg']['netname']) break;
7f01316130e8 Basic support for private messages in unrealircd proxy
Ivo Smits <Ivo@UCIS.nl>
parents: 0
diff changeset
222 $tousr = ircd_getuser($ret['DUSR'], FALSE);
7f01316130e8 Basic support for private messages in unrealircd proxy
Ivo Smits <Ivo@UCIS.nl>
parents: 0
diff changeset
223 if ($tousr === NULL) break;
7f01316130e8 Basic support for private messages in unrealircd proxy
Ivo Smits <Ivo@UCIS.nl>
parents: 0
diff changeset
224 $usr = udpmsg_getuser($ret['USR'], TRUE, $net, FALSE);
7f01316130e8 Basic support for private messages in unrealircd proxy
Ivo Smits <Ivo@UCIS.nl>
parents: 0
diff changeset
225 ircd_send(':'.$usr->iname.' PRIVMSG '.$tousr->iname.' :'.preg_replace('/[\x00\x10-\x13]/', '', $ret['MSG']));
7f01316130e8 Basic support for private messages in unrealircd proxy
Ivo Smits <Ivo@UCIS.nl>
parents: 0
diff changeset
226 break;
0
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
227 case 'ALIVE':
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
228 case 'JOIN':
1
7f01316130e8 Basic support for private messages in unrealircd proxy
Ivo Smits <Ivo@UCIS.nl>
parents: 0
diff changeset
229 if ($ch === NULL) break;
0
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
230 udpmsg_join($ret['USR'], $ch, $net, TRUE);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
231 break;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
232 case 'PART':
1
7f01316130e8 Basic support for private messages in unrealircd proxy
Ivo Smits <Ivo@UCIS.nl>
parents: 0
diff changeset
233 if ($ch === NULL) break;
0
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
234 udpmsg_part($ret['USR'], $ch);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
235 break;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
236 case 'NICK':
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
237 udpmsg_part($ret['USR'], $ch);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
238 if (!isset($ret['NEWNICK'])) break;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
239 udpmsg_join($ret['NEWNICK'], $ch, $net, TRUE);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
240 break;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
241 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
242 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
243
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
244 function udpmsg_join($name, $ch, $net = NULL, $explicit = FALSE) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
245 $usr = udpmsg_getuser($name, TRUE, $net, $explicit);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
246 if (array_key_exists($ch->name, $usr->channels)) return $usr;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
247 $usr->channels[$ch->name] = $ch;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
248 ircd_send(':'.$usr->iname.' JOIN :'.$ch->iname);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
249 return $usr;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
250 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
251
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
252 function udpmsg_part($name, $ch) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
253 global $uusers, $iusers;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
254 $usr = udpmsg_getuser($name, FALSE);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
255 if ($usr === NULL || !array_key_exists($ch->name, $usr->channels)) return;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
256 unset($usr->channels[$ch->name]);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
257 if (count($usr->channels)) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
258 ircd_send(':'.$usr->iname.' PART :'.$ch->iname);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
259 } else {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
260 unset($uusers[$usr->uname]);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
261 unset($iusers[strtoupper($usr->iname)]);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
262 ircd_send(':'.$usr->iname.' QUIT :No more channels');
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
263 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
264 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
265
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
266 function udpmsg_getuser($nick, $create = FALSE, $net = NULL, $explicit = FALSE) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
267 global $uusers, $iusers, $ircd_name;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
268 if (array_key_exists($nick, $uusers)) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
269 $usr = $uusers[$nick];
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
270 } else {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
271 if (!$create) return NULL;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
272 $usr = new UUser();
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
273 $usr->uname = $nick;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
274 $usr->unet = $net;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
275 $usr->explicit = $explicit;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
276 $usr->iname = udpmsg_getnick($usr, $nick);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
277 $ident = preg_replace('/[^a-zA-Z0-9\-_]/', '', $usr->uname);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
278 if (!strlen($ident)) $ident = 'unknown';
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
279 $net = preg_replace('/[^a-zA-Z0-9\-_]/', '', $net);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
280 if (!strlen($net)) $net = 'unknown';
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
281 ircd_send('NICK '.$usr->iname.' 0 0 '.$ident.' '.$net.'.udpmsg3 '.$ircd_name.' 0 :UDPMSG3 user');
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
282 $uusers[$nick] = $iusers[strtoupper($usr->iname)] = $usr;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
283 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
284 $usr->seen = time();
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
285 return $usr;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
286 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
287
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
288 function udpmsg_getnick($usr, $req) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
289 global $iusers, $config;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
290 $nick = preg_replace('/[^a-zA-Z0-9\-_]/', '', $req);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
291 if (!strlen($nick)) $nick = 'NoNick';
1
7f01316130e8 Basic support for private messages in unrealircd proxy
Ivo Smits <Ivo@UCIS.nl>
parents: 0
diff changeset
292 else if (strlen($nick) > 20) $nick = substr($nick, 0, 20);
0
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
293 switch ($config['ircd']['nick_format']) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
294 case 'plain': break;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
295 case 'prefix': $nick = $config['ircd']['nick_prefix'].$nick; break;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
296 case 'suffix': $nick = $nick.$config['ircd']['nick_suffix']; break;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
297 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
298 if (isset($iusers[strtoupper($nick)])) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
299 switch ($config['ircd']['nick_in_use']) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
300 case 'prefix': $nick = $config['ircd']['nick_prefix'].$nick; break;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
301 case 'suffix': $nick = $nick.$config['ircd']['nick_suffix']; break;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
302 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
303 $bnick = $nick;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
304 while (isset($iusers[strtoupper($nick)])) $nick = $bnick.rand(0, 999);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
305 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
306 return $nick;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
307 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
308
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
309 function ircd_process($line) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
310 global $ichannels, $iusers, $ircd_name, $bot_nick;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
311 print('IR: '.$line."\n");
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
312 $partsa = explode(' :', $line, 2);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
313 $parts = explode(' ', $partsa[0]);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
314 $sender = ($parts[0][0] == ':') ? substr(array_shift(&$parts), 1) : NULL;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
315 $command = array_shift(&$parts);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
316 if (count($partsa) > 1) array_push(&$parts, $partsa[1]);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
317 $partsa = explode('!', $sender);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
318 $sendernick = $partsa[0];
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
319 switch (strtoupper($command)) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
320 case 'REHASH':
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
321 if (strtoupper($parts[0]) != strtoupper($ircd_name)) break;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
322 reconfigure();
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
323 ircd_send('NOTICE '.$sendernick.' :Reloaded configuration.');
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
324 break;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
325 case 'PING':
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
326 ircd_send('PONG'.($sender?' '.$sender:'').' :'.$parts[0]);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
327 break;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
328 case 'SVSNICK':
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
329 $sendernick = array_shift($parts);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
330 case 'NICK':
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
331 if ($sender === NULL) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
332 ircd_getuser($parts[0], TRUE);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
333 } else {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
334 $usr = ircd_getuser($sendernick, FALSE);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
335 if ($usr === NULL) break;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
336 if (is_a($usr, 'IUser')) ircd_userchannels($usr, array('CMD' => 'NICK', 'NEWNICK' => $parts[0]));
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
337 unset($iusers[strtoupper($usr->iname)]);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
338 $usr->iname = $parts[0];
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
339 $iusers[strtoupper($usr->iname)] = $usr;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
340 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
341 break;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
342 case 'PRIVMSG': case 'NOTICE':
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
343 if ($parts[1] == '--print-internals' && $parts[0][0] == '#') {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
344 ircd_send(':'.$bot_nick.' PRIVMSG '.$parts[0].' :We have '.count($GLOBALS['iusers']).' IRC users of which '.count($GLOBALS['uusers']).' UDPMSG users, and '.count($GLOBALS['ichannels']).' channels.');
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
345 break;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
346 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
347 $usr = ircd_getuser($sendernick, FALSE);
1
7f01316130e8 Basic support for private messages in unrealircd proxy
Ivo Smits <Ivo@UCIS.nl>
parents: 0
diff changeset
348 if ($parts[0][0] == '#') {
7f01316130e8 Basic support for private messages in unrealircd proxy
Ivo Smits <Ivo@UCIS.nl>
parents: 0
diff changeset
349 $ch = ircd_getchannel($parts[0]);
7f01316130e8 Basic support for private messages in unrealircd proxy
Ivo Smits <Ivo@UCIS.nl>
parents: 0
diff changeset
350 if ($ch === NULL || $usr === NULL) break;
7f01316130e8 Basic support for private messages in unrealircd proxy
Ivo Smits <Ivo@UCIS.nl>
parents: 0
diff changeset
351 udpmsg_send(array('CMD' => 'MSG', 'CHN' => $ch->uname, 'MSG' => $parts[1], 'USR' => $usr->iname));
7f01316130e8 Basic support for private messages in unrealircd proxy
Ivo Smits <Ivo@UCIS.nl>
parents: 0
diff changeset
352 } else {
7f01316130e8 Basic support for private messages in unrealircd proxy
Ivo Smits <Ivo@UCIS.nl>
parents: 0
diff changeset
353 $tousr = ircd_getuser($parts[0], FALSE);
7f01316130e8 Basic support for private messages in unrealircd proxy
Ivo Smits <Ivo@UCIS.nl>
parents: 0
diff changeset
354 if ($tousr === NULL || $usr === NULL) break;
7f01316130e8 Basic support for private messages in unrealircd proxy
Ivo Smits <Ivo@UCIS.nl>
parents: 0
diff changeset
355 udpmsg_send(array('CMD' => 'PMSG', 'DUSR' => $tousr->uname, 'MSG' => $parts[1], 'USR' => $usr->iname));
7f01316130e8 Basic support for private messages in unrealircd proxy
Ivo Smits <Ivo@UCIS.nl>
parents: 0
diff changeset
356 }
0
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
357 break;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
358 case 'SAJOIN':
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
359 case 'SVSJOIN':
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
360 $sendernick = array_shift($parts);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
361 case 'JOIN':
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
362 $usr = ircd_getuser($sendernick, FALSE);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
363 if ($usr === NULL) break;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
364 $chs = explode(',', $parts[0]);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
365 foreach ($chs as $chn) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
366 $ch = ircd_getchannel($chn);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
367 if ($ch === NULL) break;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
368 $usr->channels[$ch->name] = $ch;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
369 if (is_a($usr, 'IUser')) udpmsg_send(array('CMD' => 'JOIN', 'CHN' => $ch->uname, 'USR' => $usr->iname));
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
370 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
371 break;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
372 case 'SAPART':
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
373 case 'SVSPART':
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
374 $sendernick = array_shift($parts);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
375 case 'PART':
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
376 $usr = ircd_getuser($sendernick, FALSE);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
377 if ($usr === NULL) break;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
378 $chs = explode(',', $parts[0]);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
379 foreach ($chs as $chn) ircd_part($usr, $chn);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
380 break;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
381 case 'KICK':
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
382 ircd_part(ircd_getuser($parts[1], FALSE), $parts[0]);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
383 break;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
384 case 'QUIT':
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
385 ircd_quit($sendernick);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
386 break;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
387 case 'KILL':
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
388 case 'SVSKILL':
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
389 ircd_quit($parts[0]);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
390 break;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
391 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
392 return TRUE;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
393 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
394
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
395 function ircd_quit($nick) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
396 global $iusers, $uusers;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
397 $usr = ircd_getuser($nick, FALSE);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
398 if ($usr === NULL) return;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
399 if (is_a($usr, 'IUser')) ircd_userchannels($usr, array('CMD' => 'PART'));
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
400 if (is_a($usr, 'UUser')) unset($uusers[$usr->uname]);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
401 unset($iusers[strtoupper($usr->iname)]);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
402 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
403
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
404 function ircd_getchannel($chn) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
405 global $ichannels;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
406 $chn = strtoupper($chn);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
407 if (!array_key_exists($chn, $ichannels)) return NULL;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
408 return $ichannels[$chn];
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
409 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
410 function ircd_getuser($nick, $create = TRUE) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
411 global $iusers;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
412 $snick = strtoupper($nick);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
413 if (array_key_exists($snick, $iusers)) return $iusers[$snick];
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
414 if (!$create) return NULL;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
415 $usr = new IUser();
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
416 $usr->iname = $nick;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
417 $iusers[$snick] = $usr;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
418 return $usr;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
419 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
420 function ircd_part($usr, $chn) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
421 $ch = ircd_getchannel($chn);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
422 if ($ch === NULL || $usr === NULL) return;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
423 unset($usr->channels[$ch->name]);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
424 if (is_a($usr, 'IUser')) udpmsg_send(array('CMD' => 'PART', 'CHN' => $ch->uname, 'USR' => $usr->iname));
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
425 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
426 function ircd_userchannels($usr, $msg) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
427 $msg['USR'] = $usr->iname;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
428 foreach ($usr->channels as $ch) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
429 $msg['CHN'] = $ch->uname;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
430 udpmsg_send($msg);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
431 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
432 }