BlazeBans/Punishing players

Durations and flags

The optional parts of a punishment command: how long it lasts, and the switches that change how it is recorded and announced.

Duration syntax

A duration is a number and a unit, with no space between them. Several can be chained.

minecraft
/mute Steve 30m Spam
/ban Steve 7d Griefing
/ban Steve 1d12h Griefing
/ban Steve 2w3d Repeated griefing
UnitAccepted formsLength
Secondss, sec, second, seconds1 second
Minutesm, min, minute, minutes60 seconds
Hoursh, hr, hour, hours60 minutes
Daysd, day, days24 hours
Weeksw, week, weeks7 days
Monthsmo, month, months30 days
Yearsy, yr, year, years365 days

Months are always 30 days and years are always 365. They are shorthand, not calendar arithmetic, so 1mo from 1 January expires on 31 January.

Decimals are accepted and rounded to the nearest second, so 1.5h is 90 minutes.

Permanent

minecraft
/ban Steve permanent Cheating
/ban Steve perm Cheating
/ban Steve forever Cheating
/ban Steve Cheating

All four are permanent. Omitting the duration entirely is the same as writing permanent, because the first word is only read as a duration if it parses as one. Cheating does not, so it becomes the reason.

That is also why a reason starting with a duration-like word needs care. /ban Steve 30 day ban for griefing reads 30 as an invalid duration and stores the whole thing as the reason. Use a template or reword it.

How durations are displayed

Remaining time is compacted to two units at most: 2d 4h, 45m, 3h 20m. Anything under a minute shows in seconds. Permanent punishments show the text from placeholder-api.values.permanent, which defaults to Permanent.

Caps

If your rank has a duration limit, a longer duration is refused with a message naming your maximum. It is not silently trimmed.

Flags

Flags go after the reason and can be combined in any order.

FlagEffectPermission
--silent, -sNo staff broadcast, no public broadcast, no Discord postblazebans.silent
--proof <url>Attaches evidence to the recordnone
--previewShows the result without storing itnone
--ipAlso matches on the player's stored IPblazebans.ip
--scope <value>Sets which servers enforce itsee below
--punisher <name>Records a different issuer. Console onlyconsole only
minecraft
/ban Steve 30d Cheating --silent --proof https://imgur.com/a/example
/mute Steve 1h Spam --scope server:global
/ban Steve Cheating --preview

--silent

Suppresses announcements, not the record. The punishment is stored with its silent flag set, appears in history normally, and is enforced normally. Staff who need to know can still look it up.

Without blazebans.silent, the flag is rejected and the command does nothing, rather than running loudly. Tab completion only offers --silent to staff who hold the node.

--proof

Takes one URL with no spaces.

minecraft
/ban Steve 30d Cheating --proof https://imgur.com/a/example

The URL is checked before it is saved. Anything containing whitespace, <, >, quotes, or backslashes is rejected rather than stored. A bare domain gets https:// prefixed.

BlazeBans also picks up a URL sitting loose in the reason, so /ban Steve 30d Cheating https://imgur.com/a/example attaches it too. Being explicit is better, because it keeps the URL out of the stored reason text.

Proof appears on the record, in /proof view, and as an "Open proof" button on the Discord embed. See Proof.

--preview

Runs every check and reports what would happen. Nothing is written, nobody is removed, nothing is announced. Useful for confirming what a template resolves to before applying it to a real player.

--ip

Widens the match to the player's stored IP address, so other accounts on that address are covered.

This needs privacy.store-ip-addresses: true. With IP storage off, there is no address on file and the flag has nothing to match.

/ipban and /ipmute are the same behaviour as dedicated commands, which is usually clearer for staff and easier to gate with a separate permission.

--scope

Sets which servers enforce the punishment.

ValueMeaning
server:globalEverywhere sharing this database
server:thisThis server only
server:<id>One named server

global, all, *, server:all, and server:* are all accepted for global. Anything else unrecognised is read as a server ID.

Global scope needs blazebans.scope.global. A specific server needs blazebans.scope.server.<id>, unless it is the server you are on, which is always allowed. See Servers and scope.

--punisher

Records the punishment against a different name:

minecraft
/ban Steve 30d Cheating --punisher Alex
/ban Steve 30d Cheating --punisher Anti-cheat
/punish Steve Cheating --punisher Anti-cheat

Console only. A player running it gets an error.

The name replaces the issuer everywhere one appears: /history, /staffhistory, staff profiles, and the Discord post.

Two uses:

Attributing a decision to the person who made it. An appeals panel or Discord bot acting through the console can credit the staff member who approved the action rather than CONSOLE.

Naming the system that acted. An anticheat or chat filter punishing through BlazeBans should identify itself, or every automated punishment on your server is indistinguishable from an administrator typing at the console.

minecraft
/punish Steve Cheating --punisher Anti-cheat

Combining it with /punish is worth doing: automated punishments then escalate on the same ladders as manual ones, instead of the detector applying a policy of its own.

The flag captures everything up to the next flag or the end of the line, so multi-word names work as long as it comes last or before another -- flag:

minecraft
/ban Steve 30d Cheating --punisher Chat Filter --silent

See Best practices for why this matters to how your history reads later.

Flags on revocations

/unban, /unmute, and /unwarn accept --silent and -s. Everything else in their arguments is treated as the revoke reason.

minecraft
/unban Steve Appeal accepted
/unban Steve Appeal-Accepted
/unmute Steve --silent

The second line uses an unban template, which can carry its own broadcast. See Revoking and editing.