参画しているプロジェクトでメンバーがちょっとしたスクリプト処理を主導で開始する際に「○○実行しましたー」などとIRCで連絡する習慣があるのですが、コミュニケーションという点では毎度声を出すことにメリットはあろうものの、作業自体は結構ナンセンスなものだと思っていました。自動でだせば良いものに、毎度手間をかけているのが面倒だなぁという感覚です。
すぐにできそうだけどなんか色々調べるの面倒だなぁ(とそれくらいの優先度)と考えていたところ、こんな記事を目にしました。
○デプロイ時に実況中継するIRCボット @KLab若手エンジニアの これなぁに?
なんとシンプル!
折しも昨年末より私もRubyに興味を持っていたのでこれがRubyで書かれているということだけでも、私の心を惹きつけました。
で多少修正して、早速プロジェクトに投入。
postToIRC.rb:
#!/usr/bin/ruby require 'socket' nick = ARGV[0] chan = ARGV[1] msg = ARGV[2] if (nick!=nil && msg!=nil && chan!=nil) then sock = TCPSocket.open("localhost", 6667) sock.send(sprintf("NICK %s\r\n", nick), 0) sock.send(sprintf("USER %s localhost localhost :%s\r\n", nick, nick), 0); sock.send(sprintf("JOIN #%s\r\n", chan), 0) sock.send(sprintf("NOTICE #%s :<--- %s --->\r\n", chan, msg), 0); sock.send("QUIT\r\n", 0); sock.readlines sock.close end
こんなスクリプトを用意して、処理経過をIRCに発言させたいバッチ(私の今回の対象は bash スクリプトでした)中に以下のような記述をすることで呼び出します。
IRCPGM="ruby /home/my/pass/to/postToIRC.rb" IRCCHANNEL="mychannel" IRCUSER="myscriptname" ${IRCPGM} ${IRCUSER} ${IRCCHANNEL} "Starting process A"
あとはIRCに発言させたいタイミングごとに
${IRCPGM} ${IRCUSER} ${IRCCHANNEL} "(ここにメッセージ)"
を書いていけばOK。簡易的にはこれで十分目的を達成することができました。らくちんらくちん。
まだ実験的に1つのスクリプトに組み込んでみただけですが、ベースができているので様々なシーンに幅が広がりそうです。
課題としては:
・今は localhost:6667 固定なので変数化とかパラメタ化とかして追い出したい
・都度切断するのが気に入らない。IRCに接続したままでいくつか発言をさせたい
・ニホンゴジョウズジャアリマセン。モジコードトオモウケドシラベテマセン
というあたり。
amo-kさん、ありがとうございます!プロジェクトメンバがほんの少しだけ幸せになれました(^^)。
.