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); }
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); }
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); } }
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(); }
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(); }
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")); }
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"; }
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); } }
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"); } } } }
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); }
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")); } }
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")); } }
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(); }
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(); }
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; } }
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); } } } }
// 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); }
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); }
private void TL_updateUserTyping(TL.Object update) { userTyping(-1, update.getInt("user_id")); }
private void TL_updateUserPhoto(TL.Object update) { User user = User.getUser(update.getInt("user_id")); if (user != null) user.setPhoto(update.getObject("photo")); }
private void TL_messages_AffectedHistory(TL.Object obj) { setUpdate(-1, obj.getInt("pts"), obj.getInt("seq")); }
private void TL_updateUserStatus(TL.Object update) { User user = User.getUser(update.getInt("user_id")); if (user != null) user.setStatus(update.getObject("status")); }
private void TL_updateUserName(TL.Object update) { cb.onUserName( update.getInt("user_id"), update.getString("first_name"), update.getString("last_name")); }
private void TL_updateChatUserTyping(TL.Object update) { userTyping(update.getInt("chat_id"), update.getInt("user_id")); }
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); }
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")); } }
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)); }
private void TL_updateMessageID(TL.Object update) { Dialog.messageUpdateID(update.getLong("random_id"), update.getInt("id"), null); }
private void TL_updateNewMessage(TL.Object update) { cb.onMessage(update.getObject("message"), Dialog.MSG_INCOMING | Dialog.MSG_HISTORY); setUpdate(-1, update.getInt("pts"), -1); }
private void TL_updates_State(TL.Object obj) { setUpdate(obj.getInt("date"), obj.getInt("pts"), obj.getInt("seq")); // unread_count:int }