概要
Slack 用 bot を Ruby で作成するのに、slack-api を利用し、下記のようなコードで、各チャンネルでの発言を取得している。
require 'slack'
Slack.configure {|config| config.token = TOKEN }
client = Slack.realtime
client.on :message do |data|
# 投稿内容でいろいろ処理する
end
投稿内容でいろいろ処理するなかで、特定の部屋での発言にのみ反応させたくなったので、if でチャンネル名を条件に加えようとしたが、data['channel']
で取得できるものはチャンネル ID となっているので、正しく判定できない。
その問題を解決するために雑に考えてみた結果である。
対処
API を利用し、チャンネルリストを取得することができる。チャンネルリストは下記のようになっている。
{
"ok" => true,
"channels" : [
{
"id" => "A1B2", # チャンネル ID
"name" => "hoge", # チャンネル名
# 作成者や参加者、トピックなどもある
},
{
# これの繰り返し
}
]
}
そのため、取得可能なチャンネルをすべて取得し、その中から指定したチャンネル名と一致するものの ID を返すというメソッドを作成した(とりあえず一致するものがなければ空としている)。
def get_channel_id(channel_name)
channel_id = ''
c_list = Slack.channels_list
if c_list['ok']
c_list['channels'].each do |channel|
channel_id = channel['id'] if channel['name'] == channel_name
end
end
channel_id
end
問題点
- チャンネル数が多くなると時間がかかるようになってしまう
- なのでもうちょっと考えたほうがいい
- Private なチャンネルは取得できない
- そもそも API で取得できない模様