import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
+import java.util.concurrent.TimeUnit;
import java.util.logging.Level;
import java.util.logging.Logger;
import com.google.common.eventbus.EventBus;
import com.google.common.eventbus.Subscribe;
import com.google.common.io.Closeables;
-import com.google.common.util.concurrent.AbstractIdleService;
+import com.google.common.util.concurrent.AbstractExecutionThreadService;
import com.google.inject.Inject;
/**
*
* @author <a href="mailto:bombe@pterodactylus.net">David ‘Bombe’ Roden</a>
*/
-public class Core extends AbstractIdleService {
+public class Core extends AbstractExecutionThreadService {
/** The logger. */
private static final Logger logger = Logger.getLogger(Core.class.getName());
protected void startUp() {
for (Channel channel : channels) {
logger.info(String.format("Connecting to Channel %s on Network %s…", channel.name(), channel.network().name()));
- if (!networkConnections.containsKey(channel.network())) {
- /* select a random server. */
- List<Server> servers = Lists.newArrayList(channel.network().servers());
- Server server = servers.get((int) (Math.random() * servers.size()));
- Connection connection = new ConnectionBuilder(eventBus).connect(server.hostname()).port(server.unencryptedPorts().iterator().next()).build();
- connection.username(RandomNickname.get()).realName(RandomNickname.get());
- networkConnections.put(channel.network(), connection);
- connection.start();
- }
+ connectNetwork(channel.network());
}
/* notify listeners. */
}
@Override
+ protected void run() throws Exception {
+ while (isRunning()) {
+ try {
+ Thread.sleep(TimeUnit.MINUTES.toMillis(1));
+ } catch (InterruptedException ie1) {
+ /* ignore. */
+ }
+
+ /* find channels that should be monitored but are not. */
+ for (Channel channel : channels) {
+ if (joinedChannels.contains(channel)) {
+ continue;
+ }
+
+ connectNetwork(channel.network());
+ Connection connection = networkConnections.get(channel.network());
+ if (connection.established()) {
+ eventBus.post(new GenericMessage(String.format("Trying to join %s on %s.", channel.name(), channel.network().name())));
+ connection.joinChannel(channel.name());
+ }
+ }
+ }
+ }
+
+ @Override
protected void shutDown() {
}
//
+ // PRIVATE METHODS
+ //
+
+ /**
+ * Starts a new connection for the given network if no such connection exists
+ * already.
+ *
+ * @param network
+ * The network to connect to
+ */
+ private void connectNetwork(Network network) {
+ if (!networkConnections.containsKey(network)) {
+ /* select a random server. */
+ List<Server> servers = Lists.newArrayList(network.servers());
+ if (servers.isEmpty()) {
+ eventBus.post(new GenericError(String.format("Network %s does not have any servers.", network.name())));
+ return;
+ }
+ Server server = servers.get((int) (Math.random() * servers.size()));
+ Connection connection = new ConnectionBuilder(eventBus).connect(server.hostname()).port(server.unencryptedPorts().iterator().next()).build();
+ connection.username(RandomNickname.get()).realName(RandomNickname.get());
+ networkConnections.put(network, connection);
+ connection.start();
+ }
+ }
+
+ //
// EVENT HANDLERS
//