Second iteration of Tsoder. Chat bot for Tsoding streams.
Keep in mind that we are not using any Haskell packages from nixpkgs. All of the dependencies are supposed to be downloaded by cabal or stack during the build.
$ nix-shell
$ cabal sandbox init
$ cabal install happy-1.19.9
$ cabal install --only-dependencies --enable-tests
$ cabal build
$ cabal test
$ cabal run HyperNerd secret.ini database.db
See Nix-style Local Builds for more info
$ nix-shell
$ cabal v2-build
$ cabal v2-test
$ cabal v2-run exe:HyperNerd secret.ini database.db
Native dependencies:
- OpenSSL
- zlib
$ stack build
$ stack exec hlint .
$ stack exec HyperNerd secret.ini database.db
The secret.ini
file consist of three optional sections.
[twitch]
nick = HyperNerd
channel = Tsoding
password = <oauth-token>
clientId = <client-id-token>
owner = <your-name>
[discord]
authToken = <auth-token>
guild = <guild-id>
channels = [<channel-id-1>, <channel-id-2>, ... ]
[github]
apiKey = <oauth-token>
name | description |
---|---|
nick |
Nickname of the bot. |
owner |
Owner of the bot. The bot will recognize this name as an authority regardless of not being a mod or broadcaster. |
password |
Password generated by https://twitchapps.com/tmi/. oauth: prefix is the part of the password. |
channel |
Channel that the bot will join on start up. |
clientId |
Client ID for Twitch API calls. |
name | description |
---|---|
authToken |
Authentication Token for the bot: https://github.com/reactiflux/discord-irc/wiki/Creating-a-discord-bot-&-getting-a-token |
guild |
The id of the guild the bot listens to |
channels |
The list of ids of channels the bot listens to (the list is parsed as a Haskell list: [<channel-id-1>, <channel-id-2>, ... ] ) |
name | desc |
---|---|
apiToken |
https://help.github.com/en/articles/creating-a-personal-access-token-for-the-command-line |
With secrets existing in volume defined in docker-compose.yaml
,
$ docker-compose up --build
$ docker build --target app -t hypernerd .
$ mkdir hypernerd-state
$ cp secret.ini hypernerd-state
$ docker create -v /absolute/path/to/hypernerd-state/:/tmp/hypernerd/ \
--name hypernerd-bot hypernerd
$ docker start -a hypernerd-bot
$ docker stop hypernerd-bot
$ docker exec -it hypernerd-bot sh
To trigger a Markov chain response, just mention the bot in the chat.
The Markov model is a csv file that is generated from the logs in the
bot's database file using the Markov
CLI utility:
$ cabal exec Markov train database.db markov.csv
This command will produce the markov.csv
file.
$ cabal exec HyperNerd secret.ini database.db markov.csv
The markov.csv
file is not automatically updated. To update the file
with the new logs you have to run the Markov
CLI utility again.
You can assign a command alias to any command:
<user> !test
<bot> test
<user> !addalias foo test
<user> !foo
<bot> test
The aliases are "redirected" only one level deep meaning that transitive aliases are not supported:
<user> !addalias bar foo
<user> !bar
*nothing, because !bar is redirected to !foo, but further redirect from !foo to !test does not happen*
Motivation to not support transitive aliases is the following:
- They are not needed in most of the cases. Generally you just have a main command and a bunch of aliases to it.
- Support for transitive aliases requires to traverse and maintain a "tree" of aliases, which complicates the logic and degrades the performance.
!addquote <quote-text>
-- Add a quote to the quote database. Available only to subs and mods.!delquote <quote-id>
-- Delete quote by id. Available only to Tsoding.!quote [quote-id]
-- Query quote from the quote database.
You can support my work via
- Twitch channel: https://www.twitch.tv/subs/tsoding
- Patreon: https://www.patreon.com/tsoding