diff --git a/Makefile b/Makefile index d266c78..393ab31 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,4 @@ -include $(GOROOT)/src/Make.$(GOARCH) +include $(GOROOT)/src/Make.inc TARG=irc GOFILES=irc.go irc_struct.go irc_callback.go diff --git a/irc.go b/irc.go index 562d905..dba5ef0 100644 --- a/irc.go +++ b/irc.go @@ -17,14 +17,16 @@ const ( VERSION = "GolangBOT v1.0" ) +var error bool + func reader(irc *IRCConnection) { br := bufio.NewReader(irc.socket) - for { + for !error { msg, err := br.ReadString('\n') if err != nil { irc.Error <- err - return + break } irc.lastMessage = time.Seconds() msg = msg[0 : len(msg)-2] //Remove \r\n @@ -53,10 +55,11 @@ func reader(irc *IRCConnection) { } irc.RunCallbacks(event) } + irc.syncreader <- true } func writer(irc *IRCConnection) { - for { + for !error { b := []byte(<-irc.pwrite) if b == nil || irc.socket == nil { return @@ -65,9 +68,10 @@ func writer(irc *IRCConnection) { if err != nil { fmt.Printf("%s\n", err) irc.Error <- err - return + break } } + irc.syncwriter <- true } //Pings the server if we have not recived any messages for 5 minutes @@ -104,6 +108,8 @@ func (irc *IRCConnection) SendRaw(message string) { } func (i *IRCConnection) Reconnect() os.Error { + <-i.syncreader + <-i.syncwriter for { fmt.Printf("Reconnecting to %s\n", i.server) var err os.Error @@ -113,6 +119,7 @@ func (i *IRCConnection) Reconnect() os.Error { } fmt.Printf("Error: %s\n", err) } + error = false fmt.Printf("Connected to %s (%s)\n", i.server, i.socket.RemoteAddr()) go reader(i) go writer(i) @@ -123,7 +130,9 @@ func (i *IRCConnection) Reconnect() os.Error { func (i *IRCConnection) Loop() { for { - <-i.Error + e := <-i.Error + fmt.Printf("Error: %s\n", e) + error = true i.Reconnect() } } @@ -140,6 +149,8 @@ func (i *IRCConnection) Connect(server string) os.Error { i.pread = make(chan string, 100) i.pwrite = make(chan string, 100) i.Error = make(chan os.Error, 10) + i.syncreader = make(chan bool) + i.syncwriter = make(chan bool) go reader(i) go writer(i) go pinger(i) diff --git a/irc_callback.go b/irc_callback.go index f3d6f98..10ff827 100644 --- a/irc_callback.go +++ b/irc_callback.go @@ -79,7 +79,7 @@ func (irc *IRCConnection) setupCallbacks() { }) irc.AddCallback("CTCP_TIME", func(e *IRCEvent) { - ltime := time.LocalTime(); + ltime := time.LocalTime() irc.SendRaw(fmt.Sprintf("NOTICE %s :\x01TIME %s\x01", e.Nick, ltime.String())) }) diff --git a/irc_struct.go b/irc_struct.go index 79d35d9..79e2e74 100644 --- a/irc_struct.go +++ b/irc_struct.go @@ -13,12 +13,12 @@ type IRCConnection struct { socket net.Conn pread, pwrite chan string Error chan os.Error + syncreader, syncwriter chan bool nick string user string registered bool server string password string - events map[string][]func(*IRCEvent) lastMessage int64