Отображение пользователей, которые сейчас используют скрипт

Howau

Участник
Автор темы
43
8
Версия MoonLoader
.026-beta
Я бы хотел сделать вкладку в скрипте, в которой будут отображаться люди онлайн, у которых сейчас используется скрипт.
Можно ли это осуществить через json файлик на хостинге?
Если да, то как записывать и удалять из этого json ники? (не силен в чтение и редактировании файлов с серверов)
 
Решение
Ну примерно как то так
Сразу скажу что есть проблема с "безопасностью", так как кто угодно может зафлудить тебе запросами и понадобавлять говна в список.
Так же рекомендую заменить синхронные запросы на асинхронные
Клиент (скрипт)
Lua:
local apiUrl = 'https://yoursite.com';
local scriptUsers = {};

-- mimgui
imgui.Text(u8(('Пользователи скрипта (всего: %d)'):format(#users)));
for index, user in ipairs(scriptUsers) do
    imgui.Text(('%d. %s'):format(index, user.name)));
    imgui.SameLine();
    imgui.TextDisabled(u8('Играет на ' .. user.server));
end

function updateScriptUsers()
    requests.get(apiUrl .. '/usersList');
    if (response.status_code ~= 200) then
        return print('Не могу получить список пользователей, ошибка '...

chapo

tg/inst: @moujeek
Модератор
9,078
12,064
Ну примерно как то так
Сразу скажу что есть проблема с "безопасностью", так как кто угодно может зафлудить тебе запросами и понадобавлять говна в список.
Так же рекомендую заменить синхронные запросы на асинхронные
Клиент (скрипт)
Lua:
local apiUrl = 'https://yoursite.com';
local scriptUsers = {};

-- mimgui
imgui.Text(u8(('Пользователи скрипта (всего: %d)'):format(#users)));
for index, user in ipairs(scriptUsers) do
    imgui.Text(('%d. %s'):format(index, user.name)));
    imgui.SameLine();
    imgui.TextDisabled(u8('Играет на ' .. user.server));
end

function updateScriptUsers()
    requests.get(apiUrl .. '/usersList');
    if (response.status_code ~= 200) then
        return print('Не могу получить список пользователей, ошибка ', response.status_code);
    end
    local status, result = pcall(decodeJson, response.text);
    if (not status or not result) then
        return print('Ошибка, не могу чето сделаьь, вот жсончик', response.text);
    end
    scriptUsers = result;
end

function sendApiInfo(isQuit)
    return requests.post(
        apiUrl .. '/userUpdate',
        {
            data = {
                quit = isQuit,
                server = table.concat({sampGetCurrentServerAddress()}, ':'),
                name = sampGetPlayerNickname(select(2, sampGetPlayerIdByCharHandle(PLAYER_PED)))
            }
        }
    );
end

function main()
    ---...
    sendApiInfo();
    ---...
end

function onScriptTerminate(scr)
    if (scr == thisScript()) then
        sendApiInfo(true);
    end
end
Сервер (Express.js)
JavaScript:
const express = require("express");
const app = express();
app.use(express.json());

const users = [];

app.get('/usersList', (request, response) => {
    return response.sendJson(users);
});

app.post('/userUpdate', (request, response) => {
    if (!request.body.name || !request.body.server)
        return response.sendStatus(400);
    if (request.body.quit) {
        const userIndex = users.findIndex((u) => u.name == request.body.name && u.server == request.body.server;
        if (users[userIndex])
            users.splice(userIndex, 1)
        return response.sendStatus(200);
    }
    users.push({
        name: request.body.name,
        server: request.body.server
    });
    return response.sendStatus(200);
});

app.listen(3000);
 
  • Нравится
Реакции: MLycoris

Howau

Участник
Автор темы
43
8
Ну примерно как то так
Сразу скажу что есть проблема с "безопасностью", так как кто угодно может зафлудить тебе запросами и понадобавлять говна в список.
Так же рекомендую заменить синхронные запросы на асинхронные
Клиент (скрипт)
Lua:
local apiUrl = 'https://yoursite.com';
local scriptUsers = {};

-- mimgui
imgui.Text(u8(('Пользователи скрипта (всего: %d)'):format(#users)));
for index, user in ipairs(scriptUsers) do
    imgui.Text(('%d. %s'):format(index, user.name)));
    imgui.SameLine();
    imgui.TextDisabled(u8('Играет на ' .. user.server));
end

function updateScriptUsers()
    requests.get(apiUrl .. '/usersList');
    if (response.status_code ~= 200) then
        return print('Не могу получить список пользователей, ошибка ', response.status_code);
    end
    local status, result = pcall(decodeJson, response.text);
    if (not status or not result) then
        return print('Ошибка, не могу чето сделаьь, вот жсончик', response.text);
    end
    scriptUsers = result;
end

function sendApiInfo(isQuit)
    return requests.post(
        apiUrl .. '/userUpdate',
        {
            data = {
                quit = isQuit,
                server = table.concat({sampGetCurrentServerAddress()}, ':'),
                name = sampGetPlayerNickname(select(2, sampGetPlayerIdByCharHandle(PLAYER_PED)))
            }
        }
    );
end

function main()
    ---...
    sendApiInfo();
    ---...
end

function onScriptTerminate(scr)
    if (scr == thisScript()) then
        sendApiInfo(true);
    end
end
Сервер (Express.js)
JavaScript:
const express = require("express");
const app = express();
app.use(express.json());

const users = [];

app.get('/usersList', (request, response) => {
    return response.sendJson(users);
});

app.post('/userUpdate', (request, response) => {
    if (!request.body.name || !request.body.server)
        return response.sendStatus(400);
    if (request.body.quit) {
        const userIndex = users.findIndex((u) => u.name == request.body.name && u.server == request.body.server;
        if (users[userIndex])
            users.splice(userIndex, 1)
        return response.sendStatus(200);
    }
    users.push({
        name: request.body.name,
        server: request.body.server
    });
    return response.sendStatus(200);
});

app.listen(3000);
Сервер на гитхаб залить?