aboutsummaryrefslogtreecommitdiff
path: root/libdino/src/service/content_item_store.vala
diff options
context:
space:
mode:
authorfiaxh <git@lightrise.org>2023-01-06 16:14:47 +0100
committerfiaxh <git@lightrise.org>2023-01-11 19:49:03 +0100
commitcb3b19b01deb8460627578b885339e7528411f6f (patch)
treee879305f4f43b0f88c44aeef4c02fde3f101b1e9 /libdino/src/service/content_item_store.vala
parent0c4aea96ffbc05d6efeb9a83424b872ce7f30d88 (diff)
downloaddino-cb3b19b01deb8460627578b885339e7528411f6f.tar.gz
dino-cb3b19b01deb8460627578b885339e7528411f6f.zip
Support replies and reactions to files
Diffstat (limited to 'libdino/src/service/content_item_store.vala')
-rw-r--r--libdino/src/service/content_item_store.vala95
1 files changed, 90 insertions, 5 deletions
diff --git a/libdino/src/service/content_item_store.vala b/libdino/src/service/content_item_store.vala
index 6a9e691f..b3e32cf4 100644
--- a/libdino/src/service/content_item_store.vala
+++ b/libdino/src/service/content_item_store.vala
@@ -44,11 +44,8 @@ public class ContentItemStore : StreamInteractionModule, Object {
Gee.TreeSet<ContentItem> items = new Gee.TreeSet<ContentItem>(ContentItem.compare_func);
foreach (var row in select) {
- int id = row[db.content_item.id];
- int content_type = row[db.content_item.content_type];
- int foreign_id = row[db.content_item.foreign_id];
- DateTime time = new DateTime.from_unix_utc(row[db.content_item.time]);
- items.add(get_item(conversation, id, content_type, foreign_id, time));
+ ContentItem content_item = get_item_from_row(row, conversation);
+ items.add(content_item);
}
Gee.List<ContentItem> ret = new ArrayList<ContentItem>();
@@ -58,6 +55,14 @@ public class ContentItemStore : StreamInteractionModule, Object {
return ret;
}
+ private ContentItem get_item_from_row(Row row, Conversation conversation) throws Error {
+ int id = row[db.content_item.id];
+ int content_type = row[db.content_item.content_type];
+ int foreign_id = row[db.content_item.foreign_id];
+ DateTime time = new DateTime.from_unix_utc(row[db.content_item.time]);
+ return get_item(conversation, id, content_type, foreign_id, time);
+ }
+
private ContentItem get_item(Conversation conversation, int id, int content_type, int foreign_id, DateTime time) throws Error {
switch (content_type) {
case 1:
@@ -112,6 +117,86 @@ public class ContentItemStore : StreamInteractionModule, Object {
return item.size > 0 ? item[0] : null;
}
+ public string? get_message_id_for_content_item(Conversation conversation, ContentItem content_item) {
+ Message? message = get_message_for_content_item(conversation, content_item);
+ if (message == null) return null;
+
+ if (conversation.type_ == Conversation.Type.CHAT) {
+ return message.stanza_id;
+ } else {
+ return message.server_id;
+ }
+ }
+
+ public Jid? get_message_sender_for_content_item(Conversation conversation, ContentItem content_item) {
+ Message? message = get_message_for_content_item(conversation, content_item);
+ if (message == null) return null;
+ return message.from;
+ }
+
+ private Message? get_message_for_content_item(Conversation conversation, ContentItem content_item) {
+ FileItem? file_item = content_item as FileItem;
+ if (file_item != null) {
+ if (file_item.file_transfer.provider != 0 || file_item.file_transfer.info == null) return null;
+
+ int message_db_id = int.parse(file_item.file_transfer.info);
+ return stream_interactor.get_module(MessageStorage.IDENTITY).get_message_by_id(message_db_id, conversation);
+ }
+ MessageItem? message_item = content_item as MessageItem;
+ if (message_item != null) {
+ return message_item.message;
+ }
+ return null;
+ }
+
+ public ContentItem? get_content_item_for_message_id(Conversation conversation, string message_id) {
+ Row? row = get_content_item_row_for_message_id(conversation, message_id);
+ if (row != null) {
+ return get_item_from_row(row, conversation);
+ }
+ return null;
+ }
+
+ public int get_content_item_id_for_message_id(Conversation conversation, string message_id) {
+ Row? row = get_content_item_row_for_message_id(conversation, message_id);
+ if (row != null) {
+ return row[db.content_item.id];
+ }
+ return -1;
+ }
+
+ private Row? get_content_item_row_for_message_id(Conversation conversation, string message_id) {
+ var content_item_row = db.content_item.select();
+
+ Message? message = null;
+ if (conversation.type_ == Conversation.Type.CHAT) {
+ message = stream_interactor.get_module(MessageStorage.IDENTITY).get_message_by_stanza_id(message_id, conversation);
+ } else {
+ message = stream_interactor.get_module(MessageStorage.IDENTITY).get_message_by_server_id(message_id, conversation);
+ }
+ if (message == null) return null;
+
+ RowOption file_transfer_row = db.file_transfer.select()
+ .with(db.file_transfer.account_id, "=", conversation.account.id)
+ .with(db.file_transfer.counterpart_id, "=", db.get_jid_id(conversation.counterpart))
+ .with(db.file_transfer.info, "=", message.id.to_string())
+ .order_by(db.file_transfer.time, "DESC")
+ .single().row();
+
+ if (file_transfer_row.is_present()) {
+ content_item_row.with(db.content_item.foreign_id, "=", file_transfer_row[db.file_transfer.id])
+ .with(db.content_item.content_type, "=", 2);
+ } else {
+ content_item_row.with(db.content_item.foreign_id, "=", message.id)
+ .with(db.content_item.content_type, "=", 1);
+ }
+ RowOption content_item_row_option = content_item_row.single().row();
+ if (content_item_row_option.is_present()) {
+ return content_item_row_option.inner;
+ }
+ return null;
+ }
+
public ContentItem? get_latest(Conversation conversation) {
Gee.List<ContentItem> items = get_n_latest(conversation, 1);
if (items.size > 0) {