diff options
Diffstat (limited to 'libdino/src/service/notification_events.vala')
-rw-r--r-- | libdino/src/service/notification_events.vala | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/libdino/src/service/notification_events.vala b/libdino/src/service/notification_events.vala index 5db581ba..13fef3e3 100644 --- a/libdino/src/service/notification_events.vala +++ b/libdino/src/service/notification_events.vala @@ -14,6 +14,9 @@ public class NotificationEvents : StreamInteractionModule, Object { private StreamInteractor stream_interactor; + private HashMap<Account, HashMap<Conversation, Entities.Message>> mam_potential_new = new HashMap<Account, HashMap<Conversation, Entities.Message>>(Account.hash_func, Account.equals_func); + private Gee.List<Account> synced_accounts = new ArrayList<Account>(); + public static void start(StreamInteractor stream_interactor) { NotificationEvents m = new NotificationEvents(stream_interactor); stream_interactor.add_module(m); @@ -24,9 +27,29 @@ public class NotificationEvents : StreamInteractionModule, Object { stream_interactor.get_module(MessageProcessor.IDENTITY).message_received.connect(on_message_received); stream_interactor.get_module(PresenceManager.IDENTITY).received_subscription_request.connect(on_received_subscription_request); + stream_interactor.get_module(MessageProcessor.IDENTITY).history_synced.connect((account) => { + synced_accounts.add(account); + if (!mam_potential_new.has_key(account)) return; + foreach (Conversation c in mam_potential_new[account].keys) { + Entities.Message m = mam_potential_new[account][c]; + Entities.Message last_message = stream_interactor.get_module(MessageStorage.IDENTITY).get_last_message(c); + if (m.equals(last_message) && !c.read_up_to.equals(m)) { + on_message_received(m, c); + } + } + mam_potential_new[account].clear(); + }); } private void on_message_received(Entities.Message message, Conversation conversation) { + if (!synced_accounts.contains(conversation.account)) { + if (!mam_potential_new.has_key(conversation.account)) { + mam_potential_new[conversation.account] = new HashMap<Conversation, Entities.Message>(Conversation.hash_func, Conversation.equals_func); + } + mam_potential_new[conversation.account][conversation] = message; + return; + } + if (!should_notify_message(message, conversation)) return; if (!should_notify_message(message, conversation)) return; if (stream_interactor.get_module(ChatInteraction.IDENTITY).is_active_focus()) return; notify_message(message, conversation); |