qulogic/pidgin

482ba61e5123
Parents 0f4010978378
Children 461893f76c54
IRCv3: Add an ircv3_connection_find_or_create_contact

Also use it in the privmsg handler

Testing Done:
Had people randomly send messages on twitch.

Reviewed at https://reviews.imfreedom.org/r/2830/
--- 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 @@
return conversation;
}
+
+PurpleContact *
+purple_ircv3_connection_find_or_create_contact(PurpleIRCv3Connection *connection,
+ const char *nick)
+{
+ 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);
+ }
+
+ return 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
+ * %NULL.
+ *
+ * Note that the ownership of the contact remains with the default
+ * [class@Purple.ContactManager].
+ *
+ * Returns: (transfer none) (nullable): The contact.
+ *
+ * Since: 3.0.0
+ */
+PURPLE_IRCV3_AVAILABLE_IN_ALL
+PurpleContact *purple_ircv3_connection_find_or_create_contact(PurpleIRCv3Connection *connection, const char *nick);
+
G_END_DECLS
#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 @@
gpointer data)
{
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,
- account,
- nick);
- 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. */
target = params[0];
if(!purple_ircv3_connection_is_channel(connection, target)) {
target = nick;
}
conversation = purple_ircv3_connection_find_or_create_conversation(connection,
target);
+ /* 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),
+ FALSE, NULL);
+ }
+ }
/* Grab the msgid if one was provided. */
if(g_hash_table_lookup_extended(tags, "msgid", NULL, &raw_id)) {