Comparison

plugins/disco.lua @ 473:b2198cd64c5a

disco: Add support for extended disco forms
author Matthew Wild <mwild1@gmail.com>
date Fri, 17 Mar 2023 11:12:01 +0000
parent 429:46897d7769c3
child 474:fca0c7672148
comparison
equal deleted inserted replaced
472:864c9dc27c60 473:b2198cd64c5a
201 self:send_iq(disco_request, function (result) 201 self:send_iq(disco_request, function (result)
202 if result.attr.type == "error" then 202 if result.attr.type == "error" then
203 return callback(nil, result:get_error()); 203 return callback(nil, result:get_error());
204 end 204 end
205 205
206 local identities, features = {}, {}; 206 local identities, features, extended = {}, {}, {};
207 207
208 for tag in result:get_child("query", xmlns_disco_info):childtags() do 208 for tag in result:get_child("query", xmlns_disco_info):childtags() do
209 if tag.name == "identity" then 209 if tag.name == "identity" then
210 identities[tag.attr.category.."/"..tag.attr.type] = tag.attr.name or true; 210 identities[tag.attr.category.."/"..tag.attr.type] = tag.attr.name or true;
211 elseif tag.name == "feature" then 211 elseif tag.name == "feature" then
212 features[tag.attr.var] = true; 212 features[tag.attr.var] = true;
213 end 213 end
214 end 214 end
215 215
216 for tag in result:get_child("query", xmlns_disco_info):childtags("x", "jabber:x:data") do
217 local form_type_field = tag:get_child_with_attr("field", nil, "var", "FORM_TYPE");
218 local form_type = form_type_field and form_type_field:get_child_text("value");
219 if form_type then
220 extended[form_type] = tag;
221 end
222 end
216 223
217 if not self.disco.cache[jid] then 224 if not self.disco.cache[jid] then
218 self.disco.cache[jid] = { nodes = {} }; 225 self.disco.cache[jid] = { nodes = {} };
219 end 226 end
220 227
222 if not self.disco.cache[jid].nodes[node] then 229 if not self.disco.cache[jid].nodes[node] then
223 self.disco.cache[jid].nodes[node] = { nodes = {} }; 230 self.disco.cache[jid].nodes[node] = { nodes = {} };
224 end 231 end
225 self.disco.cache[jid].nodes[node].identities = identities; 232 self.disco.cache[jid].nodes[node].identities = identities;
226 self.disco.cache[jid].nodes[node].features = features; 233 self.disco.cache[jid].nodes[node].features = features;
234 self.disco.cache[jid].nodes[node].extended = extended;
227 else 235 else
228 self.disco.cache[jid].identities = identities; 236 self.disco.cache[jid].identities = identities;
229 self.disco.cache[jid].features = features; 237 self.disco.cache[jid].features = features;
238 self.disco.cache[jid].extended = extended;
230 end 239 end
231 return callback(self.disco.cache[jid]); 240 return callback(self.disco.cache[jid]);
232 end); 241 end);
233 end 242 end
234 243