Home

Awesome

Tsoding

HyperNerd

Build Status Good For Stream

HyperNerd

Second iteration of Tsoder. Chat bot for Tsoding streams.

Quick Start

NixOS

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.

Cabal v1-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

Cabal v2-build

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

Stack

Native dependencies:

$ stack build
$ stack exec hlint .
$ stack exec HyperNerd secret.ini database.db

Example of a secret.ini file

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>

Twitch Config Section

namedescription
nickNickname of the bot.
ownerOwner of the bot. The bot will recognize this name as an authority regardless of not being a mod or broadcaster.
passwordPassword generated by https://twitchapps.com/tmi/. oauth: prefix is the part of the password.
channelChannel that the bot will join on start up.
clientIdClient ID for Twitch API calls.

Discord Config Section

namedescription
authTokenAuthentication Token for the bot: https://github.com/reactiflux/discord-irc/wiki/Creating-a-discord-bot-&-getting-a-token
guildThe id of the guild the bot listens to
channelsThe list of ids of channels the bot listens to (the list is parsed as a Haskell list: [<channel-id-1>, <channel-id-2>, ... ])

GitHub Config Section

namedesc
apiTokenhttps://help.github.com/en/articles/creating-a-personal-access-token-for-the-command-line

Docker-Compose

With secrets existing in volume defined in docker-compose.yaml,

$ docker-compose up --build

Docker

$ 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

Markov Chain Responses

To trigger a Markov chain response, just mention the bot in the chat.

Training the Markov Model

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.

Using the Trained Markov Model with the Bot

$ 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.

Command Aliases

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:

Quote Database

Support

You can support my work via

<!-- TODO(#427): Markov training is not automated -->