aboutsummaryrefslogtreecommitdiff
path: root/xmpp-vala/src/module/xep/0313_2_message_archive_management.vala
diff options
context:
space:
mode:
Diffstat (limited to 'xmpp-vala/src/module/xep/0313_2_message_archive_management.vala')
-rw-r--r--xmpp-vala/src/module/xep/0313_2_message_archive_management.vala80
1 files changed, 80 insertions, 0 deletions
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<DataForms.DataForm.Field>();
+
+ 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);
+ }
+}
+