void print_service_message (struct message *M) { assert (M); if (msg_num_mode) { printf ("%lld ", M->id); } print_date (M->date); printf (" "); if (get_peer_type (M->to_id) == PEER_CHAT) { print_chat_name (M->to_id, user_chat_get (M->to_id)); } else { assert (get_peer_type (M->to_id) == PEER_ENCR_CHAT); print_encr_chat_name (M->to_id, user_chat_get (M->to_id)); } printf (" "); print_user_name (M->from_id, user_chat_get (M->from_id)); switch (M->action.type) { case CODE_message_action_empty: printf ("\n"); break; case CODE_message_action_geo_chat_create: printf ("Created geo chat\n"); break; case CODE_message_action_geo_chat_checkin: printf ("Checkin in geochat\n"); break; case CODE_message_action_chat_create: printf (" created chat %s. %d users\n", M->action.title, M->action.user_num); break; case CODE_message_action_chat_edit_title: printf (" changed title to %s\n", M->action.new_title); break; case CODE_message_action_chat_edit_photo: printf (" changed photo\n"); break; case CODE_message_action_chat_delete_photo: printf (" deleted photo\n"); break; case CODE_message_action_chat_add_user: printf (" added user "); print_user_name (set_peer_id (PEER_USER, M->action.user), user_chat_get (set_peer_id (PEER_USER, M->action.user))); printf ("\n"); break; case CODE_message_action_chat_delete_user: printf (" deleted user "); print_user_name (set_peer_id (PEER_USER, M->action.user), user_chat_get (set_peer_id (PEER_USER, M->action.user))); printf ("\n"); break; case CODE_decrypted_message_action_set_message_t_t_l: printf (" set ttl to %d seconds. Unsupported yet\n", M->action.ttl); break; default: assert (0); } }
void write_secret_chat_file (void) { if (binlog_enabled) { return; } int fd = open (get_secret_chat_filename (), O_CREAT | O_RDWR, 0600); if (fd < 0) { return; } int x[2]; x[0] = SECRET_CHAT_FILE_MAGIC; x[1] = 1; assert (write (fd, x, 8) == 8); int i; int cc = 0; for (i = 0; i < peer_num; i++) if (get_peer_type (Peers[i]->id) == PEER_ENCR_CHAT) { if (Peers[i]->encr_chat.state != sc_none && Peers[i]->encr_chat.state != sc_deleted) { cc ++; } } assert (write (fd, &cc, 4) == 4); for (i = 0; i < peer_num; i++) if (get_peer_type (Peers[i]->id) == PEER_ENCR_CHAT) { if (Peers[i]->encr_chat.state != sc_none && Peers[i]->encr_chat.state != sc_deleted) { int t = get_peer_id (Peers[i]->id); assert (write (fd, &t, 4) == 4); t = Peers[i]->flags; assert (write (fd, &t, 4) == 4); t = strlen (Peers[i]->print_name); assert (write (fd, &t, 4) == 4); assert (write (fd, Peers[i]->print_name, t) == t); assert (write (fd, &Peers[i]->encr_chat.state, 4) == 4); assert (write (fd, &Peers[i]->encr_chat.user_id, 4) == 4); assert (write (fd, &Peers[i]->encr_chat.admin_id, 4) == 4); assert (write (fd, &Peers[i]->encr_chat.ttl, 4) == 4); assert (write (fd, &Peers[i]->encr_chat.access_hash, 8) == 8); if (Peers[i]->encr_chat.state != sc_waiting) { assert (write (fd, Peers[i]->encr_chat.g_key, 256) == 256); } if (Peers[i]->encr_chat.state != sc_waiting) { assert (write (fd, Peers[i]->encr_chat.nonce, 256) == 256); } assert (write (fd, Peers[i]->encr_chat.key, 256) == 256); assert (write (fd, &Peers[i]->encr_chat.key_fingerprint, 8) == 8); } } assert (write (fd, &encr_root, 4) == 4); if (encr_root) { assert (write (fd, &encr_param_version, 4) == 4); assert (write (fd, encr_prime, 256) == 256); } close (fd); }
void print_user_name (peer_id_t id, peer_t *U) { assert (get_peer_type (id) == PEER_USER); if (!U) { printf ("user#%d", get_peer_id (id)); int i; int ok = 1; for (i = 0; i < unknown_user_list_pos; i++) { if (unknown_user_list[i] == get_peer_id (id)) { ok = 0; break; } } if (ok) { assert (unknown_user_list_pos < 1000); unknown_user_list[unknown_user_list_pos ++] = get_peer_id (id); } } else { if ((U->flags & FLAG_DELETED)) { printf ("deleted user#%d", get_peer_id (id)); } else if (!(U->flags & FLAG_CREATED)) { printf ("empty user#%d", get_peer_id (id)); } else if (!U->user.first_name || !strlen (U->user.first_name)) { printf ("%s", U->user.last_name); } else if (!U->user.last_name || !strlen (U->user.last_name)) { printf ("%s", U->user.first_name); } else { printf ("%s %s", U->user.first_name, U->user.last_name); } } }
peer_id_t next_token_chat (void) { int l; char *s = next_token (&l); if (!s) { return PEER_NOT_FOUND; } if (l >= 6 && !memcmp (s, "chat#", 5)) { s += 5; l -= 5; int r = atoi (s); if (r >= 0) { return set_peer_id (PEER_CHAT, r); } else { return PEER_NOT_FOUND; } } int index = 0; while (index < peer_num && (!is_same_word (s, l, Peers[index]->print_name) || get_peer_type (Peers[index]->id) != PEER_CHAT)) { index ++; } if (index < peer_num) { return Peers[index]->id; } else { return PEER_NOT_FOUND; } }
void print_encr_chat_name_full (peer_id_t id, peer_t *C) { assert (get_peer_type (id) == PEER_ENCR_CHAT); if (!C) { printf ("encr_chat#%d", get_peer_id (id)); } else { printf ("%s", C->print_name); } }
void print_chat_name (peer_id_t id, peer_t *C) { assert (get_peer_type (id) == PEER_CHAT); if (!C) { printf ("chat#%d", get_peer_id (id)); } else { printf ("%s", C->chat.title); } }
peer_id_t next_token_encr_chat (void) { int l; char *s = next_token (&l); if (!s) { return PEER_NOT_FOUND; } int index = 0; while (index < peer_num && (!is_same_word (s, l, Peers[index]->print_name) || get_peer_type (Peers[index]->id) != PEER_ENCR_CHAT)) { index ++; } if (index < peer_num) { return Peers[index]->id; } else { return PEER_NOT_FOUND; } }
void print_message (struct message *M) { assert (M); if (M->flags & (FLAG_MESSAGE_EMPTY | FLAG_DELETED)) { return; } if (!(M->flags & FLAG_CREATED)) { return; } if (M->service) { print_service_message (M); return; } if (!get_peer_type (M->to_id)) { logprintf ("Bad msg\n"); return; } last_from_id = M->from_id; last_to_id = M->to_id; if (get_peer_type (M->to_id) == PEER_USER) { if (M->out) { if (msg_num_mode) { printf ("%lld ", M->id); } print_date (M->date); printf (" "); print_user_name (M->to_id, user_chat_get (M->to_id)); if (M->unread) { printf (" <<< "); } else { printf (" ««« "); } } else { if (msg_num_mode) { printf ("%lld ", M->id); } print_date (M->date); printf (" "); print_user_name (M->from_id, user_chat_get (M->from_id)); if (M->unread) { printf (" >>> "); } else { printf (" »»» "); } if (alert_sound) { play_sound(); } } } else if (get_peer_type (M->to_id) == PEER_ENCR_CHAT) { peer_t *P = user_chat_get (M->to_id); assert (P); if (M->out) { if (msg_num_mode) { printf ("%lld ", M->id); } print_date (M->date); printf (" "); printf (" %s", P->print_name); if (M->unread) { printf (" <<< "); } else { printf (" ««« "); } } else { if (msg_num_mode) { printf ("%lld ", M->id); } print_date (M->date); printf (" %s", P->print_name); if (M->unread) { printf (" >>> "); } else { printf (" »»» "); } if (alert_sound) { play_sound(); } } } else { assert (get_peer_type (M->to_id) == PEER_CHAT); if (msg_num_mode) { printf ("%lld ", M->id); } print_date (M->date); printf (" "); print_chat_name (M->to_id, user_chat_get (M->to_id)); printf (" "); print_user_name (M->from_id, user_chat_get (M->from_id)); if (M->unread) { printf (" >>> "); } else { printf (" »»» "); } } if (get_peer_type (M->fwd_from_id) == PEER_USER) { printf ("[fwd from "); print_user_name (M->fwd_from_id, user_chat_get (M->fwd_from_id)); printf ("] "); } if (M->message && strlen (M->message)) { printf ("%s", M->message); } if (M->media.type != CODE_message_media_empty) { print_media (&M->media); } assert (!color_stack_pos); printf ("\n"); }
int complete_encr_chat_list (int index, const char *text, int len, char **R) { index ++; while (index < peer_num && (!Peers[index]->print_name || strncmp (Peers[index]->print_name, text, len) || get_peer_type (Peers[index]->id) != PEER_ENCR_CHAT)) { index ++; } if (index < peer_num) { *R = strdup (Peers[index]->print_name); return index; } else { return -1; } }