概要
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 名」に変換するメソッドを定義する
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
を忘れずに)
Gem::Specification.new do |spec|
# spec....
# ...
spec.add_runtime_dependency 'slack-ruby-client'
end
オウム返しメソッドの定義
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 を活躍させてあげたい