package org.manalith.ircbot.plugin.admin;
import java.lang.management.ManagementFactory;
import java.lang.management.RuntimeMXBean;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.lang3.StringUtils;
import org.manalith.ircbot.plugin.SimplePlugin;
import org.manalith.ircbot.resources.MessageEvent;
import org.pircbotx.Channel;
import org.pircbotx.User;
import org.springframework.stereotype.Component;
@Component
public class AdminPlugin extends SimplePlugin {
private List<Admin> admins = new ArrayList<>();
private String password;
public String getPassword() {
return password;
}
public void setPassword(String password) {
if (password.equals("CHANGE_ME")) {
throw new IllegalArgumentException("기본값을 사용할 수 없습니다.");
}
this.password = password;
}
@Override
public String getName() {
return "AUTH";
}
@Override
public String getHelp() {
return "인증과 관리를 지원합니다.";
}
@Override
public void onMessage(MessageEvent event) {
String message = event.getMessage();
User sender = event.getUser();
Channel channel = event.getChannel();
switch (message) {
case "!나가":
if (channel.isOp(sender)) {
channel.send().part();
event.setExecuted(true);
} else {
event.respond("옵을 가진 사용자만 실행할 수 있습니다.");
}
break;
case "!@":
if (channel.isOp(sender) || channel.isSuperOp(sender)
|| channel.isOwner(sender)) {
if (!channel.isOp(event.getBot().getUserBot())) {
event.respond("봇에게 옵이 필요합니다.");
}
ArrayList<String> uarr = new ArrayList<>();
StringBuilder modeFlag = new StringBuilder("+");
// 모든 사용자에게 옵을 준다
for (User user : channel.getUsers()) {
if (!channel.isOp(user) && !channel.isSuperOp(user)
&& !channel.isOwner(user)) {
uarr.add(user.getNick());
modeFlag.append("o");
}
}
if (uarr.isEmpty())
event.respond("모든 사용자가 옵을 가지고 있습니다.");
else
channel.send().setMode(
modeFlag + " "
+ StringUtils.join(uarr.toArray(), " "));
event.setExecuted(true);
} else {
event.respond("옵을 가진 사용자만 실행할 수 있습니다.");
}
break;
case "!uptime":
RuntimeMXBean bean = ManagementFactory.getRuntimeMXBean();
long upTime = bean.getUptime();
event.respond(String.format("Up Time = %d (ms)", upTime));
break;
}
if (isAdmin(sender)) {
if (message.equals("!quit")) {
// TODO 보다 안전한 종료가 필요
// TODO 멀티봇 대응 필요
// TODO 재시작 기능이 필요
event.getBot().sendIRC().quitServer();
System.exit(-1);
}
}
}
private boolean isAdmin(User user) {
for (Admin admin : admins) {
if (admin.equals(user)) {
return true;
}
}
return false;
}
@Override
public void onPrivateMessage(MessageEvent event) {
String message = event.getMessage();
if (StringUtils.left(message, 3).equals("pw ")) {
if (StringUtils.substring(message, 3).equals(password)) {
admins.add(new Admin(event.getUser()));
event.respond("인증되었습니다.");
} else {
event.respond("비밀번호가 잘못되었습니다.");
}
}
}
}