Файл: modules/forum/includes/who.php
Строк: 150
<?php
/**
* This file is part of JohnCMS Content Management System.
*
* @copyright JohnCMS Community
* @license https://opensource.org/licenses/GPL-3.0 GPL-3.0
* @link https://johncms.com JohnCMS Project
*/
declare(strict_types=1);
defined('_IN_JOHNCMS') || die('Error: restricted access');
/**
* @var PDO $db
* @var JohncmsSystemLegacyTools $tools
* @var JohncmsSystemUsersUser $user
*/
if (! $user->isValid()) {
header('Location: ./');
exit;
}
$sql = 'SELECT COUNT(*) FROM `cms_sessions` WHERE `lastdate` > ? AND `place` LIKE ?';
$sql2 = 'SELECT * FROM `cms_sessions` WHERE `lastdate` > ? AND `place` LIKE ? ORDER BY `movings` DESC LIMIT ?, ?';
if ($id) {
// Показываем общий список тех, кто в выбранной теме
$topic = $db->query("SELECT `name` FROM `forum_topic` WHERE `id` = '${id}'")->fetchColumn();
if ($topic) {
$params = [(time() - 300), '/forum?type=topic&id=' . $id . '%'];
if (! $do) {
$sql = 'SELECT COUNT(*) FROM `users` WHERE `lastdate` > ? AND `place` REGEXP (?)';
$sql2 = 'SELECT * FROM `users` WHERE `lastdate` > ? AND `place` REGEXP (?) ORDER BY `name` LIMIT ?, ?';
$params = [(time() - 300), '^/forum?(.*)id=([0-9]+)'];
}
$req = $db->prepare($sql);
$req->execute($params);
$total = $req->fetchColumn();
if ($start >= $total) {
// Исправляем запрос на несуществующую страницу
$start = max(0, $total - (($total % $user->config->kmess) == 0 ? $user->config->kmess : ($total % $user->config->kmess)));
}
$n = 0;
if ($total) {
$params = array_merge($params, [$start, $user->config->kmess]);
$req = $db->prepare($sql2);
$req->execute($params);
foreach ($req as $res) {
preg_match('~^/forum?(.*)id=([0-9]+)~', $res['place'], $m);
if ($m[2] == $id || $db->query('SELECT COUNT(*) FROM `forum_messages` WHERE `id`=' . $m[2] . ' AND `topic_id`=' . $id)->fetchColumn()) {
if (empty($res['name'])) {
$res['name'] = __('Guest');
}
$res['user_profile_link'] = '';
if (! empty($res['id']) && $user->isValid() && $user->id != $res['id']) {
$res['user_profile_link'] = '/profile/?user=' . $res['id'];
}
$res['user_rights_name'] = '';
if (! empty($res['rights'])) {
$res['user_rights_name'] = $user_rights_names[$res['rights']] ?? '';
}
$res['user_is_online'] = time() <= $res['lastdate'] + 300;
$res['search_ip_url'] = '/admin/search_ip/?ip=' . long2ip((int) $res['ip']);
$res['ip'] = long2ip((int) $res['ip']);
$res['search_ip_via_proxy_url'] = '/admin/search_ip/?ip=' . long2ip((int) $res['ip_via_proxy']);
$res['ip_via_proxy'] = ! empty($res['ip_via_proxy']) ? long2ip((int) $res['ip_via_proxy']) : 0;
$res['place'] = '';
$items[] = $res;
$total = ++$n;
}
}
}
} else {
header('Location: ./');
}
echo $view->render(
'forum::who',
[
'title' => __('Who in Topic'),
'page_title' => __('Who in Topic'),
'empty_message' => __('The list is empty'),
'items' => $items ?? [],
'pagination' => $tools->displayPagination('?act=who&id=' . $id . '&' . ($do == 'guest' ? 'do=guest&' : ''), $start, $total, $user->config->kmess),
'total' => $total,
'topic' => $topic,
'is_users' => $do !== 'guest',
'users_list_url' => '?act=who&id=' . $id,
'guests_list_url' => '?act=who&do=guest&id=' . $id,
'show_period' => false,
'id' => $id,
]
);
} else {
// Показываем общий список тех, кто в форуме
$params = [(time() - 300), '/forum%'];
if (! $do) {
$sql = 'SELECT COUNT(*) FROM `users` WHERE `lastdate` > ? AND `place` LIKE ?';
$sql2 = 'SELECT * FROM `users` WHERE `lastdate` > ? AND `place` LIKE ? ORDER BY `name` LIMIT ?, ?';
}
$req = $db->prepare($sql);
$req->execute($params);
$total = $req->fetchColumn();
if ($start >= $total) {
// Исправляем запрос на несуществующую страницу
$start = max(0, $total - (($total % $user->config->kmess) == 0 ? $user->config->kmess : ($total % $user->config->kmess)));
}
$items = [];
if ($total) {
$params = array_merge($params, [$start, $user->config->kmess]);
$req = $db->prepare($sql2);
$req->execute($params);
unset($sql, $sql2);
foreach ($req as $res) {
// Вычисляем местоположение
$place = '';
$parsed_url = [];
if (! empty($res['place'])) {
$parsed_url = parse_url($res['place']);
if (! empty($parsed_url['query'])) {
parse_str($parsed_url['query'], $parsed_url);
}
}
$place_id = 0;
$act_type = '';
$place = 'forum';
if (! empty($parsed_url['act'])) {
$place = $parsed_url['act'];
$place_id = $parsed_url['id'] ?? 0;
$act_type = $parsed_url['type'] ?? '';
} elseif (! empty($parsed_url['type'])) {
$place = $parsed_url['type'];
$place_id = $parsed_url['id'];
} elseif (! empty($parsed_url['id'])) {
$place = 'section';
$place_id = $parsed_url['id'];
}
switch ($place) {
case 'forum':
$place = '<a href="./">' . __('In the forum Main') . '</a>';
break;
case 'who':
$place = __('Here, in the List');
break;
case 'files':
$place = '<a href="?act=files">' . __('Looking forum files') . '</a>';
break;
case 'new':
$place = '<a href="?act=new">' . __('In the unreads') . '</a>';
break;
case 'search':
$place = '<a href="search.php">' . __('Forum search') . '</a>';
break;
case 'section':
$section = $db->query('SELECT * FROM `forum_sections` WHERE `id`= ' . $place_id)->fetch();
if (! empty($section)) {
$link = '<a href="?id=' . $section['id'] . '">' . (empty($section['name']) ? '-----' : $section['name']) . '</a>';
$place = __('In the Category') . ' "' . $link . '"';
} else {
$place = '<a href="./">' . __('In the forum Main') . '</a>';
}
break;
case 'topics':
$topics = $db->query('SELECT * FROM `forum_sections` WHERE `id`= ' . $place_id)->fetch();
if (! empty($topics)) {
$link = '<a href="?type=topics&id=' . $topics['id'] . '">' . (empty($topics['name']) ? '-----' : $topics['name']) . '</a>';
$place = __('In the Section') . ' "' . $link . '"';
} else {
$place = '<a href="./">' . __('In the forum Main') . '</a>';
}
break;
case 'say': // phpcs:ignore
$sql = 'SELECT `frt`.`id`, `frt`.`name` FROM `forum_messages` frm
LEFT JOIN `forum_topic` frt ON `frt`.`id`=`frm`.`topic_id` WHERE `frm`.`id`= ?';
if ($act_type == 'post') {
$sql = 'SELECT `id`, `name` FROM `forum_topic` WHERE id = ?';
}
case 'topic':
if (empty($sql)) {
$sql = 'SELECT `id`, `name` FROM `forum_topic` WHERE `id`= ?';
}
$req = $db->prepare($sql);
$req->execute([$place_id]);
$topic = $req->fetch();
if (! empty($topic)) {
$link = '<a href="?type=topic&id=' . $topic['id'] . '">' . (empty($topic['name']) ? '-----' : $topic['name']) . '</a>';
if ($act_type == 'reply') {
$place = __('Answers in the Topic') . ' "' . $link . '"';
} else {
$place = (($place == 'say') ? __('Writes in the Topic') . ' "' : __('In the Topic') . ' "') . $link . '"';
}
} else {
$place = '<a href="./">' . __('In the forum Main') . '</a>';
}
break;
case 'show_post':
$message = $db->query("SELECT `frt`.`id`, `frt`.`name` FROM `forum_messages` frm
LEFT JOIN `forum_topic` frt ON `frt`.`id`=`frm`.`topic_id` WHERE `frm`.`id` = '" . $place_id . "'")->fetch();
if (! empty($message)) {
$place = __('In the Topic') . ' "<a href="?type=topic&id=' . $message['id'] . '">' . (empty($message['name']) ? '-----' : $message['name']) . '</a>"';
} else {
$place = '<a href="./">' . __('In the forum Main') . '</a>';
}
break;
default:
$place = '<a href="./">' . __('In the forum Main') . '</a>';
}
if (empty($res['name'])) {
$res['name'] = __('Guest');
}
$res['user_avatar'] = '';
if (! empty($res['id'])) {
$avatar = UPLOAD_PATH . 'users/avatar/' . $res['id'] . '.png';
if (file_exists($avatar)) {
$res['user_avatar'] = pathToUrl($avatar);
}
}
$res['user_profile_link'] = '';
if (! empty($res['id']) && $user->isValid() && $user->id != $res['id']) {
$res['user_profile_link'] = '/profile/?user=' . $res['id'];
}
$res['user_rights_name'] = '';
if (! empty($res['rights'])) {
$res['user_rights_name'] = $user_rights_names[$res['rights']] ?? '';
}
$res['user_is_online'] = time() <= $res['lastdate'] + 300;
$res['search_ip_url'] = '/admin/search_ip/?ip=' . long2ip((int) $res['ip']);
$res['ip'] = long2ip((int) $res['ip']);
$res['search_ip_via_proxy_url'] = '/admin/search_ip/?ip=' . long2ip((int) $res['ip_via_proxy']);
$res['ip_via_proxy'] = ! empty($res['ip_via_proxy']) ? long2ip((int) $res['ip_via_proxy']) : 0;
$res['place'] = $place;
$items[] = $res;
}
}
echo $view->render(
'forum::who',
[
'title' => __('Who in Forum'),
'page_title' => __('Who in Forum'),
'empty_message' => __('The list is empty'),
'items' => $items ?? [],
'pagination' => $tools->displayPagination('?act=who&' . ($do == 'guest' ? 'do=guest&' : ''), $start, $total, $user->config->kmess),
'total' => $total,
'is_users' => $do !== 'guest',
'users_list_url' => '?act=who',
'guests_list_url' => '?act=who&do=guest',
'show_period' => false,
]
);
}