Merge pull request #38 from ecnahc515/custom_handling_disconnect

Custom handling disconnect
This commit is contained in:
Thomas Jager 2014-07-29 10:03:48 +02:00
commit 33fb824b4f
2 changed files with 22 additions and 10 deletions

24
irc.go
View File

@ -35,11 +35,15 @@ const (
VERSION = "go-ircevent v2.1" VERSION = "go-ircevent v2.1"
) )
var ErrDisconnected = errors.New("Disconnect Called")
// Read data from a connection. To be used as a goroutine. // Read data from a connection. To be used as a goroutine.
func (irc *Connection) readLoop() { func (irc *Connection) readLoop() {
defer irc.Done() defer irc.Done()
br := bufio.NewReaderSize(irc.socket, 512) br := bufio.NewReaderSize(irc.socket, 512)
errChan := irc.ErrorChan()
for { for {
select { select {
case <-irc.end: case <-irc.end:
@ -61,7 +65,7 @@ func (irc *Connection) readLoop() {
} }
if err != nil { if err != nil {
irc.Error <- err errChan <- err
break break
} }
@ -103,6 +107,7 @@ func (irc *Connection) readLoop() {
// Loop to write to a connection. To be used as a goroutine. // Loop to write to a connection. To be used as a goroutine.
func (irc *Connection) writeLoop() { func (irc *Connection) writeLoop() {
defer irc.Done() defer irc.Done()
errChan := irc.ErrorChan()
for { for {
select { select {
case <-irc.end: case <-irc.end:
@ -127,7 +132,7 @@ func (irc *Connection) writeLoop() {
irc.socket.SetWriteDeadline(zero) irc.socket.SetWriteDeadline(zero)
if err != nil { if err != nil {
irc.Error <- err errChan <- err
return return
} }
} }
@ -166,8 +171,9 @@ func (irc *Connection) pingLoop() {
// Main loop to control the connection. // Main loop to control the connection.
func (irc *Connection) Loop() { func (irc *Connection) Loop() {
errChan := irc.ErrorChan()
for !irc.stopped { for !irc.stopped {
err := <-irc.Error err := <-errChan
if irc.stopped { if irc.stopped {
break break
} }
@ -276,12 +282,19 @@ func (irc *Connection) Mode(target string, modestring ...string) {
irc.SendRawf("MODE %s", target) irc.SendRawf("MODE %s", target)
} }
func (irc *Connection) ErrorChan() chan error {
return irc.Error
}
// A disconnect sends all buffered messages (if possible), // A disconnect sends all buffered messages (if possible),
// stops all goroutines and then closes the socket. // stops all goroutines and then closes the socket.
func (irc *Connection) Disconnect() { func (irc *Connection) Disconnect() {
for event := range irc.events {
irc.ClearCallback(event)
}
close(irc.end) close(irc.end)
close(irc.pwrite) close(irc.pwrite)
close(irc.pread)
irc.Wait() irc.Wait()
irc.socket.Close() irc.socket.Close()
@ -290,7 +303,7 @@ func (irc *Connection) Disconnect() {
irc.netsock.Close() irc.netsock.Close()
irc.netsock = nil irc.netsock = nil
} }
irc.Error <- errors.New("Disconnect Called") irc.ErrorChan() <- ErrDisconnected
} }
// Reconnect to a server using the current connection. // Reconnect to a server using the current connection.
@ -350,7 +363,6 @@ func (irc *Connection) Connect(server string) error {
} }
irc.Log.Printf("Connected to %s (%s)\n", irc.server, irc.socket.RemoteAddr()) irc.Log.Printf("Connected to %s (%s)\n", irc.server, irc.socket.RemoteAddr())
irc.pread = make(chan string, 10)
irc.pwrite = make(chan string, 10) irc.pwrite = make(chan string, 10)
irc.Error = make(chan error, 2) irc.Error = make(chan error, 2)
irc.Add(3) irc.Add(3)

View File

@ -24,10 +24,10 @@ type Connection struct {
PingFreq time.Duration PingFreq time.Duration
KeepAlive time.Duration KeepAlive time.Duration
socket net.Conn socket net.Conn
netsock net.Conn netsock net.Conn
pread, pwrite chan string pwrite chan string
end chan struct{} end chan struct{}
nick string //The nickname we want. nick string //The nickname we want.
nickcurrent string //The nickname we currently have. nickcurrent string //The nickname we currently have.