Исходник [ADM] Автоматический мут обхода рекламы

yellowakyloff

Новичок
Автор темы
24
2
Не судите строго. Это мой первый скрипт, можете его доработать, ваши доработки/предложения будут учтены.
github


  • Исправлен баг с удалением сообщений.
  • Добавлено сохранение настроек в ini-файл.
  • Добавлено оповещение о подозрении обхода рекламы для избежания ошибочных мутов.

  • Исправлена ошибка с кодировкой при отправке команды мута.

  • Исправлен баг с флудом сообщений при выходе из АФК.

  • Добавлено логирование сообщений в папку VRbypass/logs.

  • Добавлен мини-список исключений для предотвращения ошибочных мутов.

  • Добавлено больше сообщений в ini-файл для минимизации ошибочных мутов.
 

Вложения

  • mute.lua
    1.7 KB · Просмотры: 2
Последнее редактирование:
  • Bug
  • Нравится
Реакции: Nichoo и XRLM

kyrtion

Известный
1,110
403
оптимизировал код, но лень указать что исправить.
Вопрос, зачем нужно использовать таблицу вип-чат, если оно никуда не пригодится кроме собрать и проверять по тайму, затем удалять? никакой нет преимуществ

Lua:
local sampev = require('samp.events')
local sf = string.format

local vipChat = {}
local banWords = { 'купл', 'прод', 'сда', 'sell', 'buy', 'бмен' }
local rateMessage = 10 -- sec

local function toLowerCase(str)
    return select(1, string.gsub(str, '([A-ZА-ЯЁ])', function(c)
        return string.char(string.byte(c) + (c == 'ё' and 16 or 32))
    end))
end

local function removeOldMessages()
    local clock = os.clock()
    for i, chat in ipairs(vipChat) do
        local timer = clock - chat.clock
        if timer >= rateMessage then
            table.remove(vipChat, i)
            break
        end
    end
end

local function addToVipChat(typeVip, nickname, id, message)
    local tabl = {
        type = typeVip,
        nickname = nickname,
        id = id,
        message = message,
        clock = os.clock()
    }
    table.insert(vipChat, tabl)
end

local function isBypassAdInVipChat(typeVip, content)
    local lowContect = toLowerCase(content)

    if typeVip == 'PREMIUM' or typeVip == 'VIP' or typeVip == 'FOREVER' then
        for _, word in ipairs(banWords) do
            if lowContect:find(word) then
                return true -- использование return то цикл прерывается и вернет функцию значение
            end
        end
    end

    return false
end

function sampev.onServerMessage(color, text)
    -- заменяет любой цветной hex в формате {FFFFFF} на пустое
    -- советую, это очень удобно для парсинга данных
    text = text:gsub('{%x%x%x%x%x%x}', '')

    if text:find('^%[.-%] %S-%[%d+%]: .*$') then
        local typeVip, playerNickname, playerId, content = text:match('^%[(.-)%] (%S-)%[(%d+)%]: (.*)$')
        if isBypassAdInVipChat(typeVip, content) then
            -- если является просто сообщение в /vr и похоже на реклама
            addToVipChat(typeVip, playerNickname, playerId, content)
            local time = os.date('%H:%M:%S', os.time())
            local message = sf(
                '[%s] [%s] %s (%s): %s', -- [23:32:21] [PREMIUM] Nick_Name (228): Продам дом
                time, typeVip, playerNickname, playerId, content
            )
            local command = sf('/mute %s 120 обход рекламы vr', playerNickname)
            -- в команде /mute разве можно указать никнейм? неожиданно
            lua_thread.create(function()
                wait(1)
                print(message)
                sampSendChat(command)
                wait(1000)
                setVirtualKeyDown(0x77, true)
                setVirtualKeyDown(0x77, false)
            end)
        end
    end
end

function main()
    repeat wait(0) until isSampAvailable() end

    while true do
        wait(300) -- ограничим на 300мс
        removeOldMessages()
    end
end
 
  • Влюблен
Реакции: yellowakyloff

yellowakyloff

Новичок
Автор темы
24
2
оптимизировал код, но лень указать что исправить.
Вопрос, зачем нужно использовать таблицу вип-чат, если оно никуда не пригодится кроме собрать и проверять по тайму, затем удалять? никакой нет преимуществ

Lua:
local sampev = require('samp.events')
local sf = string.format

local vipChat = {}
local banWords = { 'купл', 'прод', 'сда', 'sell', 'buy', 'бмен' }
local rateMessage = 10 -- sec

local function toLowerCase(str)
    return select(1, string.gsub(str, '([A-ZА-ЯЁ])', function(c)
        return string.char(string.byte(c) + (c == 'ё' and 16 or 32))
    end))
end

local function removeOldMessages()
    local clock = os.clock()
    for i, chat in ipairs(vipChat) do
        local timer = clock - chat.clock
        if timer >= rateMessage then
            table.remove(vipChat, i)
            break
        end
    end
end

local function addToVipChat(typeVip, nickname, id, message)
    local tabl = {
        type = typeVip,
        nickname = nickname,
        id = id,
        message = message,
        clock = os.clock()
    }
    table.insert(vipChat, tabl)
end

local function isBypassAdInVipChat(typeVip, content)
    local lowContect = toLowerCase(content)

    if typeVip == 'PREMIUM' or typeVip == 'VIP' or typeVip == 'FOREVER' then
        for _, word in ipairs(banWords) do
            if lowContect:find(word) then
                return true -- использование return то цикл прерывается и вернет функцию значение
            end
        end
    end

    return false
end

function sampev.onServerMessage(color, text)
    -- заменяет любой цветной hex в формате {FFFFFF} на пустое
    -- советую, это очень удобно для парсинга данных
    text = text:gsub('{%x%x%x%x%x%x}', '')

    if text:find('^%[.-%] %S-%[%d+%]: .*$') then
        local typeVip, playerNickname, playerId, content = text:match('^%[(.-)%] (%S-)%[(%d+)%]: (.*)$')
        if isBypassAdInVipChat(typeVip, content) then
            -- если является просто сообщение в /vr и похоже на реклама
            addToVipChat(typeVip, playerNickname, playerId, content)
            local time = os.date('%H:%M:%S', os.time())
            local message = sf(
                '[%s] [%s] %s (%s): %s', -- [23:32:21] [PREMIUM] Nick_Name (228): Продам дом
                time, typeVip, playerNickname, playerId, content
            )
            local command = sf('/mute %s 120 обход рекламы vr', playerNickname)
            -- в команде /mute разве можно указать никнейм? неожиданно
            lua_thread.create(function()
                wait(1)
                print(message)
                sampSendChat(command)
                wait(1000)
                setVirtualKeyDown(0x77, true)
                setVirtualKeyDown(0x77, false)
            end)
        end
    end
end

function main()
    repeat wait(0) until isSampAvailable() end

    while true do
        wait(300) -- ограничим на 300мс
        removeOldMessages()
    end
end
Подправил, спасибо за помощь
 

kosto

Активный
125
42
удали нахуй эту парашу ебаную меня 3 раз за день мутят сука потому что я случайно нажимаю нет
 
  • Ха-ха
Реакции: miset и yellowakyloff