View file includes/service/chat10.php

File size: 15.32Kb
<?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у &#xA9;Dиmоn</small>';
$tm='<br/><br/><small>&#xA9;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>&gt;</b> ".$p[3]."<br/>";
        if ($p[2]!="") $mt=$p[0]." <b><u>".$p[1]."&#xE410;".$p[2]."</u>&gt;</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/>
Если пользователь находится в чате, то можно его
логин выбирать из списка "кому".