package de.skuzzle.polly.core.internal.irc; import java.io.IOException; import java.util.ArrayList; import java.util.Collection; import java.util.concurrent.ExecutorService; import de.skuzzle.jeve.EventProvider; import de.skuzzle.polly.core.configuration.ConfigurationProviderImpl; import de.skuzzle.polly.core.eventhandler.AutoLoginProvider; import de.skuzzle.polly.core.eventhandler.AutoLogoffHandler; import de.skuzzle.polly.core.eventhandler.AutoLogonHandler; import de.skuzzle.polly.core.eventhandler.EuIrcAutoLoginProvider; import de.skuzzle.polly.core.eventhandler.FreenodeAutoLoginProvider; import de.skuzzle.polly.core.eventhandler.GhostHandler; import de.skuzzle.polly.core.eventhandler.IrcLoggingHandler; import de.skuzzle.polly.core.eventhandler.MessageHandler; import de.skuzzle.polly.core.eventhandler.TraceNickChangeHandler; import de.skuzzle.polly.core.internal.ShutdownManagerImpl; import de.skuzzle.polly.core.internal.commands.CommandManagerImpl; import de.skuzzle.polly.core.internal.users.UserManagerImpl; import de.skuzzle.polly.core.moduleloader.AbstractProvider; import de.skuzzle.polly.core.moduleloader.ModuleLoader; import de.skuzzle.polly.core.moduleloader.SetupException; import de.skuzzle.polly.core.moduleloader.annotations.Module; import de.skuzzle.polly.core.moduleloader.annotations.Provide; import de.skuzzle.polly.core.moduleloader.annotations.Require; import de.skuzzle.polly.sdk.Configuration; import de.skuzzle.polly.sdk.ConfigurationProvider; import de.skuzzle.polly.sdk.IrcManager; import de.skuzzle.polly.sdk.eventlistener.MessageEvent; import de.skuzzle.polly.sdk.exceptions.AlreadySignedOnException; import de.skuzzle.polly.sdk.exceptions.UnknownUserException; @Module( requires = { @Require(component = IrcManagerImpl.class), @Require(component = ConfigurationProviderImpl.class), @Require(component = ShutdownManagerImpl.class), @Require(component = EventProvider.class), @Require(component = UserManagerImpl.class), @Require(component = CommandManagerImpl.class), @Require(component = ExecutorService.class), @Require(component = BotConnectionSettings.class) }, provides = @Provide(component = MessageHandler.class) ) public class IrcEventHandlerProvider extends AbstractProvider { private final Collection<AutoLoginProvider> loginProviders; public IrcEventHandlerProvider(ModuleLoader loader) { super("IRC_EVENT_HANDLER_PROVIDER", loader, true); this.loginProviders = new ArrayList<>(); this.loginProviders.add(new EuIrcAutoLoginProvider()); this.loginProviders.add(new FreenodeAutoLoginProvider()); } private AutoLoginProvider findProvider(String server) { for (final AutoLoginProvider provider : this.loginProviders) { if (provider.supportsNetwork(server)) { return provider; } } return new AutoLoginProvider() { @Override public boolean supportsNetwork(String server) { return false; } @Override public void requestAuthentification(String forUser, IrcManager irc) { } @Override public boolean processMessageEvent(MessageEvent e, UserManagerImpl users) throws AlreadySignedOnException, UnknownUserException { return false; } @Override public String toString() { return "DefaultAutoLoginProvider"; //$NON-NLS-1$ } }; } @Override public void setup() throws SetupException { IrcManagerImpl ircManager = this.requireNow(IrcManagerImpl.class, true); CommandManagerImpl commandManager = this.requireNow( CommandManagerImpl.class, true); UserManagerImpl userManager = this.requireNow(UserManagerImpl.class, true); ExecutorService executor = this.requireNow(ExecutorService.class, true); ShutdownManagerImpl shutdownManager = this.requireNow( ShutdownManagerImpl.class, true); ConfigurationProvider configProvider = this.requireNow(ConfigurationProviderImpl.class, true); Configuration ircConfig = null; try { ircConfig = configProvider.open(IrcManagerProvider.IRC_CONFIG_FILE); } catch (IOException e) { throw new SetupException(e); } boolean autoLogin = ircConfig.readBoolean(Configuration.AUTO_LOGIN); int parseErrorDetails = ircConfig.readInt(Configuration.PARSE_ERROR_DETAILS); int autoLoginTime = ircConfig.readInt(Configuration.AUTO_LOGIN_TIME); boolean ircLogging = ircConfig.readBoolean(Configuration.IRC_LOGGING); boolean reportUnknownCommand = ircConfig.readBoolean(Configuration.REPORT_UNKNOWN_COMMAND_ERROR); // setup handler for incoming irc messages that are to be parsed as a command. // XXX: Ensure that message handler is the first message listener to be added // because it updates a users idle time MessageHandler handler = new MessageHandler(commandManager, userManager, executor, parseErrorDetails, reportUnknownCommand); ircManager.addMessageListener(handler); provideComponent(handler); // setup irc logger if (ircLogging) { IrcLoggingHandler ircConsoleLogger = new IrcLoggingHandler(); ircManager.addMessageListener(ircConsoleLogger); ircManager.addNickChangeListener(ircConsoleLogger); ircManager.addJoinPartListener(ircConsoleLogger); } // this listener checks if we ghosted our original nick and changes our nickname // to the default one ircManager.addMessageListener(new GhostHandler()); ircManager.addNickChangeListener(new TraceNickChangeHandler( userManager)); // Setup auto login / logout handler if (autoLogin) { final BotConnectionSettings settings = this.requireNow( BotConnectionSettings.class, true); final AutoLoginProvider provider = this.findProvider(settings.getHostName()); logger.info("Chose auto login provider: " + provider); AutoLogonHandler logonHandler = new AutoLogonHandler( ircManager, userManager, provider, autoLoginTime); ircManager.addUserSpottedListener(logonHandler); ircManager.addNickChangeListener(logonHandler); ircManager.addConnectionListener(logonHandler); userManager.addUserListener(logonHandler); shutdownManager.addDisposable(logonHandler); } AutoLogoffHandler logoffHandler = new AutoLogoffHandler(userManager, ircManager); ircManager.addUserSpottedListener(logoffHandler); ircManager.addConnectionListener(logoffHandler); } }