protocols/ircv3/purpleircv3commands.c

Thu, 24 Apr 2025 22:19:39 -0500

author
Gary Kramlich <grim@reaperworld.com>
date
Thu, 24 Apr 2025 22:19:39 -0500
changeset 43242
a9bc19e23c36
parent 43126
5b5a883528e0
child 43290
01edcfbfebaa
permissions
-rw-r--r--

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 }

mercurial