searchMember performs member discovery in a command goroutine. It emits a follow-up suggestion message once results are loaded.
(gID discord.GuildID, name string)
| 619 | // searchMember performs member discovery in a command goroutine. |
| 620 | // It emits a follow-up suggestion message once results are loaded. |
| 621 | func (c *composer) searchMember(gID discord.GuildID, name string) tview.Cmd { |
| 622 | key := gID.String() + " " + name |
| 623 | if c.cache.Exists(key) { |
| 624 | return nil |
| 625 | } |
| 626 | // If searching for "ab" returns less than SearchLimit, |
| 627 | // then "abc" would not return anything new because we already searched |
| 628 | // everything starting with "ab". This will still be true even if a new |
| 629 | // member joins because arikawa loads new members into the state. |
| 630 | if k := key[:len(key)-1]; c.cache.Exists(k) { |
| 631 | if count := c.cache.Get(k); count < c.chat.state.MemberState.SearchLimit { |
| 632 | c.cache.Create(key, count) |
| 633 | return nil |
| 634 | } |
| 635 | } |
| 636 | |
| 637 | // Rate limit on our side because we can't distinguish between a successful search and SearchMember not doing anything because of its internal rate limit that we can't detect |
| 638 | if c.lastSearch.Add(c.chat.state.MemberState.SearchFrequency).After(time.Now()) { |
| 639 | return nil |
| 640 | } |
| 641 | |
| 642 | c.lastSearch = time.Now() |
| 643 | return func() tview.Msg { |
| 644 | c.chat.messagesList.waitForChunkEvent() |
| 645 | c.chat.messagesList.setFetchingChunk(true, 0) |
| 646 | c.chat.state.MemberState.SearchMember(gID, name) |
| 647 | c.cache.Create(key, c.chat.messagesList.waitForChunkEvent()) |
| 648 | return tabSuggestMsg{} |
| 649 | } |
| 650 | } |
| 651 | |
| 652 | func (c *composer) showMentionsList() tview.Cmd { |
| 653 | borders := 0 |
no test coverage detected