Einfache golang IRC-bot hält das timing
Bin ich basteln mit golang und meine erste code ist ein einfacher IRC-bot mit dem folgenden 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)
}
}
Wenn ich diesen code ausführen, bekomme ich die folgende Ausgabe auf dem 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)
Einen Grund, warum die Verbindung hält timing aus?
- Vielen Dank für den Beispielcode für eine einfache go-bot.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Alle Befehle an einen IRC-server haben ein maximum von
255512 bytes und muss beendet werden mit einem Wagenrücklauf und einem Zeilenvorschub\r\n
.Darüber hinaus freenode erwartet, dass die
USER
Befehl, der erste zu sein, was es sieht aus Sie.Als Seite beachten, können Sie machen Sie Ihr Leben ein wenig vereinfachen, indem
fmt.Fprintf
zu formatieren und senden Sie die Daten:Den ersten parameter von
fmt.Fprintf
muss jede Art erfüllt, dass dieio.Writer
- Schnittstelle. Dienet.Conn
Implementierungen alle tun dies. Als solche können Sie Sie in jede Funktion, die erwartet, dass einio.Writer
(oderio.Reader
für diese Angelegenheit) Umsetzung.USER
um die ersten zu sein, aber es steht in der Norm. Auch der standard erfordert, dass die Nachrichten am Ende mit\r\n
, nicht nur\n
.PrintfLine
imnet/textproto
, dass genau das tut, wasfmt.Fprintf
tut, aber kürzer, besser und richtig.Auch gelegentlich IRC-Server sendet ein "PING :cookie" - Meldung (wenn zum Beispiel die Verbindung im Leerlauf für lange). Sie erwartet eine Antwort mit "PONG :cookie".