mod_pubsub_subscription/mod_pubsub_subscription.lua
author Matthew Wild <mwild1@gmail.com>
Tue, 12 Mar 2024 14:07:00 +0000
changeset 5868 b5a110544fd4
parent 5655 b40750891bee
permissions -rw-r--r--
mod_report_forward: Include id on report submissions
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
4515
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     1
local st = require "util.stanza";
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     2
local uuid = require "util.uuid";
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     3
local mt = require "util.multitable";
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     4
local cache = require "util.cache";
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     5
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     6
local xmlns_pubsub = "http://jabber.org/protocol/pubsub";
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     7
local xmlns_pubsub_event = "http://jabber.org/protocol/pubsub#event";
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     8
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     9
-- TODO persist
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    10
-- TODO query known pubsub nodes to sync current subscriptions
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    11
-- TODO subscription ids per 'item' would be handy
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    12
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    13
local pending_subscription = cache.new(256); -- uuid → node
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    14
local pending_unsubscription = cache.new(256); -- uuid → node
5655
b40750891bee mod_pubsub_subscription: support subscribing from a bare JID
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 4515
diff changeset
    15
local active_subscriptions = mt.new() -- service | node | subscriber | uuid | { item }
4515
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    16
function module.save()
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    17
	return { active_subscriptions = active_subscriptions.data }
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    18
end
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    19
function module.restore(data)
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    20
	if data and data.active_subscriptions then
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    21
		active_subscriptions.data = data.active_subscriptions
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    22
	end
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    23
end
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    24
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    25
local valid_events = {"subscribed"; "unsubscribed"; "error"; "item"; "retract"; "purge"; "delete"}
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    26
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    27
local function subscription_added(item_event)
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    28
	local item = item_event.item;
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    29
	assert(item.service, "pubsub subscription item MUST have a 'service' field.");
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    30
	assert(item.node, "pubsub subscription item MUST have a 'node' field.");
5655
b40750891bee mod_pubsub_subscription: support subscribing from a bare JID
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 4515
diff changeset
    31
	item.from = item.from or module.host;
4515
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    32
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    33
	local already_subscibed = false;
5655
b40750891bee mod_pubsub_subscription: support subscribing from a bare JID
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 4515
diff changeset
    34
	for _ in active_subscriptions:iter(item.service, item.node, item.from, nil) do -- luacheck: ignore 512
4515
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    35
		already_subscibed = true;
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    36
		break
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    37
	end
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    38
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    39
	item._id = uuid.generate();
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    40
	local iq_id = uuid.generate();
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    41
	pending_subscription:set(iq_id, item._id);
5655
b40750891bee mod_pubsub_subscription: support subscribing from a bare JID
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 4515
diff changeset
    42
	active_subscriptions:set(item.service, item.node, item.from, item._id, item);
4515
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    43
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    44
	if not already_subscibed then
5655
b40750891bee mod_pubsub_subscription: support subscribing from a bare JID
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 4515
diff changeset
    45
		module:send(st.iq({ type = "set", id = iq_id, from = item.from, to = item.service })
4515
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    46
			:tag("pubsub", { xmlns = xmlns_pubsub })
5655
b40750891bee mod_pubsub_subscription: support subscribing from a bare JID
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 4515
diff changeset
    47
				:tag("subscribe", { jid = item.from, node = item.node }));
4515
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    48
	end
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    49
end
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    50
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    51
for _, event_name in ipairs(valid_events) do
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    52
	module:hook("pubsub-event/host/"..event_name, function (event)
5655
b40750891bee mod_pubsub_subscription: support subscribing from a bare JID
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 4515
diff changeset
    53
		for _, _, _, _, _, cb in active_subscriptions:iter(event.service, event.node, event.stanza.attr.to, nil, "on_"..event_name) do
b40750891bee mod_pubsub_subscription: support subscribing from a bare JID
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 4515
diff changeset
    54
			pcall(cb, event);
b40750891bee mod_pubsub_subscription: support subscribing from a bare JID
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 4515
diff changeset
    55
		end
b40750891bee mod_pubsub_subscription: support subscribing from a bare JID
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 4515
diff changeset
    56
	end);
b40750891bee mod_pubsub_subscription: support subscribing from a bare JID
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 4515
diff changeset
    57
b40750891bee mod_pubsub_subscription: support subscribing from a bare JID
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 4515
diff changeset
    58
	module:hook("pubsub-event/bare/"..event_name, function (event)
b40750891bee mod_pubsub_subscription: support subscribing from a bare JID
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 4515
diff changeset
    59
		for _, _, _, _, _, cb in active_subscriptions:iter(event.service, event.node, event.stanza.attr.to, nil, "on_"..event_name) do
4515
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    60
			pcall(cb, event);
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    61
		end
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    62
	end);
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    63
end
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    64
5655
b40750891bee mod_pubsub_subscription: support subscribing from a bare JID
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 4515
diff changeset
    65
function handle_iq(context, event)
4515
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    66
	local stanza = event.stanza;
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    67
	local service = stanza.attr.from;
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    68
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    69
	if not stanza.attr.id then return end -- shouldn't be possible
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    70
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    71
	local subscribed_node = pending_subscription:get(stanza.attr.id);
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    72
	pending_subscription:set(stanza.attr.id, nil);
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    73
	local unsubscribed_node = pending_unsubscription:get(stanza.attr.id);
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    74
	pending_unsubscription:set(stanza.attr.id, nil);
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    75
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    76
	if stanza.attr.type == "result" then
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    77
		local pubsub_wrapper = stanza:get_child("pubsub", xmlns_pubsub);
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    78
		local subscription = pubsub_wrapper and pubsub_wrapper:get_child("subscription");
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    79
		if not subscription then return end
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    80
		local node = subscription.attr.node;
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    81
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    82
		local what;
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    83
		if subscription.attr.subscription == "subscribed" then
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    84
			what = "on_subscribed";
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    85
		elseif subscription.attr.subscription == "none" then
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    86
			what = "on_unsubscribed";
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    87
		end
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    88
		if not what then return end -- there are other states but we don't handle them
5655
b40750891bee mod_pubsub_subscription: support subscribing from a bare JID
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 4515
diff changeset
    89
		for _, _, _, _, _, cb in active_subscriptions:iter(service, node, stanza.attr.to, nil, what) do
4515
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    90
			cb(event);
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    91
		end
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    92
		return true;
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    93
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    94
	elseif stanza.attr.type == "error" then
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    95
		local node = subscribed_node or unsubscribed_node;
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    96
		local error_type, error_condition, reason, pubsub_error = stanza:get_error();
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    97
		local err = { type = error_type, condition = error_condition, text = reason, extra = pubsub_error };
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    98
		if active_subscriptions:get(service) then
5655
b40750891bee mod_pubsub_subscription: support subscribing from a bare JID
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 4515
diff changeset
    99
			for _, _, _, _, _, cb in active_subscriptions:iter(service, node, stanza.attr.to, nil, "on_error") do
4515
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   100
				cb(err);
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   101
			end
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   102
			return true;
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   103
		end
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   104
	end
5655
b40750891bee mod_pubsub_subscription: support subscribing from a bare JID
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 4515
diff changeset
   105
end
b40750891bee mod_pubsub_subscription: support subscribing from a bare JID
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 4515
diff changeset
   106
b40750891bee mod_pubsub_subscription: support subscribing from a bare JID
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 4515
diff changeset
   107
module:hook("iq/host", function (event)
b40750891bee mod_pubsub_subscription: support subscribing from a bare JID
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 4515
diff changeset
   108
	handle_iq("host", event);
b40750891bee mod_pubsub_subscription: support subscribing from a bare JID
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 4515
diff changeset
   109
end, 1);
b40750891bee mod_pubsub_subscription: support subscribing from a bare JID
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 4515
diff changeset
   110
b40750891bee mod_pubsub_subscription: support subscribing from a bare JID
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 4515
diff changeset
   111
module:hook("iq/bare", function (event)
b40750891bee mod_pubsub_subscription: support subscribing from a bare JID
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 4515
diff changeset
   112
	handle_iq("bare", event);
4515
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   113
end, 1);
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   114
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   115
local function subscription_removed(item_event)
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   116
	local item = item_event.item;
5655
b40750891bee mod_pubsub_subscription: support subscribing from a bare JID
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 4515
diff changeset
   117
	active_subscriptions:set(item.service, item.node, item.from, item._id, nil);
b40750891bee mod_pubsub_subscription: support subscribing from a bare JID
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 4515
diff changeset
   118
	local node_subs = active_subscriptions:get(item.service, item.node, item.from);
4515
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   119
	if node_subs and next(node_subs) then return end
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   120
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   121
	local iq_id = uuid.generate();
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   122
	pending_unsubscription:set(iq_id, item._id);
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   123
5655
b40750891bee mod_pubsub_subscription: support subscribing from a bare JID
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 4515
diff changeset
   124
	module:send(st.iq({ type = "set", id = iq_id, from = item.from, to = item.service })
4515
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   125
		:tag("pubsub", { xmlns = xmlns_pubsub })
5655
b40750891bee mod_pubsub_subscription: support subscribing from a bare JID
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 4515
diff changeset
   126
			:tag("unsubscribe", { jid = item.from, node = item.node }))
4515
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   127
end
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   128
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   129
module:handle_items("pubsub-subscription", subscription_added, subscription_removed, true);
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   130
5655
b40750891bee mod_pubsub_subscription: support subscribing from a bare JID
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 4515
diff changeset
   131
function handle_message(context, event)
4515
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   132
	local origin, stanza = event.origin, event.stanza;
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   133
	local ret = nil;
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   134
	local service = stanza.attr.from;
5655
b40750891bee mod_pubsub_subscription: support subscribing from a bare JID
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 4515
diff changeset
   135
	module:log("debug", "Got message/%s: %s", context, stanza:top_tag());
4515
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   136
	for event_container in stanza:childtags("event", xmlns_pubsub_event) do
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   137
		for pubsub_event in event_container:childtags() do
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   138
			module:log("debug", "Got pubsub event %s", pubsub_event:top_tag());
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   139
			local node = pubsub_event.attr.node;
5655
b40750891bee mod_pubsub_subscription: support subscribing from a bare JID
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 4515
diff changeset
   140
			module:fire_event("pubsub-event/" .. context .. "/"..pubsub_event.name, {
4515
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   141
					stanza = stanza;
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   142
					origin = origin;
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   143
					event = pubsub_event;
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   144
					service = service;
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   145
					node = node;
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   146
				});
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   147
			ret = true;
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   148
		end
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   149
	end
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   150
	return ret;
5655
b40750891bee mod_pubsub_subscription: support subscribing from a bare JID
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 4515
diff changeset
   151
end
b40750891bee mod_pubsub_subscription: support subscribing from a bare JID
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 4515
diff changeset
   152
b40750891bee mod_pubsub_subscription: support subscribing from a bare JID
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 4515
diff changeset
   153
module:hook("message/host", function(event)
b40750891bee mod_pubsub_subscription: support subscribing from a bare JID
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 4515
diff changeset
   154
	return handle_message("host", event);
4515
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   155
end);
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   156
5655
b40750891bee mod_pubsub_subscription: support subscribing from a bare JID
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 4515
diff changeset
   157
module:hook("message/bare", function(event)
b40750891bee mod_pubsub_subscription: support subscribing from a bare JID
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 4515
diff changeset
   158
	return handle_message("bare", event);
b40750891bee mod_pubsub_subscription: support subscribing from a bare JID
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 4515
diff changeset
   159
end);
b40750891bee mod_pubsub_subscription: support subscribing from a bare JID
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 4515
diff changeset
   160
b40750891bee mod_pubsub_subscription: support subscribing from a bare JID
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 4515
diff changeset
   161
b40750891bee mod_pubsub_subscription: support subscribing from a bare JID
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 4515
diff changeset
   162
function handle_items(context, event)
4515
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   163
	for item in event.event:childtags() do
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   164
		module:log("debug", "Got pubsub item event %s", item:top_tag());
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   165
		event.item = item;
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   166
		event.payload = item.tags[1];
5655
b40750891bee mod_pubsub_subscription: support subscribing from a bare JID
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 4515
diff changeset
   167
		module:fire_event("pubsub-event/" .. context .. "/"..item.name, event);
4515
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   168
	end
5655
b40750891bee mod_pubsub_subscription: support subscribing from a bare JID
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 4515
diff changeset
   169
end
b40750891bee mod_pubsub_subscription: support subscribing from a bare JID
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 4515
diff changeset
   170
b40750891bee mod_pubsub_subscription: support subscribing from a bare JID
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 4515
diff changeset
   171
module:hook("pubsub-event/host/items", function (event)
b40750891bee mod_pubsub_subscription: support subscribing from a bare JID
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 4515
diff changeset
   172
	handle_items("host", event);
4515
97fac0ba0469 mod_pubsub_subscription: New module providing an API for pubsub subscriptions
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   173
end);
5655
b40750891bee mod_pubsub_subscription: support subscribing from a bare JID
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 4515
diff changeset
   174
b40750891bee mod_pubsub_subscription: support subscribing from a bare JID
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 4515
diff changeset
   175
module:hook("pubsub-event/bare/items", function (event)
b40750891bee mod_pubsub_subscription: support subscribing from a bare JID
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 4515
diff changeset
   176
	handle_items("bare", event);
b40750891bee mod_pubsub_subscription: support subscribing from a bare JID
Stephen Paul Weber <singpolyma@singpolyma.net>
parents: 4515
diff changeset
   177
end);