Иконка ресурса

GameCMS Rest API 1.0

Нет прав для скачивания

hsax0r

Новенький
Участник
05.03.2025
10
10
hsax0r добавил(а) новый ресурс:

- Данный модуль расширяет функциональные возможности GameCMS, добавляя API для взаимодействия с ним.

RestAPI — данный модуль расширяет функциональные возможности GameCMS, добавляя API для взаимодействия с ним. С его помощью можно выполнять запросы к системе, управлять пользователями, получать данные о серверах и выполнять другие операции через HTTP-запросы.

Имеется интеграция с Counter-Strike 1.6

 

hsax0r

Новенький
Участник
05.03.2025
10
10
Пример взаимодействия:
GameCMS
постоянно выполняет таймер и выполняет Ajax с различными запросами, а RestAPI позволяет все эти запросы объединить в один. Так, на примере можно вывести реальный онлайн пользователей на сайте, онлайн пользователей, кол-во онлайн пользователей и кол-во игроков без перезагрузки страницы, а также проверить новые сообщения:

Допустим у нас есть стандартная функция: chat_get_messages в ajax/ajax-user.js мы её заменяем:
JavaScript:
if(typeof $RestAPI !== 'undefined') {
    function chat_get_messages(status) {
        var last_mess = $('#last_mess').val();
        var hash = null;
        if($('#users_online_list').length) {
            hash = $('#users_online_list').data('hash');
        }
        $RestAPI.get([
            { method: 'chat.messages', params: { last_mess: last_mess }},
            { method: 'users.online', params: { hash: hash } },
            { method: 'servers.get.online', params: [] },
            { method: 'pm.checker', params: [] }
        ]).then(data => {
            if(data[0].data.content) {
                $("#chat_messages").append(data[0].data.content);
                $('#last_mess').val(data[0].data.last_message);
                $('[tooltip="yes"]').tooltip();
               
                setTimeout(function() {
                    var block = $("#chat_messages");
                    var height = block[0].scrollHeight - block[0].scrollTop;
                    if (height < 800) {
                        block.scrollTop(block[0].scrollHeight);
                    }
                }, 100);
   
                if(status != 1) {
                    play_sound('/ajax/sound/new_mess.mp3', 0.8);
                }
                else {
                    window.chat_interval = setInterval(function() {
                        chat_get_messages(status);
                    }, 5000);
                }
            }
           
            if($('#users_online_number').length && data[1].data.count) {
                $('[data-output="online users"]').text(data[1].data.count);
                $('#users_online_number').text(data[1].data.count);
            }
           
            if($('#users_online_list').length && data[1].data.content) {
                $('#users_online_list').html(data[1].data.content);
                $('#users_online_list').data('hash', data[1].data.hash);
            }
            if($('[data-output="online servers"]').length && data[2].data.total) {
                $('[data-output="online servers"]').text(data[2].data.total);
            }
            if(data[3].data.status == '1') {
                if(!$('#noty_messages').length) {
                    $('body').append(data[3].data.content);
                }
                $('#noty_messages').find('#noty_messages_count').text(data[3].data.dialogs);
            }
            else {
                if($('#noty_messages').length) {
                    $('#noty_messages').remove();
                }
            }
        });
    }
}
else {
    function chat_get_messages(status) {
        var token = $("#token").val();
        var last_mess = $("#last_mess").val();
        $.ajax({
            type: "POST",
            url: "../ajax/chat_data.php",
            data: "phpaction=1&token=" + token + "&get_messages=1&last_mess=" + last_mess,
            success: function (html) {
                if (Number(html) != 2) {
                    $("#chat_messages").append(html);
                    $('[tooltip="yes"]').tooltip();
                    setTimeout(function () {
                        var block = document.getElementById("chat_messages");
                        var height = block.scrollHeight - block.scrollTop;
                        if (height < 800) {
                            block.scrollTop = block.scrollHeight;
                        }
                    }, 200);
                    if (status != 1) {
                        play_sound("../ajax/sound/new_mess.mp3", 0.8);
                    } else {
                        window.chat_interval = setInterval(chat_get_messages, 5000);
                    }
                }
            },
        });
    }
}

Таким образом, мы:
1. Получаем сообщения в чате (chat.messages)
2. Получаем список пользователей онлайн (users.online)
3. Получаем онлайн со всех серверов (servers.get.online)
4. Проверяем новые Личные сообщения (pm.checker)
и все это 1 запросом, а не 4-мя.
 
Последнее редактирование:

hsax0r

Новенький
Участник
05.03.2025
10
10
Получаем сведения о пользователе через Ajax
JavaScript:
$RestAPI.get('users.get', {id: 263, "return": "login"}).then(data => {
    console.log(data);
});
В консоли мы получим:
1741251182445.png

Как это применить?
Допустим, мы вызвали:
JavaScript:
$RestAPI.get('users.get', {id: 263, "return": "login"}).then(data => {
    $('#nickname').text(data[0].login);
});
Помещаем в наш <div id="nickname"></div> логин пользователя id: 263
RestAPI предоставляет все открытые сведения о пользователе без TOKEN'a, но чтобы внести изменения в профиль или получить больше сведений, нужно приложить TOKEN разработчика, который можно получить через взаимодействующие модули.

Также, можно получить все доступные данные о пользователе, если не указывать "return". Return возвращает определенные данные, которые нужно получить в ответ. Но без него, мы получим:
1741251365672.png

Ограничить получаемые данные без TOKEN ключа, можно в methods/users.php
PHP:
$api->registerMethod('users.get', function($params) {
        if(isset($params['id'])) {
            if(!is_array($params['id'])) {
                $params['id'] = [$params['id']];
            }
        }
        else {
            return ['error' => 'Не указан ID пользователя'];
        }
       
        $placeholders = implode(',', array_fill(0, count($params['id']), '?'));
       
        $sth = pdo()->prepare("SELECT * FROM `users` WHERE `id` IN ($placeholders)");
        $sth->execute($params['id']);
       
        $responseData = $sth->fetchAll(PDO::FETCH_ASSOC);
       
        if(count($responseData) === 0) {
            return ['error' => 'Пользователи не найдены'];
        }

        if($params['token'] === false) {
            $hiddenFields = ['ip', 'password', 'steam_api', 'vk_api', 'fb_api', 'browser', 'plugins_settings', 'email', 'multi_account', 'steam_id'];
           
            foreach($responseData as &$user) {
                foreach($hiddenFields as $field) {
                    unset($user[$field]);
                }
            }
        }

        return $responseData;
    });
 

Смерть Суперсель

Новенький
Premium
16.01.2024
6
1

Мое предложение што нужно обновить
1. Оптимизация селекторов jQuery​

Сохраняйте элементы в переменные для многократного использования
Скрытое содержимое доступно для зарегистрированных пользователей!

2. Добавление обработки ошибок​

Добавьте блок .catch() для обработки ошибок RestAPI:
Скрытое содержимое доступно для зарегистрированных пользователей!

3. Улучшение прокрутки чата​

Используйте requestAnimationFrame для плавной прокрутки:
Скрытое содержимое доступно для зарегистрированных пользователей!

4. Замена setInterval на рекурсивный setTimeout​

Избегайте накопления запросов:
Скрытое содержимое доступно для зарегистрированных пользователей!
 

hsax0r

Новенький
Участник
05.03.2025
10
10

Мое предложение што нужно обновить​

1. Оптимизация селекторов jQuery​

Сохраняйте элементы в переменные для многократного использования
*** Скрытый текст не может быть процитирован. ***

2. Добавление обработки ошибок​

Добавьте блок .catch() для обработки ошибок RestAPI:
*** Скрытый текст не может быть процитирован. ***

3. Улучшение прокрутки чата​

Используйте requestAnimationFrame для плавной прокрутки:
*** Скрытый текст не может быть процитирован. ***

4. Замена setInterval на рекурсивный setTimeout​

Избегайте накопления запросов:
*** Скрытый текст не может быть процитирован. ***
Сначала подумал, ничего себе, кто-то с познаниями, а оказался обычный чатгпт. К сожалению, чатгпт дрянная вещь и многое пишет не правильно, с ошибками)

В связи с этим, тебе нужно изменить не "Мое предложение што нужно обновить", на "Предложение ИИ на то, что можно изменить".
А теперь, разберем:

JavaScript:
    $RestAPI = {
        'version': '1.0',
        'enable': true,
        get: function(method, params) {
            const requestData = (Array.isArray(method)) ?
                { requests: method.map(m => ({ method: m.method, params: m.params })) } :
                { method: method, params: params || {} };

            return fetch('/api', {
                method: 'POST',
                headers: { 'Content-Type': 'application/json' },
                body: JSON.stringify(requestData)
            })
            .then(response => {
                if (!response.ok) {
                    throw new Error('Ошибка при запросе: ' + response.statusText);
                }
                return response.json();
            })
            .then(data => {
                return data;
            })
            .catch(error => {
                console.error('Ошибка:', error);
                throw error;
            });
        }
    };
В RestAPI уже есть обработка catch, получение ошибок в then.

Что касательно функции: chat_get_messages
То в основном код лежит тут от GameCMS и лишь адаптирован под RestAPI как ПРИМЕР использования. Зачем создавать константу, которая будет вызвана один раз?
JavaScript:
const el =  $('#element');
if(el.length) {
el.html();
}

Всё, константа el больше не используется, так в чём смысл? Если говорить про оптимальность, то нужно делать:

JavaScript:
const el = $('#element');
el.length && el.html();
 
Последнее редактирование:

Смерть Суперсель

Новенький
Premium
16.01.2024
6
1
дпт я для текста использую да вроде где то на форуме видел на другом сливал там писали дпт ече не умет код писать нормальна он наравне с сам ной
 

degrando

tg/lazydsgn
Скриптер
03.12.2023
34
76
$data['params']['token'] = isset($data['params']['token']) ? $api->IsTokenValid($data['params']['token']) : false; Наверное стоит не просто записывать false, думаю что стоит также прекращать выполнение запроса
 
Сверху Снизу