Software / code / verse
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 |