diff --git a/constants.h b/constants.h index ac6b3da..cb396fa 100644 --- a/constants.h +++ b/constants.h @@ -76,7 +76,7 @@ #define CODE_user_foreign 0x5214c89d #define CODE_user_deleted 0xb29ad7cc #define CODE_user_profile_photo_empty 0x4f11bae1 -#define CODE_user_profile_photo 0x990d1493 +#define CODE_user_profile_photo 0xd559d8c8 #define CODE_user_status_empty 0x9d05049 #define CODE_user_status_online 0xedb93949 #define CODE_user_status_offline 0x8c703f @@ -126,11 +126,11 @@ #define CODE_input_notify_all 0xa429b886 #define CODE_input_peer_notify_events_empty 0xf03064d8 #define CODE_input_peer_notify_events_all 0xe86a2c74 -#define CODE_input_peer_notify_settings 0x3cf4b1be +#define CODE_input_peer_notify_settings 0x46a2ce98 #define CODE_peer_notify_events_empty 0xadd53cb3 #define CODE_peer_notify_events_all 0x6d1ded88 #define CODE_peer_notify_settings_empty 0x70a68512 -#define CODE_peer_notify_settings 0xddbcd4a5 +#define CODE_peer_notify_settings 0x8d5e11ee #define CODE_wall_paper 0xccb03657 #define CODE_user_full 0x771095da #define CODE_contact 0xf911c994 @@ -181,15 +181,15 @@ #define CODE_update_chat_participants 0x7761198 #define CODE_update_user_status 0x1bfbd823 #define CODE_update_user_name 0xda22d9ad -#define CODE_update_user_photo 0xbb8ba607 +#define CODE_update_user_photo 0x95313b0c #define CODE_update_contact_registered 0x2575bbb9 #define CODE_update_contact_link 0x51a48a9a #define CODE_update_activation 0x6f690963 #define CODE_update_new_authorization 0x8f06529a -#define CODE_updates_state 0xa0d9c0c +#define CODE_updates_state 0xa56c2a3e #define CODE_updates_difference_empty 0x5d75a138 -#define CODE_updates_difference 0x8adb0077 -#define CODE_updates_difference_slice 0xc5e839b4 +#define CODE_updates_difference 0xf49ca0 +#define CODE_updates_difference_slice 0xa8fb1981 #define CODE_updates_too_long 0xe317af7e #define CODE_update_short_message 0xd3f45784 #define CODE_update_short_chat_message 0x2b2fbd4e @@ -204,12 +204,60 @@ #define CODE_config 0x232d5905 #define CODE_nearest_dc 0x8e1a1775 #define CODE_help_invite_text 0x18cb9f78 +#define CODE_messages_stated_messages_links 0x3e74f5c6 +#define CODE_messages_stated_message_link 0xa9af2881 +#define CODE_messages_sent_message_link 0xe9db4a3f +#define CODE_input_geo_chat 0x74d456fa +#define CODE_input_notify_geo_chat_peer 0x4d8ddec8 +#define CODE_geo_chat 0x75eaea5a +#define CODE_geo_chat_message_empty 0x60311a9b +#define CODE_geo_chat_message 0x4505f8e1 +#define CODE_geo_chat_message_service 0xd34fa24e +#define CODE_geochats_stated_message 0x17b1578b +#define CODE_geochats_located 0x48feb267 +#define CODE_geochats_messages 0xd1526db1 +#define CODE_geochats_messages_slice 0xbc5863e8 +#define CODE_message_action_geo_chat_create 0x6f038ebc +#define CODE_message_action_geo_chat_checkin 0xc7d53de +#define CODE_update_new_geo_chat_message 0x5a68e3f7 +#define CODE_wall_paper_solid 0x63117f24 +#define CODE_update_new_encrypted_message 0x12bcbd9a +#define CODE_update_encrypted_chat_typing 0x1710f156 +#define CODE_update_encryption 0xb4a2e88d +#define CODE_update_encrypted_messages_read 0x38fe25b7 +#define CODE_encrypted_chat_empty 0xab7ec0a0 +#define CODE_encrypted_chat_waiting 0x3bf703dc +#define CODE_encrypted_chat_requested 0xfda9a7b7 +#define CODE_encrypted_chat 0x6601d14f +#define CODE_encrypted_chat_discarded 0x13d6dd27 +#define CODE_input_encrypted_chat 0xf141b5e1 +#define CODE_encrypted_file_empty 0xc21f497e +#define CODE_encrypted_file 0x4a70994c +#define CODE_input_encrypted_file_empty 0x1837c364 +#define CODE_input_encrypted_file_uploaded 0x64bd0306 +#define CODE_input_encrypted_file 0x5a17b5e5 +#define CODE_input_encrypted_file_location 0xf5235d55 +#define CODE_encrypted_message 0xed18c118 +#define CODE_encrypted_message_service 0x23734b06 +#define CODE_decrypted_message_layer 0x99a438cf +#define CODE_decrypted_message 0x1f814f1f +#define CODE_decrypted_message_service 0xaa48327d +#define CODE_decrypted_message_media_empty 0x89f5c4a +#define CODE_decrypted_message_media_photo 0x32798a8c +#define CODE_decrypted_message_media_video 0x4cee6ef3 +#define CODE_decrypted_message_media_geo_point 0x35480a59 +#define CODE_decrypted_message_media_contact 0x588a0a97 +#define CODE_decrypted_message_action_set_message_t_t_l 0xa1733aec +#define CODE_messages_dh_config_not_modified 0xc0e24635 +#define CODE_messages_dh_config 0x2c221edd +#define CODE_messages_sent_encrypted_message 0x560f8935 +#define CODE_messages_sent_encrypted_file 0x9493ff32 #define CODE_invoke_after_msg 0xcb9f372d #define CODE_invoke_after_msgs 0x3dc4b4f0 #define CODE_invoke_with_layer1 0x53835315 #define CODE_init_connection 0x3fc12e08 #define CODE_auth_check_phone 0x6fe51dfb -#define CODE_auth_send_code 0xd16ff372 +#define CODE_auth_send_code 0x768d5f4d #define CODE_auth_send_call 0x3c51564 #define CODE_auth_sign_up 0x1b067634 #define CODE_auth_sign_in 0xbcd51581 @@ -218,7 +266,7 @@ #define CODE_auth_send_invites 0x771c1d97 #define CODE_auth_export_authorization 0xe5bfffcd #define CODE_auth_import_authorization 0xe3ef9613 -#define CODE_account_register_device 0xa28557ac +#define CODE_account_register_device 0x446c712c #define CODE_account_unregister_device 0x65c55b40 #define CODE_account_update_notify_settings 0x84be5b93 #define CODE_account_get_notify_settings 0x12b3ad31 @@ -259,7 +307,7 @@ #define CODE_messages_delete_chat_user 0xc3c5cd23 #define CODE_messages_create_chat 0x419d9aee #define CODE_updates_get_state 0xedd4882a -#define CODE_updates_get_difference 0x5b36855a +#define CODE_updates_get_difference 0xa041495 #define CODE_photos_update_profile_photo 0xeef579a0 #define CODE_photos_upload_profile_photo 0xd50f9c88 #define CODE_upload_save_file_part 0xb304a621 @@ -268,4 +316,36 @@ #define CODE_help_get_nearest_dc 0x1fb33026 #define CODE_help_save_app_log 0x6f02f748 #define CODE_help_get_invite_text 0xa4a95186 +#define CODE_photos_get_user_photos 0xb7ee553c +#define CODE_invoke_with_layer2 0x289dd1f6 +#define CODE_messages_forward_message 0x3f3f4f2 +#define CODE_messages_send_broadcast 0x41bb0972 +#define CODE_invoke_with_layer3 0xb7475268 +#define CODE_geochats_get_located 0x7f192d8f +#define CODE_geochats_get_recents 0xe1427e6f +#define CODE_geochats_checkin 0x55b3e8fb +#define CODE_geochats_get_full_chat 0x6722dd6f +#define CODE_geochats_edit_chat_title 0x4c8e2273 +#define CODE_geochats_edit_chat_photo 0x35d81a95 +#define CODE_geochats_search 0xcfcdc44d +#define CODE_geochats_get_history 0xb53f7a68 +#define CODE_geochats_set_typing 0x8b8a729 +#define CODE_geochats_send_message 0x61b0044 +#define CODE_geochats_send_media 0xb8f0deff +#define CODE_geochats_create_geo_chat 0xe092e16 +#define CODE_invoke_with_layer4 0xdea0d430 +#define CODE_invoke_with_layer5 0x417a57ae +#define CODE_invoke_with_layer6 0x3a64d54d +#define CODE_invoke_with_layer7 0xa5be56d3 +#define CODE_messages_get_dh_config 0x26cf8950 +#define CODE_messages_request_encryption 0xf64daf43 +#define CODE_messages_accept_encryption 0x3dbc0415 +#define CODE_messages_discard_encryption 0xedd923c5 +#define CODE_messages_set_encrypted_typing 0x791451ed +#define CODE_messages_read_encrypted_history 0x7f4b690a +#define CODE_messages_send_encrypted 0xa9776773 +#define CODE_messages_send_encrypted_file 0x9a901b66 +#define CODE_messages_send_encrypted_service 0x32d439a4 +#define CODE_messages_received_queue 0x55a5bb66 +#define CODE_invoke_with_layer8 0xe9abd9fd #endif diff --git a/interface.c b/interface.c index 16ec86a..cdb5649 100644 --- a/interface.c +++ b/interface.c @@ -38,6 +38,7 @@ char *default_prompt = "> "; int unread_messages; +int msg_num_mode; char *get_default_prompt (void) { static char buf[100]; @@ -65,6 +66,7 @@ char *commands[] = { "send_text", "chat_info", "user_info", + "fwd", "show_license", 0 }; @@ -79,6 +81,7 @@ int commands_flags[] = { 0732, 0732, 074, + 071, 072, 07, }; @@ -321,6 +324,24 @@ void interpreter (char *line UU) { do_send_text (Peers[index], strndup (f, len)); } } + } else if (!memcmp (line, "fwd ", 4)) { + char *q = line + 4; + int len; + char *text = get_token (&q, &len); + int index = 0; + while (index < user_num + chat_num && (!Peers[index]->print_name || strncmp (Peers[index]->print_name, text, len))) { + index ++; + } + if (index < user_num + chat_num) { + int len = 0; + char *f = get_token (&q, &len); + if (f) { + int num = atoi (f); + if (num > 0) { + do_forward_message (Peers[index], num); + } + } + } } else if (!memcmp (line, "chat_info", 9)) { char *q = line + 10; int len; @@ -689,6 +710,9 @@ void print_message (struct message *M) { if (M->to_id >= 0) { if (M->out) { push_color (COLOR_GREEN); + if (msg_num_mode) { + printf ("%d ", M->id); + } print_date (M->date); pop_color (); printf (" "); @@ -701,6 +725,9 @@ void print_message (struct message *M) { } } else { push_color (COLOR_BLUE); + if (msg_num_mode) { + printf ("%d ", M->id); + } print_date (M->date); pop_color (); printf (" "); @@ -714,6 +741,9 @@ void print_message (struct message *M) { } } else { push_color (COLOR_MAGENTA); + if (msg_num_mode) { + printf ("%d ", M->id); + } print_date (M->date); pop_color (); printf (" "); diff --git a/main.c b/main.c index 1a2997d..d5431cd 100644 --- a/main.c +++ b/main.c @@ -52,6 +52,7 @@ char *default_username; int setup_mode; char *auth_token; +int msg_num_mode; void set_default_username (const char *s) { if (default_username) { @@ -203,7 +204,7 @@ extern int default_dc_num; void args_parse (int argc, char **argv) { int opt = 0; - while ((opt = getopt (argc, argv, "u:hk:vn:")) != -1) { + while ((opt = getopt (argc, argv, "u:hk:vn:N")) != -1) { switch (opt) { case 'u': set_default_username (optarg); @@ -217,6 +218,9 @@ void args_parse (int argc, char **argv) { case 'n': default_dc_num = atoi (optarg); break; + case 'N': + msg_num_mode ++; + break; case 'h': default: usage (); diff --git a/queries.c b/queries.c index a8bf1cc..073188e 100644 --- a/queries.c +++ b/queries.c @@ -879,6 +879,40 @@ void do_send_photo (int type, int to_id, char *file_name) { send_part (f); } +int fwd_msg_on_answer (struct query *q UU) { + assert (fetch_int () == (int)CODE_messages_stated_message); + struct message *M = fetch_alloc_message (); + assert (fetch_int () == CODE_vector); + int n, i; + n = fetch_int (); + for (i = 0; i < n; i++) { + fetch_alloc_chat (); + } + assert (fetch_int () == CODE_vector); + n = fetch_int (); + for (i = 0; i < n; i++) { + fetch_alloc_user (); + } + fetch_int (); // pts + fetch_int (); // seq + print_message (M); + return 0; +} + +struct query_methods fwd_msg_methods = { + .on_answer = fwd_msg_on_answer +}; + +void do_forward_message (union user_chat *U, int n) { + clear_packet (); + out_int (CODE_invoke_with_layer3); + out_int (CODE_messages_forward_message); + out_peer_id (U->id); + out_int (n); + out_long (lrand48 () * (1ll << 32) + lrand48 ()); + send_query (DC_working, packet_ptr - packet_buffer, packet_buffer, &fwd_msg_methods, 0); +} + int chat_info_on_answer (struct query *q UU) { struct chat *C = fetch_alloc_chat_full (); union user_chat *U = (void *)C; diff --git a/queries.h b/queries.h index 89e9160..191e4ac 100644 --- a/queries.h +++ b/queries.h @@ -75,5 +75,6 @@ void do_send_photo (int type, int to_id, char *file_name); void do_get_chat_info (union user_chat *chat); void do_get_user_list_info_silent (int num, int *list); void do_get_user_info (union user_chat *user); +void do_forward_message (union user_chat *U, int n); #endif diff --git a/structures.c b/structures.c index 4902307..52fdc25 100644 --- a/structures.c +++ b/structures.c @@ -157,16 +157,22 @@ void fetch_user (struct user *U) { } if (x == CODE_user_foreign) { U->flags |= FLAG_USER_FOREIGN; + U->phone = 0; } else { if (U->phone) { free (U->phone); } U->phone = fetch_str_dup (); } + //logprintf ("name = %s, surname = %s, phone = %s\n", U->first_name, U->last_name, U->phone); unsigned y = fetch_int (); + //fprintf (stderr, "y = 0x%08x\n", y); if (y == CODE_user_profile_photo_empty) { U->photo_small.dc = -2; U->photo_big.dc = -2; } else { - assert (y == CODE_user_profile_photo); + assert (y == CODE_user_profile_photo || y == 0x990d1493); + if (y == CODE_user_profile_photo) { + fetch_long (); + } fetch_file_location (&U->photo_small); fetch_file_location (&U->photo_big); }