View Single Post
JoinedSenses
Senior Member
Join Date: Sep 2013
Old 04-20-2018 , 00:56   Re: Regex Filtering
Reply With Quote #2

Quote:
Originally Posted by Twilight Suzuka View Post
Want to filter not only dirty words and potentially offensive phrases, but also things like IP and email addresses? Then this plugin is for you!

This plugin provides the ability to do the following things if a clients say text matches a provided REGEX pattern.

(chatpattern) for chat

1. Execute an RCON command (action)
2. Limit the amount of times such a pattern may be spoken (limit)
3. Enforce the limit with a block of the text
4. Enforce the limit with a punishment RCON command (punish)
5. Allow for forgiveness of one violation every x seconds (forgive)
5. Block the text absolutely (no limit) (block)
6. Replace the matches with a string (replace)
7. Replace matches from ANOTHER REGEX pattern with a string (replacepattern)
8. Warn the client they are violating the matching rules (warn)
9. Allow admins with specified levels to be immune (immunity)

All of this is done via a simple file format, no commands required!

Format:

The file, configs/regexrestrict.cfg, is structured in typical SM structure.
To group a bunch of patterns to specific rules, put them all into a subsection together.

Ex.

Code:
"Censor"
{
	"ExampleBlock"
	{
		"chatpattern"		"fuck 'CASELESS'"
		"warn"				"Don't say that!"
		"replace"			"FACK"
	}
}
Here are the usable blocks:

Chat Pattern: Search for a pattern

Code:
"chatpattern" "pattern 'flags'"
Multiple flags can be used, seperate them with a |.
If no flags are set, omit the delimiting single quote characters.
You may also delimit the pattern with single quotes for prettiness, ala:

Code:
"chatpattern" " 'pattern' 'flags' "
Valid Flags:
Code:
CASELESS - Ignore Case.
MULTILINE - Multilines (affects ^ and $ so that they match the start/end of a line rather than matching the start/end of the string).
DOTALL - Single line (affects . so that it matches any character, even new line characters). 
EXTENDED - Pattern extension (ignore whitespace and # comments).
UNGREEDY - Invert greediness of quantifiers
UTF8 - Use UTF-8 Chars */
NO_UTF8_CHECK - Do not check the pattern for UTF-8 validity (only relevant if PCRE_UTF8 is set)
Warn: Display a warning message to the player

Code:
"warn" "msg"
Allows you to give fair warning about your rules when they are broken

Action: Executed if a pattern matches

Code:
"action" "rcon action"
"rcon action" can be any command you want, but there may be only one action per section.

%n, %i, and %u will be replaced with the clients name, index, or userid, respectively, if they are in the command string.

Block: Block the text absolutely

Code:
"block" "1"
Very simple, skips all the replacement stuff, does not skip the limiting step, so you can block and limit at the same time (limit the amount of times one can attempt to say it, and also block the words from being said)

Limit: Limit the amount of times a piece of text can be said

Code:
"limit" "number"
Also simple, will block if the client says the pattern more times than "number"

Forgive: Forgives one indiscretion every x seconds

Code:
"forgive" "x"
Allows more flexibility with limiting. It might be ok to advertise once every five minutes, not every five seconds, so you can "forgive" a slip up every "x" seconds.

Punish: executes a punishment command if limit is exceeded

Code:
"punish" "cmd"
"cmd" can be any command you want, but there may be only one punishment per section.

%n, %i, and %u will be replaced with the clients name, index, or userid, respectively, if they are in the command string.

Replace: I think you get it

Code:
"replace" "with"
Will replace the pattern's matches with "with", and check everything again. This can cause an avalanche effect if "with" matches a previous pattern somehow, rendering many changes, which wastes CPU, but can render interesting messages.


Replace Pattern: Replace against a pattern

To be added soon, currently just deletes based on pattern


To do:
Allow name and command enforcement

Have fun!

Edit: Altered slightly; will now accept a map based regex file, of the format "regexfilter_MAPNAME.cfg", and will power off if no regex filter files are found (for efficiency reasons).
JoinedSenses is offline