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?

13
go
demandé sur jwesonga 2012-11-12 14:33:45

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.

20
répondu jimt 2013-11-26 18:25:17

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".

3
répondu user3753989 2014-06-18 19:38:59