Software / code / prosody
Comparison
plugins/mod_pep.lua @ 3664:345cd1e04e80
mod_pep: Optimised PEP requests for disco info on caps change (issue #150).
| author | Waqas Hussain <waqas20@gmail.com> |
|---|---|
| date | Sun, 28 Nov 2010 07:43:19 +0500 |
| parent | 3648:c0148fddd81f |
| child | 3666:44c4789d6e17 |
comparison
equal
deleted
inserted
replaced
| 3663:300ae72fd692 | 3664:345cd1e04e80 |
|---|---|
| 115 module:hook("presence/bare", function(event) | 115 module:hook("presence/bare", function(event) |
| 116 -- inbound presence to bare JID recieved | 116 -- inbound presence to bare JID recieved |
| 117 local origin, stanza = event.origin, event.stanza; | 117 local origin, stanza = event.origin, event.stanza; |
| 118 local user = stanza.attr.to or (origin.username..'@'..origin.host); | 118 local user = stanza.attr.to or (origin.username..'@'..origin.host); |
| 119 local t = stanza.attr.type; | 119 local t = stanza.attr.type; |
| 120 local self = not stanza.attr.to; | |
| 120 | 121 |
| 121 if not t then -- available presence | 122 if not t then -- available presence |
| 122 if not stanza.attr.to or subscription_presence(user, stanza.attr.from) then | 123 if self or subscription_presence(user, stanza.attr.from) then |
| 123 local recipient = stanza.attr.from; | 124 local recipient = stanza.attr.from; |
| 124 local current = recipients[user] and recipients[user][recipient]; | 125 local current = recipients[user] and recipients[user][recipient]; |
| 125 local hash = get_caps_hash_from_presence(stanza, current); | 126 local hash = get_caps_hash_from_presence(stanza, current); |
| 126 if current == hash then return; end | 127 if current == hash then return; end |
| 127 if not hash then | 128 if not hash then |
| 131 if hash_map[hash] then | 132 if hash_map[hash] then |
| 132 recipients[user][recipient] = hash_map[hash]; | 133 recipients[user][recipient] = hash_map[hash]; |
| 133 publish_all(user, recipient, origin); | 134 publish_all(user, recipient, origin); |
| 134 else | 135 else |
| 135 recipients[user][recipient] = hash; | 136 recipients[user][recipient] = hash; |
| 136 origin.send( | 137 if self or origin.type ~= "c2s" then |
| 137 st.stanza("iq", {from=stanza.attr.to, to=stanza.attr.from, id="disco", type="get"}) | 138 origin.send( |
| 138 :query("http://jabber.org/protocol/disco#info") | 139 st.stanza("iq", {from=stanza.attr.to, to=stanza.attr.from, id="disco", type="get"}) |
| 139 ); | 140 :query("http://jabber.org/protocol/disco#info") |
| 141 ); | |
| 142 end | |
| 140 end | 143 end |
| 141 end | 144 end |
| 142 end | 145 end |
| 143 elseif t == "unavailable" then | 146 elseif t == "unavailable" then |
| 144 if recipients[user] then recipients[user][stanza.attr.from] = nil; end | 147 if recipients[user] then recipients[user][stanza.attr.from] = nil; end |
| 212 local session, stanza = event.origin, event.stanza; | 215 local session, stanza = event.origin, event.stanza; |
| 213 if stanza.attr.type == "result" then | 216 if stanza.attr.type == "result" then |
| 214 local disco = stanza.tags[1]; | 217 local disco = stanza.tags[1]; |
| 215 if disco and disco.name == "query" and disco.attr.xmlns == "http://jabber.org/protocol/disco#info" then | 218 if disco and disco.name == "query" and disco.attr.xmlns == "http://jabber.org/protocol/disco#info" then |
| 216 -- Process disco response | 219 -- Process disco response |
| 220 local self = not stanza.attr.to; | |
| 217 local user = stanza.attr.to or (session.username..'@'..session.host); | 221 local user = stanza.attr.to or (session.username..'@'..session.host); |
| 218 local contact = stanza.attr.from; | 222 local contact = stanza.attr.from; |
| 219 local current = recipients[user] and recipients[user][contact]; | 223 local current = recipients[user] and recipients[user][contact]; |
| 220 if type(current) ~= "string" then return; end -- check if waiting for recipient's response | 224 if type(current) ~= "string" then return; end -- check if waiting for recipient's response |
| 221 local ver = current; | 225 local ver = current; |
| 228 local nfeature = feature.attr.var:match("^(.*)%+notify$"); | 232 local nfeature = feature.attr.var:match("^(.*)%+notify$"); |
| 229 if nfeature then notify[nfeature] = true; end | 233 if nfeature then notify[nfeature] = true; end |
| 230 end | 234 end |
| 231 end | 235 end |
| 232 hash_map[ver] = notify; -- update hash map | 236 hash_map[ver] = notify; -- update hash map |
| 233 recipients[user][contact] = notify; -- set recipient's data to calculated data | 237 if self then |
| 238 for jid, item in pairs(origin.roster) do -- for all interested contacts | |
| 239 if item.subscription == "both" or item.subscription == "from" then | |
| 240 if not recipients[jid] then recipients[jid] = {}; end | |
| 241 recipients[jid][contact] = notify; | |
| 242 end | |
| 243 end | |
| 244 else | |
| 245 recipients[user][contact] = notify; -- set recipient's data to calculated data | |
| 246 end | |
| 234 -- send messages to recipient | 247 -- send messages to recipient |
| 235 publish_all(user, contact, session); | 248 publish_all(user, contact, session); |
| 236 end | 249 end |
| 237 end | 250 end |
| 238 end); | 251 end); |