From ffd00e1affd87457154661812a3721cd12b0a791 Mon Sep 17 00:00:00 2001 From: Shivaram Lingamneni Date: Fri, 17 Jul 2020 04:53:30 -0400 Subject: [PATCH] minor optimization to Client.Friends --- irc/client.go | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/irc/client.go b/irc/client.go index 59dbc036..dcdf905a 100644 --- a/irc/client.go +++ b/irc/client.go @@ -1054,29 +1054,32 @@ func (client *Client) ModeString() (str string) { } // Friends refers to clients that share a channel with this client. -func (client *Client) Friends(capabs ...caps.Capability) (result map[*Session]bool) { - result = make(map[*Session]bool) +func (client *Client) Friends(capabs ...caps.Capability) (result map[*Session]empty) { + result = make(map[*Session]empty) // look at the client's own sessions - for _, session := range client.Sessions() { - if session.capabilities.HasAll(capabs...) { - result[session] = true - } - } + addFriendsToSet(result, client, capabs...) for _, channel := range client.Channels() { for _, member := range channel.Members() { - for _, session := range member.Sessions() { - if session.capabilities.HasAll(capabs...) { - result[session] = true - } - } + addFriendsToSet(result, member, capabs...) } } return } +// helper for Friends +func addFriendsToSet(set map[*Session]empty, client *Client, capabs ...caps.Capability) { + client.stateMutex.RLock() + defer client.stateMutex.RUnlock() + for _, session := range client.sessions { + if session.capabilities.HasAll(capabs...) { + set[session] = empty{} + } + } +} + func (client *Client) SetOper(oper *Oper) { client.stateMutex.Lock() defer client.stateMutex.Unlock()