Хук чата

Sabiny

Новичок
Автор темы
19
7
Версия MoonLoader
.026-beta
Приветствую, мне нужно получать информацию из чата после чего получать из нее ид
1607779957389.png

Lua:
local sampev = require 'lib.samp.events'

function sampev.onServerMessage(color, text)
if text:find('[Flood control /s] (%w+_?%w+)%[(%d+)%] отправил 3 одинаковых сообщения, за (%d+)% секунд из 45 разрешенных!') then
local reasid = text:match('[Flood control /s] (%w+_?%w+)%[(%d+)%] отправил 3 одинаковых сообщения, за (%d+)% секунд из 45 разрешенных!')
--После чего использовать этот переменные которые мы получили использовать
sampSendChat("/mute " ..reasid.." 10 флуд")

end
 

Morse

Потрачен
436
70
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Приветствую, мне нужно получать информацию из чата после чего получать из нее ид
Посмотреть вложение 79017
Lua:
local sampev = require 'lib.samp.events'

function sampev.onServerMessage(color, text)
if text:find('[Flood control /s] (%w+_?%w+)%[(%d+)%] отправил 3 одинаковых сообщения, за (%d+)% секунд из 45 разрешенных!') then
local reasid = text:match('[Flood control /s] (%w+_?%w+)%[(%d+)%] отправил 3 одинаковых сообщения, за (%d+)% секунд из 45 разрешенных!')
--После чего использовать этот переменные которые мы получили использовать
sampSendChat("/mute " ..reasid.." 10 флуд")

end
Попробуй так

Lua:
local sampev = require 'lib.samp.events'

function sampev.onServerMessage(color, text)
    if text:find('[Flood control /s] (%w+_?%w+)%[(%d+)%] отправил 3 одинаковых сообщения, за (%d+)% секунд из 45 разрешенных!') then
        local name, id, time = text:match('[Flood control /s] (%w+_?%w+)%[(%d+)%] отправил 3 одинаковых сообщения, за (%d+)% секунд из 45 разрешенных!')
        sampSendChat("/mute " ..id.. " 10 флуд")
    end
end
 

Hatiko

Известный
Проверенный
1,512
628
1. Сообщение не однородно по цвету, т.е. ник другого цвета, а следовательно там будут цветовые теги, например {D1D1D1}Pula_Dura[885]{e66e6e}
2. Ты каждое регулярное выражение заключаешь в круглые скобки, так не надо делать, если эти из этих шаблонов ты ничего не хочешь получить в переменную. Заключаешь только то, что ты будешь вытаскивать,т.е. ID игрока только. В find это правило не касается особо.
3. Лишний символ - процент% перед словом "секунд"



Lua:
function sampev.onServerMessage(color, text)
    if text:find('[Flood control /s] {%x+}(%w+_?%w+)%[(%d+)%]{%x+} отправил 3 одинаковых сообщения, за (%d+) секунд из 45 разрешенных!') then
        local reasid = text:match('[Flood control /s] {%x+}%w+_?%w+%[(%d+)%]{%x+} отправил 3 одинаковых сообщения, за d+ секунд из 45 разрешенных!')
      
        sampSendChat("/mute " ..reasid.." 10 флуд")
  
    end
end
Если не заработает, пришли из чат-лога строчку эту
 

Sabiny

Новичок
Автор темы
19
7
1. Сообщение не однородно по цвету, т.е. ник другого цвета, а следовательно там будут цветовые теги, например {D1D1D1}Pula_Dura[885]{e66e6e}
2. Ты каждое регулярное выражение заключаешь в круглые скобки, так не надо делать, если эти из этих шаблонов ты ничего не хочешь получить в переменную. Заключаешь только то, что ты будешь вытаскивать,т.е. ID игрока только. В find это правило не касается особо.
3. Лишний символ - процент% перед словом "секунд"



Lua:
function sampev.onServerMessage(color, text)
    if text:find('[Flood control /s] {%x+}(%w+_?%w+)%[(%d+)%]{%x+} отправил 3 одинаковых сообщения, за (%d+) секунд из 45 разрешенных!') then
        local reasid = text:match('[Flood control /s] {%x+}%w+_?%w+%[(%d+)%]{%x+} отправил 3 одинаковых сообщения, за d+ секунд из 45 разрешенных!')
     
        sampSendChat("/mute " ..reasid.." 10 флуд")
 
    end
end
Если не заработает, пришли из чат-лога строчку эту
Эти строки не сохраняются в чатлоге, не знаю почему.
 

_razor

t.me/sssecretway | ТГК: t.me/razor_code
Всефорумный модератор
1,952
3,229

_razor

t.me/sssecretway | ТГК: t.me/razor_code
Всефорумный модератор
1,952
3,229

Hatiko

Известный
Проверенный
1,512
628
В данной теме скрипт использует хук сообщений. Поройся в коде найдёшь.
 

Sabiny

Новичок
Автор темы
19
7
Хорошо, спасибо огромное, я получил строки
[ML] (script) sabinytest.lua: 16666190 \\\\\ [Flood control /s] Raffaello_Sabiny[900] îòïðàâèë 3 îäèíàêîâûõ ñîîáùåíèÿ, çà 6 ñåêóíä èç 45 ðàçðåøåííûõ!
[ML] (script) sabinytest.lua: 16666190 \\\\\ [Flood control /s] Ñîîáùåíèå: ïðîâåðêà
1607784247675.png

Как это использовать?
Lua:
require "lib.moonloader"
local sampev = require 'lib.samp.events'
local mem = require('memory')
local ffi = require 'ffi'
local hook = {hooks = {}}
addEventHandler('onScriptTerminate', function(scr)
    if scr == script.this then
        for i, hook in ipairs(hook.hooks) do
            if hook.status then
                hook.stop()
            end
        end
    end
end)

ffi.cdef [[
    int VirtualProtect(void* lpAddress, unsigned long dwSize, unsigned long flNewProtect, unsigned long* lpflOldProtect);
]]

function hook.new(cast, callback, hook_addr, size)
    local size = size or 5
    local new_hook = {}
    local detour_addr = tonumber(ffi.cast('intptr_t', ffi.cast('void*', ffi.cast(cast, callback))))
    local void_addr = ffi.cast('void*', hook_addr)
    local old_prot = ffi.new('unsigned long[1]')
    local org_bytes = ffi.new('uint8_t[?]', size)
    ffi.copy(org_bytes, void_addr, size)
    local hook_bytes = ffi.new('uint8_t[?]', size, 0x90)
    hook_bytes[0] = 0xE9
    ffi.cast('uint32_t*', hook_bytes + 1)[0] = detour_addr - hook_addr - 5
    new_hook.call = ffi.cast(cast, hook_addr)
    new_hook.status = false
    local function set_status(bool)
        new_hook.status = bool
        ffi.C.VirtualProtect(void_addr, size, 0x40, old_prot)
        ffi.copy(void_addr, bool and hook_bytes or org_bytes, size)
        ffi.C.VirtualProtect(void_addr, size, old_prot[0], old_prot)
    end
    new_hook.stop = function() set_status(false) end
    new_hook.start = function() set_status(true) end
    new_hook.start()
    table.insert(hook.hooks, new_hook)
    return setmetatable(new_hook, {
        __call = function(self, ...)
            self.stop()
            local res = self.call(...)
            self.start()
            return res
        end
    })
end

function main()
   if not isSampfuncsLoaded() or not isSampLoaded() then return end
                while not isSampAvailable() do wait(100) end   
                sampAddChatMessage(string.format("Успешно загружен"), 0x8A5EB6 )
    sampChatHook = hook.new('void(__thiscall *)(void *this, uint32_t type, const char* text, const char* prefix, uint32_t color, uint32_t pcolor)', ChatHook, getModuleHandle('samp.dll') + 0x64010)
     while true do
    wait(-1)
end
end

function ChatHook(HOOKED_CHAT_THIS, HOOKED_CHAT_TYPE, HOOKED_CHAT_TEXT, HOOKED_CHAT_PREFIX, HOOKED_CHAT_COLOR, HOOKED_CHAT_PCOLOR)
    print(tostring(HOOKED_CHAT_COLOR).." \\\\\\\\\\ "..ffi.string(HOOKED_CHAT_TEXT))
    sampChatHook(HOOKED_CHAT_THIS, HOOKED_CHAT_TYPE, HOOKED_CHAT_TEXT, HOOKED_CHAT_PREFIX, HOOKED_CHAT_COLOR, HOOKED_CHAT_PCOLOR)
end
Как использовать информацию из консоли и еще как скрыть вывод в консоль?
 
Последнее редактирование: