Last October I wrote a small Discord bot for a friend who needed help with managing reactions in a guild with over 38,000 members.

Tessa provides as its core functionality the ability to automatically fill up public posts with a predefined set of reactions in order to prevent people from adding their own, while still allowing them to react in some way. Our intention with this was to make it impossible for trolls and edgy teens to post inappropriate reactions to announcements and social media feed notifications in a PG-13 server. The bot has served us well for over 8 months. More recently I added functionality to moderate inappropriate reactions to messages in order to catch people thinking they are oh so quirky and clever posting purple vegetables in response to posts about serious subjects. (Yes, I know aubergine is technically a fruit. That’s not the point. 🙄)

Because I really don’t feel like figuring out how to build a whole web-based configuration system for Tessa right now, it has a couple of major limitations:

  • No public instance.
    If you want to run your own instance of Tessa you will have to obtain your own Discord API token (admittedly this is not difficult, just tedious). If I know you I may be willing to add your guild to my instance if you ask nicely, though.
  • No configuration UI.
    Configuration must be written by hand into a JSON file (tessa.jsonc) that supports C-style comments. I do provide an example configuration file as part of the source code, though.

Ultimately though, for my friend and I’s use case what really matters is that Tessa does its job. Plus we don’t need to alter its configuration very often.

Last night I tagged its first “proper” release as version 0.1.0, after rewriting the reaction moderation logic last night to use on_raw_reaction_add() instead of on_reaction_add() — something I had been putting off for months despite it being a rather trivial change (yeah, I surprise myself with my laziness sometimes). For a project this small I feel like version numbers do not particularly matter, but I guess it’s good to have a reference point where I can say “yes, this does what it is meant to do even if it’s not pretty”.

UPDATE (2023-07-28): I’ve just tagged version 0.1.1 to addresss some major issues with large or overly active Discord guilds.