Simple golang IRC bot garde le timing hors
je bricole avec golang et mon premier code est un Simple bot IRC avec le code suivant:
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("%sn", line)
}
}
quand j'exécute ce code, j'obtiens la sortie suivante sur le 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)
Aucune raison pour que la connexion tient le timing?
2 réponses
toutes les commandes envoyées à un serveur IRC ont un maximum de 255 512 octets doit être terminée par un retour chariot et saut de ligne \r\n
.
conn.Write([]byte("NICK " + ircbot.nick + "\r\n"))
conn.Write([]byte("JOIN " + ircbot.channel + "\r\n"))
en outre, freenode attend le USER
commande pour être la première chose qu'il voit de vous.
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"))
EN note d'accompagnement, vous pouvez rendre votre vie un peu plus facile en utilisant fmt.Fprintf
formater et envoyer les données:
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)
Le premier paramètre de fmt.Fprintf
doit être de tout type qui satisfait de la io.Writer
interface. net.Conn
les implémentations font toutes cela. En tant que tel, vous pouvez les passer dans n'importe quelle fonction qui attend un io.Writer
(ou io.Reader
d'ailleurs) mise en oeuvre.
de plus, il arrive que les serveurs IRC envoient un message "PING: cookie" (si par exemple votre connexion est inutilisée pendant trop longtemps). Vous êtes censé répondre avec "Pong: cookie".