diff --git a/telegram/muc.go b/telegram/muc.go index 4f718d9..0470f7d 100644 --- a/telegram/muc.go +++ b/telegram/muc.go @@ -52,6 +52,7 @@ func NewMUCState() *MUCState { type MUCOccupantsLRU struct { m map[int64]*MUCOccupant + rev map[string]int64 oldest *MUCOccupant newest *MUCOccupant lock sync.Mutex @@ -59,7 +60,8 @@ type MUCOccupantsLRU struct { func NewMUCOccupantsLRU() *MUCOccupantsLRU { return &MUCOccupantsLRU{ - m: make(map[int64]*MUCOccupant), + m: make(map[int64]*MUCOccupant), + rev: make(map[string]int64), } } @@ -71,6 +73,14 @@ func (lru *MUCOccupantsLRU) Get(id int64) (*MUCOccupant, bool) { return occupant, ok } +func (lru *MUCOccupantsLRU) GetIdByNickname(nickname string) (int64, bool) { + lru.lock.Lock() + defer lru.lock.Unlock() + + id, ok := lru.rev[nickname] + return id, ok +} + func (lru *MUCOccupantsLRU) cutOut(oldOccupant *MUCOccupant) (prev, next *MUCOccupant) { prev, next = oldOccupant.cutOut() if lru.oldest == oldOccupant { @@ -102,6 +112,9 @@ func (lru *MUCOccupantsLRU) Set(id int64, occupant *MUCOccupant) (deleted *MUCOc if oldOk { lru.cutOut(oldOccupant) + + delete(lru.rev, oldOccupant.Nickname) + lru.rev[occupant.Nickname] = id } if (lru.oldest == nil) != (lru.newest == nil) { @@ -120,6 +133,7 @@ func (lru *MUCOccupantsLRU) Set(id int64, occupant *MUCOccupant) (deleted *MUCOc if len(lru.m) > int(MUCOccupantsLimit) && lru.oldest != nil { deleted = lru.oldest delete(lru.m, lru.oldest.id) + delete(lru.rev, lru.oldest.Nickname) lru.cutOut(lru.oldest) } @@ -136,6 +150,7 @@ func (lru *MUCOccupantsLRU) Delete(id int64) { if oldOk { lru.cutOut(oldOccupant) + delete(lru.rev, oldOccupant.Nickname) } } @@ -183,6 +198,7 @@ func (lru *MUCOccupantsLRU) Clear() { occupant.next = nil } lru.m = make(map[int64]*MUCOccupant) + lru.rev = make(map[string]int64) lru.oldest = nil lru.newest = nil diff --git a/telegram/utils.go b/telegram/utils.go index 08f8d7e..c736f1c 100644 --- a/telegram/utils.go +++ b/telegram/utils.go @@ -984,7 +984,7 @@ func (c *Client) GetMyMUCNickname(chatID int64) (string, bool) { return occupant.Nickname, true } -// GetMUCMemberIdByNickname looks up the telegram ID by the MUC nickname (slow yet! (TODO)) +// GetMUCMemberIdByNickname looks up the telegram ID by the MUC nickname func (c *Client) GetMUCMemberIdByNickname(chatID int64, nickname string) int64 { c.locks.mucCacheLock.Lock() defer c.locks.mucCacheLock.Unlock() @@ -994,10 +994,9 @@ func (c *Client) GetMUCMemberIdByNickname(chatID int64, nickname string) int64 { return 0 } - for occupant := range mucState.Occupants.Range() { - if occupant.Nickname == nickname { - return occupant.id - } + id, ok := mucState.Occupants.GetIdByNickname(nickname) + if ok { + return id } return 0