SA:MP Lua Arizona [OnlineChecker] [Модифицированный] Узнать очередь любого сервера Arizona RP

M-blasthk

Новичок
Автор темы
5
0



Online Monitoring - Модифицированный чекер очереди и онлайна всех серверов на базе скрипта от Rifla.

Скрипт позволяет проверять очередь любого из серверов с возможностью отправки информации в вип-чат.


rfEA26A.png
cmrENGY.png

не обращайте внимания на онлайны серверов, на момент снимка скриншота на сервера заливают обнову)





Функционал скрипта:

Мониторинг очереди и онлайна: Скрипт получает данные напрямую из API, позволяя получить информацию, как для себя, так и для других интересующихся в вип-чат. Выдаёт: онлайн и лимит игроков, а самое главное, количество человек в очереди на любой сервер проекта или Vice City.

Умный автоответчик: Если в VIP-чате кто-то спросит: "Сколько очередь на VC?" или "Че по онлайну на 30?", скрипт автоматически подтянет инфу и ответит игроку. Скрипт распознает названия серверов как на русском, так и на английском языке, также скрипт поддерживает практически любые формулировки, и отправляет ответ в /vr при наличии 2+ триггеров в сообщении.
local triggers:
local triggers = {
    "скок", "сколько", "какая", "че по",
    "очередь", "очередь на", "онлайн",
    "вс", "вай сити", "вайсити",
    "30", "лов", "лове"
}
Логика работы триггеров:
local matchCount = 0 -- каунтер
for _, word in ipairs(triggers) do if paddedMsg:find(" " .. word .. " ", 1, true) then matchCount = matchCount + 1 end end -- парс триггеров
if matchCount < 2 then return end -- проверка

Визуальный интерфейс: Приятное графическое окно с плавной анимацией появления. Вся нужная информация перед глазами, без лишнего мусора в чате.
Кастомный интерфейс:
lua_thread.create(function()
    while true do wait(0)
        if show and alpha < 255 then alpha = math.min(alpha + 25, 255)
        elseif not show and alpha > 0 then alpha = math.max(alpha - 25, 0) end

        if alpha > 0 or show then
            pcall(drawUI, alpha)
            if show then
                if isKeyDown(vkeys.VK_ESCAPE) then show = false endo
                if isKeyDown(vkeys.VK_R) and not isBusy then updateData() end
                if isKeyDown(vkeys.VK_V) and not isBusy then
                    local str = string.format("/vr [%s] %s %s | Онлайн: %d/%d | Очередь: %d", srv_tags[currentServer], data.name, srv_emojis[currentServer], data.online, data.max, data.queue)
                    safeChatSend(str)
                end
            end
        end
    end
end)

-- UI
function drawUI(a)
    local qCol = data.queue < 20 and 0x95F3AA or (data.queue < 100 and 0xFFD783 or 0xFF0000)
    renderDrawBox(x, y, w, h, bit.bor(bit.lshift(math.floor(a * 0.8), 24), 0x12131B))
    renderFontDrawText(FONT_TITLE, data.name .. string.format(" (%d/%d)", data.online, data.max), x + 25, y + 40, bit.bor(bit.lshift(a, 24), 0xFFFFFF))
    renderFontDrawText(FONT_MAIN, "Очередь: " .. data.queue, x + 25, y + 125, bit.bor(bit.lshift(a, 24), qCol))
end

-- API
function updateData()
    if isBusy then return end -- чекер статуса
    isBusy = true
    lua_thread.create(function()
        local ok, res = pcall(requests.get, "https://api.arizona-five.com/launcher/servers", {timeout = 5}) -- запрос API
        if ok and res and res.status_code == 200 then
            -- тут парсинг json и заполнение таблицы data
        end
        isBusy = false -- сброс статуса
    end)
end

Анти-флуд: Скрипт имитирует действия человека:
  • Скрипт использует случайные задержки перед ответом. []Имеет встроенную очередь сообщений.
  • Присутствует КД: 60 секунд на одного игрока и 40 секунд общего КД на автоответы.
Антифлуд:
-- Глобальный КД
function safeChatSend(msg)
    table.insert(chatQueue, msg) -- добавление
    if not isQueueActive then
        isQueueActive = true -- лок потока
        lua_thread.create(function()
            while #chatQueue > 0 do
                sampSendChat(chatQueue[1]) -- отправка первого
                table.remove(chatQueue, 1) -- удаление
                wait(3500) -- задержка флуда
            end
            isQueueActive = false -- анлок
        end)
    end
end

-- Стоп-краны
function sampev.onServerMessage(color, text)
    if os.clock() - absoluteLastSendTime < 3.0 then return end -- системное КД арз 3 сек

-- КД пользователя и глобальный КД
local now = os.time()
    if userCooldowns[nick] and now - userCooldowns[nick] < 60 then return end -- личный КД
    if now - lastGlobalRequestTime < 40 then return end -- общий КД

-- Отправка
absoluteLastSendTime = os.clock()
end


Конфиг: Все настройки скрипта (включен ли автоответ или пиар работы скрипта) сохраняются в конфиг monitor_settings.ini и не сбиваются после перезапуска игры.

Недоработки: В текущей версии кнопка "B" в меню была выпелена из-за лимитов аризоны на кол-во символов в /b. Будет доработано.



Необходимые библиотеки:

  • MoonLoader 0.26
  • SAMP.Lua (samp.events)
  • Requests
  • Inicfg
  • Encoding
  • Vkeys
Lua:
local requests = require("requests") local vkeys = require("vkeys") local encoding = require("encoding") local sampev = require("samp.events") local inicfg = require("inicfg")




Команды управления:

/vcМгновенно открыть мониторинг сервера Vice City
/online [сервер]Посмотреть онлайн любого сервера (например: /online 30)
/checkvrВключить/Выключить автоматические ответы в VIP-чат
/checkpiarВключить/Выключить пиар функций скрипта (КД 10 минут)

Горячие клавиши в меню:

  • [R] — Обновить инфу
  • [V] — Отправить инфо о сервере в VIP-чат
  • [ESC] — Закрыть окно




Большое спасибо Рифле и великому чату-gpt за отличную идею и реализоацию кода, на котором базируется скрипт)​
roodyu aka M-blasthk
 

Вложения

  • OnlineMonitoring.lua
    14.4 KB · Просмотры: 3
Последнее редактирование: