performDiscoSweep method
Implementation
Future<Result<DiscoError, List<DiscoInfo>>> performDiscoSweep() async {
final attrs = getAttributes();
final serverJid = attrs.getConnectionSettings().jid.toDomain();
final infoResults = List<DiscoInfo>.empty(growable: true);
final result = await discoInfoQuery(serverJid);
if (result.isType<DiscoInfo>()) {
final info = result.get<DiscoInfo>();
logger.finest('Discovered supported server features: ${info.features}');
infoResults.add(info);
attrs.sendEvent(ServerItemDiscoEvent(info));
attrs.sendEvent(ServerDiscoDoneEvent());
} else {
logger.warning('Failed to discover server features');
return Result(UnknownDiscoError());
}
final response = await discoItemsQuery(serverJid);
if (response.isType<List<DiscoItem>>()) {
logger.finest('Discovered disco items form $serverJid');
// Query all items
final items = response.get<List<DiscoItem>>();
for (final item in items) {
logger.finest('Querying info for ${item.jid}...');
final itemInfoResult = await discoInfoQuery(item.jid);
if (itemInfoResult.isType<DiscoInfo>()) {
final itemInfo = itemInfoResult.get<DiscoInfo>();
logger.finest('Received info for ${item.jid}');
infoResults.add(itemInfo);
attrs.sendEvent(ServerItemDiscoEvent(itemInfo));
} else {
logger.warning('Failed to discover info for ${item.jid}');
}
}
} else {
logger.warning('Failed to discover items of $serverJid');
}
return Result(infoResults);
}