package org.manalith.ircbot.plugin.et;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Timer;
import org.manalith.ircbot.plugin.SimplePlugin;
import org.manalith.ircbot.resources.MessageEvent;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import com.etcfg.etlaunch.ColorConvertor;
import com.etcfg.etlaunch.ServerStatus;
import com.etcfg.etlaunch.ServerStatusChecker;
@Component("etPlugin")
public class ETPlugin extends SimplePlugin {
private Logger logger = LoggerFactory.getLogger(getClass());
private PlayerManager playerManager;
private static final String NAMESPACE = "et";
private final static long ONCE_PER_MINUTE = 1000 * 60;
private final static long ONCE_PER_HOUR = ONCE_PER_MINUTE * 60;
private final static long ONCE_PER_DAY = ONCE_PER_HOUR * 24;
private String serverAddress;
private int serverPort;
@Override
public void start() throws Exception {
super.start();
playerManager = PlayerManager.instance();
ETAlertTimerTask alertTask = new ETAlertTimerTask(this);
Timer timer = new Timer(true);
// 한 시간 뒤 00분에 첫 실행
Calendar now = Calendar.getInstance();
now.set(Calendar.HOUR_OF_DAY, now.get(Calendar.HOUR_OF_DAY) + 1); // 1~24
now.set(Calendar.MINUTE, 0);
now.set(Calendar.MILLISECOND, 0);
Date firstTime = now.getTime();
logger.info("ET 플러그인 실행 시간 : " + Calendar.getInstance().toString());
logger.info("최초 실행 예정 시간 : " + now.toString());
timer.scheduleAtFixedRate(alertTask, firstTime, ONCE_PER_HOUR);
}
@Override
public String getName() {
return "Enemy Territory";
}
@Override
public String getCommands() {
return NAMESPACE;
}
@Override
public String getHelp() {
// return
// "et:help, et:register, et:unregister, et:ready, et:list, et:players, et:alert, et:connected";
return "et:help, et:register, et:unregister, et:list, et:alert, et:connected";
}
public PlayerManager getPlayerManager() {
return playerManager;
}
@Override
public void onMessage(MessageEvent event) {
String message = event.getMessage();
String sender = event.getUser().getNick();
switch (message) {
case NAMESPACE + ":register": {
Player p = new Player();
p.setETName(sender);
p.setIRCName(sender);
try {
playerManager.add(p);
playerManager.save();
event.respond(sender + ", 등록되었습니다.");
} catch (AlreadyRegisteredException ex) {
event.respond(sender + ", 이미 등록된 닉네임입니다.");
}
break;
}
case NAMESPACE + ":unregister": {
Player p = new Player();
p.setETName(sender);
p.setIRCName(sender);
try {
playerManager.remove(p);
playerManager.save();
event.respond(sender + ", 삭제되었습니다.");
} catch (NotRegisteredException e) {
event.respond(sender + ", 등록되지 않은 닉네임입니다.");
}
break;
}
/*
* case NAMESPACE + ":ready": Player p = new Player();
* p.setETName(sender); p.setIRCName(sender); try{
* playerManager.setReady(p); playerManager.save(); event.respond(sender
* + ", 대기자 명단에 포함되었습니다."); }catch(NotRegisteredException ex){
* event.respond(sender + ", et:register 명령으로 먼저 등록해주세요."); } break;
*/
case NAMESPACE + ":list": {
event.respond("등록된 플레이어 : " + playerManager.getPlayerNicks());
break;
}
/*
* case NAMESPACE + ":players" : event.respond("금일 참가 예정 플레이어 : " +
* playerManager.getPlayerNicks()); break;
*/
case "!et":
case NAMESPACE + ":connected": {
try {
ServerStatusChecker checker = new ServerStatusChecker();
ServerStatus status = checker.checkStatus(serverAddress,
serverPort, true);
List<ServerStatus.Player> players = status.getPlayers();
if (players.isEmpty()) {
event.respond(String.format(
"%s(현재 맵 : %s) 에 접속중인 플레이어가 없습니다.", serverAddress,
status.getMapName()));
} else {
Map<String, List<ServerStatus.Player>> playerMap = new LinkedHashMap<>();
playerMap.put("Axis", new ArrayList<>());
playerMap.put("Allies", new ArrayList<>());
playerMap.put("Spectator", new ArrayList<>());
playerMap.put("Connecting", new ArrayList<>());
for (ServerStatus.Player player : players) {
if (playerMap.containsKey(player.getTeam())) {
playerMap.get(player.getTeam()).add(player);
} else {
playerMap.get("Connecting").add(player);
}
}
StringBuilder sb = new StringBuilder();
for (Entry<String, List<ServerStatus.Player>> entry : playerMap
.entrySet()) {
if (entry.getValue().isEmpty()) {
continue;
}
sb.append(" ");
sb.append(entry.getKey());
sb.append(" ");
for (ServerStatus.Player player : entry.getValue()) {
sb.append(ColorConvertor
.convertToPlainString(player.getName()));
sb.append("(");
sb.append(player.getXp());
sb.append(")");
}
}
event.respond(String.format(
"%s(현재 맵 : %s)에 접속중인 플레이어 : %s", serverAddress,
status.getMapName(), sb.toString()));
}
} catch (IOException e) {
logger.warn(e.getMessage(), e);
event.respond("서버 연결에 오류가 발생했습니다.");
}
break;
}
case NAMESPACE + ":alert":
event.respond(playerManager.getPlayerNicks() + " ET하자옹!");
break;
case NAMESPACE + ":help":
event.respond(getHelp());
break;
}
}
/**
* @return the serverAddress
*/
public String getServerAddress() {
return serverAddress;
}
/**
* @param serverAddress
* the serverAddress to set
*/
public void setServerAddress(String serverAddress) {
this.serverAddress = serverAddress;
}
/**
* @return the serverPort
*/
public int getServerPort() {
return serverPort;
}
/**
* @param serverPort
* the serverPort to set
*/
public void setServerPort(int serverPort) {
this.serverPort = serverPort;
}
}