@Subscribe public void onKscopeAd(final KscopeAdEvent event) { final LanternKscopeAdvertisement ad = event.getAd(); // It is possible and even likely we already know about this peer // through some other means, in which case we have to update the data // about that peer as necessary. log.debug("Adding peer through kscope ad..."); final String jid = ad.getJid(); final URI uri = LanternUtils.newURI(jid); final Peer existing = this.model.getPeerCollector().getPeer(uri); final LanternRosterEntry entry = this.roster.getRosterEntry(jid); if (existing == null) { // The following can be null. final Peer peer = new Peer( uri, "", ad.hasMappedEndpoint(), 0, 0, Type.pc, ad.getAddress(), ad.getPort(), Mode.give, false, null, entry); this.model.getPeerCollector().addPeer(uri, peer); updateGeoData(peer, ad.getAddress()); } else { existing.setIp(ad.getAddress()); existing.setPort(ad.getPort()); existing.setMode(Mode.give); existing.setMapped(ad.hasMappedEndpoint()); if (existing.getRosterEntry() == null) { // Ours could be null too, but can't hurt to set. existing.setRosterEntry(entry); } existing.setVersion(ad.getLanternVersion()); updateGeoData(existing, ad.getAddress()); } }