IRCv3: Implement the /me command

Thu, 17 Jul 2025 20:28:54 -0500

author
Gary Kramlich <grim@reaperworld.com>
date
Thu, 17 Jul 2025 20:28:54 -0500
changeset 43290
01edcfbfebaa
parent 43289
b39dbed64dc0
child 43291
a14a8ae209a9

IRCv3: Implement the /me command

This was kind of forgotten about, but it's here now.

Testing Done:
Watched a packet dump to verify it was sent correct and asked people in #pidgin on libera if it came through correctly.

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

protocols/ircv3/purpleircv3commands.c file | annotate | diff | comparison | revisions
protocols/ircv3/purpleircv3commands.h file | annotate | diff | comparison | revisions
protocols/ircv3/purpleircv3protocol.c file | annotate | diff | comparison | revisions
--- a/protocols/ircv3/purpleircv3commands.c	Wed Jul 16 01:08:36 2025 -0500
+++ b/protocols/ircv3/purpleircv3commands.c	Thu Jul 17 20:28:54 2025 -0500
@@ -23,6 +23,7 @@
 #include "purpleircv3commands.h"
 
 #include "purpleircv3connection.h"
+#include "purpleircv3protocol.h"
 
 /******************************************************************************
  * Internal Callbacks
@@ -107,3 +108,42 @@
 
 	return FALSE;
 }
+
+gboolean
+purple_ircv3_command_action_cb(G_GNUC_UNUSED PurpleCommand *command,
+                              PurpleConversation *conversation,
+                              GStrv params,
+                              gpointer data)
+{
+	PurpleIRCv3Protocol *protocol = data;
+	PurpleAccount *account = NULL;
+	PurpleContactInfo *info = NULL;
+	PurpleConversationMember *author = NULL;
+	PurpleConversationMembers *members = NULL;
+	PurpleMessage *message = NULL;
+	PurpleProtocolConversation *protocol_conversation = NULL;
+	char *contents = NULL;
+
+	account = purple_conversation_get_account(conversation);
+	info = purple_account_get_contact_info(account);
+	members = purple_conversation_get_members(conversation);
+	author = purple_conversation_members_find_member(members, info);
+
+	contents = g_strjoinv(" ", params);
+	message = purple_message_new(author, contents);
+	g_free(contents);
+
+	purple_message_set_action(message, TRUE);
+
+	protocol_conversation = PURPLE_PROTOCOL_CONVERSATION(protocol);
+	purple_protocol_conversation_send_message_async(protocol_conversation,
+	                                                conversation,
+	                                                message,
+	                                                NULL,
+	                                                NULL,
+	                                                NULL);
+
+	g_clear_object(&message);
+
+	return TRUE;
+}
--- a/protocols/ircv3/purpleircv3commands.h	Wed Jul 16 01:08:36 2025 -0500
+++ b/protocols/ircv3/purpleircv3commands.h	Thu Jul 17 20:28:54 2025 -0500
@@ -36,6 +36,7 @@
 
 G_GNUC_INTERNAL gboolean purple_ircv3_command_query_cb(PurpleCommand *command, PurpleConversation *conversation, GStrv params, gpointer data);
 G_GNUC_INTERNAL gboolean purple_ircv3_command_quote_cb(PurpleCommand *command, PurpleConversation *conversation, GStrv params, gpointer data);
+G_GNUC_INTERNAL gboolean purple_ircv3_command_action_cb(PurpleCommand *command, PurpleConversation *conversation, GStrv params, gpointer data);
 
 G_END_DECLS
 
--- a/protocols/ircv3/purpleircv3protocol.c	Wed Jul 16 01:08:36 2025 -0500
+++ b/protocols/ircv3/purpleircv3protocol.c	Thu Jul 17 20:28:54 2025 -0500
@@ -253,6 +253,16 @@
 	                        G_CALLBACK(purple_ircv3_command_quote_cb),
 	                        protocol, G_CONNECT_DEFAULT);
 	purple_command_manager_add(manager, command);
+
+	command = purple_command_new("me", "IRCv3", 1000);
+	purple_command_set_summary(command,
+	                           _("Sends the text to the target as an action"));
+	tags = purple_command_get_tags(command);
+	purple_tags_add(tags, "protocol-id:" PURPLE_IRCV3_PROTOCOL_ID);
+	g_signal_connect_object(command, "executed",
+	                        G_CALLBACK(purple_ircv3_command_action_cb),
+	                        protocol, G_CONNECT_DEFAULT);
+	purple_command_manager_add(manager, command);
 }
 
 static void

mercurial