diff options
author | fiaxh <git@mx.ax.lt> | 2017-08-18 00:46:40 +0200 |
---|---|---|
committer | fiaxh <git@mx.ax.lt> | 2017-08-19 00:31:44 +0200 |
commit | dff8e08669996936cb58884c71b5ecd6ad7b1f76 (patch) | |
tree | 1bed7be48a042ca788f466a149ab0f434a53c34f /libdino/src/service/message_storage.vala | |
parent | 299f52df3af8bc7dafcd9a5a6e12d31042734357 (diff) | |
download | dino-dff8e08669996936cb58884c71b5ecd6ad7b1f76.tar.gz dino-dff8e08669996936cb58884c71b5ecd6ad7b1f76.zip |
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
Diffstat (limited to 'libdino/src/service/message_storage.vala')
-rw-r--r-- | libdino/src/service/message_storage.vala | 22 |
1 files changed, 13 insertions, 9 deletions
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<Conversation, Gee.List<Message>> messages = new HashMap<Conversation, Gee.List<Entities.Message>>(Conversation.hash_func, Conversation.equals_func); + private HashMap<Conversation, Gee.TreeSet<Message>> messages = new HashMap<Conversation, Gee.TreeSet<Message>>(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<Message> 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<Message> ret = new ArrayList<Message>(Message.equals_func); + foreach (Message message in messages[conversation]) { + if (ret.size >= count) break; + ret.add(message); } - return new ArrayList<Message>(); + 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<Message>((a, b) => { return -1 * a.local_time.compare(b.local_time); }); + Gee.List<Message> 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 +} |