# HG changeset patch # User Christian Hammond # Date 1060289249 0 # Node ID ba0b99a72be283d8750e1852ea8fc6d417d5497e # Parent efaff39618a58028e2678a0ea79deabf9c213492 [gaim-migrate @ 6913] Added API commands for adding or removing a batch of users at once to/from a chat. IRC no longer has half a billion "Diablo-D3 has entered the room." messages anymore. committer: Tailor Script diff -r efaff39618a5 -r ba0b99a72be2 src/conversation.c --- a/src/conversation.c Thu Aug 07 01:15:54 2003 +0000 +++ b/src/conversation.c Thu Aug 07 20:47:29 2003 +0000 @@ -1932,6 +1932,34 @@ } void +gaim_chat_add_users(GaimChat *chat, GList *users) +{ + GaimConversation *conv; + GaimConversationUiOps *ops; + GList *l; + + g_return_if_fail(chat != NULL); + g_return_if_fail(users != NULL); + + conv = gaim_chat_get_conversation(chat); + ops = gaim_conversation_get_ui_ops(conv); + + for (l = users; l != NULL; l = l->next) { + gaim_chat_set_users(chat, + g_list_insert_sorted(gaim_chat_get_users(chat), + g_strdup((char *)l->data), + insertname_compare)); + + gaim_event_broadcast(event_chat_buddy_join, + gaim_conversation_get_gc(conv), gaim_chat_get_id(chat), + (char *)l->data); + } + + if (ops != NULL && ops->chat_add_users != NULL) + ops->chat_add_users(conv, users); +} + +void gaim_chat_rename_user(GaimChat *chat, const char *old_user, const char *new_user) { @@ -2024,6 +2052,73 @@ } } +void +gaim_chat_remove_users(GaimChat *chat, GList *users, const char *reason) +{ + GaimConversation *conv; + GaimConversationUiOps *ops; + char tmp[BUF_LONG]; + GList *names, *l; + + g_return_if_fail(chat != NULL); + g_return_if_fail(users != NULL); + + conv = gaim_chat_get_conversation(chat); + ops = gaim_conversation_get_ui_ops(conv); + + for (l = users; l != NULL; l = l->next) { + gaim_event_broadcast(event_chat_buddy_leave, + gaim_conversation_get_gc(conv), + gaim_chat_get_id(chat), l->data); + } + + if (ops != NULL && ops->chat_remove_users != NULL) + ops->chat_remove_users(conv, users); + + for (l = users; l != NULL; l = l->next) { + for (names = gaim_chat_get_users(chat); + names != NULL; + names = names->next) { + + if (!gaim_utf8_strcasecmp((char *)names->data, (char *)l->data)) { + gaim_chat_set_users(chat, + g_list_remove(gaim_chat_get_users(chat), names->data)); + + break; + } + } + } + + /* NOTE: Don't remove them from ignored in case they re-enter. */ + + if (gaim_prefs_get_bool("/core/conversations/chat/show_leave")) { + if (reason != NULL && *reason != '\0') { + int i; + int size = g_list_length(users); + int max = MIN(10, size); + GList *l; + + *tmp = '\0'; + + for (l = users, i = 0; i < max; i++, l = l->next) { + g_strlcat(tmp, (char *)l->data, sizeof(tmp)); + + if (i < max - 1) + g_strlcat(tmp, ", ", sizeof(tmp)); + } + + if (size > 10) + g_snprintf(tmp, sizeof(tmp), + _("(+%d more)"), size - 10); + + g_snprintf(tmp, sizeof(tmp), _(" left the room (%s)."), reason); + + gaim_conversation_write(conv, NULL, tmp, -1, + WFLAG_SYSTEM, time(NULL)); + } + } +} + GaimConversation * gaim_find_chat(const GaimConnection *gc, int id) { diff -r efaff39618a5 -r ba0b99a72be2 src/conversation.h --- a/src/conversation.h Thu Aug 07 01:15:54 2003 +0000 +++ b/src/conversation.h Thu Aug 07 20:47:29 2003 +0000 @@ -143,9 +143,11 @@ time_t mtime); void (*chat_add_user)(GaimConversation *conv, const char *user); + void (*chat_add_users)(GaimConversation *conv, GList *users); void (*chat_rename_user)(GaimConversation *conv, const char *old_name, const char *new_name); void (*chat_remove_user)(GaimConversation *conv, const char *user); + void (*chat_remove_users)(GaimConversation *conv, GList *users); void (*set_title)(GaimConversation *conv, const char *title); void (*update_progress)(GaimConversation *conv, float percent); @@ -915,6 +917,10 @@ /** * Sets the list of users in the chat room. * + * @note Calling this function will not update the display of the users. + * Please use gaim_chat_add_user(), gaim_chat_add_users(), + * gaim_chat_remove_user(), and gaim_chat_remove_users() instead. + * * @param chat The chat. * @param users The list of users. * @@ -1061,6 +1067,17 @@ const char *extra_msg); /** + * Adds a list of users to a chat. + * + * The data is copied from @a users, so it is up to the developer to + * free this list after calling this function. + * + * @param chat The chat. + * @param users The list of users to add. + */ +void gaim_chat_add_users(GaimChat *chat, GList *users); + +/** * Renames a user in a chat. * * @param chat The chat. @@ -1073,6 +1090,8 @@ /** * Removes a user from a chat, optionally with a reason. * + * It is up to the developer to free this list after calling this function. + * * @param chat The chat. * @param user The user that is being removed. * @param reason The optional reason given for the removal. Can be @c NULL. @@ -1081,6 +1100,15 @@ const char *reason); /** + * Removes a list of users from a chat, optionally with a single reason. + * + * @param chat The chat. + * @param users The users that are being removed. + * @param reason The optional reason given for the removal. Can be @c NULL. + */ +void gaim_chat_remove_users(GaimChat *chat, GList *users, const char *reason); + +/** * Finds a chat with the specified chat ID. * * @param gc The gaim_connection. diff -r efaff39618a5 -r ba0b99a72be2 src/gtkconv.c --- a/src/gtkconv.c Thu Aug 07 01:15:54 2003 +0000 +++ b/src/gtkconv.c Thu Aug 07 20:47:29 2003 +0000 @@ -4623,6 +4623,37 @@ } static void +gaim_gtkconv_chat_add_users(GaimConversation *conv, GList *users) +{ + GaimChat *chat; + GaimGtkConversation *gtkconv; + GaimGtkChatPane *gtkchat; + GList *l; + char tmp[BUF_LONG]; + int num_users; + int pos; + + chat = GAIM_CHAT(conv); + gtkconv = GAIM_GTK_CONVERSATION(conv); + gtkchat = gtkconv->u.chat; + + num_users = g_list_length(gaim_chat_get_users(chat)); + + g_snprintf(tmp, sizeof(tmp), + ngettext("%d person in room", "%d people in room", + num_users), + num_users); + + gtk_label_set_text(GTK_LABEL(gtkchat->count), tmp); + + for (l = users; l != NULL; l = l->next) { + pos = g_list_index(gaim_chat_get_users(chat), (char *)l->data); + + add_chat_buddy_common(conv, (char *)l->data, pos); + } +} + +static void gaim_gtkconv_chat_rename_user(GaimConversation *conv, const char *old_name, const char *new_name) { @@ -4740,6 +4771,70 @@ } static void +gaim_gtkconv_chat_remove_users(GaimConversation *conv, GList *users) +{ + GaimChat *chat; + GaimGtkConversation *gtkconv; + GaimGtkChatPane *gtkchat; + GtkTreeIter iter; + GtkTreeModel *model; + GList *names = NULL; + GList *l; + char tmp[BUF_LONG]; + int num_users; + int f = 1; + + chat = GAIM_CHAT(conv); + gtkconv = GAIM_GTK_CONVERSATION(conv); + gtkchat = gtkconv->u.chat; + + num_users = g_list_length(gaim_chat_get_users(chat)) - + g_list_length(users); + + for (l = users; l != NULL; l = l->next) { + for (names = gaim_chat_get_users(chat); + names != NULL; + names = names->next) { + + char *u = (char *)names->data; + + if (!gaim_utf8_strcasecmp(u, (char *)l->data)) { + model = gtk_tree_view_get_model(GTK_TREE_VIEW(gtkchat->list)); + + if (!gtk_tree_model_get_iter_first(GTK_TREE_MODEL(model), + &iter)) + break; + + while (f != 0) { + char *val; + + gtk_tree_model_get(GTK_TREE_MODEL(model), &iter, + 1, &val, -1); + + if (!gaim_utf8_strcasecmp((char *)l->data, val)) + gtk_list_store_remove(GTK_LIST_STORE(model), &iter); + + f = gtk_tree_model_iter_next(GTK_TREE_MODEL(model), &iter); + + g_free(val); + } + + break; + } + } + } + + if (names == NULL) + return; + + g_snprintf(tmp, sizeof(tmp), + ngettext("%d person in room", "%d people in room", + num_users), num_users); + + gtk_label_set_text(GTK_LABEL(gtkchat->count), tmp); +} + +static void gaim_gtkconv_set_title(GaimConversation *conv, const char *title) { GaimGtkConversation *gtkconv; @@ -4892,8 +4987,10 @@ gaim_gtkconv_write_im, /* write_im */ gaim_gtkconv_write_conv, /* write_conv */ gaim_gtkconv_chat_add_user, /* chat_add_user */ + gaim_gtkconv_chat_add_users, /* chat_add_users */ gaim_gtkconv_chat_rename_user, /* chat_rename_user */ gaim_gtkconv_chat_remove_user, /* chat_remove_user */ + gaim_gtkconv_chat_remove_users, /* chat_remove_users */ gaim_gtkconv_set_title, /* set_title */ NULL, /* update_progress */ gaim_gtkconv_updated /* updated */ diff -r efaff39618a5 -r ba0b99a72be2 src/protocols/irc/msgs.c --- a/src/protocols/irc/msgs.c Thu Aug 07 01:15:54 2003 +0000 +++ b/src/protocols/irc/msgs.c Thu Aug 07 20:47:29 2003 +0000 @@ -294,6 +294,8 @@ g_free(irc->nameconv); irc->nameconv = NULL; } else { + GList *users = NULL; + while (*cur) { end = strchr(cur, ' '); if (!end) @@ -301,12 +303,22 @@ if (*cur == '@' || *cur == '%' || *cur == '+') cur++; tmp = g_strndup(cur, end - cur); - gaim_chat_add_user(GAIM_CHAT(convo), tmp, NULL); - g_free(tmp); + users = g_list_append(users, tmp); cur = end; if (*cur) cur++; } + + if (users != NULL) { + GList *l; + + gaim_chat_add_users(GAIM_CHAT(convo), users); + + for (l = users; l != NULL; l = l->next) + g_free(l->data); + + g_list_free(users); + } } g_free(names); } else {