Software / code / prosody
Comparison
plugins/mod_pubsub.lua @ 3914:f10282c2e410
mod_pubsub: Build disco#info based on the methods provided by the pubsub service object. Add public set_service() method to change the service object used by the module.
| author | Matthew Wild <mwild1@gmail.com> |
|---|---|
| date | Tue, 21 Dec 2010 04:06:36 +0000 |
| parent | 3913:e748d29b18d6 |
| child | 3915:e24fcbb01fb6 |
comparison
equal
deleted
inserted
replaced
| 3913:e748d29b18d6 | 3914:f10282c2e410 |
|---|---|
| 6 require "core.modulemanager".load(module.host, "iq"); | 6 require "core.modulemanager".load(module.host, "iq"); |
| 7 | 7 |
| 8 local xmlns_pubsub = "http://jabber.org/protocol/pubsub"; | 8 local xmlns_pubsub = "http://jabber.org/protocol/pubsub"; |
| 9 local xmlns_pubsub_errors = "http://jabber.org/protocol/pubsub#errors"; | 9 local xmlns_pubsub_errors = "http://jabber.org/protocol/pubsub#errors"; |
| 10 local xmlns_pubsub_event = "http://jabber.org/protocol/pubsub#event"; | 10 local xmlns_pubsub_event = "http://jabber.org/protocol/pubsub#event"; |
| 11 | |
| 12 local autocreate_on_publish = module:get_option_boolean("autocreate_on_publish", false); | |
| 13 local autocreate_on_subscribe = module:get_option_boolean("autocreate_on_subscribe", false); | |
| 11 | 14 |
| 12 local service; | 15 local service; |
| 13 | 16 |
| 14 local handlers = {}; | 17 local handlers = {}; |
| 15 | 18 |
| 175 end | 178 end |
| 176 end | 179 end |
| 177 | 180 |
| 178 module:hook("iq/host/http://jabber.org/protocol/pubsub:pubsub", handle_pubsub_iq); | 181 module:hook("iq/host/http://jabber.org/protocol/pubsub:pubsub", handle_pubsub_iq); |
| 179 | 182 |
| 180 local disco_info = st.stanza("query", { xmlns = "http://jabber.org/protocol/disco#info" }) | 183 local disco_info; |
| 181 :tag("identity", { category = "pubsub", type = "service" }):up() | 184 |
| 182 :tag("feature", { var = "http://jabber.org/protocol/pubsub" }):up(); | 185 local feature_map = { |
| 186 create = { "create-nodes", autocreate_on_publish and "instant-nodes", "item-ids" }; | |
| 187 retract = { "delete-items", "retract-items" }; | |
| 188 publish = { "publish" }; | |
| 189 get_items = { "retrieve-items" }; | |
| 190 }; | |
| 191 | |
| 192 local function add_disco_features_from_service(disco, service) | |
| 193 for method, features in pairs(feature_map) do | |
| 194 if service[method] then | |
| 195 for _, feature in ipairs(feature_map) do | |
| 196 disco:tag("feature", { var = xmlns_pubsub.."#"..feature }):up(); | |
| 197 end | |
| 198 end | |
| 199 end | |
| 200 for affiliation in pairs(service.config.capabilities) do | |
| 201 if affiliation ~= "none" and affiliation ~= "owner" then | |
| 202 disco:tag("feature", { var = xmlns_pubsub.."#"..affiliation.."-affiliation" }):up(); | |
| 203 end | |
| 204 end | |
| 205 end | |
| 206 | |
| 207 local function build_disco_info(service) | |
| 208 disco_info = st.stanza("query", { xmlns = "http://jabber.org/protocol/disco#info" }) | |
| 209 :tag("identity", { category = "pubsub", type = "service" }):up() | |
| 210 :tag("feature", { var = "http://jabber.org/protocol/pubsub" }):up(); | |
| 211 add_disco_features_from_service(disco_info, service); | |
| 212 end | |
| 183 | 213 |
| 184 module:hook("iq-get/host/http://jabber.org/protocol/disco#info:query", function (event) | 214 module:hook("iq-get/host/http://jabber.org/protocol/disco#info:query", function (event) |
| 185 event.origin.send(st.reply(event.stanza):add_child(disco_info)); | 215 event.origin.send(st.reply(event.stanza):add_child(disco_info)); |
| 186 return true; | 216 return true; |
| 187 end); | 217 end); |
| 206 if jid == module.host or usermanager.is_admin(jid, module.host) then | 236 if jid == module.host or usermanager.is_admin(jid, module.host) then |
| 207 return admin_aff; | 237 return admin_aff; |
| 208 end | 238 end |
| 209 end | 239 end |
| 210 | 240 |
| 211 service = pubsub.new({ | 241 function set_service(new_service) |
| 242 service = new_service; | |
| 243 module.environment.service = service; | |
| 244 disco_info = build_disco_info(service); | |
| 245 end | |
| 246 | |
| 247 function module.save() | |
| 248 return { service = service }; | |
| 249 end | |
| 250 | |
| 251 function module.restore(data) | |
| 252 set_service(data.service); | |
| 253 end | |
| 254 | |
| 255 set_service(pubsub.new({ | |
| 212 capabilities = { | 256 capabilities = { |
| 213 none = { | 257 none = { |
| 214 create = false; | 258 create = false; |
| 215 publish = false; | 259 publish = false; |
| 216 retract = false; | 260 retract = false; |
| 251 | 295 |
| 252 set_affiliation = true; | 296 set_affiliation = true; |
| 253 }; | 297 }; |
| 254 }; | 298 }; |
| 255 | 299 |
| 256 autocreate_on_publish = module:get_option_boolean("autocreate_on_publish"); | 300 autocreate_on_publish = autocreate_on_publish; |
| 257 autocreate_on_subscribe = module:get_option_boolean("autocreate_on_subscribe"); | 301 autocreate_on_subscribe = autocreate_on_subscribe; |
| 258 | 302 |
| 259 broadcaster = simple_broadcast; | 303 broadcaster = simple_broadcast; |
| 260 get_affiliation = get_affiliation; | 304 get_affiliation = get_affiliation; |
| 261 jids_equal = function (jid1, jid2) | 305 jids_equal = function (jid1, jid2) |
| 262 return jid_bare(jid1) == jid_bare(jid2); | 306 return jid_bare(jid1) == jid_bare(jid2); |
| 263 end; | 307 end; |
| 264 }); | 308 })); |
| 265 module.environment.service = service; | |
| 266 | |
| 267 function module.save() | |
| 268 return { service = service }; | |
| 269 end | |
| 270 | |
| 271 function module.restore(data) | |
| 272 service = data.service; | |
| 273 module.environment.service = service; | |
| 274 end |