From ff2df0861bf7984cfb7e2a156e6c489953e3a762 Mon Sep 17 00:00:00 2001 From: mjentsch Date: Mon, 7 Sep 2015 00:48:02 +0200 Subject: [PATCH] Add users in bulk to generate better join-messages in Finch --- tgp-2prpl.c | 23 ++++++++++++++++------- tgp-2prpl.h | 1 + tgp-chat.c | 18 +++++++++++++++--- 3 files changed, 32 insertions(+), 10 deletions(-) diff --git a/tgp-2prpl.c b/tgp-2prpl.c index 75a63c3..8e07a73 100644 --- a/tgp-2prpl.c +++ b/tgp-2prpl.c @@ -318,22 +318,20 @@ PurpleChat *p2tgl_chat_find (struct tgl_state *TLS, tgl_peer_id_t id) { return c; } -void p2tgl_conv_add_user (struct tgl_state *TLS, PurpleConversation *conv, - int user, char *message, int flags, int new_arrival) { - PurpleConvChat *cdata = purple_conversation_get_chat_data(conv); - char *name = g_strdup_printf ("%d", user); - purple_conv_chat_add_user (cdata, name, message, flags, new_arrival); - +void p2tgl_conv_add_user_rename (tgl_peer_t *U, PurpleConversation *conv) { + // inject print_name into chat buddies to display a human-readable name // for buddies not in the buddy list instead of the user id - tgl_peer_t *U = tgl_peer_get (TLS, TGL_MK_USER(user)); if (U) { + char *name = g_strdup_printf("%d", tgl_get_peer_id (U->id)); + PurpleConvChatBuddy *cbuddy = purple_conv_chat_cb_find (PURPLE_CONV_CHAT(conv), name); PurpleConversationUiOps *uiops = purple_conversation_get_ui_ops (conv); if (cbuddy && cbuddy->alias) { g_free (cbuddy->alias); cbuddy->alias = g_strdup (U->print_name); } + if (uiops && uiops->chat_rename_user) { debug ("try rename user %s to %s\n", name, U->print_name); uiops->chat_rename_user (conv, name, name, U->print_name); @@ -341,8 +339,19 @@ void p2tgl_conv_add_user (struct tgl_state *TLS, PurpleConversation *conv, debug ("try update user %s\n", name); uiops->chat_update_user (conv, name); } + + g_free (name); } +} + +void p2tgl_conv_add_user (struct tgl_state *TLS, PurpleConversation *conv, + int user, char *message, int flags, int new_arrival) { + PurpleConvChat *cdata = purple_conversation_get_chat_data(conv); + char *name = g_strdup_printf ("%d", user); + purple_conv_chat_add_user (cdata, name, message, flags, new_arrival); + p2tgl_conv_add_user_rename (tgl_peer_get (TLS, TGL_MK_USER(user)), conv); + g_free(name); } diff --git a/tgp-2prpl.h b/tgp-2prpl.h index a644383..f59dbf0 100644 --- a/tgp-2prpl.h +++ b/tgp-2prpl.h @@ -61,6 +61,7 @@ void p2tgl_prpl_got_set_status_offline (struct tgl_state *TLS, tgl_peer_id_t use void p2tgl_connection_set_display_name(struct tgl_state *TLS, tgl_peer_t *user); void p2tgl_conv_del_user (struct tgl_state *TLS, PurpleConversation *conv, const char *message, int userid); +void p2tgl_conv_add_user_rename (tgl_peer_t *U, PurpleConversation *conv); void p2tgl_conv_add_users (PurpleConversation *conv, struct tgl_chat_user *list); void p2tgl_conv_add_user (struct tgl_state *TLS, PurpleConversation *conv, int user, char *message, int flags, int new_arrival); PurpleConversation *p2tgl_find_conversation_with_account (struct tgl_state *TLS, tgl_peer_id_t peer); diff --git a/tgp-chat.c b/tgp-chat.c index 3fd8a66..fa98d64 100644 --- a/tgp-chat.c +++ b/tgp-chat.c @@ -53,13 +53,25 @@ static void tgp_chat_on_loaded_chat_full_joining (struct tgl_state *TLS, void *_ } } -static void tgp_chat_add_all_users (struct tgl_state *TLS, PurpleConversation *pc, struct tgl_chat *C) { +static void tgp_chat_add_all_users (struct tgl_state *TLS, PurpleConversation *conv, struct tgl_chat *C) { + GList *users = NULL, + *flags = NULL; + int i = 0; for (; i < C->user_list_size; i++) { struct tgl_chat_user *uid = (C->user_list + i); - int flags = (C->admin_id == uid->user_id ? PURPLE_CBFLAGS_FOUNDER : PURPLE_CBFLAGS_NONE); - p2tgl_conv_add_user (TLS, pc, uid->user_id, NULL, flags, FALSE); + users = g_list_append (users, g_strdup_printf ("%d", uid->user_id)); + flags = g_list_append (flags, GINT_TO_POINTER(C->admin_id == uid->user_id ? PURPLE_CBFLAGS_FOUNDER : PURPLE_CBFLAGS_NONE)); } + + purple_conv_chat_add_users (PURPLE_CONV_CHAT(conv), users, NULL, flags, FALSE); + while (users) { + p2tgl_conv_add_user_rename (tgl_peer_get (TLS, TGL_MK_USER(atoi (users->data))), conv); + users = g_list_next (users); + } + + g_list_free_full (users, g_free); + g_list_free (flags); } void tgp_chat_users_update (struct tgl_state *TLS, struct tgl_chat *C) {