game/online.php
2023-11-02 15:59:07 +02:00

840 lines
36 KiB
PHP
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
if (!defined('GAME_VERSION')) {
require_once '_incl_data/autoload.php';
}
use Clan\ClanInfo;
use Core\Config;
use Core\Database;
use Core\Db;
use DarksLight2\Training\TrainingManager;
Config::init();
Database::init();
$u = User::start();
$filter = new Filter();
$chat = new Chat();
$code = PassGen::intCode();
if (
!isset($u->info['id']) ||
$u->isBlocked() ||
!isset($_COOKIE['login'])
) {
exit(json_encode(['js' => 'top.location="bk?exit=' . $code . '";']));
}
if ($u->info['bithday'] == '01.01.1800') {
unset($_GET['msg'], $_POST['msg'], $_POST['warnMsg']);
$_GET['r3'] = 1;
}
if ($u->info['online'] < time() - 60) {
Db::sql('update users set online = unix_timestamp() where id = ?', [$u->info['id']]);
$filter->setOnline($u->info['online'], $u->info['id']);
}
if (isset($_POST['delMsg']) && $u->isModerator()) {
$delmsgid = (int)$_POST['delMsg'];
if ($delmsgid > 0) {
Db::sql('update chat set `delete` = ? where id = ?', [$u->info['id'], $delmsgid]);
} else {
Db::sql('update users set molch3 = unix_timestamp() + 3600 * 3 where id = ?', [-$delmsgid]);
}
unset($delmsgid);
}
$r = [
'rnd' => $code,
'rn' => null,
'list' => null,
'msg' => null,
'js' => null,
'xu' => 0,
];
if ($u->info['battle'] > 0) {
$btl = Db::getValue('select count(*) from battle where id = ? and time_over = 0', [$u->info['battle']]);
if (empty($btl)) {
$r['js'] .= 'top.frames["main"].location="main.php";';
}
}
if (isset($_POST['msg']) && str_replace(' ', '', $_POST['msg']) != '') {
$msg = [];
$_POST['msg'] = str_replace('\x3C', '<', $_POST['msg']);
$_POST['msg'] = str_replace('\x3', '>', $_POST['msg']);
function tolink($buf): string
{
$x = explode(" ", $buf);
$newbuf = '';
for ($j = 0; $j < count($x); $j++) {
$uname = '&lt;Внутренняя ссылка&gt;';
//
if (strripos($x[$j], Config::get('host') . '/info')) {
$ulogin = explode('/info/', $x[$j]);
$ulogin = $ulogin[1];
$ulogin = Db::getValue('select login from users where id = ? or login = ?', [$ulogin, $ulogin]);
if (!empty($ulogin)) {
$uname = '<span style="color: #831db7; ">&lt;Информация о &quot;' . $ulogin . '&quot;&gt;</span>';
}
} elseif (strripos($x[$j], 'audio_1610649509.mp3')) { //ТУТ аудио
$uname = '<span style="color: #FF851B; ">&lt;Голосовое сообщение&gt;</span>';
} elseif (strripos($x[$j], 'new-combats.com/item/')) {
$ulogin = explode('/item/', $x[$j]);
$ulogin = $ulogin[1];
$ulogin = Db::getValue('select name from items_main where id = ?', [$ulogin]);
if (isset($ulogin)) {
$uname = '<span style="color: #5f9b00; ">&lt;Предмет &quot;' . $ulogin . '&quot;&gt;</span>';
} else {
$uname = '<span style="color: #5f9b00; ">&lt;Библиотека предметов&gt;</span>';
}
} elseif (strripos($x[$j], Config::get('host') . '/news')) {
$ulogin = explode('/news', $x[$j]);
$ulogin = $ulogin[1];
$ulogin = ltrim($ulogin, '/');
$ulogin = Db::getValue('select title from events_news where id = ?', [$ulogin]);
if (isset($ulogin)) {
$uname = '<span style="color: #b57300; ">&lt;Новость &quot;' . $ulogin . '&quot;&gt;</span>';
} else {
$uname = '<span style="color: #b57300; ">&lt;Новостная лента&gt;</span>';
}
} elseif (strripos($x[$j], Config::get('host') . '/lib')) {
$ulogin = explode('/lib', $x[$j]);
$ulogin = $ulogin[1];
$ulogin = ltrim($ulogin, '/');
$ulogin = rtrim($ulogin, '/');
$ulogin = Db::getValue('select title from library_content where url_name = ? and moder > 0', [$ulogin]);
if (isset($ulogin)) {
$uname = '<span style="color: #4c6e00; ">&lt;Библиотека &quot;' . $ulogin . '&quot;&gt;</span>';
} else {
$uname = '<span style="color: #4c6e00; ">&lt;Библиотека&gt;</span>';
}
} elseif (strripos($x[$j], Config::get('host') . '/forum')) {
$ulogin = explode('/forum?read=', $x[$j]);
$ulogin = $ulogin[1];
$ulogin = explode('&', $ulogin);
$ulogin = $ulogin[0];
$ulogin = Db::getValue('select title from forum_msg where id = ? and `delete` = 0', [$ulogin]);
if (isset($ulogin)) {
$uname = '<span style="color: #0055b5; ">&lt;Форум &quot;' . $ulogin . '&quot;&gt;</span>';
} else {
$ulogin = explode('/forum?r=', $x[$j]);
$ulogin = $ulogin[1];
$ulogin = explode('&', $ulogin);
$ulogin = $ulogin[0];
$ulogin = Db::getValue('select name from forum_menu where id = ?', [$ulogin]);
if (isset($ulogin)) {
$uname = '<span style="color: #0055b5; ">&lt;Конференция форума &quot;' . $ulogin . '&quot;&gt;</span>';
} else {
$uname = '<span style="color: #0055b5; ">&lt;Форум проекта&gt;</span>';
}
}
}
//
$newbuf .= preg_match(
"/(https:\\/\\/)?(new-combats+\\.tech(([ \"'>\r\n\t])|(\\/([^ \"'>\r\n\t]*)?)))/",
$x[$j],
$ok
) ? str_replace($ok[2], "<small><a href=https://$ok[2] target=_blank ><i>" . $uname . "</i></a></small>", str_replace("https://", "", $x[$j])) . " " : $x[$j] . " ";
}
return $newbuf;
}
$strSearch = [
['\\', '"', "'", '<', '>', ' ', '&gt;', '&lt;', '\r', '\b', ' ', ''],
['::', '[s1;]', '[s2;]', '[s3;]', '[s4;]', ' ',],
];
$strReplace = [
['\\\\', '[s1;]', '[s2;]', '[s3;]', '[s4;]', ' ', '[s4;]', '[s3;]'],
['', '&quot;', '&quot;', '&lt;', '&gt;', ' ',],
];
$_POST['msg'] = $chat->expworld($_POST['msg'], 120);
$_POST['msg'] = str_replace($strSearch[0], $strReplace[0], $_POST['msg']);
$_POST['msg'] = htmlspecialchars($_POST['msg']);
$_POST['msg'] = str_replace('%usersmile%', '', $_POST['msg']);
$_POST['msg'] = tolink($_POST['msg']);
$_POST['msg'] = str_replace($strSearch[1], $strReplace[1], $_POST['msg']);
$smg = Db::getRow('select * from chat where login = ? and time > unix_timestamp() - 20 order by time desc limit 1', [$u->info['login']]);
if ($u->info['exp'] < 499999999) {
$lmg = Db::getValue('select count(id) from chat where login = ? and time = unix_timestamp() - 5 limit 2', [$u->info['login']]);
} else {
$lmg = 0;
}
$testsmg = ' ' . $_POST['msg'] . ' ';
if (!empty($smg) && $testsmg == $smg['text'] && $u->info['exp'] > 100000) {
if ($u->info['molch1'] < time()) {
//Молчанка за флуд на 5 минут
$u->info['molch1'] = time() + 1200;
$r['js'] .= 'chat.sendMsg(["new","' . time() . '","6","","' . $u->info['login'] . '","<small>Вы наказаны за спам на 20 минут </small>","Black","1","1","0"]);';
Db::sql('update users set molch1 = ? where id = ?', [$u->info['molch1'], $u->info['id']]);
Db::sql('update chat set `delete` = 1 where login = ?', [$u->info['login']]);
$_POST['msg'] = 'Я спамер ' . $u->info['login'] . ' и меня нужно заблокировать!';
$training_manager = TrainingManager::getInstance();
$training_manager->addPoint('chat_first_quest');
if (preg_match("/to\[(.*?)\]/", $_POST['msg'])) {
$training_manager->addPoint('chat_second_quest');
}
if (preg_match("/private\[(.*?)\]/", $_POST['msg'])) {
$training_manager->addPoint('chat_third_quest');
}
$cmsg = new ChatMessage();
$cmsg->setInvis($u->info['invis']);
$cmsg->setDa(1);
$cmsg->setType(6);
$cmsg->setColor('#f00');
$cmsg->setText("Я спамер {$u->info['login']} и меня нужно заблокировать " . Config::get('https') . '/info/' . $u->info['id']);
$chat->sendMsg($cmsg);
$cmsg->setLogin($u->info['login']);
$cmsg->setType(6);
$cmsg->setText('Это супер проект! Всем успехов!');
$cmsg->setColor('#000');
$chat->sendMsg($cmsg);
}
} elseif ($lmg > 0) {
$r['js'] .= 'chat.sendMsg(["new","' . time() . '","6","","' . $u->info['login'] . '","<small>Вы не можете отправлять так часто сообщения... </small>","Black","1","1","0"]);';
if ($u->info['molch1'] < time()) {
if ($u->info['molch1'] < -5) {
$u->info['molch1'] = time() + 300;
$r['js'] .= 'chat.sendMsg(["new","' . time() . '","6","","' . $u->info['login'] . '","<small>Вы наказаны за флуд на 5 минут </small>","Black","1","1","0"]);';
} elseif ($u->info['molch1'] < 0) {
$u->info['molch1']--;
} else {
$u->info['molch1'] = -1;
}
Db::sql('update users set molch1 = ? where id = ?', [$u->info['molch1'], $u->info['id']]);
}
} elseif ((preg_match("/private\[(.*?)\]/", $_POST['msg'], $msg['to']) || preg_match(
"/private \[(.*?)\]/", $_POST['msg'], $msg['to']
)) && $u->info['exp'] < 150000 && !$u->isAdmin()) {
$r['js'] .= 'chat.sendMsg(["new","' . time() . '","6","","' . $u->info['login'] . '","<small>Вы не можете отправлять приват до достижения 150000 опыта.</small>","Black","1","1","0"]);';
} else {
//Записываем данные
$msg['spam'] = 0;
$msg['type'] = 1;
$msg['molch'] = 0;
$msg['cancel'] = 0;
$msg['delete'] = 0;
$msg['to'] = '';
$msg['da'] = 0;
//Нормируем типы сообщений
if (preg_match("/private\[(.*?)\]/", $_POST['msg'], $msg['to'])) {
$msg['to'] = $msg['to'][1];
$_POST['msg'] = str_replace('private[' . $msg['to'] . ']', 'private [' . $msg['to'] . ']', $_POST['msg']);
$msg['to'] = '';
} elseif (preg_match("/to\[(.*?)\]/", $_POST['msg'], $msg['to'])) {
$msg['to'] = $msg['to'][1];
$_POST['msg'] = str_replace('to[' . $msg['to'] . ']', 'to [' . $msg['to'] . ']', $_POST['msg']);
$msg['to'] = '';
}
if (preg_match("/private \[(.*?)\]/", $_POST['msg'], $msg['to'])) {
$msg['to'] = trim($msg['to']['1'], ' ');
$msg['type'] = 3;
$_POST['msg'] = str_replace('private [' . $msg['to'] . ']', ' ', $_POST['msg']);
} elseif (preg_match("/to \[(.*?)\]/", $_POST['msg'], $msg['to'])) {
$msg['to'] = trim($msg['to']['1'], ' ');
$msg['type'] = 2;
$_POST['msg'] = str_replace('to [' . $msg['to'] . ']', ' ', $_POST['msg']);
}
if ($u->info['admin'] == 0) { //ТУТ SPAM
if ($msg['to'] != '' && !isset($admq) && $msg['type'] == 3) {
$admq = Db::getValue('select id from users where login = ? and admin > 0', [$msg['to']]);
}
if (!isset($admq)) {
$msg['fspam'] = $filter->spamFiltr(str_replace('точка', '.', str_replace('ру', 'ru', $_POST['msg'])));
if ($msg['fspam'] != '0') {
$msg['spam'] = 1;
$msg['delete'] = 1;
$r['js'] .= 'chat.sendMsg(["new","' . time() . '","6","","' . $u->info['login'] . '","<small>В нашем чате запрещается сообщать ссылки на атльтернативные проекты.
Повторные попытки могут привести к блокировке персонажа.</small>","Black","1","1","0"]);';
}
if ($msg['spam'] == 1 && $u->info['molch1'] < time() && $u->info['admin'] == 0) {
$mban = $u->testAction(
'`uid` = "' . $u->info['id'] . '" AND `time` >= ' . strtotime(
'now 00:00:00'
) . ' AND `vars` = "msg_bans" LIMIT 1', 1
);
if (!isset($mban['id'])) {
$u->addAction(time(), 'msg_bans', '1');
$mban['vals'] = 0;
} else {
Db::sql('update actions set vals = vals + 1 where id = ?', [$mban['id']]);
$msg['delete'] = time();
}
if ($mban['vals'] + 1 < 2) {
$msg['fspam'] = str_replace('%', '</b>,<b>', $msg['fspam']);
$msg['fspam'] = '<b>' . ltrim($msg['fspam'], '0</b>,<b>') . '</b>';
$r['js'] .= 'chat.sendMsg(["new","' . time() . '","6","","' . $u->info['login'] . '","<small>В нашем чате запрещается сообщать ссылки на атльтернативные проекты.
Запрещенные слова: ' . $msg['fspam'] . '. Предупреждения [' . ($mban['vals'] + 1) . '/1]</small>","Black","1","1","0"]);';
} else {
$r['js'] .= 'chat.sendMsg(["new","' . time() . '","6","","' . $u->info['login'] . '","<small>В нашем чате запрещается сообщать ссылки на атльтернативные проекты.
Вы наказаны за нарушение правил общения.</small>","Black","1","1","0"]);';
$cmsg = new ChatMessage();
$cmsg->setLogin('Комментатор');
$cmsg->setText("Персонаж {$u->info['login']}[{$u->info['level']}] был наказан за нарушение правил общения.");
$cmsg->setType(6);
$chat->sendMsg($cmsg);
$molchTime = time() + 60 * 60;
Db::sql('update users set molch1 = ?, molch2 = ?, info_delete = ? where id = ?', [$molchTime, $molchTime, $molchTime, $u->info['id']]);
$rtxt = ' &quot;' . $u->info['login'] . '&quot; <small style="color: red;">Автоинформатор</small>: ' . $msg['text'] . ' [' . $msg['fspam'] . '].';
Delo::add(0, $u->info['login'], $u->info['id'], $rtxt);
}
}
}
unset($admq);
}
if (!empty($pl['login'])) {
$qix = Db::getValue('select id from friends where ignor > 0 and login_ignor = ? and (user_ignor = ? or user = ?)', [$pl['login'], $u->info['login'], $u->info['id']]);
}
if (isset($qix)) {
if (is_array($msg['to'])) {// каким хером тут массив?
$msg['to'] = '';
}
$r['js'] .= 'chat.sendMsg(["new","' . time() . '","6","","' . $u->info['login'] . '","<b>Вас добавили в игнор</b>:
Вы не можете отправлять сообщения персонажу &quot;' . htmlspecialchars($msg['to']) . '&quot;.","Black","1","1","0"]);';
$msg['cancel']++;
}
if ($msg['type'] == 3 && $msg['to'] == 'klan') {
if ($u->info['clan'] == 0) {
$r['js'] .= 'chat.sendMsg(["new","' . time() . '","6","","' . $u->info['login'] . '","<small>Вы не являетесь частью одного из <b>Кланов</b>
и не можете общаться по этому каналу.</small>","Black","1","1","0"]);';
$msg['cancel']++;
} else {
$msg['to'] = 'k' . $u->info['clan'];
$msg['da'] = 1;
}
}
if ($u->info['molch1'] > time()) {
if ($msg['to'] != '' && !isset($admq) && $msg['type'] === 3) {
$admq = Db::getValue('select id from users where login = ? and admin > 0', [$msg['to']]);
}
if (!isset($admq)) {
$msg['molch'] = 1;
}
}
if ($msg['cancel'] == 0) {
if (is_array($msg['to'])) {
$msg['to'] = '';
}
if ($msg['type'] == 3 && $msg['da'] > 0) {
$msg['type'] = -3;
}
$msw = $chat->smileText($_POST['msg'], $msg['to'], $u->info['room']);
$nosend = 0;
if ($msw) {
$_POST['msg'] = $msw;
$msg['to'] = '';
$msg['type'] = 21;
if ($msw == 'USER IS FALSE') {
$r['js'] .= 'chat.sendMsg(["new","' . time() . '","6","","' . $u->info['login'] . '","<small>Персонажа нет в данной комнате.</small>","Black","1","1","0"]);';
$nosend = 1;
}
} elseif (str_starts_with($_POST['msg'], '/e ')) {
$msg['type'] = 21;
$_POST['msg'] = ltrim($_POST['msg'], '/e ');
} elseif (str_starts_with($_POST['msg'], '/е ')) { // это кириллица!!
$msg['type'] = 21;
$_POST['msg'] = ltrim($_POST['msg'], '/е ');
} elseif (str_starts_with($_POST['msg'], ' /e ')) {
$msg['type'] = 21;
$_POST['msg'] = ltrim($_POST['msg'], ' /e ');
} elseif (str_starts_with($_POST['msg'], ' /е ')) { // это кириллица!!
$msg['type'] = 21;
$_POST['msg'] = ltrim($_POST['msg'], ' /е ');
}
if ($nosend == 0) {
//Именные смайлики
$_POST['msg'] = str_replace('%usersmile%-', '%usеrsmilе%-', $_POST['msg']);
$usml = explode(',', $u->info['add_smiles']);
$i = 0;
while ($i < count($usml)) {
$_POST['msg'] = str_replace(
':' . $usml[$i] . ':', ':%usersmile%-' . $usml[$i] . ':', $_POST['msg']
);
$i++;
}
$cmsg = new ChatMessage();
$cmsg->setInvis($u->info['invis']);
$cmsg->setDa($msg['da']);
$cmsg->setDelete($msg['delete']);
$cmsg->setMolch($msg['molch']);
$cmsg->setLogin($u->info['login']);
$cmsg->setTo($msg['to']);
$cmsg->setRoom($u->info['room']);
$cmsg->setType($msg['type']);
$cmsg->setSpam($msg['spam']);
$cmsg->setText($_POST['msg']);
$cmsg->setColor($u->info['chatColor']);
$chat->sendMsg($cmsg);
}
}
if ($msg['type'] == 2 && mb_convert_case($msg['to'], MB_CASE_LOWER) == 'комментатор') {
$cmsg = new ChatMessage();
if (preg_match("/анекдот/i", mb_convert_case($_POST['msg'], MB_CASE_LOWER))) {
$text_com = '';
$sp_all = Db::getRow('select * from a_com_anekdot order by rand() limit 1');
if (isset($sp_all['id'])) {
$text_com = $sp_all['text'];
$text_com = str_replace("<br>", "<br>&nbsp; &nbsp; ", $text_com);
$text_com = str_replace("<br />", "<br />&nbsp; &nbsp; ", $text_com);
$text_com = str_ireplace("\r\n", "", $text_com);
$text_com = str_replace("", "", $text_com);
$text_com = '<b style="color: red">Анекдот</b>:<br>&nbsp; &nbsp; ' . $text_com . '<br>';
} else {
$text_com = 'Анекдот из головы вылетел...';
}
Db::sql('insert into a_com_act (act, time, uid) values (0, unix_timestamp() + 60, ?)', [$u->info['id']]);
if ($text_com != '') {
$cmsg->setText($text_com);
}
} else {
include_once 'commentator.php';
if (!empty($comment)) {
$cmsg->setText($comment);
}
}
if ($cmsg->getText()) {
$cmsg->setLogin('Комментатор');
$cmsg->setTo($u->info['login']);
$cmsg->setRoom($u->info['room']);
$cmsg->setType(2);
$chat->sendMsg($cmsg);
}
}
Db::sql('update users set afk = default, dnd = default, timeMain = unix_timestamp() where id = ?', [$u->info['id']]);
}
}
$ar_id = 0;
$ar_lvl = 0;
$ar_all = '0';
//Получаем список онлайн
if (!empty($_GET['r1'])) {
// $_GET['r3'] передаётся из onlineList.js как переключатель "все пользователи\пользователи в комнате".
define('BOT_ROOM', 303);
$usl = [];
$cw = [];
$usid = [];
$onlineListQuery = 'select
users.id, pass, sex, dnow, timeMain, bot, atack, afk, dnd, banned, molch1,
room, city, cityreg, online, align, clan, login, level, inTurnir, battle, invis, inUser, x, y
from users left join stats on users.id = stats.id
where
(
(room = ? and ' . (int)$_GET['r3'] . ' != 1) or
(' . (int)$_GET['r3'] . ' = 1 and pass not like ?)
) and
mail != ? and
room != ?
order by inUser desc, online desc, login desc';
$usersOnline = Db::getRows($onlineListQuery, [$u->info['room'], '%saint%', '', BOT_ROOM]);
foreach ($usersOnline as $onlineUser) {
$ysee = 1;
if ($onlineUser['inUser'] > 0) {
if ($onlineUser['inTurnir'] == 0) {
$ysee = 0;
} else {
if ($onlineUser['online'] < time() - 120) {
User::setOnline($onlineUser['id']);
}
}
} else {
if ($onlineUser['inTurnir'] > 0) {
$ysee = 0;
}
}
if (!isset($usl[$onlineUser['login']])) {
$ysee = 1;
}
if (
(
(int)$_GET['r3'] != 1 &&
$u->info['dnow'] != $onlineUser['dnow']
) ||
(
$onlineUser['room'] >= 362 &&
$onlineUser['room'] <= 366 &&
(int)$_GET['r3'] != 1 &&
(
$onlineUser['x'] != $u->info['x'] ||
$onlineUser['y'] != $u->info['y'] ||
$onlineUser['room'] != $u->info['room']
)
) ||
!empty($usid[$onlineUser['login']])
) {
$ysee = 0;
}
if (isset($onlineUser['login'])) {
$usl[$onlineUser['login']] = $onlineUser['id'];
}
if (
(
$onlineUser['online'] > time() - 520 ||
$onlineUser['inUser'] > 0
) &&
(
$onlineUser['bot'] != 1 ||
$onlineUser['pass'] == '212121q'
) &&
$onlineUser['banned'] == 0 &&
$ysee == 1
) {
$usid[$onlineUser['login']] = true;
if ($onlineUser['invis'] != 1 && $onlineUser['invis'] < time()) {
if ($onlineUser['clan'] > 0) {
if ($u->info['clan'] > 0 && $onlineUser['clan'] != $u->info['clan']) {
if (!isset($cw['war'][$onlineUser['clan']][$u->info['clan']])) {
$onlineUser['cwar'] = Db::getRow('select id, type from clan_wars where clan1 in (?,?) and clan2 in (?,?) and clan1 != clan2 and time_finish > unix_timestamp()',
[$u->info['clan'], $onlineUser['clan'], $u->info['clan'], $onlineUser['clan'],]);
if (isset($onlineUser['cwar']['id'])) {
$cw['war'][$onlineUser['clan']][$u->info['clan']] = $onlineUser['cwar']['type'];
} else {
$cw['war'][$onlineUser['clan']][$u->info['clan']] = 0;
}
}
if ($cw['war'][$onlineUser['clan']][$u->info['clan']] > 0) {
$onlineUser['atack'] = $cw['war'][$onlineUser['clan']][$u->info['clan']];
}
}
if (!isset($cw[$onlineUser['clan']])) {
$onlineUser['clan'] = ClanInfo::getNameById($onlineUser['clan']);
} else {
$onlineUser['clan'] = $cw[$onlineUser['clan']];
}
}
if ($onlineUser['atack'] > time() || $onlineUser['atack'] == 1 || $onlineUser['atack'] == 2) {
if ($onlineUser['atack'] != 2) {
$onlineUser['atack'] = 1;
}
} else {
$onlineUser['atack'] = 0;
}
$trvm = Db::getValue('select name from eff_users where uid = ? and id_eff in (4,6) order by id_eff limit 1', [$onlineUser['id']]);
$r['list'] .= '"' . $r['xu'] . '":["' . $onlineUser['id'] . '","' . $onlineUser['login'] . '","' . $onlineUser['level'] . '","' . $onlineUser['align'] .
'","' . $onlineUser['clan'] . '","' . $onlineUser['cityreg'] . '","' . $onlineUser['city'] . '","' . $onlineUser['room'] .
'","' . $onlineUser['afk'] . '","' . $onlineUser['dnd'] . '","' . $onlineUser['banned'] . '","' . $onlineUser['molch1'] . '","' .
$onlineUser['battle'] . '","' . $onlineUser['atack'] . '","' . $trvm . '","' . ($onlineUser['sex'] * 0) . '"],';
$ar_id += $onlineUser['id'];
$ar_lvl += $onlineUser['level'];
$ar_all .= $onlineUser['align'] . $onlineUser['clan'] . $onlineUser['molch1'] . $onlineUser['banned'] . $onlineUser['battle'] . 1;
}
$r['xu']++;
}
}
unset($onlineUser, $sp);
$r['list'] = rtrim($r['list'], ',');
$r['list'] = '{' . $r['list'] . '}';
}
//Получаем сообщения
if (isset($_GET['mid']) && !isset($_POST['mid'])) {
$_POST['mid'] = $_GET['mid'];
}
$i = 0;
$l = 0;
foreach ($chat->getMessages((int)$_POST['mid'], $u->info['login']) as $pl) {
if ($pl['delete'] > 0) {
$r['msg'] .= ',"m' . $i . '":["' . $pl['id'] . '","","delete","","","","","","","0","0","0","1","",""]';
}
$see = 1;
if ($pl['type'] == 8 && $u->isModerator()) {
$see = 0;
}
if (($pl['type'] > 0 && $pl['type'] < 4) || $pl['type'] == -3) {
$pl['room'] = $u->info['room'];
}
//fixme $pl['global'] - глобалка по всем городам. Если нет городов, то не нужна и глобалка. Теоретически.
//Проверки на доступ к просмотру
if (
(
(($pl['type'] == 3 || $pl['type'] == 4) && $pl['global'] == 1) ||
(($pl['type'] == 5 || $pl['type'] == 6 || $pl['type'] == 8 && $u->isModerator()) && $pl['global'] == 1) ||
($pl['type'] == 7 && $pl['room'] == $u->info['room']) ||
($pl['type'] == 6 && $pl['global'] == 1) ||
$pl['type'] == 9 ||
$pl['type'] == 10
) &&
$pl['to'] != '' && $pl['login'] != $u->info['login'] && $pl['to'] != $u->info['login']
) {
$n = 0;
$ex = explode(',', $pl['to']);
$j = 0;
while ($j < count($ex)) {
if (trim($ex[$j], ' ') == $u->info['login']) {
$n++;
}
$j++;
}
if ($n == 0) {
$see = 0;
}
unset($n, $j, $ex);
}
//Клановое сообщение (по всем городам)
if ($pl['type'] == -3 && ($pl['to'] == 'k' . $u->info['clan'] || $u->isAdmin())) {
$pl['type'] = 3;
if ($pl['to'] == 'k' . $u->info['clan']) {
$pl['to'] = 'klan';
}
$see = 1;
} elseif ($pl['type'] == -3) {
$see = 0;
}
//Системное сообщение только в этой комнате
if (
$pl['type'] == 6 &&
$pl['room'] > 0 &&
$pl['room'] != $u->info['room'] &&
$pl['to'] == ''
) {
$see = 0;
}
//Сообщение с молчанкой
if ($pl['molch'] > 0) {
$see = 0;
}
//Сообщение отправлено в другой комнате
if (
($pl['type'] == 1 || $pl['type'] == 2) &&
($pl['room'] != $u->info['room']) &&
($pl['global'] == 0 || $_COOKIE['chatCfg11'] == 0)
) {
$see = 0;
}
//Глобал
if ($pl['global'] == 1 && $pl['type'] != -3) {
$see = 1;
}
//Пещерное сообщение
if ($pl['dn'] > 0 && $u->info['dnow'] != $pl['dn']) {
$see = 0;
}
if ($pl['login'] != $u->info['login'] && $pl['nosee'] != 0 && $u->info['id'] != $pl['nosee'] && !$u->isModerator()) {
$see = 0;
} else {
if ($pl['nosee'] != 0 && $pl['login'] != $u->info['login']) {
$noseein = 'скрыто';
if ($u->info['id'] == $pl['nosee']) {
$noseein = 'ваш реферал';
}
$pl['text'] = '<span style="padding:0 5px 0 5px;background-color:#FFC;"><small style="color: red;">[' . $noseein . ']</small> ' . $pl['text'] . '</span>';
if ($u->isModerator()) {
$see = 1;
}
}
}
if ($see == 1 && $pl['login'] != '') {
$qix = Db::getValue('select id from friends where ignor > 0 and login_ignor = ? and (user_ignor = ? or user = ?)', [$pl['login'], $u->info['login'], $u->info['id']]);
if (isset($qix)) {
$see = 0;
}
unset($qix);
}
$see = 1; //временно.
if ($see == 1) {
if ($pl['time'] < 0) {
if ($pl['to'] == '') {
$lmsch = Chat::getLastMessageId();
if ($lmsch > 0) {
$lmsch++;
Chat::setCurrentTimeAndIdById($pl['id'], $lmsch);
$pl['id'] = $lmsch;
} else {
Chat::setCurrentTimeById($pl['id']);
}
} else {
Chat::setCurrentTimeById($pl['id']);
}
$pl['time'] = time();
}
if ($pl['spam'] > 0) {
$r['msg'] .= ',"' . $i . '":{"s":"' . $pl['id'] . '"}';
} else {
$reimg = [];
if (preg_match_all(
"/\[img\[(.*?)\]\]\[1\]/", $pl['text'], $reimg
) && ($u->isAdmin() || $pl['type'] == 5 || $pl['type'] == 6 || $pl['type'] == 10 || $pl['type'] == 11)) {
$k = 0;
while ($k <= count($reimg[1])) {
$pl['text'] = str_replace(
'[img[' . $reimg[1][$k] . ']][1]',
'<img src=' . Config::img() . '/i/' . $reimg[1][$k] . ' height=19>', $pl['text']
);
$k++;
}
}
if (preg_match_all(
"/\[img\[(.*?)\]\]/", $pl['text'], $reimg
) && ($u->info['admin'] > 0 || $pl['type'] == 5 || $pl['type'] == 6 || $pl['type'] == 10 || $pl['type'] == 11)) {
$k = 0;
while ($k <= count($reimg[1])) {
$pl['text'] = str_replace(
'[img[' . $reimg[1][$k] . ']]', '<img src=' . Config::img() . '/i/' . $reimg[1][$k] . '>',
$pl['text']
);
$k++;
}
}
if (preg_match_all("/item\[(.*?)\]/", $pl['text'], $reimg)) {
$k = 0;
while ($k <= count($reimg[1])) {
$pl['text'] = str_replace(
'item[' . $reimg[1][$k] . ']',
'<b oncontextmenu=\"return false;\" onClick=\"alert(\'Функция временно недоступна!\');\" style=\"cursor:pointer;\" class=\"itemsInfo\">Предмет</b>',
$pl['text']
);
$k++;
}
}
if (preg_match_all("/\.(?:mp3)$/i", $pl['text'], $reimg)) //ТУТ аудио audio
{
$k = 0;
while ($k <= count($reimg[1])) {
$pl['text'] = str_replace(
'item[' . $reimg[1][$k] . ']',
'<b oncontextmenu=\"return false;\" onClick=\"alert(\'Функция временно недоступна!\');\" style=\"cursor:pointer;\" class=\"itemsInfo\">Аудио запись</b>',
$pl['text']
);
$k++;
}
}
if (preg_match_all("/item \[(.*?)\]/", $pl['text'], $reimg)) {
$k = 0;
while ($k <= count($reimg[1])) {
$pl['text'] = str_replace(
'item [' . $reimg[1][$k] . ']',
'<b oncontextmenu=\"return false;\" onClick=\"alert(\'Функция временно недоступна!\');\" style=\"cursor:pointer;\" class=\"itemsInfo\">Предмет</b>',
$pl['text']
);
$k++;
}
}
if ($pl['type'] != 3 && ($pl['invis'] == 1 || $pl['invis'] > time())) {
$pl['login'] = '<b><i>Невидимка</i></b>';
if ($u->isAdmin()) {
$pl['login'] .= '</a> <small>(' . $pl['login'] . ')</small>';
}
}
if ($pl['invis'] > 0 && ($pl['type'] == 1 || $pl['type'] == 2)) {
$pl['color'] = 'Black';
}
$r['msg'] .= ',"m' . $i . '":["' . $pl['id'] . '","' . $pl['time'] . '","' . $pl['type'] . '","' . $pl['login'] . '","' .
$pl['to'] . '","' . $pl['text'] . '","' . $pl['color'] . '","' . $pl['toChat'] . '","' . $pl['typeTime'] . '","' . $pl['sound'] .
'","' . $pl['global'] . '","' . $pl['molch'] . '","' . $pl['active'] . '","' . date('H:i', $pl['time']) . '","' .
date('d.m.Y H:i', $pl['time']) . '","' . $pl['frv'] . '","' . $pl['invis'] . '"]';
}
}
if ($l < $pl['id']) {
$l = $pl['id'];
}
$i++;
}
$r['msg'] = '{"ld":"' . (0 + $l) . '","id":"' . $i . '"' . $r['msg'] . '}';
//Генерируем ключ
$r['key'] = md5($u->room['name'] . '+' . $ar_id . '+' . $ar_lvl . '+' . $ar_all);
unset($ar_id, $ar_lvl);
if (empty($_COOKIE['chatCfg12'])) {
$_GET['key'] = time();
}
if ($r['key'] == $_GET['key']) {
//Список онлайн остается неизменным
unset($r['rn'], $r['list'], $r['key'], $r['xu']);
} elseif (!empty($_GET['r1'])) {
$r['rn'] = $u->room['name'];
}
$posts = Db::getValue('select count(id) from items_users where uid = ? and inOdet = 0 and inShop = 0 and lastUPD < unix_timestamp()', ['-51' . $u->info['id']]);
if ($posts > 0) {
$r['js'] .= ' $("#postdiv").show();';
} else {
$r['js'] .= ' $("#postdiv").hide();';
}
//Предложение на обмен
$transfer = Db::getRow('select id, uid1 from transfers where uid2 = ? and start2 = 0 and cancel1 = 0 and cancel2 = 0', [$u->info['id']]);
if (isset($transfer['id'])) {
$utf = User::getLoginById($transfer['uid1']);
if (!empty($utf) && $u->info['battle'] == 0) {
$r['js'] .= 'top.intransferNew(' . $transfer['id'] . ',"' . $utf . '");';
} else {
Db::sql('update transfers set cancel2 = unix_timestamp() where id = ?', [$transfer['id']]);
}
}
unset($c, $u, $db);
echo json_encode($r);