Add realname support. Guard against race conditions on Disconnect

This commit is contained in:
James Mills 2017-11-09 00:52:12 -08:00
parent ef65ae61a3
commit 656226dc22
No known key found for this signature in database
GPG Key ID: AC4C014F1440EBD6
2 changed files with 32 additions and 3 deletions

28
irc.go
View File

@ -388,6 +388,20 @@ func (irc *Connection) Connected() bool {
// A disconnect sends all buffered messages (if possible),
// stops all goroutines and then closes the socket.
func (irc *Connection) Disconnect() {
irc.Lock()
defer irc.Unlock()
if irc.end != nil {
close(irc.end)
}
irc.end = nil
if irc.pwrite != nil {
close(irc.pwrite)
}
irc.Wait()
if irc.socket != nil {
irc.socket.Close()
}
@ -468,8 +482,13 @@ func (irc *Connection) Connect(server string) error {
return err
}
realname := irc.user
if irc.RealName != "" {
realname = irc.RealName
}
irc.pwrite <- fmt.Sprintf("NICK %s\r\n", irc.nick)
irc.pwrite <- fmt.Sprintf("USER %s 0.0.0.0 0.0.0.0 :%s\r\n", irc.user, irc.user)
irc.pwrite <- fmt.Sprintf("USER %s 0.0.0.0 0.0.0.0 :%s\r\n", irc.user, realname)
return nil
}
@ -541,6 +560,13 @@ func (irc *Connection) negotiateCaps() error {
}
irc.pwrite <- fmt.Sprintf("CAP END\r\n")
realname := irc.user
if irc.RealName != "" {
realname = irc.RealName
}
irc.pwrite <- fmt.Sprintf("NICK %s\r\n", irc.nick)
irc.pwrite <- fmt.Sprintf("USER %s 0.0.0.0 0.0.0.0 :%s\r\n", irc.user, realname)
return nil
}

View File

@ -32,6 +32,9 @@ type Connection struct {
KeepAlive time.Duration
Server string
RealName string // The real name we want to display.
// If zero-value defaults to the user.
socket net.Conn
pwrite chan string
end chan struct{}
@ -43,8 +46,8 @@ type Connection struct {
events map[string]map[int]func(*Event)
eventsMutex sync.Mutex
QuitMessage string
lastMessage time.Time
QuitMessage string
lastMessage time.Time
lastMessageMutex sync.Mutex
VerboseCallbackHandler bool