Software /
code /
verse
Comparison
plugins/disco.lua @ 167:a2ae7a9d360f
plugins.disco: Automatically insert caps into outgoing presence, and re-send last global presence with new caps when features change
author | Matthew Wild <mwild1@gmail.com> |
---|---|
date | Wed, 15 Dec 2010 14:56:10 +0000 |
parent | 146:2678048e93e6 |
child | 172:1a32e9ae79d0 |
comparison
equal
deleted
inserted
replaced
166:3499b4ea3277 | 167:a2ae7a9d360f |
---|---|
28 stream.disco.nodes = {} | 28 stream.disco.nodes = {} |
29 | 29 |
30 stream.caps = {} | 30 stream.caps = {} |
31 stream.caps.node = 'http://code.matthewwild.co.uk/verse/' | 31 stream.caps.node = 'http://code.matthewwild.co.uk/verse/' |
32 | 32 |
33 local _resend_presence; -- Forward declaration of a function | |
34 | |
33 local function cmp_identity(item1, item2) | 35 local function cmp_identity(item1, item2) |
34 if item1.category < item2.category then | 36 if item1.category < item2.category then |
35 return true; | 37 return true; |
36 elseif item2.category < item1.category then | 38 elseif item2.category < item1.category then |
37 return false; | 39 return false; |
85 }) | 87 }) |
86 end | 88 end |
87 }) | 89 }) |
88 | 90 |
89 function stream:add_disco_feature(feature) | 91 function stream:add_disco_feature(feature) |
90 table.insert(self.disco.info.features, {var=feature}); | 92 table.insert(self.disco.info.features, {var=feature}); |
93 _resend_presence(); | |
91 end | 94 end |
92 | 95 |
93 function stream:remove_disco_feature(feature) | 96 function stream:remove_disco_feature(feature) |
94 for idx, disco_feature in ipairs(self.disco.info.features) do | 97 for idx, disco_feature in ipairs(self.disco.info.features) do |
95 if disco_feature.var == feature then | 98 if disco_feature.var == feature then |
96 table.remove(self.disco.info.features, idx); | 99 table.remove(self.disco.info.features, idx); |
100 _resend_presence(); | |
97 return true; | 101 return true; |
98 end | 102 end |
99 end | 103 end |
100 end | 104 end |
101 | 105 |
368 end | 372 end |
369 stream:event("ready"); | 373 stream:event("ready"); |
370 end); | 374 end); |
371 return true; | 375 return true; |
372 end, 5); | 376 end, 5); |
377 | |
378 local last_presence; -- Cache to re-send with updated caps | |
379 | |
380 stream:hook("presence-out", function (presence) | |
381 if not presence:get_child("c", xmlns_caps) then | |
382 presence:reset():add_child(stream:caps()):reset(); | |
383 end | |
384 if not presence.attr.to then | |
385 last_presence = presence; -- Cache non-directed presence | |
386 end | |
387 end); | |
388 | |
389 local function update_caps(tag) | |
390 if tag.name == "c" and tag.attr.xmlns == xmlns_caps then | |
391 return stream:caps(); | |
392 end | |
393 end | |
394 | |
395 function _resend_presence() -- Local via forward declaration | |
396 if last_presence then | |
397 last_presence = last_presence:maptags(update_caps); | |
398 stream:send(last_presence); | |
399 end | |
400 end | |
373 end | 401 end |
374 | 402 |
375 -- end of disco.lua | 403 -- end of disco.lua |