Add some basic event messages for membership changes

Fri, 27 Sep 2024 01:44:31 -0500

author
Gary Kramlich <grim@reaperworld.com>
date
Fri, 27 Sep 2024 01:44:31 -0500
changeset 42981
c512d4a3eda0
parent 42980
6781522ea5f3
child 42982
310d3d474f8c

Add some basic event messages for membership changes

Testing Done:
Ran with /r/3538 then connected to my local ergo and had another client join and part the conversation.

Also called in the turtles for good measure.

Bugs closed: PIDGIN-17976

Reviewed at https://reviews.imfreedom.org/r/3539/

libpurple/purpleconversation.c file | annotate | diff | comparison | revisions
--- a/libpurple/purpleconversation.c	Fri Sep 27 00:21:49 2024 -0500
+++ b/libpurple/purpleconversation.c	Fri Sep 27 01:44:31 2024 -0500
@@ -349,6 +349,76 @@
 }
 
 static void
+purple_conversation_members_member_added_cb(G_GNUC_UNUSED PurpleConversationMembers *members,
+                                            PurpleConversationMember *member,
+                                            gboolean announce,
+                                            const char *join_message,
+                                            gpointer data)
+{
+	PurpleConversation *conversation = data;
+	PurpleMessage *message = NULL;
+	char *contents = NULL;
+
+	if(!announce) {
+		return;
+	}
+
+	if(purple_strempty(join_message)) {
+		contents = g_strdup_printf(_("%s has joined the conversation"),
+		                           purple_conversation_member_get_name_for_display(member));
+	} else {
+		contents = g_strdup_printf(_("%s has joined the conversation: %s"),
+		                           purple_conversation_member_get_name_for_display(member),
+		                           join_message);
+	}
+
+	message = g_object_new(
+		PURPLE_TYPE_MESSAGE,
+		"contents", contents,
+		"event", TRUE,
+		NULL);
+
+	g_free(contents);
+
+	purple_conversation_write_message(conversation, message);
+}
+
+static void
+purple_conversation_members_member_removed_cb(G_GNUC_UNUSED PurpleConversationMembers *members,
+                                              PurpleConversationMember *member,
+                                              gboolean announce,
+                                              const char *part_message,
+                                              gpointer data)
+{
+	PurpleConversation *conversation = data;
+	PurpleMessage *message = NULL;
+	char *contents = NULL;
+
+	if(!announce) {
+		return;
+	}
+
+	if(purple_strempty(part_message)) {
+		contents = g_strdup_printf(_("%s has left the conversation"),
+		                           purple_conversation_member_get_name_for_display(member));
+	} else {
+		contents = g_strdup_printf(_("%s has left the conversation: %s"),
+		                           purple_conversation_member_get_name_for_display(member),
+		                           part_message);
+	}
+
+	message = g_object_new(
+		PURPLE_TYPE_MESSAGE,
+		"contents", contents,
+		"event", TRUE,
+		NULL);
+
+	g_free(contents);
+
+	purple_conversation_write_message(conversation, message);
+}
+
+static void
 purple_conversation_account_connected_cb(GObject *obj,
                                          G_GNUC_UNUSED GParamSpec *pspec,
                                          gpointer data)
@@ -653,6 +723,12 @@
 	g_signal_connect_object(conversation->members, "items-changed",
 	                        G_CALLBACK(purple_conversation_members_item_changed_cb),
 	                        conversation, G_CONNECT_DEFAULT);
+	g_signal_connect_object(conversation->members, "member-added",
+	                        G_CALLBACK(purple_conversation_members_member_added_cb),
+	                        conversation, G_CONNECT_DEFAULT);
+	g_signal_connect_object(conversation->members, "member-removed",
+	                        G_CALLBACK(purple_conversation_members_member_removed_cb),
+	                        conversation, G_CONNECT_DEFAULT);
 }
 
 static void

mercurial