private void tickProcessor() throws Exception {
    this.lastMeasure = System.currentTimeMillis();
    while (!this.shutdown) {
      long start = System.currentTimeMillis();
      int max = 5000;
      while (max > 0 && this.receivePacket()) {
        --max;
      }
      while (this.receiveStream()) ;

      long time = System.currentTimeMillis() - start;
      if (time < 50) {
        try {
          Thread.sleep(50 - time);
        } catch (InterruptedException e) {
          // ignore
        }
      }
      this.tick();
    }
  }
 public void blockAddress(String address, int timeout) {
   long finalTime = System.currentTimeMillis() + timeout * 1000;
   if (!this.block.containsKey(address) || timeout == -1) {
     if (timeout == -1) {
       finalTime = Long.MAX_VALUE;
     } else {
       this.getLogger().notice("Blocked " + address + " for " + timeout + " seconds");
     }
     this.block.put(address, finalTime);
   } else if (this.block.get(address) < finalTime) {
     this.block.put(address, finalTime);
   }
 }
  private void tick() throws Exception {
    long time = System.currentTimeMillis();
    for (Session session : new ArrayList<>(this.sessions.values())) {
      session.update(time);
    }

    for (String address : this.ipSec.keySet()) {
      int count = this.ipSec.get(address);
      if (count >= this.packetLimit) {
        this.blockAddress(address);
      }
    }
    this.ipSec.clear();

    if ((this.ticks & 0b1111) == 0) {
      double diff = Math.max(50d, (double) time - this.lastMeasure);
      this.streamOption("bandwidth", this.sendBytes / diff + ";" + this.receiveBytes / diff);
      this.lastMeasure = time;
      this.sendBytes = 0;
      this.receiveBytes = 0;

      if (!this.block.isEmpty()) {
        long now = System.currentTimeMillis();
        for (String address : new ArrayList<>(this.block.keySet())) {
          long timeout = this.block.get(address);
          if (timeout <= now) {
            this.block.remove(address);
            this.getLogger().notice("Unblocked " + address);
          } else {
            break;
          }
        }
      }
    }

    ++this.ticks;
  }