From dff8e08669996936cb58884c71b5ecd6ad7b1f76 Mon Sep 17 00:00:00 2001 From: fiaxh Date: Fri, 18 Aug 2017 00:46:40 +0200 Subject: MAM fixes - don't send first request for timestamp -60 - only open conversation for messages within last 24h - always show latest message in conversation tabs --- libdino/src/service/message_storage.vala | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) (limited to 'libdino/src/service/message_storage.vala') diff --git a/libdino/src/service/message_storage.vala b/libdino/src/service/message_storage.vala index 8812d950..1cde1a95 100644 --- a/libdino/src/service/message_storage.vala +++ b/libdino/src/service/message_storage.vala @@ -11,7 +11,7 @@ public class MessageStorage : StreamInteractionModule, Object { private StreamInteractor stream_interactor; private Database db; - private HashMap> messages = new HashMap>(Conversation.hash_func, Conversation.equals_func); + private HashMap> messages = new HashMap>(Conversation.hash_func, Conversation.equals_func); public static void start(StreamInteractor stream_interactor, Database db) { MessageStorage m = new MessageStorage(stream_interactor, db); @@ -31,16 +31,18 @@ public class MessageStorage : StreamInteractionModule, Object { public Gee.List get_messages(Conversation conversation, int count = 50) { init_conversation(conversation); - if (messages[conversation].size > 0) { - return messages[conversation][int.max(messages[conversation].size - count - 1, 0) : messages[conversation].size]; + Gee.List ret = new ArrayList(Message.equals_func); + foreach (Message message in messages[conversation]) { + if (ret.size >= count) break; + ret.add(message); } - return new ArrayList(); + return ret; } public Message? get_last_message(Conversation conversation) { init_conversation(conversation); if (messages[conversation].size > 0) { - return messages[conversation][messages[conversation].size - 1]; + return messages[conversation].first(); } return null; } @@ -52,17 +54,19 @@ public class MessageStorage : StreamInteractionModule, Object { public Message? get_message_by_id(string stanza_id, Conversation conversation) { init_conversation(conversation); - for (int i = messages[conversation].size - 1; i > 0; i--) { - if (messages[conversation][i].stanza_id == stanza_id) return messages[conversation][i]; + foreach (Message message in messages[conversation]) { + if (message.stanza_id == stanza_id) return message; } return null; } private void init_conversation(Conversation conversation) { if (!messages.has_key(conversation)) { - messages[conversation] = db.get_messages(conversation.counterpart, conversation.account, Util.get_message_type_for_conversation(conversation), 50, null); + messages[conversation] = new Gee.TreeSet((a, b) => { return -1 * a.local_time.compare(b.local_time); }); + Gee.List db_messages = db.get_messages(conversation.counterpart, conversation.account, Util.get_message_type_for_conversation(conversation), 50, null); + messages[conversation].add_all(db_messages); } } } -} \ No newline at end of file +} -- cgit v1.2.3-70-g09d2