- Поддерживаемые версии
- 1.8
- 1.9
- 1.10
- 1.11
- 1.12
- 1.13
- 1.14
- 1.15
- 1.16
Работает с Java 8 и выше.
Поддержать автора отдельно: [Ссылка]
XTextsCensor - это невероятно эффективный плагин со сложной системой фильтрации текстов для вашего сервера. С его помощью можно полностью автоматизировать фильтрацию текста который игроки пишут в чате, в наковальне, на табличках и при редактировании книг. Необходимый плагин для любого типа серверов - от обычного лобби, до faction сервера!
Никакой "особой магии" или нейронных сетей в плагине нет - большинство фильтров плагина используют regexp паттерны для обнаружения и фильтрации того текста, который вам нужен. Благодаря этому фильтры плагина представляют из себя мощную, тонко настраиваемую систему, которая, при грамотной и тщательной настройке, способна распознать 100% нежелательного текста!
"Из коробки" в плагине доступно 6 фильтров - фильтр сквернословных выражений, фильтр ip-адресов, фильтр доменов, фильтр специальных utf-8 символов, фильтр замены слов и CAPS фильтр.
Естественно, под каждый фильтр есть свой whitelist - набор слов или regexp выражений, которые при проверке текста будут полностью игнорироваться.
Также под каждый фильтр имеются настраиваемые разрешения, для получения уведомлений или игнорирования игрока при работе фильтра.
Дополнения
Система автоматических наказаний
Реакцию каждого из фильтров на то или иное событие можно детально настроить необходимым Вам образом. Также, каждый фильтр имеет очень тонко настраиваемую секцию автоматических наказаний, которые будут применены при условии обнаружения фильтром искомого текста.
Все наказания игроков хранятся в памяти в течении 6 часов после записи и при перезапуске сервера удаляются.
Конфигурация фильтров
Базовая конфигурация выглядит следующим образом:
и уже содержит настройки для фильтра капса, фильтра специальных символов utf-8, фильтра доменов, пример организации регекс паттернов для мат-фильтра и настройки для ip-адресов.
Скриншоты и GIF
Команды и разрешения
[] | <> - не обязательные и обязательные аргументы.
Поддержать автора отдельно: [Ссылка]
Никакой "особой магии" или нейронных сетей в плагине нет - большинство фильтров плагина используют regexp паттерны для обнаружения и фильтрации того текста, который вам нужен. Благодаря этому фильтры плагина представляют из себя мощную, тонко настраиваемую систему, которая, при грамотной и тщательной настройке, способна распознать 100% нежелательного текста!
Регулярные выражения — Википедия
ru.wikipedia.org
i Hate Regex - The Regex Cheat Sheet
i Hate Regex is a regex cheat sheet that also explains the commonly used expressions so that you understand it. Stop hating and start learning.
ihateregex.io
regex101: build, test, and debug regex
Regular expression tester with syntax highlighting, explanation, cheat sheet for PHP/PCRE, Python, GO, JavaScript, Java. Features a regex quiz & library.
regex101.com
"Из коробки" в плагине доступно 6 фильтров - фильтр сквернословных выражений, фильтр ip-адресов, фильтр доменов, фильтр специальных utf-8 символов, фильтр замены слов и CAPS фильтр.
Естественно, под каждый фильтр есть свой whitelist - набор слов или regexp выражений, которые при проверке текста будут полностью игнорироваться.
Также под каждый фильтр имеются настраиваемые разрешения, для получения уведомлений или игнорирования игрока при работе фильтра.
Дополнения
Link: https://www.spigotmc.org/resources/placeholderapi.6245/
Используя PlaceholderAPI, Вы можете использовать плейсхолдеры в действиях наказания.
Вы также можете использовать
плейсхолдер чтобы получить уровень наказания игрока у определённого фильтра.
Используя PlaceholderAPI, Вы можете использовать плейсхолдеры в действиях наказания.
Вы также можете использовать
YAML:
%textscensor_{filter_identifier}_violation_level%
%textscensor_Replace_violation_level% # пример
Система автоматических наказаний
Реакцию каждого из фильтров на то или иное событие можно детально настроить необходимым Вам образом. Также, каждый фильтр имеет очень тонко настраиваемую секцию автоматических наказаний, которые будут применены при условии обнаружения фильтром искомого текста.
YAML:
Violations:
ALL:
'1':
Event-result:
Type: REMOVE_DETECTED
Priority: 3
Punishments:
- "[LOG : WARNING] '{player_name}' uses restricted symbols: '{emphasized_message}'"
- "[NOTIFY] §7'§c{player_name}§7' uses §crestricted symbols§7: '{emphasized_message}'§7"
'2':
Event-result:
Type: REMOVE_DETECTED
Priority: 3
Punishments:
- "[LOG : WARNING] '{player_name}' uses restricted symbols: '{emphasized_message}'"
- "[NOTIFY] §7'§c{player_name}§7' uses §crestricted symbolsp§7: '{emphasized_message}§7'"
- Список типов проверки.
В зависимости от типа проверки применяются соответствующие наказания.
К примеру, при написании в чат ip-адреса - будут применены наказания с типом CHAT в фильтре для IP-адресов.
Возможные варианты:
- COMMAND - только для команд
- CHAT - только для чата
- SIGN - только для табличек
- ANVIL - только для наковальни
- BOOK - только для книг
- ALL - для всех типов проверок - Уровни наказания.
При выполнении списка наказаний для игрока его уровень повышается на 1. Для каждого уровня наказания можно указать свои действия и результат события. - Event-result - результат события.
Возможные варианты:
- NOTHING - никакой реакции на событие.
- SHOW_ONLY_SENDER (работает только для чата) - отправка сообщения только отправителю, никто другой сообщения не увидит.
- REMOVE_DETECTED - удаляет найденный текст, заменяя его на текст указанный в фильтре ('*' при стандартной настройке).
- CANCEL_EVENT - отменяет событие.
- REMOVE_STACK (работает только для книг и наковальни) - удаляет предмет. (книгу или предмет в наковальне). - Event-result priority
При проверке текста могут среагировать сразу несколько фильтров - в таком случае секция наказаний каждого из фильтров выполняется отдельно. При этом необходимо получить ещё и результат вызванного события и вот для этого и используется приоритет. Плагин получает все возможные результаты события со всех фильтров, находит результат с наибольшим приоритетом и выполняет его. Если плагин обнаруживает результаты с одинаковым приоритетом то результат события определяется между ними случайным образом. - Punishments - список действий выполняемых при наказании.
* Состоит из строки, которая состоит из двух частей. В первой части, в квадратных скобках указывается тип действия и его параметры.
Возможные варианты:
- COMMAND
Выполняет команду от имени игрока или консоли.
Формат:
YAML:- "[COMMAND] {command}" # команда будет выполнена от имени консоли, если SENDER не указан - "[COMMAND | SENDER: {SENDER}] {command}" # {SENDER} - от чьего лица исполняется команда, может быть PLAYER или CONSOLE. # {command} - команда и её параметры.
Отправляет сообщение игроку (или всем игрокам на сервере).
Формат:
YAML:- "[MESSAGE] {message}" - "[MESSAGE | BROADCAST] {message}" # '| BROADCAST' - при указании аргумента отправляет сообщение всем игрокам на сервере. # {message} - сообщение.
Отправляет сообщение всем игрокам на сервере имеющим специальное разрешение фильтра.
Формат:
YAML:- "[NOTIFY] {message}" # {message} - сообщение.
Проигрывает звук игроку (или всем игрокам на сервере).
Формат:
YAML:- "[PLAY_SOUND] {sound}" - "[PLAY_SOUND | VOLUME: {volume}] {sound}" - "[PLAY_SOUND | VOLUME: {volume} | PITCH: {pitch}] {sound}" - "[PLAY_SOUND | VOLUME: {volume} | PITCH: {pitch} | BROADCAST] {sound}" - "[PLAY_SOUND | VOLUME: {volume} | BROADCAST] {sound}" - "[PLAY_SOUND | PITCH: {pitch} | BROADCAST] {sound}" - "[PLAY_SOUND | PITCH: {pitch}] {sound}" - "[PLAY_SOUND | BROADCAST] {sound}" # {volume} - громкость звука. # {pitch} - тональность звука. # '| BROADCAST' - при указании аргумента проигрывает звук всем игрокам на сервере. # {sound} - название звука.
Отправляет сообщение в консоль сервера.
Формат:
YAML:- "[LOG] {message}" # будет использован Level.INFO, если уровень не указан - "[LOG | LEVEL: {level}] {message}" # {level} - уровень записи. # Возможные варианты: OFF, SEVERE, WARNING, INFO, CONFIG, FINE, FINER, FINEST, ALL. # {message} - сообщение.
Все наказания игроков хранятся в памяти в течении 6 часов после записи и при перезапуске сервера удаляются.
Конфигурация фильтров
Базовая конфигурация выглядит следующим образом:
YAML:
# Welcome to filter configuration :)
# Let's start with basic things:
# Here we have filters - '<filter identifier: filter object>',
# Possible filter objects: Caps Filler, RegexFilter.
# Emphasize colors - colors to underline words found by the filter.
# Event results - what result will be applied to the triggered event if the filter hit the text.
# Has a format:
# <filter check type>:
# 'violation level': '<event result> : <event result priority>'
# The 'filter check type' types specified in 'event results' section
# will activate the filter for that event.
# The 'event result priority' is used to calculate the final result for the event.
# The lower the priority, the higher the chance that this result will be used in the end.
# If different filters for the same filter check type use the same priority
# for the event result, the result will be selected randomly.
Filters:
Replace:
==: ReplaceFilter
Violations:
CHAT:
'1':
Event-result:
Type: REMOVE_DETECTED
Priority: 2
Emphasizes:
Whitelist:
Start: §9§n
End: §7
Regex-pattern:
- \b(idk)\b:i don't know
Permissions:
Notify: texts.censor.replace.notify
Bypass: texts.censor.replace.bypass
Enabled: true
IP:
==: RegexFilter
Regex-patterns:
Whitelist:
Regex: 127.0.0.1:25565
Flags:
- CASE_INSENSITIVE
Blacklist:
Regex: ((\d+\W{1,5}){2,}\d+)
Flags:
- CASE_INSENSITIVE
Violations:
ALL:
'1':
Event-result:
Type: REMOVE_DETECTED
Priority: 2
Punishments:
- '[LOG | WARNING] ''{player_name}'' publishes unknown ip: ''{emphasized_message}'''
- '[NOTIFY] §7''§c{player_name}§7'' publishes unknown §cip§7: ''{emphasized_message}§7'''
'2':
Event-result:
Type: REMOVE_DETECTED
Priority: 2
Punishments:
- '[LOG | WARNING] ''{player_name}'' publishes unknown ip: ''{emphasized_message}§7'''
- '[NOTIFY] §7''§c{player_name}§7'' publishes unknown §cip§7: ''{emphasized_message}§7'''
Emphasizes:
Whitelist:
Start: §a§n
End: §7
Blacklist:
Start: §c§n
End: §7
Permissions:
Notify: texts.censor.ip.notify
Bypass: texts.censor.ip.bypass
Single-char-replacement: true
Enabled: true
Replacement: '*'
Swear:
==: SwearFilter
Regex-patterns:
Whitelist:
Pattern:
==: RegexPattern
Regex: ({regexes})
Flags:
- CASE_INSENSITIVE
List:
- any_whitelisted_word_can_be_here
Blacklist:
Pattern:
==: RegexPattern
Regex: ({regexes})
Flags:
- CASE_INSENSITIVE
List:
- ((f+)[ua4]+?(c+)?(k+))
- ((b+)[i1]+?(t+)?(c+)?(h+))
Violations:
ALL:
'1':
Event-result:
Type: REMOVE_DETECTED
Priority: 2
Punishments:
- '[LOG | WARNING] ''{player_name}'' uses swear in his messages: ''{emphasized_message}'''
- '[NOTIFY] §7''§c{player_name}§7'' uses §cswear §7in his messages: ''{emphasized_message}§7'''
'2':
Event-result:
Type: REMOVE_DETECTED
Priority: 2
Punishments:
- '[LOG | WARNING] ''{player_name}'' uses swear in his messages: ''{emphasized_message}'''
- '[NOTIFY] §7''§c{player_name}§7'' uses §cswear §7in his messages: ''{emphasized_message}§7'''
Emphasizes:
Whitelist:
Start: §a§n
End: §7
Blacklist:
Start: §c§n
End: §7
Permissions:
Notify: texts.censor.swear.notify
Bypass: texts.censor.swear.bypass
Single-char-replacement: true
Enabled: true
Replacement: '*'
Domain:
==: RegexFilter
Regex-patterns:
Whitelist:
Regex: your-project-domain.com
Flags:
- CASE_INSENSITIVE
Blacklist:
Regex: ([0-9a-z]{2,}\.)+(рус|pф|space|abb|abc|able|ac|aco|ad|adac|ads|ae|aeg|aero|af|afl|ag|art|asia|at|auto|aw|aws|ax|axa|az|ba|baby|band|bank|bar|bb|bbc|bbt|bbva|bcg|bcn|bd|be|beer|best|bet|bf|bg|bh|bi|bid|bike|bing|bio|biz|bj|blog|blue|bm|bms|bmw|bn|bnl|bo|bofa|bom|bond|boo|book|bot|br|bs|bt|buy|buzz|bv|bw|by|bz|bzh|ca|cab|cafe|cal|call|cam|camp|car|care|cars|casa|case|cash|cat|cba|cbn|cbre|cbs|cc|cd|ceb|ceo|cern|cf|cfa|cfd|cg|ch|chat|ci|citi|city|ck|cl|club|cm|cn|com|cool|coop|cr|crs|csc|cu|cv|cw|cx|cy|cyou|cz|dad|date|day|dclk|dds|de|deal|dell|desi|dev|dhl|diet|dish|diy|dj|dk|dm|dnp|do|docs|dog|doha|dot|dtv|duck|duns|dvag|dvr|dz|eat|ec|eco|edu|ee|eg|er|erni|es|esq|eu|eus|fage|fail|fan|fans|farm|fast|fi|fiat|fido|fire|fish|fit|fj|fk|flir|fly|fm|fo|foo|ford|fox|fr|frl|ftr|fund|fyi|ga|gal|game|gap|gb|gbiz|gd|gdn|ge|gea|gent|gf|gg|ggee|gh|gi|gift|gl|gle|gm|gmbh|gmo|gmx|gn|gold|golf|goo|goog|gop|got|gov|gp|gq|gr|gs|gt|gu|guge|guru|gw|gy|haus|hbo|hdfc|help|here|hgtv|hiv|hk|hkt|hm|hn|host|hot|how|hr|hsbc|ht|htc|hu|ibm|icbc|ice|icu|id|ie|ieee|ifm|il|im|imdb|immo|in|info|ing|ink|int|io|iq|ir|is|ist|it|itau|itv|iwc|java|jcb|jcp|je|jeep|jlc|jll|jm|jmp|jnj|jo|jobs|jot|joy|jp|jprs|kddi|ke|kfh|kg|kh|ki|kia|kim|kiwi|km|kn|kp|kpmg|kpn|kr|krd|kred|kw|ky|kz|la|land|lat|law|lb|lc|lds|lego|lgbt|li|lidl|life|like|limo|link|live|lk|loan|loft|lol|love|lpl|lr|ls|lt|ltd|ltda|lu|luxe|lv|ly|ma|maif|man|mba|mc|mcd|md|me|med|meet|meme|men|menu|meo|mg|mh|mil|mini|mint|mit|mk|ml|mlb|mls|mm|mma|mn|mo|mobi|moda|moe|moi|mom|mov|mp|mq|mr|ms|msd|mt|mtn|mtpc|mtr|mu|mv|mw|mx|my|mz|nab|name|navy|nba|nc|ne|nec|net|new|news|next|nf|nfl|ng|ngo|nhk|ni|nico|nike|nl|no|now|np|nr|nra|nrw|ntt|nu|nyc|nz|obi|off|ollo|om|ong|onl|ooo|open|org|ott|ovh|pa|page|pars|pay|pccw|pe|pet|pf|pg|ph|pics|pid|pin|ping|pink|pk|pl|play|plus|pm|pn|pnc|pohl|porn|post|pr|pro|prod|prof|pru|ps|pt|pub|pw|pwc|py|qa|qpon|qvc|raid|re|read|red|reit|ren|rent|rest|rich|rio|rip|ro|room|rs|rsvp|ru|ruhr|run|rw|rwe|sa|safe|sale|sap|sapo|sarl|sas|save|saxo|sb|sbi|sbs|sc|sca|scb|scor|scot|sd|se|seat|seek|ses|sew|sex|sexy|sfr|sg|sh|shaw|shia|shop|show|si|silk|sina|site|sj|sk|ski|skin|sky|sl|sm|sn|sncf|so|sohu|song|sony|soy|spot|sr|srl|srt|st|star|stc|su|surf|sv|sx|sy|sz|tab|talk|tax|taxi|tc|tci|td|tdk|team|tech|tel|teva|tf|tg|th|thd|tiaa|tips|tj|tjx|tk|tl|tm|tn|top|town|toys|tr|trv|tt|tube|tui|tv|tvs|tw|tz|ua|ubs|ug|uk|uno|uol|ups|us|uy|uz|va|vana|vc|ve|vet|vg|vi|xyz|store|vig|vin|vip|visa|viva|vivo|vn|vote|voto|vu|wang|wed|weir|wf|wien|wiki|win|wine|wme|work|wow|ws|wtc|wtf|xbox|xin|xxx|ye|yoga|you|yt|yun|za|zara|zero|zip|zm|zone|zw|online)(:\d*)?
Flags:
- CASE_INSENSITIVE
Violations:
ALL:
'1':
Event-result:
Type: REMOVE_DETECTED
Priority: 2
Punishments:
- '[LOG | WARNING] ''{player_name}'' publishes unknown domain: ''{emphasized_message}'''
- '[NOTIFY] §7''§c{player_name}§7'' publishes unknown §cdomain§7: ''{emphasized_message}§7'''
'2':
Event-result:
Type: REMOVE_DETECTED
Priority: 2
Punishments:
- '[LOG | WARNING] ''{player_name}'' publishes unknown domain: ''{emphasized_message}'''
- '[NOTIFY] §7''§c{player_name}§7'' publishes unknown §cdomain§7: ''{emphasized_message}§7'''
Emphasizes:
Whitelist:
Start: §a§n
End: §7
Blacklist:
Start: §c§n
End: §7
Permissions:
Notify: texts.censor.domain.notify
Bypass: texts.censor.domain.bypass
Single-char-replacement: true
Enabled: true
Replacement: '*'
Special-symbols:
==: RegexFilter
Regex-patterns:
Whitelist:
Regex: ?
Flags:
- CASE_INSENSITIVE
Blacklist:
Regex: '[^\wA-z!@"''#№$:;%.,<>^*()-=+\|~`{}&§? ]'
Flags:
- CASE_INSENSITIVE
Violations:
ALL:
'1':
Event-result:
Type: REMOVE_DETECTED
Priority: 3
Punishments:
- '[LOG | WARNING] ''{player_name}'' uses restricted symbols: ''{emphasized_message}'''
- '[NOTIFY] §7''§c{player_name}§7'' uses §crestricted symbolsp§7: ''{emphasized_message}§7'''
'2':
Event-result:
Type: REMOVE_DETECTED
Priority: 3
Punishments:
- '[LOG | WARNING] ''{player_name}'' uses restricted symbols: ''{emphasized_message}'''
- '[NOTIFY] §7''§c{player_name}§7'' uses §crestricted symbolsp§7: ''{emphasized_message}§7'''
Emphasizes:
Whitelist:
Start: §a§n
End: §7
Blacklist:
Start: §c§n
End: §7
Permissions:
Notify: texts.censor.special-symbols.notify
Bypass: texts.censor.special-symbols.bypass
Single-char-replacement: true
Enabled: true
Replacement: '*'
Caps:
==: CapsFilter
Caps-maximum-percent: 35
Violations:
ALL:
'1':
Event-result:
Type: REMOVE_DETECTED
Priority: 5
Punishments:
- '[LOG | WARNING] ''{player_name}'' uses CAPS LOCK extensively: ''{emphasized_message}§7'''
- '[MESSAGE] §7You received your §cfirst warning §7for using CAPS LOCK!'
- '[NOTIFY] §7''§c{player_name}§7'' uses §cCAPS LOCK §7extensively: ''{emphasized_message}§7'''
'2':
Event-result:
Type: REMOVE_DETECTED
Priority: 5
Punishments:
- '[LOG | WARNING] ''{player_name}'' uses CAPS LOCK extensively: ''{emphasized_message}§7'''
- '[MESSAGE] §7You received your §csecond warning §7for using CAPS LOCK!'
- '[NOTIFY] §7''§c{player_name}§7'' uses §cCAPS LOCK §7extensively: ''{emphasized_message}§7'''
Message-minimum-length: 5
Emphasizes:
Whitelist:
Start: §a§n
End: §7
Blacklist:
Start: §c§n
End: §7
Permissions:
Notify: texts.censor.caps.notify
Bypass: texts.censor.caps.bypass
Enabled: true
Whitelist:
- ESIC
Forcibly-uppercase-whitelisted-words: false
Remove-mode: SENTENCE_START_WITH_CAPITAL_LETTER
Consider-words-used-in-whitelist-when-calculating-caps-percent: false
Message-end-characters:
- .
- '!'
- '?'
Скриншоты и GIF
Команды и разрешения
[] | <> - не обязательные и обязательные аргументы.
Команда | Разрешение |
'/textscensor <help>' [Алиас: '/tc'] - выводит список всех команд. | texts.censor.commands.help |
'/tc reload' - перезагружает конфигурации плагина. | texts.censor.commands.reload |
'/tc filters' - отображает все загруженные фильтры и статус их работы. | texts.censor.commands.filters |
'/tc enable [идентификатор фильтра]' - включает фильтр. | texts.censor.commands.enable |
'/tc disable [идентификатор фильтра]' - выключает фильтр. | texts.censor.commands.disable |
'/tc debug' - переключить режим отладки. | texts.censor.commands.debug |
'/tc check [тип проверки] [текст]' - проверяет строку с использованием фильтров. | texts.censor.commands.check |
- Команды и права
- -