package org.pircbotx;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.StringTokenizer;
import javax.swing.Timer;
import org.pircbotx.hooks.TemporaryListener;
import org.pircbotx.hooks.events.ServerResponseEvent;
import pl.shockah.Helper;
import pl.shockah.shocky.ListenerAdapter;
public class ShockyUser extends User {
public String account;
private long recheckDelay;
protected ShockyUser(PircBotX bot, String nick) {
super(bot, nick);
}
public String getAccount() {
synchronized(this) {
if (account != null)
return account;
if (recheckDelay > System.currentTimeMillis())
return null;
PircBotX bot = getBot();
if (bot != null && bot.getServerInfo() != null && bot.getServerInfo().isWhoX())
account = getAccountFromWHOX();
else {
Whois whois = new Whois(this);
while (!whois.finished())
Helper.sleep(10);
account = whois.account;
}
if (account == null)
recheckDelay = System.currentTimeMillis()+60000;
}
return account;
}
private String getAccountFromWHOX() {
PircBotX bot = getBot();
WhoXListener listener = new WhoXListener(bot);
synchronized (listener) {
bot.getListenerManager().addListener(listener);
bot.sendRawLine("WHO "+getNick()+" %na");
try {
listener.wait(10000);
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
listener.done();
}
return listener.account;
}
}
public static class Whois extends ListenerAdapter implements ActionListener {
private final ShockyUser user;
private final Timer timer = new Timer(250,this);
private boolean finished = false;
private String account;
private Whois(ShockyUser user) {
this.user = user;
PircBotX bot = user.getBot();
bot.getListenerManager().addListener(this);
bot.sendRawLineNow("WHOIS "+user.getNick());
}
public void onServerResponse(ServerResponseEvent<ShockyBot> event) {
if (event.getCode() == 330) {
timer.stop();
account = event.getResponse().split(" ")[2];
remove();
} else if (event.getCode() == 318) {
if (!timer.isRunning()) timer.start();
}
}
public void actionPerformed(ActionEvent arg0) {
if (finished) return;
remove();
account = null;
}
private void remove() {
user.getBot().getListenerManager().removeListener(this);
finished = true;
}
public boolean finished() {
return finished;
}
}
public class WhoXListener extends TemporaryListener {
public String account;
private WhoXListener(PircBotX bot) {
super(bot);
}
@SuppressWarnings("rawtypes")
public void onServerResponse(ServerResponseEvent event) throws Exception {
if (event.getCode()!=354)
return;
StringTokenizer tok = new StringTokenizer(event.getResponse());
tok.nextToken();//Bot name
if (!getNick().contentEquals(tok.nextToken()))
return;
String acc = tok.nextToken();
if (!acc.contentEquals("0"))
account = acc;
synchronized (this) {
this.notify();
}
}
}
}