Examples of BNetInputStream


Examples of net.bnubot.util.BNetInputStream

    productID = cs.product;

    // Set up BNCS
    connect.updateProgress("Connecting to Battle.net");
    socket = makeSocket(getServer(), getPort());
    bncsInputStream = new BNetInputStream(socket.getInputStream());
    bncsOutputStream = new DataOutputStream(socket.getOutputStream());
    // Socket timeout will cause SocketTimeoutException to be thrown from read()
    socket.setSoTimeout(1000);

    // Game
View Full Code Here

Examples of net.bnubot.util.BNetInputStream

        if(socket.isClosed()) break;
        // What is this?
        throw e;
      }

      BNetInputStream is = pr.getData();
      switch (pr.packetId) {
      case SID_OPTIONALWORK:
      case SID_EXTRAWORK:
      case SID_REQUIREDWORK:
        break;

      case SID_NULL: {
        BNCSPacket p = new BNCSPacket(this, BNCSPacketId.SID_NULL);
        p.sendPacket(bncsOutputStream);
        break;
      }

      case SID_PING: {
        BNCSPacket p = new BNCSPacket(this, BNCSPacketId.SID_PING);
        p.writeDWord(is.readDWord());
        p.sendPacket(bncsOutputStream);
        break;
      }

      case SID_AUTH_INFO:
      case SID_STARTVERSIONING: {
        if (pr.packetId == BNCSPacketId.SID_AUTH_INFO) {
          nlsRevision = is.readDWord();
          serverToken = is.readDWord();
          is.skip(4); // int udpValue = is.readDWord();
        }
        long mpqFileTime = is.readQWord();
        String mpqFileName = is.readNTString();
        byte[] valueStr = is.readNTBytes();

        Out.debug(getClass(), "MPQ: " + mpqFileName);

        byte extraData[] = null;
        if (is.available() == 0x80) {
          extraData = new byte[0x80];
          is.read(extraData, 0, 0x80);
        }
        assert (is.available() == 0);

        // Hash the CD key
        byte keyHash[] = null;
        byte keyHash2[] = null;
        if (nlsRevision != null) {
          keyHash = HashMain.hashKey(clientToken, serverToken, cs.cdkey).getBuffer();
          if((productID == ProductIDs.D2XP)
          || (productID == ProductIDs.W3XP))
            keyHash2 = HashMain.hashKey(clientToken, serverToken, cs.cdkey2).getBuffer();

          warden = null;
          warden_seed = new byte[4];
          System.arraycopy(keyHash, 16, warden_seed, 0, 4);
        }

        Task task = createTask("BNLS_VERSIONCHECKEX2", "...");
        VersionCheckResult vcr = BNLSManager.sendVersionCheckEx2(task, productID, mpqFileTime, mpqFileName, valueStr);
        completeTask(task);

        if(vcr == null) {
          dispatchRecieveError("CheckRevision failed.");
          disconnect(ConnectionState.LONG_PAUSE_BEFORE_CONNECT);
          break;
        }

        // Respond
        if (nlsRevision != null) {
          connect.updateProgress("CheckRevision/CD Key challenge");

          BNCSPacket p = new BNCSPacket(this, BNCSPacketId.SID_AUTH_CHECK);
          p.writeDWord(clientToken);
          p.writeDWord(vcr.exeVersion);
          p.writeDWord(vcr.exeHash);
          if (keyHash2 == null)
            p.writeDWord(1); // Number of keys
          else
            p.writeDWord(2); // Number of keys
          p.writeDWord(0); // Spawn?

          // For each key..
          if (keyHash.length != 36)
            throw new Exception("Invalid keyHash length");
          p.write(keyHash);
          if (keyHash2 != null) {
            if (keyHash2.length != 36)
              throw new Exception("Invalid keyHash2 length");
            p.write(keyHash2);
          }

          // Finally,
          p.writeNTString(vcr.exeInfo);
          p.writeNTString(cs.username);
          p.sendPacket(bncsOutputStream);
        } else {
          connect.updateProgress("CheckRevision");

          /*
           * (DWORD) Platform ID (DWORD) Product ID (DWORD)
           * Version Byte (DWORD) EXE Version (DWORD) EXE Hash
           * (STRING) EXE Information
           */
          BNCSPacket p = new BNCSPacket(
              this, BNCSPacketId.SID_REPORTVERSION);
          p.writeDWord(PlatformIDs.PLATFORM_IX86);
          p.writeDWord(productID.getDword());
          p.writeDWord(verByte);
          p.writeDWord(vcr.exeVersion);
          p.writeDWord(vcr.exeHash);
          p.writeNTString(vcr.exeInfo);
          p.sendPacket(bncsOutputStream);
        }
        break;
      }

      case SID_REPORTVERSION:
      case SID_AUTH_CHECK: {
        int result = is.readDWord();
        String extraInfo = is.readNTString();
        assert (is.available() == 0);

        if (pr.packetId == BNCSPacketId.SID_AUTH_CHECK) {
          if (result != 0) {
            switch (result) {
            case 0x0100:
              dispatchRecieveError("Update required: " + extraInfo);
              BNFTPConnection.downloadFile(extraInfo);
              break;
            case 0x0101:
              dispatchRecieveError("Invalid version.");
              break;
            case 0x102:
              dispatchRecieveError("Game version must be downgraded: "
                  + extraInfo);
              break;
            case 0x200:
              dispatchRecieveError("Invalid CD key.");
              break;
            case 0x201:
              dispatchRecieveError("CD key in use by " + extraInfo);
              break;
            case 0x202:
              dispatchRecieveError("Banned key.");
              break;
            case 0x203:
              dispatchRecieveError("Wrong product for CD key.");
              break;
            case 0x210:
              dispatchRecieveError("Invalid second CD key.");
              break;
            case 0x211:
              dispatchRecieveError("Second CD key in use by "
                  + extraInfo);
              break;
            case 0x212:
              dispatchRecieveError("Banned second key.");
              break;
            case 0x213:
              dispatchRecieveError("Wrong product for second CD key.");
              break;
            default:
              dispatchRecieveError("Unknown SID_AUTH_CHECK result 0x"
                  + Integer.toHexString(result));
              break;
            }
            disconnect(ConnectionState.LONG_PAUSE_BEFORE_CONNECT);
            break;
          }
          dispatchRecieveInfo("Passed CD key challenge and CheckRevision.");
        } else {
          if (result != 2) {
            switch (result) {
            case 0:
              dispatchRecieveError("Failed version check.");
              break;
            case 1:
              dispatchRecieveError("Old game version.");
              break;
            case 3:
              dispatchRecieveError("Reinstall required.");
              break;

            default:
              dispatchRecieveError("Unknown SID_REPORTVERSION result 0x"
                  + Integer.toHexString(result));
              break;
            }
            disconnect(ConnectionState.LONG_PAUSE_BEFORE_CONNECT);
            break;
          }
          dispatchRecieveInfo("Passed CheckRevision.");
        }

        connect.updateProgress("Logging in");
        sendKeyOrPassword();
        break;
      }

      case SID_CDKEY:
      case SID_CDKEY2: {
        /*
         * (DWORD) Result (STRING) Key owner
         *
         * 0x01: Ok 0x02: Invalid key 0x03: Bad product 0x04: Banned
         * 0x05: In use
         */
        int result = is.readDWord();
        String keyOwner = is.readNTString();

        if (result != 1) {
          switch (result) {
          case 0x02:
            dispatchRecieveError("Invalid CD key.");
            break;
          case 0x03:
            dispatchRecieveError("Bad CD key product.");
            break;
          case 0x04:
            dispatchRecieveError("CD key banned.");
            break;
          case 0x05:
            dispatchRecieveError("CD key in use by " + keyOwner);
            break;
          default:
            dispatchRecieveError("Unknown SID_CDKEY response 0x"
                + Integer.toHexString(result));
            break;
          }
          disconnect(ConnectionState.LONG_PAUSE_BEFORE_CONNECT);
          break;
        }

        dispatchRecieveInfo("CD key accepted.");
        connect.updateProgress("Logging in");
        sendPassword();
        break;
      }

      case SID_AUTH_ACCOUNTLOGON: {
        /*
         * (DWORD) Status (BYTE[32]) Salt (socket) (BYTE[32]) Server
         * Key (B)
         *
         * 0x00: Logon accepted, requires proof. 0x01: Account
         * doesn't exist. 0x05: Account requires upgrade. Other:
         * Unknown (failure).
         */
        int status = is.readDWord();
        switch (status) {
        case 0x00:
          dispatchRecieveInfo("Login accepted; requires proof.");
          connect.updateProgress("Login accepted; proving");
          break;
        case 0x01:
          dispatchRecieveError("Account doesn't exist; creating...");
          connect.updateProgress("Creating account");

          if (srp == null) {
            dispatchRecieveError("SRP is not initialized!");
            disconnect(ConnectionState.LONG_PAUSE_BEFORE_CONNECT);
            break;
          }

          byte[] salt = new byte[32];
          new Random().nextBytes(salt);
          byte[] verifier = srp.get_v(salt).toByteArray();

          if (salt.length != 32)
            throw new Exception("Salt length wasn't 32!");
          if (verifier.length != 32)
            throw new Exception("Verifier length wasn't 32!");

          BNCSPacket p = new BNCSPacket(
              this, BNCSPacketId.SID_AUTH_ACCOUNTCREATE);
          p.write(salt);
          p.write(verifier);
          p.writeNTString(cs.username);
          p.sendPacket(bncsOutputStream);

          break;
        case 0x05:
          dispatchRecieveError("Account requires upgrade");
          disconnect(ConnectionState.LONG_PAUSE_BEFORE_CONNECT);
          break;
        default:
          dispatchRecieveError("Unknown SID_AUTH_ACCOUNTLOGON status 0x"
              + Integer.toHexString(status));
          disconnect(ConnectionState.LONG_PAUSE_BEFORE_CONNECT);
          break;
        }

        if (status != 0)
          break;

        if (srp == null) {
          dispatchRecieveError("SRP is not initialized!");
          disconnect(ConnectionState.LONG_PAUSE_BEFORE_CONNECT);
          break;
        }

        byte s[] = new byte[32];
        byte B[] = new byte[32];
        is.read(s, 0, 32);
        is.read(B, 0, 32);

        byte M1[] = srp.getM1(s, B);
        proof_M2 = srp.getM2(s, B);
        if (M1.length != 20)
          throw new Exception("Invalid M1 length");

        BNCSPacket p = new BNCSPacket(
            this, BNCSPacketId.SID_AUTH_ACCOUNTLOGONPROOF);
        p.write(M1);
        p.sendPacket(bncsOutputStream);
        break;
      }

      case SID_AUTH_ACCOUNTCREATE: {
        /*
         * (DWORD) Status 0x00: Successfully created account name.
         * 0x04: Name already exists. 0x07: Name is too short/blank.
         * 0x08: Name contains an illegal character. 0x09: Name
         * contains an illegal word. 0x0a: Name contains too few
         * alphanumeric characters. 0x0b: Name contains adjacent
         * punctuation characters. 0x0c: Name contains too many
         * punctuation characters. Any other: Name already exists.
         */
        int status = is.readDWord();
        switch (status) {
        case 0x00:
          dispatchRecieveInfo("Account created; logging in.");
          connect.updateProgress("Logging in");
          sendKeyOrPassword();
          break;
        default:
          dispatchRecieveError("Create account failed with error code 0x"
              + Integer.toHexString(status));
          break;
        }
        break;
      }

      case SID_AUTH_ACCOUNTLOGONPROOF: {
        /*
         * (DWORD) Status (BYTE[20]) Server Password Proof (M2)
         * (STRING) Additional information
         *
         * Status: 0x00: Logon successful. 0x02: Incorrect password.
         * 0x0E: An email address should be registered for this
         * account. 0x0F: Custom error. A string at the end of this
         * message contains the error.
         */
        int status = is.readDWord();
        byte server_M2[] = new byte[20];
        is.read(server_M2, 0, 20);
        String additionalInfo = null;
        if (is.available() != 0)
          additionalInfo = is.readNTStringUTF8();

        switch (status) {
        case 0x00:
          break;
        case 0x02:
          dispatchRecieveError("Incorrect password.");
          disconnect(ConnectionState.LONG_PAUSE_BEFORE_CONNECT);
          break;
        case 0x0E:
          dispatchRecieveError("An email address should be registered for this account.");
          connect.updateProgress("Registering email address");
          sendSetEmail();
          break;
        case 0x0F:
          dispatchRecieveError("Custom bnet error: " + additionalInfo);
          disconnect(ConnectionState.LONG_PAUSE_BEFORE_CONNECT);
          break;
        default:
          dispatchRecieveError("Unknown SID_AUTH_ACCOUNTLOGONPROOF status: 0x"
              + Integer.toHexString(status));
          disconnect(ConnectionState.LONG_PAUSE_BEFORE_CONNECT);
          break;
        }
        if (!isConnected())
          break;

        for (int i = 0; i < 20; i++) {
          if (server_M2[i] != proof_M2[i])
            throw new Exception(
                "Server couldn't prove password");
        }

        dispatchRecieveInfo("Login successful; entering chat.");
        connect.updateProgress("Entering chat");
        sendEnterChat();
        break;
      }

      case SID_LOGONRESPONSE2: {
        int result = is.readDWord();
        switch (result) {
        case 0x00: // Success
          dispatchRecieveInfo("Login successful; entering chat.");
          connect.updateProgress("Entering chat");
          sendEnterChat();
          sendGetChannelList();
          sendJoinChannel(cs.channel);
          break;
        case 0x01: // Account doesn't exist
          dispatchRecieveInfo("Account doesn't exist; creating...");
          connect.updateProgress("Creating account");

          int[] passwordHash = BrokenSHA1
              .calcHashBuffer(cs.password.toLowerCase()
                  .getBytes());

          BNCSPacket p = new BNCSPacket(
              this, BNCSPacketId.SID_CREATEACCOUNT2);
          p.writeDWord(passwordHash[0]);
          p.writeDWord(passwordHash[1]);
          p.writeDWord(passwordHash[2]);
          p.writeDWord(passwordHash[3]);
          p.writeDWord(passwordHash[4]);
          p.writeNTString(cs.username);
          p.sendPacket(bncsOutputStream);
          break;
        case 0x02: // Invalid password;
          dispatchRecieveError("Incorrect password.");
          disconnect(ConnectionState.LONG_PAUSE_BEFORE_CONNECT);
          break;
        case 0x06: // Account is closed
          dispatchRecieveError("Your account is closed.");
          disconnect(ConnectionState.LONG_PAUSE_BEFORE_CONNECT);
          break;
        default:
          dispatchRecieveError("Unknown SID_LOGONRESPONSE2 result 0x"
              + Integer.toHexString(result));
          disconnect(ConnectionState.LONG_PAUSE_BEFORE_CONNECT);
          break;
        }
        break;
      }

      case SID_CLIENTID: {
        // Sends new registration values; no longer used
        break;
      }

      case SID_LOGONCHALLENGE: {
        serverToken = is.readDWord();
        break;
      }

      case SID_LOGONCHALLENGEEX: {
        /* int udpToken = */is.readDWord();
        serverToken = is.readDWord();
        break;
      }

      case SID_CREATEACCOUNT2: {
        int status = is.readDWord();
        /* String suggestion = */is.readNTString();

        switch (status) {
        case 0x00:
          dispatchRecieveInfo("Account created");
          connect.updateProgress("Logging in");
          sendKeyOrPassword();
          break;
        case 0x02:
          dispatchRecieveError("Name contained invalid characters");
          disconnect(ConnectionState.LONG_PAUSE_BEFORE_CONNECT);
          break;
        case 0x03:
          dispatchRecieveError("Name contained a banned word");
          disconnect(ConnectionState.LONG_PAUSE_BEFORE_CONNECT);
          break;
        case 0x04:
          dispatchRecieveError("Account already exists");
          disconnect(ConnectionState.LONG_PAUSE_BEFORE_CONNECT);
          break;
        case 0x06:
          dispatchRecieveError("Name did not contain enough alphanumeric characters");
          disconnect(ConnectionState.LONG_PAUSE_BEFORE_CONNECT);
          break;
        default:
          dispatchRecieveError("Unknown SID_CREATEACCOUNT2 status 0x"
              + Integer.toHexString(status));
          disconnect(ConnectionState.LONG_PAUSE_BEFORE_CONNECT);
          break;
        }
        break;
      }

      case SID_SETEMAIL: {
        dispatchRecieveError("An email address should be registered for this account.");
        connect.updateProgress("Registering email address");
        sendSetEmail();
        break;
      }

      case SID_ENTERCHAT: {
        String uniqueUserName = is.readNTString();
        StatString myStatString = new StatString(is.readNTString());
        /* String accountName = */is.readNTString();

        myUser = new BNetUser(this, uniqueUserName, cs.myRealm);
        myUser.setStatString(myStatString);
        dispatchEnterChat(myUser);
        dispatchTitleChanged();
View Full Code Here

Examples of net.bnubot.util.BNetInputStream

      Out.debugAlways(getClass(), msg);
    }
  }

  public BNetInputStream getData() {
    return new BNetInputStream(new ByteArrayInputStream(data));
  }
View Full Code Here

Examples of net.bnubot.util.BNetInputStream

      loginPacket.writeNTString("bnu2");
      loginPacket.sendPacket(bnlsOutputStream);
    }

    // Recieve BNLS_AUTHORIZE
    BNetInputStream is = readPacket(BNLSPacketId.BNLS_AUTHORIZE);
    int serverCode = is.readDWord();

    // Calculate checksum
    int checksum = (int) (org.jbls.BNLSProtocol.BNLSlist.BNLSChecksum(
        "bot", serverCode) & 0xFFFFFFFF);

    // Send BNLS_AUTHORIZEPROOF
    try (BNLSPacket loginPacket = new BNLSPacket(BNLSPacketId.BNLS_AUTHORIZEPROOF)) {
      loginPacket.writeDWord(checksum);
      loginPacket.sendPacket(bnlsOutputStream);
    }

    // Recieve BNLS_AUTHORIZEPROOF
    is = readPacket(BNLSPacketId.BNLS_AUTHORIZEPROOF);
    int statusCode = is.readDWord();
    if (statusCode != 0)
      Out.error(getClass(), "Login to BNLS failed; logged in anonymously");
  }
View Full Code Here

Examples of net.bnubot.util.BNetInputStream

      vbPacket.writeDWord(product.getBnls());
      vbPacket.sendPacket(bnlsOutputStream);
      vbPacket.close();
    }

    BNetInputStream vbInputStream = readPacket(BNLSPacketId.BNLS_REQUESTVERSIONBYTE);
    int vbProduct = vbInputStream.readDWord();
    if (vbProduct == 0)
      throw new IOException("BNLS_REQUESTVERSIONBYTE failed.");
    if(vbProduct != product.getBnls())
      throw new IOException("BNLS_REQUESTVERSIONBYTE returned the wrong product [0x" + Integer.toHexString(vbProduct) + "]");
    return vbInputStream.readWord();
  }
View Full Code Here

Examples of net.bnubot.util.BNetInputStream

    int port = getPort();
    InetAddress address = MirrorSelector.getClosestMirror(getServer(), port);
    dispatchRecieveInfo("Connecting to " + address + ":" + port + ".");
    socket = new Socket(address, port);
    socket.setKeepAlive(true);
    bnInputStream = new BNetInputStream(socket.getInputStream());
    bnOutputStream = new DataOutputStream(socket.getOutputStream());

    // Connected
    connect.updateProgress("Connected");
  }
View Full Code Here

Examples of net.bnubot.util.BNetInputStream

    boolean loggedon = false;

    while(isConnected() && !socket.isClosed() && !disposed) {
      if(bnInputStream.available() > 0) {
        BotNetPacketReader pr = new BotNetPacketReader(bnInputStream);
        BNetInputStream is = pr.getData();

        eventHandlers.clear();
        eventHandlers.addAll(master.getEventHandlers());

        switch(pr.packetId) {
        case PACKET_BOTNETVERSION: {
          serverRevision = is.readDWord();
          Out.debug(getClass(), "BotNet server version is " + serverRevision);
          sendBotNetVersion(1, 1);
          break;
        }
        case PACKET_LOGON: {
          int result = is.readDWord();
          switch(result) {
          case 0:
            dispatchRecieveError("Logon failed!");
            disconnect(ConnectionState.LONG_PAUSE_BEFORE_CONNECT);
            return false;
          case 1:
            dispatchRecieveInfo("Logon success!");
            loggedon = true;
            if(communicationRevision != 0)
              return true;
            break;
          default:
            dispatchRecieveError("Unknown PACKET_LOGON result 0x" + Integer.toHexString(result));
            disconnect(ConnectionState.LONG_PAUSE_BEFORE_CONNECT);
            return false;
          }
          break;
        }
        case PACKET_CHANGEDBPASSWORD: {
          // Server is acknowledging the communication version
          communicationRevision = is.readDWord();
          Out.debug(getClass(), "BotNet communication version is " + communicationRevision);
          if(loggedon)
            return true;
          break;
        }
View Full Code Here

Examples of net.bnubot.util.BNetInputStream

      task.complete();

      BNLSPacketReader bpr = new BNLSPacketReader(bnlsInputStream);
      if(bpr.packetId != BNLSPacketId.BNLS_VERSIONCHECKEX2)
        throw new IOException("Recieved the wrong packet (" + bpr.packetId.name() + ", but expected BNLS_VERSIONCHECKEX2)");
      BNetInputStream bnlsIn = bpr.getInputStream();
      int success = bnlsIn.readDWord();
      if (success != 1) {
        Out.error(getClass(), "BNLS_VERSIONCHECKEX2 Failed\n"
            + HexDump.hexDump(bpr.getData()));
        setBNLSConnected(false);
        return null;
      }

      VersionCheckResult vcr = new VersionCheckResult();
      vcr.exeVersion = bnlsIn.readDWord();
      vcr.exeHash = bnlsIn.readDWord();
      vcr.exeInfo = bnlsIn.readNTBytes();
      bnlsIn.readDWord(); // cookie
      bnlsIn.readDWord(); // verbyte
      assert (bnlsIn.available() == 0);

      Out.info(getClass(), "Recieved version check from BNLS.");

      if((vcr.exeVersion == 0)
      || (vcr.exeHash == 0)
View Full Code Here

Examples of net.bnubot.util.BNetInputStream

    sendUserInfo();

    while(isConnected() && !socket.isClosed() && !disposed) {
      if(bnInputStream.available() > 0) {
        BotNetPacketReader pr = new BotNetPacketReader(bnInputStream);
        BNetInputStream is = pr.getData();

        eventHandlers.clear();
        eventHandlers.addAll(master.getEventHandlers());

        switch(pr.packetId) {
        case PACKET_IDLE: {
          sendIdle();
          break;
        }
        case PACKET_STATSUPDATE: {
          int result = is.readDWord();
          switch(result) {
          case 0:
            dispatchRecieveError("Status update failed");
            break;
          case 1:
            // Success
            break;
          default:
            dispatchRecieveError("Unknown PACKET_LOGON result 0x" + Integer.toHexString(result));
            disconnect(ConnectionState.LONG_PAUSE_BEFORE_CONNECT);
            return;
          }
          break;
        }
        case PACKET_ACCOUNT: {
          int command = is.readDWord();
          int result = is.readDWord();
          switch(result) {
          case 0:
            switch(command) {
            case 0:
              dispatchRecieveError("Account logon failed");
              break;
            case 1:
              dispatchRecieveError("Password change failed");
              break;
            case 2:
              dispatchRecieveError("Account create failed");
              break;
            default:
              dispatchRecieveError("Unknown PACKET_ACCOUNT command 0x" + Integer.toHexString(command));
              break;
            }
            dispatchRecieveError("Status update failed");
            break;
          case 1:
            // Success
            break;
          default:
            dispatchRecieveError("Unknown PACKET_ACCOUNT result 0x" + Integer.toHexString(result));
            disconnect(ConnectionState.LONG_PAUSE_BEFORE_CONNECT);
            return;
          }
          break;
        }
        case PACKET_USERINFO: {
          if(pr.data.length == 0) {
            userInit = false;
            break;
          }

          int number = is.readDWord();
          int dbflag = 0, ztff = 0;
          if(serverRevision >= 4) {
            dbflag = is.readDWord();
            ztff = is.readDWord();
          }
          String name = is.readNTString();

          BotNetUser user = new BotNetUser(this, number, name);
          user.dbflag = dbflag;
          user.ztff = ztff;

          user.channel = is.readNTString();
          user.server = is.readDWord();
          if(serverRevision >= 2)
            user.account = is.readNTString();
          if(serverRevision >= 3)
            user.database = is.readNTString();

          if(myUser == null)
            myUser = user;

          if(userInit)
            dispatchBotnetUserOnline(user);
          else
            dispatchBotnetUserStatus(user);
          //recieveInfo(user.toStringEx());
          break;
        }
        case PACKET_USERLOGGINGOFF: {
          int number = is.readDWord();
          dispatchBotnetUserLogoff(number);
          break;
        }
        case PACKET_BOTNETCHAT: {
          int command = is.readDWord();
          int action = is.readDWord();
          BotNetUser user = users.get(is.readDWord());
          ByteArray data = new ByteArray(is.readNTBytes());

          switch(command) {
          case 0: //broadcast
            // TODO: change this to recieveBroadcast()
            dispatchRecieveChat(user, data);
            break;
          case 1: // chat
            if(action == 0)
              dispatchRecieveChat(user, data);
            else
              dispatchRecieveEmote(user, data.toString());
            break;
          case 2: //whisper
            dispatchWhisperRecieved(user, data.toString());
            break;
          default:
            dispatchRecieveError("Unknown PACKET_BOTNETCHAT command 0x" + Integer.toHexString(command));
            disconnect(ConnectionState.LONG_PAUSE_BEFORE_CONNECT);
            break;
          }
          break;
        }

        case PACKET_COMMAND: {
          // PROTOCOL VIOLATION!
          int err = is.readDWord();
          byte id = is.readByte();
          int lenOffending = is.readWord();
          int lenUnprocessed = is.readWord();
          dispatchRecieveError("Protocol violation: err=" + err + ", packet=" + BotNetPacketId.values()[id].name() + ", offending packet len=" + lenOffending + ", unprocessed data len=" + lenUnprocessed);
          disconnect(ConnectionState.LONG_PAUSE_BEFORE_CONNECT);
          break;
        }
        default:
View Full Code Here

Examples of net.bnubot.util.BNetInputStream

      Out.fatalException(e);
    }
  }

  private static BNetIcon[] readIconsDotBni(File f) {
    try (BNetInputStream is = new BNetInputStream(new FileInputStream(f))) {
      Out.debug(IconsDotBniReader.class, "Reading " + f.getName());

      is.skip(4); //int headerSize = is.readDWord();
      int bniVersion = is.readWord();
      is.skip(2)// Alignment Padding (unused)
      int numIcons = is.readDWord();
      is.skip(4)//int dataOffset = is.readDWord();

      if(bniVersion != 1)
        throw new Exception("Unknown BNI version");

      Out.debug(IconsDotBniReader.class, "Reading " + numIcons + " icons in format " + bniVersion);

      BNetIcon[] icons = new BNetIcon[numIcons];

      for(int i = 0; i < numIcons; i++) {
        BNetIcon icon = new BNetIcon();
        icon.flags = is.readDWord();
        icon.xSize = is.readDWord();
        icon.ySize = is.readDWord();
        if(icon.flags != 0)
          icon.sortIndex = i;
        else
          icon.sortIndex = numIcons;
        int numProducts;
        int products[] = new int[32];

        //Read in up to 32 products; stop if we see a null
        for(numProducts = 0; numProducts < 32; numProducts++) {
          products[numProducts] = is.readDWord();
          if(products[numProducts] == 0)
            break;
        }

        if(numProducts > 0) {
          icon.products = new int[numProducts];
          for(int j = 0; j < numProducts; j++)
            icon.products[j] = products[j];
        } else
          icon.products = null;
        icons[i] = icon;
        Out.debug(IconsDotBniReader.class, icon.toString());
      }

      //Image in targa format
      byte infoLength = is.readByte();
      is.skip(1);              // ColorMapType
      byte imageType = is.readByte();    // run-length true-color image types = 0x0A
      is.skip(5);              // ColorMapSpecification - color map data
      is.skip(2)//int xOrigin = is.readWord();
      is.skip(2)//int yOrigin = is.readWord();
      int width = is.readWord();
      int height = is.readWord();
      byte depth = is.readByte();      // 24 bit depth is good
      /*byte descriptor =*/ is.readByte()// bits 5 and 4 (00110000) specify the corner to start coloring pixels - 00=bl, 01=br, 10=tl, 11=tr
      is.skip(infoLength)//String info = is.readFixedLengthString(infoLength);

      if(imageType != 0x0A)
        throw new Exception("Unknown image type");
      if(depth != 24)
        throw new Exception("Unknown depth");

      //Pixel data
      int[] pixelData = new int[width*height];
      int currentPixel = 0;

      while(currentPixel < pixelData.length) {
        byte packetHeader = is.readByte()// if bit 7 (0x80) is set, run-length packet;
        int len = (packetHeader & 0x7F) + 1;
        if((packetHeader & 0x80) != 0) {
          //Run-length packet
          int blue = is.readByte() & 0xFF;
          int green = is.readByte() & 0xFF;
          int red = is.readByte() & 0xFF;
          int col = new Color(red, green, blue).getRGB();
          for(int i = 0; i < len; i++)
            pixelData[getRealPixelPosition(currentPixel++, height, width)] = col;
        } else {
          for(int i = 0; i < len; i++) {
            int blue = is.readByte() & 0xFF;
            int green = is.readByte() & 0xFF;
            int red = is.readByte() & 0xFF;
            int col = new Color(red, green, blue).getRGB();
            pixelData[getRealPixelPosition(currentPixel++, height, width)] = col;
          }
        }
      }
View Full Code Here
TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.