From c3f48b9835fd09d65f8c5cfd21f3bfcd1b517f99 Mon Sep 17 00:00:00 2001 From: mjentsch Date: Sat, 12 Sep 2015 22:21:27 +0200 Subject: [PATCH] Don't automatically add all chats to the buddy list This should fix issue where left chats show up in the blist and cannot be removed anymore and broken Adium bookmarks. This patch should make the whole chat handling much more native to libpurple, in which chats are added through the chatlist, the join-chat window or automatically when incoming messages are received. Add a new option "Add chats to buddy list" in case anyone wants the old behavior. --- telegram-adium/TelegramAccount.m | 34 ++++++++++++++++++- telegram-purple.c | 58 +++++++++++++++++++++++--------- telegram-purple.h | 3 ++ tgp-2prpl.h | 2 -- tgp-chat.c | 6 +++- tgp-chat.h | 2 ++ 6 files changed, 85 insertions(+), 20 deletions(-) diff --git a/telegram-adium/TelegramAccount.m b/telegram-adium/TelegramAccount.m index a45f818..bdf8568 100644 --- a/telegram-adium/TelegramAccount.m +++ b/telegram-adium/TelegramAccount.m @@ -30,7 +30,6 @@ #import #import - #include "telegram-purple.h" @implementation TelegramAccount @@ -61,6 +60,20 @@ [self purpleAccount]; purple_signal_connect (purple_conversations_get_handle(), "chat-buddy-joined", [self purpleAccount], PURPLE_CALLBACK(chat_buddy_joined), (__bridge void *)(self)); + + // Storing chats in the blist breaks Adium bookmarks. Adium doesn't + // show those chats anyway, so we can just safely delete those. + PurpleBlistNode *node = purple_blist_get_root(); + while (node) { + if (PURPLE_BLIST_NODE_IS_CHAT(node)) { + PurpleChat *ch = PURPLE_CHAT(node); + if (purple_chat_get_account(ch) == account) { + NSLog (@"Removing chat from blist: %s", ch->alias); + purple_blist_remove_chat (ch); + } + } + node = purple_blist_node_next (node, 0); + } } - (void)didDisconnect @@ -218,4 +231,23 @@ void chat_buddy_joined (PurpleConversation *conv, const char *name, } } +/*! + * @brief Re-create the chat's join options. + */ +- (NSDictionary *)extractChatCreationDictionaryFromConversation:(PurpleConversation *)conv +{ + connection_data *conn = purple_connection_get_protocol_data (purple_conversation_get_gc (conv)); + + const char *name = purple_conversation_get_name (conv); + tgl_peer_t *P = tgl_peer_get_by_name (conn->TLS, purple_conversation_get_title (conv)); + if (P) { + return [NSMutableDictionary dictionaryWithObjectsAndKeys: + [NSString stringWithFormat:@"%d", tgl_get_peer_id(P->id)], @"id", + [NSString stringWithUTF8String: name], @"subject", + [NSString stringWithFormat:@"%d", P->chat.admin_id], @"owner", + nil]; + } + return nil; +} + @end diff --git a/telegram-purple.c b/telegram-purple.c index d9fc45a..5644ae4 100755 --- a/telegram-purple.c +++ b/telegram-purple.c @@ -324,26 +324,45 @@ static void on_userpic_loaded (struct tgl_state *TLS, void *extra, int success, static void on_get_dialog_list_done (struct tgl_state *TLS, void *callback_extra, int success, int size, tgl_peer_id_t peers[], int last_msg_id[], int unread_count[]) { + + connection_data *conn = TLS->ev_base; + int i = size - 1; - for (; i >= 0; i--) if (tgl_get_peer_type (peers[i]) == TGL_PEER_USER) { + for (; i >= 0; i--) { tgl_peer_t *UC = tgl_peer_get (TLS, peers[i]); - if (tgl_get_peer_id (peers[i]) != TLS->our_id) { - PurpleBuddy *buddy = p2tgl_buddy_find (TLS, peers[i]); - if (! buddy) { - buddy = p2tgl_buddy_new (TLS, UC); - purple_blist_add_buddy (buddy, NULL, tggroup, NULL); - - if (UC->user.photo_id) { - debug ("tgl_do_get_user_info(%s)", UC->print_name); - tgl_do_get_user_info (TLS, UC->id, 0, on_user_get_info, get_user_info_data_new (0, UC->id)); + switch (tgl_get_peer_type (peers[i])) { + case TGL_PEER_USER: + assert (UC); + if (tgl_get_peer_id (UC->id) != TLS->our_id) { + PurpleBuddy *buddy = p2tgl_buddy_find (TLS, UC->id); + if (! buddy) { + buddy = p2tgl_buddy_new (TLS, UC); + purple_blist_add_buddy (buddy, NULL, tggroup, NULL); + + if (UC->user.photo_id) { + debug ("tgl_do_get_user_info(%s)", UC->print_name); + tgl_do_get_user_info (TLS, UC->id, 0, on_user_get_info, get_user_info_data_new (0, UC->id)); + } + } + + p2tgl_prpl_got_user_status (TLS, UC->id, &UC->user.status); + p2tgl_prpl_got_set_status_mobile (TLS, UC->id); + } else { + p2tgl_connection_set_display_name (TLS, UC); } - } - - p2tgl_prpl_got_user_status (TLS, UC->id, &UC->user.status); - p2tgl_prpl_got_set_status_mobile (TLS, UC->id); - } else { - p2tgl_connection_set_display_name (TLS, UC); + break; + + case TGL_PEER_CHAT: + assert (UC); + if (UC->chat.users_num > 0 && purple_account_get_bool (conn->pa, TGP_KEY_JOIN_GROUP_CHATS, TGP_DEFAULT_JOIN_GROUP_CHATS)) { + PurpleChat *PC = p2tgl_chat_find (TLS, UC->id); + if (!PC) { + PC = p2tgl_chat_new (TLS, &UC->chat); + purple_blist_add_chat (PC, NULL, NULL); + } + } + break; } } } @@ -892,6 +911,13 @@ static void tgprpl_init (PurplePlugin *plugin) { TGP_KEY_HISTORY_RETRIEVAL_THRESHOLD, TGP_DEFAULT_HISTORY_RETRIEVAL_THRESHOLD); prpl_info.protocol_options = g_list_append (prpl_info.protocol_options, opt); + + // Chats + + opt = purple_account_option_bool_new ("Add group chats to buddy list", + TGP_KEY_JOIN_GROUP_CHATS, + TGP_DEFAULT_JOIN_GROUP_CHATS); + prpl_info.protocol_options = g_list_append (prpl_info.protocol_options, opt); // Read notifications diff --git a/telegram-purple.h b/telegram-purple.h index cacf779..a4537d3 100644 --- a/telegram-purple.h +++ b/telegram-purple.h @@ -50,6 +50,9 @@ #define TGP_DEFAULT_HISTORY_RETRIEVAL_THRESHOLD 14 #define TGP_KEY_HISTORY_RETRIEVAL_THRESHOLD "history-retrieve-days" +#define TGP_DEFAULT_JOIN_GROUP_CHATS FALSE +#define TGP_KEY_JOIN_GROUP_CHATS "auto-join-group-chats" + #define TGP_KEY_HISTORY_SYNC_ALL "history-sync-all" #define TGP_DEFAULT_HISTORY_SYNC_ALL FALSE diff --git a/tgp-2prpl.h b/tgp-2prpl.h index f59dbf0..96826b7 100644 --- a/tgp-2prpl.h +++ b/tgp-2prpl.h @@ -68,8 +68,6 @@ PurpleConversation *p2tgl_find_conversation_with_account (struct tgl_state *TLS, void p2tgl_conversation_write (PurpleConversation *conv, tgl_peer_id_t who, const char *message, int flags, int date); PurpleConversation *p2tgl_conversation_new (struct tgl_state *TLS, tgl_peer_id_t who); -PurpleChat *p2tgl_chat_new (struct tgl_state *TLS, struct tgl_chat *chat); -void p2tgl_chat_update (PurpleChat *chat, tgl_peer_id_t id, int admin_id, const char *subject); PurpleChat *p2tgl_chat_find (struct tgl_state *TLS, tgl_peer_id_t chat); void *p2tgl_notify_userinfo(struct tgl_state *TLS, tgl_peer_id_t user, PurpleNotifyUserInfo *user_info, PurpleNotifyCloseCallback cb, gpointer user_data); diff --git a/tgp-chat.c b/tgp-chat.c index b4f4dca..e7c56a1 100644 --- a/tgp-chat.c +++ b/tgp-chat.c @@ -53,10 +53,14 @@ void p2tgl_chat_update (PurpleChat *chat, tgl_peer_id_t id, int admin_id, const } void tgp_chat_on_loaded_chat_full (struct tgl_state *TLS, struct tgl_chat *C) { + connection_data *conn = TLS->ev_base; + PurpleChat *PC = p2tgl_chat_find (TLS, C->id); if (!PC) { PC = p2tgl_chat_new (TLS, C); - purple_blist_add_chat (PC, NULL, NULL); + if (purple_account_get_bool (conn->pa, TGP_KEY_JOIN_GROUP_CHATS, TGP_DEFAULT_JOIN_GROUP_CHATS)) { + purple_blist_add_chat (PC, NULL, NULL); + } } p2tgl_chat_update (PC, C->id, C->admin_id, C->print_title); } diff --git a/tgp-chat.h b/tgp-chat.h index d52da0d..596a6ef 100644 --- a/tgp-chat.h +++ b/tgp-chat.h @@ -26,6 +26,8 @@ #include "tgp-2prpl.h" #include +PurpleChat *p2tgl_chat_new (struct tgl_state *TLS, struct tgl_chat *chat); + void tgp_chat_on_loaded_chat_full (struct tgl_state *TLS, struct tgl_chat *C); PurpleConversation *tgp_chat_show (struct tgl_state *TLS, struct tgl_chat *C); void tgp_chat_users_update (struct tgl_state *TLS, struct tgl_chat *C);