plugins/mod_presence.lua
author Waqas Hussain <waqas20@gmail.com>
Sun, 05 Jul 2009 12:17:22 +0500
changeset 1474 6947761fd531
parent 1473 d2211cbb822f
child 1475 16c8b1a8f6a7
permissions -rw-r--r--
mod_presence: Simplified roster iteration
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1009
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
     1
-- Prosody IM v0.4
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
     2
-- Copyright (C) 2008-2009 Matthew Wild
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
     3
-- Copyright (C) 2008-2009 Waqas Hussain
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
     4
-- 
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
     5
-- This project is MIT/X11 licensed. Please see the
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
     6
-- COPYING file in the source package for more information.
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
     7
--
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
     8
1210
342f401f354c mod_presence: Use logger supplied by modulemanager
Matthew Wild <mwild1@gmail.com>
parents: 1209
diff changeset
     9
local log = module._log;
1009
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    10
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    11
local require = require;
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    12
local pairs, ipairs = pairs, ipairs;
1470
af4b918e3432 mod_presence: Declare t_insert, fixes a potential traceback
Matthew Wild <mwild1@gmail.com>
parents: 1463
diff changeset
    13
local t_concat, t_insert = table.concat, table.insert;
1009
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    14
local s_find = string.find;
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    15
local tonumber = tonumber;
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    16
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    17
local st = require "util.stanza";
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    18
local jid_split = require "util.jid".split;
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    19
local jid_bare = require "util.jid".bare;
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    20
local hosts = hosts;
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    21
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    22
local rostermanager = require "core.rostermanager";
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    23
local sessionmanager = require "core.sessionmanager";
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    24
local offlinemanager = require "core.offlinemanager";
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    25
1044
41a0c76127f4 mod_presence: Fix for local presence subscriptions and probes
Waqas Hussain <waqas20@gmail.com>
parents: 1023
diff changeset
    26
local _core_route_stanza = core_route_stanza;
41a0c76127f4 mod_presence: Fix for local presence subscriptions and probes
Waqas Hussain <waqas20@gmail.com>
parents: 1023
diff changeset
    27
local core_route_stanza;
41a0c76127f4 mod_presence: Fix for local presence subscriptions and probes
Waqas Hussain <waqas20@gmail.com>
parents: 1023
diff changeset
    28
function core_route_stanza(origin, stanza)
41a0c76127f4 mod_presence: Fix for local presence subscriptions and probes
Waqas Hussain <waqas20@gmail.com>
parents: 1023
diff changeset
    29
	if stanza.attr.type ~= nil and stanza.attr.type ~= "unavailable" and stanza.attr.type ~= "error" then
41a0c76127f4 mod_presence: Fix for local presence subscriptions and probes
Waqas Hussain <waqas20@gmail.com>
parents: 1023
diff changeset
    30
		local node, host = jid_split(stanza.attr.to);
41a0c76127f4 mod_presence: Fix for local presence subscriptions and probes
Waqas Hussain <waqas20@gmail.com>
parents: 1023
diff changeset
    31
		host = hosts[host];
41a0c76127f4 mod_presence: Fix for local presence subscriptions and probes
Waqas Hussain <waqas20@gmail.com>
parents: 1023
diff changeset
    32
		if host and host.type == "local" then
41a0c76127f4 mod_presence: Fix for local presence subscriptions and probes
Waqas Hussain <waqas20@gmail.com>
parents: 1023
diff changeset
    33
			handle_inbound_presence_subscriptions_and_probes(origin, stanza, jid_bare(stanza.attr.from), jid_bare(stanza.attr.to), core_route_stanza);
41a0c76127f4 mod_presence: Fix for local presence subscriptions and probes
Waqas Hussain <waqas20@gmail.com>
parents: 1023
diff changeset
    34
			return;
41a0c76127f4 mod_presence: Fix for local presence subscriptions and probes
Waqas Hussain <waqas20@gmail.com>
parents: 1023
diff changeset
    35
		end
41a0c76127f4 mod_presence: Fix for local presence subscriptions and probes
Waqas Hussain <waqas20@gmail.com>
parents: 1023
diff changeset
    36
	end
41a0c76127f4 mod_presence: Fix for local presence subscriptions and probes
Waqas Hussain <waqas20@gmail.com>
parents: 1023
diff changeset
    37
	_core_route_stanza(origin, stanza);
41a0c76127f4 mod_presence: Fix for local presence subscriptions and probes
Waqas Hussain <waqas20@gmail.com>
parents: 1023
diff changeset
    38
end
41a0c76127f4 mod_presence: Fix for local presence subscriptions and probes
Waqas Hussain <waqas20@gmail.com>
parents: 1023
diff changeset
    39
1418
d14de6cb8b5b mod_message, mod_presence: Maintain list of top resources. Less work in routing messages to bare JIDs. - #optimization
Waqas Hussain <waqas20@gmail.com>
parents: 1287
diff changeset
    40
local function select_top_resources(user)
d14de6cb8b5b mod_message, mod_presence: Maintain list of top resources. Less work in routing messages to bare JIDs. - #optimization
Waqas Hussain <waqas20@gmail.com>
parents: 1287
diff changeset
    41
	local priority = 0;
d14de6cb8b5b mod_message, mod_presence: Maintain list of top resources. Less work in routing messages to bare JIDs. - #optimization
Waqas Hussain <waqas20@gmail.com>
parents: 1287
diff changeset
    42
	local recipients = {};
d14de6cb8b5b mod_message, mod_presence: Maintain list of top resources. Less work in routing messages to bare JIDs. - #optimization
Waqas Hussain <waqas20@gmail.com>
parents: 1287
diff changeset
    43
	for _, session in pairs(user.sessions) do -- find resource with greatest priority
d14de6cb8b5b mod_message, mod_presence: Maintain list of top resources. Less work in routing messages to bare JIDs. - #optimization
Waqas Hussain <waqas20@gmail.com>
parents: 1287
diff changeset
    44
		if session.presence then
d14de6cb8b5b mod_message, mod_presence: Maintain list of top resources. Less work in routing messages to bare JIDs. - #optimization
Waqas Hussain <waqas20@gmail.com>
parents: 1287
diff changeset
    45
			-- TODO check active privacy list for session
d14de6cb8b5b mod_message, mod_presence: Maintain list of top resources. Less work in routing messages to bare JIDs. - #optimization
Waqas Hussain <waqas20@gmail.com>
parents: 1287
diff changeset
    46
			local p = session.priority;
d14de6cb8b5b mod_message, mod_presence: Maintain list of top resources. Less work in routing messages to bare JIDs. - #optimization
Waqas Hussain <waqas20@gmail.com>
parents: 1287
diff changeset
    47
			if p > priority then
d14de6cb8b5b mod_message, mod_presence: Maintain list of top resources. Less work in routing messages to bare JIDs. - #optimization
Waqas Hussain <waqas20@gmail.com>
parents: 1287
diff changeset
    48
				priority = p;
d14de6cb8b5b mod_message, mod_presence: Maintain list of top resources. Less work in routing messages to bare JIDs. - #optimization
Waqas Hussain <waqas20@gmail.com>
parents: 1287
diff changeset
    49
				recipients = {session};
d14de6cb8b5b mod_message, mod_presence: Maintain list of top resources. Less work in routing messages to bare JIDs. - #optimization
Waqas Hussain <waqas20@gmail.com>
parents: 1287
diff changeset
    50
			elseif p == priority then
d14de6cb8b5b mod_message, mod_presence: Maintain list of top resources. Less work in routing messages to bare JIDs. - #optimization
Waqas Hussain <waqas20@gmail.com>
parents: 1287
diff changeset
    51
				t_insert(recipients, session);
d14de6cb8b5b mod_message, mod_presence: Maintain list of top resources. Less work in routing messages to bare JIDs. - #optimization
Waqas Hussain <waqas20@gmail.com>
parents: 1287
diff changeset
    52
			end
d14de6cb8b5b mod_message, mod_presence: Maintain list of top resources. Less work in routing messages to bare JIDs. - #optimization
Waqas Hussain <waqas20@gmail.com>
parents: 1287
diff changeset
    53
		end
d14de6cb8b5b mod_message, mod_presence: Maintain list of top resources. Less work in routing messages to bare JIDs. - #optimization
Waqas Hussain <waqas20@gmail.com>
parents: 1287
diff changeset
    54
	end
d14de6cb8b5b mod_message, mod_presence: Maintain list of top resources. Less work in routing messages to bare JIDs. - #optimization
Waqas Hussain <waqas20@gmail.com>
parents: 1287
diff changeset
    55
	return recipients;
d14de6cb8b5b mod_message, mod_presence: Maintain list of top resources. Less work in routing messages to bare JIDs. - #optimization
Waqas Hussain <waqas20@gmail.com>
parents: 1287
diff changeset
    56
end
d14de6cb8b5b mod_message, mod_presence: Maintain list of top resources. Less work in routing messages to bare JIDs. - #optimization
Waqas Hussain <waqas20@gmail.com>
parents: 1287
diff changeset
    57
local function recalc_resource_map(origin)
d14de6cb8b5b mod_message, mod_presence: Maintain list of top resources. Less work in routing messages to bare JIDs. - #optimization
Waqas Hussain <waqas20@gmail.com>
parents: 1287
diff changeset
    58
	local user = hosts[origin.host].sessions[origin.username];
d14de6cb8b5b mod_message, mod_presence: Maintain list of top resources. Less work in routing messages to bare JIDs. - #optimization
Waqas Hussain <waqas20@gmail.com>
parents: 1287
diff changeset
    59
	user.top_resources = select_top_resources(user);
d14de6cb8b5b mod_message, mod_presence: Maintain list of top resources. Less work in routing messages to bare JIDs. - #optimization
Waqas Hussain <waqas20@gmail.com>
parents: 1287
diff changeset
    60
	if #user.top_resources == 0 then user.top_resources = nil; end
d14de6cb8b5b mod_message, mod_presence: Maintain list of top resources. Less work in routing messages to bare JIDs. - #optimization
Waqas Hussain <waqas20@gmail.com>
parents: 1287
diff changeset
    61
end
d14de6cb8b5b mod_message, mod_presence: Maintain list of top resources. Less work in routing messages to bare JIDs. - #optimization
Waqas Hussain <waqas20@gmail.com>
parents: 1287
diff changeset
    62
1009
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    63
function handle_normal_presence(origin, stanza, core_route_stanza)
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    64
	if origin.roster then
1474
6947761fd531 mod_presence: Simplified roster iteration
Waqas Hussain <waqas20@gmail.com>
parents: 1473
diff changeset
    65
		for jid, item in pairs(origin.roster) do -- broadcast to all interested contacts
6947761fd531 mod_presence: Simplified roster iteration
Waqas Hussain <waqas20@gmail.com>
parents: 1473
diff changeset
    66
			if item.subscription == "both" or item.subscription == "from" then
1009
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    67
				stanza.attr.to = jid;
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    68
				core_route_stanza(origin, stanza);
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    69
			end
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    70
		end
1473
d2211cbb822f mod_presence: Eliminated a jid_split
Waqas Hussain <waqas20@gmail.com>
parents: 1472
diff changeset
    71
		local node, host = origin.username, origin.host;
1009
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    72
		for _, res in pairs(hosts[host].sessions[node].sessions) do -- broadcast to all resources
1057
2677f5a4e66b mod_presence: Broadcast a user's presence to only the user's 'available' resources
Waqas Hussain <waqas20@gmail.com>
parents: 1044
diff changeset
    73
			if res ~= origin and res.presence then -- to resource
1009
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    74
				stanza.attr.to = res.full_jid;
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    75
				core_route_stanza(origin, stanza);
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    76
			end
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    77
		end
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    78
		if stanza.attr.type == nil and not origin.presence then -- initial presence
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    79
			local probe = st.presence({from = origin.full_jid, type = "probe"});
1474
6947761fd531 mod_presence: Simplified roster iteration
Waqas Hussain <waqas20@gmail.com>
parents: 1473
diff changeset
    80
			for jid, item in pairs(origin.roster) do -- probe all contacts we are subscribed to
6947761fd531 mod_presence: Simplified roster iteration
Waqas Hussain <waqas20@gmail.com>
parents: 1473
diff changeset
    81
				if item.subscription == "both" or item.subscription == "to" then
1009
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    82
					probe.attr.to = jid;
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    83
					core_route_stanza(origin, probe);
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    84
				end
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    85
			end
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    86
			for _, res in pairs(hosts[host].sessions[node].sessions) do -- broadcast from all available resources
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    87
				if res ~= origin and res.presence then
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    88
					res.presence.attr.to = origin.full_jid;
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    89
					core_route_stanza(res, res.presence);
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    90
					res.presence.attr.to = nil;
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    91
				end
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    92
			end
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    93
			if origin.roster.pending then -- resend incoming subscription requests
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    94
				for jid in pairs(origin.roster.pending) do
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    95
					origin.send(st.presence({type="subscribe", from=jid})); -- TODO add to attribute? Use original?
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    96
				end
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    97
			end
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    98
			local request = st.presence({type="subscribe", from=origin.username.."@"..origin.host});
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    99
			for jid, item in pairs(origin.roster) do -- resend outgoing subscription requests
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   100
				if item.ask then
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   101
					request.attr.to = jid;
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   102
					core_route_stanza(origin, request);
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   103
				end
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   104
			end
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   105
			local offline = offlinemanager.load(node, host);
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   106
			if offline then
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   107
				for _, msg in ipairs(offline) do
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   108
					origin.send(msg); -- FIXME do we need to modify to/from in any way?
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   109
				end
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   110
				offlinemanager.deleteAll(node, host);
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   111
			end
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   112
		end
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   113
		if stanza.attr.type == "unavailable" then
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   114
			origin.presence = nil;
1418
d14de6cb8b5b mod_message, mod_presence: Maintain list of top resources. Less work in routing messages to bare JIDs. - #optimization
Waqas Hussain <waqas20@gmail.com>
parents: 1287
diff changeset
   115
			if origin.priority then
d14de6cb8b5b mod_message, mod_presence: Maintain list of top resources. Less work in routing messages to bare JIDs. - #optimization
Waqas Hussain <waqas20@gmail.com>
parents: 1287
diff changeset
   116
				origin.priority = nil;
d14de6cb8b5b mod_message, mod_presence: Maintain list of top resources. Less work in routing messages to bare JIDs. - #optimization
Waqas Hussain <waqas20@gmail.com>
parents: 1287
diff changeset
   117
				recalc_resource_map(origin);
d14de6cb8b5b mod_message, mod_presence: Maintain list of top resources. Less work in routing messages to bare JIDs. - #optimization
Waqas Hussain <waqas20@gmail.com>
parents: 1287
diff changeset
   118
			end
1009
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   119
			if origin.directed then
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   120
				for jid in pairs(origin.directed) do
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   121
					stanza.attr.to = jid;
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   122
					core_route_stanza(origin, stanza);
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   123
				end
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   124
				origin.directed = nil;
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   125
			end
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   126
		else
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   127
			origin.presence = stanza;
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   128
			local priority = stanza:child_with_name("priority");
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   129
			if priority and #priority > 0 then
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   130
				priority = t_concat(priority);
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   131
				if s_find(priority, "^[+-]?[0-9]+$") then
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   132
					priority = tonumber(priority);
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   133
					if priority < -128 then priority = -128 end
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   134
					if priority > 127 then priority = 127 end
1418
d14de6cb8b5b mod_message, mod_presence: Maintain list of top resources. Less work in routing messages to bare JIDs. - #optimization
Waqas Hussain <waqas20@gmail.com>
parents: 1287
diff changeset
   135
				else priority = 0; end
d14de6cb8b5b mod_message, mod_presence: Maintain list of top resources. Less work in routing messages to bare JIDs. - #optimization
Waqas Hussain <waqas20@gmail.com>
parents: 1287
diff changeset
   136
			else priority = 0; end
d14de6cb8b5b mod_message, mod_presence: Maintain list of top resources. Less work in routing messages to bare JIDs. - #optimization
Waqas Hussain <waqas20@gmail.com>
parents: 1287
diff changeset
   137
			if origin.priority ~= priority then
d14de6cb8b5b mod_message, mod_presence: Maintain list of top resources. Less work in routing messages to bare JIDs. - #optimization
Waqas Hussain <waqas20@gmail.com>
parents: 1287
diff changeset
   138
				origin.priority = priority;
d14de6cb8b5b mod_message, mod_presence: Maintain list of top resources. Less work in routing messages to bare JIDs. - #optimization
Waqas Hussain <waqas20@gmail.com>
parents: 1287
diff changeset
   139
				recalc_resource_map(origin);
1009
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   140
			end
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   141
		end
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   142
		stanza.attr.to = nil; -- reset it
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   143
	else
1211
d60e68855176 mod_presence: Lower some log levels to their correct values
Matthew Wild <mwild1@gmail.com>
parents: 1210
diff changeset
   144
		log("warn", "presence recieved from client with no roster");
1009
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   145
	end
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   146
end
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   147
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   148
function send_presence_of_available_resources(user, host, jid, recipient_session, core_route_stanza)
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   149
	local h = hosts[host];
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   150
	local count = 0;
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   151
	if h and h.type == "local" then
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   152
		local u = h.sessions[user];
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   153
		if u then
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   154
			for k, session in pairs(u.sessions) do
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   155
				local pres = session.presence;
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   156
				if pres then
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   157
					pres.attr.to = jid;
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   158
					core_route_stanza(session, pres);
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   159
					pres.attr.to = nil;
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   160
					count = count + 1;
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   161
				end
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   162
			end
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   163
		end
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   164
	end
1211
d60e68855176 mod_presence: Lower some log levels to their correct values
Matthew Wild <mwild1@gmail.com>
parents: 1210
diff changeset
   165
	log("debug", "broadcasted presence of "..count.." resources from "..user.."@"..host.." to "..jid);
1009
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   166
	return count;
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   167
end
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   168
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   169
function handle_outbound_presence_subscriptions_and_probes(origin, stanza, from_bare, to_bare, core_route_stanza)
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   170
	local node, host = jid_split(from_bare);
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   171
	local st_from, st_to = stanza.attr.from, stanza.attr.to;
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   172
	stanza.attr.from, stanza.attr.to = from_bare, to_bare;
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   173
	log("debug", "outbound presence "..stanza.attr.type.." from "..from_bare.." for "..to_bare);
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   174
	if stanza.attr.type == "subscribe" then
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   175
		-- 1. route stanza
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   176
		-- 2. roster push (subscription = none, ask = subscribe)
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   177
		if rostermanager.set_contact_pending_out(node, host, to_bare) then
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   178
			rostermanager.roster_push(node, host, to_bare);
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   179
		end -- else file error
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   180
		core_route_stanza(origin, stanza);
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   181
	elseif stanza.attr.type == "unsubscribe" then
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   182
		-- 1. route stanza
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   183
		-- 2. roster push (subscription = none or from)
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   184
		if rostermanager.unsubscribe(node, host, to_bare) then
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   185
			rostermanager.roster_push(node, host, to_bare); -- FIXME do roster push when roster has in fact not changed?
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   186
		end -- else file error
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   187
		core_route_stanza(origin, stanza);
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   188
	elseif stanza.attr.type == "subscribed" then
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   189
		-- 1. route stanza
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   190
		-- 2. roster_push ()
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   191
		-- 3. send_presence_of_available_resources
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   192
		if rostermanager.subscribed(node, host, to_bare) then
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   193
			rostermanager.roster_push(node, host, to_bare);
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   194
		end
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   195
		core_route_stanza(origin, stanza);
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   196
		send_presence_of_available_resources(node, host, to_bare, origin, core_route_stanza);
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   197
	elseif stanza.attr.type == "unsubscribed" then
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   198
		-- 1. route stanza
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   199
		-- 2. roster push (subscription = none or to)
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   200
		if rostermanager.unsubscribed(node, host, to_bare) then
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   201
			rostermanager.roster_push(node, host, to_bare);
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   202
		end
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   203
		core_route_stanza(origin, stanza);
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   204
	end
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   205
	stanza.attr.from, stanza.attr.to = st_from, st_to;
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   206
end
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   207
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   208
function handle_inbound_presence_subscriptions_and_probes(origin, stanza, from_bare, to_bare, core_route_stanza)
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   209
	local node, host = jid_split(to_bare);
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   210
	local st_from, st_to = stanza.attr.from, stanza.attr.to;
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   211
	stanza.attr.from, stanza.attr.to = from_bare, to_bare;
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   212
	log("debug", "inbound presence "..stanza.attr.type.." from "..from_bare.." for "..to_bare);
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   213
	if stanza.attr.type == "probe" then
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   214
		if rostermanager.is_contact_subscribed(node, host, from_bare) then
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   215
			if 0 == send_presence_of_available_resources(node, host, from_bare, origin, core_route_stanza) then
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   216
				-- TODO send last recieved unavailable presence (or we MAY do nothing, which is fine too)
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   217
			end
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   218
		else
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   219
			core_route_stanza(origin, st.presence({from=to_bare, to=from_bare, type="unsubscribed"}));
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   220
		end
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   221
	elseif stanza.attr.type == "subscribe" then
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   222
		if rostermanager.is_contact_subscribed(node, host, from_bare) then
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   223
			core_route_stanza(origin, st.presence({from=to_bare, to=from_bare, type="subscribed"})); -- already subscribed
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   224
			-- Sending presence is not clearly stated in the RFC, but it seems appropriate
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   225
			if 0 == send_presence_of_available_resources(node, host, from_bare, origin, core_route_stanza) then
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   226
				-- TODO send last recieved unavailable presence (or we MAY do nothing, which is fine too)
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   227
			end
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   228
		else
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   229
			if not rostermanager.is_contact_pending_in(node, host, from_bare) then
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   230
				if rostermanager.set_contact_pending_in(node, host, from_bare) then
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   231
					sessionmanager.send_to_available_resources(node, host, stanza);
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   232
				end -- TODO else return error, unable to save
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   233
			end
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   234
		end
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   235
	elseif stanza.attr.type == "unsubscribe" then
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   236
		if rostermanager.process_inbound_unsubscribe(node, host, from_bare) then
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   237
			rostermanager.roster_push(node, host, from_bare);
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   238
		end
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   239
	elseif stanza.attr.type == "subscribed" then
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   240
		if rostermanager.process_inbound_subscription_approval(node, host, from_bare) then
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   241
			rostermanager.roster_push(node, host, from_bare);
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   242
		end
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   243
	elseif stanza.attr.type == "unsubscribed" then
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   244
		if rostermanager.process_inbound_subscription_cancellation(node, host, from_bare) then
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   245
			rostermanager.roster_push(node, host, from_bare);
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   246
		end
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   247
	end -- discard any other type
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   248
	stanza.attr.from, stanza.attr.to = st_from, st_to;
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   249
end
a2dd83bc3afa mod_presence: initial commit
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   250
1279
fa00d56a9fd3 mod_presence: Handle all outbound presence stanzas
Waqas Hussain <waqas20@gmail.com>
parents: 1278
diff changeset
   251
local outbound_presence_handler = function(data)
1282
ff58ef687a3f mod_presence: Handle subscriptions and probes
Waqas Hussain <waqas20@gmail.com>
parents: 1281
diff changeset
   252
	-- outbound presence recieved
1276
d0e80c1578e1 mod_presence: Handle outbound presence to full JIDs
Waqas Hussain <waqas20@gmail.com>
parents: 1245
diff changeset
   253
	local origin, stanza = data.origin, data.stanza;
d0e80c1578e1 mod_presence: Handle outbound presence to full JIDs
Waqas Hussain <waqas20@gmail.com>
parents: 1245
diff changeset
   254
1286
a9b1675ad16e mod_presence: Check for nil 'to' attribute in all cases for outgoing stanzas
Waqas Hussain <waqas20@gmail.com>
parents: 1285
diff changeset
   255
	local to = stanza.attr.to;
a9b1675ad16e mod_presence: Check for nil 'to' attribute in all cases for outgoing stanzas
Waqas Hussain <waqas20@gmail.com>
parents: 1285
diff changeset
   256
	if to then
a9b1675ad16e mod_presence: Check for nil 'to' attribute in all cases for outgoing stanzas
Waqas Hussain <waqas20@gmail.com>
parents: 1285
diff changeset
   257
		local t = stanza.attr.type;
a9b1675ad16e mod_presence: Check for nil 'to' attribute in all cases for outgoing stanzas
Waqas Hussain <waqas20@gmail.com>
parents: 1285
diff changeset
   258
		if t ~= nil and t ~= "unavailable" and t ~= "error" then -- check for subscriptions and probes
a9b1675ad16e mod_presence: Check for nil 'to' attribute in all cases for outgoing stanzas
Waqas Hussain <waqas20@gmail.com>
parents: 1285
diff changeset
   259
			handle_outbound_presence_subscriptions_and_probes(origin, stanza, jid_bare(stanza.attr.from), jid_bare(stanza.attr.to), core_route_stanza);
a9b1675ad16e mod_presence: Check for nil 'to' attribute in all cases for outgoing stanzas
Waqas Hussain <waqas20@gmail.com>
parents: 1285
diff changeset
   260
			return true;
a9b1675ad16e mod_presence: Check for nil 'to' attribute in all cases for outgoing stanzas
Waqas Hussain <waqas20@gmail.com>
parents: 1285
diff changeset
   261
		end
1278
2abf85791f29 mod_presence: A little cleanup
Waqas Hussain <waqas20@gmail.com>
parents: 1277
diff changeset
   262
1286
a9b1675ad16e mod_presence: Check for nil 'to' attribute in all cases for outgoing stanzas
Waqas Hussain <waqas20@gmail.com>
parents: 1285
diff changeset
   263
		local to_bare = jid_bare(to);
a9b1675ad16e mod_presence: Check for nil 'to' attribute in all cases for outgoing stanzas
Waqas Hussain <waqas20@gmail.com>
parents: 1285
diff changeset
   264
		if not(origin.roster[to_bare] and (origin.roster[to_bare].subscription == "both" or origin.roster[to_bare].subscription == "from")) then -- directed presence
a9b1675ad16e mod_presence: Check for nil 'to' attribute in all cases for outgoing stanzas
Waqas Hussain <waqas20@gmail.com>
parents: 1285
diff changeset
   265
			origin.directed = origin.directed or {};
a9b1675ad16e mod_presence: Check for nil 'to' attribute in all cases for outgoing stanzas
Waqas Hussain <waqas20@gmail.com>
parents: 1285
diff changeset
   266
			if t then -- removing from directed presence list on sending an error or unavailable
a9b1675ad16e mod_presence: Check for nil 'to' attribute in all cases for outgoing stanzas
Waqas Hussain <waqas20@gmail.com>
parents: 1285
diff changeset
   267
				origin.directed[to] = nil; -- FIXME does it make more sense to add to_bare rather than to?
a9b1675ad16e mod_presence: Check for nil 'to' attribute in all cases for outgoing stanzas
Waqas Hussain <waqas20@gmail.com>
parents: 1285
diff changeset
   268
			else
a9b1675ad16e mod_presence: Check for nil 'to' attribute in all cases for outgoing stanzas
Waqas Hussain <waqas20@gmail.com>
parents: 1285
diff changeset
   269
				origin.directed[to] = true; -- FIXME does it make more sense to add to_bare rather than to?
a9b1675ad16e mod_presence: Check for nil 'to' attribute in all cases for outgoing stanzas
Waqas Hussain <waqas20@gmail.com>
parents: 1285
diff changeset
   270
			end
1277
f2b50efe8d44 mod_presence: Remove JIDs from directed presence list on sending error or unavailable presence
Waqas Hussain <waqas20@gmail.com>
parents: 1276
diff changeset
   271
		end
1286
a9b1675ad16e mod_presence: Check for nil 'to' attribute in all cases for outgoing stanzas
Waqas Hussain <waqas20@gmail.com>
parents: 1285
diff changeset
   272
	end -- TODO maybe handle normal presence here, instead of letting it pass to incoming handlers?
1279
fa00d56a9fd3 mod_presence: Handle all outbound presence stanzas
Waqas Hussain <waqas20@gmail.com>
parents: 1278
diff changeset
   273
end
fa00d56a9fd3 mod_presence: Handle all outbound presence stanzas
Waqas Hussain <waqas20@gmail.com>
parents: 1278
diff changeset
   274
fa00d56a9fd3 mod_presence: Handle all outbound presence stanzas
Waqas Hussain <waqas20@gmail.com>
parents: 1278
diff changeset
   275
module:hook("pre-presence/full", outbound_presence_handler);
fa00d56a9fd3 mod_presence: Handle all outbound presence stanzas
Waqas Hussain <waqas20@gmail.com>
parents: 1278
diff changeset
   276
module:hook("pre-presence/bare", outbound_presence_handler);
fa00d56a9fd3 mod_presence: Handle all outbound presence stanzas
Waqas Hussain <waqas20@gmail.com>
parents: 1278
diff changeset
   277
module:hook("pre-presence/host", outbound_presence_handler);
1281
bc65d57c76ef mod_presence: Add hooks for inbound presence
Waqas Hussain <waqas20@gmail.com>
parents: 1280
diff changeset
   278
bc65d57c76ef mod_presence: Add hooks for inbound presence
Waqas Hussain <waqas20@gmail.com>
parents: 1280
diff changeset
   279
module:hook("presence/bare", function(data)
bc65d57c76ef mod_presence: Add hooks for inbound presence
Waqas Hussain <waqas20@gmail.com>
parents: 1280
diff changeset
   280
	-- inbound presence to bare JID recieved
bc65d57c76ef mod_presence: Add hooks for inbound presence
Waqas Hussain <waqas20@gmail.com>
parents: 1280
diff changeset
   281
	local origin, stanza = data.origin, data.stanza;
1282
ff58ef687a3f mod_presence: Handle subscriptions and probes
Waqas Hussain <waqas20@gmail.com>
parents: 1281
diff changeset
   282
1283
2e57f2176612 mod_presence: Handle non-subscription presence and routing
Waqas Hussain <waqas20@gmail.com>
parents: 1282
diff changeset
   283
	local to = stanza.attr.to;
1287
ac82c7b9c76b mod_presence: Fix a global access
Waqas Hussain <waqas20@gmail.com>
parents: 1286
diff changeset
   284
	local t = stanza.attr.type;
1283
2e57f2176612 mod_presence: Handle non-subscription presence and routing
Waqas Hussain <waqas20@gmail.com>
parents: 1282
diff changeset
   285
	if to then
1285
0a6e2d6ae459 mod_presence: Check for nil 'to' attribute in all cases for incoming stanzas
Waqas Hussain <waqas20@gmail.com>
parents: 1284
diff changeset
   286
		if t ~= nil and t ~= "unavailable" and t ~= "error" then -- check for subscriptions and probes sent to bare JID
0a6e2d6ae459 mod_presence: Check for nil 'to' attribute in all cases for incoming stanzas
Waqas Hussain <waqas20@gmail.com>
parents: 1284
diff changeset
   287
			handle_inbound_presence_subscriptions_and_probes(origin, stanza, jid_bare(stanza.attr.from), jid_bare(stanza.attr.to), core_route_stanza);
0a6e2d6ae459 mod_presence: Check for nil 'to' attribute in all cases for incoming stanzas
Waqas Hussain <waqas20@gmail.com>
parents: 1284
diff changeset
   288
			return true;
0a6e2d6ae459 mod_presence: Check for nil 'to' attribute in all cases for incoming stanzas
Waqas Hussain <waqas20@gmail.com>
parents: 1284
diff changeset
   289
		end
0a6e2d6ae459 mod_presence: Check for nil 'to' attribute in all cases for incoming stanzas
Waqas Hussain <waqas20@gmail.com>
parents: 1284
diff changeset
   290
	
1283
2e57f2176612 mod_presence: Handle non-subscription presence and routing
Waqas Hussain <waqas20@gmail.com>
parents: 1282
diff changeset
   291
		local user = bare_sessions[to];
2e57f2176612 mod_presence: Handle non-subscription presence and routing
Waqas Hussain <waqas20@gmail.com>
parents: 1282
diff changeset
   292
		if user then
2e57f2176612 mod_presence: Handle non-subscription presence and routing
Waqas Hussain <waqas20@gmail.com>
parents: 1282
diff changeset
   293
			for _, session in pairs(user.sessions) do
2e57f2176612 mod_presence: Handle non-subscription presence and routing
Waqas Hussain <waqas20@gmail.com>
parents: 1282
diff changeset
   294
				if session.presence then -- only send to available resources
2e57f2176612 mod_presence: Handle non-subscription presence and routing
Waqas Hussain <waqas20@gmail.com>
parents: 1282
diff changeset
   295
					session.send(stanza);
2e57f2176612 mod_presence: Handle non-subscription presence and routing
Waqas Hussain <waqas20@gmail.com>
parents: 1282
diff changeset
   296
				end
2e57f2176612 mod_presence: Handle non-subscription presence and routing
Waqas Hussain <waqas20@gmail.com>
parents: 1282
diff changeset
   297
			end
2e57f2176612 mod_presence: Handle non-subscription presence and routing
Waqas Hussain <waqas20@gmail.com>
parents: 1282
diff changeset
   298
		end -- no resources not online, discard
1285
0a6e2d6ae459 mod_presence: Check for nil 'to' attribute in all cases for incoming stanzas
Waqas Hussain <waqas20@gmail.com>
parents: 1284
diff changeset
   299
	elseif not t or t == "unavailable" then
1283
2e57f2176612 mod_presence: Handle non-subscription presence and routing
Waqas Hussain <waqas20@gmail.com>
parents: 1282
diff changeset
   300
		handle_normal_presence(origin, stanza, core_route_stanza);
2e57f2176612 mod_presence: Handle non-subscription presence and routing
Waqas Hussain <waqas20@gmail.com>
parents: 1282
diff changeset
   301
	end
1284
c0fb8379696e mod_presence: return true from incoming presence handlers to prevent further processing
Waqas Hussain <waqas20@gmail.com>
parents: 1283
diff changeset
   302
	return true;
1281
bc65d57c76ef mod_presence: Add hooks for inbound presence
Waqas Hussain <waqas20@gmail.com>
parents: 1280
diff changeset
   303
end);
bc65d57c76ef mod_presence: Add hooks for inbound presence
Waqas Hussain <waqas20@gmail.com>
parents: 1280
diff changeset
   304
module:hook("presence/full", function(data)
bc65d57c76ef mod_presence: Add hooks for inbound presence
Waqas Hussain <waqas20@gmail.com>
parents: 1280
diff changeset
   305
	-- inbound presence to full JID recieved
bc65d57c76ef mod_presence: Add hooks for inbound presence
Waqas Hussain <waqas20@gmail.com>
parents: 1280
diff changeset
   306
	local origin, stanza = data.origin, data.stanza;
1282
ff58ef687a3f mod_presence: Handle subscriptions and probes
Waqas Hussain <waqas20@gmail.com>
parents: 1281
diff changeset
   307
ff58ef687a3f mod_presence: Handle subscriptions and probes
Waqas Hussain <waqas20@gmail.com>
parents: 1281
diff changeset
   308
	local t = stanza.attr.type;
ff58ef687a3f mod_presence: Handle subscriptions and probes
Waqas Hussain <waqas20@gmail.com>
parents: 1281
diff changeset
   309
	if t ~= nil and t ~= "unavailable" and t ~= "error" then -- check for subscriptions and probes sent to full JID
ff58ef687a3f mod_presence: Handle subscriptions and probes
Waqas Hussain <waqas20@gmail.com>
parents: 1281
diff changeset
   310
		handle_inbound_presence_subscriptions_and_probes(origin, stanza, jid_bare(stanza.attr.from), jid_bare(stanza.attr.to), core_route_stanza);
ff58ef687a3f mod_presence: Handle subscriptions and probes
Waqas Hussain <waqas20@gmail.com>
parents: 1281
diff changeset
   311
		return true;
ff58ef687a3f mod_presence: Handle subscriptions and probes
Waqas Hussain <waqas20@gmail.com>
parents: 1281
diff changeset
   312
	end
1283
2e57f2176612 mod_presence: Handle non-subscription presence and routing
Waqas Hussain <waqas20@gmail.com>
parents: 1282
diff changeset
   313
2e57f2176612 mod_presence: Handle non-subscription presence and routing
Waqas Hussain <waqas20@gmail.com>
parents: 1282
diff changeset
   314
	local session = full_sessions[stanza.attr.to];
2e57f2176612 mod_presence: Handle non-subscription presence and routing
Waqas Hussain <waqas20@gmail.com>
parents: 1282
diff changeset
   315
	if session then
2e57f2176612 mod_presence: Handle non-subscription presence and routing
Waqas Hussain <waqas20@gmail.com>
parents: 1282
diff changeset
   316
		-- TODO fire post processing event
2e57f2176612 mod_presence: Handle non-subscription presence and routing
Waqas Hussain <waqas20@gmail.com>
parents: 1282
diff changeset
   317
		session.send(stanza);
2e57f2176612 mod_presence: Handle non-subscription presence and routing
Waqas Hussain <waqas20@gmail.com>
parents: 1282
diff changeset
   318
	end -- resource not online, discard
1284
c0fb8379696e mod_presence: return true from incoming presence handlers to prevent further processing
Waqas Hussain <waqas20@gmail.com>
parents: 1283
diff changeset
   319
	return true;
1281
bc65d57c76ef mod_presence: Add hooks for inbound presence
Waqas Hussain <waqas20@gmail.com>
parents: 1280
diff changeset
   320
end);