private void connectImpl() throws IOException, ClientProtocolException, ConnectException {
    LOGGER.info("connecting to slack");
    lastPingSent = 0;
    lastPingAck = 0;
    HttpClient httpClient = getHttpClient();
    HttpGet request = new HttpGet(SLACK_HTTPS_AUTH_URL + authToken);
    HttpResponse response;
    response = httpClient.execute(request);
    LOGGER.debug(response.getStatusLine().toString());
    String jsonResponse =
        CharStreams.toString(new InputStreamReader(response.getEntity().getContent()));
    SlackJSONSessionStatusParser sessionParser = new SlackJSONSessionStatusParser(jsonResponse);
    try {
      sessionParser.parse();
    } catch (ParseException e1) {
      LOGGER.error(e1.toString());
    }
    if (sessionParser.getError() != null) {
      LOGGER.error("Error during authentication : " + sessionParser.getError());
      throw new ConnectException(sessionParser.getError());
    }
    users = sessionParser.getUsers();
    channels = sessionParser.getChannels();
    sessionPersona = sessionParser.getSessionPersona();
    LOGGER.info("Self " + sessionPersona.getId() + " : " + sessionPersona.getUserName());
    LOGGER.info(users.size() + " users found on this session");
    LOGGER.info(channels.size() + " channels found on this session");
    String wssurl = sessionParser.getWebSocketURL();

    LOGGER.debug("retrieved websocket URL : " + wssurl);
    ClientManager client = ClientManager.createClient();
    if (proxyAddress != null) {
      client
          .getProperties()
          .put(ClientProperties.PROXY_URI, "http://" + proxyAddress + ":" + proxyPort);
    }
    final MessageHandler handler = this;
    LOGGER.debug("initiating connection to websocket");
    try {
      websocketSession =
          client.connectToServer(
              new Endpoint() {
                @Override
                public void onOpen(Session session, EndpointConfig config) {
                  session.addMessageHandler(handler);
                }
              },
              URI.create(wssurl));
    } catch (DeploymentException e) {
      LOGGER.error(e.toString());
    }
    if (websocketSession != null) {
      SlackConnectedImpl slackConnectedImpl = new SlackConnectedImpl(sessionPersona);
      dispatcher.dispatch(slackConnectedImpl);
      LOGGER.debug("websocket connection established");
      LOGGER.info("slack session ready");
    }
  }
 @Override
 public void onMessage(String message) {
   LOGGER.debug("receiving from websocket " + message);
   if (message.contains("{\"type\":\"pong\",\"reply_to\"")) {
     int rightBracketIdx = message.indexOf('}');
     String toParse = message.substring(26, rightBracketIdx);
     lastPingAck = Integer.parseInt(toParse);
     LOGGER.debug("pong received " + lastPingAck);
   } else {
     JSONObject object = parseObject(message);
     SlackEvent slackEvent = SlackJSONMessageParser.decode(this, object);
     if (slackEvent instanceof SlackChannelCreated) {
       SlackChannelCreated slackChannelCreated = (SlackChannelCreated) slackEvent;
       channels.put(
           slackChannelCreated.getSlackChannel().getId(), slackChannelCreated.getSlackChannel());
     }
     if (slackEvent instanceof SlackGroupJoined) {
       SlackGroupJoined slackGroupJoined = (SlackGroupJoined) slackEvent;
       channels.put(
           slackGroupJoined.getSlackChannel().getId(), slackGroupJoined.getSlackChannel());
     }
     dispatcher.dispatch(slackEvent);
   }
 }