sifue's blog

プログラマな二児の父の日常

既存のIRCボットをSlack対応させた時にハマった点

最近Slackが大ブームということもあって、IRCやその他のチャットシステムからSlackに移行している方も多いと思います。そんな中、IRCのgatewayがあるということで、IRCのボット資産をSlackに移行するために自身がハマった点が何点かあったのでまとめておきます。

今回IRCからSlack対応させたのは、自身がScalaでメンテナンスしているranking_ircbotというチャンネルにおける発言回数と名言を保存しておいてくれるボットです。

 

問題になった点は以下4点。

 

  1. noticeがない
  2. IRCの通信をSSL化しないといけない
  3. IRCのgatewayを使う場合、専用のアカウントがないといけない
  4. IRCのgatewaybotが発言しまくると、そのチャンネルにおいてIRCを通じて発言できなくなる

 

になります。

 

1.noticeがない。これに関しては諦めざるを得ません。なので、noticeがなくてもよい運用にしましょう。幸い@usernameで呼びかけるとSlackから相手に通知が行くので通常の投稿と、人に通知を送りたい場合は@usernameを入れて対応するということで、通常のメッセージにはあまり反応しないような運用が良いのではないかと思います。あと変わりに_でメッセージを囲ってイタリックにしてやる方法や@usernameにゼロサイズスペースや_を挟んでnotice反応しないようにするのも手です。

 

2. IRCの通信をSSL化しないといけない。これはSSL対応しているIRCクライアントを利用する必要があります。自身が使っているsIRCというJavaIRCクライアントライブラリは対応があったため、特に問題なく移行することができました。Java系だと、証明書を登録するか無視するかのどちらかの対応をしなくてはいけないというのがちょっと面倒臭いところです。自分は無視しています。

 

3.IRCのgatewayを使う場合、専用のアカウントがないといけない。これが一番厄介で、IRCで発言するようにすると、SSLのサーバー認証がユーザーIDとパスワードで行うため、登録ユーザーIDがボットの動きをしてしまうことになります。

なお自身のアカウントでbotを動かすと、人格をbotに乗っ取られるような感じになりますw

なお、ボット専用のメールアドレス等を用意されるのであればそれで対応されるのも良いかと思います。

 

それでも回避しきれないのが次の問題で、4.IRCのgatewaybotが発言しまくると、そのチャンネルにおいてIRCを通じて発言できなくなるという問題です(ちなみにこれ解除するためにはパスワードを再生成しないとダメです)。おそらく、Slackが、REST APIの制限の抜け道をIRCでやられないようにこのような制限をかけているのだと思います。

 

この3番、4番の問題を解決するために、最終的に、取得だけはIRCのチャンネルからストリームで取得し、発言はSlack REST APIから行うようにしました。ただし、こちらは1秒間に1回しか発言しないように制御する必要があります。

そこで自分はScalaで実装していたので、Javaの並行プログラミングユーティリティのSemaphoreを利用して、Slackのクライアントを以下HTTPクライアントのdispatchを使って下のように実装しました。このおかげで1秒間に1回以上連投をせずにちゃんとブロックしてくれるようになります。

Slack API Client for Message Posting with API limi ...

 

以上が、SlackにIRCボットを対応させるために行った時にハマったこととその対応になります。参考になれば幸いです。