protocols/ircv3/purpleircv3messagehandlers.c

Tue, 24 Sep 2024 21:33:58 -0500

author
Gary Kramlich <grim@reaperworld.com>
date
Tue, 24 Sep 2024 21:33:58 -0500
changeset 42969
4132f4d92fd7
parent 42965
37214064f381
child 42982
310d3d474f8c
permissions
-rw-r--r--

Change the version to 2.90.0 to let us do proper releases

This was accomplished by created a `purple_api_major_version` which is now used
for pkg-config names, gir namespace versions, and other stuff.

Testing Done:
Built in a clean build directory, called in the turtles, and ran from the devenv without issue. I also tried to verify the paths in the about window, but not sure if I saw everything.

Bugs closed: PIDGIN-17960

Reviewed at https://reviews.imfreedom.org/r/3525/

41796
ebe4ff278b02 Use the parser on ircv3 messages and handle pings
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
1 /*
ebe4ff278b02 Use the parser on ircv3 messages and handle pings
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
2 * Purple - Internet Messaging Library
ebe4ff278b02 Use the parser on ircv3 messages and handle pings
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
3 * Copyright (C) Pidgin Developers <devel@pidgin.im>
ebe4ff278b02 Use the parser on ircv3 messages and handle pings
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
4 *
42568
31e8c7c92e2f Make sure all of the license headers for IRCv3 are GPLv2
Gary Kramlich <grim@reaperworld.com>
parents: 42543
diff changeset
5 * Purple is the legal property of its developers, whose names are too numerous
31e8c7c92e2f Make sure all of the license headers for IRCv3 are GPLv2
Gary Kramlich <grim@reaperworld.com>
parents: 42543
diff changeset
6 * to list here. Please refer to the COPYRIGHT file distributed with this
31e8c7c92e2f Make sure all of the license headers for IRCv3 are GPLv2
Gary Kramlich <grim@reaperworld.com>
parents: 42543
diff changeset
7 * source distribution.
31e8c7c92e2f Make sure all of the license headers for IRCv3 are GPLv2
Gary Kramlich <grim@reaperworld.com>
parents: 42543
diff changeset
8 *
31e8c7c92e2f Make sure all of the license headers for IRCv3 are GPLv2
Gary Kramlich <grim@reaperworld.com>
parents: 42543
diff changeset
9 * This library is free software; you can redistribute it and/or modify
41796
ebe4ff278b02 Use the parser on ircv3 messages and handle pings
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
10 * it under the terms of the GNU General Public License as published by
ebe4ff278b02 Use the parser on ircv3 messages and handle pings
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
11 * the Free Software Foundation; either version 2 of the License, or
ebe4ff278b02 Use the parser on ircv3 messages and handle pings
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
12 * (at your option) any later version.
ebe4ff278b02 Use the parser on ircv3 messages and handle pings
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
13 *
42568
31e8c7c92e2f Make sure all of the license headers for IRCv3 are GPLv2
Gary Kramlich <grim@reaperworld.com>
parents: 42543
diff changeset
14 * This library is distributed in the hope that it will be useful,
41796
ebe4ff278b02 Use the parser on ircv3 messages and handle pings
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
ebe4ff278b02 Use the parser on ircv3 messages and handle pings
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
ebe4ff278b02 Use the parser on ircv3 messages and handle pings
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
17 * GNU General Public License for more details.
ebe4ff278b02 Use the parser on ircv3 messages and handle pings
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
18 *
ebe4ff278b02 Use the parser on ircv3 messages and handle pings
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
19 * You should have received a copy of the GNU General Public License
42568
31e8c7c92e2f Make sure all of the license headers for IRCv3 are GPLv2
Gary Kramlich <grim@reaperworld.com>
parents: 42543
diff changeset
20 * along with this library; if not, see <https://www.gnu.org/licenses/>.
41796
ebe4ff278b02 Use the parser on ircv3 messages and handle pings
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
21 */
ebe4ff278b02 Use the parser on ircv3 messages and handle pings
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
22
42275
7568bf87e388 Add a basic status window to the IRCv3 protocol plugin
Gary Kramlich <grim@reaperworld.com>
parents: 42179
diff changeset
23 #include <glib/gi18n-lib.h>
7568bf87e388 Add a basic status window to the IRCv3 protocol plugin
Gary Kramlich <grim@reaperworld.com>
parents: 42179
diff changeset
24
41796
ebe4ff278b02 Use the parser on ircv3 messages and handle pings
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
25 #include "purpleircv3messagehandlers.h"
ebe4ff278b02 Use the parser on ircv3 messages and handle pings
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
26
ebe4ff278b02 Use the parser on ircv3 messages and handle pings
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
27 #include "purpleircv3connection.h"
41807
66d473190e94 Start adding capability support to the IRCv3 protocol
Gary Kramlich <grim@reaperworld.com>
parents: 41796
diff changeset
28 #include "purpleircv3core.h"
42937
34ac8ac8c7b6 Implement CTCP VERSION response
Gary Kramlich <grim@reaperworld.com>
parents: 42926
diff changeset
29 #include "purpleircv3ctcphandlers.h"
41796
ebe4ff278b02 Use the parser on ircv3 messages and handle pings
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
30
41807
66d473190e94 Start adding capability support to the IRCv3 protocol
Gary Kramlich <grim@reaperworld.com>
parents: 41796
diff changeset
31 /******************************************************************************
42780
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
32 * Helpers
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
33 *****************************************************************************/
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
34 static void
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
35 purple_ircv3_add_contact_to_conversation(PurpleContact *contact,
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
36 PurpleConversation *conversation)
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
37 {
42893
d73c5851a773 IRCv3: Port to Purple.ConversationMembers
Gary Kramlich <grim@reaperworld.com>
parents: 42883
diff changeset
38 PurpleContactInfo *info = PURPLE_CONTACT_INFO(contact);
42780
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
39 PurpleConversationMember *member = NULL;
42893
d73c5851a773 IRCv3: Port to Purple.ConversationMembers
Gary Kramlich <grim@reaperworld.com>
parents: 42883
diff changeset
40 PurpleConversationMembers *members = NULL;
42780
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
41
42893
d73c5851a773 IRCv3: Port to Purple.ConversationMembers
Gary Kramlich <grim@reaperworld.com>
parents: 42883
diff changeset
42 members = purple_conversation_get_members(conversation);
d73c5851a773 IRCv3: Port to Purple.ConversationMembers
Gary Kramlich <grim@reaperworld.com>
parents: 42883
diff changeset
43
d73c5851a773 IRCv3: Port to Purple.ConversationMembers
Gary Kramlich <grim@reaperworld.com>
parents: 42883
diff changeset
44 member = purple_conversation_members_find_member(members, info);
42780
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
45 if(!PURPLE_IS_CONVERSATION_MEMBER(member)) {
42893
d73c5851a773 IRCv3: Port to Purple.ConversationMembers
Gary Kramlich <grim@reaperworld.com>
parents: 42883
diff changeset
46 purple_conversation_members_add_member(members, info, TRUE, NULL);
42780
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
47 }
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
48 }
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
49
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
50 /******************************************************************************
41821
ec766a6f010a Properly namespace the message handlers and reorganize them
Gary Kramlich <grim@reaperworld.com>
parents: 41815
diff changeset
51 * General Commands
ec766a6f010a Properly namespace the message handlers and reorganize them
Gary Kramlich <grim@reaperworld.com>
parents: 41815
diff changeset
52 *****************************************************************************/
ec766a6f010a Properly namespace the message handlers and reorganize them
Gary Kramlich <grim@reaperworld.com>
parents: 41815
diff changeset
53 gboolean
42780
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
54 purple_ircv3_message_handler_join(G_GNUC_UNUSED IbisClient *client,
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
55 G_GNUC_UNUSED const char *command,
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
56 IbisMessage *message,
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
57 gpointer data)
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
58 {
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
59 PurpleIRCv3Connection *connection = data;
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
60 PurpleContact *contact = NULL;
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
61 PurpleConversation *conversation = NULL;
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
62 GStrv params = NULL;
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
63 guint n_params = 0;
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
64 const char *conversation_name = NULL;
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
65
42815
95bb2ae83de7 IRCv3: Use Ibis.Message in PurpleIRCv3.Connection.find_or_create_contact
Gary Kramlich <grim@reaperworld.com>
parents: 42780
diff changeset
66 contact = purple_ircv3_connection_find_or_create_contact(connection,
95bb2ae83de7 IRCv3: Use Ibis.Message in PurpleIRCv3.Connection.find_or_create_contact
Gary Kramlich <grim@reaperworld.com>
parents: 42780
diff changeset
67 message);
42780
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
68
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
69 params = ibis_message_get_params(message);
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
70 n_params = g_strv_length(params);
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
71
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
72 /* A normal join command has the channel as the only parameter. */
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
73 if(n_params == 1) {
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
74 conversation_name = params[0];
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
75 } else {
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
76 /* TODO: write this to join to the status window saying we didn't know
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
77 * how to parse it.
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
78 */
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
79
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
80 return TRUE;
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
81 }
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
82
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
83 conversation = purple_ircv3_connection_find_or_create_conversation(connection,
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
84 conversation_name);
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
85 purple_ircv3_add_contact_to_conversation(contact, conversation);
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
86
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
87 return TRUE;
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
88 }
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
89
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
90 gboolean
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
91 purple_ircv3_message_handler_part(G_GNUC_UNUSED IbisClient *client,
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
92 G_GNUC_UNUSED const char *command,
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
93 IbisMessage *message,
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
94 gpointer data)
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
95 {
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
96 PurpleIRCv3Connection *connection = data;
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
97 PurpleAccount *account = NULL;
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
98 PurpleContact *contact = NULL;
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
99 PurpleConversation *conversation = NULL;
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
100 PurpleConversationManager *manager = NULL;
42893
d73c5851a773 IRCv3: Port to Purple.ConversationMembers
Gary Kramlich <grim@reaperworld.com>
parents: 42883
diff changeset
101 PurpleConversationMembers *members = NULL;
42780
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
102 GStrv params = NULL;
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
103 guint n_params = 0;
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
104 char *reason = NULL;
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
105 const char *conversation_name = NULL;
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
106
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
107 params = ibis_message_get_params(message);
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
108 if(g_strv_length(params) == 0) {
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
109 /* TODO: mention unparsable message in the status window. */
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
110 return TRUE;
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
111 }
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
112
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
113 /* TODO: The spec says servers _SHOULD NOT_ send a comma separated list of
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
114 * channels, but we should support that at some point just in case.
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
115 */
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
116 conversation_name = params[0];
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
117
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
118 account = purple_connection_get_account(PURPLE_CONNECTION(connection));
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
119 manager = purple_conversation_manager_get_default();
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
120 conversation = purple_conversation_manager_find_with_id(manager, account,
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
121 conversation_name);
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
122
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
123 if(!PURPLE_IS_CONVERSATION(conversation)) {
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
124 /* TODO: write status message unknown channel. */
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
125
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
126 return TRUE;
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
127 }
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
128
42893
d73c5851a773 IRCv3: Port to Purple.ConversationMembers
Gary Kramlich <grim@reaperworld.com>
parents: 42883
diff changeset
129 members = purple_conversation_get_members(conversation);
d73c5851a773 IRCv3: Port to Purple.ConversationMembers
Gary Kramlich <grim@reaperworld.com>
parents: 42883
diff changeset
130
42780
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
131 /* We do want to find or create the contact, even on a part, because we
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
132 * could have connected to a BNC and we weren't told about the contact yet.
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
133 */
42815
95bb2ae83de7 IRCv3: Use Ibis.Message in PurpleIRCv3.Connection.find_or_create_contact
Gary Kramlich <grim@reaperworld.com>
parents: 42780
diff changeset
134 contact = purple_ircv3_connection_find_or_create_contact(connection,
95bb2ae83de7 IRCv3: Use Ibis.Message in PurpleIRCv3.Connection.find_or_create_contact
Gary Kramlich <grim@reaperworld.com>
parents: 42780
diff changeset
135 message);
42780
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
136
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
137 /* If a part message was given, join the remaining parameters with a space.
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
138 */
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
139 if(n_params > 1) {
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
140 reason = g_strjoinv(" ", params + 1);
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
141 }
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
142
42893
d73c5851a773 IRCv3: Port to Purple.ConversationMembers
Gary Kramlich <grim@reaperworld.com>
parents: 42883
diff changeset
143 purple_conversation_members_remove_member(members,
d73c5851a773 IRCv3: Port to Purple.ConversationMembers
Gary Kramlich <grim@reaperworld.com>
parents: 42883
diff changeset
144 PURPLE_CONTACT_INFO(contact),
d73c5851a773 IRCv3: Port to Purple.ConversationMembers
Gary Kramlich <grim@reaperworld.com>
parents: 42883
diff changeset
145 TRUE, reason);
42780
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
146
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
147 g_clear_pointer(&reason, g_free);
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
148
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
149 return TRUE;
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
150 }
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
151
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
152 gboolean
42925
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
153 purple_ircv3_message_handler_namreply(IbisClient *client,
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
154 G_GNUC_UNUSED const char *command,
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
155 IbisMessage *message, gpointer data)
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
156 {
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
157 PurpleIRCv3Connection *connection = data;
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
158 PurpleConversation *conversation = NULL;
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
159 GStrv params = NULL;
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
160 GStrv nicks = NULL;
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
161 const char *target = NULL;
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
162
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
163 params = ibis_message_get_params(message);
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
164 if(params == NULL) {
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
165 g_warning("namreply received with no parameters");
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
166
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
167 return FALSE;
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
168 }
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
169
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
170 if(g_strv_length(params) != 4) {
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
171 char *body = g_strjoinv(" ", params);
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
172 g_warning("unknown namreply format: '%s'", body);
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
173 g_free(body);
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
174
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
175 return FALSE;
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
176 }
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
177
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
178 /* params[0] holds nick of the user and params[1] holds the channel type
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
179 * (public/private) but we don't care about either of these.
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
180 */
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
181
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
182 target = params[2];
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
183 if(!ibis_client_is_channel(client, target)) {
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
184 g_warning("received namreply for '%s' which is not a channel.",
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
185 target);
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
186
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
187 return FALSE;
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
188 }
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
189
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
190 conversation = purple_ircv3_connection_find_or_create_conversation(connection,
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
191 target);
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
192
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
193 /* Split the last parameter on space to get a list of all the nicks. */
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
194 nicks = g_strsplit(params[3], " ", -1);
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
195 if(nicks != NULL) {
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
196 PurpleAccount *account = NULL;
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
197 PurpleConnection *purple_connection = NULL;
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
198 PurpleContactManager *manager = purple_contact_manager_get_default();
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
199 PurpleConversationMembers *members = NULL;
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
200
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
201 purple_connection = PURPLE_CONNECTION(connection);
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
202 account = purple_connection_get_account(purple_connection);
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
203
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
204 members = purple_conversation_get_members(conversation);
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
205
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
206 for(guint i = 0; i < g_strv_length(nicks); i++) {
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
207 PurpleContact *contact = NULL;
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
208 const char *nick = nicks[i];
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
209 char *stripped = NULL;
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
210
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
211 stripped = ibis_client_strip_source_prefix(client, nick);
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
212
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
213 contact = purple_contact_manager_find_with_id(manager, account,
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
214 stripped);
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
215 if(!PURPLE_IS_CONTACT(contact)) {
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
216 contact = purple_contact_new(account, stripped);
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
217 purple_contact_info_set_username(PURPLE_CONTACT_INFO(contact),
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
218 stripped);
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
219 purple_contact_manager_add(manager, contact);
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
220 }
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
221
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
222 purple_conversation_members_add_member(members,
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
223 PURPLE_CONTACT_INFO(contact),
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
224 FALSE, NULL);
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
225 g_free(stripped);
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
226 }
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
227 }
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
228
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
229 g_strfreev(nicks);
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
230
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
231 return TRUE;
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
232 }
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
233
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
234 gboolean
42896
5c8f4a455d3c IRCv3: Use Ibis.Client.is_channel instead of our old version
Gary Kramlich <grim@reaperworld.com>
parents: 42893
diff changeset
235 purple_ircv3_message_handler_tagmsg(IbisClient *client,
42883
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
236 G_GNUC_UNUSED const char *command,
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
237 IbisMessage *ibis_message, gpointer data)
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
238 {
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
239 PurpleIRCv3Connection *connection = data;
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
240 PurpleContact *contact = NULL;
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
241 PurpleConversation *conversation = NULL;
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
242 GStrv params = NULL;
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
243 IbisTags *tags = NULL;
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
244 const char *target = NULL;
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
245 const char *value = NULL;
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
246
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
247 params = ibis_message_get_params(ibis_message);
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
248 tags = ibis_message_get_tags(ibis_message);
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
249
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
250 if(params == NULL) {
42920
897667cab3ce Add support for CTCP ACTION
Gary Kramlich <grim@reaperworld.com>
parents: 42896
diff changeset
251 g_warning("tagmsg received with no parameters");
42883
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
252
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
253 return FALSE;
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
254 }
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
255
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
256 if(g_strv_length(params) != 1) {
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
257 char *body = g_strjoinv(" ", params);
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
258 g_warning("unknown tagmsg message format: '%s'", body);
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
259 g_free(body);
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
260
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
261 return FALSE;
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
262 }
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
263
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
264 /* Find or create the contact. */
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
265 contact = purple_ircv3_connection_find_or_create_contact(connection,
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
266 ibis_message);
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
267
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
268 /* Find or create the conversation. */
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
269 target = params[0];
42896
5c8f4a455d3c IRCv3: Use Ibis.Client.is_channel instead of our old version
Gary Kramlich <grim@reaperworld.com>
parents: 42893
diff changeset
270 if(!ibis_client_is_channel(client, target)) {
42883
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
271 target = purple_contact_info_get_id(PURPLE_CONTACT_INFO(contact));
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
272 }
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
273
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
274 conversation = purple_ircv3_connection_find_or_create_conversation(connection,
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
275 target);
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
276
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
277 purple_ircv3_add_contact_to_conversation(contact, conversation);
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
278
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
279 /* Handle typing notifications. */
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
280 value = ibis_tags_lookup(tags, IBIS_TAG_TYPING);
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
281 if(!purple_strempty(value)) {
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
282 PurpleConversationMember *member = NULL;
42893
d73c5851a773 IRCv3: Port to Purple.ConversationMembers
Gary Kramlich <grim@reaperworld.com>
parents: 42883
diff changeset
283 PurpleConversationMembers *members = NULL;
42883
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
284 PurpleTypingState state = PURPLE_TYPING_STATE_NONE;
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
285 guint timeout = 1;
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
286
42893
d73c5851a773 IRCv3: Port to Purple.ConversationMembers
Gary Kramlich <grim@reaperworld.com>
parents: 42883
diff changeset
287 members = purple_conversation_get_members(conversation);
d73c5851a773 IRCv3: Port to Purple.ConversationMembers
Gary Kramlich <grim@reaperworld.com>
parents: 42883
diff changeset
288 member = purple_conversation_members_find_member(members,
d73c5851a773 IRCv3: Port to Purple.ConversationMembers
Gary Kramlich <grim@reaperworld.com>
parents: 42883
diff changeset
289 PURPLE_CONTACT_INFO(contact));
42883
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
290
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
291 if(purple_strequal(value, IBIS_TYPING_ACTIVE)) {
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
292 state = PURPLE_TYPING_STATE_TYPING;
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
293 timeout = 6;
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
294 } else if(purple_strequal(value, IBIS_TYPING_PAUSED)) {
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
295 state = PURPLE_TYPING_STATE_PAUSED;
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
296 timeout = 30;
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
297 }
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
298
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
299 purple_conversation_member_set_typing_state(member, state, timeout);
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
300 }
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
301
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
302 return TRUE;
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
303 }
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
304
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
305 gboolean
42896
5c8f4a455d3c IRCv3: Use Ibis.Client.is_channel instead of our old version
Gary Kramlich <grim@reaperworld.com>
parents: 42893
diff changeset
306 purple_ircv3_message_handler_privmsg(IbisClient *client, const char *command,
42769
c488d7af2923 Move the IRCv3 protocol plugin to our new Ibis library
Gary Kramlich <grim@reaperworld.com>
parents: 42652
diff changeset
307 IbisMessage *ibis_message, gpointer data)
41813
86302ce7e3c1 Add support for handling PRIVMSG and NOTICE messages from the server
Gary Kramlich <grim@reaperworld.com>
parents: 41807
diff changeset
308 {
86302ce7e3c1 Add support for handling PRIVMSG and NOTICE messages from the server
Gary Kramlich <grim@reaperworld.com>
parents: 41807
diff changeset
309 PurpleIRCv3Connection *connection = data;
86302ce7e3c1 Add support for handling PRIVMSG and NOTICE messages from the server
Gary Kramlich <grim@reaperworld.com>
parents: 41807
diff changeset
310 PurpleContact *contact = NULL;
86302ce7e3c1 Add support for handling PRIVMSG and NOTICE messages from the server
Gary Kramlich <grim@reaperworld.com>
parents: 41807
diff changeset
311 PurpleConversation *conversation = NULL;
86302ce7e3c1 Add support for handling PRIVMSG and NOTICE messages from the server
Gary Kramlich <grim@reaperworld.com>
parents: 41807
diff changeset
312 PurpleMessage *message = NULL;
42056
ced07483f66a IRCv3: Add support for the msgid specification
Gary Kramlich <grim@reaperworld.com>
parents: 42048
diff changeset
313 GDateTime *dt = NULL;
42920
897667cab3ce Add support for CTCP ACTION
Gary Kramlich <grim@reaperworld.com>
parents: 42896
diff changeset
314 IbisCTCPMessage *ctcp_message = NULL;
42769
c488d7af2923 Move the IRCv3 protocol plugin to our new Ibis library
Gary Kramlich <grim@reaperworld.com>
parents: 42652
diff changeset
315 IbisTags *tags = NULL;
42333
a34601ac633c Add PurpleIRCv3Message represent messages rather than multiple variables
Gary Kramlich <grim@reaperworld.com>
parents: 42320
diff changeset
316 GStrv params = NULL;
41813
86302ce7e3c1 Add support for handling PRIVMSG and NOTICE messages from the server
Gary Kramlich <grim@reaperworld.com>
parents: 41807
diff changeset
317 const char *target = NULL;
86302ce7e3c1 Add support for handling PRIVMSG and NOTICE messages from the server
Gary Kramlich <grim@reaperworld.com>
parents: 41807
diff changeset
318
42769
c488d7af2923 Move the IRCv3 protocol plugin to our new Ibis library
Gary Kramlich <grim@reaperworld.com>
parents: 42652
diff changeset
319 params = ibis_message_get_params(ibis_message);
42920
897667cab3ce Add support for CTCP ACTION
Gary Kramlich <grim@reaperworld.com>
parents: 42896
diff changeset
320 ctcp_message = ibis_message_get_ctcp_message(ibis_message);
42769
c488d7af2923 Move the IRCv3 protocol plugin to our new Ibis library
Gary Kramlich <grim@reaperworld.com>
parents: 42652
diff changeset
321 tags = ibis_message_get_tags(ibis_message);
42333
a34601ac633c Add PurpleIRCv3Message represent messages rather than multiple variables
Gary Kramlich <grim@reaperworld.com>
parents: 42320
diff changeset
322
42382
343e30628383 IRCv3: Fix an issue scanbuild found
Gary Kramlich <grim@reaperworld.com>
parents: 42378
diff changeset
323 if(params == NULL) {
343e30628383 IRCv3: Fix an issue scanbuild found
Gary Kramlich <grim@reaperworld.com>
parents: 42378
diff changeset
324 g_warning("privmsg received with no parameters");
343e30628383 IRCv3: Fix an issue scanbuild found
Gary Kramlich <grim@reaperworld.com>
parents: 42378
diff changeset
325
343e30628383 IRCv3: Fix an issue scanbuild found
Gary Kramlich <grim@reaperworld.com>
parents: 42378
diff changeset
326 return FALSE;
343e30628383 IRCv3: Fix an issue scanbuild found
Gary Kramlich <grim@reaperworld.com>
parents: 42378
diff changeset
327 }
343e30628383 IRCv3: Fix an issue scanbuild found
Gary Kramlich <grim@reaperworld.com>
parents: 42378
diff changeset
328
343e30628383 IRCv3: Fix an issue scanbuild found
Gary Kramlich <grim@reaperworld.com>
parents: 42378
diff changeset
329 if(g_strv_length(params) != 2) {
41813
86302ce7e3c1 Add support for handling PRIVMSG and NOTICE messages from the server
Gary Kramlich <grim@reaperworld.com>
parents: 41807
diff changeset
330 char *body = g_strjoinv(" ", params);
86302ce7e3c1 Add support for handling PRIVMSG and NOTICE messages from the server
Gary Kramlich <grim@reaperworld.com>
parents: 41807
diff changeset
331 g_warning("unknown privmsg message format: '%s'", body);
86302ce7e3c1 Add support for handling PRIVMSG and NOTICE messages from the server
Gary Kramlich <grim@reaperworld.com>
parents: 41807
diff changeset
332 g_free(body);
86302ce7e3c1 Add support for handling PRIVMSG and NOTICE messages from the server
Gary Kramlich <grim@reaperworld.com>
parents: 41807
diff changeset
333
86302ce7e3c1 Add support for handling PRIVMSG and NOTICE messages from the server
Gary Kramlich <grim@reaperworld.com>
parents: 41807
diff changeset
334 return FALSE;
86302ce7e3c1 Add support for handling PRIVMSG and NOTICE messages from the server
Gary Kramlich <grim@reaperworld.com>
parents: 41807
diff changeset
335 }
86302ce7e3c1 Add support for handling PRIVMSG and NOTICE messages from the server
Gary Kramlich <grim@reaperworld.com>
parents: 41807
diff changeset
336
42815
95bb2ae83de7 IRCv3: Use Ibis.Message in PurpleIRCv3.Connection.find_or_create_contact
Gary Kramlich <grim@reaperworld.com>
parents: 42780
diff changeset
337 /* Find or create the contact. */
95bb2ae83de7 IRCv3: Use Ibis.Message in PurpleIRCv3.Connection.find_or_create_contact
Gary Kramlich <grim@reaperworld.com>
parents: 42780
diff changeset
338 contact = purple_ircv3_connection_find_or_create_contact(connection,
95bb2ae83de7 IRCv3: Use Ibis.Message in PurpleIRCv3.Connection.find_or_create_contact
Gary Kramlich <grim@reaperworld.com>
parents: 42780
diff changeset
339 ibis_message);
42345
e01084003f50 IRCv3: Finally fix sending messages between two users
Gary Kramlich <grim@reaperworld.com>
parents: 42333
diff changeset
340
42513
482ba61e5123 IRCv3: Add an ircv3_connection_find_or_create_contact
Gary Kramlich <grim@reaperworld.com>
parents: 42510
diff changeset
341 /* Find or create the conversation. */
41813
86302ce7e3c1 Add support for handling PRIVMSG and NOTICE messages from the server
Gary Kramlich <grim@reaperworld.com>
parents: 41807
diff changeset
342 target = params[0];
42896
5c8f4a455d3c IRCv3: Use Ibis.Client.is_channel instead of our old version
Gary Kramlich <grim@reaperworld.com>
parents: 42893
diff changeset
343 if(!ibis_client_is_channel(client, target)) {
42815
95bb2ae83de7 IRCv3: Use Ibis.Message in PurpleIRCv3.Connection.find_or_create_contact
Gary Kramlich <grim@reaperworld.com>
parents: 42780
diff changeset
344 target = purple_contact_info_get_id(PURPLE_CONTACT_INFO(contact));
42345
e01084003f50 IRCv3: Finally fix sending messages between two users
Gary Kramlich <grim@reaperworld.com>
parents: 42333
diff changeset
345 }
42815
95bb2ae83de7 IRCv3: Use Ibis.Message in PurpleIRCv3.Connection.find_or_create_contact
Gary Kramlich <grim@reaperworld.com>
parents: 42780
diff changeset
346
42965
37214064f381 IRCv3: While connecting put all PRIVMSG's in the status window
Gary Kramlich <grim@reaperworld.com>
parents: 42937
diff changeset
347 if(!ibis_client_get_connected(client)) {
37214064f381 IRCv3: While connecting put all PRIVMSG's in the status window
Gary Kramlich <grim@reaperworld.com>
parents: 42937
diff changeset
348 conversation = purple_ircv3_connection_get_status_conversation(connection);
37214064f381 IRCv3: While connecting put all PRIVMSG's in the status window
Gary Kramlich <grim@reaperworld.com>
parents: 42937
diff changeset
349 } else if(IBIS_IS_CTCP_MESSAGE(ctcp_message)) {
42926
c63faf01193e Display CTCP requests in the status window
Gary Kramlich <grim@reaperworld.com>
parents: 42925
diff changeset
350 conversation = purple_ircv3_connection_get_status_conversation(connection);
c63faf01193e Display CTCP requests in the status window
Gary Kramlich <grim@reaperworld.com>
parents: 42925
diff changeset
351 } else {
c63faf01193e Display CTCP requests in the status window
Gary Kramlich <grim@reaperworld.com>
parents: 42925
diff changeset
352 conversation = purple_ircv3_connection_find_or_create_conversation(connection,
c63faf01193e Display CTCP requests in the status window
Gary Kramlich <grim@reaperworld.com>
parents: 42925
diff changeset
353 target);
c63faf01193e Display CTCP requests in the status window
Gary Kramlich <grim@reaperworld.com>
parents: 42925
diff changeset
354 }
42513
482ba61e5123 IRCv3: Add an ircv3_connection_find_or_create_contact
Gary Kramlich <grim@reaperworld.com>
parents: 42510
diff changeset
355
42780
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
356 purple_ircv3_add_contact_to_conversation(contact, conversation);
41813
86302ce7e3c1 Add support for handling PRIVMSG and NOTICE messages from the server
Gary Kramlich <grim@reaperworld.com>
parents: 41807
diff changeset
357
42920
897667cab3ce Add support for CTCP ACTION
Gary Kramlich <grim@reaperworld.com>
parents: 42896
diff changeset
358 if(IBIS_IS_CTCP_MESSAGE(ctcp_message)) {
897667cab3ce Add support for CTCP ACTION
Gary Kramlich <grim@reaperworld.com>
parents: 42896
diff changeset
359 if(ibis_ctcp_message_is_command(ctcp_message, IBIS_CTCP_ACTION)) {
897667cab3ce Add support for CTCP ACTION
Gary Kramlich <grim@reaperworld.com>
parents: 42896
diff changeset
360 GStrv ctcp_params = NULL;
897667cab3ce Add support for CTCP ACTION
Gary Kramlich <grim@reaperworld.com>
parents: 42896
diff changeset
361 char *ctcp_body = NULL;
897667cab3ce Add support for CTCP ACTION
Gary Kramlich <grim@reaperworld.com>
parents: 42896
diff changeset
362 char *stripped = NULL;
897667cab3ce Add support for CTCP ACTION
Gary Kramlich <grim@reaperworld.com>
parents: 42896
diff changeset
363
897667cab3ce Add support for CTCP ACTION
Gary Kramlich <grim@reaperworld.com>
parents: 42896
diff changeset
364 ctcp_params = ibis_ctcp_message_get_params(ctcp_message);
897667cab3ce Add support for CTCP ACTION
Gary Kramlich <grim@reaperworld.com>
parents: 42896
diff changeset
365 ctcp_body = g_strjoinv(" ", ctcp_params);
897667cab3ce Add support for CTCP ACTION
Gary Kramlich <grim@reaperworld.com>
parents: 42896
diff changeset
366 stripped = ibis_formatting_strip(ctcp_body);
897667cab3ce Add support for CTCP ACTION
Gary Kramlich <grim@reaperworld.com>
parents: 42896
diff changeset
367 g_free(ctcp_body);
897667cab3ce Add support for CTCP ACTION
Gary Kramlich <grim@reaperworld.com>
parents: 42896
diff changeset
368
897667cab3ce Add support for CTCP ACTION
Gary Kramlich <grim@reaperworld.com>
parents: 42896
diff changeset
369 message = purple_message_new(PURPLE_CONTACT_INFO(contact),
897667cab3ce Add support for CTCP ACTION
Gary Kramlich <grim@reaperworld.com>
parents: 42896
diff changeset
370 stripped);
897667cab3ce Add support for CTCP ACTION
Gary Kramlich <grim@reaperworld.com>
parents: 42896
diff changeset
371 g_free(stripped);
897667cab3ce Add support for CTCP ACTION
Gary Kramlich <grim@reaperworld.com>
parents: 42896
diff changeset
372
897667cab3ce Add support for CTCP ACTION
Gary Kramlich <grim@reaperworld.com>
parents: 42896
diff changeset
373 purple_message_set_action(message, TRUE);
42926
c63faf01193e Display CTCP requests in the status window
Gary Kramlich <grim@reaperworld.com>
parents: 42925
diff changeset
374 } else {
c63faf01193e Display CTCP requests in the status window
Gary Kramlich <grim@reaperworld.com>
parents: 42925
diff changeset
375 char *body = NULL;
c63faf01193e Display CTCP requests in the status window
Gary Kramlich <grim@reaperworld.com>
parents: 42925
diff changeset
376
c63faf01193e Display CTCP requests in the status window
Gary Kramlich <grim@reaperworld.com>
parents: 42925
diff changeset
377 body = g_strdup_printf(_("requested CTCP '%s' (to %s) from %s"),
c63faf01193e Display CTCP requests in the status window
Gary Kramlich <grim@reaperworld.com>
parents: 42925
diff changeset
378 ibis_ctcp_message_get_command(ctcp_message),
c63faf01193e Display CTCP requests in the status window
Gary Kramlich <grim@reaperworld.com>
parents: 42925
diff changeset
379 params[0],
c63faf01193e Display CTCP requests in the status window
Gary Kramlich <grim@reaperworld.com>
parents: 42925
diff changeset
380 purple_contact_info_get_id(PURPLE_CONTACT_INFO(contact)));
c63faf01193e Display CTCP requests in the status window
Gary Kramlich <grim@reaperworld.com>
parents: 42925
diff changeset
381
c63faf01193e Display CTCP requests in the status window
Gary Kramlich <grim@reaperworld.com>
parents: 42925
diff changeset
382 message = purple_message_new(PURPLE_CONTACT_INFO(contact), body);
c63faf01193e Display CTCP requests in the status window
Gary Kramlich <grim@reaperworld.com>
parents: 42925
diff changeset
383 g_free(body);
42920
897667cab3ce Add support for CTCP ACTION
Gary Kramlich <grim@reaperworld.com>
parents: 42896
diff changeset
384 }
897667cab3ce Add support for CTCP ACTION
Gary Kramlich <grim@reaperworld.com>
parents: 42896
diff changeset
385 }
897667cab3ce Add support for CTCP ACTION
Gary Kramlich <grim@reaperworld.com>
parents: 42896
diff changeset
386
897667cab3ce Add support for CTCP ACTION
Gary Kramlich <grim@reaperworld.com>
parents: 42896
diff changeset
387 if(!PURPLE_IS_MESSAGE(message)) {
897667cab3ce Add support for CTCP ACTION
Gary Kramlich <grim@reaperworld.com>
parents: 42896
diff changeset
388 char *stripped = NULL;
897667cab3ce Add support for CTCP ACTION
Gary Kramlich <grim@reaperworld.com>
parents: 42896
diff changeset
389
897667cab3ce Add support for CTCP ACTION
Gary Kramlich <grim@reaperworld.com>
parents: 42896
diff changeset
390 stripped = ibis_formatting_strip(params[1]);
897667cab3ce Add support for CTCP ACTION
Gary Kramlich <grim@reaperworld.com>
parents: 42896
diff changeset
391 message = purple_message_new(PURPLE_CONTACT_INFO(contact), stripped);
897667cab3ce Add support for CTCP ACTION
Gary Kramlich <grim@reaperworld.com>
parents: 42896
diff changeset
392 g_clear_pointer(&stripped, g_free);
897667cab3ce Add support for CTCP ACTION
Gary Kramlich <grim@reaperworld.com>
parents: 42896
diff changeset
393 }
897667cab3ce Add support for CTCP ACTION
Gary Kramlich <grim@reaperworld.com>
parents: 42896
diff changeset
394
42815
95bb2ae83de7 IRCv3: Use Ibis.Message in PurpleIRCv3.Connection.find_or_create_contact
Gary Kramlich <grim@reaperworld.com>
parents: 42780
diff changeset
395
42769
c488d7af2923 Move the IRCv3 protocol plugin to our new Ibis library
Gary Kramlich <grim@reaperworld.com>
parents: 42652
diff changeset
396 if(purple_strequal(command, IBIS_MSG_NOTICE)) {
42815
95bb2ae83de7 IRCv3: Use Ibis.Message in PurpleIRCv3.Connection.find_or_create_contact
Gary Kramlich <grim@reaperworld.com>
parents: 42780
diff changeset
397 purple_message_set_notice(message, TRUE);
41813
86302ce7e3c1 Add support for handling PRIVMSG and NOTICE messages from the server
Gary Kramlich <grim@reaperworld.com>
parents: 41807
diff changeset
398 }
86302ce7e3c1 Add support for handling PRIVMSG and NOTICE messages from the server
Gary Kramlich <grim@reaperworld.com>
parents: 41807
diff changeset
399
42775
98b71fc8a330 Only check tags if we have a tags object
Gary Kramlich <grim@reaperworld.com>
parents: 42769
diff changeset
400 if(IBIS_IS_TAGS(tags)) {
42815
95bb2ae83de7 IRCv3: Use Ibis.Message in PurpleIRCv3.Connection.find_or_create_contact
Gary Kramlich <grim@reaperworld.com>
parents: 42780
diff changeset
401 const char *raw_tag = NULL;
95bb2ae83de7 IRCv3: Use Ibis.Message in PurpleIRCv3.Connection.find_or_create_contact
Gary Kramlich <grim@reaperworld.com>
parents: 42780
diff changeset
402
42775
98b71fc8a330 Only check tags if we have a tags object
Gary Kramlich <grim@reaperworld.com>
parents: 42769
diff changeset
403 /* Grab the msgid if one was provided. */
98b71fc8a330 Only check tags if we have a tags object
Gary Kramlich <grim@reaperworld.com>
parents: 42769
diff changeset
404 raw_tag = ibis_tags_lookup(tags, "msgid");
98b71fc8a330 Only check tags if we have a tags object
Gary Kramlich <grim@reaperworld.com>
parents: 42769
diff changeset
405 if(!purple_strempty(raw_tag)) {
42815
95bb2ae83de7 IRCv3: Use Ibis.Message in PurpleIRCv3.Connection.find_or_create_contact
Gary Kramlich <grim@reaperworld.com>
parents: 42780
diff changeset
406 purple_message_set_id(message, raw_tag);
42775
98b71fc8a330 Only check tags if we have a tags object
Gary Kramlich <grim@reaperworld.com>
parents: 42769
diff changeset
407 }
42294
462317d1382d IRCv3: add support for the server-time capability
Gary Kramlich <grim@reaperworld.com>
parents: 42275
diff changeset
408
42775
98b71fc8a330 Only check tags if we have a tags object
Gary Kramlich <grim@reaperworld.com>
parents: 42769
diff changeset
409 /* Determine the timestamp of the message. */
98b71fc8a330 Only check tags if we have a tags object
Gary Kramlich <grim@reaperworld.com>
parents: 42769
diff changeset
410 raw_tag = ibis_tags_lookup(tags, "time");
98b71fc8a330 Only check tags if we have a tags object
Gary Kramlich <grim@reaperworld.com>
parents: 42769
diff changeset
411 if(!purple_strempty(raw_tag)) {
98b71fc8a330 Only check tags if we have a tags object
Gary Kramlich <grim@reaperworld.com>
parents: 42769
diff changeset
412 GTimeZone *tz = g_time_zone_new_utc();
42294
462317d1382d IRCv3: add support for the server-time capability
Gary Kramlich <grim@reaperworld.com>
parents: 42275
diff changeset
413
42775
98b71fc8a330 Only check tags if we have a tags object
Gary Kramlich <grim@reaperworld.com>
parents: 42769
diff changeset
414 dt = g_date_time_new_from_iso8601(raw_tag, tz);
42815
95bb2ae83de7 IRCv3: Use Ibis.Message in PurpleIRCv3.Connection.find_or_create_contact
Gary Kramlich <grim@reaperworld.com>
parents: 42780
diff changeset
415 g_time_zone_unref(tz);
42294
462317d1382d IRCv3: add support for the server-time capability
Gary Kramlich <grim@reaperworld.com>
parents: 42275
diff changeset
416
42815
95bb2ae83de7 IRCv3: Use Ibis.Message in PurpleIRCv3.Connection.find_or_create_contact
Gary Kramlich <grim@reaperworld.com>
parents: 42780
diff changeset
417 purple_message_set_timestamp(message, dt);
95bb2ae83de7 IRCv3: Use Ibis.Message in PurpleIRCv3.Connection.find_or_create_contact
Gary Kramlich <grim@reaperworld.com>
parents: 42780
diff changeset
418 g_date_time_unref(dt);
42775
98b71fc8a330 Only check tags if we have a tags object
Gary Kramlich <grim@reaperworld.com>
parents: 42769
diff changeset
419 }
42294
462317d1382d IRCv3: add support for the server-time capability
Gary Kramlich <grim@reaperworld.com>
parents: 42275
diff changeset
420 }
462317d1382d IRCv3: add support for the server-time capability
Gary Kramlich <grim@reaperworld.com>
parents: 42275
diff changeset
421
462317d1382d IRCv3: add support for the server-time capability
Gary Kramlich <grim@reaperworld.com>
parents: 42275
diff changeset
422 /* If the server didn't provide a time, use the current local time. */
462317d1382d IRCv3: add support for the server-time capability
Gary Kramlich <grim@reaperworld.com>
parents: 42275
diff changeset
423 if(dt == NULL) {
42815
95bb2ae83de7 IRCv3: Use Ibis.Message in PurpleIRCv3.Connection.find_or_create_contact
Gary Kramlich <grim@reaperworld.com>
parents: 42780
diff changeset
424 purple_message_set_timestamp_now(message);
42294
462317d1382d IRCv3: add support for the server-time capability
Gary Kramlich <grim@reaperworld.com>
parents: 42275
diff changeset
425 }
42056
ced07483f66a IRCv3: Add support for the msgid specification
Gary Kramlich <grim@reaperworld.com>
parents: 42048
diff changeset
426
42769
c488d7af2923 Move the IRCv3 protocol plugin to our new Ibis library
Gary Kramlich <grim@reaperworld.com>
parents: 42652
diff changeset
427 purple_conversation_write_message(conversation, message);
c488d7af2923 Move the IRCv3 protocol plugin to our new Ibis library
Gary Kramlich <grim@reaperworld.com>
parents: 42652
diff changeset
428
41813
86302ce7e3c1 Add support for handling PRIVMSG and NOTICE messages from the server
Gary Kramlich <grim@reaperworld.com>
parents: 41807
diff changeset
429 g_clear_object(&message);
86302ce7e3c1 Add support for handling PRIVMSG and NOTICE messages from the server
Gary Kramlich <grim@reaperworld.com>
parents: 41807
diff changeset
430
42937
34ac8ac8c7b6 Implement CTCP VERSION response
Gary Kramlich <grim@reaperworld.com>
parents: 42926
diff changeset
431 /* If the message contained a CTCP message and was a PRIVMSG, we then need
34ac8ac8c7b6 Implement CTCP VERSION response
Gary Kramlich <grim@reaperworld.com>
parents: 42926
diff changeset
432 * to attempt to handle it.
34ac8ac8c7b6 Implement CTCP VERSION response
Gary Kramlich <grim@reaperworld.com>
parents: 42926
diff changeset
433 */
34ac8ac8c7b6 Implement CTCP VERSION response
Gary Kramlich <grim@reaperworld.com>
parents: 42926
diff changeset
434 if(IBIS_IS_CTCP_MESSAGE(ctcp_message) &&
34ac8ac8c7b6 Implement CTCP VERSION response
Gary Kramlich <grim@reaperworld.com>
parents: 42926
diff changeset
435 purple_strequal(command, IBIS_MSG_PRIVMSG))
34ac8ac8c7b6 Implement CTCP VERSION response
Gary Kramlich <grim@reaperworld.com>
parents: 42926
diff changeset
436 {
34ac8ac8c7b6 Implement CTCP VERSION response
Gary Kramlich <grim@reaperworld.com>
parents: 42926
diff changeset
437 purple_ircv3_ctcp_handler(connection, client, ibis_message);
34ac8ac8c7b6 Implement CTCP VERSION response
Gary Kramlich <grim@reaperworld.com>
parents: 42926
diff changeset
438 }
34ac8ac8c7b6 Implement CTCP VERSION response
Gary Kramlich <grim@reaperworld.com>
parents: 42926
diff changeset
439
41813
86302ce7e3c1 Add support for handling PRIVMSG and NOTICE messages from the server
Gary Kramlich <grim@reaperworld.com>
parents: 41807
diff changeset
440 return TRUE;
86302ce7e3c1 Add support for handling PRIVMSG and NOTICE messages from the server
Gary Kramlich <grim@reaperworld.com>
parents: 41807
diff changeset
441 }
42503
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
442
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
443 gboolean
42769
c488d7af2923 Move the IRCv3 protocol plugin to our new Ibis library
Gary Kramlich <grim@reaperworld.com>
parents: 42652
diff changeset
444 purple_ircv3_message_handler_topic(G_GNUC_UNUSED IbisClient *client,
c488d7af2923 Move the IRCv3 protocol plugin to our new Ibis library
Gary Kramlich <grim@reaperworld.com>
parents: 42652
diff changeset
445 const char *command, IbisMessage *message,
42503
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
446 gpointer data)
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
447 {
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
448 PurpleIRCv3Connection *connection = data;
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
449 PurpleConversation *conversation = NULL;
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
450 GStrv params = NULL;
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
451 const char *channel = NULL;
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
452 const char *topic = NULL;
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
453 guint n_params = 0;
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
454
42769
c488d7af2923 Move the IRCv3 protocol plugin to our new Ibis library
Gary Kramlich <grim@reaperworld.com>
parents: 42652
diff changeset
455 params = ibis_message_get_params(message);
42503
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
456 n_params = g_strv_length(params);
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
457
42769
c488d7af2923 Move the IRCv3 protocol plugin to our new Ibis library
Gary Kramlich <grim@reaperworld.com>
parents: 42652
diff changeset
458 if(purple_strequal(command, IBIS_MSG_TOPIC)) {
42503
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
459 if(n_params != 2) {
42769
c488d7af2923 Move the IRCv3 protocol plugin to our new Ibis library
Gary Kramlich <grim@reaperworld.com>
parents: 42652
diff changeset
460 g_message("received TOPIC with %u parameters, expected 2",
c488d7af2923 Move the IRCv3 protocol plugin to our new Ibis library
Gary Kramlich <grim@reaperworld.com>
parents: 42652
diff changeset
461 n_params);
42503
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
462
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
463 return FALSE;
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
464 }
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
465
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
466 channel = params[0];
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
467 topic = params[1];
42769
c488d7af2923 Move the IRCv3 protocol plugin to our new Ibis library
Gary Kramlich <grim@reaperworld.com>
parents: 42652
diff changeset
468 } else if(purple_strequal(command, IBIS_RPL_NOTOPIC)) {
42503
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
469 if(n_params != 3) {
42769
c488d7af2923 Move the IRCv3 protocol plugin to our new Ibis library
Gary Kramlich <grim@reaperworld.com>
parents: 42652
diff changeset
470 g_message("received RPL_NOTOPIC with %u parameters, expected 3",
c488d7af2923 Move the IRCv3 protocol plugin to our new Ibis library
Gary Kramlich <grim@reaperworld.com>
parents: 42652
diff changeset
471 n_params);
42503
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
472
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
473 return FALSE;
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
474 }
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
475
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
476 channel = params[1];
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
477 topic = "";
42769
c488d7af2923 Move the IRCv3 protocol plugin to our new Ibis library
Gary Kramlich <grim@reaperworld.com>
parents: 42652
diff changeset
478 } else if(purple_strequal(command, IBIS_RPL_TOPIC)) {
42503
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
479 if(n_params != 3) {
42769
c488d7af2923 Move the IRCv3 protocol plugin to our new Ibis library
Gary Kramlich <grim@reaperworld.com>
parents: 42652
diff changeset
480 g_message("received RPL_TOPIC with %u parameters, expected 3",
c488d7af2923 Move the IRCv3 protocol plugin to our new Ibis library
Gary Kramlich <grim@reaperworld.com>
parents: 42652
diff changeset
481 n_params);
42503
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
482
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
483 return FALSE;
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
484 }
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
485
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
486 channel = params[1];
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
487 topic = params[2];
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
488 } else {
42769
c488d7af2923 Move the IRCv3 protocol plugin to our new Ibis library
Gary Kramlich <grim@reaperworld.com>
parents: 42652
diff changeset
489 g_message("unexpected command %s", command);
42503
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
490
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
491 return FALSE;
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
492 }
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
493
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
494 conversation = purple_ircv3_connection_find_or_create_conversation(connection,
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
495 channel);
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
496 if(!PURPLE_IS_CONVERSATION(conversation)) {
42769
c488d7af2923 Move the IRCv3 protocol plugin to our new Ibis library
Gary Kramlich <grim@reaperworld.com>
parents: 42652
diff changeset
497 g_message("failed to find or create channel '%s'", channel);
42503
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
498
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
499 return FALSE;
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
500 }
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
501
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
502 purple_conversation_set_topic(conversation, topic);
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
503
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
504 return TRUE;
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
505 }

mercurial