14
14

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

GoAdvent Calendar 2013

Day 17

go-irceventでお手軽IRC bot作成

Last updated at Posted at 2013-12-17

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

14
14
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
14

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?