Software / code / prosody
Comparison
core/presencemanager.lua @ 468:ab49cb6d0e92
Moved incoming c2s presence handling from stanza_router to presencemanager
| author | Waqas Hussain <waqas20@gmail.com> |
|---|---|
| date | Sat, 29 Nov 2008 08:25:34 +0500 |
| parent | 326:99a8317d1235 |
| child | 519:cccd610a0ef9 |
comparison
equal
deleted
inserted
replaced
| 465:9ab51c483cf3 | 468:ab49cb6d0e92 |
|---|---|
| 1 | 1 |
| 2 local log = require "util.logger".init("presencemanager") | 2 local log = require "util.logger".init("presencemanager") |
| 3 | 3 |
| 4 local require = require; | 4 local require = require; |
| 5 local pairs = pairs; | 5 local pairs, ipairs = pairs, ipairs; |
| 6 local t_concat = table.concat; | |
| 7 local s_find = string.find; | |
| 8 local tonumber = tonumber; | |
| 6 | 9 |
| 7 local st = require "util.stanza"; | 10 local st = require "util.stanza"; |
| 8 local jid_split = require "util.jid".split; | 11 local jid_split = require "util.jid".split; |
| 9 local hosts = hosts; | 12 local hosts = hosts; |
| 10 | 13 |
| 11 local rostermanager = require "core.rostermanager"; | 14 local rostermanager = require "core.rostermanager"; |
| 12 local sessionmanager = require "core.sessionmanager"; | 15 local sessionmanager = require "core.sessionmanager"; |
| 16 local offlinemanager = require "core.offlinemanager"; | |
| 13 | 17 |
| 14 module "presencemanager" | 18 module "presencemanager" |
| 19 | |
| 20 function handle_presence(origin, stanza, from_bare, to_bare, core_route_stanza, inbound) | |
| 21 local type = stanza.attr.type; | |
| 22 if type and type ~= "unavailable" then | |
| 23 if inbound then | |
| 24 handle_inbound_presence_subscriptions_and_probes(origin, stanza, from_bare, to_bare, core_route_stanza); | |
| 25 else | |
| 26 handle_outbound_presence_subscriptions_and_probes(origin, stanza, from_bare, to_bare, core_route_stanza); | |
| 27 end | |
| 28 elseif not inbound and not stanza.attr.to then | |
| 29 handle_normal_presence(origin, stanza, core_route_stanza); | |
| 30 else | |
| 31 core_route_stanza(origin, stanza); | |
| 32 end | |
| 33 end | |
| 34 | |
| 35 function handle_normal_presence(origin, stanza, core_route_stanza) | |
| 36 if origin.roster then | |
| 37 for jid in pairs(origin.roster) do -- broadcast to all interested contacts | |
| 38 local subscription = origin.roster[jid].subscription; | |
| 39 if subscription == "both" or subscription == "from" then | |
| 40 stanza.attr.to = jid; | |
| 41 core_route_stanza(origin, stanza); | |
| 42 end | |
| 43 end | |
| 44 local node, host = jid_split(stanza.attr.from); | |
| 45 for _, res in pairs(hosts[host].sessions[node].sessions) do -- broadcast to all resources | |
| 46 if res ~= origin and res.full_jid then -- to resource. FIXME is res.full_jid the correct check? Maybe it should be res.presence | |
| 47 stanza.attr.to = res.full_jid; | |
| 48 core_route_stanza(origin, stanza); | |
| 49 end | |
| 50 end | |
| 51 if stanza.attr.type == nil and not origin.presence then -- initial presence | |
| 52 local probe = st.presence({from = origin.full_jid, type = "probe"}); | |
| 53 for jid in pairs(origin.roster) do -- probe all contacts we are subscribed to | |
| 54 local subscription = origin.roster[jid].subscription; | |
| 55 if subscription == "both" or subscription == "to" then | |
| 56 probe.attr.to = jid; | |
| 57 core_route_stanza(origin, probe); | |
| 58 end | |
| 59 end | |
| 60 for _, res in pairs(hosts[host].sessions[node].sessions) do -- broadcast from all available resources | |
| 61 if res ~= origin and res.presence then | |
| 62 res.presence.attr.to = origin.full_jid; | |
| 63 core_route_stanza(res, res.presence); | |
| 64 res.presence.attr.to = nil; | |
| 65 end | |
| 66 end | |
| 67 if origin.roster.pending then -- resend incoming subscription requests | |
| 68 for jid in pairs(origin.roster.pending) do | |
| 69 origin.send(st.presence({type="subscribe", from=jid})); -- TODO add to attribute? Use original? | |
| 70 end | |
| 71 end | |
| 72 local request = st.presence({type="subscribe", from=origin.username.."@"..origin.host}); | |
| 73 for jid, item in pairs(origin.roster) do -- resend outgoing subscription requests | |
| 74 if item.ask then | |
| 75 request.attr.to = jid; | |
| 76 core_route_stanza(origin, request); | |
| 77 end | |
| 78 end | |
| 79 for _, msg in ipairs(offlinemanager.load(node, host) or {}) do | |
| 80 origin.send(msg); -- FIXME do we need to modify to/from in any way? | |
| 81 end | |
| 82 offlinemanager.deleteAll(node, host); | |
| 83 end | |
| 84 origin.priority = 0; | |
| 85 if stanza.attr.type == "unavailable" then | |
| 86 origin.presence = nil; | |
| 87 else | |
| 88 origin.presence = stanza; | |
| 89 local priority = stanza:child_with_name("priority"); | |
| 90 if priority and #priority > 0 then | |
| 91 priority = t_concat(priority); | |
| 92 if s_find(priority, "^[+-]?[0-9]+$") then | |
| 93 priority = tonumber(priority); | |
| 94 if priority < -128 then priority = -128 end | |
| 95 if priority > 127 then priority = 127 end | |
| 96 origin.priority = priority; | |
| 97 end | |
| 98 end | |
| 99 end | |
| 100 stanza.attr.to = nil; -- reset it | |
| 101 else | |
| 102 log("error", "presence recieved from client with no roster"); | |
| 103 end | |
| 104 end | |
| 15 | 105 |
| 16 function send_presence_of_available_resources(user, host, jid, recipient_session, core_route_stanza) | 106 function send_presence_of_available_resources(user, host, jid, recipient_session, core_route_stanza) |
| 17 local h = hosts[host]; | 107 local h = hosts[host]; |
| 18 local count = 0; | 108 local count = 0; |
| 19 if h and h.type == "local" then | 109 if h and h.type == "local" then |