CS 1.6 
ChatCS - трансляция чата с сервера в чат GameCMS
ChatCS - трансляция чата с сервера в чат GameCMS
2.0
Недоступно ( Зарегистрироваться )
Поместите файл chat_from_site.amxx в папку amxmodx/plugins/
Добавьте строку в amxmodx/configs/plugins.ini: chat_from_site.amxx

Создайте файл amxmodx/configs/chat.cfg с настройками:

C++:
Expand Collapse Copy
// Основные настройки чата
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"  // Аватар по умолчанию

Изменить chat_action.php (сначала сохраните оригинал. Это важно)
PHP:
Expand Collapse Copy
<?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']));
}
?>

Изменить chat_message.tpl (сохранить оригинал. Это важно) Шаблон standart
PHP:
Expand Collapse Copy
<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>
Назад
Сверху