Go
GoDay 17

go-irceventでお手軽IRC bot作成

More than 5 years have passed since last update.

この記事は 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で実装して、幸福度を高めてみてはいかがでしょうか?