static void update_user_handler (struct tgl_state *TLS, struct tgl_user *user, unsigned flags) { // if (!(flags & TGL_UPDATE_CREATED)) { return; } if (TLS->our_id == tgl_get_peer_id (user->id)) { if (flags & TGL_UPDATE_NAME) { p2tgl_connection_set_display_name (TLS, (tgl_peer_t *)user); } } else { PurpleBuddy *buddy = p2tgl_buddy_find (TLS, user->id); if (!buddy) { buddy = p2tgl_buddy_new (TLS, (tgl_peer_t *)user); purple_blist_add_buddy (buddy, NULL, tggroup, NULL); } if (flags & TGL_UPDATE_CREATED) { purple_buddy_set_protocol_data (buddy, (gpointer)user); p2tgl_prpl_got_user_status (TLS, user->id, &user->status); p2tgl_buddy_update (TLS, (tgl_peer_t *)user, flags); } if (flags & (TGL_UPDATE_NAME | TGL_UPDATE_REAL_NAME | TGL_UPDATE_USERNAME) && buddy) { p2tgl_blist_alias_buddy (buddy, user); } if (flags & TGL_UPDATE_PHOTO) { tgl_do_get_user_info (TLS, user->id, 0, on_user_get_info, 0); } if (flags & TGL_UPDATE_DELETED && buddy) { purple_blist_remove_buddy (buddy); } } }
static void decline_secret_chat_cb (gpointer _data, const gchar *code) { struct accept_secret_chat_data *data = _data; bl_do_encr_chat_delete (data->TLS, data->U); purple_blist_remove_buddy (p2tgl_buddy_find(data->TLS, data->U->id)); g_free (data); }
static void update_secret_chat_handler (struct tgl_state *TLS, struct tgl_secret_chat *U, unsigned flags) { debug ("secret-chat-state: %d", U->state); if (flags & TGL_UPDATE_WORKING || flags & TGL_UPDATE_DELETED) { write_secret_chat_file (TLS); } PurpleBuddy *buddy = p2tgl_buddy_find (TLS, U->id); if (! (flags & TGL_UPDATE_DELETED)) { if (!buddy) { buddy = p2tgl_buddy_new (TLS, (tgl_peer_t *)U); purple_blist_add_buddy (buddy, NULL, tggroup, NULL); purple_blist_alias_buddy (buddy, U->print_name); } p2tgl_prpl_got_set_status_mobile (TLS, U->id); } if (flags & TGL_UPDATE_REQUESTED && buddy) { connection_data *conn = TLS->ev_base; const char* choice = purple_account_get_string (conn->pa, "accept-secret-chats", "ask"); if (! strcmp (choice, "always")) { tgl_do_accept_encr_chat_request (TLS, U, write_secret_chat_gw, 0); } else if (! strcmp(choice, "ask")) { PurpleBuddy *who = p2tgl_buddy_find (TLS, TGL_MK_USER(U->user_id)); struct accept_secret_chat_data *data = g_new (struct accept_secret_chat_data, 1); data->TLS = TLS; data->U = U; gchar *message = g_strdup_printf ("Accept Secret Chat '%s'?", U->print_name); purple_request_accept_cancel (conn->gc, "Secret Chat", message, "Secret chats can only have one " "end point. If you accept a secret chat on this device, its messages will " "not be available anywhere else. If you decline, you can accept" " the chat on other devices.", 0, conn->pa, who->name, NULL, data, G_CALLBACK(accept_secret_chat_cb), G_CALLBACK(decline_secret_chat_cb)); g_free (message); }
PurpleBuddy *p2tgl_buddy_update (struct tgl_state *TLS, tgl_peer_t *user, unsigned flags) { PurpleBuddy *b = p2tgl_buddy_find (TLS, user->id); if (!b) { b = p2tgl_buddy_new (TLS, user); } if (flags & TGL_UPDATE_NAME) { debug ("Update username for id%d (name %s %s)\n", tgl_get_peer_id (user->id), user->user.first_name, user->user.last_name); char *alias = p2tgl_strdup_alias (user); purple_blist_alias_buddy(b, alias); g_free (alias); } return b; }