--- a/libpurple/protocols/ircv3/purpleircv3connection.c Sun Nov 19 00:37:50 2023 -0600
+++ b/libpurple/protocols/ircv3/purpleircv3connection.c Sun Nov 19 00:52:06 2023 -0600
@@ -794,3 +794,25 @@
+purple_ircv3_connection_find_or_create_contact(PurpleIRCv3Connection *connection, + PurpleAccount *account = NULL; + PurpleContact *contact = NULL; + PurpleContactManager *manager = NULL; + account = purple_connection_get_account(PURPLE_CONNECTION(connection)); + manager = purple_contact_manager_get_default(); + contact = purple_contact_manager_find_with_id(manager, account, nick); + if(!PURPLE_IS_CONTACT(contact)) { + contact = purple_contact_new(account, nick); + purple_contact_info_set_username(PURPLE_CONTACT_INFO(contact), nick); + purple_contact_manager_add(manager, contact); --- a/libpurple/protocols/ircv3/purpleircv3connection.h Sun Nov 19 00:37:50 2023 -0600
+++ b/libpurple/protocols/ircv3/purpleircv3connection.h Sun Nov 19 00:52:06 2023 -0600
@@ -159,6 +159,27 @@
PURPLE_IRCV3_AVAILABLE_IN_ALL
PurpleConversation *purple_ircv3_connection_find_or_create_conversation(PurpleIRCv3Connection *connection, const char *id);
+ * purple_ircv3_connection_find_or_create_contact: + * @connection: The instance. + * @nick: The nickname of the user. + * Looks for an existing contact belonging to @connection and returns it if + * found. If not a new contact will be created. + * This will only ever return %NULL if @connection is invalid or @nick is + * Note that the ownership of the contact remains with the default + * [class@Purple.ContactManager]. + * Returns: (transfer none) (nullable): The contact. +PURPLE_IRCV3_AVAILABLE_IN_ALL +PurpleContact *purple_ircv3_connection_find_or_create_contact(PurpleIRCv3Connection *connection, const char *nick); #endif /* PURPLE_IRCV3_CONNECTION_H */
--- a/libpurple/protocols/ircv3/purpleircv3messagehandlers.c Sun Nov 19 00:37:50 2023 -0600
+++ b/libpurple/protocols/ircv3/purpleircv3messagehandlers.c Sun Nov 19 00:52:06 2023 -0600
@@ -123,9 +123,7 @@
PurpleIRCv3Connection *connection = data;
- PurpleAccount *account = NULL;
PurpleContact *contact = NULL;
- PurpleContactManager *contact_manager = NULL;
PurpleConversation *conversation = NULL;
PurpleMessage *message = NULL;
PurpleMessageFlags flags = PURPLE_MESSAGE_RECV;
@@ -162,26 +160,30 @@
purple_ircv3_source_parse(source, &nick, NULL, NULL);
- account = purple_connection_get_account(PURPLE_CONNECTION(connection));
- contact_manager = purple_contact_manager_get_default();
- contact = purple_contact_manager_find_with_username(contact_manager,
- if(!PURPLE_IS_CONTACT(contact)) {
- contact = purple_contact_new(account, NULL);
- purple_contact_info_set_username(PURPLE_CONTACT_INFO(contact), nick);
- purple_contact_info_set_sid(PURPLE_CONTACT_INFO(contact), source);
- purple_contact_manager_add(contact_manager, contact);
- g_clear_object(&contact);
+ /* Find or create the conversation. */ if(!purple_ircv3_connection_is_channel(connection, target)) {
conversation = purple_ircv3_connection_find_or_create_conversation(connection,
+ /* Find or create the contact. */ + contact = purple_ircv3_connection_find_or_create_contact(connection, nick); + if(PURPLE_IS_CONTACT(contact)) { + PurpleConversationMember *member = NULL; + /* Update the contact's sid as it may have changed. */ + purple_contact_info_set_sid(PURPLE_CONTACT_INFO(contact), source); + /* Make sure the contact is in the conversation. */ + member = purple_conversation_find_member(conversation, + PURPLE_CONTACT_INFO(contact)); + if(!PURPLE_IS_CONVERSATION_MEMBER(member)) { + member = purple_conversation_add_member(conversation, + PURPLE_CONTACT_INFO(contact), /* Grab the msgid if one was provided. */
if(g_hash_table_lookup_extended(tags, "msgid", NULL, &raw_id)) {