/** * @author Majus * http://majus.ru */ package ru.majus.xmpp import org.jivesoftware.smack.XMPPConnection import org.jivesoftware.smackx.ServiceDiscoveryManager import groovy.xml.MarkupBuilder /** * Jabber servers analyzer. Gets XML contained servers description * from http://www.jabberes.org/servers/servers.xml * * @author Majus * */ public class Analyzer { public Analyzer(String host, String user, String pass) { conn = new XMPPConnection(host) this.user = user this.pass = pass } /** * Get data from the server, parse and process it then * generate and write XML respond to specified Writer * Output format: * * * * ... * * * * @param out where to write XML result */ public void analyze(Writer out) { connect() login() def ServiceDiscoveryManager sdm = ServiceDiscoveryManager.getInstanceFor(conn); def servers = new XmlSlurper().parse(SOURCE_URL); def xml = new MarkupBuilder(out); xml.conferences { def allServers = servers.server; allServers.each() { def serverName = it.@jid; server(jid:serverName) { -> it.component.findAll() { it.@available == 'yes' && it.@category == 'conference' && it.@type == 'x-muc' }.each() { try { sdm.discoverItems(it.@jid.text()).getItems().each() { def m = it.name =~ /(.*?)\s*(?:\((\d+)\))?$/; try { def nm = it.entityID =~ /(.+?)@.+/; def entityId = nm[0][1]; def name = '', online = 0; if (m.size() > 0) { name = m[0][1]; if (m[0][2] != null) { online = m[0][2]; } } conference(entityID: entityId, name: name, online: online) } catch (e) { error(type:e.class, msg:e) e.printStackTrace() } } } catch (e) { error(type:e.class, msg:e) e.printStackTrace() } } } } } disconnect(); } private void connect() { conn.connect(); } private void login() { conn.login(user, pass); } private void disconnect() { conn.disconnect(); } private XMPPConnection conn; private String user, pass; private static final String SOURCE_URL = "http://www.jabberes.org/servers/servers.xml"; }