Tsuserver 3.3 released

After 3 weeks of development, I am ready to announce the release of tsuserver 3.3. It includes a near-complete restructuring of the command, storage, and logging backends, intended to fit the architectural needs of the server (whereas the old architecture grew over itself until it became a mess).


Full database integration via SQLite

Existing data will be migrated automatically to the new database format.

Sample queries:

  • SELECT bans.ban_id, ip_bans.ipid, reason FROM bans JOIN ip_bans ON ip_bans.ban_id = bans.ban_id JOIN ipids ON ipids.ipid = ip_bans.ipid;
  • SELECT event_time, ipid, room_name, char_name, ooc_name, message, type_name FROM room_events JOIN room_event_types ON event_subtype = type_id ORDER BY event_time DESC LIMIT 50;

To run these, use the sqlite3 command line interface and do .mode column and .header on for pretty results.

Simplified logging

All logs go through the database, but a limited classic event log is still available in logs/server.log. Its format has been drastically simplified.

Hot reloading of chat commands

The /refresh command will reload all chat commands from their Python source without interruption.

Stricter iniswap checking

You can place char.ini files in characters/<character>/char.ini to enforce even more stringent checking for custom content.
If an emote does not have the same preanimation, animation, and SFX as described in the server’s INI file, the emote is blocked.

No more ghost clients

Ghost clients caused by webAO have been fixed.

Change in ban logic

Banning an IPID no longer bans every HDID that was associated with that IPID. Instead, IPID and HDID bans have been separated from each other. HDIDs can still be banned with the /banhdid command.

Ban durations

There is a new ban syntax:

  • /ban <ipid> "reason" ["<N> <minute|hour|day|week|month>(s)|perma"]
    By default, bans are 6 hours long.
  • /ban <ipid> <ban_id>
    This commands adds another IPID (or HDID if /banhdid is used) to an existing ban record.

Ban information

The last 5 bans can be listed with /bans. Full ban information (such as who initiated the ban, unban time, affected IPIDs/HDIDs, etc.) can be listed with /baninfo.

Sample config

The sample config has been commented to include explanations of settings.


A major effort in dead code removal and documentation was made.


I have tried my best to find bugs and test things out. However, there may be some things that broke and things that are still broken (like evidence). Bugs that are related to commands can be hot-patched without restarting the server, but other bugs will require a server restart. Regardless, please help me find these bugs and report them immediately.


You can update via Git or by downloading the latest master zip file. You may also wish to revise the new config sample.

The database migration only goes one way. Be sure you are ready to perform the update before you commit to it.

Git is also a new dependency! You must install Git for the server to work.

Final Remarks

After this update, I probably will not be making any further additions to tsuserver. I want to focus on the larger redesign.


Good job. :placeholder:

I already fear the people asking how to install git

The fear is understanding