Display channels and supergroups in roomlist

This commit is contained in:
mjentsch 2016-02-07 00:40:48 +01:00
parent fbe3a7fbba
commit e8005883ab
2 changed files with 33 additions and 18 deletions

View file

@ -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:)]];

View file

@ -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);
}
}