BlazeBans/Automatic enforcement

AutoMod

Chat filtering that mutes automatically when a message matches a rule. It ships disabled, because what should be filtered is your decision and a badly tuned filter is worse than none.

Everything lives in automod.yml.

Turning it on

yaml
chat:
  enabled: true
  mute-duration: "1d"
  mute-reason: "AutoMod"
  silent: false
  attempt-cancel: true
KeyEffect
enabledMaster switch
mute-durationHow long an automatic mute lasts
mute-reasonThe reason recorded on the punishment
silentHide automatic mutes from public announcements
attempt-cancelTry to stop the message reaching chat as well as muting

attempt-cancel should stay on. Without it the player is muted but the offending message still appears, which defeats the point.

An automatic mute is an ordinary MUTE record. It shows in /history with AutoMod as the reason, and it can be revoked with /unmute like any other.

Exact phrases

yaml
chat:
  exact:
    - "base64:bmlnZ2VyCg=="
    - "base64:ZmFnZ290"

Exact phrases are stored base64-encoded so the raw words are not sitting in plain text in your config directory. Decode a value to see what it matches, and encode your own the same way to add more.

The default list contains two slurs and nothing else. It is a starting point, not a policy.

Patterns

yaml
chat:
  regex:
    - "(?i)\\b(?:discord\\.gg|discord\\.com/invite)/[A-Za-z0-9-]+\\b"

Java regular expressions, checked against the whole message. The shipped pattern blocks Discord invite links.

Useful additions:

yaml
chat:
  regex:
    # Any web link
    - "(?i)https?://\\S+"
    # An IP address, which is usually a competing server
    - "\\b\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\b"
    # Six or more of the same character in a row
    - "(.)\\1{5,}"

Note that YAML needs backslashes doubled. \b in a regex is written \\b in the file.

Filtering commands too

yaml
chat:
  automod-commands:
    - "msg"
    - "tell"
    - "w"
    - "r"
    - "reply"

The arguments to these commands are scanned by the same rules. Without it, a filter is one /msg away from irrelevant.

Add anything on your server that carries text between players: party chat, guild chat, staff chat, mail, nicknames. Anything not listed is not scanned.

What staff see

When AutoMod acts, staff holding blazebans.staff.notify get an alert naming the player, the source, and the message that triggered it, hoverable so the offending text does not sit in staff chat.

The messages are automod-muted for the player and automod-muted-staff for the notification, both in messages/en_us.yml.

If Discord webhooks are enabled, the mute also posts there like any other punishment.

Bypassing

Grant blazebans.automod.bypass to anyone who should not be filtered. Staff usually qualify, since they need to quote what a player said in order to deal with it.

Tuning it

A filter is a tradeoff between missed abuse and false positives, and false positives cost more. Some things that help:

Start narrow. Turn it on with the shipped list only. Add rules when you see something the filter missed, not in anticipation.

Start short. A one-hour mute while you tune is enough to stop the behaviour and cheap to apologise for. Lengthen it once the rules have been quiet for a while.

Watch the alerts. For the first week, read every AutoMod notification. That is how you find the pattern that fires on a normal word.

Separate the two jobs. Slurs need an exact list. Advertising needs a pattern. Spam needs a repetition rule. Writing one regex that tries to cover all three will do all three badly.

Reloading

minecraft
/blazebans reload automod.yml

Takes effect immediately. Existing automatic mutes are unaffected by a rule change; only new matches use the new rules.