package modules;
import java.util.HashMap;
import bot.IrcBot;
import bot.Message;
import bot.Module;
import bot.Server;
public class Ping implements Module{
private HashMap<String, String> requests = new HashMap<String, String>();
private boolean pong = false;
private boolean started = false;
private final int PING_TIMEOUT = 240;
public void parse(Message m){
if(m.command().equals("PING")){
m.send("PONG :" + m.trailing());
}
if(m.command().equals("PONG")){
pong = true;
}
if(m.command().equals("NOTICE") && requests.containsKey(m.sender()) && m.trailing().startsWith("PING")){
long ping = System.currentTimeMillis() - Long.parseLong(m.trailing().substring(6, m.trailing().length()-1));
m.pm(requests.get(m.sender()), "Ping for " + m.sender() + ": " + ping + "ms");
requests.remove(m.sender());
}
if(m.command().equals("PRIVMSG") && m.trailing().startsWith("PING")){
m.notice(m.sender(), m.trailing());
}
if(m.botCommand().equals("ping")){
if(m.hasBotParams()){
String[] targets = m.botParamsArray();
String target = m.param();
if(!m.param().startsWith("#")) target = m.sender();
for(int i = 0; i < targets.length; i++){
if(targets[i].startsWith("#"))continue;
m.pm(targets[i],"PING " + System.currentTimeMillis() + "");
requests.put(targets[i], target);
}
}
}
if(!started){
started = true;
checkPing();
}
}
private void checkPing(){
new Thread(new Runnable(){
@Override
public void run() {
while(true){
try {
Thread.sleep(20000);
} catch (InterruptedException e1) {
}
if(Server.isConnected()){
pong = false;
Server.send("PING " + System.currentTimeMillis());
int i = 0;
while(true){
if(i == PING_TIMEOUT){
Server.resetConnection("No response from server");
break;
}
if(pong) break;
try {
Thread.sleep(1000);
} catch (InterruptedException e) {}
i++;
}
}
}
}
}).start();
}
}