Every user who connects to an sb0t room is assigned a level that controls what actions they can perform. Levels range from a plain chat participant all the way up to the room owner. Understanding this hierarchy is essential before configuring accounts, permissions, or scripts.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.
The ILevel Enum
sb0t exposes user levels through theILevel enum (defined in iconnect/ILevel.cs):
IUser.Level. Scripts read this property to gate privileged actions. The numeric value increases with privilege, so guard checks typically use >=:
Level Descriptions
Regular (0)
Default level for every new connection. Can send public messages, use private messages, share files, and interact with the standard Ares client UI. Cannot run any moderation commands.
Moderator (1)
Trusted users with limited moderation access. Can use commands configured at the Moderator threshold — typically muting, moving, or warning users. Flood notices sent with
Server.Print(ILevel.Moderator, ...) are only visible to Moderators and above.Administrator (2)
Full moderation capability: banning, muzzling, redirecting, managing the word filter, and viewing internal notices. Most day-to-day admin tasks require at least this level.
Host (3)
The highest assignable level. Has all Administrator capabilities plus the ability to promote or demote other users (including granting Administrator). A user with
IUser.Owner == true is always Host and is the single room owner account.Capability Comparison
| Capability | Regular | Moderator | Administrator | Host |
|---|---|---|---|---|
| Send public chat | ✅ | ✅ | ✅ | ✅ |
| See moderator notices | ❌ | ✅ | ✅ | ✅ |
| Muzzle / unmuzzle users | ❌ | ✅† | ✅ | ✅ |
| Kick / ban users | ❌ | ✅† | ✅ | ✅ |
| Manage word filter | ❌ | ❌ | ✅ | ✅ |
Promote users via /setlevel | ❌ | ❌ | ❌ | ✅ (owner) |
| Load / unload scripts | ❌ | ✅‡ | ✅‡ | ✅‡ |
| Room owner commands | ❌ | ❌ | ❌ | ✅ (owner) |
CommandLevel assignment.‡ Controlled separately by the
ScriptLevel setting — see below.
The Room Owner Account
Theowner setting holds a plaintext password for the single room owner account. When a user logs in with this password, sb0t sets IUser.Owner = true and IUser.Level = ILevel.Host. The owner flag cannot be granted to any other account:
owner). Change it through the server’s GUI settings panel.
Password Accounts (AccountManager)
Non-owner elevated accounts are stored in a SQLite database at:accounts table schema:
ILevel value (0–3), the user’s Ares GUID, and a SHA-1 hash of their password. Passwords are never stored in plaintext.
Registering an Account
A user registers by sending the/register <password> command. The password must be at least 2 characters long and contain at least one letter and one digit:
ILevel.Regular. The room Owner must then promote the account using the /setlevel <user> <level> command or through the server GUI.
Promoting an Account
After a user has registered and is online, the room Owner uses the/setlevel <user> <level> command (0–3). This sets client.Level to the requested level and calls AccountManager.UpdateAccount(admin, client), which writes the new level back to the database so the elevated level persists across reconnections.
Strict Mode
When thestrict setting is true, login lookups are limited to accounts whose stored GUID matches the connecting client’s GUID. This prevents one user from authenticating with another user’s password from a different machine.
Auto-Login (autologins.xml)
The auto-login system grants a fixed level to a user on join without requiring a password. Entries are stored inautologins.xml in the server’s data path and are matched by both GUID and the first two octets of the external IP address:
Numeric
ILevel value: 0 = Regular, 1 = Moderator, 2 = Administrator, 3 = Host.The 128-bit Ares client GUID in standard hyphenated format.
The user’s last known external IP address. The first two octets are used for range-aware matching so users on the same /16 subnet still auto-level even after a minor IP change.
AutoLogin.GetLevel() returns the stored level and the server applies it automatically on join — no password prompt required.
Script Level (ScriptLevel)
ScriptLevel is a byte setting (0–4) that restricts who may load or unload server-side JavaScript scripts:
| ScriptLevel value | Who can manage scripts |
|---|---|
0 | Nobody (scripts locked) |
1 | Moderator and above |
2 | Administrator and above |
3 | Host and above |
4 | Room owner only |
ScriptLevel in the GUI’s Settings → Scripting panel.
When
Settings.DisableAdmins is true (toggled at runtime, not persisted to disk), all admin-level commands are suspended for the current session. Users retain their assigned ILevel but command handlers return early without executing. This flag is intended as an emergency lockdown and is reset when the server restarts.