anonstream/HACKING.md

2.4 KiB

Hacking

By default anonstream has two APIs it exposes through two UNIX sockets: the control socket control.sock and the event socket event.sock. If the platform you are using does not support UNIX sockets, they can be disabled in the config.

Control socket

The control socket allows reading and modifying internal state, e.g. setting the title or changing a user's name. Currently the control socket has checks to see if what you're doing is sane, but they're not comprehensive; you could craft commands that lead to undefined behaviour. If you have socat, you can use the control socket interactively like this:

rlwrap socat STDIN UNIX-CONNECT:control.sock

rlwrap only adds line editing and is optional. If you don't have it you can still get (inferior) line editing by doing:

socat READLINE UNIX-CONNECT:control.sock

Once connected, type "help" and press enter to get a list of commands.

Event socket

The event socket is a read-only socket that sends out internal events as they happen. Currently the only supported event is a chat message being added. The intended use is to hook into other applications that depend on chat, e.g. text-to-speech or Twitch Plays Pokémon.

View events like this:

socat UNIX-CONNECT:event.sock STDOUT

Sidenote, this will still read from stdin, and if you send anything on stdin the event socket will close itself. If you want to ignore stdin, I couldn't figure out how to get socat to do it so you can do it like this:

cat > /dev/null | socat UNIX-CONNECT:event.sock STDOUT

If you do this cat will not exit when the connection is closed so you will probably have to interrupt it with ^C.

Examples

If you have jq you can view prettified events like this:

socat UNIX-CONNECT:event.sock STDOUT | jq

(On older versions of jq you have to say jq . when reading from stdin.)

Use this to get each new chat message on a new line:

socat UNIX-CONNECT:event.sock STDOUT | jq 'select(.type == "message") | .event.nomarkup'
Text-to-speech

This command will take each new chat message with the prefix "!say ", strip the prefix, and synthesize the rest of the message as speech using espeak:

socat UNIX-CONNECT:event.sock STDOUT \
| jq --unbuffered 'select(.type == "message") | .event.nomarkup' \
| grep -E --line-buffered '^"!say ' \
| sed -Eu 's/^"!say /"/' \
| jq -r --unbuffered \
| espeak