LoginSignup
1
1

More than 5 years have passed since last update.

Lita にオウム返しをしてもらう

Last updated at Posted at 2016-12-18

概要

Slack などのサービスに参加できるchat bot, lita に、オウム返しをしてもらうための機能を追加する

  • Slack に参加している Lita に parrot handler を実装する

動作イメージ

前提

  • git
  • 開発環境で lita コマンドが使用できる( gem install lita 済み)
  • Lita がSlack に参加済み
  • lita-parrot の名前でGitHub にリポジトリを作成済み
  • Slack API Token ( xoxp-xxxxxxxxxx-xxxxxxxxxx-yyyyyyyyyyy-zzzzzzzzzz ) を環境変数として参照できる

手順

大まかな手順としては :

  • handler の初期化・作成
    • Slack API を叩くgem を依存関係として追記・利用
    • 入力された内容をそのまま返事として返すメソッドの定義
  • lita 本体にこの機能を登録

parrot handler プロジェクトの初期化

Lita に機能を追加するために、handler ( ≒ 振る舞い)を新規プロジェクトとして作成し、そこに実際の機能を記述していく

cd ~
lita handler parrot # => ~/lita-parrot ディレクトリにハンドラプロジェクトが作成される
cd lita-parrot

# git の初期化・最初のコミット
git init
git add .
git commit -m 'Initial commit'

Slack API を叩くgem の使用

slack-ruby-client を利用する

Note :
入力された内容をただ返すだけでなく、送信相手の名前も加えて返答(通知)するように機能を追加したい

しかし、Lita が把握しているのは mention に使える名前ではなく、Slack の内部ID( ... U00FEEE99 な形式)
...なので、そのID をもとに、なんとかして mention に使える名前に変換する必要がある

解決方法として、Slack API を利用する。Slack の内部IDをもとに問い合わせることで、mention に使える名前を得られる

ハンドラに「ID → mention 名」に変換するメソッドを定義する

lib/lita/handlers/parrot.rb
require 'slack-ruby-client'

module Lita
  module Handlers
    class Parrot < Handler
      def find_user_name(user_id)
        ::Slack.configure do |config|
          config.token = ENV['SLACK_API_TOKEN']
        end

        client = ::Slack::Web::Client.new
        user_info = client.users_info(user: user_id)
        user_info.dig(:user, :name)
      end
    end
  end
end
依存関係をgemspec ファイルに追記

slack-ruby-client gem を利用しているので、依存関係を明示する( bundle install を忘れずに)

lita-parrot.gemspec
Gem::Specification.new do |spec|
  # spec....
  # ...
  spec.add_runtime_dependency 'slack-ruby-client'
end

オウム返しメソッドの定義

lib/lita/handlers/parrot.rb
require 'slack-ruby-client'

module Lita
  module Handlers
    class Parrot < Handler
      # 反応するワードの定義(echo, parrot)
      route(/echo/, :parrot)
      route(/parrot/, :parrot)

      def parrot(response)
        user_name = find_user_name(response.user&.id) rescue ''
        response.reply "@#{user_name} #{response.message.body}"
      end

      def find_user_name(user_id)
      # ...
      end
    end
  end
end

lita 本体に組み込み

先程までの作業をGitHub に作成済みの lita-parrot リポジトリに commit & push する

その後 lita 本体のgem にこのhandler を追記する

# ...
gem 'lita-parrot', git: 'https://github.com/gouf/lita-parrot'

( bundle install , git での commit & push, 本体の deploy も忘れずに)

まとめ・注意点

Lita は adapter 機構により、さまざまなサービスに参加できるが、サービス固有の機能については それぞれのAPI に問い合わせる必要が出てくる

API の利用を簡単にしてくれるgem などを活用して、よりLita を活躍させてあげたい

Links

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1