Пример #1
0
  private void TL_messages_StatedMessage(TL.Object obj) {
    setUpdate(-1, obj.getInt("pts"), obj.getInt("seq"));

    User.addUsers(obj.getVector("users"));
    TL.Object message = obj.getObject("message");
    Dialog d = Dialog.getDialog(message.getInt("from_id"), message.getObject("to_id"), true);
    Dialog.newMessage(message, Dialog.MSG_INCOMING);
  }
Пример #2
0
 private void TL_Server_DH_inner_data(TL.Object obj) {
   g = BigInteger.valueOf(obj.getInt("g"));
   dh_prime = new BigInteger(1, obj.getBytes("dh_prime"));
   g_a = new BigInteger(1, obj.getBytes("g_a"));
   time_delta =
       (int) ((long) obj.getInt("server_time") - (long) System.currentTimeMillis() / 1000L);
   last_message_id = 0;
   send_client_DH_inner_data(0);
 }
Пример #3
0
  private void TL_messages_StatedMessages(TL.Object obj) {
    setUpdate(-1, obj.getInt("pts"), obj.getInt("seq"));

    User.addUsers(obj.getVector("users"));
    TL.Vector messages = obj.getVector("messages");
    for (int i = 0; i < messages.count; i++) {
      TL.Object message = messages.getObject(i);
      Dialog d = Dialog.getDialog(message.getInt("from_id"), message.getObject("to_id"), true);
      Dialog.newMessage(message, Dialog.MSG_INCOMING);
    }
  }
Пример #4
0
 public void onConnect() {
   connected = true;
   Common.logInfo(
       "connected to dc["
           + dcState.getInt("id")
           + "] "
           + dcState.getString("ip")
           + ":"
           + dcState.getInt("port"));
   if (auth_key == null || auth_key.length == 0) {
     auth();
   } else onAuthorized();
 }
Пример #5
0
  public void onAuthorized() {
    dcState.set("auth_key", auth_key);
    dcState.set("server_salt", server_salt);

    long upd_delta = (long) Common.getUnixTime() - (long) dc_date;
    if (Main.mtp == this && upd_delta > 5 * 60) api_help_getConfig();

    if (!bind && this != Main.mtp) {
      final MTProto m = this;
      Common.logError("exportAuthorization");
      Main.mtp.api(
          new TL.OnResultRPC() {
            @Override
            public void onResultRPC(TL.Object result, Object param, boolean error) {
              if (!error) return;
              if (result.id != 0xdf969c2d) return; // auth.ExportedAuthorization
              Common.logError("importAuthorization");
              m.api(
                  null,
                  null,
                  "auth.importAuthorization",
                  result.getInt("id"),
                  result.getBytes("bytes"));
            }
          },
          null,
          "auth.exportAuthorization",
          dcState.getInt("id"));
      return;
    }

    if (bind) cb.onBind();
    send_queue();
  }
Пример #6
0
  private void TL_BadMsgNotification(TL.Object obj) {
    int error_code = obj.getInt("error_code");

    Message msg = TLMessage.get(obj.getLong("bad_msg_id"));
    Common.logError("bad_msg: " + error_code + " " + msg.obj.name + ":" + msg.obj.type);

    if (error_code == 16 || error_code == 17) {
      time_delta = (int) ((cur_message_id >> 32) - Common.getUnixTime());
      last_message_id = 0;
    }

    if (error_code == 32 || error_code == 33) {
      Common.logError("cur seq: " + cur_msg_seq);
      Common.logError("old seq: " + seqno);
      if (!bad_seq) {
        session = GEN_session_id();
        seqno = 0;
        send_ping();
        bad_seq = true;
      }

      // seqno = cur_msg_seq + (cur_msg_seq % 2) + 100;
      //	session = GEN_session_id();
      //	seqno = 0;
    }

    if (obj.id == 0xedab447b) { // bad_server_salt
      server_salt = obj.getLong("new_server_salt");
      dcState.set("server_salt", server_salt);
    }

    retry(obj.getLong("bad_msg_id"));
  }
Пример #7
0
  public String getStatus() {
    if (status != null) {
      if (status.id == 0xedb93949) { // userStatusOnline
        if (User.self == this) return Main.getResStr(R.string.status_online_user);
        return typing
            ? Main.getResStr(R.string.status_typing_user)
            : Main.getResStr(R.string.status_online_user);
      }

      if (status.id == 0x8c703f) { // userStatusOffline
        if (User.self == this) return Main.getResStr(R.string.status_offline_user);
        int date = status.getInt("was_online");
        int delta = Common.getUnixTime() - date;
        if (delta < 5 * 60) // < 5 min
        return Main.getResStr(R.string.status_offline1);
        if (delta < 60 * 60) // < 1 hour
        return String.format(Main.getResStr(R.string.status_offline2), delta / 60);
        if (delta < 2 * 60 * 60) // < 2 hours
        return Main.getResStr(R.string.status_offline3);
        if (delta < 24 * 60 * 60) // < 24 hours
        return String.format(Main.getResStr(R.string.status_offline4), delta / 60 / 60);
        return new SimpleDateFormat("dd MMM").format(date * 1000L);
      }
    }
    return "null";
  }
Пример #8
0
  private void TL_RpcError(TL.Object obj) {
    int code = obj.getInt("error_code");
    String msg = obj.getString("error_message");

    Common.logError(String.format("rpc_error: %s (%d)\n", msg, code));

    Message req_msg = TLMessage.get(req_msg_id);
    if (req_msg == null) return;
    Common.logError("message object: " + req_msg.obj.name + ":" + req_msg.obj.type);

    int idx = msg.indexOf("_MIGRATE_");
    if (idx > 0) {
      String type = msg.substring(0, idx);

      String num = msg.substring(idx + 9);
      if ((idx = num.indexOf(":")) > 0) num = num.substring(0, idx);
      int dc_id = Integer.parseInt(num);
      Common.logError("redirect to dc: " + dc_id);

      MTProto m = MTProto.getConnection(dc_id, cb, reuseFlag);
      cb.onRedirect(m);
      if (type.equals("PHONE") || type.equals("NETWORK") || type.equals("USER")) dc_this = dc_id;

      m.sendMessage(req_msg);
    }
  }
Пример #9
0
  private void update(TL.Object someUser) {
    if (someUser.id == 0x771095da) { // userFull
      object = someUser;
      blocked = object.getBool("blocked");
    } else object.set("user", someUser);

    TL.Object user = object.getObject("user");

    id = user.getInt("id");

    if (!user.name.equals("userEmpty")) {
      first_name = user.getString("first_name");
      last_name = user.getString("last_name");

      if (!user.name.equals("userDeleted")) {
        setPhoto(user.getObject("photo"));
        setStatus(user.getObject("status"));

        if (user.name.equals("userSelf")) User.self = this;
        else access_hash = user.getLong("access_hash");

        if (!user.name.equals("userForeign")) {
          if (user.name.equals("userContact")) contact = true;

          phone = user.getString("phone");
        }
      }
    }
  }
Пример #10
0
 private void TL_contacts_ImportedContacts(TL.Object obj) {
   User.addUsers(obj.getVector("users"));
   TL.Vector imported = obj.getVector("imported");
   for (int i = 0; i < imported.count; i++) {
     TL.Object c = imported.getObject(i);
     User.getUser(c.getInt("user_id")).client_id = c.getLong("client_id");
   }
   SyncUtils.updateContacts(Main.main);
 }
Пример #11
0
  private void TL_MessageContainer(TL.Object obj) {
    TL.Vector v = (TL.Vector) obj;

    int count = v.count;
    Common.logDebug("msg_count: " + count);
    for (int i = 0; i < v.count; i++) {
      TL.Object message = v.getObject(i);
      ack_message(message.getInt("seqno"), message.getLong("msg_id"));
      process(message.getObject("body"));
    }
  }
Пример #12
0
  private void TL_updates_Difference(TL.Object obj) {
    if (obj.name.equals("updates.differenceEmpty"))
      setUpdate(obj.getInt("date"), -1, obj.getInt("seq"));

    if (obj.name.equals("updates.difference") || obj.name.equals("updates.differenceSlice")) {

      TL.Vector other_updates = obj.getVector("other_updates");
      for (int i = 0; i < other_updates.count; i++)
        onUpdate(other_updates.getObject(i), obj.getVector("users"), obj.getVector("chats"));

      TL.Vector new_messages = obj.getVector("new_messages");
      for (int i = 0; i < new_messages.count; i++)
        Dialog.newMessage(new_messages.getObject(i), Dialog.MSG_HISTORY);

      //			if (new_messages.count > 0)
      //				Dialog.vibrate();

      if (obj.name.equals("updates.differenceSlice")) {
        TL_updates_State(obj.getObject("intermediate_state"));
        this.api_updates_getDifference();
      } else TL_updates_State(obj.getObject("state"));
    }
  }
Пример #13
0
  public void TL_messages_Dialogs(TL.Object obj) {
    User.addUsers(obj.getVector("users"));
    Chat.addChats(obj.getVector("chats"));

    // dialogs
    TL.Vector dialogs = obj.getVector("dialogs");
    for (int i = 0; i < dialogs.count; i++) {
      TL.Object dobj = dialogs.getObject(i);
      Dialog d = Dialog.getDialog(-1, dobj.getObject("peer"), true);
      d.updating = true;
    }

    // messages
    TL.Vector messages = obj.getVector("messages");
    for (int i = 0; i < messages.count; i++)
      cb.onMessage(messages.getObject(i), Dialog.MSG_HISTORY);

    for (int i = 0; i < dialogs.count; i++) {
      TL.Object dobj = dialogs.getObject(i);
      Dialog d = Dialog.getDialog(-1, dobj.getObject("peer"), true);
      if (dobj.getInt("top_message") == -7) // config_dialogs magic
      d.noHistory = true;
      d.unread_count = dobj.getInt("unread_count");
      d.updating = false;
      Main.main.updateDialog(d);
    }

    Common.logError("dialogs: " + Dialog.dialogs.size());

    // slice
    if (obj.name.equals("messages.dialogsSlice") && dialogs.count > 0) {
      int limit = obj.getInt("count") - Dialog.dialogs.size();
      if (limit > 0) api_messages_getDialogs(Dialog.dialogs.size(), 0, limit);
    }

    if (Main.main != null) Main.main.resetDialogs();
  }
Пример #14
0
  private void TL_Config(TL.Object obj) {
    dc_date = obj.getInt("date");
    MTProto.dc_this = obj.getInt("this_dc");
    dcState.set("id", dc_this);
    updateDcStates();

    TL.Vector dc_options = obj.getVector("dc_options");

    ArrayList<TL.Object> new_dcStates = new ArrayList<TL.Object>();

    for (int i = 0; i < dc_options.count; i++) {
      TL.Object dcObj = dc_options.getObject(i);
      int id = dcObj.getInt("id");

      TL.Object state =
          TL.newObject(
              "joim.dcState",
              id,
              dcObj.getString("ip_address"),
              dcObj.getInt("port"),
              new byte[0],
              false,
              GEN_session_id(),
              0L,
              0);

      for (int j = 0; j < MTProto.dcStates.size(); j++) {
        TL.Object item = MTProto.dcStates.get(j);
        if (id == item.getInt("id") && state.getString("ip").equals(item.getString("ip"))) {
          state.set("auth_key", item.getBytes("auth_key"));
          state.set("bind", item.getBool("bind"));
          state.set("session", item.getLong("session"));
          state.set("server_salt", item.getLong("server_salt"));
          state.set("seqno", item.getInt("seqno"));
          if (state.getInt("port") == item.getInt("port")) dcState = state;
          break;
        }
      }

      new_dcStates.add(state);
    }

    dcStates = new_dcStates;
    send_queue();
    cb.onReady();
  }
Пример #15
0
  public static User addUser(TL.Object user) {
    if (user == null) return null;

    int id = user.name.equals("userFull") ? user.getObject("user").getInt("id") : user.getInt("id");
    User old = users.get(id);

    if (old != null) {
      old.update(user);
      getFullInfo();
      return old;
    } else {
      User u = new User(user);
      users.put(id, u);
      getFullInfo();
      return u;
    }
  }
Пример #16
0
 public void updateDcStates() {
   dcState.set("auth_key", auth_key);
   dcState.set("bind", bind);
   dcState.set("server_salt", server_salt);
   if (reuseFlag == REUSE_MAIN) {
     dcState.set("session", session);
     dcState.set("seqno", seqno);
   }
   for (int i = 0; i < dcStates.size(); i++) {
     TL.Object state = dcStates.get(i);
     if (state.getInt("id") == dc_this) {
       state.set("auth_key", auth_key);
       state.set("bind", bind);
       state.set("server_salt", server_salt);
       if (reuseFlag == REUSE_MAIN) {
         state.set("session", session);
         state.set("seqno", seqno);
       }
     }
   }
 }
Пример #17
0
  // MTProto
  public MTProto(int dc_id, MTProtoListener callback, int reuseFlag) {
    this.reuseFlag = reuseFlag;
    cb = callback;
    for (int i = 0; i < dcStates.size(); i++)
      if (dcStates.get(i).getInt("id") == dc_id) {
        dcState = dcStates.get(i);
        // Common.hexStringToByteArray("23D03699CE2AB29BA2273084D95DA126EC3A1D55BE4C317615CE66609D5562BDC0EFDE5AE1F9185001C35781F622B31DF5294685559340DE7D5CC8D7F6F86AE049107D8E498EB2AC3D6FA735DF90648EEC34A6B7BE3A5075A455F5696DB39280BF68C1637E1580E1EBA3F0C12EF2C03B8E9B5ECCFD3E4885BF636863388E3EC9E9EF60C722FF9B45CD93FA5E8D0D277B45A6A9370860582A159187F2F352D418D195D8E9310B5559E170F51CB2056F6CB6DB586E9349192A1B7EAA50887C115A14F996F5A855E90E47635A81EA3048615F4FD91347D73335E5503179857D0D29132483271B28E6591172C3D94686BD96E91FDB7AD9591A526218B3DDFC7A2A09")
        setAuthKey(dcState.getBytes("auth_key"));
        bind = dcState.getBool("bind");
        seqno = dcState.getInt("seqno");
        session = dcState.getLong("session");
        server_salt = dcState.getLong("server_salt");
        Common.logError("session: " + session + " seqno: " + seqno);

        connected = false;
        Thread netThread = new Thread(transport = new TransportTCP(this, true));
        netThread.setPriority(Thread.MIN_PRIORITY);
        netThread.start();

        return;
      }
    Common.logError("dc not found: " + dc_id);
  }
Пример #18
0
 private void TL_messages_ChatFull(TL.Object obj) {
   User.addUsers(obj.getVector("users"));
   TL.Object full_chat = obj.getObject("full_chat");
   Chat chat = Chat.getChat(full_chat.getInt("id"));
   if (chat != null) chat.update(full_chat);
 }
Пример #19
0
 private void TL_updateUserTyping(TL.Object update) {
   userTyping(-1, update.getInt("user_id"));
 }
Пример #20
0
 private void TL_updateUserPhoto(TL.Object update) {
   User user = User.getUser(update.getInt("user_id"));
   if (user != null) user.setPhoto(update.getObject("photo"));
 }
Пример #21
0
 private void TL_messages_AffectedHistory(TL.Object obj) {
   setUpdate(-1, obj.getInt("pts"), obj.getInt("seq"));
 }
Пример #22
0
 private void TL_updateUserStatus(TL.Object update) {
   User user = User.getUser(update.getInt("user_id"));
   if (user != null) user.setStatus(update.getObject("status"));
 }
Пример #23
0
 private void TL_updateUserName(TL.Object update) {
   cb.onUserName(
       update.getInt("user_id"), update.getString("first_name"), update.getString("last_name"));
 }
Пример #24
0
 private void TL_updateChatUserTyping(TL.Object update) {
   userTyping(update.getInt("chat_id"), update.getInt("user_id"));
 }
Пример #25
0
 private void TL_updateChatParticipants(TL.Object update) {
   TL.Object p = update.getObject("participants");
   Chat chat = Chat.getChat(p.getInt("chat_id"));
   if (chat != null) chat.setParticipants(p);
 }
Пример #26
0
  private void TL_Updates(TL.Object obj) {
    if (obj.name.equals("updatesTooLong")) api_updates_getDifference();

    boolean chat = obj.name.equals("updateShortChatMessage");
    if (obj.name.equals("updateShortMessage") || chat) {
      cb.onMessage(
          Dialog.Message.newObject(
              obj.getInt("id"),
              obj.getInt("from_id"),
              chat ? obj.getInt("chat_id") : -1,
              obj.getInt("from_id"),
              obj.getInt("date"),
              obj.getString("message"),
              null),
          Dialog.MSG_INCOMING | Dialog.MSG_HISTORY);
      setUpdate(obj.getInt("date"), obj.getInt("pts"), obj.getInt("seq"));
    }

    if (obj.name.equals("updateShort")) {
      onUpdate(obj.getObject("update"), null, null);
      setUpdate(obj.getInt("date"), -1, -1);
    }

    if (obj.name.equals("updatesCombined") || obj.name.equals("updates")) {
      TL.Vector updates = obj.getVector("updates");
      for (int i = 0; i < updates.count; i++)
        onUpdate(updates.getObject(i), obj.getVector("users"), obj.getVector("chats"));
      setUpdate(obj.getInt("date"), -1, obj.getInt("seq"));
    }
  }
Пример #27
0
 private void TL_updateRestoreMessages(TL.Object update) {
   setUpdate(-1, update.getInt("pts"), -1);
   TL.Vector messages = update.getVector("messages");
   for (int i = 0; i < messages.count; i++) Dialog.messageRestore(messages.getInt(i));
 }
Пример #28
0
 private void TL_updateMessageID(TL.Object update) {
   Dialog.messageUpdateID(update.getLong("random_id"), update.getInt("id"), null);
 }
Пример #29
0
 private void TL_updateNewMessage(TL.Object update) {
   cb.onMessage(update.getObject("message"), Dialog.MSG_INCOMING | Dialog.MSG_HISTORY);
   setUpdate(-1, update.getInt("pts"), -1);
 }
Пример #30
0
 private void TL_updates_State(TL.Object obj) {
   setUpdate(obj.getInt("date"), obj.getInt("pts"), obj.getInt("seq"));
   // unread_count:int
 }