git » sdk » commit 9f7a944

queries: Add PubsubPublish query class

author Matthew Wild
2024-12-02 14:20:02 UTC
committer Matthew Wild
2024-12-02 14:20:02 UTC
parent 4b2faf0af0c86409c61e588c94854186ae53cec1

queries: Add PubsubPublish query class

snikket/queries/PubsubPublish.hx +97 -0

diff --git a/snikket/queries/PubsubPublish.hx b/snikket/queries/PubsubPublish.hx
new file mode 100644
index 0000000..6f9fc2f
--- /dev/null
+++ b/snikket/queries/PubsubPublish.hx
@@ -0,0 +1,97 @@
+package snikket.queries;
+
+import haxe.DynamicAccess;
+import haxe.Exception;
+
+import snikket.ID;
+import snikket.ResultSet;
+import snikket.Stanza;
+import snikket.Stream;
+import snikket.queries.GenericQuery;
+
+@:structInit
+class PubsubConfig {
+	public var max_items:Null<Int>;
+	public var persist_items:Null<Bool>;
+	public var access_model:Null<String>;
+	public var publish_model:Null<String>;
+	public var send_last_published_item:Null<String>;
+
+	public function toDataform():Stanza {
+		var form = new Stanza("x", { xmlns: "jabber:x:data", type: "submit" })
+			.tag("field", { "var": "FORM_TYPE", "type": "hidden"})
+				.textTag("value", "http://jabber.org/protocol/pubsub#publish-options")
+			.up();
+		if(max_items != null) {
+			form.tag("field", { "var": "pubsub#max_items" })
+				.textTag("value", Std.string(max_items))
+				.up();
+		}
+		if(persist_items != null) {
+			form.tag("field", { "var": "pubsub#persist_items"})
+				.textTag("value", persist_items?"true":"false")
+				.up();
+		}
+		if(access_model != null) {
+			form.tag("field", { "var": "pubsub#access_model"})
+				.textTag("value", access_model)
+				.up();
+		}
+		if(publish_model != null) {
+			form.tag("field", { "var": "pubsub#publish_model"})
+				.textTag("value", publish_model)
+				.up();
+		}
+		if(send_last_published_item != null) {
+			form.tag("field", { "var": "pubsub#send_last_published_item"})
+				.textTag("value", send_last_published_item)
+				.up();
+		}
+		form.up();
+		return form;
+	}
+}
+
+class PubsubPublish extends GenericQuery {
+	public var xmlns(default, null) = "http://jabber.org/protocol/pubsub";
+	public var queryId:String = null;
+	public var ver:String = null;
+	public var itemId:String = null;
+	public var success:Bool = false;
+	public var error:StanzaError = null;
+
+	public function new(to: Null<String>, node: String, ?itemId_: String, ?payload: Stanza, ?config: PubsubConfig) {
+		/* Build basic query */
+		queryId = ID.short();
+		itemId = itemId_;
+		queryStanza = new Stanza("iq", { to: to, type: "set", id: queryId });
+		final items = queryStanza
+			.tag("pubsub", { xmlns: xmlns })
+			.tag("publish", { node: node })
+			.tag("item", { id: itemId });
+		if (payload != null) {
+			queryStanza.addChild(payload);
+		}
+		queryStanza.up().up();
+		if(config != null) {
+			queryStanza.tag("publish-options")
+				.addChild(config.toDataform())
+				.up();
+		}
+		queryStanza.up();
+	}
+
+	public function handleResponse(stanza:Stanza) {
+		if(stanza.attr.get("type") == "error") {
+			success = false;
+			error = stanza.getError();
+		} else {
+			success = true;
+			var returnedItemId = stanza.findText("{http://jabber.org/protocol/pubsub}pubsub/publish/item@id");
+			if (returnedItemId != null) {
+				itemId = returnedItemId;
+			}
+		}
+		finish();
+	}
+}