annotate ircd/ircd.php @ 0:dd81c38b513a

Initial commit
author Ivo Smits <Ivo@UCIS.nl>
date Mon, 28 Feb 2011 00:49:07 +0100
parents
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 (!isset($config)) include './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 UDPMSG3 IRC server (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.ucis.nl/UDPMSG3\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 srand();
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
36
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
37 class Channel {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
38 public $name = NULL;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
39 public $udpmsg = FALSE;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
40 public $users = array();
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
41 public $persistent = FALSE;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
42 public function __construct($name) { $this->name = $name; }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
43 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
44 class Client {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
45 public $socket = NULL;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
46 public $name = NULL;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
47 public $channels = array();
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
48 public $readbuffer = '';
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
49 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
50
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
51 $channels = array();
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
52 $clients = array();
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
53 $udpmsg = NULL;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
54 $udpmsg_config = NULL;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
55 $udpmsg_connected = FALSE;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
56 $udpmsg_timer = 0;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
57 $udpmsg_buffer = '';
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
58 $udpmsg_channels = array();
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
59 $listener = NULL;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
60
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
61 srand();
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
62
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
63 prepare();
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
64 configure();
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
65 init();
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
66 readloop();
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
67
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
68 function getchannel($name) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
69 global $channels;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
70 if (array_key_exists($name, $channels)) return $channels[$name];
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
71 $ch = new Channel($name);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
72 $channels[$name] = $ch;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
73 return $ch;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
74 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
75 function configure() {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
76 global $channels, $config;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
77 global $udpmsg, $udpmsg_config, $udpmsg_channels;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
78
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
79 print("Parsing configuration...\n");
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
80 //require 'config.php';
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
81
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
82 if (isset($config['udpmsg'])) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
83 $udpmsg_config = $config['udpmsg'];
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
84 $udpmsg = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
85 socket_set_nonblock($udpmsg);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
86 @socket_connect($udpmsg, $udpmsg_config['host'], $udpmsg_config['port']);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
87 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
88 foreach ($config['channels'] as $key => $cf) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
89 $ch = getchannel($key);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
90 $ch->persistent = TRUE;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
91 if (isset($cf['udpmsg'])) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
92 $ch->udpmsg = $cf['udpmsg'];
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
93 $udpmsg_channels[$cf['udpmsg']] = $ch;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
94 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
95 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
96 }
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 prepare() {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
99 global $channels;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
100 print("Starting IRC Relay...\n");
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 function init() {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
104 global $listener;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
105 print("Initializing...\n");
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
106 $listener = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
107 socket_bind($listener, '0.0.0.0', 7777) or die("Could not bind listening socket.\n");
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
108 socket_listen($listener) or die("Could not start listening.\n");
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
109 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
110
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
111 function readloop() {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
112 global $channels, $clients, $udpmsg, $listener, $udpmsg_connected, $udpmsg_config, $udpmsg_timer;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
113
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
114 $ltime = 0;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
115
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
116 print("Running\n");
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
117 while (TRUE) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
118 $ntime = time();
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
119 $tdiff = $ntime - $ltime;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
120 $ltime = $ntime;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
121
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
122 if ($udpmsg === NULL && $udpmsg_config['host'] !== NULL) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
123 $udpmsg_timer += $tdiff;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
124 if ($udpmsg_timer >= 30) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
125 fprintf(STDERR, "UDPMSG: Reconnecting...\n");
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
126 $udpmsg = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
127 socket_set_nonblock($udpmsg);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
128 @socket_connect($udpmsg, $udpmsg_config['host'], $udpmsg_config['port']);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
129 $udpmsg_timer = 0;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
130 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
131 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
132
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
133 $selread = array();
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
134 $selwrite = array();
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
135 $selerror = array();
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
136
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
137 if ($udpmsg !== NULL) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
138 $selread[] = $udpmsg;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
139 $selerror[] = $udpmsg;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
140 if (!$udpmsg_connected) $selwrite[] = $udpmsg;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
141 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
142 $selread[] = $listener;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
143
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
144 foreach ($clients as $client) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
145 $selread[] = $client->socket;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
146 $selerror[] = $client->socket;
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 socket_select(&$selread, &$selwrite, &$selerror, 10);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
150
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
151 if (in_array($listener, $selread)) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
152 client_accept($listener);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
153 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
154
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
155 if (in_array($udpmsg, $selerror)) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
156 fprintf(STDERR, "UDPMSG: Error: select error.\n");
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
157 socket_close($udpmsg);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
158 $udpmsg = NULL;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
159 $udpmsg_connected = FALSE;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
160 } else {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
161 if (in_array($udpmsg, $selwrite) && !$udpmsg_connected) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
162 fprintf(STDERR, "UDPMSG: Connected.\n");
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
163 $udpmsg_buffer = '';
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
164 $udpmsg_connected = TRUE;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
165 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
166 if (in_array($udpmsg, $selread)) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
167 if (!udpmsg_read($udpmsg)) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
168 fprintf(STDERR, "UDPMSG: Error: closing connection.\n");
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
169 socket_close($udpmsg);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
170 $udpmsg = NULL;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
171 $udpmsg_connected = FALSE;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
172 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
173 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
174 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
175
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
176 foreach ($clients as $client) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
177 if (in_array($client->socket, $selerror)) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
178 client_close($client);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
179 } else if (in_array($client->socket, $selread)) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
180 if (!client_read($client)) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
181 client_close($client);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
182 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
183 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
184 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
185 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
186 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
187
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
188 function client_accept($listener) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
189 global $clients;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
190 $client = new Client();
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
191 $client->socket = socket_accept($listener);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
192 if (!$client->socket) return;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
193 if (!socket_getpeername($client->socket, &$addr, &$port)) $addr = 'unknown';
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
194 fprintf(STDERR, 'Accepted client '.$addr.':'.$port."\n");
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
195 client_send($client, ':server NOTICE AUTH :*** Not looking up your hostname, we do not care.');
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
196 client_send($client, ':server NOTICE AUTH :*** Not checking ident, are you serious?');
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
197 $clients[(int)($client->socket)] = $client;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
198 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
199
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
200 function client_close($client, $reason = '') {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
201 global $clients, $channels;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
202 socket_close($client->socket);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
203 array_remove($clients, $client);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
204 $users = array();
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
205 foreach ($client->channels as $ch) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
206 array_remove($ch->users, $client);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
207 if (count($ch->users)) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
208 foreach ($ch->users as $user) if (!in_array($user, $users)) $users[] = $user;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
209 } elseif (!$ch->persistent) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
210 array_remove($channels, $ch);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
211 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
212 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
213 foreach ($users as $user) client_send($user, ':'.$client->name.' QUIT :'.$reason);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
214 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
215
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
216 function udpmsg_read() {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
217 global $channels, $clients, $udpmsg, $udpmsg_buffer, $udpmsg_channels, $udpmsg_config;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
218 $msg = socket_read($udpmsg, 1024);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
219 if (!strlen($msg)) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
220 fprintf(STDERR, "UDPMSG: End of file\n");
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
221 return FALSE;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
222 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
223 $udpmsg_buffer .= $msg;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
224 while (strlen($udpmsg_buffer) > 2) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
225 $len = ord($udpmsg_buffer[0]) * 256 + ord($udpmsg_buffer[1]);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
226 if ($len <= 0 || $len > 1024) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
227 fprintf(STDERR, "UDPMSG: Error: protocol error\n");
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
228 return FALSE;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
229 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
230 if (strlen($udpmsg_buffer) < 2 + $len) break;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
231 $msg = substr($udpmsg_buffer, 2, $len);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
232 $udpmsg_buffer = substr($udpmsg_buffer, 2 + $len);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
233 $parts = explode("\0", $msg);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
234 $ret = array();
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
235 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
236
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
237 if (!isset($ret['CHN']) || !isset($ret['CMD']) || !isset($ret['USR'])) continue;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
238 if (!array_key_exists($ret['CHN'], $udpmsg_channels)) continue;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
239 $ch = $udpmsg_channels[$ret['CHN']];
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
240 if ($ret['CMD'] == 'MSG') {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
241 if (!isset($ret['MSG'])) continue;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
242 $from = preg_replace('/[^a-zA-Z0-9\-_]/', '', $ret['USR']);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
243 if ($udpmsg_config['nicknetwork'] && isset($ret['NET'])) $from = preg_replace('/[^a-zA-Z0-9\-_]/', '', $ret['NET']).$udpmsg_config['nickseparator'].$from;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
244 $from = $udpmsg_config['nickprefix'].$from;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
245 $message = preg_replace('/[\x00\x10-\x13]/', '', $ret['MSG']);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
246 channel_send($ch, NULL, ':'.$from.' PRIVMSG '.$ch->name.' :'.$message);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
247 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
248 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
249 return TRUE;
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_send($arr) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
253 global $udpmsg, $udpmsg_connected;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
254 if (!$udpmsg || !$udpmsg_connected) return;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
255 $tmp = array();
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
256 foreach ($arr as $key => $value) { $tmp[] = $key; $tmp[] = $value; }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
257 $tmp[] = '';
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
258 $msg = implode("\0", $tmp);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
259 $len = strlen($msg);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
260 if ($len > 1024) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
261 fprintf(STDERR, "UDPMSG: Error: message too long!\n");
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
262 return;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
263 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
264 $lens = chr(floor($len / 256)).chr($len % 256);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
265 socket_write($udpmsg, $lens.$msg);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
266 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
267
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
268
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
269 function array_remove(&$arr, $item) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
270 foreach ($arr as $key => $value) if ($value === $item) unset($arr[$key]);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
271 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
272
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
273 function find_nick($nick) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
274 global $clients;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
275 $nick = strtoupper($nick);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
276 foreach ($clients as $client) if (strtoupper($client->name) == $nick) return $client;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
277 return FALSE;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
278 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
279
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
280 function client_read($client) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
281 $newdata = socket_read($client->socket, 1024);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
282 if ($newdata === FALSE || !strlen($newdata)) return FALSE;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
283 $client->readbuffer .= $newdata;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
284 $offset = 0;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
285 $len = strlen($client->readbuffer);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
286 while ($offset < $len) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
287 $posa = strpos($client->readbuffer, "\n", $offset);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
288 $posb = strpos($client->readbuffer, "\r", $offset);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
289 if ($posa !== FALSE && $posb !== FALSE) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
290 $pos = min($posa, $posb);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
291 } else if ($posa !== FALSE) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
292 $pos = $posa;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
293 } else if ($posb !== FALSE) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
294 $pos = $posb;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
295 } else {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
296 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 $line = substr($client->readbuffer, $offset, $pos - $offset);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
299 if (strlen($line)) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
300 if (!client_process($client, $line)) return FALSE;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
301 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
302 $offset = $pos + 1;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
303 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
304 if ($offset == $len) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
305 $client->readbuffer = '';
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
306 } else if ($offset != 0) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
307 $client->readbuffer = substr($client->readbuffer, $offset);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
308 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
309 return TRUE;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
310 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
311
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
312 function client_process($client, $line) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
313 $partsa = explode(' :', $line, 2);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
314 $parts = explode(' ', $partsa[0]);
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 $clientname = $client->name;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
318 switch (strtoupper($command)) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
319 case 'NICK': //Nickname change: newnick = $parts[0]
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
320 if (find_nick($parts[0])) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
321 client_sendnumeric($client, 433, $parts[0].' :Nickname in use');
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
322 } elseif (!preg_match('/^[a-zA-Z0-9\-_]+$/', $parts[0])) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
323 client_sendnumeric($client, 432, $parts[0].' :Erroneous nickname');
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
324 } elseif ($client->name === NULL) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
325 $client->name = $parts[0];
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
326 client_sendnumeric($client, 001, ':Welcome to the Internet Relay Chat Network');
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
327 client_sendnumeric($client, 002, ':Your host is UDPMSG3-IRCD');
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
328 client_sendnumeric($client, 003, ':This server was created some time ago');
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
329 client_sendnumeric($client, 004, 'irc.udpmsg3.local 1.0 + +');
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
330 client_sendnumeric($client, 005, 'NICKLEN=16 CHANNELLEN=16 CHANTYPES=# NETWORK=UDPMSG3 :are supported by this server');
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
331 client_sendnumeric($client, 251, ':There are '.count($GLOBALS['clients']).' users and some invisible on a bunch of servers');
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
332 client_sendnumeric($client, 252, '0 :operator(s) online');
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
333 client_sendnumeric($client, 254, count($GLOBALS['channels']).' :channels formed');
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
334 client_sendnumeric($client, 255, ':I have a bunch of clients and a bunch of servers');
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
335 client_sendnumeric($client, 265, ':Current Local Users: undisclosed');
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
336 client_sendnumeric($client, 266, ':Current Global Users: unknown');
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
337 client_sendnumeric($client, 375, ':- server Message of the Day - ');
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
338 client_sendnumeric($client, 372, ':- No message, sorry.');
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
339 client_sendnumeric($client, 376, ':End of /MOTD command.');
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
340 } else {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
341 $users = array($client);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
342 foreach ($client->channels as $ch) foreach ($ch->users as $user) if (!in_array($user, $users)) $users[] = $user;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
343 foreach ($users as $user) client_send($user, ':'.$client->name.' NICK :'.$parts[0]);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
344 $client->name = $parts[0];
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
345 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
346 break;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
347 case 'USER':
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
348 case 'PASS':
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
349 break;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
350 default:
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
351 if ($client->name === NULL) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
352 client_send($client, ':server 451 '.$command.' :You have not registered');
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
353 break;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
354 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
355 switch (strtoupper($command)) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
356 case 'PING':
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
357 client_send($client, 'PONG :'.$parts[0]);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
358 break;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
359 case 'PRIVMSG':
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
360 case 'NOTICE':
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
361 $channels = explode(',', $parts[0]);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
362 foreach ($channels as $chn) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
363 if ($chn[0] == '#') {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
364 if (!array_key_exists($chn, $client->channels)) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
365 client_sendnumeric($client, 404, $chn.' :Can not send to channel');
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
366 } else {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
367 channel_sendmsg($client->channels[$chn], $client, $parts[1]);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
368 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
369 } else {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
370 if ($ch = find_nick($chn)) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
371 client_send($ch, ':'.$client->name.' PRIVMSG '.$chn.' :'.$parts[1]);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
372 } else {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
373 client_sendnumeric($client, 401, $chn.' :No such nickname');
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
374 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
375 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
376 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
377 break;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
378 case 'JOIN':
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
379 $channels = explode(',', $parts[0]);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
380 foreach ($channels as $chn) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
381 if (!preg_match('/^#[a-zA-Z0-9\-_]+$/', $chn)) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
382 client_sendnumeric($client, 403, $chn.' :No such channel');
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
383 continue;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
384 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
385 $ch = getchannel($chn);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
386 if (!isset($client->channels[$chn])) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
387 $client->channels[$chn] = $ch;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
388 $ch->users[] = $client;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
389 print('JOIN '.$ch->name.': '.$client->name."\n");
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
390 channel_send($ch, NULL, ':'.$client->name.'!user@host JOIN :'.$ch->name);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
391 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
392 client_sendnames($ch, $client);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
393 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
394 break;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
395 case 'PART':
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
396 $channels = explode(',', $parts[0]);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
397 foreach ($channels as $chn) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
398 if (!isset($client->channels[$chn])) continue;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
399 $ch = $client->channels[$chn];
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
400 print('PART '.$ch->name.': '.$client->name."\n");
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
401 channel_send($ch, NULL, ':'.$client->name.' PART :'.$ch->name);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
402 unset($client->channels[$chn]);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
403 array_remove(&$ch->users, $client);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
404 if (!count($ch->users) && !$ch->persistent) array_remove($GLOBALS['channels'], $ch);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
405 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
406 break;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
407 case 'QUIT':
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
408 client_close($client, isset($parts[0]) ? 'Quit: '.$parts[0] : 'Quit');
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
409 break;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
410 case 'NAMES':
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
411 $channels = explode(',', $parts[0]);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
412 foreach ($channels as $chn) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
413 if (!isset($client->channels[$chn])) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
414 client_sendnumeric($client, 403, $chn.' :No such channel');
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
415 } else {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
416 client_sendnames($client->channels[$chn], $client);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
417 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
418 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
419 break;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
420 case 'LIST':
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
421 client_sendnumeric($client, 321, 'Channel :Users Name');
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
422 foreach ($GLOBALS['channels'] as $ch) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
423 client_sendnumeric($client, 322, $ch->name.' '.count($ch->users).' :');
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
424 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
425 client_sendnumeric($client, 323, 'End of /LIST');
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
426 break;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
427 case 'MODE':
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
428 case 'USER':
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
429 case 'USERHOST':
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
430 break;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
431 default:
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
432 client_sendnumeric($client, 421, $command.' :Unknown command');
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
433 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
434 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
435 return TRUE;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
436 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
437
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
438 function client_sendnames($ch, $client) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
439 $nicks = array();
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
440 foreach ($ch->users as $u) if ($u->name !== NULL) $nicks[] = $u->name;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
441 client_sendnumeric($client, 353, '= '.$ch->name.' :'.implode(' ', $nicks));
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
442 client_sendnumeric($client, 366, $ch->name.' :End of /NAMES list.');
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
443 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
444
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
445 function client_sendnumeric($client, $num, $line) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
446 client_send($client, ':server '.str_pad($num, 3, '0', STR_PAD_LEFT).' '.$client->name.' '.$line);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
447 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
448
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
449 function client_send($client, $line) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
450 print('W: '.$line."\n");
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
451 $line .= "\r\n";
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
452 socket_send($client->socket, $line, strlen($line), 0);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
453 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
454
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
455 function channel_sendmsg($ch, $sender, $msg) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
456 global $udpmsg_config;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
457 print('MESSAGE '.$ch->name.' <'.$sender->name.'> '.$msg."\n");
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
458 channel_send($ch, $sender, ':'.$sender->name.' PRIVMSG '.$ch->name.' :'.$msg);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
459 if (!$ch->udpmsg) return;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
460 $umsg = array('CMD' => 'MSG', 'CHN' => $ch->udpmsg, 'MSG' => $msg, 'USR' => $sender->name, 'DUMMY' => rand(10000, 99999));
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
461 if ($udpmsg_config['netname']) $umsg['NET'] = $udpmsg_config['netname'];
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
462 udpmsg_send($umsg);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
463 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
464
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
465 function channel_send($ch, $sender, $msg) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
466 foreach ($ch->users as $client) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
467 if ($client === $sender) continue;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
468 client_send($client, $msg);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
469 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
470 }