From 6c6e7e3aa7935ec513b7e5ea9b53a92b741ecf92 Mon Sep 17 00:00:00 2001 From: fiaxh Date: Fri, 8 Jul 2022 16:33:40 +0200 Subject: Rewrite MAM logic and add MUC MAM --- .../xep/0313_2_message_archive_management.vala | 80 ++++++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 xmpp-vala/src/module/xep/0313_2_message_archive_management.vala (limited to 'xmpp-vala/src/module/xep/0313_2_message_archive_management.vala') diff --git a/xmpp-vala/src/module/xep/0313_2_message_archive_management.vala b/xmpp-vala/src/module/xep/0313_2_message_archive_management.vala new file mode 100644 index 00000000..a710a459 --- /dev/null +++ b/xmpp-vala/src/module/xep/0313_2_message_archive_management.vala @@ -0,0 +1,80 @@ +using Gee; +using Xmpp.Xep; + +namespace Xmpp.MessageArchiveManagement.V2 { + + public class MamQueryParams { + public bool use_ns2_extended = false; + + public string query_id = Xmpp.random_uuid(); + public Jid mam_server { get; set; } + public Jid? with { get; set; } + // "The 'start' field is used to filter out messages before a certain date/time." + public DateTime? start { get; set; } + // "the 'end' field is used to exclude from the results messages after a certain point in time" + public DateTime? end { get; set; } + public string? start_id { get; set; } + public string? end_id { get; set; } + + public MamQueryParams.query_latest(Jid mam_server, DateTime? latest_known_time, string? latest_known_id) { + this.mam_server = mam_server; + this.start = latest_known_time; + this.start_id = latest_known_id; + } + + public MamQueryParams.query_between(Jid mam_server, + DateTime? earliest_time, string? earliest_id, + DateTime? latest_time, string? latest_id) { + this.mam_server = mam_server; + this.start = earliest_time; + this.start_id = earliest_id; + this.end = latest_time; + this.end_id = latest_id; + } + + public MamQueryParams.query_before(Jid mam_server, DateTime? earliest_time, string? earliest_id) { + this.mam_server = mam_server; + this.end = earliest_time; + this.end_id = earliest_id; + } + } + + private StanzaNode create_base_query(XmppStream stream, MamQueryParams mam_params) { + var fields = new ArrayList(); + + if (mam_params.with != null) { + DataForms.DataForm.Field field = new DataForms.DataForm.Field() { var="with" }; + field.set_value_string(mam_params.with.to_string()); + fields.add(field); + } + if (mam_params.start != null) { + DataForms.DataForm.Field field = new DataForms.DataForm.Field() { var="start" }; + field.set_value_string(DateTimeProfiles.to_datetime(mam_params.start)); + fields.add(field); + } + if (mam_params.end != null) { + DataForms.DataForm.Field field = new DataForms.DataForm.Field() { var="end" }; + field.set_value_string(DateTimeProfiles.to_datetime(mam_params.end)); + fields.add(field); + } + + return MessageArchiveManagement.create_base_query(stream, MessageArchiveManagement.NS_URI_2, mam_params.query_id, fields); + } + + public async QueryResult query_archive(XmppStream stream, MamQueryParams mam_params) { + var query_node = create_base_query(stream, mam_params); + if (!mam_params.use_ns2_extended) { + query_node.put_node(ResultSetManagement.create_set_rsm_node_before(mam_params.end_id)); + } + + return yield MessageArchiveManagement.query_archive(stream, MessageArchiveManagement.NS_URI_2, mam_params.mam_server, query_node); + } + + public async QueryResult page_through_results(XmppStream stream, MamQueryParams mam_params, QueryResult prev_result) { + var query_node = create_base_query(stream, mam_params); + query_node.put_node(ResultSetManagement.create_set_rsm_node_before(prev_result.first)); + + return yield MessageArchiveManagement.query_archive(stream, MessageArchiveManagement.NS_URI_2, mam_params.mam_server, query_node); + } +} + -- cgit v1.2.3-54-g00ecf