package de.skuzzle.polly.core.internal.irc;
import java.io.IOException;
import java.util.List;
import de.skuzzle.jeve.EventProvider;
import de.skuzzle.polly.core.configuration.ConfigurationProviderImpl;
import de.skuzzle.polly.core.internal.ModuleStates;
import de.skuzzle.polly.core.internal.ShutdownManagerImpl;
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;
@Module(
requires = {
@Require(component = ConfigurationProviderImpl.class),
@Require(component = ShutdownManagerImpl.class),
@Require(component = EventProvider.class),
@Require(state = ModuleStates.PLUGINS_READY),
@Require(state = ModuleStates.PERSISTENCE_READY) },
provides = {
@Provide(component = IrcManagerImpl.class),
@Provide(component = BotConnectionSettings.class),
@Provide(state = ModuleStates.IRC_READY) })
public class IrcManagerProvider extends AbstractProvider {
public final static String IRC_CONFIG_FILE = "irc.cfg";
private EventProvider events;
private IrcManagerImpl ircManager;
private ShutdownManagerImpl shutdownManager;
private Configuration ircConfig;
private BotConnectionSettings connectionSettings;
public IrcManagerProvider(ModuleLoader loader) {
super("IRC_MANAGER_PROVIDER", loader, true);
}
@Override
public void beforeSetup() {
this.events = this.requireNow(EventProvider.class, true);
this.shutdownManager = this.requireNow(ShutdownManagerImpl.class, true);
}
@Override
public void setup() throws SetupException {
ConfigurationProvider configProvider =
this.requireNow(ConfigurationProviderImpl.class, true);
this.ircConfig = null;
try {
this.ircConfig = configProvider.open(IRC_CONFIG_FILE);
} catch (IOException e) {
throw new SetupException(e);
}
String nickName = this.ircConfig.readString(Configuration.NICKNAME);
String server = this.ircConfig.readString(Configuration.SERVER);
String ident = this.ircConfig.readString(Configuration.IDENT);
String ircModes = this.ircConfig.readString(Configuration.IRC_MODES);
List<String> channels = this.ircConfig.readStringList(Configuration.CHANNELS);
List<Integer> ports = this.ircConfig.readIntList(Configuration.PORT);
boolean ircLogging = this.ircConfig.readBoolean(Configuration.IRC_LOGGING);
String encodingName = configProvider.getRootConfiguration().readString(
Configuration.ENCODING);
this.ircManager = new IrcManagerImpl(nickName,
this.events, this.ircConfig, encodingName);
this.provideComponent(this.ircManager);
// XXX: do not add any listeners to the irc manager here. this is done
// in IrcEventHandlerProvider
logger.info("Starting bot with settings: (" + "Nick: "
+ nickName + ", Ident: *****" + ", Server: "
+ server + ", Ports: " + ports.toString()
+ ", Logging: " + ircLogging + ")");
this.connectionSettings = new BotConnectionSettings(
nickName, server,
ports, ident,
channels, ircModes);
this.provideComponent(this.connectionSettings);
this.shutdownManager.addDisposable(this.ircManager);
}
@Override
public void run() throws Exception {
int retries = this.ircConfig.readInt(Configuration.INITIAL_RETY_COUNT);
for (int i = 0; i < retries && !this.ircManager.isConnected(); ++i) {
logger.warn("Initial connection attempt " + (i + 1));
try {
this.ircManager.connect(this.connectionSettings);
} catch (Exception e) {
logger.error("Connection attempt failed", e);
}
}
if (!this.ircManager.isConnected()) {
throw new SetupException("Failed to connect after " + retries +
" connection attempts");
}
logger.info("IRC Connection established!");
this.addState(ModuleStates.IRC_READY);
}
@Override
public void dispose() {
this.events = null;
this.shutdownManager = null;
super.dispose();
}
}