<?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);