Comparison

plugins/roster.lua @ 210:118da85cb3ce

plugins.roster: Roster versioning support.
author Kim Alvefur <zash@zash.se>
date Tue, 07 Jun 2011 20:29:54 +0200
parent 209:48a404e083c4
child 213:aa3088108021
comparison
equal deleted inserted replaced
209:48a404e083c4 210:118da85cb3ce
3 local t_insert = table.insert; 3 local t_insert = table.insert;
4 4
5 function verse.plugins.roster(stream) 5 function verse.plugins.roster(stream)
6 local roster = { 6 local roster = {
7 items = {}; 7 items = {};
8 ver = "";
8 -- TODO: 9 -- TODO:
9 -- groups = {}; 10 -- groups = {};
10 -- ver = nil;
11 }; 11 };
12 stream.roster = roster; 12 stream.roster = roster;
13 13
14 local function item_lua2xml(item_table) 14 local function item_lua2xml(item_table)
15 local xml_item = verse.stanza("item", { xmlns = xmlns_roster }); 15 local xml_item = verse.stanza("item", { xmlns = xmlns_roster });
39 39
40 for group in xml_item:childtags("group") do 40 for group in xml_item:childtags("group") do
41 t_insert(groups, group:get_text()) 41 t_insert(groups, group:get_text())
42 end 42 end
43 return item_table; 43 return item_table;
44 end
45
46 function roster:load(r)
47 roster.ver, roster.items = r.ver, r.items;
48 end
49
50 function roster:dump()
51 return {
52 ver = roster.ver,
53 items = roster.items,
54 };
44 end 55 end
45 56
46 -- should this be add_contact(item, callback) instead? 57 -- should this be add_contact(item, callback) instead?
47 function roster:add_contact(jid, nick, groups, callback) 58 function roster:add_contact(jid, nick, groups, callback)
48 local item = { jid = jid, name = nick, groups = groups }; 59 local item = { jid = jid, name = nick, groups = groups };
90 roster.items[jid] = nil; 101 roster.items[jid] = nil;
91 return deleted_item; 102 return deleted_item;
92 end 103 end
93 104
94 function roster:fetch(callback) 105 function roster:fetch(callback)
95 stream:send_iq(verse.iq({type="get"}):tag("query", { xmlns = xmlns_roster }), 106 stream:send_iq(verse.iq({type="get"}):tag("query", { xmlns = xmlns_roster, ver = roster.ver }),
96 function (result) 107 function (result)
97 if result.attr.type == "result" then 108 if result.attr.type == "result" then
98 local query = result:get_child("query", xmlns_roster); 109 local query = result:get_child("query", xmlns_roster);
99 for item in query:childtags("item") do 110 if query then
100 add_item(item) 111 roster.items = {};
112 for item in query:childtags("item") do
113 add_item(item)
114 end
115 roster.ver = query.attr.ver or "";
101 end 116 end
102 callback(roster); 117 callback(roster);
103 else 118 else
104 type, condition, text = stanza:get_error(); 119 type, condition, text = stanza:get_error();
105 callback(nil, { type, condition, text }); --FIXME 120 callback(nil, { type, condition, text }); --FIXME
121 else 136 else
122 event = roster.items[jid] and "changed" or "added"; 137 event = roster.items[jid] and "changed" or "added";
123 add_item(item) 138 add_item(item)
124 target = roster.items[jid]; 139 target = roster.items[jid];
125 end 140 end
141 roster.ver = query.attr.ver;
126 if target then 142 if target then
127 stream:event("roster/item-"..event, target); 143 stream:event("roster/item-"..event, target);
128 end 144 end
129 -- TODO else return error? Events? 145 -- TODO else return error? Events?
130 end 146 end