/town/our, a tildebrained irc bot

published on 2023-07-23 by dzwdz

tl;dr: <our> is an IRC bot on tilde.town. Commands are just executables in a world-writeable directory. If you’re on town, you can create new commands just by putting a script in /town/our.

Lowering the barrier to entry by so much gave us a pretty nice bot ecosystem, and has just proven to overall be a bunch of fun.


18:56 <dzwdz> i like the idea of having every command be a separate binary
18:59 <opfez> it does make for rather composable programs (in some cases)
18:59 <opfez> netcat is neat
18:59 <dzwdz> i meant in a [irc] bot
18:59 <dzwdz> you could create new commands very quickly
19:01 <dzwdz> wait do we have bwrap on here
19:01 <dzwdz> idea: a bot which works like this
19:01 <dzwdz> where the command directory is public
19:01 <dzwdz> so anyone could drop a script there to create a new command
19:01 <opfez> sounds pretty cool
19:01 <opfez> very pubnixy
19:03 <opfez> every command gets run with arguments specifying the user that called the command and (if necessary), additional arguments to the command

Basically, at the time I’ve been thinking about making an sh(1) bot framework which would store each command in a separate script. But, I’ve realized:

  1. if the commands are in separate scripts, they could as well just be arbitrary executables
  2. the command directory could be world-writeable

I grabbed a basic Ruby bot framework I’ve made the other day, and quickly prototyped jsbot’s weird cousin.

19:49 --> our (beep boop) (dzwdz@localhost) has joined #tildetown
19:49 <dzwdz> our/greet
19:49 <our> hi dzwdz!dzwdz@localhost from #tildetown
19:49 <opfez> \o/
19:49 <dzwdz> /home/dzwdz/code/town/our/cmds
19:49 <dzwdz> world writeable
19:49 <dzwdz> have fun
19:50 <@vilmibm> whee

Others soon started playing with it. ~vilmibm immediately made some commands in Go, for example.

19:56 <elly> our/../../../../../../../bin/ls
19:56 <elly> hm! definitely thought that would work :P
19:56 <dzwdz> first off
19:56 <dzwdz> how dare you assume i'm such a bad programmer
19:56 <dzwdz> second off
19:56 <dzwdz> our/../../../bin/echo lol
19:56 <our> dzwdz!dzwdz@localhost lol #tildetown

20:13 <@vilmibm> dzwdz: i linked /home/dzwdz/code/town/our/cmds to /town/our

another (kind) bot

After making the proof of concept bot, I just left it running with no other changes. If it ain’t broke, don’t fix it.

Except it was broke and I wasn’t fixing it. Thus, ~kindrobot took over.

04:01 <kindrobot> our/timefor dzwdz
04:01 <our> Wed, 24 Aug 2022 06:01:15 +0200
04:14 <kindrobot> dzwdz: (when you wake up) for your consideration: I added forking, a persistence data dir, and limited configuration to our. You can check it out in #bots
04:15 <kindrobot> You can use "your/..." followed by "your/town" (or any other command) to test forking
04:15 <kindrobot> You can use "your/count" to test persistence.

…then our got her a job at Wikimedia.

19:59 <kindrobot> When I was interviewed at Wikimedia, I talked about the "our" project that I've contributed a bit to. It seemed like the most relevant to what they were doing which is user defined functions for Wikipedia.
19:59 <dzwdz> i can't believe i got the job at wikipedia
19:59 <kindrobot> Yeah good job dzwdz :)

sample commands

Look, our is just like any other IRC bot, and the commands people have made are about what you’d expect. Some are just typical utility commands:

<dzwdz> our/timefor dzwdz
<our> Sun, 23 Jul 2023 18:47:44 +0200
<dzwdz> our/w Kraków
<our> Cracow, , Poland | Sunny 28°C (82°F) (feels 29°C (84°F)) | 33% humidity | 1012 hPa

Some are fortune-style commands.

<dzwdz> our/qotd
<our> 00:50:58 <daisy> "i like to practise my bakery baking bakery in the bakery"
<dzwdz> our/plan9/fortune
<our> Did you know ... that no-one ever reads these things?

Some play well-known sports.

<our> your/ping 
<your> our/pong 
<our> your/ping 
<your> our/pong 
<our> your/ping 
<your> our/pong 
<our> your/ping 
<your> our/pong 

The one I personally use the most, though, is our/sh. It’s handy both to explain *nix stuff live, and to just do all sorts of ad-hoc stuff.

[...] [someone was learning about /dev/shm and tmpfs]
<dzwdz> /dev/shm IS tmpfs
<dzwdz> our/sh grep /dev/shm /proc/mounts
<our> tmpfs /dev/shm tmpfs ro,nosuid,nodev,inode64 0 0

<dzwdz> i'm going to try to write a small article about our
<dzwdz> how bad of a title is "/town/our, a tildebrained irc bot"
<dzwdz> also does anyone have #tildetown logs from around 1650394568
<dzwdz> our/sh date -d @1650394568
<our> Tue Apr 19 18:56:08 UTC 2022
<dzwdz> login, maybe?
[~login did turn out to have the logs. thanks for sending them over <3]

“sandboxes are for little children with tonka trucks”

14:37 <nihilazo> our/sh rm *
14:37 <dzwdz> nico what the fuck

First off—don’t get the wrong idea here. This wasn’t malicious. ~nihilazo was just messing around, knowing that I implemented sandboxing. (also, note that this happened not even 24 hours after the bot went live)

But yeah, it’s safely sandboxed using bubblewrap. The entire filesystem is remounted ro, except a single directory for persistent data, a fresh /tmp/, and a fresh devtmpfs (for /dev/null). The uid is also spoofed to 0, but that’s just for shits and giggles.

That being said, the IRC is only accessible internally, so if you can send our commands, you can also just run the commands yourself. Everything’s logged, too.

where’s the source

If you must, the source’s at git.tilde.town. Note that: