diff --git a/irc/client.go b/irc/client.go index 56f0c408..7d67690d 100644 --- a/irc/client.go +++ b/irc/client.go @@ -152,6 +152,10 @@ func (client *Client) Reply(reply Reply) { client.replies <- reply } +func (client *Client) IdleTime() time.Duration { + return time.Since(client.atime) +} + func (client *Client) HasNick() bool { return client.nick != "" } diff --git a/irc/types.go b/irc/types.go index beae3873..1a5460ce 100644 --- a/irc/types.go +++ b/irc/types.go @@ -3,6 +3,7 @@ package irc import ( "errors" "fmt" + "strings" ) // @@ -72,24 +73,32 @@ func (channels ChannelNameMap) Remove(channel *Channel) error { type ClientNameMap map[string]*Client var ( - ErrNickMissing = errors.New("nick missing") - ErrNicknameInUse = errors.New("nickname in use") + ErrNickMissing = errors.New("nick missing") + ErrNicknameInUse = errors.New("nickname in use") + ErrNicknameMismatch = errors.New("nickname mismatch") ) +func (clients ClientNameMap) Get(nick string) *Client { + return clients[strings.ToLower(nick)] +} + func (clients ClientNameMap) Add(client *Client) error { if !client.HasNick() { return ErrNickMissing } - if clients[client.nick] != nil { + if clients.Get(client.nick) != nil { return ErrNicknameInUse } - clients[client.nick] = client + clients[strings.ToLower(client.nick)] = client return nil } func (clients ClientNameMap) Remove(client *Client) error { - if clients[client.nick] != client { - return fmt.Errorf("%s: mismatch", client.nick) + if !client.HasNick() { + return ErrNickMissing + } + if clients.Get(client.nick) != client { + return ErrNicknameMismatch } delete(clients, client.nick) return nil