public void handle(MessageEvent message, Session client) {
    final Short header = message.getId();

    if (Comet.isDebugging) {
      log.debug(message.toString());
    }

    if (!Comet.isRunning) return;

    if (this.getMessages().containsKey(header)) {
      try {
        final Event event = this.getMessages().get(header);

        if (event != null) {
          if (this.asyncEventExecution) {
            this.eventExecutor.submit(new MessageEventTask(event, client, message));
          } else {
            final long start = System.currentTimeMillis();
            log.debug(
                "Started packet process for packet: ["
                    + event.getClass().getSimpleName()
                    + "]["
                    + header
                    + "]");

            event.handle(client, message);

            long timeTakenSinceCreation = ((System.currentTimeMillis() - start));

            // If the packet took more than 100ms to be handled, red flag!
            if (timeTakenSinceCreation >= 100) {
              if (client.getPlayer() != null && client.getPlayer().getData() != null)
                log.trace(
                    "["
                        + event.getClass().getSimpleName()
                        + "]["
                        + message.getId()
                        + "]["
                        + client.getPlayer().getId()
                        + "]["
                        + client.getPlayer().getData().getUsername()
                        + "] Packet took "
                        + timeTakenSinceCreation
                        + "ms to execute");
              else
                log.trace(
                    "["
                        + event.getClass().getSimpleName()
                        + "]["
                        + message.getId()
                        + "] Packet took "
                        + timeTakenSinceCreation
                        + "ms to execute");
            }

            log.debug(
                "Finished packet process for packet: ["
                    + event.getClass().getSimpleName()
                    + "]["
                    + header
                    + "] in "
                    + ((System.currentTimeMillis() - start))
                    + "ms");
          }
        }
      } catch (Exception e) {
        if (client.getLogger() != null)
          client
              .getLogger()
              .error(
                  "Error while handling event: "
                      + this.getMessages().get(header).getClass().getSimpleName(),
                  e);
        else
          log.error(
              "Error while handling event: "
                  + this.getMessages().get(header).getClass().getSimpleName(),
              e);
      }
    } else if (Comet.isDebugging) {
      log.debug("Unhandled message: " + Events.valueOfId(header) + " / " + header);
    }
  }