Как брвть информацию из /members (evolve rp)

demonvir

Новичок
Автор темы
14
2
Версия MoonLoader
.026-beta
Хотел сделать скрипт простой структуризации информации из members. Но почему-то не получается брать информацию пробовал парсить и текст и цвет. Видел похожий вопрос, но там он был связан с диалогом. Также видел скрипт, но он не работает.
 

pastow

Активный
215
67
Хотел сделать скрипт простой структуризации информации из members. Но почему-то не получается брать информацию пробовал парсить и текст и цвет. Видел похожий вопрос, но там он был связан с диалогом. Также видел скрипт, но он не работает.
Это цеф или обычный диалог(самповский интерфейс)?
 

demonvir

Новичок
Автор темы
14
2
2026-02-08 10-23-18-376.png

когда человек в AFK в конце ещё добавляется ❘ белым {AFK}: 3 секунд

Это цеф или обычный диалог(самповский интерфейс)?
не сильно шарю поэтому объяснил так
 

pastow

Активный
215
67

demonvir

Новичок
Автор темы
14
2
2026-02-08 10-44-39-838.png
2026-02-08 10-44-01-062.png

Отправь интерфейс мемберса просто ( или это просто сообщения из чата? )

Я пытался парсить это как текст из чата не работало, то ли у меня шаблон не тот то ли что
 
  • Вау
Реакции: pastow

demonvir

Новичок
Автор темы
14
2

Lua:
script_name("Members Ex Console")
script_author("You")

local encoding = require 'encoding'
encoding.default = 'CP1251'
u8 = encoding.UTF8
local events = require 'samp.events'

local tMembers = {}
local bPairs = false

function main()
    if not isSampfuncsLoaded() or not isSampLoaded() then return end
    while not isSampAvailable() do wait(100) end

    sampRegisterChatCommand("mbs", function()
        tMembers = {}
        bPairs = true
        sampSendChat("/members")
        print("Запрос /members отправлен, ожидаем список...")
    end)

    while true do wait(0) end
end

function events.onServerMessage(_, message)
    if not bPairs then return end

    -- Ловим строки с ID и ником, игнорируем остальное
    local id, nick = message:match("ID:%s*(%d+)%s*|.-|%s*([%w_]+)%s*:")
    if id and nick then
        -- Проверяем, нет ли уже такого игрока
        local exists = false
        for _, v in ipairs(tMembers) do
            if v.id == id then
                exists = true
                break
            end
        end
        if not exists then
            table.insert(tMembers, {id=id, nick=nick})
            print(("Найден игрок: %s [%s]"):format(nick, id))
        end
    end

    -- Ловим конец списка
    if message:find("Всего:%s*%d+ человек") then
        bPairs = false
        print(("Всего игроков в мемберсе: %d"):format(#tMembers))
        print("Все игроки:")
        for _, v in ipairs(tMembers) do
            print(("%s [%s]"):format(v.nick, v.id))
        end
    end

    return false
end
пробовал уже много вариантов даже упрощал код
 

менталейшн

Известный
1,290
233
Lua:
script_name("Members Ex Console")
script_author("You")

local encoding = require 'encoding'
encoding.default = 'CP1251'
u8 = encoding.UTF8
local events = require 'samp.events'

local tMembers = {}
local bPairs = false

function main()
    if not isSampfuncsLoaded() or not isSampLoaded() then return end
    while not isSampAvailable() do wait(100) end

    sampRegisterChatCommand("mbs", function()
        tMembers = {}
        bPairs = true
        sampSendChat("/members")
        print("Запрос /members отправлен, ожидаем список...")
    end)

    while true do wait(0) end
end

function events.onServerMessage(_, message)
    if not bPairs then return end

    -- Ловим строки с ID и ником, игнорируем остальное
    local id, nick = message:match("ID:%s*(%d+)%s*|.-|%s*([%w_]+)%s*:")
    if id and nick then
        -- Проверяем, нет ли уже такого игрока
        local exists = false
        for _, v in ipairs(tMembers) do
            if v.id == id then
                exists = true
                break
            end
        end
        if not exists then
            table.insert(tMembers, {id=id, nick=nick})
            print(("Найден игрок: %s [%s]"):format(nick, id))
        end
    end

    -- Ловим конец списка
    if message:find("Всего:%s*%d+ человек") then
        bPairs = false
        print(("Всего игроков в мемберсе: %d"):format(#tMembers))
        print("Все игроки:")
        for _, v in ipairs(tMembers) do
            print(("%s [%s]"):format(v.nick, v.id))
        end
    end

    return false
end
пробовал уже много вариантов даже упрощал код
Код:
function events.onServerMessage(_, message)
    if not bPairs then return end

    local id, nick = message:match("ID:%s*(%d+)%s*|.-|%s*([%w_]+)%[%d+%]")
    if id and nick then
        -- Проверяем дубликат
        local exists = false
        for _, v in ipairs(tMembers) do
            if v.id == id then
                exists = true
                break
            end
        end
        if not exists then
            table.insert(tMembers, {id = id, nick = nick})
            print(("Найден игрок: %s [%s]"):format(nick, id))
        end
    end

    -- фразу под сервак подстрой
    if message:find("Всего:%s*%d+ человек") then
        bPairs = false
        print(("Всего игроков в мемберсе: %d"):format(#tMembers))
        print("Все игроки:")
        for _, v in ipairs(tMembers) do
            print(("%s [%s]"):format(v.nick, v.id))
        end
    end

    return false
end
 

demonvir

Новичок
Автор темы
14
2
Код:
function events.onServerMessage(_, message)
    if not bPairs then return end

    local id, nick = message:match("ID:%s*(%d+)%s*|.-|%s*([%w_]+)%[%d+%]")
    if id and nick then
        -- Проверяем дубликат
        local exists = false
        for _, v in ipairs(tMembers) do
            if v.id == id then
                exists = true
                break
            end
        end
        if not exists then
            table.insert(tMembers, {id = id, nick = nick})
            print(("Найден игрок: %s [%s]"):format(nick, id))
        end
    end

    -- фразу под сервак подстрой
    if message:find("Всего:%s*%d+ человек") then
        bPairs = false
        print(("Всего игроков в мемберсе: %d"):format(#tMembers))
        print("Все игроки:")
        for _, v in ipairs(tMembers) do
            print(("%s [%s]"):format(v.nick, v.id))
        end
    end

    return false
end
не работает хоть и правильно все вроде просто пишет 0 игроков
 

менталейшн

Известный
1,290
233
не работает хоть и правильно все вроде просто пишет 0 игроков
Объясни что ты хочешь по итогу получить от своего скрипта и куда полученную информацию девать
 

demonvir

Новичок
Автор темы
14
2
Объясни что ты хочешь по итогу получить от своего скрипта и куда полученную информацию девать
Я хочу сделать скрипт который по команде будет открывать менюшку которая будет сортировать members, то есть в одном столбце ник в другом ид в третьем звание в четвертом афк в пятом расстояние ну и это все с поиском по ид и нику.
Я просто не пойму как брать инфу из members
 

chromiusj

модерирую шмодерирую
Модератор
5,992
4,301
у тебя регулярка некорректная, вот тебе пример кода (рабочего):
Lua:
local easy_dialog = require "easy_dialog"
local samp = require "samp.events"
local Dialog = easy_dialog.Dialog

local employees = {}
local captureList = false

local employeesDialog = Dialog.new()
    :setCaption(function(self)
        return "Сотрудники онлайн (" .. tostring(#(self.list or {})) .. ")"
    end)
    :setStyle("tablist_headers")
    :setHeaders({ "ID", "Имя", "Должность", "Статус" })
    :setButtons("Подробнее", "Закрыть")
    :setItemsPerPage(15)
    :setOnStart(function(self, data)
        self.list = (data and data.list) or {}
    end)
    :setItems(function(self)
        local items = {}
        for _, emp in ipairs(self.list or {}) do
            local nameDisplay = emp.voice and ("{3498db}[V] {FFFFFF}" .. emp.name) or ("{FFFFFF}" .. emp.name)
            local rankDisplay = string.format("{FFFF00}%s {CCCCCC}[%s]", emp.rank, emp.rankNum)
            local statusDisplay = emp.status
            if emp.afk then
                statusDisplay = statusDisplay .. " {e74c3c}(AFK: " .. emp.afk .. ")"
            end

            table.insert(items, {
                "{CCCCCC}" .. emp.id,
                nameDisplay,
                rankDisplay,
                statusDisplay
            })
        end
        return items
    end)
    :setOnResponse(function(self, button, index, _, item)
        if button == 1 and self.list[index] then
            easy_dialog.go("employee_info", { employee = self.list[index] })
        end
    end)

local employeeInfo = Dialog.new()
    :setStyle("msgbox")
    :setCaption("Карточка сотрудника")
    :setButtons("Назад", "")
    :setOnStart(function(self, data)
        self.employee = data and data.employee
        if not self.employee then
            self:setContent("Ошибка данных")
            return
        end
        local emp = self.employee
        local afkInfo = emp.afk and ("{e74c3c}" .. emp.afk) or "{CCCCCC}Нет"
        local voiceInfo = emp.voice and "{2ecc71}Присутствует" or "{e74c3c}Отсутствует"
        local text = string.format(
            "{FFFFFF}Имя: {3498db}%s\n" ..
            "{FFFFFF}ID: {CCCCCC}%s\n" ..
            "{FFFFFF}Ранг: {FFFF00}%s (%s)\n" ..
            "{FFFFFF}Дата трудоустройства: {CCCCCC}%s\n" ..
            "{FFFFFF}Voice чат: %s\n" ..
            "{FFFFFF}Статус: %s\n" ..
            "{FFFFFF}Время в AFK: %s",
            emp.name,
            emp.id,
            emp.rank, emp.rankNum,
            emp.datetime,
            voiceInfo,
            emp.status,
            afkInfo
        )
        self:setContent(text)
    end)
    :setOnResponse(function()
        easy_dialog.start("employees_dialog", { list = employees })
    end)

function samp.onServerMessage(color, text)
    if text:find("Члены организации Он%-лайн:") then
        employees = {}
        captureList = true
        return
    end
    if captureList and text:find("Всего:") then
        captureList = false
        if #employees > 0 then
            easy_dialog.start("employees_dialog", { list = employees })
        end
        return
    end
    if captureList then
        if text:match("^%s*$") then return end
        local id = text:match("ID:%s*(%d+)")
        if not id then return end
        local datetime = text:match("|%s*(%d+:%d+%s+%d+%.%d+%.%d+)") or ""
        local dt_pattern = datetime:gsub("[%.%-]", "%%%1")
        local nameSection = text:match(dt_pattern .. "%s*|%s*(.-):")
        if nameSection then
            local voice = false
            local name = nameSection
            if name:find("%(Voice%)") then
                voice = true
                name = name:gsub("%(Voice%)", "")
            end
            name = name:gsub("^%s+", ""):gsub("%s+$", "")
            local splitPos = text:find(":", text:find(nameSection, 1, true))
            if splitPos then
                local tail = text:sub(splitPos + 1)
                local rank, rankNum = tail:match("^%s*(.-)%[(%d+)%]")
                rank = rank and rank:gsub("^%s+", ""):gsub("%s+$", "") or ""
                local afkTime = nil
                if tail:find("%[AFK%]") then
                    afkTime = tail:match("%[AFK%]:%s*(.*)$")
                    if afkTime then
                        afkTime = afkTime:gsub("^%s+", ""):gsub("%s+$", "")
                    end
                end
                local statusRaw = tail:match("%-%s*(.*)")
                local status = "Неизвестно"
                if statusRaw then
                    if afkTime then
                        status = statusRaw:match("^(.-)%s*|")
                    else
                        status = statusRaw
                    end
                    status = status and status:gsub("^%s+", ""):gsub("%s+$", "") or ""
                end
                table.insert(employees, {
                    id = id,
                    datetime = datetime,
                    name = name,
                    voice = voice,
                    rank = rank,
                    rankNum = rankNum,
                    status = status,
                    afk = afkTime
                })
            end
        end
    end
end

function main()
    while not isSampAvailable() do wait(0) end
    easy_dialog.init()
    easy_dialog.register("employees_dialog", employeesDialog)
    easy_dialog.register("employee_info", employeeInfo)
    sampRegisterChatCommand("mb", function()
        sampSendChat("/members")
    end)
    wait(-1)
end

function onScriptTerminate(script, quitGame)
    if script == thisScript() then
        easy_dialog.stop()
    end
end
из требований https://www.blast.hk/threads/239154/
1771158591178.png

1771158602086.png
 

demonvir

Новичок
Автор темы
14
2
[13:52:06.535534] (system) Loading script 'C:\Users\user\Desktop\ooo\moonloader\easy_dialog(example).lua'...
[13:52:06.535534] (debug) New script: 0CE6455C
[13:52:06.541532] (error) easy_dialog(example).lua: ...ers\user\Desktop\ooo\moonloader\easy_dialog(example).lua:1: module 'easy_dialog' not found:
no field package.preload['easy_dialog']
no file 'C:\Users\user\Desktop\ooo\moonloader\lib\easy_dialog.lua'
no file 'C:\Users\user\Desktop\ooo\moonloader\lib\easy_dialog\init.lua'
no file 'C:\Users\user\Desktop\ooo\moonloader\easy_dialog.lua'
no file 'C:\Users\user\Desktop\ooo\moonloader\easy_dialog\init.lua'
no file '.\easy_dialog.lua'
no file 'C:\Users\user\Desktop\ooo\moonloader\lib\easy_dialog.luac'
no file 'C:\Users\user\Desktop\ooo\moonloader\lib\easy_dialog\init.luac'
no file 'C:\Users\user\Desktop\ooo\moonloader\easy_dialog.luac'
no file 'C:\Users\user\Desktop\ooo\moonloader\easy_dialog\init.luac'
no file '.\easy_dialog.luac'
no file 'C:\Users\user\Desktop\ooo\moonloader\lib\easy_dialog.dll'
stack traceback:
[C]: in function 'require'
...ers\user\Desktop\ooo\moonloader\easy_dialog(example).lua:1: in main chunk
[13:52:06.541532] (error) easy_dialog(example).lua: Script died due to an error. (0CE6455C)
у тебя регулярка некорректная, вот тебе пример кода (рабочего):
Lua:
local easy_dialog = require "easy_dialog"
local samp = require "samp.events"
local Dialog = easy_dialog.Dialog

local employees = {}
local captureList = false

local employeesDialog = Dialog.new()
    :setCaption(function(self)
        return "Сотрудники онлайн (" .. tostring(#(self.list or {})) .. ")"
    end)
    :setStyle("tablist_headers")
    :setHeaders({ "ID", "Имя", "Должность", "Статус" })
    :setButtons("Подробнее", "Закрыть")
    :setItemsPerPage(15)
    :setOnStart(function(self, data)
        self.list = (data and data.list) or {}
    end)
    :setItems(function(self)
        local items = {}
        for _, emp in ipairs(self.list or {}) do
            local nameDisplay = emp.voice and ("{3498db}[V] {FFFFFF}" .. emp.name) or ("{FFFFFF}" .. emp.name)
            local rankDisplay = string.format("{FFFF00}%s {CCCCCC}[%s]", emp.rank, emp.rankNum)
            local statusDisplay = emp.status
            if emp.afk then
                statusDisplay = statusDisplay .. " {e74c3c}(AFK: " .. emp.afk .. ")"
            end

            table.insert(items, {
                "{CCCCCC}" .. emp.id,
                nameDisplay,
                rankDisplay,
                statusDisplay
            })
        end
        return items
    end)
    :setOnResponse(function(self, button, index, _, item)
        if button == 1 and self.list[index] then
            easy_dialog.go("employee_info", { employee = self.list[index] })
        end
    end)

local employeeInfo = Dialog.new()
    :setStyle("msgbox")
    :setCaption("Карточка сотрудника")
    :setButtons("Назад", "")
    :setOnStart(function(self, data)
        self.employee = data and data.employee
        if not self.employee then
            self:setContent("Ошибка данных")
            return
        end
        local emp = self.employee
        local afkInfo = emp.afk and ("{e74c3c}" .. emp.afk) or "{CCCCCC}Нет"
        local voiceInfo = emp.voice and "{2ecc71}Присутствует" or "{e74c3c}Отсутствует"
        local text = string.format(
            "{FFFFFF}Имя: {3498db}%s\n" ..
            "{FFFFFF}ID: {CCCCCC}%s\n" ..
            "{FFFFFF}Ранг: {FFFF00}%s (%s)\n" ..
            "{FFFFFF}Дата трудоустройства: {CCCCCC}%s\n" ..
            "{FFFFFF}Voice чат: %s\n" ..
            "{FFFFFF}Статус: %s\n" ..
            "{FFFFFF}Время в AFK: %s",
            emp.name,
            emp.id,
            emp.rank, emp.rankNum,
            emp.datetime,
            voiceInfo,
            emp.status,
            afkInfo
        )
        self:setContent(text)
    end)
    :setOnResponse(function()
        easy_dialog.start("employees_dialog", { list = employees })
    end)

function samp.onServerMessage(color, text)
    if text:find("Члены организации Он%-лайн:") then
        employees = {}
        captureList = true
        return
    end
    if captureList and text:find("Всего:") then
        captureList = false
        if #employees > 0 then
            easy_dialog.start("employees_dialog", { list = employees })
        end
        return
    end
    if captureList then
        if text:match("^%s*$") then return end
        local id = text:match("ID:%s*(%d+)")
        if not id then return end
        local datetime = text:match("|%s*(%d+:%d+%s+%d+%.%d+%.%d+)") or ""
        local dt_pattern = datetime:gsub("[%.%-]", "%%%1")
        local nameSection = text:match(dt_pattern .. "%s*|%s*(.-):")
        if nameSection then
            local voice = false
            local name = nameSection
            if name:find("%(Voice%)") then
                voice = true
                name = name:gsub("%(Voice%)", "")
            end
            name = name:gsub("^%s+", ""):gsub("%s+$", "")
            local splitPos = text:find(":", text:find(nameSection, 1, true))
            if splitPos then
                local tail = text:sub(splitPos + 1)
                local rank, rankNum = tail:match("^%s*(.-)%[(%d+)%]")
                rank = rank and rank:gsub("^%s+", ""):gsub("%s+$", "") or ""
                local afkTime = nil
                if tail:find("%[AFK%]") then
                    afkTime = tail:match("%[AFK%]:%s*(.*)$")
                    if afkTime then
                        afkTime = afkTime:gsub("^%s+", ""):gsub("%s+$", "")
                    end
                end
                local statusRaw = tail:match("%-%s*(.*)")
                local status = "Неизвестно"
                if statusRaw then
                    if afkTime then
                        status = statusRaw:match("^(.-)%s*|")
                    else
                        status = statusRaw
                    end
                    status = status and status:gsub("^%s+", ""):gsub("%s+$", "") or ""
                end
                table.insert(employees, {
                    id = id,
                    datetime = datetime,
                    name = name,
                    voice = voice,
                    rank = rank,
                    rankNum = rankNum,
                    status = status,
                    afk = afkTime
                })
            end
        end
    end
end

function main()
    while not isSampAvailable() do wait(0) end
    easy_dialog.init()
    easy_dialog.register("employees_dialog", employeesDialog)
    easy_dialog.register("employee_info", employeeInfo)
    sampRegisterChatCommand("mb", function()
        sampSendChat("/members")
    end)
    wait(-1)
end

function onScriptTerminate(script, quitGame)
    if script == thisScript() then
        easy_dialog.stop()
    end
end
из требований https://www.blast.hk/threads/239154/
Посмотреть вложение 286894
Посмотреть вложение 286895
 

-legacy.

Новичок
28
11
[13:52:06.535534] (system) Loading script 'C:\Users\user\Desktop\ooo\moonloader\easy_dialog(example).lua'...
[13:52:06.535534] (debug) New script: 0CE6455C
[13:52:06.541532] (error) easy_dialog(example).lua: ...ers\user\Desktop\ooo\moonloader\easy_dialog(example).lua:1: module 'easy_dialog' not found:
no field package.preload['easy_dialog']
no file 'C:\Users\user\Desktop\ooo\moonloader\lib\easy_dialog.lua'
no file 'C:\Users\user\Desktop\ooo\moonloader\lib\easy_dialog\init.lua'
no file 'C:\Users\user\Desktop\ooo\moonloader\easy_dialog.lua'
no file 'C:\Users\user\Desktop\ooo\moonloader\easy_dialog\init.lua'
no file '.\easy_dialog.lua'
no file 'C:\Users\user\Desktop\ooo\moonloader\lib\easy_dialog.luac'
no file 'C:\Users\user\Desktop\ooo\moonloader\lib\easy_dialog\init.luac'
no file 'C:\Users\user\Desktop\ooo\moonloader\easy_dialog.luac'
no file 'C:\Users\user\Desktop\ooo\moonloader\easy_dialog\init.luac'
no file '.\easy_dialog.luac'
no file 'C:\Users\user\Desktop\ooo\moonloader\lib\easy_dialog.dll'
stack traceback:
[C]: in function 'require'
...ers\user\Desktop\ooo\moonloader\easy_dialog(example).lua:1: in main chunk
[13:52:06.541532] (error) easy_dialog(example).lua: Script died due to an error. (0CE6455C)
отсутствует либа easy_dialog