=config('debug','debuglevel',DEBUG_WARNING)) echo $msg."\n";
}
$sock = @socket_create(AF_INET,SOCK_STREAM,SOL_TCP)
or die('ERROR: socket_create: '.socket_strerror(socket_last_error())."\n");
@socket_bind($sock,config('listen','device','0.0.0.0'),config('listen','port',80))
or die('ERROR: socket_bind: '.socket_strerror(socket_last_error())."\n");
@socket_listen($sock,config('listen','maxconn',20))
or die('ERROR: socket_listen: '.socket_strerror(socket_last_error())."\n");
@socket_set_nonblock($sock)
or die('ERROR: socket_set_nonblock: '.socket_strerror(socket_last_error())."\n");
$conn = array();
$CHATUSER = array();
function chatuser_find($nick) {
for ($k=array_keys($GLOBALS['CHATUSER']),$l=sizeof($k),$i=0;$i<$l;$i++)
if (!strcasecmp($GLOBALS['CHATUSER'][$k[$i]]['nick'],$nick)) return $k[$i];
return NULL;
}
function chatuser_prepare($nick) {
do { $sid = 's'.strtr(md5($nick.time().mt_rand(100000000,199999999)),'0','g'); } while (isset($GLOBALS['CHATUSER'][$sid]));
$GLOBALS['CHATUSER'][$sid] = array(
'nick' => $nick,
'sid' => $sid,
'color' => '000000',
'output' => false
);
return $sid;
}
function chatuser_send($text,$except=NULL) {
for ($k=array_keys($GLOBALS['CHATUSER']),$l=sizeof($k),$i=0;$i<$l;$i++)
if ($GLOBALS['CHATUSER'][$k[$i]]['output']!==$except)
socket_write($GLOBALS['conn'][$GLOBALS['CHATUSER'][$k[$i]]['output']]['sock'],$text."\n");
}
function httpd_chat__output($conkey) {
parse_str($GLOBALS['conn'][$conkey]['header']['query_string'],$query);
if ((!isset($query['sid'])) || (!isset($GLOBALS['CHATUSER'][$query['sid']]))) {
socket_write($GLOBALS['conn'][$conkey]['sock'],"HTTP/1.1 307 Temporary Redirect\r\nLocation: /\r\n\r\n");
httpd_core__dropconnection($conkey);
return;
}
if (!empty($GLOBALS['CHATUSER'][$query['sid']]['output'])) { httpd_core__error($conkey, 200); return; }
$GLOBALS['CHATUSER'][$query['sid']]['output'] = $conkey;
$GLOBALS['CHATUSER'][$query['sid']]['login'] =
$GLOBALS['CHATUSER'][$query['sid']]['action'] = time();
$GLOBALS['conn'][$conkey]['tickhandler'] = 'httpd_chat__keepalive';
$GLOBALS['conn'][$conkey]['nexttick'] = time()+15;
$GLOBALS['conn'][$conkey]['chatsid'] = $query['sid'];
$prebuf = " \n";
socket_write($GLOBALS['conn'][$conkey]['sock'],"HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n".
'
Willkommen im Chat. Für '.
'eine Übersicht über die Befehle gib "/help" ein.
Viel Spass!
'.
$prebuf.$prebuf.$prebuf.$prebuf.$prebuf);
chatuser_send(''.date('H:i ').$GLOBALS['CHATUSER'][$GLOBALS['conn'][$conkey]['chatsid']]['nick'].' hat den Chat betreten.
');
}
function httpd_chat__input($conkey) {
parse_str($GLOBALS['conn'][$conkey]['header']['query_string'],$query);
if ((!isset($query['sid'])) || (!isset($GLOBALS['CHATUSER'][$query['sid']]))) {
echo 'No such SID: '.$query['sid'].' - SIDs: '.implode(', ',array_keys($GLOBALS['CHATUSER']))."\n";
socket_write($GLOBALS['conn'][$conkey]['sock'],"HTTP/1.1 307 Temporary Redirect\r\nLocation: /\r\n\r\n");
httpd_core__dropconnection($conkey);
return;
}
$GLOBALS['CHATUSER'][$query['sid']]['action'] = time();
if (isset($query['t'])) {
$query['t'] = preg_replace('/[\x00-\x1f]+/','',$query['t']);
if (strlen(trim($query['t']))==0) ;
else if ($query['t']{0}=='/') {}
else {
chatuser_send('('.
$GLOBALS['CHATUSER'][$query['sid']]['nick'].') '.str_replace('<','<',$query['t']).'
');
}
httpd_core__error($conkey,204);
} else { socket_write($GLOBALS['conn'][$conkey]['sock'],"HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n".
'');
httpd_core__dropconnection($conkey);
}
}
function httpd_chat__keepalive($conkey) {
if (false===@socket_write($GLOBALS['conn'][$conkey]['sock']," ") &&
(socket_last_error()==10054 || socket_last_error()==10054))
httpd_chat__quitchat($conkey);
else if ($GLOBALS['CHATUSER'][$GLOBALS['conn'][$conkey]['chatsid']]['action']+600