Memento memo.

Today I Learned.

Elixir製Hubot風BotフレームワークのHedwigでSlack Botを作る

Hubotに飽きたので、HedwigというElixir製のFWでbotを作ってみようと思い立ちました。

Hedwig

github.com

Adapter baseのHubotっぽいBotフレームワークです。Elixirです。

公式のAdapterでSlack対応してます。

Setup

mixでprojectを適当に作ります。supervisor (--sup)つきで。

$ mix new hoge --sup
$ cd hoge
$ vi mix.exs # 以下の設定を記述
$ mix deps.get

mix.exs ファイルの設定

...
def applications do
  [applications: [:hedwig]]
end
...
defp deps do
  [{:hedwig, github: "hedwig-im/hedwig"}]
end
...

Bot作成

以下のコマンドでインタラクティブBotの設定ができます。AdapterとBot名を決めるだけです。

$ mix hedwig.gen.robot

lib/hoge.ex 内でsupervision treeにbotを登録します。

  worker(Xxxx.Robot, [])

以上です。

Botの起動

mix run --no-halt で起動できます。今回のbot名は Neko にしてます。

❯ mix run --no-halt
Compiling 2 files (.ex)
Generated foobot app

Hedwig Console - press Ctrl+C to exit.

The console adapter is useful for quickly verifying how your
bot will respond based on the current installed responders

### ここからコンソール
shotat> Neko ping
Neko> shotat: pong
shotat> Neko help
Neko> Neko help - Displays all of the help commands that Neko knows about.
Neko help <query> - Displays all help commands that match <query>.
Neko: ping - Responds with 'pong'

Responderの登録

ここからが本番です。pingとhelpだけできても意味がないので、諸々追加していきましょう。

以下のようなファイルを <app>/lib/responders/hello.ex に作ります。

defmodule Foobot.Responders.Hello do # Foobotはアプリ名
  @moduledoc false
  use Hedwig.Responder

  @greet [
    "Hello",
    "ねむい",
    "にゃー"
  ]

  @usage """
  hello
  """
  hear ~r/hello/i, msg do
    send msg, random(@greet)
  end

  respond ~r/yo/i, msg do
    reply msg, random(@greet)
  end
end

hear, respondでワードを拾って、send, replyで返事をします。それぞれメンションの有無で2パターンあります。9割くらいHubotと同じですね。

randomも最初から使えます。

あとは作ったresponderをconfigファイルに登録します。

config :foobot, Foobot.Robot,
  adapter: Hedwig.Adapters.Console,
  name: "Neko",
  aka: "cat", <= alias
  responders: [
    {Hedwig.Responders.Help, []},
    {Hedwig.Responders.Ping, []},
    {Foobot.Responders.Hello, []} # <= new!
  ]
...

akaにbotの別名も登録できます。Neko a.k.a. cat。

もう一度動かす

こんな感じになります。

shotat> cat yo
Neko> shotat: にゃー
shotat> Hello
Neko> Hello

Slackで動かす場合

Adapterを設定すればいけます。deps

mix.exs に以下を設定

def application do
  [applications: [:hedwig_slack]]
end

def deps do
  [{:hedwig_slack, github: "hedwig-im/hedwig_slack"}]
end

github.com

設定例

config :foobot, Foobot.Robot,
  adapter: Hedwig.Adapters.Slack, # <= adapterはSlack
  name: "shotat-machine",
  aka: "<@UXXXXXXX>", # <= debug logからuser id確認
  token: "xxxxxxxxxxx", # <= tokenは適当に
  rooms: [],
  responders: [
    {Hedwig.Responders.Help, []},
    {Foobot.Responders.Hello, []},
    {Hedwig.Responders.Ping, []}
  ]

これでslackで動きました。

f:id:shotat_jp:20161016005002p:plain

注意点として、aka欄にuser idを設定しないとメンションに反応してくれません。 user idはdebugコンソールに出てくるので、それを設定しておきましょう(他に調べる方法もある気もしますが。。。)。

まとめ

Hubotに飽きたらHedwigに乗り換えましょう。楽しいElixir。

プログラミングElixir

プログラミングElixir