Thu, 17 Jul 2025 20:28:54 -0500
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/
--- 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