diff --git a/telegram-purple.c b/telegram-purple.c index fc1db9c..6a74dcb 100644 --- a/telegram-purple.c +++ b/telegram-purple.c @@ -232,6 +232,8 @@ static void update_marked_read (struct tgl_state *TLS, int num, struct tgl_messa static void on_get_dialog_list_done (struct tgl_state *TLS, void *extra, int success, int size, tgl_peer_id_t peers[], tgl_message_id_t *last_msg_id[], int unread_count[]) { info ("Fetched dialogue list of size: %d", size); + + connection_data *conn = tls_get_data(TLS); if (tgp_error_if_false (TLS, success, "Fetching dialogue list failed", TLS->error)) { return; } @@ -255,7 +257,12 @@ static void on_get_dialog_list_done (struct tgl_state *TLS, void *extra, int suc } } - // now that the dialogue list is loaded, handle all pending chat joins + // handle pending roomlist request + if (conn->roomlist != NULL && purple_roomlist_get_in_progress (conn->roomlist)) { + tgp_chat_roomlist_populate (TLS); + } + + // handle all pending chat joins tls_get_data (TLS)->dialogues_ready = TRUE; tgp_chat_join_all_pending (TLS); } diff --git a/tgp-chat.c b/tgp-chat.c index 1c179d9..f3d8580 100644 --- a/tgp-chat.c +++ b/tgp-chat.c @@ -400,7 +400,7 @@ char *tgprpl_get_chat_name (GHashTable * data) { return g_strdup (g_hash_table_lookup (data, "subject")); } -static void tgp_chat_roomlist_it (tgl_peer_t *P, void *extra) { +static void tgp_chat_roomlist_add (tgl_peer_t *P, void *extra) { connection_data *conn = extra; if ((tgl_get_peer_type (P->id) == TGL_PEER_CHAT || tgl_get_peer_type (P->id) == TGL_PEER_CHANNEL) @@ -422,6 +422,26 @@ static void tgp_chat_roomlist_it (tgl_peer_t *P, void *extra) { } } +void tgp_chat_roomlist_populate (struct tgl_state *TLS) { + connection_data *conn = tls_get_data (TLS); + g_return_if_fail(purple_roomlist_get_in_progress (conn->roomlist)); + + GList *fields = NULL; + PurpleRoomlistField *f = purple_roomlist_field_new (PURPLE_ROOMLIST_FIELD_STRING, "", "id", TRUE); + fields = g_list_append (fields, f); + + f = purple_roomlist_field_new (PURPLE_ROOMLIST_FIELD_INT, _("Users in chat"), "users", FALSE); + fields = g_list_append (fields, f); + + f = purple_roomlist_field_new (PURPLE_ROOMLIST_FIELD_STRING, _("Type"), "type", FALSE); + fields = g_list_append (fields, f); + + purple_roomlist_set_fields (conn->roomlist, fields); + tgl_peer_iterator_ex (conn->TLS, tgp_chat_roomlist_add, conn); + + purple_roomlist_set_in_progress (conn->roomlist, FALSE); +} + PurpleRoomlist *tgprpl_roomlist_get_list (PurpleConnection *gc) { debug ("tgprpl_roomlist_get_list()"); connection_data *conn = gc_get_data (gc); @@ -429,21 +449,16 @@ PurpleRoomlist *tgprpl_roomlist_get_list (PurpleConnection *gc) { if (conn->roomlist) { purple_roomlist_unref (conn->roomlist); } - + conn->roomlist = purple_roomlist_new (purple_connection_get_account (gc)); - GList *fields = NULL; - PurpleRoomlistField *f = purple_roomlist_field_new (PURPLE_ROOMLIST_FIELD_STRING, "", "id", TRUE); - fields = g_list_append (fields, f); - - f = purple_roomlist_field_new (PURPLE_ROOMLIST_FIELD_INT, _("Users in chat"), "users", FALSE); - fields = g_list_append (fields, f); - - f = purple_roomlist_field_new (PURPLE_ROOMLIST_FIELD_STRING, _("Type"), "type", FALSE); - fields = g_list_append (fields, f); - - purple_roomlist_set_fields (conn->roomlist, fields); - tgl_peer_iterator_ex (conn->TLS, tgp_chat_roomlist_it, conn); + purple_roomlist_set_in_progress (conn->roomlist, TRUE); + + // spectrum2 calls this function when the account is still connection + // all roomlists in progress are being initialised by tgp_on_ready + if (conn->dialogues_ready) { + tgp_chat_roomlist_populate (conn->TLS); + } return conn->roomlist; } diff --git a/tgp-chat.h b/tgp-chat.h index 156b5f3..bda1542 100644 --- a/tgp-chat.h +++ b/tgp-chat.h @@ -52,6 +52,7 @@ void tgprpl_chat_join (PurpleConnection *gc, GHashTable *data); GList *tgprpl_chat_join_info (PurpleConnection *gc); PurpleRoomlist *tgprpl_roomlist_get_list (PurpleConnection *gc); void tgprpl_roomlist_cancel (PurpleRoomlist *list); +void tgp_chat_roomlist_populate (struct tgl_state *TLS); GHashTable *tgprpl_chat_info_defaults (PurpleConnection *gc, const char *chat_name); void tgp_chat_join_all_pending (struct tgl_state *TLS); void tgprpl_kick_from_chat (PurpleConnection *gc, int id, const char *who);