Простейшее авто-обьявления

w99zzl1

Участник
Автор темы
108
10
Версия MoonLoader
.026-beta
Друзья, помогите пожалуйста написать скрипт авто подачи обьявления. Я нашел только какой то навороченный с кучей ненужных для меня функций, я бы хотел написать уже свой, с таким алгоритмом:

При вводе команды /text [ad text]
Скрипт отправляет в чат /ad [ad text]
При появлении [ad text] в чате, возобновлял процесс (/ad [ad text]

Сообщение в чате такое:
(в начале могут быть разные теги - LV, MM, SF, LS и разные разделители - | , кто то точку (ту самую большую по центру) ставит)
SF | Тут текст обьявлния | (- этот разделитель не меняется, он системный) Отправил мой ник (мой номер)

Т.е.:
MM | Приходите заниматься програмированием! | Отправил Arseniy_Samsonov (тел: 000)
попытавшись переделать уже имеющийся скрипт в просторах интернета, у меня получилось как то так. Но это не работает (не отправляет повторно)


Lua:
local inicfg = require('inicfg')
local directIni = "AutoAD"
local ini = inicfg.load({
    cfg = {
        text = "",
    }
}, directIni)
local config = ini.cfg
local active = false
function main()
    while not isSampAvailable() do wait(0) end
    inicfg.save(ini, directIni)
    sampRegisterChatCommand("a_text", function(arg)
        if arg and arg ~= "" then
            config.text = arg:match("(.+)")
            inicfg.save(ini, directIni)
            sampAddChatMessage("{00ddff}[AutoAD] {ffffff}Текст установлен: {00ddff}" .. config.text, -1)
            active = true
            sendAd()
        else
            sampAddChatMessage("{00ddff}[AutoAD] {ffffff}Введите текст после команды: {00ddff}/a_text [текст]", -1)
        end
    end)
    while true do
        wait(0)
    end
end
function onServerMessage(color, text)
    if active and config.text ~= "" then
        local nick = sampGetPlayerNickname(select(2, sampGetPlayerIdByCharHandle(playerPed)))
        local playerId = select(2, sampGetPlayerIdByCharHandle(playerPed))
        text = text:gsub("{......}", "")
        local pattern = "%u%u? | (.+) | Отправил " .. nick .. " %(тел: %d+%)"
        local matchedText = text:match(pattern)
        if matchedText and matchedText == config.text then
            lua_thread.create(function()
                sampAddChatMessage("{00ddff}[AutoAD] {ffffff}Объявление опубликовано. Отправка повторного объявления...", -1)
                wait(3000)
                sendAd()
            end)
        end
    end
end
function sendAd()
    if config.text ~= "" then
        sampSendChat("/ad " .. config.text)
        sampAddChatMessage("{00ddff}[AutoAD] {ffffff}Объявление отправлено: {00ddff}" .. config.text, -1)
    else
        sampAddChatMessage("{00ddff}[AutoAD] {ffffff}Текст объявления не задан. Используйте {00ddff}/a_text [текст]", -1)
        active = false
    end
end
 

papercut

Известный
125
24
я чет не понимаю почему люди настолько обленились
чатгпт накидал за 10 сек такой скрипт, там осталось только поменять функции на реальные, которые гуглятся за минуту все. Тем более есть уже сто процентов рабочий готовый скрипт, который можно взять за основу.
Ну где совесть-то, е-мое.
Если настолько лень то попробуй заглянуть в эту тему
Да и что лишнего в этом скрипте?? Сохранение в конфиг? Или вот это:
local pattern = "%u%u? | (.+) | Отправил " .. nick .. " %(тел: %d+%)"
надо подправить под сообщение твоего сервера? Ну вообще бред


Если нужна помощь, и вопрос звучит "подскажите, что в этом скрипте надо изменить, чтобы он работал *так-то*", то вот пару советов:
1) Поменяй команду на ту, которая тебе нужна (сейчас /a_text)
2) В функции команды убери работу с конфигом и просто сохраняй строку-аргумент в переменную
3) в sendAd() используй эту переменную
4) В обработчике сообщения от сервера поменяй шаблон на тот, что ты описал (гуглится за 10 минут, тестируется через какой-нибудь lua online)
Очевидно возникнет вопрос как деактивировать скрипт - в тз этого нету, и в коде тоже. Так же возникнет вопрос как проверять свой номер телефона - тоже задача которая зависит исключительно от сервера. Придется либо хардкодить, либо при первой активации сначала запрашивать номер у сервера отдельной командой (типа /mynum - хз что за сервер и как там можно посмотреть номер)
Советов можно еще написать, возвращайся, когда возникнуть насущные вопросы, которые не сможет решить чатгпт за 5 секунд
 
  • Нравится
Реакции: влад динозавр

w99zzl1

Участник
Автор темы
108
10
я чет не понимаю почему люди настолько обленились
чатгпт накидал за 10 сек такой скрипт, там осталось только поменять функции на реальные, которые гуглятся за минуту все.
Да, а потом всякие, наоборот возмущаются, что код написан чатгпт
Тем более есть уже сто процентов рабочий готовый скрипт, который можно взять за основу.
Нет. Только один, который я и упомянул, но у меня не получается переделать его
Да и что лишнего в этом скрипте?
Не в этом, а в этом (который взят под основу)
За остальное спасибо. Ладно уже, не буду разводить тут дисскусию, ты просто не совсем правильно меня понял
 

papercut

Известный
125
24
Понимаешь, ни мне, ни кому-бы то ни было не сложно написать такой скрипт. Я же просто хочу, чтобы люди задавали вопросы, чтобы решить проблемы, с которыми они столкнулись. Начал писать, скрипт свалился в ошибку. Посмотрел, попытался починить, погуглил, и только потом идешь спрашивать у других. Помочь не сложно, но прямо на этом же форуме есть люди, которые за подобное берут либо деньги либо еще что-то.
Задавай вопросы - все будут рады на них ответить. А "напишите за меня" лично я не очень уважаю
 

w99zzl1

Участник
Автор темы
108
10
Lua:
function samp.onServerMessage(color, text)
    if text:match('^[A-Za-z]+%s?Текст[%p%s]*Отправил .+ %(тел%. (%d%d%d?%d?%d?)%)$') then
        sampAddChatMessage('найдено')
    end
end


Lua:
function samp.onServerMessage(color, text)
    if text:match('^[A-Za-z]+%s?' .. adText .. '[%p%s]*Отправил .+ %(тел%. (%d%d%d?%d?%d?)%)$') then
        sampAddChatMessage('найдено')
    end
end
Почему не работает?
 

kyrtion

Известный
978
355
Почему не работает?
Потому что так положено))
%S- -> экранирует все минимальные символов кроме пробелы (как минимально. Вот если ты там указал, а после там будет квадратики для ида то нужно указать с минусом
%d+ - экранирует на все цифровые символы
в начале лучше убрать hex-цвет: text = text:gsub('{%x%x%x%x%x%x}', '')

и необходимо экранировать на %:
^$()%.[]*+-?
можешь поиграться на https://onecompiler.com/lua
 
  • Нравится
Реакции: w99zzl1

w99zzl1

Участник
Автор темы
108
10

Dmitriy Makarov

25.05.2021
Проверенный
2,505
1,134
Что за геморрой?.. И где SAMP.lua подключённый?
1733614999407.png

Lua:
local sampev = require "samp.events"

function sampev.onServerMessage(color, text)
    if active then
        local adPlayerName = text:gsub("{.-}", ""):match(".+ | Отправил (.+)%[%d+] %(тел%. .+%)")
        if adPlayerName and adPlayerName == sampGetPlayerNickname(select(2, sampGetPlayerIdByCharHandle(PLAYER_PED))) then
            lua_thread.create(function() wait(3000)
                sendAd()
            end)
        end
    end
end