package org.manalith.ircbot.plugin.relay; import java.util.StringTokenizer; import org.manalith.ircbot.ManalithBot; import org.manalith.ircbot.plugin.SimplePlugin; import org.manalith.ircbot.resources.MessageEvent; import org.springframework.stereotype.Component; /** * 한 서버의 메시지를 다른 서버에 그대로 전달해주는 봇. 이 플러그인이 정상 작동하려면 isExecuted() 가 실행되지 않도록 반드시 * 플러그인 목록의 최상단에 위치해야 한다. * * @author setzer * */ @Component public class RelayPlugin extends SimplePlugin { public static RelayBot RELAY_BOT; private String outputFormat; public RelayPlugin(boolean enableRelay, RelayConfiguration config) throws Exception { // TODO enableRelay 인자를 받지 않고도 플러그인 초기화를 막을 수 있도록 구조 개선 if (enableRelay) { init(config); } } private void init(RelayConfiguration config) throws Exception { final RelayBot bot = new RelayBot(config.buildPircBotConfiguration()); RELAY_BOT = bot; // XXX Refer RelayBotListener.java:7 bot.setIgnorePattern(config.getIgnorePattern()); bot.setOutputFormat(config.getOutputFormat()); bot.startBot(); this.outputFormat = config.getOutputFormat(); final StringTokenizer st = new StringTokenizer( config.getDefaultChannels(), ","); while (st.hasMoreTokens()) bot.sendIRC().joinChannel(st.nextToken()); } @Override public String getName() { return "릴레이 플러그인"; } @Override public String getCommands() { return null; } @Override public String getHelp() { return null; } public void setBot(ManalithBot bot) { RELAY_BOT.setTargetbot(bot); } @Override public void onMessage(MessageEvent event) { String channel = event.getChannel().getName(); String sender = event.getUser().getNick(); String message = event.getMessage(); if (message.equals("relay:stop")) { setRelaying(false); event.respond("릴레이를 강제로 종료합니다."); // 타겟 채널 이름은 소스 채널 이름과 동일한 것으로 간주. // 명령에 대한 안내에 대해 입력 명령은 전송하지 않음. RELAY_BOT.sendIRC().message(event.getChannel().getName(), "릴레이를 강제로 종료합니다."); return; } else if (message.equals("relay:start")) { setRelaying(true); event.respond("릴레이를 강제로 시작합니다."); // 타겟 채널 이름은 소스 채널 이름과 동일한 것으로 간주. // 명령에 대한 안내에 대해 입력 명령은 전송하지 않음. RELAY_BOT.sendIRC().message(event.getChannel().getName(), "릴레이를 강제로 시작합니다."); return; } if (isRelaying()) { /** * 메인 봇에 메시지가 들어오면 릴레이 봇으로 전송한다. */ /* * String targetChannel = "#setzer"; * * if (channel.equals("#gnome")) { targetChannel = "#gnome"; } else * if (channel.equals("#setzer")) { targetChannel = "#setzer"; } */ // 타겟 서버의 타겟 채널 이름은 소스 서버의 소스 채널 이름과 동일한 것으로 간주. RELAY_BOT.sendIRC().message(channel, String.format(this.outputFormat, sender, message)); } } private static boolean relaying = false; public static boolean isRelaying() { return relaying; } public static void setRelaying(boolean relaying) { RelayPlugin.relaying = relaying; } }