X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=src%2Fmain%2Fjava%2Fnet%2Fpterodactylus%2Firc%2FConnection.java;h=6354c906403d0c2c0a3bc8ec233e5f9b5dd3a243;hb=c4867f883cce2d99972bb14dd5937c6348ff29f5;hp=fb67fe7bbaf2a349361a17eb703c13e57051b288;hpb=f724f1d4c327876f6a296a976b58e413c1eaaed6;p=xudocci.git diff --git a/src/main/java/net/pterodactylus/irc/Connection.java b/src/main/java/net/pterodactylus/irc/Connection.java index fb67fe7..6354c90 100644 --- a/src/main/java/net/pterodactylus/irc/Connection.java +++ b/src/main/java/net/pterodactylus/irc/Connection.java @@ -36,8 +36,12 @@ import java.util.List; import java.util.Map; import java.util.Set; import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicBoolean; + import javax.net.SocketFactory; +import net.pterodactylus.irc.connection.ChannelNotJoinedHandler; +import net.pterodactylus.irc.connection.ConnectionEstablishHandler; import net.pterodactylus.irc.event.ChannelJoined; import net.pterodactylus.irc.event.ChannelLeft; import net.pterodactylus.irc.event.ChannelMessageReceived; @@ -52,6 +56,7 @@ import net.pterodactylus.irc.event.ConnectionEstablished; import net.pterodactylus.irc.event.ConnectionFailed; import net.pterodactylus.irc.event.DccAcceptReceived; import net.pterodactylus.irc.event.DccSendReceived; +import net.pterodactylus.irc.event.KickedFromChannel; import net.pterodactylus.irc.event.MotdReceived; import net.pterodactylus.irc.event.NicknameChanged; import net.pterodactylus.irc.event.NicknameInUseReceived; @@ -68,6 +73,7 @@ import com.google.common.base.Optional; import com.google.common.collect.Maps; import com.google.common.collect.Sets; import com.google.common.eventbus.EventBus; +import com.google.common.eventbus.Subscribe; import com.google.common.io.Closeables; import com.google.common.primitives.Ints; import com.google.common.primitives.Longs; @@ -122,7 +128,7 @@ public class Connection extends AbstractExecutionThreadService implements Servic private ConnectionHandler connectionHandler; /** Whether the connection has already been established. */ - private boolean established; + private final AtomicBoolean established = new AtomicBoolean(); /** * Creates a new connection. @@ -172,7 +178,7 @@ public class Connection extends AbstractExecutionThreadService implements Servic * false} otherwise */ public boolean established() { - return established; + return established.get(); } /** @@ -362,6 +368,7 @@ public class Connection extends AbstractExecutionThreadService implements Servic return; } + eventBus.register(this); /* now read replies and react. */ try { /* some status variables. */ @@ -375,6 +382,9 @@ public class Connection extends AbstractExecutionThreadService implements Servic Map nickPrefixes = Maps.newHashMap(); Set channelTypes = Sets.newHashSet(); + ConnectionEstablishHandler connectionEstablishHandler = new ConnectionEstablishHandler(eventBus, this); + ChannelNotJoinedHandler channelNotJoinedHandler = new ChannelNotJoinedHandler(eventBus, this); + while (connected) { Reply reply = connectionHandler.readReply(); eventBus.post(new ReplyReceived(this, reply)); @@ -445,27 +455,15 @@ public class Connection extends AbstractExecutionThreadService implements Servic } else if (command.equalsIgnoreCase("QUIT")) { eventBus.post(new ClientQuit(this, reply.source().get(), parameters.get(0))); - /* common channel join errors. */ - } else if (command.equals("474")) { - eventBus.post(new ChannelNotJoined(this, parameters.get(1), Reason.banned)); - } else if (command.equals("473")) { - eventBus.post(new ChannelNotJoined(this, parameters.get(1), Reason.inviteOnly)); - } else if (command.equals("475")) { - eventBus.post(new ChannelNotJoined(this, parameters.get(1), Reason.badChannelKey)); + } else if (channelNotJoinedHandler.willHandle(reply)) { + channelNotJoinedHandler.handleReply(reply); /* basic connection housekeeping. */ } else if (command.equalsIgnoreCase("PING")) { connectionHandler.sendCommand("PONG", getOptional(parameters, 0), getOptional(parameters, 1)); - /* replies 001-004 don’t hold information but they have to be sent on a successful connection. */ - } else if (command.equals("001")) { - connectionStatus |= 0x01; - } else if (command.equals("002")) { - connectionStatus |= 0x02; - } else if (command.equals("003")) { - connectionStatus |= 0x04; - } else if (command.equals("004")) { - connectionStatus |= 0x08; + } else if (connectionEstablishHandler.willHandle(reply)) { + connectionEstablishHandler.handleReply(reply); /* 005 originally was a bounce message, now used to transmit useful information about the server. */ } else if (command.equals("005")) { @@ -500,17 +498,13 @@ public class Connection extends AbstractExecutionThreadService implements Servic eventBus.post(new MotdReceived(this, motd.toString())); motd.setLength(0); + } else if (command.equalsIgnoreCase("KICK")) { + eventBus.post(new KickedFromChannel(this, parameters.get(0), reply.source().get(), parameters.get(1), getOptional(parameters, 2))); + /* okay, everything else. */ } else { eventBus.post(new UnknownReplyReceived(this, reply)); } - - if ((connectionStatus == 0x0f) && (connectionStatus != oldConnectionStatus)) { - /* connection succeeded! */ - established = true; - eventBus.post(new ConnectionEstablished(this)); - } - oldConnectionStatus = connectionStatus; } eventBus.post(new ConnectionClosed(this)); } catch (IOException ioe1) { @@ -520,7 +514,8 @@ public class Connection extends AbstractExecutionThreadService implements Servic logger.error("Runtime error", re1); eventBus.post(new ConnectionClosed(this, re1)); } finally { - established = false; + established.set(false); + eventBus.unregister(this); logger.info("Closing Connection."); try { Closeables.close(connectionHandler, true); @@ -531,6 +526,13 @@ public class Connection extends AbstractExecutionThreadService implements Servic } + @Subscribe + public void connectionEstablished(ConnectionEstablished connectionEstablished) { + if (connectionEstablished.connection() == this) { + established.set(true); + } + } + // // PRIVATE METHODS //