annotate ircrelay/ircrelay.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 print("UCIS IRC Relay bot (c) 2010 Ivo Smits <Ivo@UCIS.nl>\n");
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
29 print("More information: http://wiki.ucis.nl/IRCRelay\n");
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
30 print("\n");
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
31
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
32 if (defined('app_loaded')) return;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
33 define('app_loaded', TRUE);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
34 if (!isset($config)) include './config.php';
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
35
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
36 class Network {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
37 public $key = NULL;
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 $socket = NULL;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
40 public $server = NULL;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
41 public $port = 6667;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
42 public $nick = NULL;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
43 public $realnick = NULL;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
44 public $connected = FALSE;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
45 public $connecting = FALSE;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
46 public $timeout = 0;
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 $addressfamily = AF_INET;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
49 public $active = FALSE;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
50 public $ident = 'none';
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
51 public $realname = 'Not set - http://wiki.qontrol.nl/IRCRelay';
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
52 public $debug = FALSE;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
53 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
54 class NetworkChannel {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
55 public $network;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
56 public $channel;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
57 public $name;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
58 public $display;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
59 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
60 class Channel {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
61 public $name = NULL;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
62 public $udpmsg = FALSE;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
63 public $links = array();
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
64 public function __construct($name) { $this->name = $name; }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
65 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
66
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
67 $networks = array();
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
68 $channels = array();
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
69 $udpmsg = NULL;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
70 $udpmsg_config = NULL;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
71 $udpmsg_connected = FALSE;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
72 $udpmsg_timer = 0;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
73 $udpmsg_buffer = '';
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
74 $udpmsg_channels = array();
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
75 $status = NULL;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
76 $adminpass = NULL;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
77
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
78 srand();
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
79
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
80 prepare();
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
81 configure();
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
82 init();
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
83 readloop();
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
84
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
85 function getchannel($name) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
86 global $channels;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
87 if (array_key_exists($name, $channels)) return $channels[$name];
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
88 $ch = new Channel($name);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
89 $channels[$name] = $ch;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
90 return $ch;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
91 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
92 function configure() {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
93 global $networks, $config;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
94 global $channels;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
95 global $adminpass;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
96 global $udpmsg, $udpmsg_config, $udpmsg_channels;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
97
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
98 print("Parsing configuration...\n");
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
99 //require 'config.php';
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
100
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
101 if (isset($config['password'])) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
102 $adminpass = $config['password'];
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
103 require_once './ircrelay_admincmd.php';
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 (isset($config['udpmsg'])) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
106 $udpmsg_config = $config['udpmsg'];
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
107 $udpmsg = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
108 socket_set_nonblock($udpmsg);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
109 @socket_connect($udpmsg, $udpmsg_config['host'], $udpmsg_config['port']);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
110 foreach ($udpmsg_config['channels'] as $chk => $chn) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
111 $ch = getchannel($chn);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
112 $ch->udpmsg = $chk;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
113 $udpmsg_channels[$chk] = $ch;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
114 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
115 unset($udpmsg_config['channels']);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
116 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
117 foreach ($config['networks'] as $key => $nc) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
118 $net = new Network();
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
119 $net->key = $key;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
120 $net->server = $nc['server'];
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
121 $net->nick = $nc['nick'];
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
122 $net->name = isset($nc['name']) ? $nc['name'] : $key;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
123 if (isset($nc['port'])) $net->port = $nc['port'];
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
124 if (isset($nc['ident'])) $net->ident = $nc['ident'];
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
125 if (isset($nc['realname'])) $net->realname = $nc['realname'];
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
126 if (isset($nc['ipv6']) && $nc['ipv6']) $net->addressfamily = AF_INET6;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
127 if (isset($nc['debug']) && $nc['debug']) $net->debug = TRUE;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
128 foreach ($nc['channels'] as $chn => $cf) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
129 $ch = getchannel($cf['link']);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
130 $nch = new NetworkChannel();
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
131 $nch->name = $chn;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
132 $nch->network = $net;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
133 $nch->channel = $ch;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
134 $nch->display = isset($cf['display']) ? $cf['display'] : $net->key;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
135 $ch->links[] = $nch;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
136 $net->channels[$chn] = $nch;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
137 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
138 $networks[$key] = $net;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
139 $net->active = TRUE;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
140 print('NET '.$net->key.' create'."\n");
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
141 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
142 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
143
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
144 function prepare() {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
145 global $channels, $status;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
146 print("Starting IRC Relay...\n");
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
147 $ch = new Channel('status');
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
148 $channels[$ch->name] = $ch;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
149 $status = $ch;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
150 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
151
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
152 function init() {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
153 global $networks;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
154 print("Initializing...\n");
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
155 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
156
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
157 function readloop() {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
158 global $networks, $udpmsg, $listener, $udpmsg_connected, $udpmsg_config, $udpmsg_timer;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
159
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
160 $ltime = 0;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
161
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
162 print("Running\n");
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
163 while (TRUE) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
164 $selread = array();
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
165 $selwrite = array();
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
166 $selerror = array();
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
167 $selcount = 0;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
168
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
169 $ntime = time();
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
170 $tdiff = $ntime - $ltime;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
171 $ltime = $ntime;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
172
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
173 if ($udpmsg === NULL && $udpmsg_config['host'] !== NULL) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
174 $udpmsg_timer += $tdiff;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
175 if ($udpmsg_timer >= 30) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
176 fprintf(STDERR, "UDPMSG: Reconnecting...\n");
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
177 $udpmsg = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
178 socket_set_nonblock($udpmsg);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
179 @socket_connect($udpmsg, $udpmsg_config['host'], $udpmsg_config['port']);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
180 $udpmsg_timer = 0;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
181 }
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 if ($udpmsg !== NULL) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
185 $selread[] = $udpmsg;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
186 $selerror[] = $udpmsg;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
187 if (!$udpmsg_connected) $selwrite[] = $udpmsg;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
188 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
189
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
190 foreach ($networks as $net) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
191 if ($net->connected) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
192 $selread[] = $net->socket;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
193 $selerror[] = $net->socket;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
194 $selcount++;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
195 } else if ($net->connecting) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
196 $selwrite[] = $net->socket;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
197 $selerror[] = $net->socket;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
198 $selcount++;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
199 } else if ($net->active) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
200 $net->timeout -= $tdiff;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
201 if ($net->timeout <= 0) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
202 $net->connecting = TRUE;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
203 print('NET '.$net->key.' connect '.$net->server.':'.$net->port."\n");
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
204 $net->socket = socket_create($net->addressfamily, SOCK_STREAM, SOL_TCP);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
205 socket_set_nonblock($net->socket);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
206 socket_connect($net->socket, $net->server, $net->port);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
207 $selwrite[] = $net->socket;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
208 $selerror[] = $net->socket;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
209 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
210 }
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 if (!$selcount) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
214 sleep(1);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
215 continue;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
216 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
217
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
218 socket_select(&$selread, &$selwrite, &$selerror, 10);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
219
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
220 if (in_array($udpmsg, $selerror)) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
221 fprintf(STDERR, "UDPMSG: Error: select error.\n");
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
222 socket_close($udpmsg);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
223 $udpmsg = NULL;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
224 $udpmsg_connected = FALSE;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
225 } else {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
226 if (in_array($udpmsg, $selwrite) && !$udpmsg_connected) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
227 fprintf(STDERR, "UDPMSG: Connected.\n");
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
228 $udpmsg_buffer = '';
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
229 $udpmsg_connected = TRUE;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
230 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
231 if (in_array($udpmsg, $selread)) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
232 if (!udpmsg_read($udpmsg)) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
233 fprintf(STDERR, "UDPMSG: Error: closing connection.\n");
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
234 socket_close($udpmsg);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
235 $udpmsg = NULL;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
236 $udpmsg_connected = FALSE;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
237 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
238 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
239 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
240
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
241 foreach ($networks as $net) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
242 if (in_array($net->socket, $selerror)) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
243 print('NET '.$net->key.' socket error'."\n");
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
244 network_reset($net);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
245 } else if ($net->connected && in_array($net->socket, $selread)) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
246 if (!network_read($net)) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
247 print('NET '.$net->key.' read error'."\n");
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
248 network_reset($net);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
249 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
250 } else if ($net->connecting && in_array($net->socket, $selwrite)) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
251 $net->connected = TRUE;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
252 $net->connecting = FALSE;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
253 print('NET '.$net->key.' identify '.$net->nick."\n");
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
254 network_send($net, 'USER '.$net->ident.' host server :'.$net->realname);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
255 network_send($net, 'NICK '.$net->nick);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
256 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
257 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
258 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
259 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
260
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
261 function udpmsg_read() {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
262 global $channels, $clients, $udpmsg, $udpmsg_buffer, $udpmsg_channels, $udpmsg_config;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
263 $msg = socket_read($udpmsg, 1024);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
264 if (!strlen($msg)) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
265 fprintf(STDERR, "UDPMSG: End of file\n");
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
266 return FALSE;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
267 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
268 $udpmsg_buffer .= $msg;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
269 while (strlen($udpmsg_buffer) > 2) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
270 $len = ord($udpmsg_buffer[0]) * 256 + ord($udpmsg_buffer[1]);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
271 if ($len <= 0 || $len > 1024) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
272 fprintf(STDERR, "UDPMSG: Error: protocol error\n");
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
273 return FALSE;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
274 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
275 if (strlen($udpmsg_buffer) < 2 + $len) break;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
276 $msg = substr($udpmsg_buffer, 2, $len);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
277 $udpmsg_buffer = substr($udpmsg_buffer, 2 + $len);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
278 $parts = explode("\0", $msg);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
279 $ret = array();
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
280 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
281
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
282 if (!isset($ret['CHN']) || !isset($ret['CMD']) || !isset($ret['USR'])) continue;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
283 if (!array_key_exists($ret['CHN'], $udpmsg_channels)) continue;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
284 $ch = $udpmsg_channels[$ret['CHN']];
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
285 if ($ret['CMD'] == 'MSG') {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
286 if (!isset($ret['MSG'])) continue;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
287 $from = preg_replace('/[^a-zA-Z0-9\-_]/', '', $ret['USR']);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
288 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
289 $from = $udpmsg_config['nickprefix'].$from;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
290 $message = preg_replace('/[\x00\x10-\x13]/', '', $ret['MSG']);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
291 $prefix = '['.$from.'] ';
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
292 if (ord($message[0]) == 1) { //CTCP
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
293 if (substr($message, 1, 6) != 'ACTION') continue;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
294 $message = chr(1).'ACTION '.$prefix.substr($message, 8, -1).chr(1);
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 $message = $prefix.$message;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
297 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
298 channel_send($ch, $message, $udpmsg);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
299 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
300 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
301 return TRUE;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
302 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
303
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
304 function udpmsg_send($arr) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
305 global $udpmsg, $udpmsg_connected;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
306 if (!$udpmsg || !$udpmsg_connected) return;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
307 $tmp = array();
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
308 foreach ($arr as $key => $value) { $tmp[] = $key; $tmp[] = $value; }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
309 $tmp[] = '';
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
310 $msg = implode("\0", $tmp);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
311 $len = strlen($msg);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
312 if ($len > 1024) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
313 fprintf(STDERR, "UDPMSG: Error: message too long!\n");
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
314 return;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
315 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
316 $lens = chr(floor($len / 256)).chr($len % 256);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
317 socket_write($udpmsg, $lens.$msg);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
318 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
319
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
320 function network_reset($net) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
321 print('NET '.$net->key.' reset'."\n");
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
322 socket_close($net->socket);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
323 $net->connected = FALSE;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
324 $net->connecting = FALSE;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
325 $net->readbuffer = '';
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
326 $net->timeout = 60;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
327 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
328
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
329 function network_read($net) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
330 $newdata = socket_read($net->socket, 1024);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
331 if ($newdata === FALSE || !strlen($newdata)) return FALSE;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
332 $net->readbuffer .= $newdata;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
333 $offset = 0;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
334 $len = strlen($net->readbuffer);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
335 while ($offset < $len) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
336 $posa = strpos($net->readbuffer, "\n", $offset);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
337 $posb = strpos($net->readbuffer, "\r", $offset);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
338 if ($posa !== FALSE && $posb !== FALSE) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
339 $pos = min($posa, $posb);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
340 } else if ($posa !== FALSE) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
341 $pos = $posa;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
342 } else if ($posb !== FALSE) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
343 $pos = $posb;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
344 } else {
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 $line = substr($net->readbuffer, $offset, $pos - $offset);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
348 if (strlen($line)) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
349 if (!network_process($net, $line)) return FALSE;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
350 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
351 $offset = $pos + 1;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
352 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
353 if ($offset == $len) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
354 $net->readbuffer = '';
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
355 } else if ($offset != 0) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
356 $net->readbuffer = substr($net->readbuffer, $offset);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
357 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
358 return TRUE;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
359 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
360
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
361 function network_process($net, $line) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
362 global $adminpass, $udpmsg, $udpmsg_connected;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
363 if ($net->debug) print('NET '.$net->key.' recv '.$line."\n");
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
364 $partsa = explode(' :', $line, 2);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
365 $parts = explode(' ', $partsa[0]);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
366 if ($parts[0][0] == ':') {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
367 $sender = substr(array_shift(&$parts), 1);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
368 } else {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
369 $sender = NULL;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
370 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
371 $command = array_shift(&$parts);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
372 if (count($partsa) > 1) array_push(&$parts, $partsa[1]);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
373 $partsa = explode('!', $sender);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
374 $sendernick = $partsa[0];
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
375 switch (strtoupper($command)) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
376 case '001': //Welcome
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
377 $net->realnick = $parts[0];
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
378 print('NET '.$net->key.' welcome '.$net->realnick."\n");
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
379 foreach ($net->channels as $ch) network_send($net, "JOIN :".$ch->name);
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 '433': //Nickname in use
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
382 print('NET '.$net->key.' nickname_in_use'."\n");
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
383 network_send($net, "NICK ".$net->nick.rand(100,999));
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
384 break;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
385 case 'NICK': //Nickname change
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
386 if (strcasecmp($sendernick, $net->realnick)) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
387 $net->realnick = $parts[0];
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
388 print('NET '.$net->key.' nickname '.$net->realnick."\n");
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
389 }
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 case 'PING':
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
392 network_send($net, 'PONG :'.$parts[0]);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
393 break;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
394 case 'PRIVMSG':
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
395 case 'NOTICE':
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
396 if ($parts[0][0] == '#') {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
397 $to = $parts[0];
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
398 } else {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
399 $to = $sendernick;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
400 if (!is_null($adminpass) && $parts[1][0] == '.' && substr($parts[1], 1, strlen($adminpass)) === $adminpass) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
401 $ret = admincmd(array_slice(explode(' ', $parts[1]), 1));
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
402 network_send($net, 'PRIVMSG '.$to.' :'.$ret);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
403 break;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
404 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
405 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
406 if (!array_key_exists($to, $net->channels)) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
407 print('NET '.$net->key.' privmsg '.$sendernick.' @ '.$to.' - '.$parts[1]."\n");
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
408 break;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
409 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
410 $ch = $net->channels[$to];
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
411 $prefix = '['.$sendernick.(is_null($ch->display) ? '' : ' @ '.$ch->display).'] ';
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
412 if (ord($parts[1][0]) == 1) { //CTCP
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
413 if (substr($parts[1], 1, 6) != 'ACTION') break;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
414 $msg = chr(1).'ACTION '.$prefix.substr($parts[1], 8, -1).chr(1);
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 $msg = $prefix.$parts[1];
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
417 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
418 channel_send($ch->channel, $msg, $ch, $command == 'NOTICE');
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
419 if ($udpmsg && $udpmsg_connected && $ch->channel->udpmsg) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
420 $msg = array('CMD' => 'MSG', 'CHN' => $ch->channel->udpmsg, 'MSG' => $parts[1], 'USR' => $sendernick, 'DUMMY' => rand(10000, 99999));
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
421 if (!is_null($ch->display)) $msg['NET'] = $ch->display;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
422 udpmsg_send($msg);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
423 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
424 break;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
425 case '372': //Motd
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
426 case '376': //End of moth
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
427 case '002': //Your host
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
428 case '003': //This server
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
429 case '004': //Version
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
430 case '005': //Supported
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
431 case '422': //Motd missing
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
432 case '251': case '254': case '255': case '265': case '266': case '396': case '353': case '366':
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
433 case '252': case '375':
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
434 case 'MODE':
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
435 case 'JOIN':
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
436 case 'PART':
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
437 case 'QUIT':
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
438 break;
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
439 default:
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
440 print('NET '.$net->key.' unknown '.$line."\n");
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
441 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
442 return TRUE;
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 network_send($net, $line) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
446 if ($net->debug) print('NET '.$net->key.' send '.$line."\n");
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
447 $line .= "\r\n";
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
448 socket_send($net->socket, $line, strlen($line), 0);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
449 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
450
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
451 function channel_send($ch, $message, $source = NULL, $notice = FALSE) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
452 foreach ($ch->links as $link) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
453 if ($link->network->connected && $link !== $source) {
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
454 network_send($link->network, ($notice ? 'NOTICE ' : 'PRIVMSG ').$link->name.' :'.$message);
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
455 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
456 }
dd81c38b513a Initial commit
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
457 }