Simple golang IRC bot keeps timing out

go

Solution

All commands sent to an IRC server have a maximum of 255 512 bytes and must be terminated with a carriage return and linefeed `\r\n`.

conn.Write([]byte("NICK " + ircbot.nick + "\r\n"))
conn.Write([]byte("JOIN " + ircbot.channel + "\r\n"))

Additionally, freenode expects the `USER` command to be first thing it sees from you.

conn.Write([]byte("USER "+ircbot.nick+" 8 * :" + ircbot.nick + "\r\n"))
conn.Write([]byte("NICK " + ircbot.nick + "\r\n"))
conn.Write([]byte("JOIN " + ircbot.channel + "\r\n"))

As a side note, you can make your life a little easier by using `fmt.Fprintf` to format and send the data:

fmt.Fprintf(conn, "USER %s 8 * :%s\r\n", ircbot.nick, ircbot.nick)
fmt.Fprintf(conn, "NICK %s\r\n", ircbot.nick)
fmt.Fprintf(conn, "JOIN %s\r\n", ircbot.channel)

The first parameter of `fmt.Fprintf` must be any type that satisfies the `io.Writer` interface. The `net.Conn` implementations all do this. As such you can pass them into any function which expects an `io.Writer` (or `io.Reader` for that matter) implementation.

Problem

I'm tinkering with golang and my first code is a simple IRC bot with the following code: ``` package main import ("net" "log" "bufio" "fmt" "net/textproto" ) type Bot struct{ server string port string nick string user string channel string pass string pread, pwrite chan string conn net.Conn } func NewBot() *Bot { return &Bot{server: "irc.freenode.net", port: "6667", nick: "subsaharan", channel: "#rapidsms", pass: "", conn: nil, user: "blaze"} } func (bot *Bot) Connect() (conn net.Conn, err error){ conn, err = net.Dial("tcp",bot.server + ":" + bot.port) if err != nil{ log.Fatal("unable to connect to IRC server ", err) } bot.conn = conn log.Printf("Connected to IRC server %s (%s)\n", bot.server, bot.conn.RemoteAddr()) return bot.conn, nil } func main(){ ircbot := NewBot() conn, _ := ircbot.Connect() conn.Write([]byte("NICK " + ircbot.nick)) conn.Write([]byte("JOIN " + ircbot.channel)) defer conn.Close() reader := bufio.NewReader(conn) tp := textproto.NewReader( reader ) for { line, err := tp.ReadLine() if err != nil { break // break loop on errors } fmt.Printf("%s\n", line) } } ``` When I run this code I get the following output on the terminal: ``` 2012/11/12 13:31:20 Connected to IRC server irc.freenode.net (193.219.128.49:6667) :sendak.freenode.net NOTICE * :*** Looking up your hostname... :sendak.freenode.net NOTICE * :*** Checking Ident :sendak.freenode.net NOTICE * :*** Couldn't look up your hostname :sendak.freenode.net NOTICE * :*** No Ident response ERROR :Closing Link: 127.0.0.1 (Connection timed out) ``` Any reason why the connection keeps timing out?

Original source