ChatCS - трансляция чата с сервера в чат GameCMS
2.0
// Основные настройки чата
amx_chat_enabled 1 // Включить чат (1 - да, 0 - нет)
amx_chat_color 1 // Цветные сообщения
amx_chat_admin_only 0 // Только для админов
amx_chat_bot_only 0 // Только для ботов
amx_chat_prefix "[Сайт]" // Префикс сообщений
amx_chat_block_site_only 0 // Блокировать "[Только сайт]"
amx_chat_log_errors 1 // Логировать ошибки
// Настройки подключения к БД
amx_db_host "localhost" // Хост БД GAMECMS
amx_db_user "username" // Пользователь БД
amx_db_pass "password" // Пароль БД
amx_db_name "database" // Имя БД
// Дополнительные настройки
amx_default_avatar "files/avatars/no_avatar.jpg" // Аватар по умолчанию
<?php
include_once __DIR__ . '/../inc/start_lite.php';
$AjaxResponse = new AjaxResponse();
if(!isPostRequest() || !isRightToken()) {
$AjaxResponse->status(false)->alert('Ошибка')->send();
}
// Функция для получения сообщений чата
function getChatMessages($pdo, $limit, $conf, $full_site_host) {
$users_groups = get_groups($pdo);
$tpl = new Template;
$tpl->dir = '../templates/'.$conf->template.'/tpl/';
$query = "SELECT chat.*,
IF(chat.user_id = 0, '', users.login) as login,
IF(chat.user_id = 0,
'{$full_site_host}files/avatars/no_avatar.jpg',
CONCAT('{$full_site_host}', users.avatar)) as avatar,
IF(chat.user_id = 0, 0, users.rights) as rights
FROM chat
LEFT JOIN users ON chat.user_id = users.id
ORDER BY chat.id DESC
LIMIT " . $limit;
$STH = $pdo->query($query);
$STH->execute();
return $STH->fetchAll();
}
if (isset($_POST['chat_first_messages']) || isset($_POST['chat_load_messages'])) {
$limit = isset($_POST['chat_load_messages']) ? intval($_POST['load_val']) * 50 . ", 50" : "50";
$row = getChatMessages($pdo, $limit, $conf, $full_site_host);
$count = count($row);
if ($count == 0) {
exit('<p class="t-c">Сообщений нет</p>');
}
$users_groups = get_groups($pdo);
$tpl = new Template;
$tpl->dir = '../templates/'.$conf->template.'/tpl/';
for ($i = $count-1; $i >= 0; $i--) {
$date = expand_date($row[$i]['message_date'], 8);
$tpl->load_template('elements/chat_message.tpl');
// Устанавливаем данные для шаблона
$tpl->set("{id}", $row[$i]['id']);
$tpl->set("{user_id}", $row[$i]['user_id']);
$tpl->set("{login}", $row[$i]['login'] ?: 'Игрок');
$tpl->set("{avatar}", $row[$i]['avatar']);
$tpl->set("{date_full}", $date['full']);
$tpl->set("{date_short}", $date['short']);
// Обработка текста сообщения
$message_text = $row[$i]['message_text'];
$is_site_only = (strpos($message_text, '[Только сайт]') !== false);
if ($is_site_only) {
$message_text = str_replace('[Только сайт]', '', $message_text);
}
$tpl->set("{text}", trim($message_text));
$tpl->set("{is_site_only}", $is_site_only ? '1' : '0');
// Группа пользователя
$rights = $row[$i]['rights'] ?? 0;
$tpl->set("{gp_name}", $users_groups[$rights]['name'] ?? 'Игрок');
$tpl->set("{gp_color}", $users_groups[$rights]['color'] ?? '#999999');
$tpl->set("{gp_rights}", $users_groups[$_SESSION['rights'] ?? 0]['rights'] ?? '');
$tpl->compile('chat');
$tpl->clear();
}
$tpl->show($tpl->result['chat']);
$tpl->global_clear();
if (isset($_POST['chat_first_messages'])) {
exit('<script>$("#last_mess").val('.$row[0]['id'].');</script>');
} elseif (isset($_POST['chat_load_messages']) && $count != 50) {
exit('<script>$("#load_val").val(0);</script>');
}
exit();
}
if (isset($_POST['chat_send_message'])) {
if (!is_auth()) {
exit(json_encode(['status' => '2']));
}
$message_text = check($_POST['message_text'], null);
if (empty($message_text)) {
exit(json_encode(['status' => '2']));
}
include_once "../inc/protect.php";
// Проверка прав пользователя
$users_groups = get_groups($pdo);
$user_rights = $_SESSION['rights'] ?? 0;
$has_game_access = strpos($users_groups[$user_rights]['rights'] ?? '', 'k') !== false;
if (!$has_game_access) {
$message_text = '[Только сайт] ' . $message_text;
}
$message_text = find_img_mp3($message_text, $_SESSION['id']);
$STH = $pdo->prepare("INSERT INTO `chat` (`user_id`,`message_text`,`message_date`)
VALUES (:user_id, :message_text, :message_date)");
if ($STH->execute([
':user_id' => $_SESSION['id'],
':message_text' => $message_text,
':message_date' => date("Y-m-d H:i:s")
])) {
up_online($pdo);
exit(json_encode(['status' => '1']));
}
exit(json_encode(['status' => '2']));
}
if (isset($_POST['drop_img'])) {
if (empty($_SESSION['id'])) {
exit(json_encode(['status' => '2', 'data' => 'Авторизуйтесь, чтобы отправлять сообщения!']));
}
include_once "../inc/protect.php";
// Проверка прав через users_groups
$STH = $pdo->prepare("SELECT ug.rights FROM users u
LEFT JOIN users_groups ug ON u.rights = ug.id
WHERE u.id = :id LIMIT 1");
$STH->setFetchMode(PDO::FETCH_OBJ);
$STH->execute([':id' => $_SESSION['id']]);
$row = $STH->fetch();
if (strpos($row->rights ?? '', 'k') === false) {
exit(json_encode(['status' => '2', 'data' => 'У вас нет прав для отправки сообщений в игру']));
}
if (empty($_FILES['file']['name'])) {
exit(json_encode(['status' => '2', 'data' => 'Пустой файл']));
}
$path = 'files/filemanager/'.$_SESSION['id'].'/';
$date = time();
$message_text = '';
// Создаем директории если их нет
if (!file_exists($_SERVER["DOCUMENT_ROOT"].'/'.$path)) {
mkdir($_SERVER["DOCUMENT_ROOT"].'/'.$path, 0777, true);
}
if (!file_exists($_SERVER["DOCUMENT_ROOT"].'/files/thumbs/'.$_SESSION['id'].'/')) {
mkdir($_SERVER["DOCUMENT_ROOT"].'/files/thumbs/'.$_SESSION['id'].'/', 0777, true);
}
// Проверяем тип файла
if (if_img($_FILES['file']['name']) || if_mp3($_FILES['file']['name'])) {
$file_type = substr($_FILES['file']['name'], strrpos($_FILES['file']['name'], '.')+1);
$source = $_FILES['file']['tmp_name'];
$file = $path.$date.$_SESSION['id'].".".$file_type;
$target = '../'.$file;
if (!move_uploaded_file($source, $target)) {
exit(json_encode(['status' => '2', 'data' => 'Ошибка загрузки файла!']));
}
} else {
exit(json_encode(['status' => '2', 'data' => 'Файл должен являться изображением в формате JPG,GIF или PNG, либо аудиозаписью в формате MP3']));
}
// Формируем HTML для вставки в чат
if (if_img($_FILES['file']['name'])) {
$message_text = '<a href="'.$full_site_host.$file.'" class="thumbnail" data-lightbox="'.$_SESSION['id'].'"><img src="'.$full_site_host.$file.'" class="thumbnail-img"></a>';
} elseif (if_mp3($_FILES['file']['name'])) {
$message_text = '<audio src="'.$full_site_host.$file.'" controls="controls">Аудио файл: '.$full_site_host.$file.'</audio>';
}
// Сохраняем в базу
$STH = $pdo->prepare("INSERT INTO `chat` (`user_id`,`message_text`,`message_date`)
VALUES (:user_id, :message_text, :message_date)");
if ($STH->execute([
':user_id' => $_SESSION['id'],
':message_text' => $message_text,
':message_date' => date("Y-m-d H:i:s")
])) {
up_online($pdo);
exit(json_encode(['status' => '1']));
}
exit(json_encode(['status' => '2']));
}
?>
<div class="chat_message" id="message_id_{id}">
{if("{user_id}" != "0")}
<!-- Для зарегистрированных пользователей (сообщения с сайта) -->
<a href="../profile?id={user_id}" title="{gp_name}">
<img src="{avatar}?v={cache}" class="chat-avatar" alt="{login}">
</a>
{else}
<!-- Для незарегистрированных (сообщения из игры) -->
<span class="chat-avatar-container" title="Игрок">
<img src="{avatar}?v={cache}" class="chat-avatar" alt="Игрок">
</span>
{/if}
<div class="message">
<div class="info">
<div class="author" onclick="treatment('{login}');" title="{gp_name}" style="color: {gp_color}">{login}</div>
<div class="date" tooltip="yes" data-placement="left" title="{date_full}">{date_short}</div>
{if(strripos("{gp_rights}", "d") !== false)}
<span onclick="dell_chat_message('{id}');" tooltip="yes" data-placement="left" title="Удалить" class="m-icon icon-trash dell_message"></span>
<span id="edit_message_{id}" onclick="edit_chat_message('{id}', this);" tooltip="yes" data-placement="left" title="Редактировать" class="m-icon icon-pencil edit_message"></span>
{/if}
</div>
<div id="message_text_{id}" class="with_code">
{text}
</div>
{if(strripos("{gp_rights}", "d") !== false)}
<textarea id="message_text_e_{id}" class="form-control disp-n">{text}</textarea>
{/if}
</div>
</div>