Что я делаю не так?

bereg101

Участник
Автор темы
55
0
Пишу бота который ищет совпадения в сообщении по нескольким критериям (заранее определенным словам).
Этот скрипт одно слово определяет нормально, больше одного слова определяет очень криво. Кто может подсказать что не так?
Нужно чтоб алгоритм оповещал при нахождении в сообщении всех заранее указанных слов


Lua:
local warning_messages = {
    -- #1
    {
        ["text"]={"111","a"}
    },
    -- #2
    {
        ["text"]={"222", "b"}
    },
    -- #3
    {
        ["text"]={"333", "c"}
    }
}


function event.onServerMessage(color, text)
    for w_m_i = 1, #warning_messages do -- цикл перебора массива warning_messages
        local result = true

        for t_i = 1, #warning_messages[w_m_i]["text"] do -- цикл перебора массива фраз
            if text:find(warning_messages[w_m_i]["text"][t_i]) == nil then
                result = false -- если result = false значит минимум одно слово в сообщении не найдено
                break
            end
        end

        -- если в сообщении найдены оба слова то срабатывает условие
        if result == true then
            sampAddChatMessage("нашел", -1)
            break
        end
    end

end
 

chapo

чопа сребдс // @moujeek
Модератор
8,934
11,700
Lua:
local sampev = require 'lib.samp.events'
local list = {
    {text = {'111'}},
    {text = {'222'}},
    {text = {'333'}}
}

function check(text)
    for k, v in ipairs(list) do
        for _, word in ipairs(v.text) do
            if text:find(word) then
                return true, word
            end
        end
    end
    return false, '_'
end

function sampev.onServerMessage(color, text)
    local result, word = check(text)
    if result then
        sampAddChatMessage('В тексте найдено слово "'..word..'"', -1)
    end
end
 

bereg101

Участник
Автор темы
55
0
Lua:
local sampev = require 'lib.samp.events'
local list = {
    {text = {'111'}},
    {text = {'222'}},
    {text = {'333'}}
}

function check(text)
    for k, v in ipairs(list) do
        for _, word in ipairs(v.text) do
            if text:find(word) then
                return true, word
            end
        end
    end
    return false, '_'
end

function sampev.onServerMessage(color, text)
    local result, word = check(text)
    if result then
        sampAddChatMessage('В тексте найдено слово "'..word..'"', -1)
    end
end
Твой код как и мой прекрасно ищет одно совпадение, а я пытаюсь написать алгоритм который будет искать все совпадения с элементами массива под ключом text
Lua:
local warning_messages = {
    -- #1
    {
        text={"111","a"}
    },
    -- #2
    {
        text={"222", "b", "777"}
    },
    -- #3
    {
        text={"333", "c", "000"}
    }
}

Допустим есть строка "77777777777 bbb 2222222222" в ней можно найти все элементы из 2го элемента массива warning_messages, а именно в троке есть "222", "b" и "777" - о такой строке скрипт должен оповещать
а строка по типу "77777777777 bbb" не подходит, т.к в ней всего 2 совпадения, а нужно чтоб совпадали все элементы одного из массива с ключом text
 

chapo

чопа сребдс // @moujeek
Модератор
8,934
11,700
Твой код как и мой прекрасно ищет одно совпадение, а я пытаюсь написать алгоритм который будет искать все совпадения с элементами массива под ключом text
Lua:
local warning_messages = {
    -- #1
    {
        text={"111","a"}
    },
    -- #2
    {
        text={"222", "b", "777"}
    },
    -- #3
    {
        text={"333", "c", "000"}
    }
}

Допустим есть строка "77777777777 bbb 2222222222" в ней можно найти все элементы из 2го элемента массива warning_messages, а именно в троке есть "222", "b" и "777" - о такой строке скрипт должен оповещать
а строка по типу "77777777777 bbb" не подходит, т.к в ней всего 2 совпадения, а нужно чтоб совпадали все элементы одного из массива с ключом text
ты имеешь ввиду это?
Lua:
local list = {
    {text = {'111'}},
    {text = {'222'}},
    {text = {'333'}}
}

function check(text)
    local count = 0
    local founded_words = {}
    for k, v in ipairs(list) do
        for _, word in ipairs(v.text) do
            if text:find(word) then
                count = count + 1
                table.insert(founded_words, word)
            end
        end
    end
    return count ~= 0, count, founded_words
end

function sampev.onServerMessage(color, text)
    local result, match_count, founded_words = check(text)
   if result and match_count >= 3 then
        print('В тексте найдены следующие слова ('..match_count..')')
        for k, v in ipairs(founded_words) do
           print(k, v)
        end
    end
end
1649343093818.png