Просмотр файла includes/service/chat10.php

Размер файла: 15.32Kb
  1. <?php
  2. error_reporting(7);
  3.  
  4. $name=explode('.',$_SERVER['HTTP_X_FORWARDED_HOST']);
  5. $user=strtolower($name[0]);
  6. $domain=strtolower($name[1]);
  7. $path='/home/kmx/www/sites/'.$domain.'/'.$user.'/';
  8. if (!is_dir($path.'.')) {header('Location: http://kmx.ru/?not_found');exit;}
  9.  
  10. $nocache=rand(1000,9999);
  11.  
  12. $f=@fopen($path.'services.dat','r');
  13. $servicelist=@fread($f,1024);
  14. @fclose($f);
  15. $offservice=(!strpos(';'.$servicelist.';', 'chat10;'));
  16.  
  17. $name=strtoupper($user).'-чат';
  18.  
  19. Header("Content-type:text/vnd.wap.wml; charset=Utf-8");
  20. Header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
  21. Header("Cache-Control: no-cache, must-relative");
  22.  
  23. $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>";
  24. if ($offservice) die ($wml.'<card id="chat" title="'.$name.'"><p align="center">Данная услуга автором сайта не заказана...<br/><anchor>Назад<prev/></anchor></p></card></wml>');
  25.  
  26. touch($path."chat.msg");
  27. if (!file_exists($path."chat.usr"))
  28. {
  29. define("DBName","kmx");
  30. define("HostName","localhost");
  31. define("UserName","kmx");
  32. define("Password","kmx-hosting");
  33.  
  34. $connectserv=@mysql_connect(HostName, UserName, Password);
  35. $selectDB=@mysql_select_db(DBName);
  36. $connect_bd=(($connectserv!=0)&&($selectDB!=0));
  37.  
  38. if (!$connect_bd) include($rootpath."mysqlerror.php");
  39.  
  40. $q=@mysql(DBName,"SELECT `pass` FROM `users` WHERE `domain` = '".addslashes($domain)."' AND `login` = '".addslashes($user)."' LIMIT 0, 1");
  41. $data=mysql_fetch_array($q);
  42. $pass=$data['pass'];
  43. $f=fopen($path.'chat.usr','w+');
  44. fwrite($f,$user."\t".$pass."\t3\t99999\n");
  45. fclose($f);
  46. }
  47. touch($path."chat.cus");
  48.  
  49. $u=$_SERVER['QUERY_STRING'];
  50. if ($HTTP_POST_VARS['u']!='') $u=$HTTP_POST_VARS['u'];
  51.  
  52. $u=urldecode($u);
  53. $b=explode(":",str_replace("\t"," ",str_replace("\n"," ",str_replace("$","$$",htmlspecialchars(stripslashes($u))))),5);
  54.  
  55. $l=trim($b[0]);
  56. $p=trim($b[1]);
  57. $c=trim($b[2]);
  58. $r=trim($b[3]);
  59. $m=trim($b[4]);
  60.  
  61. #print_r($b);
  62. # $l - логин
  63. # $p - пароль
  64. # $c - команда
  65. # $r - получатель
  66. # $m - сообщение
  67.  
  68. //Рисунки
  69. $i00='<img src="." alt=""/>';
  70. $i01='<img src="/chatlogo.gif" alt="logo"/>';
  71.  
  72. //Подпись
  73. #$tm='<br/><br/><small>Сrеаted bу &#xA9;Dиmоn</small>';
  74. $tm='<br/><br/><small>&#xA9;K-Media</small>';
  75.  
  76. //Начало карты
  77. $c01='<card id="chat" title="'.$name.'">';
  78. //Конец карты
  79. $c98='</card>';
  80. //Конец и деки
  81. $c99='</card></wml>';
  82.  
  83. //Параграф с левым выравниванием
  84. $p01='<p align="left">';
  85. //Параграф с центральным выравниванием
  86. $p02='<p align="center">';
  87. //Параграф с правым выравниванием
  88. $p03='<p align="right">';
  89. //Закрыть параграф
  90. $p99='</p>';
  91.  
  92. $u=urlencode(html_entity_decode($l)).':'.urlencode(html_entity_decode($p)).':';
  93. #$u=html_entity_decode($l.':'.$p.':');
  94. #$u=$l.':'.$p.':';
  95. //Кнопка "назад"
  96. $a01='<br/><anchor>Назад<prev/></anchor>';
  97. //Кнопка "на главную"
  98. $a02='<br/><a href="http://'.$user.'.'.$domain.'.ru" accesskey="#">На главную</a>';
  99. //Кнопка "войти"
  100. $a03='<br/><anchor>Войти<go href="/chat10.srv" method="post" accept-charset="UTF-8"><postfield name="u" value="$(l'.$nocache.'):$(p'.$nocache.'):read"/></go></anchor>';
  101. //Кнопка "регистрация"
  102. $a04='<br/><anchor>Регистрация<go href="/chat10.srv" method="post" accept-charset="UTF-8"><postfield name="u" value="$(l'.$nocache.'):$(p'.$nocache.'):new"/></go></anchor>';
  103. //Кнопка "обновить"
  104. $a05='<br/><a href="/chat10.srv?'.$u.'read" accesskey="1">Обновить</a>';
  105. //Кнопка "написать"
  106. $a06='<br/><a href="/chat10.srv?'.$u.'write" accesskey="2">Написать</a>';
  107. //Кнопка "выйти"
  108. $a07='<br/><a href="/chat10.srv?'.$u.'quit" accesskey="*">Выйти</a>';
  109. //Кнопка "отправить"
  110. $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>';
  111. //Кнопка "кто тут?"
  112. $a09='<br/><a href="/chat10.srv?'.$u.'who" accesskey="3">Кто тут?</a>';
  113.  
  114. //Soft-Кнопка "обновить"
  115. $s01='<do name="a1" type="options" label="Обновить"><go href="/chat10.srv?'.$u.'read"/></do>';
  116. //Soft-Кнопка "написать"
  117. $s02='<do name="a2" type="options" label="Написать"><go href="/chat10.srv?'.$u.'write"/></do>';
  118. //Soft-Кнопка "кто тут?"
  119. $s03='<do name="a3" type="options" label="Кто тут?"><go href="/chat10.srv?'.$u.'who"/></do>';
  120. //Soft-Кнопка "FAQ"
  121. $faq='<do name="a9" type="options" label="FAQ"><go href="/chat10.srv?'.$u.'faq"/></do>';
  122.  
  123. //Поле "логин"
  124. $f01='<br/>Логин:<br/><input type="text" name="l'.$nocache.'" title="Логин" maxlength="16" value="'.$l.'"/>';
  125. //Поле "пароль"
  126. $f02='<br/>Пароль:<br/><input type="text" emptyok="false" name="p'.$nocache.'" title="Пароль" maxlength="10" value=""/>';
  127. //Поле "сообщение"
  128. $f03='Сообщение:<br/><input name="m'.$nocache.'" type="text" title="Сообщение" value="" maxlength="150"/>';
  129.  
  130. //Пустой текст
  131. $t00='';
  132. //Неправильнй логин или пароль
  133. $t01='Неправильный логин или пароль!';
  134. //Не указан логин или пароль
  135. $t02='Не указан логин или пароль!';
  136. //Вы успешно зарегистрированы
  137. $t03='Вы успешно зарегистрированы!';
  138. //Доступ временно закрыт
  139. $t04='<b>Доступ временно закрыт.</b>';
  140.  
  141. //Таймер обновления
  142. $tm1='<onevent type="ontimer"><go href="/chat10.srv?'.$u.'read"/></onevent><timer value="600"/>';
  143.  
  144. $st=1;
  145. //Авторизация
  146. $f=fopen($path."chat.usr","r");
  147. $tl=$tp=false;
  148. while (!$tl and !feof($f))
  149. {
  150. $tu=fgets($f,1024);$b=explode("\t",$tu);
  151. $cl=$b[0]; //логин
  152. $cp=$b[1]; //пароль
  153. $st=$b[2]; //статус
  154. $lt=$b[3]; //последний тайм-штамп
  155. if ($cl==trim($l)) {$tl=true;$tp=($cp==trim($p));}
  156. }
  157. fclose($f);
  158.  
  159. # Не был на сайте более 100000 секунд - обновляем
  160. if (substr(time(),0,5)>substr($lt,0,5))
  161. {
  162. $t=file($path."chat.usr");
  163. $f=fopen($path."chat.usr","w+");
  164. for ($i=0;$i<sizeof($t);$i++)
  165. {
  166. $b=explode("\t",$t[$i]);
  167. fwrite($f,$b[0]."\t".$b[1]."\t".$b[2]."\t".substr(time(),0,5)."\t\n");
  168. }
  169. flock($f,3); fclose($f);
  170. }
  171.  
  172. $ta=$tl&&$tp;
  173. # $tl - существование логина
  174. # $tp - совпадение пароля
  175. # $ta - успешность авторизации
  176.  
  177. //Первый вход
  178. if (($c!='new')&&(($p=='')&&($l==''))||($c=='quit')) die($wml.$c01.$p02.$i01.$t00.$f01.$f02.$a03.$a04."<br/>".$a01.$a02.$tm.$p99.$c99);
  179.  
  180. //Добавление пользователя (новый логин, логин и пароль не пустые)
  181. 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;}
  182.  
  183. //Добавление пользователя (логин или пароль пустые)
  184. if (($c=='new')&&(($p=='')||($l==''))) die($wml.$c01.$p02.$i00.$t02.$f01.$f02.$a03.$a04."<br/>".$a01.$a02.$tm.$p99.$c99);
  185.  
  186. //Добавление пользователя (логин и пароль существуют и верны)
  187. if (($c=='new')&&$ta) die($wml.$c01.$p02.$i00.$t03.$a03."<br/>".$a01.$a02.$tm.$p99.$c99);
  188.  
  189. //Аторизация не прошла
  190. if (($c!='new')&&!$ta) die($wml.$c01.$p02.$i00.$t01.$f01.$f02.$a03.$a04."<br/>".$a01.$a02.$tm.$p99.$c99);
  191.  
  192. //Доступ запрещен
  193. if ($st==0) die($wml.$c01.$p02.$t04.$a01.$p99.$c99);
  194.  
  195. //Обновление текущего списка посетителей
  196. $f=fopen($path."chat.cus","r+");
  197. $t=file($path."chat.cus");
  198. unset($cu);
  199. flock($f,LOCK_EX);
  200. $f=fopen($path."chat.cus","w");
  201. $cu[]=$l;
  202. for ($i=0;$i<sizeof($t);$i++)
  203. {
  204. $s=explode("\t",$t[$i]);
  205. if (($s[0]<time())||($s[1]==$l)||($s[1]=="")) continue;
  206. fwrite($f,$s[0]."\t".$s[1]."\t\n");
  207. $cu[]=$s[1];
  208. }
  209. fwrite($f,(time()+300)."\t".$l."\t\n");
  210. flock($f,3);fclose($f);
  211.  
  212. //Выбор "Кому"
  213. $v01='<br/>Кому:<br/><select name="t'.$nocache.'" title="Кому" value=""><option value="">-всем-</option>';
  214. for ($i=0;$i<sizeof($cu);$i++) $v01.='<option value="'.$cu[$i].'">'.$cu[$i].'</option>';
  215. $v01.='</select>';
  216.  
  217. if ($c=='write') die($wml.$c01.$oe1.$p02.$f03.$v01.$a08."<br/>".$a01.$a07.$tm.$p99.$c99);
  218.  
  219. if ($c=='who')
  220. {
  221. $cu=implode("<br/>",$cu);
  222. die($wml.$c01.$p02."<b>В комнате:</b><br/>".$cu.$a01.$tm.$p99.$c99);
  223. }
  224.  
  225. if ($c=='post')
  226. {
  227. $xl=$l; $xr=$r; $xm=$m;
  228. if (substr($m,0,1)=='#')
  229. {
  230. $m=explode(" ",$m,2);
  231. # Если младше чем модер
  232. if (($st<2))
  233. {
  234. # То выводим "Выполнение команд Вам недоступно"
  235. $xl=""; $xr=$l; $xm="<b>Выполнение команд вам недоступно.</b><!--".rand(100,999)."-->";
  236. }
  237. else
  238. {
  239. # Иначе обрабатываем команду
  240. switch ($m[0])
  241. {
  242. # Если #CLS - очищаем файл сообщений
  243. case "#cls" :
  244. {
  245. $f=fopen($path."chat.msg","w");fclose($f);
  246. $xl="";
  247. $xr="";
  248. $xm="<b>".$l." очистил(а) список сообщений.</b>";
  249. break;
  250. }
  251. # Если #ADMIN - очищаем файл сообщений
  252. case "#admin" :
  253. {
  254. $f=fopen($path."chat.msg","w");fclose($f);
  255. $xl="";
  256. $xr=$l;
  257. $xm="<b>В чете единственный администратор: ".$user.".</b>";
  258. break;
  259. }
  260. # Если операция над логином
  261. case "#del" :
  262. case "#ban" :
  263. case "#user" :
  264. case "#moder" :
  265. {
  266. # Если логин-объект не указан явно, то берем из поля "кому"
  267. if ($r=="") $r=$m[1];
  268. # Если логин-объект не определен, то выводим "Не указан логин"
  269. if ($r=="")
  270. {
  271. $xl="";
  272. $xr=$l;
  273. $xm="<b>Не указан логин.</b><!--".rand(100,999)."-->";
  274. break;
  275. }
  276. # Иначе работаем с логином
  277. elseif ($l==$r)
  278. {
  279. $xl="";
  280. $xr=$l;
  281. $xm="<b>Выполнение команд на себя запрещено!</b><!--".rand(100,999)."-->";
  282. break;
  283. }
  284. else
  285. {
  286. # Сохраняем список пользователей в массив
  287. $t=file($path."chat.usr");
  288. # Пересоздаем файл пользователей и открываем на запись
  289. $f=fopen($path."chat.usr","r+");
  290. flock($f,LOCK_EX);
  291. $f=fopen($path."chat.usr","w+");
  292. # Перебираем пользователей
  293. for ($i=0;$i<sizeof($t);$i++)
  294. {
  295. $b=explode("\t",$t[$i]);
  296. $tl=$b[0]; //логин
  297. if ($tl=='') continue;
  298. $tp=$b[1]; //пароль
  299. $ts=$b[2]; //статус
  300. $tlt=$b[3]; //тайм-штамп
  301. # Если пользователь не тот, что нам нужен, то переходим к следующему
  302. if ($tl!=$r)
  303. {
  304. fwrite($f,$tl."\t".$tp."\t".$ts."\t".$tlt."\t\n");
  305. continue;
  306. }
  307. # Если назначаем модера, и наш статус 'Админ', то меняем статус логина на 2 ('Модер')
  308. if (($m[0]=="#moder")&&($st=3))
  309. {
  310. $ts=2;
  311. $xl="";
  312. $xr="";
  313. //$l." naznachil(a) ".$r." moderatorom
  314. $xm="<b>".$l." назначил(а) ".$r." модератором.</b><!--".rand(100,999)."-->";
  315. }
  316. # Если назначаем юзера, и наш статус 'Модер' и выше, а статус пользователя меньше нашего, то меняем статус логина на 1 ('Юзер')
  317. elseif (($m[0]=="#user")&&($st>$ts)&&($st>1))
  318. {
  319. $ts=1;
  320. $xl="";
  321. $xr="";
  322. //$l." naznachil(a) ".$r." pol'zovatelem
  323. $xm="<b>".$l." назначил(а) ".$r." пользователем.</b><!--".rand(100,999)."-->";
  324. }
  325. # Если назначаем бан, и наш статус 'Модер' и выше, а статус пользователя меньше нашего, то меняем статус логина на 0 ('Бан')
  326. elseif (($m[0]=="#ban")&&($st>$ts)&&($st>1))
  327. {
  328. $ts=0;
  329. $xl="";
  330. $xr="";
  331. //$l." zablokiroval(a) login ".$r
  332. $xm="<b>".$l." заблокировал(а) логин ".$r.".</b><!--".rand(100,999)."-->";
  333. }
  334. # Если удаляем запись, и наш статус 'Модер' и выше, а статус пользователя меньше нашего, то переходим к следующему пользователю
  335. elseif (($m[0]=="#del")&&($st>$ts)&&($st>1))
  336. {
  337. $xl="";
  338. $xr="";
  339. //$l." udalil(a) login ".$r
  340. $xm="<b>".$l." удалил(а) логин ".$r.".</b><!--".rand(100,999)."-->";
  341. continue;
  342. }
  343. elseif (($st<=$ts)) { $xl=""; $xr=$l; $xm="<b>Недостаточно прав.</b><!--".rand(100,999)."-->"; }//Nedostatochno prav
  344. if ($tl!='') fwrite($f,$tl."\t".$tp."\t".$ts."\t".$tlt."\t\n");
  345. }
  346. flock($f,3); fclose($f);
  347. }
  348. break;
  349. }
  350. # Если команда не обработана...
  351. default :
  352. {
  353. $xl="";
  354. $xr=$l;
  355. $xm="<b>Неверно указана команда.</b><!--".rand(100,999)."-->";
  356. break;
  357. }
  358. }
  359. }
  360. }
  361.  
  362. $f=file($path."chat.msg");
  363. for ($i=0;$i<10;$i++) {$p=explode("\t",$f[$i]); if ($p[3]==$xm) $xm="";}
  364. $f=fopen($path."chat.msg","r+");
  365. flock($f,2);
  366. $wt=date("H:i")."\t".$xl."\t".$xr."\t".$xm."\t\n".fread($f,8192);
  367. fseek($f,0);
  368. if ($xm!="") fwrite($f,substr($wt,0,8192));
  369. flock($f,3);
  370. fclose($f);
  371. $c='read';
  372. }
  373.  
  374. if ($c=='read')
  375. {
  376. $f=file($path."chat.msg");
  377. unset($m);
  378. for ($i=0;$i<sizeof($f);$i++)
  379. {
  380. $p=explode("\t",$f[$i]);
  381. if (($p[1]!=$l)&&($p[2]!=$l)&&($p[2]!="")) continue;
  382. if ($p[2]=="") $mt=$p[0]." <b><u>".$p[1]."</u>&gt;</b> ".$p[3]."<br/>";
  383. if ($p[2]!="") $mt=$p[0]." <b><u>".$p[1]."&#xE410;".$p[2]."</u>&gt;</b> ".$p[3]."<br/>";
  384. if (strlen($m.$mt)<=1800) $m.=$mt;
  385. }
  386. die($wml.$c01.$tm1.$s01.$s02.$s03.$faq.$p01.$m.$a05.$a06.$a09.$a07.$tm.$p99.$c99);
  387. }
  388.  
  389. if ($c=='faq')
  390. die($wml.$c01.$p01.
  391. '<u>Команды чата:</u><br/>'.
  392. 'Для пользователей - нет<br/>'.
  393. 'Для модераторов и админов:<br/>'.
  394. 'Удаление регистрации - #del login<br/>'.
  395. 'Запрет на вход (ban) - #ban login<br/>'.
  396. 'Снятие бана - #user login<br/>'.
  397. 'Очистка комнаты - #cls.<br/>'.
  398. 'Для админов:<br/>'.
  399. #'Назначение администратора - #admin login<br/>'.
  400. 'Назначение модератора - #moder login<br/>'.
  401. 'Разжалование до пользователя - #user login<br/>'.
  402. 'Если пользователь находится в чате, то можно его '.
  403. 'логин выбирать из списка "кому".<br/>'.
  404. $a10.$a01.$tm.$p99.$c99);
  405.  
  406. die($wml.$c01.$p01."Неопознанная ошибка!".$a01.$tm.$p99.$c99);
  407. ?>
  408. <u>Команды чата:</u><br/>
  409. Для пользователей - нет<br/>
  410. Для модераторов и админов:<br/>
  411. Удаление регистрации - #del login<br/>
  412. Запрет на вход (ban) - #ban login<br/>
  413. Снятие бана - #user login<br/>
  414. Очистка комнаты - #cls.<br/>
  415. Для админов:<br/>
  416. Назначение администратора - #admin login<br/>
  417. Назначение модератора - #moder login<br/>
  418. Разжалование до пользователя - #user login<br/>
  419. Если пользователь находится в чате, то можно его
  420. логин выбирать из списка "кому".