X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=src%2Fmain%2Fjava%2Fnet%2Fpterodactylus%2Firc%2Fconnection%2FConnectionEstablishHandler.java;fp=src%2Fmain%2Fjava%2Fnet%2Fpterodactylus%2Firc%2Fconnection%2FConnectionEstablishHandler.java;h=da608cad52413f7df589113d58550faa9afd4eea;hb=7b012b24d88c19e9986db78bf0ab92bf25dc3d47;hp=0000000000000000000000000000000000000000;hpb=0c1e22c6e67346725d5fd5a21617a96b60c50d61;p=xudocci.git diff --git a/src/main/java/net/pterodactylus/irc/connection/ConnectionEstablishHandler.java b/src/main/java/net/pterodactylus/irc/connection/ConnectionEstablishHandler.java new file mode 100644 index 0000000..da608ca --- /dev/null +++ b/src/main/java/net/pterodactylus/irc/connection/ConnectionEstablishHandler.java @@ -0,0 +1,70 @@ +package net.pterodactylus.irc.connection; + +import static java.util.Arrays.asList; + +import net.pterodactylus.irc.Connection; +import net.pterodactylus.irc.Reply; +import net.pterodactylus.irc.event.ConnectionEstablished; + +import com.google.common.eventbus.EventBus; + +/** + * Handles the necessary commands that establish a connection. + * + * @author David ‘Bombe’ Roden + */ +public class ConnectionEstablishHandler implements Handler { + + private static final int FIRST_COMMAND_RECEIVED = 0x01; + private static final int SECOND_COMMAND_RECEIVED = 0x02; + private static final int THIRD_COMMAND_RECEIVED = 0x04; + private static final int FOURTH_COMMAND_RECEIVED = 0x08; + private static final int ALL_COMMANDS_RECEIVED = 0x0f; + + private final EventBus eventBus; + private final Connection connection; + private int connectionStatus; + private int oldConnectionStatus; + + public ConnectionEstablishHandler(EventBus eventBus, + Connection connection) { + this.eventBus = eventBus; + this.connection = connection; + } + + @Override + public boolean willHandle(Reply reply) { + return asList("001", "002", "003", "004").contains(reply.command()); + } + + @Override + public void handleReply(Reply reply) { + String command = reply.command(); + /* replies 001-004 don’t hold information but they + * have to be sent on a successful connection. */ + if (command.equals("001")) { + connectionStatus |= FIRST_COMMAND_RECEIVED; + } else if (command.equals("002")) { + connectionStatus |= SECOND_COMMAND_RECEIVED; + } else if (command.equals("003")) { + connectionStatus |= THIRD_COMMAND_RECEIVED; + } else if (command.equals("004")) { + connectionStatus |= FOURTH_COMMAND_RECEIVED; + } + + if (hasConnectionStatusChanged() + && isFinalConnectionStatusReached()) { + eventBus.post(new ConnectionEstablished(connection)); + } + oldConnectionStatus = connectionStatus; + } + + private boolean hasConnectionStatusChanged() { + return connectionStatus != oldConnectionStatus; + } + + private boolean isFinalConnectionStatusReached() { + return connectionStatus == ALL_COMMANDS_RECEIVED; + } + +}