diff --git a/main/src/ui/chat_input/occupants_tab_completer.vala b/main/src/ui/chat_input/occupants_tab_completer.vala index fb9b2377..57d7e91d 100644 --- a/main/src/ui/chat_input/occupants_tab_completer.vala +++ b/main/src/ui/chat_input/occupants_tab_completer.vala @@ -101,15 +101,34 @@ class OccupantsTabCompletor { private Gee.List generate_completions_from_occupants(string prefix) { Gee.List ret = new ArrayList(); + + // First suggest nicks that have recently writen something + Gee.List messages = stream_interactor.get_module(MessageStorage.IDENTITY).get_messages(conversation, 50); + for (int i = messages.size - 1; i > 0; i--) { + string resourcepart = messages[i].from.resourcepart; + Jid? own_nick = stream_interactor.get_module(MucManager.IDENTITY).get_own_jid(conversation.counterpart, conversation.account); + if (resourcepart != null && resourcepart != "" && + resourcepart.to_string().down().has_prefix(prefix.down()) && + (own_nick == null || resourcepart != own_nick.resourcepart) && + !ret.contains(resourcepart)) { + ret.add(resourcepart.to_string()); + } + } + + // Then, suggest other nicks in alphabetical order Gee.List? occupants = stream_interactor.get_module(MucManager.IDENTITY).get_other_occupants(conversation.counterpart, conversation.account); + Gee.List filtered_occupants = new ArrayList(); if (occupants != null) { foreach (Jid jid in occupants) { - if (jid.resourcepart.to_string().down().has_prefix(prefix.down())) { - ret.add(jid.resourcepart.to_string()); + string resourcepart = jid.resourcepart.to_string(); + if (resourcepart.down().has_prefix(prefix.down()) && !ret.contains(resourcepart)) { + filtered_occupants.add(resourcepart); } } } - ret.sort(); + filtered_occupants.sort(); + + ret.add_all(filtered_occupants); return ret; } }