Замена слов в сообщение

w99zzl1

Участник
Автор темы
108
10
Версия MoonLoader
.026-beta
Как сделать так, чтобы сообщения фильтровались вне зависимости от регистра (к примеру "хУй" = "фиг" и т.д.)


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

-- Таблица с матами и их заменами
local badWords = {
    ["блять"] = "блин",
    ["хуй"] = "фиг",
    ["пиздец"] = "ужас",
    ["ебать"] = "вот это да",
    ["сука"] = "черт",
    ["нахуй"] = "прочь",
    ["пидор"] = "нехороший человек",
    ["гандон"] = "неприятный тип",
    ["ебаный"] = "глупый",
    ["мразь"] = "негодяй",
    ["тест замены слов"] = "тест удался",
    ["заебал"] = "достал"
}

-- Функция для удаления всех неалфавитных символов
local function removeNonAlphabets(str)
    return str:gsub("[^a-zA-Zа-яА-Я]", "")  -- Удаляет все символы, кроме букв
end

-- Функция для замены мата с учетом регистра
local function matReplace(original, badWord, replacement)
    local result = {}
    for i = 1, #badWord do
        local origChar = original:sub(i, i)
        local bwChar = badWord:sub(i, i)

        -- Сравниваем символы, игнорируя регистр
        if origChar:lower() == bwChar:lower() then
            -- Если символ в оригинале был заглавным, делаем замену также заглавной
            if origChar == origChar:upper() then
                table.insert(result, replacement:sub(i, i):upper())
            else
                table.insert(result, replacement:sub(i, i):lower())
            end
        else
            table.insert(result, origChar)
        end
    end
    return table.concat(result)
end

-- Функция фильтрации сообщений
local function filterMessage(message)
    -- Очистить сообщение от лишних символов и привести к нижнему регистру
    local cleanedMessage = removeNonAlphabets(message):lower()

    -- Проходим по всем словам в таблице badWords
    for badWord, replacement in pairs(badWords) do
        -- Преобразуем badWord в строку, очищенную от лишних символов
        local cleanedBadWord = removeNonAlphabets(badWord):lower()
        
        -- Ищем слово в сообщении, игнорируя лишние символы
        if cleanedMessage:find(cleanedBadWord) then
            message = message:gsub(badWord, function(match)
                -- При замене учитываем оригинальный регистр
                return matReplace(match, badWord, replacement)
            end)
        end
    end
    return message
end

function sampev.onSendChat(message)
    local filteredMat = filterMessage(message)
    if filteredMat ~= message then
        sampSendChat(filteredMat)
        return false
    end
    return true
end

function sampev.onSendCommand(command)
    if command and command:sub(1, 1) == "/" then
        local filteredCommand = filterMessage(command)
        if filteredCommand ~= command then
            sampSendChat(filteredCommand)
            return false
        end
    end
    return true
end
 
  • Вау
Реакции: влад динозавр
Решение
Нужно было заменить все вхождения lower() и upper() на соответствующие nlower() и nupper().

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

-- Таблица с матами и их заменами
local badWords = {
    ["блять"] = "блин",
    ["хуй"] = "фиг",
    ["пиздец"] = "ужас",
    ["ебать"] = "вот это да",
    ["сука"] = "черт",
    ["нахуй"] = "прочь",
    ["пидор"] = "нехороший человек",
    ["гандон"] = "неприятный тип",
    ["ебаный"] = "глупый",
    ["мразь"] = "негодяй",
    ["тест замены слов"] = "тест удался",
    ["заебал"] = "достал"
}

-- Поддержка кириллицы для работы с регистром
local lower, sub, char, upper = string.lower, string.sub, string.char, string.upper
local concat = table.concat

local...

w99zzl1

Участник
Автор темы
108
10
Потребуется дополнительная функция string.nlower, стандартная string.lower не умеет в кириллицу.
Вот пример https://www.blast.hk/threads/13380/post-401197
Что то не получается у меня...


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

-- Таблица с матами и их заменами
local badWords = {
    ["блять"] = "блин",
    ["хуй"] = "фиг",
    ["пиздец"] = "ужас",
    ["ебать"] = "вот это да",
    ["сука"] = "черт",
    ["нахуй"] = "прочь",
    ["пидор"] = "нехороший человек",
    ["гандон"] = "неприятный тип",
    ["ебаный"] = "глупый",
    ["мразь"] = "негодяй",
    ["тест замены слов"] = "тест удался",
    ["заебал"] = "достал"
}

-- Поддержка кириллицы для работы с регистром
local lower, sub, char, upper = string.lower, string.sub, string.char, string.upper
local concat = table.concat

local lu_rus, ul_rus = {}, {}
for i = 192, 223 do
    local A, a = char(i), char(i + 32)
    ul_rus[A] = a
    lu_rus[a] = A
end
local E, e = char(168), char(184)
ul_rus[E] = e
lu_rus[e] = E

function string.nlower(s)
    s = lower(s)
    local len, res = #s, {}
    for i = 1, len do
        local ch = sub(s, i, i)
        res[i] = ul_rus[ch] or ch
    end
    return concat(res)
end

function string.nupper(s)
    s = upper(s)
    local len, res = #s, {}
    for i = 1, len do
        local ch = sub(s, i, i)
        res[i] = lu_rus[ch] or ch
    end
    return concat(res)
end

-- Функция для точной замены с учетом регистра
local function replaceWordWithCase(message, badWord, replacement)
    local pattern = badWord:gsub(".", function(c)
        return string.format("[%s%s]", c:lower(), c:upper())
    end)
    return message:gsub(pattern, function(match)
        -- Используем таблицы с кириллицей для сохранения регистра
        local result = {}
        for i = 1, #match do
            local originalChar = match:sub(i, i)
            local replacementChar = replacement:sub(i, i) or ""
            if originalChar:lower() == originalChar then
                table.insert(result, replacementChar:lower())
            else
                table.insert(result, replacementChar:upper())
            end
        end
        return table.concat(result)
    end)
end

-- Функция фильтрации сообщений
local function filterMessage(message)
    for badWord, replacement in pairs(badWords) do
        message = replaceWordWithCase(message, badWord, replacement)
    end
    return message
end

-- Обработка отправки сообщений
function sampev.onSendChat(message)
    local filteredMat = filterMessage(message)
    if filteredMat ~= message then
        sampSendChat(filteredMat)
        return false
    end
    return true
end

-- Обработка команд
function sampev.onSendCommand(command)
    if command and command:sub(1, 1) == "/" then
        local filteredCommand = filterMessage(command)
        if filteredCommand ~= command then
            sampSendChat(filteredCommand)
            return false
        end
    end
    return true
end
Можете пожалуйста подсказать?
 

1NS

Известный
28
27
Нужно было заменить все вхождения lower() и upper() на соответствующие nlower() и nupper().

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

-- Таблица с матами и их заменами
local badWords = {
    ["блять"] = "блин",
    ["хуй"] = "фиг",
    ["пиздец"] = "ужас",
    ["ебать"] = "вот это да",
    ["сука"] = "черт",
    ["нахуй"] = "прочь",
    ["пидор"] = "нехороший человек",
    ["гандон"] = "неприятный тип",
    ["ебаный"] = "глупый",
    ["мразь"] = "негодяй",
    ["тест замены слов"] = "тест удался",
    ["заебал"] = "достал"
}

-- Поддержка кириллицы для работы с регистром
local lower, sub, char, upper = string.lower, string.sub, string.char, string.upper
local concat = table.concat

local lu_rus, ul_rus = {}, {}
for i = 192, 223 do
    local A, a = char(i), char(i + 32)
    ul_rus[A] = a
    lu_rus[a] = A
end
local E, e = char(168), char(184)
ul_rus[E] = e
lu_rus[e] = E

function string.nlower(s)
    s = lower(s)
    local len, res = #s, {}
    for i = 1, len do
        local ch = sub(s, i, i)
        res[i] = ul_rus[ch] or ch
    end
    return concat(res)
end

function string.nupper(s)
    s = upper(s)
    local len, res = #s, {}
    for i = 1, len do
        local ch = sub(s, i, i)
        res[i] = lu_rus[ch] or ch
    end
    return concat(res)
end

-- Функция для точной замены с учетом регистра
local function replaceWordWithCase(message, badWord, replacement)
    local pattern = badWord:gsub(".", function(c)
        return string.format("[%s%s]", c:nlower(), c:nupper())
    end)
    return message:gsub(pattern, function(match)
        -- Используем таблицы с кириллицей для сохранения регистра
        local result = {}
        for i = 1, #match do
            local originalChar = match:sub(i, i)
            local replacementChar = replacement:sub(i, i) or ""
            if originalChar:nlower() == originalChar then
                table.insert(result, replacementChar:nlower())
            else
                table.insert(result, replacementChar:nupper())
            end
        end
        return table.concat(result)
    end)
end

-- Функция фильтрации сообщений
local function filterMessage(message)
    for badWord, replacement in pairs(badWords) do
        message = replaceWordWithCase(message, badWord, replacement)
    end
    return message
end

-- Обработка отправки сообщений
function sampev.onSendChat(message)
    local filteredMat = filterMessage(message)
    if filteredMat ~= message then
        sampSendChat(filteredMat)
        return false
    end
    return true
end

-- Обработка команд
function sampev.onSendCommand(command)
    if command and command:sub(1, 1) == "/" then
        local filteredCommand = filterMessage(command)
        if filteredCommand ~= command then
            sampSendChat(filteredCommand)
            return false
        end
    end
    return true
end
 
  • Влюблен
Реакции: w99zzl1

w99zzl1

Участник
Автор темы
108
10
Нужно было заменить все вхождения lower() и upper() на соответствующие nlower() и nupper().

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

-- Таблица с матами и их заменами
local badWords = {
    ["блять"] = "блин",
    ["хуй"] = "фиг",
    ["пиздец"] = "ужас",
    ["ебать"] = "вот это да",
    ["сука"] = "черт",
    ["нахуй"] = "прочь",
    ["пидор"] = "нехороший человек",
    ["гандон"] = "неприятный тип",
    ["ебаный"] = "глупый",
    ["мразь"] = "негодяй",
    ["тест замены слов"] = "тест удался",
    ["заебал"] = "достал"
}

-- Поддержка кириллицы для работы с регистром
local lower, sub, char, upper = string.lower, string.sub, string.char, string.upper
local concat = table.concat

local lu_rus, ul_rus = {}, {}
for i = 192, 223 do
    local A, a = char(i), char(i + 32)
    ul_rus[A] = a
    lu_rus[a] = A
end
local E, e = char(168), char(184)
ul_rus[E] = e
lu_rus[e] = E

function string.nlower(s)
    s = lower(s)
    local len, res = #s, {}
    for i = 1, len do
        local ch = sub(s, i, i)
        res[i] = ul_rus[ch] or ch
    end
    return concat(res)
end

function string.nupper(s)
    s = upper(s)
    local len, res = #s, {}
    for i = 1, len do
        local ch = sub(s, i, i)
        res[i] = lu_rus[ch] or ch
    end
    return concat(res)
end

-- Функция для точной замены с учетом регистра
local function replaceWordWithCase(message, badWord, replacement)
    local pattern = badWord:gsub(".", function(c)
        return string.format("[%s%s]", c:nlower(), c:nupper())
    end)
    return message:gsub(pattern, function(match)
        -- Используем таблицы с кириллицей для сохранения регистра
        local result = {}
        for i = 1, #match do
            local originalChar = match:sub(i, i)
            local replacementChar = replacement:sub(i, i) or ""
            if originalChar:nlower() == originalChar then
                table.insert(result, replacementChar:nlower())
            else
                table.insert(result, replacementChar:nupper())
            end
        end
        return table.concat(result)
    end)
end

-- Функция фильтрации сообщений
local function filterMessage(message)
    for badWord, replacement in pairs(badWords) do
        message = replaceWordWithCase(message, badWord, replacement)
    end
    return message
end

-- Обработка отправки сообщений
function sampev.onSendChat(message)
    local filteredMat = filterMessage(message)
    if filteredMat ~= message then
        sampSendChat(filteredMat)
        return false
    end
    return true
end

-- Обработка команд
function sampev.onSendCommand(command)
    if command and command:sub(1, 1) == "/" then
        local filteredCommand = filterMessage(command)
        if filteredCommand ~= command then
            sampSendChat(filteredCommand)
            return false
        end
    end
    return true
end
Ой, а не поможешь пожалуйста сделать, чтобы сообщение не обрезалось? А то получается, пишу "мразь" а оно заменяется на "негод", вместо "негодяй", заменяемое слово обрезается под длинну символов изначального. У меня как то была такая проблема, но я уже не вспомню как я её решил( Тут ещё проблема может быть, ибо регистр сохряняется, хУй = фИг, а если будет мрАзь = неГод, а если не не негод, а негодяй? скрипт собьется какую букву делать капсом, помогите пожалуйста исправить