package org.manalith.ircbot.plugin; import java.lang.reflect.InvocationTargetException; import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.StringUtils; import org.manalith.ircbot.ManalithBot; import org.manalith.ircbot.command.CommandParser; import org.manalith.ircbot.common.stereotype.BotCommand.BotEvent; import org.pircbotx.hooks.ListenerAdapter; import org.pircbotx.hooks.events.ActionEvent; import org.pircbotx.hooks.events.ChannelInfoEvent; import org.pircbotx.hooks.events.ConnectEvent; import org.pircbotx.hooks.events.DisconnectEvent; import org.pircbotx.hooks.events.IncomingChatRequestEvent; import org.pircbotx.hooks.events.IncomingFileTransferEvent; import org.pircbotx.hooks.events.InviteEvent; import org.pircbotx.hooks.events.JoinEvent; import org.pircbotx.hooks.events.KickEvent; import org.pircbotx.hooks.events.MessageEvent; import org.pircbotx.hooks.events.ModeEvent; import org.pircbotx.hooks.events.NickAlreadyInUseEvent; import org.pircbotx.hooks.events.NickChangeEvent; import org.pircbotx.hooks.events.NoticeEvent; import org.pircbotx.hooks.events.OpEvent; import org.pircbotx.hooks.events.PartEvent; import org.pircbotx.hooks.events.PrivateMessageEvent; import org.pircbotx.hooks.events.QuitEvent; import org.pircbotx.hooks.events.RemoveChannelBanEvent; import org.pircbotx.hooks.events.RemoveChannelKeyEvent; import org.pircbotx.hooks.events.RemoveChannelLimitEvent; import org.pircbotx.hooks.events.RemoveInviteOnlyEvent; import org.pircbotx.hooks.events.RemoveModeratedEvent; import org.pircbotx.hooks.events.RemoveNoExternalMessagesEvent; import org.pircbotx.hooks.events.RemovePrivateEvent; import org.pircbotx.hooks.events.RemoveSecretEvent; import org.pircbotx.hooks.events.RemoveTopicProtectionEvent; import org.pircbotx.hooks.events.ServerResponseEvent; import org.pircbotx.hooks.events.SetChannelBanEvent; import org.pircbotx.hooks.events.SetChannelKeyEvent; import org.pircbotx.hooks.events.SetChannelLimitEvent; import org.pircbotx.hooks.events.SetInviteOnlyEvent; import org.pircbotx.hooks.events.SetModeratedEvent; import org.pircbotx.hooks.events.SetNoExternalMessagesEvent; import org.pircbotx.hooks.events.SetPrivateEvent; import org.pircbotx.hooks.events.SetSecretEvent; import org.pircbotx.hooks.events.SetTopicProtectionEvent; import org.pircbotx.hooks.events.TopicEvent; import org.pircbotx.hooks.events.UserListEvent; import org.pircbotx.hooks.events.UserModeEvent; import org.pircbotx.hooks.events.VoiceEvent; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @Component public class EventDispatcher extends ListenerAdapter<ManalithBot> { public static final String COMMAND_PREFIX = "!"; private Logger logger = LoggerFactory.getLogger(getClass()); @Autowired private PluginManager plugins; public void dispatchMessageEvent( org.manalith.ircbot.resources.MessageEvent event) { // 공백으로 구성된 메시지는 처리하지 않는다. if (StringUtils.isBlank(event.getMessage())) { return; } String[] segments = event.getMessageSegments(); String cmd = segments[0]; String[] params = ArrayUtils.subarray(segments, 1, segments.length); // 어노테이션(@BotCommand) 기반 플러그인 실행 if (cmd.startsWith(COMMAND_PREFIX)) { for (Command command : plugins.getCommands().keySet()) { if (!command.matches(cmd, BotEvent.ON_MESSAGE)) continue; try { event.respond(command.execute(event, params)); } catch (IllegalArgumentException | IllegalAccessException | InvocationTargetException e) { logger.warn(e.getMessage(), e); event.respond(String.format("실행중 %s 오류가 발생했습니다.", e.getMessage())); } if (event.isExecuted()) return; } } // 비 어노테이션 기반 플러그인 실행 for (Plugin plugin : plugins.getPlugins()) { plugin.onMessage(event); if (event.isExecuted()) return; } } @Override public void onConnect(ConnectEvent<ManalithBot> event) throws Exception { // pluginManager.onConnect(); } @Override public void onDisconnect(DisconnectEvent<ManalithBot> event) throws Exception { // pluginManager.onDisconnect(); } @Override public void onNickAlreadyInUse(NickAlreadyInUseEvent<ManalithBot> event) throws Exception { logger.error("닉네임이 이미 사용중입니다."); } @Override public void onServerResponse(ServerResponseEvent<ManalithBot> event) throws Exception { // pluginManager.onServerResponse(code, response); } @Override public void onUserList(UserListEvent<ManalithBot> event) throws Exception { super.onUserList(event); } @Override public void onMessage(MessageEvent<ManalithBot> event) { String sender = event.getUser().getNick(); String message = event.getMessage(); // 릴레이 메시지일 경우 로컬 메시지로 변환한다. // TODO 메시지 필터 구현 if (sender.equals("♠") || sender.equals("♠_")) { sender = CommandParser.getSenderByRelayMessage(message); message = CommandParser.convertRelayToLocalMessage(message); } if (StringUtils.isEmpty(message)) return; org.manalith.ircbot.resources.MessageEvent msg = new org.manalith.ircbot.resources.MessageEvent( event); msg.setMessage(message); dispatchMessageEvent(msg); } @Override public void onPrivateMessage(PrivateMessageEvent<ManalithBot> event) throws Exception { org.manalith.ircbot.resources.MessageEvent msg = new org.manalith.ircbot.resources.MessageEvent( event); for (Plugin plugin : plugins.getPlugins()) { plugin.onPrivateMessage(msg); if (msg.isExecuted()) break; } } @Override public void onAction(ActionEvent<ManalithBot> event) throws Exception { super.onAction(event); } @Override public void onNotice(NoticeEvent<ManalithBot> event) throws Exception { super.onNotice(event); } @Override public void onJoin(JoinEvent<ManalithBot> event) throws Exception { for (Plugin plugin : plugins.getPlugins()) plugin.onJoin(event.getChannel().getName(), event.getUser() .getNick(), event.getUser().getLogin(), event.getUser() .getHostmask()); } @Override public void onPart(PartEvent<ManalithBot> event) throws Exception { for (Plugin plugin : plugins.getPlugins()) plugin.onPart(event.getChannel().getName(), event.getUser() .getNick(), event.getUser().getLogin(), event.getUser() .getHostmask()); } @Override public void onNickChange(NickChangeEvent<ManalithBot> event) throws Exception { // pluginManager.onNickChange(oldNick, login, hostname, newNick); } @Override public void onKick(KickEvent<ManalithBot> event) throws Exception { // pluginManager.onKick(channel, kickerNick, kickerLogin, // kickerHostname, recipientNick, reason); } @Override public void onQuit(QuitEvent<ManalithBot> event) throws Exception { for (Plugin plugin : plugins.getPlugins()) plugin.onQuit(event.getUser().getNick(), event.getUser().getLogin(), event.getUser().getHostmask(), event.getReason()); } @Override public void onTopic(TopicEvent<ManalithBot> event) throws Exception { // pluginManager.onTopic(channel, topic, setBy, date, changed); } @Override public void onChannelInfo(ChannelInfoEvent<ManalithBot> event) throws Exception { // logger.trace("CHANNEL_INFO : {} / {} / {}", channel,userCount, // topic); // pluginManager.onTopic(channel, userCount, topic); } @Override public void onMode(ModeEvent<ManalithBot> event) throws Exception { super.onMode(event); } @Override public void onUserMode(UserModeEvent<ManalithBot> event) throws Exception { super.onUserMode(event); } @Override public void onOp(OpEvent<ManalithBot> event) throws Exception { super.onOp(event); } @Override public void onVoice(VoiceEvent<ManalithBot> event) throws Exception { super.onVoice(event); } @Override public void onSetChannelKey(SetChannelKeyEvent<ManalithBot> event) throws Exception { super.onSetChannelKey(event); } @Override public void onRemoveChannelKey(RemoveChannelKeyEvent<ManalithBot> event) throws Exception { super.onRemoveChannelKey(event); } @Override public void onSetChannelLimit(SetChannelLimitEvent<ManalithBot> event) throws Exception { super.onSetChannelLimit(event); } @Override public void onRemoveChannelLimit(RemoveChannelLimitEvent<ManalithBot> event) throws Exception { super.onRemoveChannelLimit(event); } @Override public void onSetChannelBan(SetChannelBanEvent<ManalithBot> event) throws Exception { super.onSetChannelBan(event); } @Override public void onRemoveChannelBan(RemoveChannelBanEvent<ManalithBot> event) throws Exception { super.onRemoveChannelBan(event); } @Override public void onSetTopicProtection(SetTopicProtectionEvent<ManalithBot> event) throws Exception { super.onSetTopicProtection(event); } @Override public void onRemoveTopicProtection( RemoveTopicProtectionEvent<ManalithBot> event) throws Exception { super.onRemoveTopicProtection(event); } @Override public void onSetNoExternalMessages( SetNoExternalMessagesEvent<ManalithBot> event) throws Exception { super.onSetNoExternalMessages(event); } @Override public void onRemoveNoExternalMessages( RemoveNoExternalMessagesEvent<ManalithBot> event) throws Exception { super.onRemoveNoExternalMessages(event); } @Override public void onSetInviteOnly(SetInviteOnlyEvent<ManalithBot> event) throws Exception { super.onSetInviteOnly(event); } @Override public void onRemoveInviteOnly(RemoveInviteOnlyEvent<ManalithBot> event) throws Exception { super.onRemoveInviteOnly(event); } @Override public void onSetModerated(SetModeratedEvent<ManalithBot> event) throws Exception { super.onSetModerated(event); } @Override public void onRemoveModerated(RemoveModeratedEvent<ManalithBot> event) throws Exception { super.onRemoveModerated(event); } @Override public void onSetPrivate(SetPrivateEvent<ManalithBot> event) throws Exception { super.onSetPrivate(event); } @Override public void onRemovePrivate(RemovePrivateEvent<ManalithBot> event) throws Exception { super.onRemovePrivate(event); } @Override public void onSetSecret(SetSecretEvent<ManalithBot> event) throws Exception { super.onSetSecret(event); } @Override public void onRemoveSecret(RemoveSecretEvent<ManalithBot> event) throws Exception { super.onRemoveSecret(event); } @Override public void onInvite(InviteEvent<ManalithBot> event) throws Exception { ManalithBot bot = event.getBot(); if (bot.getManalithBotConfiguration().isAutoAcceptInvite()) { bot.sendIRC().joinChannel(event.getChannel()); } } @Override public void onIncomingFileTransfer( IncomingFileTransferEvent<ManalithBot> event) throws Exception { super.onIncomingFileTransfer(event); } @Override public void onIncomingChatRequest( IncomingChatRequestEvent<ManalithBot> event) throws Exception { super.onIncomingChatRequest(event); } }