<?php
/*
	Copyright © Eleanor CMS
	http://eleanor-cms.ru
	info@eleanor-cms.ru

	Sponsored by: Roman Borkunov (Qnut)
*/

#Маленький конфиг
$sign=dirname(dirname(__DIR__)).DIRECTORY_SEPARATOR;#Строка-подпись
$min_s=5;#Минимальное количество символов в сообщении
$max_s=500;#Максимальное количество символов в сообщении
$floodlimit=5;#Интервал между отправляемыми сообщениями, сек
$savecnt=100;#Количество хранимых сообщений в чате
$showcnt=25;#Количество выводимых сообщений. Это число ВСЕГДА должно быть меньше, чем $savecnt!
$chat=__DIR__.'/chat.txt';#Файл с хранимыми сообщениями
$archive=__DIR__.'/archive.txt';#Файл с архивом ообщений
$userprefix='index.php?module=user&amp;userid=';#Префикс для формирования ссылки на пользователя по ID

include_once __DIR__.'/../../config_general.php';

#Исправляем кодировку
if(CHARSET!='utf-8' and isset($_SERVER['HTTP_X_REQUESTED_WITH']) and $_SERVER['HTTP_X_REQUESTED_WITH']=='XMLHttpRequest')
{
	$F=function(&$v){ $v=mb_convert_encoding($v,CHARSET,'utf-8'); };
	array_walk_recursive($_POST,$F);
	array_walk_recursive($_REQUEST,$F);
}

$isa=isset($_REQUEST['admin']) ? (int)$_REQUEST['admin'] : 0;
$uid=isset($_REQUEST['uid']) ? (int)$_REQUEST['uid'] : 0;
$name=isset($_REQUEST['name']) ? (string)$_REQUEST['name'] : '';
$check=isset($_REQUEST['sign']) ? (string)$_REQUEST['sign'] : '';

if($uid>0 and md5($_SERVER['REMOTE_ADDR'].'-'.$uid.'-'.$isa.'-'.$name.'-'.$sign)!=$check)
	die(__FILE__."\n".$_SERVER['SCRIPT_FILENAME']);

$name=str_replace('|','',$name);
error_reporting(E_ALL^E_NOTICE);
mb_internal_encoding(CHARSET);
define('ELENT',defined('ENT_HTML5') ? ENT_QUOTES | ENT_HTML5 | ENT_SUBSTITUTE | ENT_DISALLOWED : ENT_QUOTES);#ToDo! PHP 5.4 удалить defined

function GetData()
{global$chat;
	/*
		Формат файла в целом такой. Первая строка - целое число, определяет смещение сообщений. Вторая и последующие строки имеют формат:
		ip|дата(timestamp)|ид пользователя|имя|флаг удаления сообщения|текст
	*/
	return is_file($chat) ? file($chat,FILE_IGNORE_NEW_LINES|FILE_SKIP_EMPTY_LINES) : array();
}

$error='';
if($uid>0)
	if(isset($_POST['post']))
		do
		{
			$post=str_replace(array("\r","\n"),'',(string)$_POST['post']);

			if(mb_strlen($post)<$min_s)
			{
				$error='Вы написали слишком короткое сообщение';
				break;
			}

			if(mb_strlen($post)>$max_s)
			{
				$error='Вы написали слишком длинное сообщение';
				break;
			}

			$post=htmlspecialchars($post,ELENT,CHARSET);
			$post=preg_replace('#\[(b|i)\](.+?)\[/\1\]#','<\1>\2</\1>',$post);

			$data=GetData();
			$t=time();
			if($data)
			{
				$cnt=count($data)-1;
				for($i=$cnt;$i>0;$i--)
				{
					$line=explode('|',$data[$i],6);
					if($uid==$line[2] and $line[4]==0 and $t-$line[1]<$floodlimit)
					{
						$error='Нельзя отправлять сообщения так часто.';
						break 2;
					}
				}
			}

			$post=getenv('REMOTE_ADDR').'|'.$t.'|'.$uid.'|'.$name.'|0|'.$post;
			$cnt++;

			if($data)
			{
				$data[]=$post;
				if($cnt>$savecnt)
				{
					$lenght=$cnt-$showcnt;
					$toarch=array_splice($data,1,$lenght);
					$data[0]=+$lenght;
					$cnt=$showcnt;
					file_put_contents($chat,join("\n",$data),LOCK_EX);
					if($archive)
						file_put_contents($archive,(is_file($archive) ? "\n" : '').join("\n",$toarch),FILE_APPEND | LOCK_EX);
				}
				else
					file_put_contents($chat,"\n{$post}",FILE_APPEND | LOCK_EX);
			}
			else
			{
				file_put_contents($chat,"0\n{$post}",LOCK_EX);
				$data=array(0,$post);
			}

		}while(false);
	elseif(isset($_POST['del']))
	{
		$id=(int)$_POST['del'];
		$data=GetData();
		do
		{
			if(!$data)
				break;

			$id-=$data[0];
			if(!isset($data[$id]))
				break;

			$line=explode('|',$data[$id],6);
			if(!$isa and $line[2]!=$uid)
				break;

			$line[4]=1;
			$data[$id]=join('|',$line);
			file_put_contents($chat,join("\n",$data),LOCK_EX);
			$ok=true;
		}while(false);
		$error='nopost';
	}

header('Content-type: text/plain; charset='.CHARSET);
if(isset($ok))
	echo'ok';
elseif($error)
	echo'error:',$error;
else
{
	if(!isset($data))
	{
		$data=GetData();
		$cnt=$data ? count($data)-1 : 0;
	}

	if($cnt>0)
	{
		$offset=(int)$data[0];
		for($i=max(1,$cnt-$showcnt);$i<=$cnt;$i++)
		{
			$exploded=explode('|',$data[$i],6);
			if(count($exploded)==6)
			{
				$post=array_combine(array('ip','date','uid','name','deleted','text'),$exploded);
				if($post['deleted']==0)
					echo'<div class="ocmessage"'.($isa || $uid==$post['uid'] ? ' data-uid="'.$uid.'" data-id="'.($offset+$i) : '').'"><div class="ocinfo"><a href="',
					$userprefix,$post['uid'],'" target="_blank">',htmlspecialchars($post['name'],ELENT,CHARSET),
					'</a><span>',date('Y-m-d H:i',$post['date']),'</span></div><p>'.$post['text'].'</p></div>';
			}
		}
	}
}