Перейти к содержимому
  • 0
Stinger

Фильтр мата!

Вопрос

Здравствуйте!

Хочу написать Фильтр Мата для игры, а именно русских слов , знаю, что это очень сложно, хочу спросить вашего совета, как лучше фильтровать мат!

 

Функция чата примерно такая:

function GameChat(player,message)    -- Функция чата.
  if (string.find(message, "fuck") ~= nil) then  -- Тут будет фильтроваться МАТ
  local block_time = 10    -- Время блокировки чата
  Message(player,"Ваш чат заблокирован на 10 минут за мат!")    -- Показываем уведомление игроку.
  BlockChat(player, block_time)    -- Блокируем чат игроку на 10 минут.
  return 0    -- Запрещаем выводить сообщение в чат.
end
return 1
end

 

Во первых есть проблемы со string.find, если банально написать Fuck он уже не поймает слово, как это можно решить ?

И собственно , как лучше подключать сам цикл , что бы не сильно грузить систему и как лучше фильтровать сам мат, буду признателен за ваши ответы по теме.

Изменено пользователем Alex

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Рекомендуемые сообщения

Ой-ой-ой, какая вопиющая жестокость: теперь нормальным поцыкам-кодерам с района придется пояснять за базар бездушной софтине. Лично я бы реализовал подобную систему следующим образом:
 
Для начала создал бы конфиг с запрещенными к употреблению словами в виде отдельного файла:

-- *** - нецензурные слова
{
  ["***"] = true,
  ["*******"] = true,
  ["*****"] = true,
}

Далее загружал бы конфиг по указанному пути, извлекал бы из сообщения игрока отдельные слова и анализировал их на вхождение в конфиг без учета регистра:

local file = io.open("/chat.cfg", "r")
local forbiddenWords = require("serialization").unserialize(file:read("*a"))
file:close()

for word in message:gmatch("[^%s%,%.%:%;%!%^]+") do
  if forbiddenWords[unicode.lower(word)] then
    -- Вещ или бан
  end
end

Использовать string.find(), конечно, удобно, однако слишком велика вероятность случайных банов, как описал мсье Fingercomp. Однако если по какой-то причине тебе все же требуется использовать стандартный поиск, то держи функцию, поддерживающую юникод:

function string.unicodeFind(str, pattern, init, plain)
  if init then
    if init < 0 then
      init = -#unicode.sub(str,init)
    elseif init > 0 then
      init = #unicode.sub(str, 1, init - 1) + 1
    end
  end
  
  a, b = string.find(str, pattern, init, plain)
  
  if a then
    local ap, bp = str:sub(1, a - 1), str:sub(a,b)
    a = unicode.len(ap) + 1
    b = a + unicode.len(bp) - 1
    return a, b
  else
    return a
  end
end
Изменено пользователем Alex

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Лучше пусть мат человек фильтрует. А то будешь потом за "наносабля" и "оскорблять" банить невинных, как на IT было.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Вот где бы пригодились нейросети. Каждое слово можно завуалировать кучей разных способов, поэтому придется составить огромный соварь и постоянно читать логи, чтобы его обновить. Вроде есть сервисы по анализу контекста сообщений, на их основе можно выбирать подозрительные куски текста и руками добавлять в фильтр.

Если создавать нейросеть, способную определять мат в сообщении, хотя-бы для одного языка, то придется неплохо вложиться, хотя задача довольно простая.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Ну всё равно. Бывают, опечатываются, когда предлог "для" пишут. Слово — мат, но наказывать-то за него тупо, да?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Спасибо всем за ответы, буду работать над функцией ECS, если появятся новые идеи то с радостью рассмотрю их, вы правы слово из 3-х букв, можно написать очень многими способами, по этому фильтр почти не реальный, ну  я готов рискнуть, Модератор и так будет следить за чатом, просто хотелось бы какую то Автоматическую карающую машину создать)

Изменено пользователем Stinger

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вы вставили отформатированное содержимое.   Удалить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.


×
×
  • Создать...