Как сделать чтоб брало сообщение из чата?

RICJS29_JSJA

Участник
Автор темы
85
2
Версия MoonLoader
.026-beta
К примеру в чате появляется такое сообщение: "[Ферма] Nick_Name продал фрукты с фургона за 220000 вирт".
Надо чтоб это сообщение перехватывало. я пытался найти как, но не смог
Lua:
    if text:find(" [Ферма] (.+) продал фрукты с фургона за (%d+) вирт") then
    if bNotf then
        notf.addNotification('\t\t\t\t   FPD SCRIPT\Text', 5, 1)
    end
    end
    
[[
Не работает почему то
]]
как решить?
 

RICJS29_JSJA

Участник
Автор темы
85
2
Я уже поправил, там укажи :find
1713134393812.png

указал, вот продал щас ничего нету в консоли
 

kyrtion

Известный
659
242
Посмотреть вложение 237414
указал, вот продал щас ничего нету в консоли
ты посмотри в ошибках и научитесь диагностировать.
посмотри откуда берется эти тексты. ну в таком случае скинь полноценный текст.

Перед кода который я сверху скинул, вставляешь:
Lua:
local testText = string.format('[%d] "%s"', color, text)
print(testText)
В любом чате напишите, и там должно быть 2 строка чтобы я понял:
1. Любая строка в самп-рп, это только когда пишешь или появлилась, но не фермы.
2. Тот же строка фермы
 

RICJS29_JSJA

Участник
Автор темы
85
2
Lua:
local testText = string.format('[%d] "%s"', color, text)
print(testText)
local regexMatchChatFarmJob = '^%[Ферма%] (%S+) продал фрукты с фургона за (%d+) вирт$'

function samp.onServerMessage(color, text)

    local ntext = text:gsub('{%x%x%x%x%x%x}', '')
    if ntext:find(regexMatchChatFarmJob) then
        local nickname, money = ntext:match(regexMatchChatFarmJob)
        -- nickname: 'Marcus_Kransov', money: '126250' - все строковые
        money = tonumber(money)
        print(nickname, money)
    if bNotf then
        notf.addNotification("testt", 5, 1)
    end
    end

end
ты посмотри в ошибках и научитесь диагностировать.
посмотри откуда берется эти тексты. ну в таком случае скинь полноценный текст.

Перед кода который я сверху скинул, вставляешь:
Lua:
local testText = string.format('[%d] "%s"', color, text)
print(testText)
В любом чате напишите, и там должно быть 2 строка чтобы я понял:
1. Любая строка в самп-рп, это только когда пишешь или появлилась, но не фермы.
2. Тот же строка фермы
так тоесть?
 

kyrtion

Известный
659
242
Lua:
local testText = string.format('[%d] "%s"', color, text)
print(testText)
local regexMatchChatFarmJob = '^%[Ферма%] (%S+) продал фрукты с фургона за (%d+) вирт$'

function samp.onServerMessage(color, text)

    local ntext = text:gsub('{%x%x%x%x%x%x}', '')
    if ntext:find(regexMatchChatFarmJob) then
        local nickname, money = ntext:match(regexMatchChatFarmJob)
        -- nickname: 'Marcus_Kransov', money: '126250' - все строковые
        money = tonumber(money)
        print(nickname, money)
    if bNotf then
        notf.addNotification("testt", 5, 1)
    end
    end

end

так тоесть?
Ну попробуй прочитать и сообразить код в алгоритм. Если ты вставил так именно, то не будет появляться сообщение, ведь код, который ты указал* вне callback-функции (onServerMessage и иных в sampev). Этот код должно сработать в onServerMessage, т.к. я указал ключевая переменная text и color - это и есть onServerMessage
Выдаст ошибка:
- нет такой text

Lua:
function samp.onServerMessage(color, text)
    local testText = string.format('[%d] "%s"', color, text)
    print(testText)

    local ntext = text:gsub('{%x%x%x%x%x%x}', '')
    if ntext:find(regexMatchChatFarmJob) then
        local nickname, money = ntext:match(regexMatchChatFarmJob)
        -- nickname: 'Marcus_Kransov', money: '126250' - все строковые
        money = tonumber(money)
        print(nickname, money)
        if bNotf then notf.addNotification("testt", 5, 1) end
    end
end

Небольшой сделал перевыв и решил понять в чем прикол. Но оказывается что в сампе рп появляется с пробелом.

В таком случае, поправь:
local ntext = text:gsub('{%x%x%x%x%x%x}', ''):gsub('^%s+', ''):gsub('%s+$', '')
И тогда в начале и в конце не будет пробелов
Либо поправить:
local regexMatchChatFarmJob = '^%s*%[Ферма%] (%S+) продал фрукты с фургона за (%d+) вирт%s*$'
 
Последнее редактирование:

RICJS29_JSJA

Участник
Автор темы
85
2
Если не нужно парсить никнейм и сумму, за которую продал, то почему бы не сделать обычный поиск?
Lua:
if text:find('продал фрукты с фургона за') then
Этого недостаточно разве?
а что делать если оно реагирует даже если и другие продают?
 

Vintik

Мечтатель
Проверенный
1,471
920
а что делать если оно реагирует даже если и другие продают?
Резонно.

I. Значит, для начала тебе нужно копировать строку не из самого чата, а из файла chatlog (он находится по пути: Мои документы —> GTA SA —> SAMP). Почему? Если у тебя строка разноцветная, то ты в чате не будешь видеть символы, которые задают цвет. Например:
В чате: Рады приветствовать Вас, Nick_Name
В чатлоге: Рады приветствовать Вас, {FF0000}Nick_Name

II. Далее, тебе нужно выделить неизменную часть скопированной строки (не учитывая никнейм), чтобы почти гарантированно оно не сработало на другую строку, ненужную тебе. А никнейм получить с помощью соответствующей команды, например может быть такой результат:
Lua:
local nick = sampGetPlayerNickname(sampGetPlayerIdByCharHandle(PLAYER_PED)) -- получаем твой никнейм
if text:find('[Ферма] ' .. nick .. ' продал фрукты с фургона за') then -- склеиваем строку, вставляя туда никнейм, и ищем её 
    ...
end
 

kyrtion

Известный
659
242
Резонно.

I. Значит, для начала тебе нужно копировать строку не из самого чата, а из файла chatlog (он находится по пути: Мои документы —> GTA SA —> SAMP). Почему? Если у тебя строка разноцветная, то ты в чате не будешь видеть символы, которые задают цвет.
Очень выгодно если поставить с галочкой, а также в начале с цветами - всё выводить в moonloader.log, как и я сверху скинул
Lua:
local testText = string.format('[%d] "%s"', color, text)
print(testText)
-- Example: [-1] "Hello world!"
 
  • Нравится
Реакции: Vintik