diff --git a/telegram-adium/TelegramJoinChatViewController.m b/telegram-adium/TelegramJoinChatViewController.m index 986375e..9ed1793 100644 --- a/telegram-adium/TelegramJoinChatViewController.m +++ b/telegram-adium/TelegramJoinChatViewController.m @@ -39,6 +39,14 @@ static void tgl_chat_iterator_cb (tgl_peer_t *peer, void *extra) { } } +static void tgl_channel_iterator_cb (tgl_peer_t *peer, void *extra) { + NSMutableArray *A = (__bridge NSMutableArray *)(extra); + + if (tgl_get_peer_type (peer->id) == TGL_PEER_CHANNEL && !(peer->channel.flags & TGLCHF_LEFT)) { + [A addObject: [NSString stringWithUTF8String: peer->print_name]]; + } +} + - (void)configureForAccount:(AIAccount *)inAccount { [super configureForAccount:inAccount]; @@ -51,7 +59,10 @@ static void tgl_chat_iterator_cb (tgl_peer_t *peer, void *extra) { // fetch all active chats and put them into the select box [popupButton_existingChat removeAllItems]; NSMutableArray *chats = [NSMutableArray new]; + tgl_peer_iterator_ex (conn->TLS, tgl_chat_iterator_cb, (__bridge void *)(chats)); + tgl_peer_iterator_ex (conn->TLS, tgl_channel_iterator_cb, (__bridge void *)(chats)); + [popupButton_existingChat addItemsWithTitles: [chats sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)]]; diff --git a/tgp-chat.c b/tgp-chat.c index 92dbc1f..9389b0b 100644 --- a/tgp-chat.c +++ b/tgp-chat.c @@ -229,11 +229,10 @@ GHashTable *tgprpl_chat_info_defaults (PurpleConnection *gc, const char *chat_na void tgprpl_chat_join (PurpleConnection *gc, GHashTable *data) { debug ("tgprpl_chat_join()"); g_return_if_fail(data); - + // auto joins will cause chat joins at a time when the dialogue list is not ready, remember // those chats and join them once the dialogue list is fetched if (! gc_get_data (gc)->dialogues_ready) { - g_return_if_fail (data); const char *id = g_hash_table_lookup (data, "id"); if (id) { debug ("attempting to join chat %s while not ready, queue up for later", id); @@ -308,12 +307,19 @@ char *tgprpl_get_chat_name (GHashTable * data) { static void tgp_chat_roomlist_it (tgl_peer_t *P, void *extra) { connection_data *conn = extra; - if (tgl_get_peer_type (P->id) == TGL_PEER_CHAT && !(P->chat.flags & TGLCF_LEFT)) { + if ((tgl_get_peer_type (P->id) == TGL_PEER_CHAT || tgl_get_peer_type (P->id) == TGL_PEER_CHANNEL) + && !(P->flags & TGLPF_LEFT)) { char *id = g_strdup_printf ("%d", tgl_get_peer_id (P->id)); PurpleRoomlistRoom *room = purple_roomlist_room_new (PURPLE_ROOMLIST_ROOMTYPE_ROOM, P->chat.print_title, NULL); purple_roomlist_room_add_field (conn->roomlist, room, id); - purple_roomlist_room_add_field (conn->roomlist, room, GINT_TO_POINTER(P->chat.users_num)); + if (tgl_get_peer_type (P->id) == TGL_PEER_CHANNEL) { + purple_roomlist_room_add_field (conn->roomlist, room, GINT_TO_POINTER(0)); + purple_roomlist_room_add_field (conn->roomlist, room, (P->channel.flags & TGLCHF_MEGAGROUP) ? _("Supergroup") : _("Channel")); + } else { + purple_roomlist_room_add_field (conn->roomlist, room, GINT_TO_POINTER(P->chat.users_num)); + purple_roomlist_room_add_field (conn->roomlist, room, _("Group")); + } purple_roomlist_room_add (conn->roomlist, room); g_free (id); @@ -322,38 +328,36 @@ static void tgp_chat_roomlist_it (tgl_peer_t *P, void *extra) { PurpleRoomlist *tgprpl_roomlist_get_list (PurpleConnection *gc) { debug ("tgprpl_roomlist_get_list()"); - connection_data *conn = purple_connection_get_protocol_data (gc); - GList *fields = NULL; - + connection_data *conn = gc_get_data (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); return conn->roomlist; } void tgprpl_roomlist_cancel (PurpleRoomlist *list) { - PurpleConnection *gc = purple_account_get_connection (list->account); - if (! gc) { - return; - } - - connection_data *conn = purple_connection_get_protocol_data (gc); + g_return_if_fail(list->account); + purple_roomlist_set_in_progress (list, FALSE); - if (conn->roomlist == list) { - conn->roomlist = NULL; + if (pa_get_data (list->account)->roomlist == list) { + pa_get_data (list->account)->roomlist = NULL; purple_roomlist_unref (list); } }