<?php
$version = 0.22;
/*
Простейший форум для WAP сайта.
Достоинства:
- можно добавлять записи и отвечать
- если в заголовке URL есть admin= паролю $admin_login (см. ниже), то около каждого сообщения появится ссылка "удалить", которая удалит сообщение все ответы на него.
- все сообщения храняться в одном файле forum.dat
- автоматическая перекодировка русских букв
- можно писать транслитом
- защита от копий сообщений при медленном GPRS
[email protected]
0.21: иcправлен баг, когда нельзя было написать первое сообщение
*/
$admin_login="12345"; // логин админа, позволяющий удалять сообщения
if ($PHP_SELF=='') $PHP_SELF = $_SERVER["PHP_SELF"]; // путь к текущему файлу, например: /phptest.php
$tmp=$QUERY_STRING;if($tmp=='') $tmp=$_SERVER["QUERY_STRING"]; // в зависимости от настроек сервера сервера
parse_str($tmp); // теперь появятся переменные $url, $p и т.д.
if ($admin_login && $admin==$admin_login) $admin="admin=$admin&"; else $admin='';// эта строчка убдет добавляться во все ссылки
if ($admin) $admin2 = "?admin=".$admin_login; else $admin2='';
$tmp=str_replace("admin=".$admin_login,"",$tmp);
// в зависимости от IP гейта, телефон кириллицу может прислать хоть и в виде %ХХ, но при urldecode выйдет абракадабра, поэтому вручную заменим этим символы на соответсвующие %ХХ в UTF-8
function tsdecode($s,$notr=0) {
global $translit;
if ($s!='') {
if ($translit==1) {
if($notr==0) {
$s = urldecode($s);
$c1eng = "ABCDEFGHIJKLMNOPRSTUVWXYZQabcdefghijklmnoprstuvwxyzq";
$c1rus = "АБЦДЕФГХИЖКЛМНОПРСТУВШЫЙЗЬабцдефгхижклмнопрстувшыйзь";
$search = array ("'QQ'","'qq'","'CSH'","'SH'","'CH'","'YA'","'YU'","'YE'","'csh'","'sh'","'ch'","'ya'","'yu'","'ye'");
$replace = array ("Ъ","ъ","Щ","Ш","Ч","Я","Ю","Э","щ","ш","ч","я","ю","э");
$s = preg_replace ($search, $replace, $s);
for ($i=0;$i<strlen($c1eng);$i++) $s=str_replace($c1eng{$i},$c1rus{$i},$s);
}
} else {
$s = str_replace("%D0%81","Ё",$s);
$s = str_replace("%d0%81","Ё",$s);
$s = str_replace("%D1%91","ё",$s);
$s = str_replace("%d1%91","ё",$s);
for ($i=144;$i<192;$i++) {$stmp = "%D0".urlencode(chr($i)); $s = str_replace(strtoupper($stmp),chr($i+48),$s); $s = str_replace(strtolower($stmp),chr($i+48),$s);}
for ($i=128;$i<144;$i++) {$stmp = "%D1".urlencode(chr($i)); $s = str_replace(strtoupper($stmp),chr($i+112),$s);$s = str_replace(strtolower($stmp),chr($i+112),$s);}
}
$s = urldecode($s);
}
return $s;
}
$from = tsdecode($from,1);
$subj = tsdecode($subj);
$msg = tsdecode($msg);
//===============================================
// таблица перекодировки транслита
//===============================================
if ($table) {
$text="<p>Таблица перекодировки:<br/>А - A<br/>Б - B<br/>В - V<br/>Г - G<br/>Д - D<br/>Е - E<br/>Ж - J<br/>З - Z<br/>И - I<br/>Й - Y<br/>К - K<br/>Л - L<br/>М - M<br/>Н - N<br/>О - O<br/>П - P<br/>Р - R<br/>С - S<br/>Т - T<br/>У - U<br/>Ф - F<br/>Х - H<br/>Ц - C<br/>Ч - CH<br/>Ш - SH<br/>Щ - CSH<br/>Ы - X<br/>Ь - Q<br/>Ъ - QQ<br/>Э - YE<br/>Ю - YU<br/>Я - YA";
tsecho($text);
die("");
}
//===============================================
// загружаем данные из forum.dat
//===============================================
if (!file_exists("forum.dat")) { // если файла нет, то создадим
$file = fopen ("forum.dat", "w");
fputs($file,"1\n");
fclose ($file);
}
$arr = array();
$file = fopen ("forum.dat", "r");
while(!feof($file)) {
$stmp = tsdecode(trim(fgets($file,1024)),1);
if ($stmp!='') $arr[] = $stmp;
}
fclose ($file);
$count = count($arr);
//for ($j=0;$j<$count;$j++) echo $arr[$j]."<br>";
//echo print_r($arr);
//===============================================
// основная страница
//===============================================
$size=1200;
if ($tmp=='' || $start) {
// выводим пока размер меньше 1200
$text="<do type=\"options\" label=\"Домой\"><go href=\"game.php\"/></do><p>
<anchor>[Написать]
<go href=\"#add\"/>
</anchor>";
if ($start=='') $start=$count-1;
else for ($i=0;$i<$count;$i++) { // ищем номер start в массиве записей
$stmp=split("\|",$arr[$i]);
if ($stmp[0]==$start) {$start=$i; break;}
}
$xCount=0;
for ($i=$start;$i>0;$i--) {
$sS="\n<br/>";
$stmp=split("\|",$arr[$i]);
for ($j=0;$j<$stmp[1];$j++) $sS.=" ";
$sS.="<a href=\"".$PHP_SELF."?".$admin."view=".$stmp[0]."\">$stmp[2]</a>";
if (strlen(preg_replace("/[А-яЁё]/e","11",$text.$sS))>$size) {$xCount=$stmp[0]; break;} else $text.=$sS;
}
if ($xCount>0) $text.="<br/><a href=\"".$PHP_SELF."?".$admin."start=".$xCount."\">[Дальше...]</a>";
// $text.="<br/><form action=$PHP_SELF method=get>Написать:<br>Имя:<br><input name=from><br>Тема:<br><input name=subj><br>Сообщение:<br><input name=msg><br><input type=hidden name=add value=1><input type=submit value=Послать></form>";
$text.="
</p>
</card>
<card id=\"add\" title=\"Написать\">
<p>
Имя:<br/><input name=\"from\"/>
<br/>Тема:<br/><input name=\"subj\"/>
<br/>Сообщение:<br/><input name=\"msg\"/>
<br/><select name=\"translit\" multiple=\"true\">
<option value=\"1\">Транслит</option>
</select>
<br/><a href=\"forum.php?".$admin."add=1&from=$(from)&subj=$(subj)&msg=$(msg)&translit=$(translit)\">Отправить</a>
<br/><a href=\"forum.php?".$admin."table=1\">Таблица перекодировки</a>";
tsecho($text);
die("");
}
//===============================================
// удаление
//===============================================
if ($admin && $delete) {
for ($i=0;$i<$count;$i++) { // ищем номер start в массиве записей
$stmp=split("\|",$arr[$i]);
if ($stmp[0]==$delete) {$delete=$i; break;}
}
$stmp=split("\|",$arr[$delete]);
$indent = $stmp[1];
array_splice($arr,$delete,1);
// ищем и удаляем все ответы на текущее
$delete--;
while ($delete>0) {
$stmp=split("\|",$arr[$delete]);
if ($stmp[1]>$indent) {
array_splice($arr,$delete,1);
$delete--;
} else break;
}
$count=count($arr);
// сохраняем все на диск...
$file = fopen ("forum.dat", "w");
for ($i=0;$i<$count;$i++) if ($arr[$i]) fputs($file,trim($arr[$i])."\n");
fclose ($file);
// выводим обновление
//include("forum.php");
$text="<do type=\"accept\" label=\"Назад\"><go href=\"forum.php".$admin2;
if ($start) $text.="&start=$start";
$text.="\"/></do><p>Сообщение удалено.";
tsecho($text);
die("");
}
//===============================================
// новое сообщение
//===============================================
if ($add) {
// добавляем новое сообщение в корень форума
if ($subj) {
if ($from=='') $from="anonymous";
$subj = strip_tags($subj);
$from = strip_tags($from);
$msg = strip_tags($msg);
$stmp = "|0|$subj - $from|$msg";
$all=implode("",$arr);
// if (strpos($all,$stmp)===false) {
$arr[]=$arr[0].$stmp;
$arr[0]+=1; // увеличиваем номер последнего свободного сообщения
$count=count($arr);
// сохраняем все на диск...
$file = fopen ("forum.dat", "w");
for ($i=0;$i<$count;$i++) if ($arr[$i]) fputs($file,urlencode(trim($arr[$i]))."\n");
fclose ($file);
// выводим обновление
$text="<do type=\"accept\" label=\"Назад\"><go href=\"forum.php".$admin2."\"/></do><p>Сообщение добавлено.";
// } else $text="<p>Такое сообщение уже есть, возможно у вас медленный GPRS или вы дважды нажали Отправить";
} else $text="<p>Не указана тема сообщения.";
tsecho($text);
die("");
}
//===============================================
// ответ
//===============================================
if ($reply>0) {
if ($subj) {
if ($from=='') $from="anonymous";
$subj = strip_tags($subj);
$from = strip_tags($from);
$msg = strip_tags($msg);
// добавляем новое в базу
for ($i=0;$i<$count;$i++) { // ищем номер start в массиве записей
$stmp=split("\|",$arr[$i]);
if ($stmp[0]==$reply) {$reply=$i; break;}
}
$arr1 = array();
$stmp=split("\|",$arr[$reply]);
$arr1[]=$arr[0]."|".($stmp[1]+1)."|$subj - $from|$msg";
$arr[0]+=1; // увеличиваем свободный номер
$arr1[] = $arr[$reply];
array_splice($arr,$reply,1,$arr1);
$count=count($arr);
// сохраняем все на диск...
$file = fopen ("forum.dat", "w");
for ($i=0;$i<$count;$i++) if ($arr[$i]) fputs($file,urlencode(trim($arr[$i]))."\n");
fclose ($file);
// выводим обновление
$text="<do type=\"accept\" label=\"Назад\"><go href=\"forum.php?".$admin."view=".$stmp[0]."\"/></do><p>Сообщение добавлено."; // возврат к тому, на кот. отвечали
} else $text="<p>Не указана тема сообщения.";
tsecho($text);
die("");
}
//===============================================
// просмотр сообщения
//===============================================
if ($view>0) {
for ($i=0;$i<$count;$i++) { // ищем номер start в массиве записей
$stmp=split("\|",$arr[$i]);
if ($stmp[0]==$view) {$view=$i; break;}
}
$text="<p><a href=\"forum.php".$admin2."\">[Начало]</a>";
if ($admin) $text.="<a href=\"$PHP_SELF?".$admin."delete=".$stmp[0]."\">[Удалить]</a>";
if ($arr[$view]!='') {
$stmp=split("\|",$arr[$view]);
$indent = $stmp[1];
// ищем на что ответ...
$i=$view+1;
while ($i<$count) {
$stmp=split("\|",$arr[$i]);
if ($stmp[1]<$indent) {
$text.="\n<br/>В ответ на: <a href=\"".$PHP_SELF."?".$admin."view=".$stmp[0]."\">$stmp[2]</a>";
break;
}
$i++;
}
$stmp=split("\|",$arr[$view]);
$text.="\n<br/>".$stmp[2]."<br/>".$stmp[3];
$text.="
<br/><anchor>[Ответить]
<go href=\"#reply\"/>
</anchor>";
// ищем все ответы на текущее
$i=$view-1;
$xCount=0;
while ($i>0) {
$sS="<br/>";
$stmp=split("\|",$arr[$i]);
if ($stmp[1]>$indent) {
$sS="\n<br/>";
for ($j=0;$j<$stmp[1];$j++) $sS.=" ";
$sS.="<a href=\"".$PHP_SELF."?".$admin."view=".$stmp[0]."\">$stmp[2]</a>";
if (strlen(preg_replace("/[А-яЁё]/e","11",$text.$sS))>$size) {$xCount=$stmp[0]; break;} else $text.=$sS;
} else break;
$i--;
}
} else $text="<p>Нет такого сообщения: $view";
if ($xCount>0) $text.="<br/><a href=\"".$PHP_SELF."?".$admin."start=".$xCount."\">[Дальше...]</a>";
$stmp=split("\|",$arr[$view]);
// $text.="<br/><form action=$PHP_SELF method=get>Ответить:<br>Имя:<br><input name=from><br>Тема:<br><input name=subj><br>Сообщение:<br><input name=msg><br><input type=hidden name=reply value=".$stmp[0]."><input type=submit value=Послать></form>";
$text.="
</p>
</card>
<card id=\"reply\" title=\"Ответить\">
<p>
Имя:<br/><input name=\"from\"/>
<br/>Тема:<br/><input name=\"subj\"/>
<br/>Сообщение:<br/><input name=\"msg\"/>
<br/><select name=\"translit\" multiple=\"true\">
<option value=\"1\">Транслит</option>
</select>
<br/><a href=\"forum.php?".$admin."reply=".$stmp[0]."&from=$(from)&subj=$(subj)&msg=$(msg)&translit=$(translit)\">Отправить</a>
</p>
<p>
<br/><a href=\"forum.php?".$admin."table=1\">Таблица перекодировки</a>";
tsecho($text);
die("");
}
function tsecho($s) {
header("Content-type:text/vnd.wap.wml;charset=utf-8");
echo "<?xml version=\"1.0\" ?>\n";?>
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml">
<?php setlocale (LC_CTYPE, 'ru_RU.CP1251');
function win2unicode ( $s ) { if ( (ord($s)>=192) & (ord($s)<=255) ) $hexvalue=dechex(ord($s)+848); if ($s=="Ё") $hexvalue="401"; if ($s=="ё") $hexvalue="451"; return("�".$hexvalue.";");}
function translate($s) {return(preg_replace("/[А-яЁё]/e","win2unicode('\\0')",$s));}
ob_start("translate");?>
<wml>
<head>
<meta forua="true" http-equiv="Cache-Control" content="must-revalidate"/>
<meta forua="true" http-equiv="Cache-Control" content="no-cache"/>
<meta forua="true" http-equiv="Cache-Control" content="no-store"/>
</head>
<card title="Форум игры">
<? echo $s;?>
</p>
</card>
</wml>
<? ob_end_flush();
die("");
}
?>