diff --git a/Makefile.in b/Makefile.in index 7c95736..72ece7c 100644 --- a/Makefile.in +++ b/Makefile.in @@ -62,7 +62,7 @@ ${EXE}/generate: ${GENERATE_OBJECTS} ${COMMON_OBJECTS} ${AUTO}/scheme.tlo: ${AUTO}/scheme.tl ${EXE}/tlc ${EXE}/tlc -e $@ ${AUTO}/scheme.tl -${AUTO}/scheme.tl: ${srcdir}/scheme.tl ${srcdir}/binlog.tl +${AUTO}/scheme.tl: ${srcdir}/scheme.tl ${srcdir}/binlog.tl ${srcdir}/append.tl cat $^ > $@ ${AUTO}/scheme2.tl: ${AUTO}/scheme.tl ${EXE}/tlc diff --git a/append.tl b/append.tl new file mode 100644 index 0000000..0b5711b --- /dev/null +++ b/append.tl @@ -0,0 +1,2 @@ +decryptedMessageMediaVideoL12#4cee6ef3 thumb:bytes thumb_w:int thumb_h:int duration:int w:int h:int size:int key:bytes iv:bytes = DecryptedMessageMedia; +decryptedMessageMediaAudioL12#6080758f duration:int size:int key:bytes iv:bytes = DecryptedMessageMedia; diff --git a/binlog.c b/binlog.c index 56c8fbc..543831f 100644 --- a/binlog.c +++ b/binlog.c @@ -159,7 +159,7 @@ int fetch_comb_binlog_set_pts (void *extra) { int fetch_comb_binlog_set_qts (void *extra) { int new_qts = fetch_int (); - assert (new_qts >= qts); + //assert (new_qts >= qts); qts = new_qts; return 0; } @@ -468,8 +468,8 @@ int fetch_comb_binlog_encr_chat_accepted (void *extra) { U->nonce = talloc (256); } - fetch_ints (U->g_key, 256); - fetch_ints (U->nonce, 256); + fetch_ints (U->g_key, 64); + fetch_ints (U->nonce, 64); U->key_fingerprint = fetch_long (); if (U->state == sc_waiting) { @@ -509,6 +509,7 @@ int fetch_comb_binlog_encr_chat_init (void *extra) { P->print_name = create_print_name (P->id, "!", Us->user.first_name, Us->user.last_name, 0); peer_insert_name (P); + P->encr_chat.g_key = talloc (256); fetch_ints (P->encr_chat.key, 64); fetch_ints (P->encr_chat.g_key, 64); P->flags |= FLAG_CREATED; @@ -810,6 +811,43 @@ int fetch_comb_binlog_send_message_text (void *extra) { return 0; } +int fetch_comb_binlog_send_message_action_encr (void *extra) { + long long id = fetch_long (); + + struct message *M = message_get (id); + if (!M) { + M = talloc0 (sizeof (*M)); + M->id = id; + message_insert_tree (M); + messages_allocated ++; + } else { + assert (!(M->flags & FLAG_CREATED)); + } + + M->flags |= FLAG_CREATED | FLAG_ENCRYPTED; + M->from_id = MK_USER (fetch_int ()); + + int t = fetch_int (); + M->to_id = set_peer_id (t, fetch_int ()); + M->date = fetch_int (); + + M->media.type = CODE_decrypted_message_media_empty; + fetch_message_action_encrypted ((void *)user_chat_get (M->to_id), &M->action); + + M->unread = 1; + M->out = get_peer_id (M->from_id) == our_id; + M->service = 1; + + message_insert (M); + message_insert_unsent (M); + M->flags |= FLAG_PENDING; + + #ifdef USE_LUA + lua_new_msg (M); + #endif + return 0; +} + int fetch_comb_binlog_create_message_text_fwd (void *extra) { long long id = fetch_int (); @@ -894,7 +932,7 @@ int fetch_comb_binlog_create_message_media (void *extra) { } int fetch_comb_binlog_create_message_media_encr (void *extra) { - int id = fetch_int (); + long long id = fetch_long (); struct message *M = message_get (id); if (!M) { M = talloc0 (sizeof (*M)); @@ -995,7 +1033,7 @@ int fetch_comb_binlog_create_message_service (void *extra) { } int fetch_comb_binlog_create_message_service_encr (void *extra) { - int id = fetch_int (); + long long id = fetch_long (); struct message *M = message_get (id); if (!M) { M = talloc0 (sizeof (*M)); @@ -1008,10 +1046,14 @@ int fetch_comb_binlog_create_message_service_encr (void *extra) { M->flags |= FLAG_CREATED | FLAG_ENCRYPTED; M->from_id = MK_USER (fetch_int ()); int t = fetch_int (); + assert (t == PEER_ENCR_CHAT); M->to_id = set_peer_id (t, fetch_int ()); M->date = fetch_int (); + + struct secret_chat *E = (void *)user_chat_get (M->to_id); + assert (E); - fetch_message_action_encrypted (&M->action); + fetch_message_action_encrypted (0, &M->action); M->unread = 1; M->out = get_peer_id (M->from_id) == our_id; M->service = 1; @@ -1187,6 +1229,7 @@ void replay_log_event (void) { FETCH_COMBINATOR_FUNCTION (binlog_create_message_text) FETCH_COMBINATOR_FUNCTION (binlog_send_message_text) + FETCH_COMBINATOR_FUNCTION (binlog_send_message_action_encr) FETCH_COMBINATOR_FUNCTION (binlog_create_message_text_fwd) FETCH_COMBINATOR_FUNCTION (binlog_create_message_media) FETCH_COMBINATOR_FUNCTION (binlog_create_message_media_encr) @@ -1775,6 +1818,18 @@ void bl_do_send_message_text (long long msg_id, int from_id, int to_type, int to add_log_event (packet_buffer, 4 * (packet_ptr - packet_buffer)); } +void bl_do_send_message_action_encr (long long msg_id, int from_id, int to_type, int to_id, int date, int l, const int *action) { + clear_packet (); + out_int (CODE_binlog_send_message_action_encr); + out_long (msg_id); + out_int (from_id); + out_int (to_type); + out_int (to_id); + out_int (date); + out_ints (action, l); + add_log_event (packet_buffer, 4 * (packet_ptr - packet_buffer)); +} + void bl_do_create_message_text_fwd (int msg_id, int from_id, int to_type, int to_id, int date, int fwd, int fwd_date, int l, const char *s) { clear_packet (); out_int (CODE_binlog_create_message_text_fwd); @@ -1842,6 +1897,7 @@ void bl_do_create_message_service (int msg_id, int from_id, int to_type, int to_ out_ints (data, len); add_log_event (packet_buffer, 4 * (packet_ptr - packet_buffer)); } + void bl_do_create_message_service_encr (long long msg_id, int from_id, int to_type, int to_id, int date, const int *data, int len) { clear_packet (); out_int (CODE_binlog_create_message_service_encr); diff --git a/binlog.h b/binlog.h index b2f14c0..44b3873 100644 --- a/binlog.h +++ b/binlog.h @@ -81,6 +81,7 @@ void bl_do_create_message_media_fwd (int msg_id, int from_id, int to_type, int t void bl_do_create_message_media_encr (long long msg_id, int from_id, int to_type, int to_id, int date, int l, const char *s, const int *data, int len, const int *data2, int len2); void bl_do_create_message_service_encr (long long msg_id, int from_id, int to_type, int to_id, int date, const int *data, int len); void bl_do_send_message_text (long long msg_id, int from_id, int to_type, int to_id, int date, int l, const char *s); +void bl_do_send_message_action_encr (long long msg_id, int from_id, int to_type, int to_id, int date, int l, const int *s); void bl_do_set_unread (struct message *M, int unread); void bl_do_set_message_sent (struct message *M); void bl_do_set_msg_id (struct message *M, int id); diff --git a/binlog.tl b/binlog.tl index 5232aac..74290ae 100644 --- a/binlog.tl +++ b/binlog.tl @@ -52,12 +52,13 @@ binlog.chatDelParticipant id:int version:int user:int = binlog.Update; binlog.createMessageText id:int from_id:int to_type:int to_id:int date:int text:string = binlog.Update; binlog.sendMessageText id:long from_id:int to_type:int to_id:int date:int text:string = binlog.Update; +binlog.sendMessageActionEncr id:long from_id:int to_type:int to_id:int date:int action:DecryptedMessageAction = binlog.Update; binlog.createMessageTextFwd id:int from_id:int to_type:int to_id:int date:int fwd_from_id:int fwd_date:int text:string = binlog.Update; binlog.createMessageMedia id:int from_id:int to_type:int to_id:int date:int text:string media:MessageMedia = binlog.Update; -binlog.createMessageMediaEncr id:int from_id:int to_type:int to_id:int date:int text:string media:DecryptedMessageMedia file:EncryptedFile = binlog.Update; +binlog.createMessageMediaEncr id:long from_id:int to_type:int to_id:int date:int text:string media:DecryptedMessageMedia file:EncryptedFile = binlog.Update; binlog.createMessageMediaFwd id:int from_id:int to_type:int to_id:int date:int fwd_from_id:int fwd_date:int text:string media:MessageMedia = binlog.Update; binlog.createMessageService id:int from_id:int to_type:int to_id:int date:int action:MessageAction = binlog.Update; -binlog.createMessageServiceEncr id:int from_id:int to_type:int to_id:int date:int action:DecryptedMessageAction = binlog.Update; +binlog.createMessageServiceEncr id:long from_id:int to_type:int to_id:int date:int action:DecryptedMessageAction = binlog.Update; binlog.createMessageServiceFwd id:int from_id:int to_type:int to_id:int date:int fwd_from_id:int fwd_date:int action:MessageAction = binlog.Update; binlog.messageSetUnread id:int = binlog.Update; binlog.setMessageSent id:long = binlog.Update; diff --git a/interface.c b/interface.c index 2be2268..9aed2ab 100644 --- a/interface.c +++ b/interface.c @@ -77,6 +77,20 @@ int is_same_word (const char *s, size_t l, const char *word) { return s && word && strlen (word) == l && !memcmp (s, word, l); } +char *end_string_token (int *l) { + while (*line_ptr == ' ') { line_ptr ++; } + if (!*line_ptr) { + *l = 0; + return 0; + } + char *s = line_ptr; + while (*line_ptr) { line_ptr ++; } + while (*line_ptr == ' ' || !*line_ptr) { line_ptr --; } + line_ptr ++; + + *l = line_ptr - s; + return s; +} char *next_token (int *l) { while (*line_ptr == ' ') { line_ptr ++; } if (!*line_ptr) { @@ -683,7 +697,7 @@ void interpreter (char *line UU) { } else if (IS_WORD ("send_photo")) { GET_PEER; int t; - char *s = next_token (&t); + char *s = end_string_token (&t); if (!s) { printf ("Empty file name\n"); RET; @@ -692,7 +706,7 @@ void interpreter (char *line UU) { } else if (IS_WORD("send_video")) { GET_PEER; int t; - char *s = next_token (&t); + char *s = end_string_token (&t); if (!s) { printf ("Empty file name\n"); RET; @@ -969,7 +983,7 @@ void interpreter (char *line UU) { } else if (IS_WORD("send_audio")) { GET_PEER; int t; - char *s = next_token (&t); + char *s = end_string_token (&t); if (!s) { printf ("Empty file name\n"); RET; @@ -978,7 +992,7 @@ void interpreter (char *line UU) { } else if (IS_WORD("send_document")) { GET_PEER; int t; - char *s = next_token (&t); + char *s = end_string_token (&t); if (!s) { printf ("Empty file name\n"); RET; @@ -1236,10 +1250,18 @@ void print_media (struct message_media *M) { } return; case CODE_message_media_video: - printf ("[video]"); + if (M->video.mime_type) { + printf ("[video: type %s]", M->video.mime_type); + } else { + printf ("[video]"); + } return; case CODE_message_media_audio: - printf ("[audio]"); + if (M->audio.mime_type) { + printf ("[audio: type %s]", M->audio.mime_type); + } else { + printf ("[audio]"); + } return; case CODE_message_media_document: if (M->document.mime_type && M->document.caption) { @@ -1252,9 +1274,11 @@ void print_media (struct message_media *M) { printf ("[photo]"); return; case CODE_decrypted_message_media_video: + case CODE_decrypted_message_media_video_l12: printf ("[video]"); return; case CODE_decrypted_message_media_audio: + case CODE_decrypted_message_media_audio_l12: printf ("[audio]"); return; case CODE_decrypted_message_media_document: @@ -1427,6 +1451,21 @@ void print_service_message (struct message *M) { case CODE_decrypted_message_action_set_message_t_t_l: printf (" set ttl to %d seconds. Unsupported yet\n", M->action.ttl); break; + case CODE_decrypted_message_action_read_messages: + printf (" %d messages marked read\n", M->action.read_cnt); + break; + case CODE_decrypted_message_action_delete_messages: + printf (" %d messages deleted\n", M->action.delete_cnt); + break; + case CODE_decrypted_message_action_screenshot_messages: + printf (" %d messages screenshoted\n", M->action.screenshot_cnt); + break; + case CODE_decrypted_message_action_flush_history: + printf (" cleared history\n"); + break; + case CODE_decrypted_message_action_notify_layer: + printf (" updated layer to %d\n", M->action.layer); + break; default: assert (0); } diff --git a/mtproto-client.c b/mtproto-client.c index acdd990..2aebe5a 100644 --- a/mtproto-client.c +++ b/mtproto-client.c @@ -1281,6 +1281,9 @@ void work_update (struct connection *c UU, long long msg_id UU) { if (E->state == sc_request && !disable_auto_accept) { do_accept_encr_chat_request (E); } + if (E->state == sc_ok) { + do_send_encr_chat_layer (E); + } fetch_int (); // date } break; @@ -1395,6 +1398,22 @@ void work_update (struct connection *c UU, long long msg_id UU) { } } break; + case CODE_update_user_blocked: + { + int id = fetch_int (); + int blocked = fetch_bool (); + peer_t *P = user_chat_get (MK_USER (id)); + if (P && (P->flags & FLAG_CREATED)) { + bl_do_user_set_blocked (&P->user, blocked); + } + } + break; + case CODE_update_notify_settings: + { + assert (skip_type_any (TYPE_TO_PARAM (notify_peer)) >= 0); + assert (skip_type_any (TYPE_TO_PARAM (peer_notify_settings)) >= 0); + } + break; default: logprintf ("Unknown update type %08x\n", op); ; diff --git a/queries.c b/queries.c index 30fb598..1c05c40 100644 --- a/queries.c +++ b/queries.c @@ -320,7 +320,7 @@ void out_random (int n) { int allow_send_linux_version; void do_insert_header (void) { - out_int (CODE_invoke_with_layer12); + out_int (CODE_invoke_with_layer15); out_int (CODE_init_connection); out_int (TG_APP_ID); if (allow_send_linux_version) { @@ -840,6 +840,20 @@ void encr_finish (struct secret_chat *E) { } /* }}} */ +void do_send_encr_chat_layer (struct secret_chat *E) { + long long t; + secure_random (&t, 8); + int action[2]; + action[0] = CODE_decrypted_message_action_notify_layer; + action[1] = 15; + bl_do_send_message_action_encr (t, our_id, get_peer_type (E->id), get_peer_id (E->id), time (0), 2, action); + + struct message *M = message_get (t); + assert (M); + do_send_msg (M); + print_message (M); +} + /* {{{ Seng msg (plain text) */ int msg_send_encr_on_answer (struct query *q UU) { assert (fetch_int () == CODE_messages_sent_encrypted_message); @@ -925,7 +939,41 @@ struct query_methods msg_send_encr_methods = { int out_message_num; int our_id; +void do_send_encr_msg_action (struct message *M) { + peer_t *P = user_chat_get (M->to_id); + if (!P || P->encr_chat.state != sc_ok) { return; } + + clear_packet (); + out_int (CODE_messages_send_encrypted_service); + out_int (CODE_input_encrypted_chat); + out_int (get_peer_id (M->to_id)); + out_long (P->encr_chat.access_hash); + out_long (M->id); + encr_start (); + out_int (CODE_decrypted_message_service); + out_long (M->id); + static int buf[4]; + secure_random (buf, 16); + out_cstring ((void *)buf, 16); + + switch (M->action.type) { + case CODE_decrypted_message_action_notify_layer: + out_int (M->action.type); + out_int (M->action.layer); + break; + default: + assert (0); + } + encr_finish (&P->encr_chat); + + send_query (DC_working, packet_ptr - packet_buffer, packet_buffer, &msg_send_encr_methods, M); +} + void do_send_encr_msg (struct message *M) { + if (M->service) { + do_send_encr_msg_action (M); + return; + } peer_t *P = user_chat_get (M->to_id); if (!P || P->encr_chat.state != sc_ok) { return; } @@ -1167,7 +1215,7 @@ int get_dialogs_on_answer (struct query *q UU) { static peer_id_t plist[100]; int dl_size = n; for (i = 0; i < n; i++) { - assert (fetch_int () == CODE_dialog); + assert (fetch_int () == (int)CODE_dialog); if (i < 100) { plist[i] = fetch_peer_id (); dlist[2 * i + 0] = fetch_int (); @@ -1177,6 +1225,7 @@ int get_dialogs_on_answer (struct query *q UU) { fetch_int (); fetch_int (); } + assert (skip_type_any (TYPE_TO_PARAM (peer_notify_settings)) >= 0); } assert (fetch_int () == CODE_vector); n = fetch_int (); @@ -1419,6 +1468,7 @@ void send_part (struct send_file *f) { out_int (100); out_int (100); out_int (100); + out_string ("video"); } if (f->media_type == CODE_input_media_uploaded_document || f->media_type == CODE_input_media_uploaded_thumb_document) { out_string (s + 1); @@ -1426,6 +1476,7 @@ void send_part (struct send_file *f) { } if (f->media_type == CODE_input_media_uploaded_audio) { out_int (60); + out_string ("audio"); } out_long (-lrand48 () * (1ll << 32) - lrand48 ()); @@ -1468,6 +1519,7 @@ void send_part (struct send_file *f) { } if (f->media_type == CODE_input_media_uploaded_video) { out_int (0); + out_string ("video"); } if (f->media_type == CODE_input_media_uploaded_document) { out_string (f->file_name); @@ -1475,6 +1527,7 @@ void send_part (struct send_file *f) { } if (f->media_type == CODE_input_media_uploaded_audio) { out_int (60); + out_string ("audio"); } if (f->media_type == CODE_input_media_uploaded_video || f->media_type == CODE_input_media_uploaded_photo) { out_int (100); @@ -1584,7 +1637,7 @@ void do_send_photo (int type, peer_id_t to_id, char *file_name) { f->key = talloc (32); secure_random (f->key, 32); } - if (f->media_type == CODE_input_media_uploaded_video && !f->encr) { + /*if (f->media_type == CODE_input_media_uploaded_video && !f->encr) { f->media_type = CODE_input_media_uploaded_thumb_video; send_file_thumb (f); } else if (f->media_type == CODE_input_media_uploaded_document && !f->encr) { @@ -1592,7 +1645,8 @@ void do_send_photo (int type, peer_id_t to_id, char *file_name) { send_file_thumb (f); } else { send_part (f); - } + }*/ + send_part (f); } /* }}} */ @@ -2161,6 +2215,12 @@ int add_contact_on_answer (struct query *q UU) { } assert (fetch_int () == CODE_vector); n = fetch_int (); + for (i = 0; i < n; i++) { + long long id = fetch_long (); + logprintf ("contact #%lld not added. Please retry\n", id); + } + assert (fetch_int () == CODE_vector); + n = fetch_int (); for (i = 0; i < n ; i++) { struct user *U = fetch_alloc_user (); print_start (); diff --git a/queries.h b/queries.h index 92bcd39..84a9546 100644 --- a/queries.h +++ b/queries.h @@ -117,6 +117,7 @@ void do_contacts_search (int limit, const char *s); void do_send_msg (struct message *M); void do_delete_msg (long long id); void do_restore_msg (long long id); +void do_send_encr_chat_layer (struct secret_chat *E); // For binlog diff --git a/scheme.tl b/scheme.tl index f8c2524..37fb757 120000 --- a/scheme.tl +++ b/scheme.tl @@ -1 +1 @@ -scheme12.tl \ No newline at end of file +scheme15.tl \ No newline at end of file diff --git a/structures.c b/structures.c index 0bd75f2..8713710 100644 --- a/structures.c +++ b/structures.c @@ -557,6 +557,7 @@ void fetch_video (struct video *V) { V->date = fetch_int (); V->caption = fetch_str_dup (); V->duration = fetch_int (); + V->mime_type = fetch_str_dup (); V->size = fetch_int (); fetch_photo_size (&V->thumb); V->dc_id = fetch_int (); @@ -573,6 +574,7 @@ void fetch_audio (struct audio *V) { V->user_id = fetch_int (); V->date = fetch_int (); V->duration = fetch_int (); + V->mime_type = fetch_str_dup (); V->size = fetch_int (); V->dc_id = fetch_int (); } @@ -770,12 +772,16 @@ void fetch_message_media_encrypted (struct message_media *M) { } break; case CODE_decrypted_message_media_video: - M->type = x; + case CODE_decrypted_message_media_video_l12: + M->type = CODE_decrypted_message_media_video; l = prefetch_strlen (); fetch_str (l); // thumb fetch_int (); // thumb_w fetch_int (); // thumb_h M->encr_video.duration = fetch_int (); + if (x == CODE_decrypted_message_media_video) { + M->encr_video.mime_type = fetch_str_dup (); + } M->encr_video.w = fetch_int (); M->encr_video.h = fetch_int (); M->encr_video.size = fetch_int (); @@ -799,8 +805,12 @@ void fetch_message_media_encrypted (struct message_media *M) { } break; case CODE_decrypted_message_media_audio: - M->type = x; + case CODE_decrypted_message_media_audio_l12: + M->type = CODE_decrypted_message_media_audio; M->encr_audio.duration = fetch_int (); + if (x == CODE_decrypted_message_media_audio) { + M->encr_audio.mime_type = fetch_str_dup (); + } M->encr_audio.size = fetch_int (); l = prefetch_strlen (); @@ -881,13 +891,60 @@ void fetch_message_media_encrypted (struct message_media *M) { } } -void fetch_message_action_encrypted (struct message_action *M) { +void fetch_message_action_encrypted (struct secret_chat *E, struct message_action *M) { unsigned x = fetch_int (); switch (x) { case CODE_decrypted_message_action_set_message_t_t_l: M->type = x; M->ttl = fetch_int (); break; + case CODE_decrypted_message_action_read_messages: + M->type = x; + { + assert (fetch_int () == CODE_vector); + int n = fetch_int (); + M->read_cnt = n; + while (n -- > 0) { + long long id = fetch_long (); + struct message *N = message_get (id); + if (N) { + N->unread = 0; + } + } + } + break; + case CODE_decrypted_message_action_delete_messages: + M->type = x; + { + assert (fetch_int () == CODE_vector); + int n = fetch_int (); + M->delete_cnt = n; + while (n -- > 0) { + fetch_long (); + } + } + break; + case CODE_decrypted_message_action_screenshot_messages: + M->type = x; + { + assert (fetch_int () == CODE_vector); + int n = fetch_int (); + M->screenshot_cnt = n; + while (n -- > 0) { + fetch_long (); + } + } + break; + case CODE_decrypted_message_action_notify_layer: + M->type = x; + M->layer = fetch_int (); + //if (M->from_id != our_id) { + // E->layer = M->layer; + //} + break; + case CODE_decrypted_message_action_flush_history: + M->type = x; + break; default: logprintf ("x = 0x%08x\n", x); assert (0); @@ -1106,6 +1163,10 @@ void fetch_encrypted_message (struct message *M) { } in_ptr = save_in_ptr; in_end = save_in_end; + } else { + if (P && new) { + assert (0); + } } if (sx == CODE_encrypted_message) { @@ -1114,14 +1175,11 @@ void fetch_encrypted_message (struct message *M) { assert (skip_type_any (TYPE_TO_PARAM (encrypted_file)) >= 0); if (x == CODE_decrypted_message) { bl_do_create_message_media_encr (id, P->encr_chat.user_id, PEER_ENCR_CHAT, to_id, date, l, s, start, end - start, start_file, in_ptr - start_file); + } else if (x == CODE_decrypted_message_service) { + bl_do_create_message_service_encr (id, P->encr_chat.user_id, PEER_ENCR_CHAT, to_id, date, start, end - start); } } else { - x = fetch_int (); - if (x == CODE_encrypted_file) { - fetch_skip (7); - } else { - assert (x == CODE_encrypted_file_empty); - } + assert (skip_type_any (TYPE_TO_PARAM (encrypted_file)) >= 0); M->media.type = CODE_message_media_empty; } } else { @@ -1480,7 +1538,6 @@ struct message *fetch_alloc_encrypted_message (void) { message_insert_tree (M); messages_allocated ++; assert (message_get (M->id) == M); - logprintf ("id = %lld\n", M->id); } fetch_encrypted_message (M); return M; diff --git a/structures.h b/structures.h index bc5f19f..0072e02 100644 --- a/structures.h +++ b/structures.h @@ -98,6 +98,7 @@ struct encr_video { int w; int h; int duration; + char *mime_type; }; struct encr_audio { @@ -110,6 +111,7 @@ struct encr_audio { unsigned char *key; unsigned char *iv; int duration; + char *mime_type; }; struct encr_document { @@ -203,6 +205,7 @@ struct secret_chat { int admin_id; int date; int ttl; + int layer; long long access_hash; unsigned char *g_key; unsigned char *nonce; @@ -240,6 +243,7 @@ struct video { int duration; int w; int h; + char *mime_type; }; struct audio { @@ -250,6 +254,7 @@ struct audio { int size; int dc_id; int duration; + char *mime_type; }; struct document { @@ -276,6 +281,10 @@ struct message_action { struct photo photo; int user; int ttl; + int layer; + int read_cnt; + int delete_cnt; + int screenshot_cnt; }; }; @@ -344,7 +353,7 @@ struct message *fetch_alloc_encrypted_message (void); void fetch_encrypted_message_file (struct message_media *M); void fetch_skip_encrypted_message_file (void); void fetch_encrypted_message_file (struct message_media *M); -void fetch_message_action_encrypted (struct message_action *M); +void fetch_message_action_encrypted (struct secret_chat *E, struct message_action *M); peer_id_t fetch_peer_id (void); void fetch_message_media (struct message_media *M);