Регулярные выражения

calculatorxss

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

Вот код
Lua:
function samp.onServerMessage(text)
    if active_forma then
        if text:find('%[.*%] (%w+_?%w+): [Forma] +') then
            printStyledString("Form skipped", 1000, 4)
            active_forma = false
            stop_forma = true
        end
    end
    for k,v in ipairs(allForms) do
        if text:match("%[.*%] "..getMyNick()..": /"..v.."%s") then
            return true
        else
            if text:match("%[.*%] (%w+_?%w+): /"..v.."%s") then
                admin_nick, admin_other = text:match("%[.*%] (%w+_?%w+): /"..v.."%s(.*)")
                sampAddChatMessage('{FF0000}[Info] {FF8C00}Пришла форма, чтобы принять ее нажмите >> K << | Чтобы отклонить >> P <<', 0xFFFF0000)
                active_forma = true
                cmd = v
                forma()
            end
        end
    end
end

function forma()
    if active_forma then
        lua_thread.create(function()
            lasttime = os.time()
            lasttimes = 0
            time_out = 10
            while lasttimes < time_out do
                lasttimes = os.time() - lasttime
                wait(0)
                printStyledString("ADMIN FORM " .. time_out - lasttimes .. " WAIT", 1000, 4)
                if lasttimes == time_out then
                    active_forma = false
                    printStyledString("Forma skipped", 1000, 4)
                end
                if isKeyJustPressed(VK_K) and not sampIsChatInputActive() and not sampIsDialogActive() then
                    printStyledString("Admin form accepted", 1000, 4)
                    sampSendChat("/"..cmd.." "..admin_other.." || "..admin_nick)
                    wait(1000)
                    sampSendChat('/a [Forma] +')
                    lasttimes = 11
                    active_forma = false
                elseif isKeyJustPressed(VK_P) and not sampIsChatInputActive() and not sampIsDialogActive() then
                    printStyledString('You missed the form', 1000, 4)
                    lasttimes = 11
                    active_forma = false
                end
                if stop_forma then
                    lasttimes = 11
                    active_forma = false
                    break
                end
            end
        end)
    else   
        if isKeyJustPressed(VK_P) and not sampIsChatInputActive() and not sampIsDialogActive() then
            printStyledString('You can’t skip the form temporarily', 1000, 4)
        end
    end
end

function getMyNick()
    local result, id = sampGetPlayerIdByCharHandle(playerPed)
    if result then
        local nick = sampGetPlayerNickname(id)
        return nick
    end
end

function getMyId()
    local result, id = sampGetPlayerIdByCharHandle(playerPed)
    if result then
        return id
    end
end

Строка из чатлога - [12:22:57] {00aaff}[A]{ffffff} Artemich_Calculator: /test
 
  • Злость
Реакции: qdIbp
Решение
Пробуй

Lua:
require('lib.moonloader')
local samp = require('lib.samp.events')

local active_forma = false

local allForms = {
    "kick", "mute", "jail",  "ban", "warn",
    "sban", "skick", "banip", 
    
    "banoff", "muteoff", "jailoff", "sbanoff", "offban", "offwarn",
    "unmute", "unjail", "unwarn", "unban",
    
    "spplayer", "skick", "o", "ao", "setskin", "avig", "aunvig",
    "slap", "sethp", "spcar", "plveh", "setskin",

    "ptp",  "aad", "givegun", "setadmin", "givedonate", "spawncars",
    "mpwin", "prefix", "asellhouse", "delacc", "asellbiz", "money", "test", 'iban'
}   

function samp.onServerMessage(color, text)
    if active_forma then
        if string.match(text, '%[A%] (%S+): %[Forma%] +') then...

qdIbp

Автор темы
Проверенный
1,434
1,174
Строка из чатлога - [12:22:57] {00aaff}[A]{ffffff} Artemich_Calculator: /test
Lua:
local nick, message = string.match(msg, '%{%x+%}%[A%]%{%x+%} (%S+): (.+)')

В основном твоя ошибка в количестве параметров в samp.onServerMessage, первым параметром идет цвет, а только вторым текст

Попробуй так
Lua:
function samp.onServerMessage(color, text)
    if active_forma then
        if string.match(text, '%[A%] (%S+): [Forma] +') then
            printStyledString("Form skipped", 1000, 4)
            active_forma = false
            stop_forma = true
        end
    end
    for k,v in ipairs(allForms) do
        if string.match(text, "%[A%] "..getMyNick()..": /"..v.."%s") then
            return true
        else
            if string.match(text, "%[A%] (%S+): /"..v.."%s") then
                admin_nick, admin_other = text:match("%[.*%] (%S+): /"..v.."%s(.*)")
                sampAddChatMessage('{FF0000}[Info] {FF8C00}Пришла форма, чтобы принять ее нажмите >> K << | Чтобы отклонить >> P <<', 0xFFFF0000)
                active_forma = true
                cmd = v
                forma()
            end
        end
    end
end

function forma()
    if active_forma then
        lua_thread.create(function()
            lasttime = os.time()
            lasttimes, time_out = 0, 10
            while lasttimes < time_out do
                lasttimes = os.time() - lasttime
                wait(0)
                printStyledString("ADMIN FORM " .. time_out - lasttimes .. " WAIT", 1000, 4)
                if lasttimes == time_out then
                    active_forma = false
                    printStyledString("Forma skipped", 1000, 4)
                end
                if isKeyJustPressed(VK_K) and not sampIsChatInputActive() and not sampIsDialogActive() then
                    printStyledString("Admin form accepted", 1000, 4)
                    sampSendChat("/"..cmd.." "..admin_other.." || "..admin_nick)
                    wait(1000)
                    sampSendChat('/a [Forma] +')
                    lasttimes = 11
                    active_forma = false
                elseif isKeyJustPressed(VK_P) and not sampIsChatInputActive() and not sampIsDialogActive() then
                    printStyledString('You missed the form', 1000, 4)
                    lasttimes = 11
                    active_forma = false
                end
                if stop_forma then
                    lasttimes = 11
                    active_forma = false
                    break
                end
            end
        end)
    else  
        if isKeyJustPressed(VK_P) and not sampIsChatInputActive() and not sampIsDialogActive() then
            printStyledString('You can’t skip the form temporarily', 1000, 4)
        end
    end
end

function getMyNick()
    return sampGetPlayerNickname(select(2, sampGetPlayerIdByCharHandle(1)))
end

function getMyId()
    return select(2, sampGetPlayerIdByCharHandle(1))
end
 
Последнее редактирование:

calculatorxss

Новичок
Автор темы
20
2
Lua:
local nick, message = string.match(msg, '%{%x+%}%[A%]%{%x+%} (%S+): (.+)')

В основном твоя ошибка в количестве параметров в samp.onServerMessage, первым параметром идет цвет, а только вторым текст

Попробуй так
Lua:
function samp.onServerMessage(color, text)
    if active_forma then
        if string.match(text, '%[A%] (%S+): [Forma] +') then
            printStyledString("Form skipped", 1000, 4)
            active_forma = false
            stop_forma = true
        end
    end
    for k,v in ipairs(allForms) do
        if string.match(text, "%[A%] "..getMyNick()..": /"..v.."%s") then
            return true
        else
            if string.match(text, "%[A%] (%S+): /"..v.."%s") then
                admin_nick, admin_other = text:match("%[.*%] (%w+_?%w+): /"..v.."%s(.*)")
                sampAddChatMessage('{FF0000}[Info] {FF8C00}Пришла форма, чтобы принять ее нажмите >> K << | Чтобы отклонить >> P <<', 0xFFFF0000)
                active_forma = true
                cmd = v
                forma()
            end
        end
    end
end

function forma()
    if active_forma then
        lua_thread.create(function()
            lasttime = os.time()
            lasttimes, time_out = 0, 10
            while lasttimes < time_out do
                lasttimes = os.time() - lasttime
                wait(0)
                printStyledString("ADMIN FORM " .. time_out - lasttimes .. " WAIT", 1000, 4)
                if lasttimes == time_out then
                    active_forma = false
                    printStyledString("Forma skipped", 1000, 4)
                end
                if isKeyJustPressed(VK_K) and not sampIsChatInputActive() and not sampIsDialogActive() then
                    printStyledString("Admin form accepted", 1000, 4)
                    sampSendChat("/"..cmd.." "..admin_other.." || "..admin_nick)
                    wait(1000)
                    sampSendChat('/a [Forma] +')
                    lasttimes = 11
                    active_forma = false
                elseif isKeyJustPressed(VK_P) and not sampIsChatInputActive() and not sampIsDialogActive() then
                    printStyledString('You missed the form', 1000, 4)
                    lasttimes = 11
                    active_forma = false
                end
                if stop_forma then
                    lasttimes = 11
                    active_forma = false
                    break
                end
            end
        end)
    else  
        if isKeyJustPressed(VK_P) and not sampIsChatInputActive() and not sampIsDialogActive() then
            printStyledString('You can’t skip the form temporarily', 1000, 4)
        end
    end
end

function getMyNick()
    return sampGetPlayerNickname(select(2, sampGetPlayerIdByCharHandle(1)))
end

function getMyId()
    return select(2, sampGetPlayerIdByCharHandle(1))
end
не работает
 
  • Эм
Реакции: qdIbp

calculatorxss

Новичок
Автор темы
20
2
Lua:
require 'lib.moonloader'
local samp = require 'lib.samp.events'

local active_forma = false
local stop_forma = false

local allForms = {"kick", "mute", "jail", "jailoff", "sethp", "sban", "banoff", "muteoff", "sbanoff", "spplayer", "slap", "unmute", "unjail", "sban", "spcar", "ban", "sban", "warn", "skick", "setskin", "ao", "unban", "unwarn", "setskin", "skick", "banip", "offban", "offwarn", "plveh", "sban", "ptp", "o", "aad", "givegun", "avig", "aunvig", "setadmin", "givedonate", "spawncars",
"mpwin", "prefix", "asellhouse", "delacc", "asellbiz", "money", "test", 'iban'}   

function main()
    while not isSampLoaded() do wait(100) end
    while true do
        wait(0)
    end
end

 function samp.onServerMessage(color, text)
        if active_forma then
            if string.match(text, '%[A%] (%S+): [Forma] +') then
                printStyledString("Form skipped", 1000, 4)
                active_forma = false
                stop_forma = true
            end
        end
        for k,v in ipairs(allForms) do
            if string.match(text, "%[A%] "..getMyNick()..": /"..v.."%s") then
                return true
            else
                if string.match(text, "%[A%] (%S+): /"..v.."%s") then
                    admin_nick, admin_other = text:match("%[A%] (%S+): /"..v.."%s(.*)")
                    sampAddChatMessage('{FF0000}[Info] {FF8C00}Пришла форма, чтобы принять ее нажмите >> K << | Чтобы отклонить >> P <<', 0xFFFF0000)
                    active_forma = true
                    cmd = v
                    forma()
                end
            end
        end
    end
    
    function forma()
        if active_forma then
            lua_thread.create(function()
                lasttime = os.time()
                lasttimes, time_out = 0, 10
                while lasttimes < time_out do
                    lasttimes = os.time() - lasttime
                    wait(0)
                    printStyledString("ADMIN FORM " .. time_out - lasttimes .. " WAIT", 1000, 4)
                    if lasttimes == time_out then
                        active_forma = false
                        printStyledString("Forma skipped", 1000, 4)
                    end
                    if isKeyJustPressed(VK_K) and not sampIsChatInputActive() and not sampIsDialogActive() then
                        printStyledString("Admin form accepted", 1000, 4)
                        sampSendChat("/"..cmd.." "..admin_other.." || "..admin_nick)
                        wait(1000)
                        sampSendChat('/a [Forma] +')
                        lasttimes = 11
                        active_forma = false
                    elseif isKeyJustPressed(VK_P) and not sampIsChatInputActive() and not sampIsDialogActive() then
                        printStyledString('You missed the form', 1000, 4)
                        lasttimes = 11
                        active_forma = false
                    end
                    if stop_forma then
                        lasttimes = 11
                        active_forma = false
                        break
                    end
                end
            end)
        else 
            if isKeyJustPressed(VK_P) and not sampIsChatInputActive() and not sampIsDialogActive() then
                printStyledString('You can’t skip the form temporarily', 1000, 4)
            end
        end
    end
function getMyNick()
    local result, id = sampGetPlayerIdByCharHandle(playerPed)
    if result then
        local nick = sampGetPlayerNickname(id)
        return nick
    end
end

function getMyId()
    local result, id = sampGetPlayerIdByCharHandle(playerPed)
    if result then
        return id
    end
end
 

kyrtion

Известный
888
316
Прочти все о regexp в Lua:

Символы ^$()%.[]*+-? без экранировки % то считается как шаблон

UPD: рекомендуется убрать цветные hex:
text = text:gsub('{%x%x%x%x%x%x}', '') только для парса
 
Последнее редактирование:
  • Нравится
Реакции: qdIbp

qdIbp

Автор темы
Проверенный
1,434
1,174
Пробуй

Lua:
require('lib.moonloader')
local samp = require('lib.samp.events')

local active_forma = false

local allForms = {
    "kick", "mute", "jail",  "ban", "warn",
    "sban", "skick", "banip", 
    
    "banoff", "muteoff", "jailoff", "sbanoff", "offban", "offwarn",
    "unmute", "unjail", "unwarn", "unban",
    
    "spplayer", "skick", "o", "ao", "setskin", "avig", "aunvig",
    "slap", "sethp", "spcar", "plveh", "setskin",

    "ptp",  "aad", "givegun", "setadmin", "givedonate", "spawncars",
    "mpwin", "prefix", "asellhouse", "delacc", "asellbiz", "money", "test", 'iban'
}   

function samp.onServerMessage(color, text)
    if active_forma then
        if string.match(text, '%[A%] (%S+): %[Forma%] +') then
            printStyledString("Form skipped", 1000, 4)
            active_forma = false
        end
    end
    for k, v in ipairs(allForms) do
        admin_nick, admin_other = string.match(text, "%[A%] (%S+): /"..v.." (.*)")
        if (admin_nick ~= nil) then
            if (admin_nick == getMyNick()) then
                return true
            else
                sampAddChatMessage('[Info] {FF8C00}Пришла форма, чтобы принять ее нажмите >> K << | Чтобы отклонить >> P <<', 0xFF0000)
                lasttime = os.time() + 10
                active_forma = true
                cmd = v
            end
        end
    end
end

function main()

    while true do
        wait(0)
        if active_forma then
            if (os.time() <= lasttime) then
                printStyledString("ADMIN FORM " .. lasttime - os.time() .. " WAIT", 1000, 4)
                
                if (not sampIsCursorActive()) then
                    if isKeyJustPressed(VK_K) then
                        printStyledString("Admin form accepted", 1000, 4)
                        sampSendChat( ('/%s %s || %s'):format(cmd, admin_other, admin_nick) )
                        wait(1000)
                        sampSendChat('/a [Forma] +')
                        active_forma = false
                    elseif isKeyJustPressed(VK_P) then
                        printStyledString('You missed the form', 1000, 4)
                        active_forma = false
                    end
                end
            end
            if (lasttime < os.time()) then
                active_forma = false
                printStyledString("Forma skipped", 1000, 4)
            end
        else
            if (isKeyJustPressed(VK_P) and not sampIsCursorActive()) then
                printStyledString('You can’t skip the form temporarily', 1000, 4)
            end
        end

    end
end
        
function getMyNick()
    return sampGetPlayerNickname(select(2, sampGetPlayerIdByCharHandle(1)))
end
        
function getMyId()
    return select(2, sampGetPlayerIdByCharHandle(1))
end
 

calculatorxss

Новичок
Автор темы
20
2
Пробуй

Lua:
require('lib.moonloader')
local samp = require('lib.samp.events')

local active_forma = false

local allForms = {
    "kick", "mute", "jail",  "ban", "warn",
    "sban", "skick", "banip",
   
    "banoff", "muteoff", "jailoff", "sbanoff", "offban", "offwarn",
    "unmute", "unjail", "unwarn", "unban",
   
    "spplayer", "skick", "o", "ao", "setskin", "avig", "aunvig",
    "slap", "sethp", "spcar", "plveh", "setskin",

    "ptp",  "aad", "givegun", "setadmin", "givedonate", "spawncars",
    "mpwin", "prefix", "asellhouse", "delacc", "asellbiz", "money", "test", 'iban'
}  

function samp.onServerMessage(color, text)
    if active_forma then
        if string.match(text, '%[A%] (%S+): %[Forma%] +') then
            printStyledString("Form skipped", 1000, 4)
            active_forma = false
        end
    end
    for k, v in ipairs(allForms) do
        admin_nick, admin_other = string.match(text, "%[A%] (%S+): /"..v.." (.*)")
        if (admin_nick ~= nil) then
            if (admin_nick == getMyNick()) then
                return true
            else
                sampAddChatMessage('[Info] {FF8C00}Пришла форма, чтобы принять ее нажмите >> K << | Чтобы отклонить >> P <<', 0xFF0000)
                lasttime = os.time() + 10
                active_forma = true
                cmd = v
            end
        end
    end
end

function main()

    while true do
        wait(0)
        if active_forma then
            if (os.time() <= lasttime) then
                printStyledString("ADMIN FORM " .. lasttime - os.time() .. " WAIT", 1000, 4)
               
                if (not sampIsCursorActive()) then
                    if isKeyJustPressed(VK_K) then
                        printStyledString("Admin form accepted", 1000, 4)
                        sampSendChat( ('/%s %s || %s'):format(cmd, admin_other, admin_nick) )
                        wait(1000)
                        sampSendChat('/a [Forma] +')
                        active_forma = false
                    elseif isKeyJustPressed(VK_P) then
                        printStyledString('You missed the form', 1000, 4)
                        active_forma = false
                    end
                end
            end
            if (lasttime < os.time()) then
                active_forma = false
                printStyledString("Forma skipped", 1000, 4)
            end
        else
            if (isKeyJustPressed(VK_P) and not sampIsCursorActive()) then
                printStyledString('You can’t skip the form temporarily', 1000, 4)
            end
        end

    end
end
       
function getMyNick()
    return sampGetPlayerNickname(select(2, sampGetPlayerIdByCharHandle(1)))
end
       
function getMyId()
    return select(2, sampGetPlayerIdByCharHandle(1))
end

Вот, всё так же
 

kyrtion

Известный
888
316

Вот, всё так же
Попробуй заложить все процессы в каждом print, и увидишь чего не хватает и почему не выполнился

А нет, код что сверху скинули, там требуется пробел. Найди другое команда с аргументом в адм чат
 
  • Нравится
Реакции: qdIbp и calculatorxss