Как исправить баг парсинга со скриптом chatid

demonvir

Новичок
Автор темы
18
3
Версия MoonLoader
.026-beta
Писал свой скрипт для более удобного отображения /members и столкнулся с проблемой парсинга. При запуске скрипт мог не работать — чтобы он заработал, приходилось перезапускать его какое-то количество раз. Если же он запускался успешно, то продолжал работать до следующей перезагрузки игры.
Я нашёл, с чем была связана эта проблема. На сборке был установлен скрипт ChatID. Удалил его мой скрипт начал работать в 100% случаев.
Пытался сделать игнорирование ID рядом с ником, но либо я что-то делаю не так, либо это нужно реализовывать каким-то другим способом.
Lua:
function samp.onServerMessage(color, text)
    if text:find("Члены организации Он%-лайн:") then
        employees = {}
        selectedEmployee = nil
        captureList = true
        showEmployees[0] = true
    end

    -- конец списка
    if captureList and text:find("Всего:") then
        captureList = false
        initAfkTimes()
        return false
    end

    -- строки сотрудников
    if captureList then
        if text:match("^%s*$") then
            return false
        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 not nameSection then
            return false
        end

        -- Копия для обработки
        local voice = false
        local name = nameSection

        -- Убираем Chat ID: Nick[123] -> Nick
        name = name:gsub("%[%d+%]", "")

        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 not splitPos then
            return false
        end

        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

        local emp = {
            id = id,
            datetime = datetime,
            name = name,
            voice = voice,
            rank = rank,
            rankNum = rankNum,
            status = status,
            afk = afkTime
        }

        if afkTime then
            emp.afkTimeSec = tonumber(afkTime:match("^(%d+)")) or 0
            if emp.afkTimeSec > 360 then
                emp.afk = "360+ сек"
            else
                emp.afk = tostring(emp.afkTimeSec) .. " сек"
            end
        end

        table.insert(employees, emp)
        return false
    end
end
 

demonvir

Новичок
Автор темы
18
3
И где ошибка? Где входные данные?
ошибок как бы не происходит Просто иногда либо скрипт идеально работает либо нет и он отправляет команду в чат но не захватывает строки как я понял это всё из-за chatid потому что без него он работает
1785573598373.png

снизу без чат айди
1785573672512.png
как оно работает с чат айди я написал уже в своём первом сообщении
 
  • Bug
Реакции: Tema05

demonvir

Новичок
Автор темы
18
3
Тебе надо в chatID заменить
Lua:
        if toChange then
            sampAddChatMessage(text, bit.rshift(color, 8))
            return false
        end
На
Lua:
        if toChange then
            return {color, text}
        end
Безмерно благодарю за ответ потому, что на решение этой проблемы очень много моих нервных клеток ушло. Как я понял при изменении этих кусков кода визуально ничего не меняется но мой скрипт у меня заработал
 
  • Нравится
Реакции: mafizik