aboutsummaryrefslogtreecommitdiff
path: root/libdino/src/service/message_storage.vala
diff options
context:
space:
mode:
authorfiaxh <git@mx.ax.lt>2017-08-18 00:46:40 +0200
committerfiaxh <git@mx.ax.lt>2017-08-19 00:31:44 +0200
commitdff8e08669996936cb58884c71b5ecd6ad7b1f76 (patch)
tree1bed7be48a042ca788f466a149ab0f434a53c34f /libdino/src/service/message_storage.vala
parent299f52df3af8bc7dafcd9a5a6e12d31042734357 (diff)
downloaddino-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.vala22
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
+}