sb0t gives administrators several overlapping tools for dealing with disruptive users: temporary bans, permanent bans, subnet/ASN bans, muzzles, quarantine, and cross-room redirects. Each mechanism stores its state in a separate file under the server’s data directory so they survive restarts independently.Documentation Index
Fetch the complete documentation index at: https://mintlify.com/AresChat/sb0t/llms.txt
Use this file to discover all available pages before exploring further.
How Ban Matching Works
Every ban check tests both the user’s external IP address and their Ares GUID. A user cannot evade a ban by simply reconnecting, because both identifiers must clear:Bans.cs, Muzzles.cs, and RangeBans.cs.
Standard Bans
Ban Durations
Short-lived room bans (managed bycommands/Bans.cs) use the BanDuration enum:
Tick() loop compares elapsed time against the duration and automatically unbans the user when it expires, printing a room notice using the Timeouts template:
bans.xml in the server data path.
Permanent Bans (BanSystem)
core/BanSystem.cs manages the persistent ban list stored in the SQLite database banned.dat. These bans have no expiry — they remain until an administrator explicitly removes one:
ident used to reference the ban when removing it.
Banning from a Script
The scripting layer exposesuser.ban() on the JS user object:
userobj.ban() invokes IUser.Ban() directly; the owner account is protected and cannot be banned even via scripting.
Auto-Clearing Bans
BanSystem.AutoClearBans() is called every 2 seconds from the server loop. When the auto_ban_clear_enabled setting is true, it computes:
BansAutoCleared scripting event fires afterwards so scripts can log or react to the clearance.
Range Bans
Range bans block entire IP prefixes. sb0t checks whether a connecting user’s IP starts with a stored prefix string:"203.0.113." blocks every address in 203.0.113.0/24, while "203.0." blocks the full /16. Entries are stored in rangebans.xml:
#rangeban add <prefix> (requires Administrator+) to add an entry, or manage entries through the GUI ban panel.
ASN Bans
Autonomous System Number (ASN) bans block entire hosting networks, ISPs, or VPN providers in one entry. sb0t callsclient.GetASN() at join time and checks the result against the stored list:
asnbans.xml:
#asnban add <number> and list current entries with #asnban list. Each entry is displayed as AS<number> for readability.
Muzzles
Muzzling silences a user — their messages are discarded — without removing them from the room. Like bans, muzzles match on both IP and GUID:muzzles.xml. A muzzled user who rejoins the room is still muzzled.
Muzzle Timeout
TheMuzzleTimeout setting (registry key mtimeout, type byte) specifies an auto-unmuzzle duration in minutes. When MuzzleTimeout > 0, the Muzzles.Tick() loop removes expired entries and broadcasts an unmuzzle notice using the Timeouts template:
MuzzleTimeout to 0 to make muzzles permanent until manually lifted.
Kiddie / Quarantine State
A “kiddied” user is placed into quarantine. TheKiddied list tracks GUIDs in memory (not persisted to disk — the list clears on restart):
IUser.Quarantined == true) cannot interact normally with the room. When a user successfully logs in with a valid password account, client.Unquarantine() is called automatically to release them from quarantine.
Use #kiddie <name> to quarantine a user and #unkiddie <name> to release them.
Redirect
IUser.Redirect(hashlink) sends the client a cross-room redirect packet, moving them to a different Ares chatroom:
hashlink must be a valid encrypted Ares room hashlink (validated at filter-add time). Redirects are used both by administrators and as a FilterType.Redirect action in the word filter.
In scripts, call userobj.redirect(hashlink):
Proxy Detection
core/Proxies.cs maintains two blocklists that are checked at connection time:
- IP range blocklist — a hardcoded list of known VPN and proxy provider ranges (HotSpot Shield, CyberGhost, Spotflux, etc.).
- DNS keyword blocklist — checks the reverse-DNS hostname for keywords such as
"vpn","cloud","hide","cyberghost","softlayer", and others. - Tor exit node list — downloaded periodically from
https://www.dan.me.uk/torlist/and cached locally intor.dat. The list refreshes at a randomised interval between 5.5 and 12 hours.
Proxies.Check(ip, dns) returns true, the server fires the ProxyDetected scripting event. If the event handler returns true (or no script handles it), the connection is dropped.
Failed Login Tracking
commands/LoginAttempts.cs tracks consecutive failed password attempts per GUID. Each invalid attempt increments the counter; AccountManager.Login() fires Events.InvalidLoginAttempt(client) on failure, which scripts can intercept to auto-muzzle or ban repeat offenders:
LoginAttempts.Remove(client)) or when LoginAttempts.Clear() is called.
IBan Interface
Permanent ban entries exposed to scripts implementIBan:
BanSystem.Eval(action) and call ban.Unban() to remove individual entries programmatically.