Connect to Twitch chat with Elixir.
The package can be installed by adding tmi
to your list of dependencies in mix.exs
:
def deps do
[
{:tmi, "~> 0.7.0"},
]
end
Documentation can be found at https://hexdocs.pm/tmi/readme.html.
You can use your own Twitch username, but it is recommended to make a new twitch account just for your bot. You'll also need an OAuth token for the password.
The simplest method to get an OAuth token (while logged in to the account your bot will use), use the Twitch Chat OAuth Password Generator.
Create a bot module to deal with chat messages or events:
defmodule MyBot do
use TMI
@impl TMI.Handler
def handle_message("!" <> command, sender, chat) do
case command do
"dice" ->
say(chat, Enum.random(~w(⚀ ⚁ ⚂ ⚃ ⚄ ⚅)))
"echo " <> rest ->
say(chat, rest)
"dance" ->
me(chat, "dances for #{sender}")
_ ->
say(chat, "unrecognized command")
end
end
def handle_message(message, sender, chat) do
Logger.debug("Message in #{chat} from #{sender}: #{message}")
end
end
handle_connected(server, port)
handle_logged_in()
handle_login_failed(reason)
handle_disconnected()
handle_join(chat)
handle_join(chat, user)
handle_part(chat)
handle_part(chat, user)
handle_kick(chat, kicker)
handle_kick(chat, user, kicker)
handle_whisper(message, sender)
handle_whisper(message, sender, tags)
handle_message(message, sender, chat)
handle_message(message, sender, chat, tags)
handle_mention(message, sender, chat)
handle_action(message, sender, chat)
handle_unrecognized(msg)
handle_unrecognized(msg, tags)
First we need to go over the config options.
:bot
- The module thatuse
sTMI
and implements theTMI.Handler
behaviour.:user
- Twitch username of your bot user (lowercase).:pass
- OAuth token to use as a password, prefixed withoauth:
.:channels
- The list of channels to join (lowercase).:mod_channels
- The list of channels where your bot is a moderator (this effects the message and command rate limits).
config :my_app,
bots: [
[
bot: MyApp.Bot,
user: "myappbot",
pass: "oauth:myappbotpassword",
channels: ["mychannel", "foo"],
mod_channels: ["mychannel"],
debug: false
]
]
[bot_config] = Application.fetch_env!(:my_app, :bots)
children = [
# If you have existing children, e.g.:
Existing.Worker,
{Another.Existing.Supervisor, []},
# Add the bot.
{TMI.Supervisor, bot_config}
]
Supervisor.start_link(children, strategy: :one_for_one, name: MyApp.Supervisor)
bots = Application.fetch_env!(:my_app, :bots)
bot_children = for bot_config <- bots, do: {TMI.Supervisor, bot_config}
children = [
# If you have existing children, e.g.:
Existing.Worker,
{Another.Existing.Supervisor, []}
# Add the bot children.
| bot_children
]
Supervisor.start_link(children, strategy: :one_for_one, name: MyApp.Supervisor)
Visit https://dev.twitch.tv/limit-increase/ and have a good reason prepared.
Copyright 2020 Ryan Winchester
Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.