Сократить код

schtolz

Активный
Автор темы
111
66
Версия MoonLoader
.026-beta
Как сократить данный код?
Lua:
if string.find(text,"Член семьи: (.+) достиг 43 уровня%. В семью начислен опыт") then
        events = "Payday"
end
if string.find(text,"%[РЕКЛАМА%] %[(.+)%] {FFFFFF}(.+)%[(.+)%]") then
    local status,names,idus = text:match('%[РЕКЛАМА%] %[(.+)%] {FFFFFF}(.+)%[(.+)%]')
    if names == nickname then
        events = "Реклама /vr"
    end
end
if string.find(text,"На карте установлена метка на ближайшую базу дальнобойщиков для получения следующего груза") then
    events = "Доставлен груз дальнобой"
end
if string.find(text,"Игрок (.+) выполнил ежедневное фракционное задание и принёс фракции") then
    events = "Выполнил фракционное задание"
end
if string.find(text,"Ваша зарплата: (.+)") then
    events = "Зарплата со страховой"
end
if string.find(text,"Вы успешно сдали предмет (.+) в аренду на (.+) за (.+)") then
    local item,hour,same = text:match("Вы успешно сдали предмет (.+) в аренду на (.+) за (.+)")
    if item ~= nil then events = "Сдача в аренду "..item else events = "Сдача в аренду аксессуара" end
end
if string.find(text," Транспортное средство заправляется %(%( (.+) %)%)") then
    local names = text:match(" Транспортное средство заправляется %(%( (.+) %)%)")
    if names == nickname then
        events = "Заправка транспортного средства"
    end
end
В коде реализован поиск нужной строки в чате и присвоение ей название events. Иногда нужно вытягивать значения из строки.
Работает это в sampev.OnServerMessage и text берется из нее
 

why ega

РП игрок
Модератор
2,521
2,184
Как сократить данный код?
Lua:
if string.find(text,"Член семьи: (.+) достиг 43 уровня%. В семью начислен опыт") then
        events = "Payday"
end
if string.find(text,"%[РЕКЛАМА%] %[(.+)%] {FFFFFF}(.+)%[(.+)%]") then
    local status,names,idus = text:match('%[РЕКЛАМА%] %[(.+)%] {FFFFFF}(.+)%[(.+)%]')
    if names == nickname then
        events = "Реклама /vr"
    end
end
if string.find(text,"На карте установлена метка на ближайшую базу дальнобойщиков для получения следующего груза") then
    events = "Доставлен груз дальнобой"
end
if string.find(text,"Игрок (.+) выполнил ежедневное фракционное задание и принёс фракции") then
    events = "Выполнил фракционное задание"
end
if string.find(text,"Ваша зарплата: (.+)") then
    events = "Зарплата со страховой"
end
if string.find(text,"Вы успешно сдали предмет (.+) в аренду на (.+) за (.+)") then
    local item,hour,same = text:match("Вы успешно сдали предмет (.+) в аренду на (.+) за (.+)")
    if item ~= nil then events = "Сдача в аренду "..item else events = "Сдача в аренду аксессуара" end
end
if string.find(text," Транспортное средство заправляется %(%( (.+) %)%)") then
    local names = text:match(" Транспортное средство заправляется %(%( (.+) %)%)")
    if names == nickname then
        events = "Заправка транспортного средства"
    end
end
В коде реализован поиск нужной строки в чате и присвоение ей название events. Иногда нужно вытягивать значения из строки.
Работает это в sampev.OnServerMessage и text берется из нее
Создаешь таблицу с паттернами и перебираешь ее в условии с проверкой (ща не могу готовый код дать)
 
  • Нравится
Реакции: qdIbp

wojciech?

Известный
197
114
я бы сделал конструкции if-elseif, чтобы при ивенте обрабатывать не абсолютно все условия, а лишь до достижения нужного. например, если выполнилось первое условие, то зачем нам проверять все остальные?

а с таблицей достаточно странная затея. действия при выполнении условий не везде одинаковые и следовательно нужно будет прописывать обработчик для каждого из них, т.е. просто перенести участки кода в другое место и использовать его практически также
 
  • Нравится
Реакции: moreveal

moreveal

Известный
Проверенный
846
519
Lua:
local patterns = {
    {condition = "Член семьи: (.+) достиг 43 уровня%. В семью начислен опыт", event = "Payday"},
    {condition = function(text)
        local status, names, idus = text:match('%[РЕКЛАМА%] %[(.+)%] {FFFFFF}(.+)%[(.+)%]')
        return (status and names and idus) and names == nickname, "Реклама /vr"
    end},
    {condition = "На карте установлена метка на ближайшую базу дальнобойщиков для получения следующего груза", event = "Доставлен груз дальнобой"},
    {condition = "Игрок (.+) выполнил ежедневное фракционное задание и принёс фракции", event = "Выполнил фракционное задание"},
    {condition = "Ваша зарплата: (.+)", event = "Зарплата со страховой"},
    {condition = function(text)
        local item, hour, same = text:match("Вы успешно сдали предмет (.+) в аренду на (.+) за (.+)")
        return hour ~= nil, (item and ("Сдача в аренду " .. item) or "Сдача в аренду аксессуара")
    end}, -- тут вообще странно, сомневаюсь, что у тебя правильно определялась сдача аксессуара
    {condition = function(text)
        local names = text:match("Транспортное средство заправляется %(%( (.+) %)%)")
        return names ~= nil, "Заправка транспортного средства"
    end}
}

function test(text)
    -- этот цикл пихнешь в onservermessage
    for _,v in ipairs(patterns) do
        local condition_type = type(v.condition)
        if condition_type == "function" then
            local result, event = v.condition(text)
            if result then
                events = event
                break
            end
        elseif condition_type == "string" then
            if text:find(v.condition) then
                events = v.event
                break
            end
        end
    end
  

    return events
end

print(test("Ваша зарплата: $5.000")) -- "Зарплата со страховой"

Вот примерно то, что тебе предлагали с таблицей, но как уже замечено - довольно странноватый подход, и как по мне код вообще нисколько не уменьшился, ахахха
Это может быть полезно, если нет вот таких вложенных условий, а только проверка по тексту
 
  • Вау
  • Нравится
Реакции: MLycoris, qdIbp и why ega