Overview
A bot for a Fluxer chat server (Fluxer is an open-source chat platform in the style of Discord). It answers !seppo <command>: the next Formula 1 weekend, translation between 33 languages, and 40 Mass Effect characters who rewrite your message in their own voice.
Why I built it
Moving a chat community off Discord meant leaving the old Discord bot behind. Instead of porting it line by line, Seppo started from scratch on Fluxer.
How it works
No client library
Seppo talks to Fluxer’s REST API and gateway directly, with the standard library plus websockets. Every command is addressed by name (!seppo help), because with several bots in one channel a bare !help makes all of them answer.
Two environments
New features are built against a private Fluxer instance running in Docker on a laptop. Production runs a pinned release tag, so a change only reaches the real server when a release is made, and rolling back is checking out the previous tag. The bot gets only the permissions it needs, never administrator, so a leaked token cannot damage the server.
The AI commands are add-ons
Translation and the characters come from karjix-ai as add-ons, so the bot’s own repo holds no AI code.
- Translate:
!seppo translate fi: Hur mår alla idag?, or reply to a message with!seppo translate. Each person can set the language they want replies translated into. - Characters:
!seppo Mordin We play at nine tonightposts the line as Mordin, with his portrait, and removes the command. The original text stays in the small grey line underneath, so if the model gets it wrong, everyone can still see what was meant. The characters are built from real lines on the Mass Effect Wiki, checked word for word, and some have rules sent with every rewrite: a hanar never says “I”, only “this one”, and an elcor opens with the emotion (“With barely contained excitement: …”).
What I learned
- A language code on its own collides with real words: “ja”, “it” and “de” all mean something. Picking a language needs a colon (
fi:). - The smallest model sometimes posted a famous quote instead of rewriting the message. Moving that job to a 12B model fixed it.
- A box (embed) around every reply made the chat read like a form. Boxes are now only for
!f1and help; everything else is plain text.
What’s next
More of what the local models can do: image understanding, and replies from jobs that run overnight.