Ruboty | Brain ボットの脳にデータを記憶 #ruboty #chatops

  • 8
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

Ruboty | Brain ボットの脳にデータを記憶 #ruboty #chatops

概要

Ruboty の Brain でボットの脳にデータを記憶します。

Ruboty は Brain を利用することでデータの永続化が可能です。
標準では Ruboty::Brains::Memory クラスの data というインスタンス変数に Hash で値を保持しています。

Ruboty::Brains::Memory はメモリに Hash を保持するだけなので、
Ruboty を再起動するとデータは消失します。

再起動も加味した永続化をしたい場合など、 Brains::Base を継承して新たなクラスを作成することで、
独自の永続化機能を追加することも可能です。
例えば、 Redis を利用した ruboty-redis があります。

試用

仕様

  • increase, decrease で増減するカウンタ Handler + Action を作成
  • gem: ruboty-counter
  • Handlers: Ruboty::Handlers::CounterHandler
  • Actions: Ruboty::Counter::Actions::IncreaseAction
  • Actions: Ruboty::Counter::Actions::DecreaseAction

ひな形の作成には、 ruboby-gen を利用します。

手順

  • ruboty-gen で自動生成を行います
$ ruboty-gen g counter increase decrease
      create  ruboty-counter/Gemfile
      create  ruboty-counter/Rakefile
      create  ruboty-counter/LICENSE.txt
      create  ruboty-counter/README.md
      create  ruboty-counter/.gitignore
      create  ruboty-counter/ruboty-counter.gemspec
      create  ruboty-counter/lib/ruboty/counter.rb
      create  ruboty-counter/lib/ruboty/counter/version.rb
Initializing git repo in /cygdrive/d/project/study/qiita/ruboty-counter
      create  ruboty-counter/lib/ruboty/handlers/counter.rb
      create  ruboty-counter/lib/ruboty/counter/actions/increase.rb
      create  ruboty-counter/lib/ruboty/counter/actions/decrease.rb
  • IncreaseAction を実装
ruboty-counter/lib/ruboty/counter/actions/increase.rb
module Ruboty
  module Counter
    module Actions
      class Increase < Ruboty::Actions::Base
        def call
          brain = message.robot.brain
          brain.data['counter'] ||= 0
          brain.data['counter'] = brain.data['counter'] + 1
          message.reply(brain.data['counter'])
        end
      end
    end
  end
end
  • DecreaseAction を実装
ruboty-counter/lib/ruboty/counter/actions/decrease.rb
module Ruboty
  module Counter
    module Actions
      class Decrease < Ruboty::Actions::Base
        def call
          brain = message.robot.brain
          brain.data['counter'] ||= 0
          brain.data['counter'] = brain.data['counter'] - 1
          message.reply(brain.data['counter'])
        end
      end
    end
  end
end
  • Handler は description だけ変更
require "ruboty/counter/actions/increase"
require "ruboty/counter/actions/decrease"

module Ruboty
  module Handlers
    class Counter < Base
      on /counter (increase|\+)/, name: 'increase', description: 'increase counter'
      on /counter (decrease|\-)/, name: 'decrease', description: 'decrease counter'

      def increase(message)
        Ruboty::Counter::Actions::Increase.new(message).call
      end

      def decrease(message)
        Ruboty::Counter::Actions::Decrease.new(message).call
      end
    end
  end
end
  • private gem server に公開
$ rake build
# geminabox で作成した private gem server にアップ
$ gem inabox ./pkg/ruboty-qiita_scouter-0.0.1.gem
  • bot 確認用ディレクトリの作成
$ cd "ボットを作成する任意のディレクトリ"
$ ruboty -g
$ cd ruboty
  • Gemfile の編集
source "http://your private gem server or rubygems/"

gem 'ruboty-counter'
  • ruboty の起動、試行
$ ruboty
> ruboty help
ruboty /counter (decrease|\-)/ - decrease counter
ruboty /counter (increase|\+)/ - increase counter
ruboty /help( me)?\z/i         - Show this help message
ruboty /ping\z/i               - Return PONG to PING
ruboty /who am i\?/i           - Answer who you are
> ruboty counter increase
1
> ruboty counter increase
2
> ruboty counter decrease
1
> ruboty counter decrease
0
> ruboty counter decrease
-1
> ruboty counter +
0
> ruboty counter +
1
> ruboty counter -
0
> ruboty counter -
-1

参照

Ruboty GitHub
Ruboty RubyGems
ruboty-gen GitHub
ruboty-gen RubyGems
Ruboty | 自作 Handler gem の作成