この記事は Go Advent Calender 2013 の 17 日目の投稿です。
今回は、go-irceventというライブラリを利用して手軽にIRCボットが作成できることを紹介します。
go-ircevent
go-irceventは、IRCメッセージをイベントとして、イベントにコールバックを登録することができる便利なライブラリです。実装がとてもシンプルなので、golangを学び始めたときのサンプルとしても有用でしょう。
簡単な使い方
package main
import "bytes"
import "log"
import "math/rand"
import "time"
import "github.com/thoj/go-ircevent"
func main() {
// 接続のための記述
ircobj := irc.IRC("parrot", "parrot")
ircobj.UseTLS = true // bad certificate とエラーがでたら TLSConfigの設定を追記しましょう
ircobj.Password = "XXXXXXX"
if err := ircobj.Connect("irc.example.com:6667"); err != nil {
log.Fatal(err)
}
// 接続後、#hogeチャンネルにjoinする
ircobj.AddCallback("001", func (e *irc.Event) {
ircobj.Join("#hoge")
})
// PRIVMSGメッセージをイベントとして、コールバックを登録する
ircobj.AddCallback("PRIVMSG", func (e *irc.Event) {
time.Sleep(1000 * time.Millisecond)
ircobj.Notice("#hoge", e.Message) // おうむ返し
})
ircobj.Loop()
}
対応しているメッセージ(イベント)
go-irceventでは以下のメッセージ(イベント)に対応しています
- 001 Welcome
- PING
- CTCP Unknown CTCP
- CTCP_VERSION Version request (Handled internaly)
- CTCP_USERINFO
- CTCP_CLIENTINFO
- CTCP_TIME
- CTCP_PING
- PRIVMSG
- MODE
- JOIN
その他...
適当に曲を選んでくれるボットの例
僕は巷で SPEEDが好きなエンジニア として有名になりつつあるので、適当にSPEEDの往年の名曲(僕にとっては往年ではないですが)を返してくれるボットをつくってみましょう。
package main
import "bytes"
import "log"
import "math/rand"
import "time"
import "github.com/thoj/go-ircevent"
func main() {
ircobj := irc.IRC("speed_bot", "speed_bot")
ircobj.UseTLS = true
ircobj.Password = "XXXXXXX"
if err := ircobj.Connect("irc.example.com:6667"); err != nil {
log.Fatal(err)
}
songs := [...]string{"Body & Soul", "STEADY", "Go! Go! Heaven",
"Wake Me Up!", "White Love", "my graduation",
"ALIVE", "ALL MY TRUE LOVE"}
r := rand.New(rand.NewSource(time.Now().UnixNano())) // 現在時間を使って乱数源を生成
ircobj.AddCallback("001", func (e *irc.Event) {
ircobj.Join("#speed")
})
ircobj.AddCallback("PRIVMSG", func (e *irc.Event) {
// 「pick song」とメッセージが飛んできたら
if bytes.Contains([]byte(e.Message), []byte("speed_bot: pick song")) {
time.Sleep(1000 * time.Millisecond)
picked_song := songs[r.Int31n(int32(len(songs)))] // ランダムに選択して
ircobj.Privmsg("#speed", picked_song) // 返す
}
})
ircobj.Loop()
}
こんなかんじで使います
14:19 kitak: speed_bot: pick song
14:19 speed_bot: White Love
14:20 okkun_: ?
まとめ
go-irceventを利用して、簡単にIRCボットを作成できることを紹介しました。
皆さんも自分が欲しいと思ったbotをgolangで実装して、幸福度を高めてみてはいかがでしょうか?