kinoppyd.dev

blog

products

accounts & contact

Mobbの基本的な書き方

posted at 2018-12-03 00:23:45 +0900 by kinoppyd

このエントリは、Mobb/Repp Advent Calendar の三日目です

Mobbの基本的な機能

Mobb/Reppがなんなのかは昨日までのエントリで書いたので、今回はMobbで書ける基本的な機能を紹介します。

以下に上げるのは、Mobbのほとんどすべての機能なので、これを知っていれば秒でBotが作れます!

特定の文字列との完全マッチ

receive 'テクテクテクテク' do
  # テクテクテクテク という発言があったらこのブロックに入る
end

on 'ポッポポッポハトポッポ' do
  # on は receive のエイリアス
end

正規表現とのマッチ

on /^ほげほげ/ do
  # ほげほげで始まる行の発言があったらこのブロックに入る
end

on /(\w+) is 何/ do |something|
  # ほげ is 何 のような発言があったらこのブロックに入る
  # パターンマッチの結果は、ブロック引数で受け取れる
end

定期実行

cron '0 0 * * * * ' do
  # cronのシンタックスをパースして、指定された時間にこのブロックに入る
  # 上の例では、毎日0時にこのブロックに入る
end

every '0 0 1 * * *' do
  # every は cron のエイリアス
end

every 1.day, at: '12:00' do
  # Whenever(https://github.com/javan/whenever) の文法も使用できる
  # 上の例では、毎日12:00にこのブロックに入る
end

モジュラースタイル

require 'mobb/base'

class Bot < Mobb::Base
  # ignore_botフィルタは、次のバージョンから廃止され、デフォルトとなる
  on /Yo/, ignore_bot: true do |name|
    'Yo'
  end
end

モジュラースタイルでのヘルパーメソッド

# モジュラースタイルでは、ヘルパーメソッドを定義することで各ブロック内で独自のメソッドを呼び出せる

require 'mobb/base'

class Bot < Mobb::Base
  helpers do
    def hello(name)
      "hello #{name}"
    end
  end

  on /My name is (\w+)/ do |name|
    hello(name)
  end
end

条件フィルタ

on /Yo/, reply_to_me: true do
  # 自身へのリプライメッセージかつ、/Yo/の正規表現にマッチするときにこのブロックにはいる
  # 自身の名前は、`set :name` で設定する
end

# 独自のフィルタは、このように定義する
set :end_with do |value|
  condition do
    # ここでは@envで飛んできた発言にアクセスしているが、次のバージョンからは非推奨とされるので注意
    @env.body.end_with?(value)
  end
end

Botの設定

set :name, 'smart bot'
set :environment, :production

その他

他にも拡張を追加する extention などがありますが、これは例が難しく、普通に使う分にはhelpersで十分代用可能なので、別のエントリで紹介します