// Copyright (c) 2015 Christopher "BlayTheNinth" Baker package net.blay09.mods.eirairc; import com.google.common.collect.Lists; import net.blay09.mods.eirairc.api.irc.IRCConnection; import net.blay09.mods.eirairc.bot.IRCBotImpl; import net.blay09.mods.eirairc.config.*; import net.blay09.mods.eirairc.irc.IRCConnectionImpl; import net.blay09.mods.eirairc.irc.ssl.IRCConnectionSSLImpl; import net.blay09.mods.eirairc.util.ConfigHelper; import net.blay09.mods.eirairc.util.Utils; import net.minecraft.util.ChatComponentText; import java.util.*; public class ConnectionManager { private static final Map<String, IRCConnection> connections = new HashMap<>(); private static boolean ircRunning; public static void startIRC() { if(!ConfigurationHandler.failedToLoad.isEmpty()) { StringBuilder sb = new StringBuilder("Failed to load EiraIRC configurations due to syntax errors: "); for(String s : ConfigurationHandler.failedToLoad) { if(sb.length() > 0) { sb.append(", "); } sb.append(s); } Utils.addMessageToChat(new ChatComponentText(sb.toString())); Utils.addMessageToChat(new ChatComponentText("See the log for more information.")); } if(!LocalConfig.disableModpackIRC.get()) { for (ServerConfig serverConfig : ConfigurationHandler.getServerConfigs()) { if (serverConfig.getGeneralSettings().autoJoin.get() && !serverConfig.isRedirect()) { connectTo(serverConfig); } } } ircRunning = true; } public static void stopIRC() { List<IRCConnection> dcList = Lists.newArrayList(); dcList.addAll(connections.values()); for (IRCConnection connection : dcList) { connection.disconnect(ConfigHelper.getQuitMessage(connection)); } connections.clear(); EiraIRC.instance.getChatSessionHandler().clear(); ircRunning = false; } public static boolean isIRCRunning() { return ircRunning; } public static Collection<IRCConnection> getConnections() { return connections.values(); } public static void addConnection(IRCConnection connection) { connections.put(connection.getIdentifier(), connection); } public static int getConnectionCount() { return connections.size(); } public static IRCConnection getDefaultConnection() { Iterator<IRCConnection> it = connections.values().iterator(); if(it.hasNext()) { return it.next(); } return null; } public static IRCConnection getConnection(String identifier) { return connections.get(identifier); } public static void removeConnection(IRCConnection connection) { connections.remove(connection.getHost()); } public static boolean isConnectedTo(String identifier) { return connections.containsKey(identifier); } public static void clearConnections() { connections.clear(); } public static boolean isLatestConnection(IRCConnection connection) { IRCConnection latestConnection = connections.get(connection.getIdentifier()); return latestConnection == null || latestConnection == connection; } public static boolean redirectTo(ServerConfig serverConfig, boolean solo) { if(serverConfig == null) { stopIRC(); return true; } IRCConnection connection = getConnection(serverConfig.getIdentifier()); if(connection != null && solo) { connection.disconnect("Redirected by server"); connection = null; } if(connection == null) { connection = connectTo(serverConfig); if(connection == null) { return false; } } else { for(ChannelConfig channelConfig : serverConfig.getChannelConfigs()) { connection.join(channelConfig.getName(), AuthManager.getChannelPassword(channelConfig.getIdentifier())); } } return true; } public static IRCConnectionImpl connectTo(ServerConfig config) { IRCConnection oldConnection = getConnection(config.getIdentifier()); if(oldConnection != null) { oldConnection.disconnect("Reconnecting..."); } IRCConnectionImpl connection; if(config.isSSL()) { connection = new IRCConnectionSSLImpl(config, ConfigHelper.formatNick(config.getNick())); } else { connection = new IRCConnectionImpl(config, ConfigHelper.formatNick(config.getNick())); } connection.setBot(new IRCBotImpl(connection)); if(connection.start()) { return connection; } return null; } public static void tickConnections() { for(IRCConnection connection : connections.values()) { ((IRCConnectionImpl) connection).tick(); } } }