package the8472.mldht.cli.commands;
import the8472.mldht.cli.CommandProcessor;
import the8472.mldht.cli.ParseArgs;
import lbms.plugins.mldht.kad.DHT;
import lbms.plugins.mldht.kad.Key;
import lbms.plugins.mldht.kad.tasks.PeerLookupTask;
import lbms.plugins.mldht.utils.NIOConnectionManager;
import java.time.Duration;
import java.time.Instant;
import java.util.ArrayList;
import java.util.Formatter;
import java.util.List;
import java.util.Objects;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.Collectors;
public class GetPeers extends CommandProcessor {
NIOConnectionManager conMan;
ScheduledThreadPoolExecutor timer;
@Override
protected void process() {
boolean fast = ParseArgs.extractBool(arguments, "-fast");
boolean nocache = ParseArgs.extractBool(arguments, "-nocache");
List<Key> hashes = arguments.stream()
.filter(Key.STRING_PATTERN.asPredicate())
.map(st -> new Key(st))
.collect(Collectors.toCollection(ArrayList::new));
if(hashes.isEmpty())
hashes.add(Key.createRandomKey());
AtomicInteger counter = new AtomicInteger();
Instant start = Instant.now();
hashes.forEach(h -> {
dhts.stream().filter(DHT::isRunning).map(DHT::getServerManager).map(m -> m.getRandomActiveServer(false)).filter(Objects::nonNull).forEach(d -> {
DHT dht = d.getDHT();
PeerLookupTask t = new PeerLookupTask(d, dht.getNode(), h);
t.setNoAnnounce(true);
t.setFastTerminate(fast);
t.useCache(!nocache);
counter.incrementAndGet();
t.addListener(unused -> {
if(counter.decrementAndGet() == 0)
exit(0);
});
//t.useCache(false);
t.setResultHandler((source, item) -> {
Formatter f = new Formatter();
Duration elapsed = Duration.between(start, Instant.now());
f.format("%-5dms %s %s from: %s", elapsed.toMillis(), h.toString(), item.toString(), source);
println(f.toString());
});
dht.getTaskManager().addTask(t);
});
});
}
}