<?php
error_reporting(7);
$name=explode('.',$_SERVER['HTTP_X_FORWARDED_HOST']);
$user=strtolower($name[0]);
$domain=strtolower($name[1]);
$path='/home/kmx/www/sites/'.$domain.'/'.$user.'/';
if (!is_dir($path.'.')) {header('Location: http://kmx.ru/?not_found');exit;}
$nocache=rand(1000,9999);
$f=@fopen($path.'services.dat','r');
$servicelist=@fread($f,1024);
@fclose($f);
$offservice=(!strpos(';'.$servicelist.';', 'chat10;'));
$name=strtoupper($user).'-чат';
Header("Content-type:text/vnd.wap.wml; charset=Utf-8");
Header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
Header("Cache-Control: no-cache, must-relative");
$wml="<?xml version=\"1.0\" encoding=\"Utf-8\"?><!DOCTYPE wml PUBLIC \"-//WAPFORUM//DTD WML 1.2//EN\" \"http://www.wapforum.org/DTD/wml_1.2.xml\"><wml>";
if ($offservice) die ($wml.'<card id="chat" title="'.$name.'"><p align="center">Данная услуга автором сайта не заказана...<br/><anchor>Назад<prev/></anchor></p></card></wml>');
touch($path."chat.msg");
if (!file_exists($path."chat.usr"))
{
define("DBName","kmx");
define("HostName","localhost");
define("UserName","kmx");
define("Password","kmx-hosting");
$connectserv=@mysql_connect(HostName, UserName, Password);
$selectDB=@mysql_select_db(DBName);
$connect_bd=(($connectserv!=0)&&($selectDB!=0));
if (!$connect_bd) include($rootpath."mysqlerror.php");
$q=@mysql(DBName,"SELECT `pass` FROM `users` WHERE `domain` = '".addslashes($domain)."' AND `login` = '".addslashes($user)."' LIMIT 0, 1");
$data=mysql_fetch_array($q);
$pass=$data['pass'];
$f=fopen($path.'chat.usr','w+');
fwrite($f,$user."\t".$pass."\t3\t99999\n");
fclose($f);
}
touch($path."chat.cus");
$u=$_SERVER['QUERY_STRING'];
if ($HTTP_POST_VARS['u']!='') $u=$HTTP_POST_VARS['u'];
$u=urldecode($u);
$b=explode(":",str_replace("\t"," ",str_replace("\n"," ",str_replace("$","$$",htmlspecialchars(stripslashes($u))))),5);
$l=trim($b[0]);
$p=trim($b[1]);
$c=trim($b[2]);
$r=trim($b[3]);
$m=trim($b[4]);
#print_r($b);
# $l - логин
# $p - пароль
# $c - команда
# $r - получатель
# $m - сообщение
//Рисунки
$i00='<img src="." alt=""/>';
$i01='<img src="/chatlogo.gif" alt="logo"/>';
//Подпись
#$tm='<br/><br/><small>РЎrеаted bСѓ ©DРёmРѕn</small>';
$tm='<br/><br/><small>©K-Media</small>';
//Начало карты
$c01='<card id="chat" title="'.$name.'">';
//Конец карты
$c98='</card>';
//Конец и деки
$c99='</card></wml>';
//Параграф с левым выравниванием
$p01='<p align="left">';
//Параграф с центральным выравниванием
$p02='<p align="center">';
//Параграф с правым выравниванием
$p03='<p align="right">';
//Закрыть параграф
$p99='</p>';
$u=urlencode(html_entity_decode($l)).':'.urlencode(html_entity_decode($p)).':';
#$u=html_entity_decode($l.':'.$p.':');
#$u=$l.':'.$p.':';
//Кнопка "назад"
$a01='<br/><anchor>Назад<prev/></anchor>';
//Кнопка "на главную"
$a02='<br/><a href="http://'.$user.'.'.$domain.'.ru" accesskey="#">На главную</a>';
//Кнопка "войти"
$a03='<br/><anchor>Войти<go href="/chat10.srv" method="post" accept-charset="UTF-8"><postfield name="u" value="$(l'.$nocache.'):$(p'.$nocache.'):read"/></go></anchor>';
//Кнопка "регистрация"
$a04='<br/><anchor>Регистрация<go href="/chat10.srv" method="post" accept-charset="UTF-8"><postfield name="u" value="$(l'.$nocache.'):$(p'.$nocache.'):new"/></go></anchor>';
//Кнопка "обновить"
$a05='<br/><a href="/chat10.srv?'.$u.'read" accesskey="1">Обновить</a>';
//Кнопка "написать"
$a06='<br/><a href="/chat10.srv?'.$u.'write" accesskey="2">Написать</a>';
//Кнопка "выйти"
$a07='<br/><a href="/chat10.srv?'.$u.'quit" accesskey="*">Выйти</a>';
//Кнопка "отправить"
$a08='<br/><anchor>Отправить<go href="/chat10.srv" method="post" accept-charset="UTF-8"><postfield name="u" value="'.$l.':'.$p.':post:$(t'.$nocache.'):$(m'.$nocache.')"/></go></anchor>';
//Кнопка "кто тут?"
$a09='<br/><a href="/chat10.srv?'.$u.'who" accesskey="3">Кто тут?</a>';
//Soft-Кнопка "обновить"
$s01='<do name="a1" type="options" label="Обновить"><go href="/chat10.srv?'.$u.'read"/></do>';
//Soft-Кнопка "написать"
$s02='<do name="a2" type="options" label="Написать"><go href="/chat10.srv?'.$u.'write"/></do>';
//Soft-Кнопка "кто тут?"
$s03='<do name="a3" type="options" label="Кто тут?"><go href="/chat10.srv?'.$u.'who"/></do>';
//Soft-Кнопка "FAQ"
$faq='<do name="a9" type="options" label="FAQ"><go href="/chat10.srv?'.$u.'faq"/></do>';
//Поле "логин"
$f01='<br/>Логин:<br/><input type="text" name="l'.$nocache.'" title="Логин" maxlength="16" value="'.$l.'"/>';
//Поле "пароль"
$f02='<br/>Пароль:<br/><input type="text" emptyok="false" name="p'.$nocache.'" title="Пароль" maxlength="10" value=""/>';
//Поле "сообщение"
$f03='Сообщение:<br/><input name="m'.$nocache.'" type="text" title="Сообщение" value="" maxlength="150"/>';
//Пустой текст
$t00='';
//Неправильнй логин или пароль
$t01='Неправильный логин или пароль!';
//Не указан логин или пароль
$t02='Не указан логин или пароль!';
//Вы успешно зарегистрированы
$t03='Вы успешно зарегистрированы!';
//Доступ временно закрыт
$t04='<b>Доступ временно закрыт.</b>';
//Таймер обновления
$tm1='<onevent type="ontimer"><go href="/chat10.srv?'.$u.'read"/></onevent><timer value="600"/>';
$st=1;
//Авторизация
$f=fopen($path."chat.usr","r");
$tl=$tp=false;
while (!$tl and !feof($f))
{
$tu=fgets($f,1024);$b=explode("\t",$tu);
$cl=$b[0]; //логин
$cp=$b[1]; //пароль
$st=$b[2]; //статус
$lt=$b[3]; //последний тайм-штамп
if ($cl==trim($l)) {$tl=true;$tp=($cp==trim($p));}
}
fclose($f);
# Не был на сайте более 100000 секунд - обновляем
if (substr(time(),0,5)>substr($lt,0,5))
{
$t=file($path."chat.usr");
$f=fopen($path."chat.usr","w+");
for ($i=0;$i<sizeof($t);$i++)
{
$b=explode("\t",$t[$i]);
fwrite($f,$b[0]."\t".$b[1]."\t".$b[2]."\t".substr(time(),0,5)."\t\n");
}
flock($f,3); fclose($f);
}
$ta=$tl&&$tp;
# $tl - существование логина
# $tp - совпадение пароля
# $ta - успешность авторизации
//Первый вход
if (($c!='new')&&(($p=='')&&($l==''))||($c=='quit')) die($wml.$c01.$p02.$i01.$t00.$f01.$f02.$a03.$a04."<br/>".$a01.$a02.$tm.$p99.$c99);
//Добавление пользователя (новый логин, логин и пароль не пустые)
if (($c=='new')&&!$tl&&($p!='')&&($l!='')) {$f=fopen($path."chat.usr","a");fputs($f,trim($l)."\t".trim($p)."\t1\t\n");fclose($f);$ta=true;}
//Добавление пользователя (логин или пароль пустые)
if (($c=='new')&&(($p=='')||($l==''))) die($wml.$c01.$p02.$i00.$t02.$f01.$f02.$a03.$a04."<br/>".$a01.$a02.$tm.$p99.$c99);
//Добавление пользователя (логин и пароль существуют и верны)
if (($c=='new')&&$ta) die($wml.$c01.$p02.$i00.$t03.$a03."<br/>".$a01.$a02.$tm.$p99.$c99);
//Аторизация не прошла
if (($c!='new')&&!$ta) die($wml.$c01.$p02.$i00.$t01.$f01.$f02.$a03.$a04."<br/>".$a01.$a02.$tm.$p99.$c99);
//Доступ запрещен
if ($st==0) die($wml.$c01.$p02.$t04.$a01.$p99.$c99);
//Обновление текущего списка посетителей
$f=fopen($path."chat.cus","r+");
$t=file($path."chat.cus");
unset($cu);
flock($f,LOCK_EX);
$f=fopen($path."chat.cus","w");
$cu[]=$l;
for ($i=0;$i<sizeof($t);$i++)
{
$s=explode("\t",$t[$i]);
if (($s[0]<time())||($s[1]==$l)||($s[1]=="")) continue;
fwrite($f,$s[0]."\t".$s[1]."\t\n");
$cu[]=$s[1];
}
fwrite($f,(time()+300)."\t".$l."\t\n");
flock($f,3);fclose($f);
//Выбор "Кому"
$v01='<br/>Кому:<br/><select name="t'.$nocache.'" title="Кому" value=""><option value="">-всем-</option>';
for ($i=0;$i<sizeof($cu);$i++) $v01.='<option value="'.$cu[$i].'">'.$cu[$i].'</option>';
$v01.='</select>';
if ($c=='write') die($wml.$c01.$oe1.$p02.$f03.$v01.$a08."<br/>".$a01.$a07.$tm.$p99.$c99);
if ($c=='who')
{
$cu=implode("<br/>",$cu);
die($wml.$c01.$p02."<b>В комнате:</b><br/>".$cu.$a01.$tm.$p99.$c99);
}
if ($c=='post')
{
$xl=$l; $xr=$r; $xm=$m;
if (substr($m,0,1)=='#')
{
$m=explode(" ",$m,2);
# Если младше чем модер
if (($st<2))
{
# То выводим "Выполнение команд Вам недоступно"
$xl=""; $xr=$l; $xm="<b>Выполнение команд вам недоступно.</b><!--".rand(100,999)."-->";
}
else
{
# Иначе обрабатываем команду
switch ($m[0])
{
# Если #CLS - очищаем файл сообщений
case "#cls" :
{
$f=fopen($path."chat.msg","w");fclose($f);
$xl="";
$xr="";
$xm="<b>".$l." очистил(а) список сообщений.</b>";
break;
}
# Если #ADMIN - очищаем файл сообщений
case "#admin" :
{
$f=fopen($path."chat.msg","w");fclose($f);
$xl="";
$xr=$l;
$xm="<b>В чете единственный администратор: ".$user.".</b>";
break;
}
# Если операция над логином
case "#del" :
case "#ban" :
case "#user" :
case "#moder" :
{
# Если логин-объект не указан явно, то берем из поля "кому"
if ($r=="") $r=$m[1];
# Если логин-объект не определен, то выводим "Не указан логин"
if ($r=="")
{
$xl="";
$xr=$l;
$xm="<b>Не указан логин.</b><!--".rand(100,999)."-->";
break;
}
# Иначе работаем с логином
elseif ($l==$r)
{
$xl="";
$xr=$l;
$xm="<b>Выполнение команд на себя запрещено!</b><!--".rand(100,999)."-->";
break;
}
else
{
# Сохраняем список пользователей в массив
$t=file($path."chat.usr");
# Пересоздаем файл пользователей и открываем на запись
$f=fopen($path."chat.usr","r+");
flock($f,LOCK_EX);
$f=fopen($path."chat.usr","w+");
# Перебираем пользователей
for ($i=0;$i<sizeof($t);$i++)
{
$b=explode("\t",$t[$i]);
$tl=$b[0]; //логин
if ($tl=='') continue;
$tp=$b[1]; //пароль
$ts=$b[2]; //статус
$tlt=$b[3]; //тайм-штамп
# Если пользователь не тот, что нам нужен, то переходим к следующему
if ($tl!=$r)
{
fwrite($f,$tl."\t".$tp."\t".$ts."\t".$tlt."\t\n");
continue;
}
# Если назначаем модера, и наш статус 'Админ', то меняем статус логина на 2 ('Модер')
if (($m[0]=="#moder")&&($st=3))
{
$ts=2;
$xl="";
$xr="";
//$l." naznachil(a) ".$r." moderatorom
$xm="<b>".$l." назначил(а) ".$r." модератором.</b><!--".rand(100,999)."-->";
}
# Если назначаем юзера, и наш статус 'Модер' и выше, а статус пользователя меньше нашего, то меняем статус логина на 1 ('Юзер')
elseif (($m[0]=="#user")&&($st>$ts)&&($st>1))
{
$ts=1;
$xl="";
$xr="";
//$l." naznachil(a) ".$r." pol'zovatelem
$xm="<b>".$l." назначил(а) ".$r." пользователем.</b><!--".rand(100,999)."-->";
}
# Если назначаем бан, и наш статус 'Модер' и выше, а статус пользователя меньше нашего, то меняем статус логина на 0 ('Бан')
elseif (($m[0]=="#ban")&&($st>$ts)&&($st>1))
{
$ts=0;
$xl="";
$xr="";
//$l." zablokiroval(a) login ".$r
$xm="<b>".$l." заблокировал(а) логин ".$r.".</b><!--".rand(100,999)."-->";
}
# Если удаляем запись, и наш статус 'Модер' и выше, а статус пользователя меньше нашего, то переходим к следующему пользователю
elseif (($m[0]=="#del")&&($st>$ts)&&($st>1))
{
$xl="";
$xr="";
//$l." udalil(a) login ".$r
$xm="<b>".$l." удалил(а) логин ".$r.".</b><!--".rand(100,999)."-->";
continue;
}
elseif (($st<=$ts)) { $xl=""; $xr=$l; $xm="<b>Недостаточно прав.</b><!--".rand(100,999)."-->"; }//Nedostatochno prav
if ($tl!='') fwrite($f,$tl."\t".$tp."\t".$ts."\t".$tlt."\t\n");
}
flock($f,3); fclose($f);
}
break;
}
# Если команда не обработана...
default :
{
$xl="";
$xr=$l;
$xm="<b>Неверно указана команда.</b><!--".rand(100,999)."-->";
break;
}
}
}
}
$f=file($path."chat.msg");
for ($i=0;$i<10;$i++) {$p=explode("\t",$f[$i]); if ($p[3]==$xm) $xm="";}
$f=fopen($path."chat.msg","r+");
flock($f,2);
$wt=date("H:i")."\t".$xl."\t".$xr."\t".$xm."\t\n".fread($f,8192);
fseek($f,0);
if ($xm!="") fwrite($f,substr($wt,0,8192));
flock($f,3);
fclose($f);
$c='read';
}
if ($c=='read')
{
$f=file($path."chat.msg");
unset($m);
for ($i=0;$i<sizeof($f);$i++)
{
$p=explode("\t",$f[$i]);
if (($p[1]!=$l)&&($p[2]!=$l)&&($p[2]!="")) continue;
if ($p[2]=="") $mt=$p[0]." <b><u>".$p[1]."</u>></b> ".$p[3]."<br/>";
if ($p[2]!="") $mt=$p[0]." <b><u>".$p[1]."".$p[2]."</u>></b> ".$p[3]."<br/>";
if (strlen($m.$mt)<=1800) $m.=$mt;
}
die($wml.$c01.$tm1.$s01.$s02.$s03.$faq.$p01.$m.$a05.$a06.$a09.$a07.$tm.$p99.$c99);
}
if ($c=='faq')
die($wml.$c01.$p01.
'<u>Команды чата:</u><br/>'.
'Для пользователей - нет<br/>'.
'Для модераторов и админов:<br/>'.
'Удаление регистрации - #del login<br/>'.
'Запрет на вход (ban) - #ban login<br/>'.
'Снятие бана - #user login<br/>'.
'Очистка комнаты - #cls.<br/>'.
'Для админов:<br/>'.
#'Назначение администратора - #admin login<br/>'.
'Назначение модератора - #moder login<br/>'.
'Разжалование до пользователя - #user login<br/>'.
'Если пользователь находится в чате, то можно его '.
'логин выбирать из списка "кому".<br/>'.
$a10.$a01.$tm.$p99.$c99);
die($wml.$c01.$p01."Неопознанная ошибка!".$a01.$tm.$p99.$c99);
?>
<u>Команды чата:</u><br/>
Для пользователей - нет<br/>
Для модераторов и админов:<br/>
Удаление регистрации - #del login<br/>
Запрет на вход (ban) - #ban login<br/>
Снятие бана - #user login<br/>
Очистка комнаты - #cls.<br/>
Для админов:<br/>
Назначение администратора - #admin login<br/>
Назначение модератора - #moder login<br/>
Разжалование до пользователя - #user login<br/>
Если пользователь находится в чате, то можно его
логин выбирать из списка "кому".