package io.shockah.skylark;
import io.shockah.skylark.event.Whois2Event;
import io.shockah.skylark.func.Action1;
import io.shockah.skylark.util.Box;
import io.shockah.skylark.util.ReadWriteList;
import java.util.ArrayList;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import org.pircbotx.User;
public class WhoisManager extends SkylarkListenerAdapter {
public static final long DEFAULT_SYNC_REQUEST_TIMEOUT = 5000l;
public final Bot bot;
public final BotManager manager;
protected final ReadWriteList<Request> userRequests = new ReadWriteList<>(new ArrayList<>());
public WhoisManager(Bot bot) {
this.bot = bot;
manager = bot.manager;
}
public void asyncRequest(User user, Action1<Whois2Event> f) {
asyncRequest(user.getNick(), f);
}
public void asyncRequest(String nick, Action1<Whois2Event> f) {
userRequests.add(new Request(nick, f));
bot.sendRaw().rawLine(String.format("WHOIS %s", nick));
}
public Whois2Event syncRequest(User user) {
return syncRequest(user.getNick(), DEFAULT_SYNC_REQUEST_TIMEOUT);
}
public Whois2Event syncRequest(User user, long timeout) {
return syncRequest(user.getNick(), timeout);
}
public Whois2Event syncRequest(String nick) {
return syncRequest(nick, DEFAULT_SYNC_REQUEST_TIMEOUT);
}
public Whois2Event syncRequest(String nick, long timeout) {
CountDownLatch latch = new CountDownLatch(1);
Box<Whois2Event> box = new Box<>();
asyncRequest(nick, e -> {
box.value = e;
latch.countDown();
});
try {
latch.await(timeout, TimeUnit.MILLISECONDS);
} catch (Exception e) {
}
return box.value;
}
public void onWhois2(Whois2Event e) {
userRequests.iterateAndWrite((request, it) -> {
if (e.getNick().equalsIgnoreCase(request.nick)) {
request.func.call(e);
it.remove();
it.stop();
}
});
}
private static class Request {
public final String nick;
public final Action1<Whois2Event> func;
public Request(String nick, Action1<Whois2Event> func) {
this.nick = nick;
this.func = func;
}
}
}