package the8472.mldht.cli.commands; import static the8472.bencode.Utils.hex2ary; import the8472.mldht.cli.CommandProcessor; import lbms.plugins.mldht.kad.DHT; import lbms.plugins.mldht.kad.Key; import lbms.plugins.mldht.kad.tasks.GetLookupTask; import java.util.Formatter; import java.util.Objects; import java.util.concurrent.atomic.AtomicInteger; public class Get extends CommandProcessor { @Override protected void process() { Key k; byte[] salt = null; try { k = new Key(arguments.get(0)); if(arguments.size() > 1) { salt = hex2ary(arguments.get(1)); } } catch (Exception e) { handleException(e); return; } AtomicInteger completion = new AtomicInteger(); final byte[] fSalt = salt; dhts.stream().filter(DHT::isRunning).map(DHT::getServerManager).map(m -> m.getRandomActiveServer(false)).filter(Objects::nonNull).forEach(s -> { GetLookupTask g = new GetLookupTask(k, s, s.getDHT().getNode()); g.expectedSalt(fSalt); g.setValueConsumer((storage) -> { Formatter f = new Formatter(); storage.debugString(f); println(f.toString()); }); g.addListener(l -> { if(completion.decrementAndGet() == 0) { done(); } }); s.getDHT().getTaskManager().addTask(g); completion.incrementAndGet(); }); if(completion.get() == 0) { println("no tasks started"); done(); } } void done() { exit(0); } }