annotate simpleircd/simpleircd.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 #!/usr/bin/php
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2 <?php
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
3 /* Copyright 2010 Ivo Smits <Ivo@UCIS.nl>. All rights reserved.
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
4 Redistribution and use in source and binary forms, with or without modification, are
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
5 permitted provided that the following conditions are met:
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
6
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
7 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
8 conditions and the following disclaimer.
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
9
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
10 2. Redistributions in binary form must reproduce the above copyright notice, this list
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
11 of conditions and the following disclaimer in the documentation and/or other materials
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
12 provided with the distribution.
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
13
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
14 THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
15 WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
16 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
17 CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
18 CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
19 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
20 ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
21 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
22 ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
23
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
24 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
25 authors and should not be interpreted as representing official policies, either expressed
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
26 or implied, of Ivo Smits.*/
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
27
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
28 srand();
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
29
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
30 $listchannels = array();
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
31 $channels = array();
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
32
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
33 $udpmsg = NULL;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
34 $udpmsg_buffer = '';
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
35
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
36 $client_name = NULL;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
37 $client_buffer = '';
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
38
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
39 srand();
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
40
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
41 require 'config.php';
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
42
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
43 client_send(':server NOTICE AUTH :*** Not looking up your hostname, we do not care.');
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
44 client_send(':server NOTICE AUTH :*** Not checking ident, are you serious?');
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
45
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
46 while ($client_name === NULL) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
47 $line = client_read_line();
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
48 $partsa = explode(' :', $line, 2);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
49 $parts = explode(' ', $partsa[0]);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
50 $command = array_shift(&$parts);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
51 if (count($partsa) > 1) array_push(&$parts, $partsa[1]);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
52 switch (strtoupper($command)) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
53 case 'NICK': //Nickname change: newnick = $parts[0]
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
54 if (!preg_match('/^[a-zA-Z0-9\-_]+$/', $parts[0])) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
55 client_sendnumeric(432, $parts[0].' :Erroneous nickname');
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
56 } else {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
57 $client_name = $parts[0];
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
58 client_sendnumeric(001, ':Welcome to the Internet Relay Chat Network');
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
59 client_sendnumeric(002, ':Your host is UDPMSG3-IRCD');
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
60 client_sendnumeric(003, ':This server was created some time ago');
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
61 client_sendnumeric(004, 'irc.udpmsg3.local 1.0 + +');
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
62 client_sendnumeric(005, 'NICKLEN=16 CHANNELLEN=16 CHANTYPES=# NETWORK=UDPMSG3 :are supported by this server');
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
63 client_sendnumeric(251, ':There are 1 users and some invisible on a bunch of servers');
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
64 client_sendnumeric(252, '0 :operator(s) online');
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
65 client_sendnumeric(254, count($config['channels']).' :channels formed');
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
66 client_sendnumeric(255, ':I have a bunch of clients and a bunch of servers');
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
67 client_sendnumeric(265, ':Current Local Users: undisclosed');
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
68 client_sendnumeric(266, ':Current Global Users: unknown');
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
69 client_sendnumeric(375, ':- server Message of the Day - ');
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
70 client_sendnumeric(372, ':- No message, sorry.');
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
71 client_sendnumeric(376, ':End of /MOTD command.');
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
72 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
73 case 'USER':
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
74 case 'PASS':
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
75 break;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
76 default:
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
77 client_sendnumeric(421, $command.' :Unknown command');
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
78 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
79 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
80
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
81 $udpmsg = stream_socket_client('tcp://'.$config['udpmsg']['host'].':'.$config['udpmsg']['port']);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
82 if (!$udpmsg) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
83 client_send('ERROR :Could not connect to exchange.');
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
84 die();
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
85 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
86
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
87 while (TRUE) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
88 $selwrite = NULL;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
89 $selread = array($udpmsg, STDIN);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
90 $selerror = array($udpmsg, STDIN);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
91 stream_select(&$selread, &$selwrite, &$selerror, 10);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
92 if (in_array($udpmsg, $selerror)) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
93 fclose($udpmsg);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
94 client_send('ERROR :Lost connection to exchange.');
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
95 die();
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
96 } else {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
97 if (in_array($udpmsg, $selread)) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
98 if (!udpmsg_read($udpmsg)) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
99 fclose($udpmsg);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
100 client_send('ERROR :Error in exchange protocol.');
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
101 die();
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
102 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
103 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
104 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
105 if (in_array(STDIN, $selerror)) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
106 fclose($udpmsg);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
107 client_send('ERROR :Error while reading from client.');
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
108 die();
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
109 } else if (in_array(STDIN, $selread)) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
110 if (!client_read()) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
111 fclose($udpmsg);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
112 client_send('ERROR :End of file.');
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
113 die();
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
114 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
115 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
116 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
117
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
118 function udpmsg_read() {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
119 global $channels, $udpmsg, $udpmsg_buffer, $config;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
120 $msg = fread($udpmsg, 1024);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
121 if (!strlen($msg)) return FALSE;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
122 $udpmsg_buffer .= $msg;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
123 while (strlen($udpmsg_buffer) > 2) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
124 $len = ord($udpmsg_buffer[0]) * 256 + ord($udpmsg_buffer[1]);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
125 if ($len <= 0 || $len > 1024) return FALSE;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
126 if (strlen($udpmsg_buffer) < 2 + $len) break;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
127 $msg = substr($udpmsg_buffer, 2, $len);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
128 $udpmsg_buffer = substr($udpmsg_buffer, 2 + $len);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
129 $parts = explode("\0", $msg);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
130 $ret = array();
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
131 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
132
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
133 if (!isset($ret['CHN']) || !isset($ret['CMD']) || !isset($ret['USR'])) continue;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
134 if (!substr($ret['CHN'], 0, strlen($config['udpmsg']['chprefix']))) continue;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
135 $chn = '#'.substr($ret['CHN'], strlen($config['udpmsg']['chprefix']));
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
136 if (!in_array($chn, $channels)) continue;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
137 if ($ret['CMD'] == 'MSG') {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
138 if (!isset($ret['MSG'])) continue;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
139 $from = preg_replace('/[^a-zA-Z0-9\-_]/', '', $ret['USR']);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
140 if ($config['udpmsg']['nicknetwork'] && isset($ret['NET'])) $from = preg_replace('/[^a-zA-Z0-9\-_]/', '', $ret['NET']).$config['udpmsg']['nickseparator'].$from;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
141 $from = $config['udpmsg']['nickprefix'].$from;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
142 $message = preg_replace('/[\x00\x10-\x13]/', '', $ret['MSG']);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
143 client_send(':'.$from.' PRIVMSG '.$chn.' :'.$message);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
144 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
145 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
146 return TRUE;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
147 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
148
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
149 function udpmsg_send($arr) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
150 global $udpmsg;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
151 $tmp = array();
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
152 foreach ($arr as $key => $value) { $tmp[] = $key; $tmp[] = $value; }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
153 $tmp[] = '';
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
154 $msg = implode("\0", $tmp);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
155 $len = strlen($msg);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
156 if ($len > 1024) return;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
157 $lens = chr(floor($len / 256)).chr($len % 256);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
158 fwrite($udpmsg, $lens.$msg);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
159 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
160
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
161 function array_remove(&$arr, $item) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
162 foreach ($arr as $key => $value) if ($value === $item) unset($arr[$key]);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
163 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
164
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
165 function client_read() {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
166 global $client_buffer;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
167 $newdata = fread(STDIN, 1024);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
168 if ($newdata === FALSE || !strlen($newdata)) return FALSE;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
169 $client_buffer .= $newdata;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
170 $offset = 0;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
171 $len = strlen($client_buffer);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
172 while ($offset < $len) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
173 $posa = strpos($client_buffer, "\n", $offset);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
174 $posb = strpos($client_buffer, "\r", $offset);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
175 if ($posa !== FALSE && $posb !== FALSE) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
176 $pos = min($posa, $posb);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
177 } else if ($posa !== FALSE) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
178 $pos = $posa;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
179 } else if ($posb !== FALSE) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
180 $pos = $posb;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
181 } else {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
182 break;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
183 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
184 $line = substr($client_buffer, $offset, $pos - $offset);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
185 if (strlen($line)) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
186 if (!client_process($line)) return FALSE;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
187 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
188 $offset = $pos + 1;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
189 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
190 if ($offset == $len) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
191 $client_buffer = '';
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
192 } else if ($offset != 0) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
193 $client_buffer = substr($client_buffer, $offset);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
194 }
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 client_process($line) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
199 global $client_name, $config;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
200 $partsa = explode(' :', $line, 2);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
201 $parts = explode(' ', $partsa[0]);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
202 $command = array_shift(&$parts);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
203 if (count($partsa) > 1) array_push(&$parts, $partsa[1]);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
204 switch (strtoupper($command)) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
205 case 'NICK':
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
206 if (!preg_match('/^[a-zA-Z0-9\-_]+$/', $parts[0])) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
207 client_sendnumeric(432, $parts[0].' :Erroneous nickname');
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
208 } else {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
209 $client_name = $parts[0];
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
210 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
211 break;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
212 case 'PING':
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
213 client_send('PONG :'.$parts[0]);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
214 break;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
215 case 'PRIVMSG':
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
216 case 'NOTICE':
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
217 $channels = explode(',', $parts[0]);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
218 foreach ($channels as $chn) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
219 if ($chn[0] == '#') {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
220 if (!in_array($chn, $GLOBALS['channels'])) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
221 client_sendnumeric(404, $chn.' :Can not send to channel');
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
222 } else {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
223 $umsg = array('CMD' => 'MSG', 'CHN' => $config['udpmsg']['chprefix'].substr($chn, 1), 'MSG' => $parts[1], 'USR' => $client_name, 'DUMMY' => rand(10000, 99999));
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
224 if ($config['udpmsg']['netname']) $umsg['NET'] = $config['udpmsg']['netname'];
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
225 udpmsg_send($umsg);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
226 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
227 } else {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
228 client_sendnumeric(401, $chn.' :No such nickname');
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
229 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
230 }
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 'JOIN':
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
233 $channels = explode(',', $parts[0]);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
234 foreach ($channels as $chn) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
235 if (!preg_match('/^#[a-zA-Z0-9\-_]+$/', $chn)) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
236 client_sendnumeric($client, 403, $chn.' :No such channel');
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
237 continue;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
238 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
239 if (!in_array($chn, $GLOBALS['channels'])) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
240 client_send(':'.$client_name.'!user@host JOIN :'.$chn);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
241 $GLOBALS['channels'][] = $chn;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
242 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
243 client_sendnumeric(353, '= '.$chn.' :'.$client_name);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
244 client_sendnumeric(366, $chn.' :End of /NAMES list.');
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
245 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
246 break;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
247 case 'PART':
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
248 client_send(':'.$client_name.'!user@host PART :'.$chn);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
249 array_remove($GLOBALS['channels'], $chn);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
250 break;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
251 case 'QUIT':
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
252 return FALSE;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
253 case 'NAMES':
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
254 client_sendnumeric(353, '= '.$parts[0].' :'.$client_name);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
255 client_sendnumeric(366, $parts[0].' :End of /NAMES list.');
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
256 break;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
257 case 'LIST':
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
258 client_sendnumeric($client, 321, 'Channel :Users Name');
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
259 foreach ($GLOBALS['listchannels'] as $chn) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
260 client_sendnumeric(322, $chn.' 0 :');
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
261 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
262 client_sendnumeric(323, 'End of /LIST');
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
263 break;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
264 case 'MODE':
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
265 case 'USER':
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
266 case 'USERHOST':
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
267 break;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
268 default:
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
269 client_sendnumeric(421, $command.' :Unknown command');
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
270 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
271 return TRUE;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
272 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
273
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
274 function client_sendnumeric($num, $line) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
275 global $client_name;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
276 client_send(':server '.str_pad($num, 3, '0', STR_PAD_LEFT).' '.$client_name.' '.$line);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
277 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
278
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
279 function client_send($line) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
280 print($line."\r\n");
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
281 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
282
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
283 function client_read_line() {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
284 $line = fgets(STDIN);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
285 if (!strlen($line)) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
286 client_send('ERROR :End of file.');
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
287 die();
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
288 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
289 return rtrim($line, "\r\n\x0B");
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
290 }