Thu, 24 Apr 2025 22:19:39 -0500
IRCv3: check if a member is in a conversation before adding them
Awhile ago we update the NAMREPLY handler to build a separate
Purple.ConversationMembers and then splice that onto the existing one to help
with sorting and other performance issues. However, we didn't check if the
users already existed in the existing list, so we would get duplicates. This
address that.
Also fixed a reference leak.
Testing Done:
Joined a channel and sent `/quote names #channel` multiple times and verified that the member list did not grow to include a bunch of duplicates.
Reviewed at https://reviews.imfreedom.org/r/3987/
|
43097
757575456cc2
IRCv3: Implement the query command
Gary Kramlich <grim@reaperworld.com>
parents:
diff
changeset
|
1 | /* |
|
757575456cc2
IRCv3: Implement the query command
Gary Kramlich <grim@reaperworld.com>
parents:
diff
changeset
|
2 | * Purple - Internet Messaging Library |
|
757575456cc2
IRCv3: Implement the query command
Gary Kramlich <grim@reaperworld.com>
parents:
diff
changeset
|
3 | * Copyright (C) Pidgin Developers <devel@pidgin.im> |
|
757575456cc2
IRCv3: Implement the query command
Gary Kramlich <grim@reaperworld.com>
parents:
diff
changeset
|
4 | * |
|
757575456cc2
IRCv3: Implement the query command
Gary Kramlich <grim@reaperworld.com>
parents:
diff
changeset
|
5 | * Purple is the legal property of its developers, whose names are too numerous |
|
757575456cc2
IRCv3: Implement the query command
Gary Kramlich <grim@reaperworld.com>
parents:
diff
changeset
|
6 | * to list here. Please refer to the COPYRIGHT file distributed with this |
|
757575456cc2
IRCv3: Implement the query command
Gary Kramlich <grim@reaperworld.com>
parents:
diff
changeset
|
7 | * source distribution. |
|
757575456cc2
IRCv3: Implement the query command
Gary Kramlich <grim@reaperworld.com>
parents:
diff
changeset
|
8 | * |
|
757575456cc2
IRCv3: Implement the query command
Gary Kramlich <grim@reaperworld.com>
parents:
diff
changeset
|
9 | * This library is free software; you can redistribute it and/or modify |
|
757575456cc2
IRCv3: Implement the query command
Gary Kramlich <grim@reaperworld.com>
parents:
diff
changeset
|
10 | * it under the terms of the GNU General Public License as published by |
|
757575456cc2
IRCv3: Implement the query command
Gary Kramlich <grim@reaperworld.com>
parents:
diff
changeset
|
11 | * the Free Software Foundation; either version 2 of the License, or |
|
757575456cc2
IRCv3: Implement the query command
Gary Kramlich <grim@reaperworld.com>
parents:
diff
changeset
|
12 | * (at your option) any later version. |
|
757575456cc2
IRCv3: Implement the query command
Gary Kramlich <grim@reaperworld.com>
parents:
diff
changeset
|
13 | * |
|
757575456cc2
IRCv3: Implement the query command
Gary Kramlich <grim@reaperworld.com>
parents:
diff
changeset
|
14 | * This library is distributed in the hope that it will be useful, |
|
757575456cc2
IRCv3: Implement the query command
Gary Kramlich <grim@reaperworld.com>
parents:
diff
changeset
|
15 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
757575456cc2
IRCv3: Implement the query command
Gary Kramlich <grim@reaperworld.com>
parents:
diff
changeset
|
16 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
757575456cc2
IRCv3: Implement the query command
Gary Kramlich <grim@reaperworld.com>
parents:
diff
changeset
|
17 | * GNU General Public License for more details. |
|
757575456cc2
IRCv3: Implement the query command
Gary Kramlich <grim@reaperworld.com>
parents:
diff
changeset
|
18 | * |
|
757575456cc2
IRCv3: Implement the query command
Gary Kramlich <grim@reaperworld.com>
parents:
diff
changeset
|
19 | * You should have received a copy of the GNU General Public License |
|
757575456cc2
IRCv3: Implement the query command
Gary Kramlich <grim@reaperworld.com>
parents:
diff
changeset
|
20 | * along with this library; if not, see <https://www.gnu.org/licenses/>. |
|
757575456cc2
IRCv3: Implement the query command
Gary Kramlich <grim@reaperworld.com>
parents:
diff
changeset
|
21 | */ |
|
757575456cc2
IRCv3: Implement the query command
Gary Kramlich <grim@reaperworld.com>
parents:
diff
changeset
|
22 | |
|
757575456cc2
IRCv3: Implement the query command
Gary Kramlich <grim@reaperworld.com>
parents:
diff
changeset
|
23 | #include "purpleircv3commands.h" |
|
757575456cc2
IRCv3: Implement the query command
Gary Kramlich <grim@reaperworld.com>
parents:
diff
changeset
|
24 | |
|
757575456cc2
IRCv3: Implement the query command
Gary Kramlich <grim@reaperworld.com>
parents:
diff
changeset
|
25 | #include "purpleircv3connection.h" |
|
757575456cc2
IRCv3: Implement the query command
Gary Kramlich <grim@reaperworld.com>
parents:
diff
changeset
|
26 | |
|
757575456cc2
IRCv3: Implement the query command
Gary Kramlich <grim@reaperworld.com>
parents:
diff
changeset
|
27 | /****************************************************************************** |
|
757575456cc2
IRCv3: Implement the query command
Gary Kramlich <grim@reaperworld.com>
parents:
diff
changeset
|
28 | * Internal Callbacks |
|
757575456cc2
IRCv3: Implement the query command
Gary Kramlich <grim@reaperworld.com>
parents:
diff
changeset
|
29 | *****************************************************************************/ |
|
757575456cc2
IRCv3: Implement the query command
Gary Kramlich <grim@reaperworld.com>
parents:
diff
changeset
|
30 | gboolean |
|
757575456cc2
IRCv3: Implement the query command
Gary Kramlich <grim@reaperworld.com>
parents:
diff
changeset
|
31 | purple_ircv3_command_query_cb(G_GNUC_UNUSED PurpleCommand *command, |
|
757575456cc2
IRCv3: Implement the query command
Gary Kramlich <grim@reaperworld.com>
parents:
diff
changeset
|
32 | PurpleConversation *conversation, |
|
757575456cc2
IRCv3: Implement the query command
Gary Kramlich <grim@reaperworld.com>
parents:
diff
changeset
|
33 | GStrv params, |
|
757575456cc2
IRCv3: Implement the query command
Gary Kramlich <grim@reaperworld.com>
parents:
diff
changeset
|
34 | G_GNUC_UNUSED gpointer data) |
|
757575456cc2
IRCv3: Implement the query command
Gary Kramlich <grim@reaperworld.com>
parents:
diff
changeset
|
35 | { |
|
43126
5b5a883528e0
IRCv3: Add the quote command to send raw messages
Gary Kramlich <grim@reaperworld.com>
parents:
43100
diff
changeset
|
36 | PurpleIRCv3Connection *v3_connection = NULL; |
|
5b5a883528e0
IRCv3: Add the quote command to send raw messages
Gary Kramlich <grim@reaperworld.com>
parents:
43100
diff
changeset
|
37 | PurpleAccount *account = NULL; |
|
5b5a883528e0
IRCv3: Add the quote command to send raw messages
Gary Kramlich <grim@reaperworld.com>
parents:
43100
diff
changeset
|
38 | PurpleConnection *connection = NULL; |
|
5b5a883528e0
IRCv3: Add the quote command to send raw messages
Gary Kramlich <grim@reaperworld.com>
parents:
43100
diff
changeset
|
39 | PurpleConversation *new_conversation = NULL; |
|
5b5a883528e0
IRCv3: Add the quote command to send raw messages
Gary Kramlich <grim@reaperworld.com>
parents:
43100
diff
changeset
|
40 | guint n_params = 0; |
|
5b5a883528e0
IRCv3: Add the quote command to send raw messages
Gary Kramlich <grim@reaperworld.com>
parents:
43100
diff
changeset
|
41 | |
|
5b5a883528e0
IRCv3: Add the quote command to send raw messages
Gary Kramlich <grim@reaperworld.com>
parents:
43100
diff
changeset
|
42 | n_params = g_strv_length(params); |
|
5b5a883528e0
IRCv3: Add the quote command to send raw messages
Gary Kramlich <grim@reaperworld.com>
parents:
43100
diff
changeset
|
43 | if(n_params < 1) { |
|
5b5a883528e0
IRCv3: Add the quote command to send raw messages
Gary Kramlich <grim@reaperworld.com>
parents:
43100
diff
changeset
|
44 | return FALSE; |
|
5b5a883528e0
IRCv3: Add the quote command to send raw messages
Gary Kramlich <grim@reaperworld.com>
parents:
43100
diff
changeset
|
45 | } |
|
5b5a883528e0
IRCv3: Add the quote command to send raw messages
Gary Kramlich <grim@reaperworld.com>
parents:
43100
diff
changeset
|
46 | |
|
5b5a883528e0
IRCv3: Add the quote command to send raw messages
Gary Kramlich <grim@reaperworld.com>
parents:
43100
diff
changeset
|
47 | account = purple_conversation_get_account(conversation); |
|
5b5a883528e0
IRCv3: Add the quote command to send raw messages
Gary Kramlich <grim@reaperworld.com>
parents:
43100
diff
changeset
|
48 | connection = purple_account_get_connection(account); |
|
5b5a883528e0
IRCv3: Add the quote command to send raw messages
Gary Kramlich <grim@reaperworld.com>
parents:
43100
diff
changeset
|
49 | v3_connection = PURPLE_IRCV3_CONNECTION(connection); |
|
5b5a883528e0
IRCv3: Add the quote command to send raw messages
Gary Kramlich <grim@reaperworld.com>
parents:
43100
diff
changeset
|
50 | |
|
5b5a883528e0
IRCv3: Add the quote command to send raw messages
Gary Kramlich <grim@reaperworld.com>
parents:
43100
diff
changeset
|
51 | new_conversation = purple_ircv3_connection_find_or_create_conversation(v3_connection, |
|
5b5a883528e0
IRCv3: Add the quote command to send raw messages
Gary Kramlich <grim@reaperworld.com>
parents:
43100
diff
changeset
|
52 | params[0]); |
|
43097
757575456cc2
IRCv3: Implement the query command
Gary Kramlich <grim@reaperworld.com>
parents:
diff
changeset
|
53 | |
|
43126
5b5a883528e0
IRCv3: Add the quote command to send raw messages
Gary Kramlich <grim@reaperworld.com>
parents:
43100
diff
changeset
|
54 | if(n_params > 1) { |
|
5b5a883528e0
IRCv3: Add the quote command to send raw messages
Gary Kramlich <grim@reaperworld.com>
parents:
43100
diff
changeset
|
55 | PurpleMessage *message = NULL; |
|
5b5a883528e0
IRCv3: Add the quote command to send raw messages
Gary Kramlich <grim@reaperworld.com>
parents:
43100
diff
changeset
|
56 | PurpleContactInfo *info = NULL; |
|
5b5a883528e0
IRCv3: Add the quote command to send raw messages
Gary Kramlich <grim@reaperworld.com>
parents:
43100
diff
changeset
|
57 | PurpleConversationMember *member = NULL; |
|
5b5a883528e0
IRCv3: Add the quote command to send raw messages
Gary Kramlich <grim@reaperworld.com>
parents:
43100
diff
changeset
|
58 | PurpleConversationMembers *members = NULL; |
|
5b5a883528e0
IRCv3: Add the quote command to send raw messages
Gary Kramlich <grim@reaperworld.com>
parents:
43100
diff
changeset
|
59 | char *contents = NULL; |
|
43097
757575456cc2
IRCv3: Implement the query command
Gary Kramlich <grim@reaperworld.com>
parents:
diff
changeset
|
60 | |
|
43126
5b5a883528e0
IRCv3: Add the quote command to send raw messages
Gary Kramlich <grim@reaperworld.com>
parents:
43100
diff
changeset
|
61 | info = purple_account_get_contact_info(account); |
|
5b5a883528e0
IRCv3: Add the quote command to send raw messages
Gary Kramlich <grim@reaperworld.com>
parents:
43100
diff
changeset
|
62 | members = purple_conversation_get_members(conversation); |
|
5b5a883528e0
IRCv3: Add the quote command to send raw messages
Gary Kramlich <grim@reaperworld.com>
parents:
43100
diff
changeset
|
63 | member = purple_conversation_members_find_member(members, info); |
|
5b5a883528e0
IRCv3: Add the quote command to send raw messages
Gary Kramlich <grim@reaperworld.com>
parents:
43100
diff
changeset
|
64 | |
|
5b5a883528e0
IRCv3: Add the quote command to send raw messages
Gary Kramlich <grim@reaperworld.com>
parents:
43100
diff
changeset
|
65 | contents = g_strjoinv(" ", params + 1); |
|
43097
757575456cc2
IRCv3: Implement the query command
Gary Kramlich <grim@reaperworld.com>
parents:
diff
changeset
|
66 | |
|
43126
5b5a883528e0
IRCv3: Add the quote command to send raw messages
Gary Kramlich <grim@reaperworld.com>
parents:
43100
diff
changeset
|
67 | message = purple_message_new(member, contents); |
|
5b5a883528e0
IRCv3: Add the quote command to send raw messages
Gary Kramlich <grim@reaperworld.com>
parents:
43100
diff
changeset
|
68 | g_free(contents); |
|
5b5a883528e0
IRCv3: Add the quote command to send raw messages
Gary Kramlich <grim@reaperworld.com>
parents:
43100
diff
changeset
|
69 | |
|
5b5a883528e0
IRCv3: Add the quote command to send raw messages
Gary Kramlich <grim@reaperworld.com>
parents:
43100
diff
changeset
|
70 | purple_conversation_send_message_async(new_conversation, message, NULL, |
|
5b5a883528e0
IRCv3: Add the quote command to send raw messages
Gary Kramlich <grim@reaperworld.com>
parents:
43100
diff
changeset
|
71 | NULL, NULL); |
|
43097
757575456cc2
IRCv3: Implement the query command
Gary Kramlich <grim@reaperworld.com>
parents:
diff
changeset
|
72 | |
|
43126
5b5a883528e0
IRCv3: Add the quote command to send raw messages
Gary Kramlich <grim@reaperworld.com>
parents:
43100
diff
changeset
|
73 | g_clear_object(&message); |
|
5b5a883528e0
IRCv3: Add the quote command to send raw messages
Gary Kramlich <grim@reaperworld.com>
parents:
43100
diff
changeset
|
74 | } |
|
5b5a883528e0
IRCv3: Add the quote command to send raw messages
Gary Kramlich <grim@reaperworld.com>
parents:
43100
diff
changeset
|
75 | |
|
5b5a883528e0
IRCv3: Add the quote command to send raw messages
Gary Kramlich <grim@reaperworld.com>
parents:
43100
diff
changeset
|
76 | return TRUE; |
|
5b5a883528e0
IRCv3: Add the quote command to send raw messages
Gary Kramlich <grim@reaperworld.com>
parents:
43100
diff
changeset
|
77 | } |
|
43097
757575456cc2
IRCv3: Implement the query command
Gary Kramlich <grim@reaperworld.com>
parents:
diff
changeset
|
78 | |
|
43126
5b5a883528e0
IRCv3: Add the quote command to send raw messages
Gary Kramlich <grim@reaperworld.com>
parents:
43100
diff
changeset
|
79 | gboolean |
|
5b5a883528e0
IRCv3: Add the quote command to send raw messages
Gary Kramlich <grim@reaperworld.com>
parents:
43100
diff
changeset
|
80 | purple_ircv3_command_quote_cb(G_GNUC_UNUSED PurpleCommand *command, |
|
5b5a883528e0
IRCv3: Add the quote command to send raw messages
Gary Kramlich <grim@reaperworld.com>
parents:
43100
diff
changeset
|
81 | PurpleConversation *conversation, |
|
5b5a883528e0
IRCv3: Add the quote command to send raw messages
Gary Kramlich <grim@reaperworld.com>
parents:
43100
diff
changeset
|
82 | GStrv params, |
|
5b5a883528e0
IRCv3: Add the quote command to send raw messages
Gary Kramlich <grim@reaperworld.com>
parents:
43100
diff
changeset
|
83 | G_GNUC_UNUSED gpointer data) |
|
5b5a883528e0
IRCv3: Add the quote command to send raw messages
Gary Kramlich <grim@reaperworld.com>
parents:
43100
diff
changeset
|
84 | { |
|
5b5a883528e0
IRCv3: Add the quote command to send raw messages
Gary Kramlich <grim@reaperworld.com>
parents:
43100
diff
changeset
|
85 | IbisMessage *message = NULL; |
|
5b5a883528e0
IRCv3: Add the quote command to send raw messages
Gary Kramlich <grim@reaperworld.com>
parents:
43100
diff
changeset
|
86 | char *raw = NULL; |
|
5b5a883528e0
IRCv3: Add the quote command to send raw messages
Gary Kramlich <grim@reaperworld.com>
parents:
43100
diff
changeset
|
87 | |
|
5b5a883528e0
IRCv3: Add the quote command to send raw messages
Gary Kramlich <grim@reaperworld.com>
parents:
43100
diff
changeset
|
88 | raw = g_strjoinv(" ", params); |
|
5b5a883528e0
IRCv3: Add the quote command to send raw messages
Gary Kramlich <grim@reaperworld.com>
parents:
43100
diff
changeset
|
89 | message = ibis_message_parse(raw, NULL); |
|
5b5a883528e0
IRCv3: Add the quote command to send raw messages
Gary Kramlich <grim@reaperworld.com>
parents:
43100
diff
changeset
|
90 | g_free(raw); |
|
43100
e6df74d36862
Change Purple.Message:author to Purple.ConversationMember
Gary Kramlich <grim@reaperworld.com>
parents:
43097
diff
changeset
|
91 | |
|
43126
5b5a883528e0
IRCv3: Add the quote command to send raw messages
Gary Kramlich <grim@reaperworld.com>
parents:
43100
diff
changeset
|
92 | if(IBIS_IS_MESSAGE(message)) { |
|
5b5a883528e0
IRCv3: Add the quote command to send raw messages
Gary Kramlich <grim@reaperworld.com>
parents:
43100
diff
changeset
|
93 | PurpleIRCv3Connection *v3_connection = NULL; |
|
5b5a883528e0
IRCv3: Add the quote command to send raw messages
Gary Kramlich <grim@reaperworld.com>
parents:
43100
diff
changeset
|
94 | PurpleAccount *account = NULL; |
|
5b5a883528e0
IRCv3: Add the quote command to send raw messages
Gary Kramlich <grim@reaperworld.com>
parents:
43100
diff
changeset
|
95 | PurpleConnection *connection = NULL; |
|
5b5a883528e0
IRCv3: Add the quote command to send raw messages
Gary Kramlich <grim@reaperworld.com>
parents:
43100
diff
changeset
|
96 | IbisClient *client = NULL; |
|
43097
757575456cc2
IRCv3: Implement the query command
Gary Kramlich <grim@reaperworld.com>
parents:
diff
changeset
|
97 | |
|
43126
5b5a883528e0
IRCv3: Add the quote command to send raw messages
Gary Kramlich <grim@reaperworld.com>
parents:
43100
diff
changeset
|
98 | account = purple_conversation_get_account(conversation); |
|
5b5a883528e0
IRCv3: Add the quote command to send raw messages
Gary Kramlich <grim@reaperworld.com>
parents:
43100
diff
changeset
|
99 | connection = purple_account_get_connection(account); |
|
5b5a883528e0
IRCv3: Add the quote command to send raw messages
Gary Kramlich <grim@reaperworld.com>
parents:
43100
diff
changeset
|
100 | v3_connection = PURPLE_IRCV3_CONNECTION(connection); |
|
5b5a883528e0
IRCv3: Add the quote command to send raw messages
Gary Kramlich <grim@reaperworld.com>
parents:
43100
diff
changeset
|
101 | client = purple_ircv3_connection_get_client(v3_connection); |
|
43097
757575456cc2
IRCv3: Implement the query command
Gary Kramlich <grim@reaperworld.com>
parents:
diff
changeset
|
102 | |
|
43126
5b5a883528e0
IRCv3: Add the quote command to send raw messages
Gary Kramlich <grim@reaperworld.com>
parents:
43100
diff
changeset
|
103 | ibis_client_write(client, message); |
|
43097
757575456cc2
IRCv3: Implement the query command
Gary Kramlich <grim@reaperworld.com>
parents:
diff
changeset
|
104 | |
|
43126
5b5a883528e0
IRCv3: Add the quote command to send raw messages
Gary Kramlich <grim@reaperworld.com>
parents:
43100
diff
changeset
|
105 | return TRUE; |
|
5b5a883528e0
IRCv3: Add the quote command to send raw messages
Gary Kramlich <grim@reaperworld.com>
parents:
43100
diff
changeset
|
106 | } |
|
5b5a883528e0
IRCv3: Add the quote command to send raw messages
Gary Kramlich <grim@reaperworld.com>
parents:
43100
diff
changeset
|
107 | |
|
5b5a883528e0
IRCv3: Add the quote command to send raw messages
Gary Kramlich <grim@reaperworld.com>
parents:
43100
diff
changeset
|
108 | return FALSE; |
|
43097
757575456cc2
IRCv3: Implement the query command
Gary Kramlich <grim@reaperworld.com>
parents:
diff
changeset
|
109 | } |