- 18
- 3
- Версия MoonLoader
- .026-beta
Писал свой скрипт для более удобного отображения /members и столкнулся с проблемой парсинга. При запуске скрипт мог не работать — чтобы он заработал, приходилось перезапускать его какое-то количество раз. Если же он запускался успешно, то продолжал работать до следующей перезагрузки игры.
Я нашёл, с чем была связана эта проблема. На сборке был установлен скрипт ChatID. Удалил его мой скрипт начал работать в 100% случаев.
Пытался сделать игнорирование ID рядом с ником, но либо я что-то делаю не так, либо это нужно реализовывать каким-то другим способом.
Я нашёл, с чем была связана эта проблема. На сборке был установлен скрипт 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