plugins/disco.lua

changeset 179
5e2ff25c1dd9
parent 176
6004486e8b6c
child 180
58537eb98506
equal deleted inserted replaced
178:2189f75e09b9 179:5e2ff25c1dd9
29 stream.disco.nodes = {} 29 stream.disco.nodes = {}
30 30
31 stream.caps = {} 31 stream.caps = {}
32 stream.caps.node = 'http://code.matthewwild.co.uk/verse/' 32 stream.caps.node = 'http://code.matthewwild.co.uk/verse/'
33 33
34 local _resend_presence; -- Forward declaration of a function
35
36 local function cmp_identity(item1, item2) 34 local function cmp_identity(item1, item2)
37 if item1.category < item2.category then 35 if item1.category < item2.category then
38 return true; 36 return true;
39 elseif item2.category < item1.category then 37 elseif item2.category < item1.category then
40 return false; 38 return false;
89 end 87 end
90 }) 88 })
91 89
92 function stream:add_disco_feature(feature) 90 function stream:add_disco_feature(feature)
93 table.insert(self.disco.info.features, {var=feature}); 91 table.insert(self.disco.info.features, {var=feature});
94 _resend_presence(); 92 stream:resend_presence();
95 end 93 end
96 94
97 function stream:remove_disco_feature(feature) 95 function stream:remove_disco_feature(feature)
98 for idx, disco_feature in ipairs(self.disco.info.features) do 96 for idx, disco_feature in ipairs(self.disco.info.features) do
99 if disco_feature.var == feature then 97 if disco_feature.var == feature then
100 table.remove(self.disco.info.features, idx); 98 table.remove(self.disco.info.features, idx);
101 _resend_presence(); 99 stream:resend_presence();
102 return true; 100 return true;
103 end 101 end
104 end 102 end
105 end 103 end
106 104
377 stream:event("ready"); 375 stream:event("ready");
378 end); 376 end);
379 return true; 377 return true;
380 end, 5); 378 end, 5);
381 379
382 local last_presence; -- Cache to re-send with updated caps
383
384 stream:hook("presence-out", function (presence) 380 stream:hook("presence-out", function (presence)
385 if not presence:get_child("c", xmlns_caps) then 381 if not presence:get_child("c", xmlns_caps) then
386 presence:reset():add_child(stream:caps()):reset(); 382 presence:reset():add_child(stream:caps()):reset();
387 end 383 end
388 if not presence.attr.to then 384 end, 10);
389 last_presence = presence; -- Cache non-directed presence
390 end
391 end);
392
393 local function update_caps(tag)
394 if tag.name == "c" and tag.attr.xmlns == xmlns_caps then
395 return stream:caps();
396 end
397 end
398
399 function _resend_presence() -- Local via forward declaration
400 if last_presence then
401 last_presence = last_presence:maptags(update_caps);
402 stream:send(last_presence);
403 end
404 end
405 end 385 end
406 386
407 -- end of disco.lua 387 -- end of disco.lua

mercurial