protocols/ircv3/purpleircv3messagehandlers.c

Mon, 21 Apr 2025 23:41:59 -0500

author
Gary Kramlich <grim@reaperworld.com>
date
Mon, 21 Apr 2025 23:41:59 -0500
changeset 43236
ce4987105a4e
parent 43228
6f895d255386
child 43238
58bca4467196
permissions
-rw-r--r--

IRCv3: Do a who after joining a channel

This is necessary to synchronize away states and some other stuff. This also
allows us to ignore the implicit namreply when joining a channel since the who
messages contain a superset of that information.

Testing Done:
Connected to my local ergo and look at the packet capture and verified that no namreply was sent and that the conversation member list looked correct.

Bugs closed: PIDGIN-17936

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

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
43212
d2f7c939f650 IRCv3: Handle incoming formatting
Gary Kramlich <grim@reaperworld.com>
parents: 43206
diff changeset
25 #include <pango/pango.h>
d2f7c939f650 IRCv3: Handle incoming formatting
Gary Kramlich <grim@reaperworld.com>
parents: 43206
diff changeset
26
41796
ebe4ff278b02 Use the parser on ircv3 messages and handle pings
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
27 #include "purpleircv3messagehandlers.h"
ebe4ff278b02 Use the parser on ircv3 messages and handle pings
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
28
ebe4ff278b02 Use the parser on ircv3 messages and handle pings
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
29 #include "purpleircv3connection.h"
41807
66d473190e94 Start adding capability support to the IRCv3 protocol
Gary Kramlich <grim@reaperworld.com>
parents: 41796
diff changeset
30 #include "purpleircv3core.h"
42937
34ac8ac8c7b6 Implement CTCP VERSION response
Gary Kramlich <grim@reaperworld.com>
parents: 42926
diff changeset
31 #include "purpleircv3ctcphandlers.h"
41796
ebe4ff278b02 Use the parser on ircv3 messages and handle pings
Gary Kramlich <grim@reaperworld.com>
parents:
diff changeset
32
41807
66d473190e94 Start adding capability support to the IRCv3 protocol
Gary Kramlich <grim@reaperworld.com>
parents: 41796
diff changeset
33 /******************************************************************************
42780
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
34 * Helpers
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
35 *****************************************************************************/
43100
e6df74d36862 Change Purple.Message:author to Purple.ConversationMember
Gary Kramlich <grim@reaperworld.com>
parents: 43098
diff changeset
36 static PurpleConversationMember *
42780
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
37 purple_ircv3_add_contact_to_conversation(PurpleContact *contact,
43025
2d3b2ed42f87 IRCv3: Fix pre-registration PRIVMSG not going to the status window
Gary Kramlich <grim@reaperworld.com>
parents: 43024
diff changeset
38 PurpleConversation *conversation,
2d3b2ed42f87 IRCv3: Fix pre-registration PRIVMSG not going to the status window
Gary Kramlich <grim@reaperworld.com>
parents: 43024
diff changeset
39 gboolean announce)
42780
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
40 {
42893
d73c5851a773 IRCv3: Port to Purple.ConversationMembers
Gary Kramlich <grim@reaperworld.com>
parents: 42883
diff changeset
41 PurpleContactInfo *info = PURPLE_CONTACT_INFO(contact);
42780
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
42 PurpleConversationMember *member = NULL;
42893
d73c5851a773 IRCv3: Port to Purple.ConversationMembers
Gary Kramlich <grim@reaperworld.com>
parents: 42883
diff changeset
43 PurpleConversationMembers *members = NULL;
42780
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
44
42893
d73c5851a773 IRCv3: Port to Purple.ConversationMembers
Gary Kramlich <grim@reaperworld.com>
parents: 42883
diff changeset
45 members = purple_conversation_get_members(conversation);
d73c5851a773 IRCv3: Port to Purple.ConversationMembers
Gary Kramlich <grim@reaperworld.com>
parents: 42883
diff changeset
46
d73c5851a773 IRCv3: Port to Purple.ConversationMembers
Gary Kramlich <grim@reaperworld.com>
parents: 42883
diff changeset
47 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
48 if(!PURPLE_IS_CONVERSATION_MEMBER(member)) {
43019
7621ef6ea06a IRCv3: Update the join/part reasons to match the quit format
Gary Kramlich <grim@reaperworld.com>
parents: 43015
diff changeset
49 char *message = NULL;
7621ef6ea06a IRCv3: Update the join/part reasons to match the quit format
Gary Kramlich <grim@reaperworld.com>
parents: 43015
diff changeset
50
43025
2d3b2ed42f87 IRCv3: Fix pre-registration PRIVMSG not going to the status window
Gary Kramlich <grim@reaperworld.com>
parents: 43024
diff changeset
51 if(announce) {
2d3b2ed42f87 IRCv3: Fix pre-registration PRIVMSG not going to the status window
Gary Kramlich <grim@reaperworld.com>
parents: 43024
diff changeset
52 message = g_strdup_printf(_("%s has joined %s"),
2d3b2ed42f87 IRCv3: Fix pre-registration PRIVMSG not going to the status window
Gary Kramlich <grim@reaperworld.com>
parents: 43024
diff changeset
53 purple_contact_info_get_sid(info),
2d3b2ed42f87 IRCv3: Fix pre-registration PRIVMSG not going to the status window
Gary Kramlich <grim@reaperworld.com>
parents: 43024
diff changeset
54 purple_conversation_get_title_for_display(conversation));
2d3b2ed42f87 IRCv3: Fix pre-registration PRIVMSG not going to the status window
Gary Kramlich <grim@reaperworld.com>
parents: 43024
diff changeset
55 }
2d3b2ed42f87 IRCv3: Fix pre-registration PRIVMSG not going to the status window
Gary Kramlich <grim@reaperworld.com>
parents: 43024
diff changeset
56
43100
e6df74d36862 Change Purple.Message:author to Purple.ConversationMember
Gary Kramlich <grim@reaperworld.com>
parents: 43098
diff changeset
57 member = purple_conversation_members_add_member(members, info,
e6df74d36862 Change Purple.Message:author to Purple.ConversationMember
Gary Kramlich <grim@reaperworld.com>
parents: 43098
diff changeset
58 announce, message);
43025
2d3b2ed42f87 IRCv3: Fix pre-registration PRIVMSG not going to the status window
Gary Kramlich <grim@reaperworld.com>
parents: 43024
diff changeset
59 g_clear_pointer(&message, g_free);
42780
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
60 }
43100
e6df74d36862 Change Purple.Message:author to Purple.ConversationMember
Gary Kramlich <grim@reaperworld.com>
parents: 43098
diff changeset
61
e6df74d36862 Change Purple.Message:author to Purple.ConversationMember
Gary Kramlich <grim@reaperworld.com>
parents: 43098
diff changeset
62 return member;
42780
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
63 }
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
64
43199
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
65 static PurpleBadge *
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
66 purple_ircv3_badge_for_prefix(const char prefix) {
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
67 PurpleBadge *badge = NULL;
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
68 PurpleBadgeManager *manager = NULL;
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
69 const char *description = NULL;
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
70 const char *id = NULL;
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
71 const char *mnemonic = NULL;
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
72 int priority = 0;
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
73
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
74 manager = purple_badge_manager_get_default();
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
75
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
76 switch(prefix) {
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
77 case '~':
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
78 description = _("Founder");
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
79 id = "ircv3-badge-founder";
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
80 priority = 500;
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
81 mnemonic = "~";
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
82 break;
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
83 case '&':
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
84 description = _("Protected");
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
85 id = "ircv3-badge-protected";
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
86 priority = 400;
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
87 mnemonic = "&";
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
88 break;
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
89 case '@':
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
90 description = _("Operator");
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
91 id = "ircv3-badge-operator";
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
92 priority = 300;
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
93 mnemonic = "@";
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
94 break;
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
95 case '%':
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
96 description = _("Half Operator");
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
97 id = "ircv3-badge-halfop";
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
98 priority = 200;
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
99 mnemonic = "%%";
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
100 break;
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
101 case '+':
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
102 description = _("Voice");
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
103 id = "ircv3-badge-voice";
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
104 priority = 100;
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
105 mnemonic = "+";
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
106 break;
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
107 }
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
108
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
109 if(id == NULL) {
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
110 return NULL;
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
111 }
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
112
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
113 badge = purple_badge_manager_find(manager, id);
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
114 if(!PURPLE_IS_BADGE(badge)) {
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
115 badge = purple_badge_new(id, priority, id, mnemonic);
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
116 if(!purple_strempty(description)) {
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
117 purple_badge_set_description(badge, description);
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
118 }
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
119
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
120 purple_badge_manager_add(manager, badge);
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
121
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
122 /* This is transfer none and the manager has a reference, so we unref
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
123 * our reference to the badge.
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
124 */
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
125 g_object_unref(badge);
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
126 }
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
127
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
128 return badge;
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
129 }
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
130
43102
bdddb2c34d88 IRCv3: Add badges
Gary Kramlich <grim@reaperworld.com>
parents: 43100
diff changeset
131 static void
43199
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
132 purple_ircv3_add_badge_to_member(PurpleConversationMember *member,
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
133 IbisClient *client, const char prefix)
43102
bdddb2c34d88 IRCv3: Add badges
Gary Kramlich <grim@reaperworld.com>
parents: 43100
diff changeset
134 {
43199
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
135 PurpleBadge *badge = NULL;
43102
bdddb2c34d88 IRCv3: Add badges
Gary Kramlich <grim@reaperworld.com>
parents: 43100
diff changeset
136
bdddb2c34d88 IRCv3: Add badges
Gary Kramlich <grim@reaperworld.com>
parents: 43100
diff changeset
137 g_return_if_fail(PURPLE_IS_CONVERSATION_MEMBER(member));
bdddb2c34d88 IRCv3: Add badges
Gary Kramlich <grim@reaperworld.com>
parents: 43100
diff changeset
138 g_return_if_fail(IBIS_IS_CLIENT(client));
bdddb2c34d88 IRCv3: Add badges
Gary Kramlich <grim@reaperworld.com>
parents: 43100
diff changeset
139
43199
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
140 badge = purple_ircv3_badge_for_prefix(prefix);
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
141 if(PURPLE_IS_BADGE(badge)) {
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
142 PurpleBadges *badges = NULL;
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
143
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
144 badges = purple_conversation_member_get_badges(member);
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
145 purple_badges_add_badge(badges, badge);
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
146 }
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
147 }
43102
bdddb2c34d88 IRCv3: Add badges
Gary Kramlich <grim@reaperworld.com>
parents: 43100
diff changeset
148
43199
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
149 static void
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
150 purple_ircv3_remove_badge_from_member(PurpleConversationMember *member,
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
151 IbisClient *client, const char prefix)
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
152 {
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
153 PurpleBadge *badge = NULL;
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
154
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
155 g_return_if_fail(PURPLE_IS_CONVERSATION_MEMBER(member));
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
156 g_return_if_fail(IBIS_IS_CLIENT(client));
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
157
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
158 badge = purple_ircv3_badge_for_prefix(prefix);
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
159 if(PURPLE_IS_BADGE(badge)) {
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
160 PurpleBadges *badges = purple_conversation_member_get_badges(member);
43102
bdddb2c34d88 IRCv3: Add badges
Gary Kramlich <grim@reaperworld.com>
parents: 43100
diff changeset
161
43199
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
162 /* I know this is gross, but we need to rework badges here and I wanted
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
163 * to get this done sooner rather than later.
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
164 * -- gk 2025-03-14
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
165 */
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
166 purple_badges_remove_badge(badges, purple_badge_get_id(badge));
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
167 }
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
168 }
43102
bdddb2c34d88 IRCv3: Add badges
Gary Kramlich <grim@reaperworld.com>
parents: 43100
diff changeset
169
43199
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
170 static void
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
171 purple_ircv3_add_badges_to_member(PurpleConversationMember *member,
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
172 IbisClient *client, const char *nick)
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
173 {
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
174 char *prefixes = NULL;
43102
bdddb2c34d88 IRCv3: Add badges
Gary Kramlich <grim@reaperworld.com>
parents: 43100
diff changeset
175
43199
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
176 g_return_if_fail(PURPLE_IS_CONVERSATION_MEMBER(member));
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
177 g_return_if_fail(IBIS_IS_CLIENT(client));
43184
d01d9aeec436 Add simple tool tips to badges.
Gary Kramlich <grim@reaperworld.com>
parents: 43165
diff changeset
178
43199
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
179 prefixes = ibis_client_get_source_prefix(client, nick);
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
180 if(purple_strempty(prefixes)) {
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
181 return;
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
182 }
43102
bdddb2c34d88 IRCv3: Add badges
Gary Kramlich <grim@reaperworld.com>
parents: 43100
diff changeset
183
43199
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
184 for(guint i = 0; prefixes[i] != '\0'; i++) {
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
185 purple_ircv3_add_badge_to_member(member, client, prefixes[i]);
43102
bdddb2c34d88 IRCv3: Add badges
Gary Kramlich <grim@reaperworld.com>
parents: 43100
diff changeset
186 }
bdddb2c34d88 IRCv3: Add badges
Gary Kramlich <grim@reaperworld.com>
parents: 43100
diff changeset
187
bdddb2c34d88 IRCv3: Add badges
Gary Kramlich <grim@reaperworld.com>
parents: 43100
diff changeset
188 g_free(prefixes);
bdddb2c34d88 IRCv3: Add badges
Gary Kramlich <grim@reaperworld.com>
parents: 43100
diff changeset
189 }
bdddb2c34d88 IRCv3: Add badges
Gary Kramlich <grim@reaperworld.com>
parents: 43100
diff changeset
190
42780
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
191 /******************************************************************************
41821
ec766a6f010a Properly namespace the message handlers and reorganize them
Gary Kramlich <grim@reaperworld.com>
parents: 41815
diff changeset
192 * General Commands
ec766a6f010a Properly namespace the message handlers and reorganize them
Gary Kramlich <grim@reaperworld.com>
parents: 41815
diff changeset
193 *****************************************************************************/
ec766a6f010a Properly namespace the message handlers and reorganize them
Gary Kramlich <grim@reaperworld.com>
parents: 41815
diff changeset
194 gboolean
43228
6f895d255386 IRCv3: add support for away-notify
Gary Kramlich <grim@reaperworld.com>
parents: 43226
diff changeset
195 purple_ircv3_message_handler_away(G_GNUC_UNUSED IbisClient *client,
6f895d255386 IRCv3: add support for away-notify
Gary Kramlich <grim@reaperworld.com>
parents: 43226
diff changeset
196 G_GNUC_UNUSED const char *command,
6f895d255386 IRCv3: add support for away-notify
Gary Kramlich <grim@reaperworld.com>
parents: 43226
diff changeset
197 IbisMessage *message,
6f895d255386 IRCv3: add support for away-notify
Gary Kramlich <grim@reaperworld.com>
parents: 43226
diff changeset
198 gpointer data)
6f895d255386 IRCv3: add support for away-notify
Gary Kramlich <grim@reaperworld.com>
parents: 43226
diff changeset
199 {
6f895d255386 IRCv3: add support for away-notify
Gary Kramlich <grim@reaperworld.com>
parents: 43226
diff changeset
200 PurpleIRCv3Connection *connection = data;
6f895d255386 IRCv3: add support for away-notify
Gary Kramlich <grim@reaperworld.com>
parents: 43226
diff changeset
201 PurpleContact *contact = NULL;
6f895d255386 IRCv3: add support for away-notify
Gary Kramlich <grim@reaperworld.com>
parents: 43226
diff changeset
202 PurplePresence *presence = NULL;
6f895d255386 IRCv3: add support for away-notify
Gary Kramlich <grim@reaperworld.com>
parents: 43226
diff changeset
203 GStrv params = NULL;
6f895d255386 IRCv3: add support for away-notify
Gary Kramlich <grim@reaperworld.com>
parents: 43226
diff changeset
204 char *away_message = NULL;
6f895d255386 IRCv3: add support for away-notify
Gary Kramlich <grim@reaperworld.com>
parents: 43226
diff changeset
205
6f895d255386 IRCv3: add support for away-notify
Gary Kramlich <grim@reaperworld.com>
parents: 43226
diff changeset
206 contact = purple_ircv3_connection_find_or_create_contact(connection,
6f895d255386 IRCv3: add support for away-notify
Gary Kramlich <grim@reaperworld.com>
parents: 43226
diff changeset
207 message);
6f895d255386 IRCv3: add support for away-notify
Gary Kramlich <grim@reaperworld.com>
parents: 43226
diff changeset
208
6f895d255386 IRCv3: add support for away-notify
Gary Kramlich <grim@reaperworld.com>
parents: 43226
diff changeset
209 presence = purple_contact_info_get_presence(PURPLE_CONTACT_INFO(contact));
6f895d255386 IRCv3: add support for away-notify
Gary Kramlich <grim@reaperworld.com>
parents: 43226
diff changeset
210
6f895d255386 IRCv3: add support for away-notify
Gary Kramlich <grim@reaperworld.com>
parents: 43226
diff changeset
211 /* Figure out if we have a message. */
6f895d255386 IRCv3: add support for away-notify
Gary Kramlich <grim@reaperworld.com>
parents: 43226
diff changeset
212 params = ibis_message_get_params(message);
6f895d255386 IRCv3: add support for away-notify
Gary Kramlich <grim@reaperworld.com>
parents: 43226
diff changeset
213 if(params != NULL) {
6f895d255386 IRCv3: add support for away-notify
Gary Kramlich <grim@reaperworld.com>
parents: 43226
diff changeset
214 away_message = g_strjoinv(" ", params);
6f895d255386 IRCv3: add support for away-notify
Gary Kramlich <grim@reaperworld.com>
parents: 43226
diff changeset
215 }
6f895d255386 IRCv3: add support for away-notify
Gary Kramlich <grim@reaperworld.com>
parents: 43226
diff changeset
216
6f895d255386 IRCv3: add support for away-notify
Gary Kramlich <grim@reaperworld.com>
parents: 43226
diff changeset
217 /* We have a message so we need to set it and possibly set the presence to
6f895d255386 IRCv3: add support for away-notify
Gary Kramlich <grim@reaperworld.com>
parents: 43226
diff changeset
218 * away.
6f895d255386 IRCv3: add support for away-notify
Gary Kramlich <grim@reaperworld.com>
parents: 43226
diff changeset
219 */
6f895d255386 IRCv3: add support for away-notify
Gary Kramlich <grim@reaperworld.com>
parents: 43226
diff changeset
220 if(!purple_strempty(away_message)) {
6f895d255386 IRCv3: add support for away-notify
Gary Kramlich <grim@reaperworld.com>
parents: 43226
diff changeset
221 purple_presence_set_message(presence, away_message);
6f895d255386 IRCv3: add support for away-notify
Gary Kramlich <grim@reaperworld.com>
parents: 43226
diff changeset
222
6f895d255386 IRCv3: add support for away-notify
Gary Kramlich <grim@reaperworld.com>
parents: 43226
diff changeset
223 purple_presence_set_primitive(presence,
6f895d255386 IRCv3: add support for away-notify
Gary Kramlich <grim@reaperworld.com>
parents: 43226
diff changeset
224 PURPLE_PRESENCE_PRIMITIVE_AWAY);
6f895d255386 IRCv3: add support for away-notify
Gary Kramlich <grim@reaperworld.com>
parents: 43226
diff changeset
225 } else {
6f895d255386 IRCv3: add support for away-notify
Gary Kramlich <grim@reaperworld.com>
parents: 43226
diff changeset
226 purple_presence_set_message(presence, NULL);
6f895d255386 IRCv3: add support for away-notify
Gary Kramlich <grim@reaperworld.com>
parents: 43226
diff changeset
227
6f895d255386 IRCv3: add support for away-notify
Gary Kramlich <grim@reaperworld.com>
parents: 43226
diff changeset
228 purple_presence_set_primitive(presence,
6f895d255386 IRCv3: add support for away-notify
Gary Kramlich <grim@reaperworld.com>
parents: 43226
diff changeset
229 PURPLE_PRESENCE_PRIMITIVE_AVAILABLE);
6f895d255386 IRCv3: add support for away-notify
Gary Kramlich <grim@reaperworld.com>
parents: 43226
diff changeset
230 }
6f895d255386 IRCv3: add support for away-notify
Gary Kramlich <grim@reaperworld.com>
parents: 43226
diff changeset
231
6f895d255386 IRCv3: add support for away-notify
Gary Kramlich <grim@reaperworld.com>
parents: 43226
diff changeset
232 g_clear_pointer(&away_message, g_free);
6f895d255386 IRCv3: add support for away-notify
Gary Kramlich <grim@reaperworld.com>
parents: 43226
diff changeset
233
6f895d255386 IRCv3: add support for away-notify
Gary Kramlich <grim@reaperworld.com>
parents: 43226
diff changeset
234 return TRUE;
6f895d255386 IRCv3: add support for away-notify
Gary Kramlich <grim@reaperworld.com>
parents: 43226
diff changeset
235 }
6f895d255386 IRCv3: add support for away-notify
Gary Kramlich <grim@reaperworld.com>
parents: 43226
diff changeset
236
6f895d255386 IRCv3: add support for away-notify
Gary Kramlich <grim@reaperworld.com>
parents: 43226
diff changeset
237 gboolean
43236
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
238 purple_ircv3_message_handler_join(IbisClient *client,
42780
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
239 G_GNUC_UNUSED const char *command,
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
240 IbisMessage *message,
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
241 gpointer data)
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
242 {
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
243 PurpleIRCv3Connection *connection = data;
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
244 PurpleContact *contact = NULL;
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
245 PurpleConversation *conversation = NULL;
43236
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
246 IbisMessage *who_message = NULL;
42780
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
247 GStrv params = NULL;
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
248 const char *conversation_name = NULL;
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
249
42815
95bb2ae83de7 IRCv3: Use Ibis.Message in PurpleIRCv3.Connection.find_or_create_contact
Gary Kramlich <grim@reaperworld.com>
parents: 42780
diff changeset
250 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
251 message);
42780
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
252
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
253 params = ibis_message_get_params(message);
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
254
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
255 /* A normal join command has the channel as the only parameter. */
42982
310d3d474f8c IRCv3: Fix a bug where part messages were not being parsed correctly
Gary Kramlich <grim@reaperworld.com>
parents: 42965
diff changeset
256 if(g_strv_length(params) == 1) {
42780
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
257 conversation_name = params[0];
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
258 } else {
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
259 /* 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
260 * how to parse it.
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
261 */
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
262
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
263 return TRUE;
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
264 }
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
265
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
266 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
267 conversation_name);
43025
2d3b2ed42f87 IRCv3: Fix pre-registration PRIVMSG not going to the status window
Gary Kramlich <grim@reaperworld.com>
parents: 43024
diff changeset
268 purple_ircv3_add_contact_to_conversation(contact, conversation, TRUE);
42780
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
269
43236
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
270 /* Now fire off a who message to sync the conversation. */
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
271 who_message = ibis_message_new(IBIS_MSG_WHO);
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
272 ibis_message_set_params(who_message, conversation_name, NULL);
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
273 ibis_client_write(client, who_message);
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
274
42780
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
275 return TRUE;
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
276 }
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
277
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
278 gboolean
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
279 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
280 G_GNUC_UNUSED const char *command,
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
281 IbisMessage *message,
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
282 gpointer data)
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
283 {
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
284 PurpleIRCv3Connection *connection = data;
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
285 PurpleAccount *account = NULL;
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
286 PurpleContact *contact = NULL;
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
287 PurpleConversation *conversation = NULL;
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
288 PurpleConversationManager *manager = NULL;
42893
d73c5851a773 IRCv3: Port to Purple.ConversationMembers
Gary Kramlich <grim@reaperworld.com>
parents: 42883
diff changeset
289 PurpleConversationMembers *members = NULL;
42780
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
290 GStrv params = NULL;
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
291 guint n_params = 0;
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
292 char *reason = NULL;
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
293 const char *conversation_name = NULL;
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
294
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
295 params = ibis_message_get_params(message);
42982
310d3d474f8c IRCv3: Fix a bug where part messages were not being parsed correctly
Gary Kramlich <grim@reaperworld.com>
parents: 42965
diff changeset
296 n_params = g_strv_length(params);
310d3d474f8c IRCv3: Fix a bug where part messages were not being parsed correctly
Gary Kramlich <grim@reaperworld.com>
parents: 42965
diff changeset
297 if(n_params == 0) {
42780
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
298 /* 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
299 return TRUE;
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
300 }
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
301
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
302 /* 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
303 * 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
304 */
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
305 conversation_name = params[0];
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
306
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
307 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
308 manager = purple_conversation_manager_get_default();
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
309 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
310 conversation_name);
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
311
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
312 if(!PURPLE_IS_CONVERSATION(conversation)) {
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
313 /* TODO: write status message unknown channel. */
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
314
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
315 return TRUE;
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
316 }
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
317
42893
d73c5851a773 IRCv3: Port to Purple.ConversationMembers
Gary Kramlich <grim@reaperworld.com>
parents: 42883
diff changeset
318 members = purple_conversation_get_members(conversation);
d73c5851a773 IRCv3: Port to Purple.ConversationMembers
Gary Kramlich <grim@reaperworld.com>
parents: 42883
diff changeset
319
42780
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
320 /* 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
321 * 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
322 */
42815
95bb2ae83de7 IRCv3: Use Ibis.Message in PurpleIRCv3.Connection.find_or_create_contact
Gary Kramlich <grim@reaperworld.com>
parents: 42780
diff changeset
323 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
324 message);
42780
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
325
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
326 /* 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
327 */
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
328 if(n_params > 1) {
43019
7621ef6ea06a IRCv3: Update the join/part reasons to match the quit format
Gary Kramlich <grim@reaperworld.com>
parents: 43015
diff changeset
329 char *part_message = NULL;
7621ef6ea06a IRCv3: Update the join/part reasons to match the quit format
Gary Kramlich <grim@reaperworld.com>
parents: 43015
diff changeset
330
7621ef6ea06a IRCv3: Update the join/part reasons to match the quit format
Gary Kramlich <grim@reaperworld.com>
parents: 43015
diff changeset
331 part_message = g_strjoinv(" ", params + 1);
7621ef6ea06a IRCv3: Update the join/part reasons to match the quit format
Gary Kramlich <grim@reaperworld.com>
parents: 43015
diff changeset
332 reason = g_strdup_printf(_("%s has left %s (%s)"),
7621ef6ea06a IRCv3: Update the join/part reasons to match the quit format
Gary Kramlich <grim@reaperworld.com>
parents: 43015
diff changeset
333 purple_contact_info_get_sid(PURPLE_CONTACT_INFO(contact)),
7621ef6ea06a IRCv3: Update the join/part reasons to match the quit format
Gary Kramlich <grim@reaperworld.com>
parents: 43015
diff changeset
334 purple_conversation_get_title_for_display(conversation),
7621ef6ea06a IRCv3: Update the join/part reasons to match the quit format
Gary Kramlich <grim@reaperworld.com>
parents: 43015
diff changeset
335 part_message);
7621ef6ea06a IRCv3: Update the join/part reasons to match the quit format
Gary Kramlich <grim@reaperworld.com>
parents: 43015
diff changeset
336 } else {
7621ef6ea06a IRCv3: Update the join/part reasons to match the quit format
Gary Kramlich <grim@reaperworld.com>
parents: 43015
diff changeset
337 reason = g_strdup_printf(_("%s has left %s"),
7621ef6ea06a IRCv3: Update the join/part reasons to match the quit format
Gary Kramlich <grim@reaperworld.com>
parents: 43015
diff changeset
338 purple_contact_info_get_sid(PURPLE_CONTACT_INFO(contact)),
7621ef6ea06a IRCv3: Update the join/part reasons to match the quit format
Gary Kramlich <grim@reaperworld.com>
parents: 43015
diff changeset
339 purple_conversation_get_title_for_display(conversation));
42780
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
340 }
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
341
42893
d73c5851a773 IRCv3: Port to Purple.ConversationMembers
Gary Kramlich <grim@reaperworld.com>
parents: 42883
diff changeset
342 purple_conversation_members_remove_member(members,
d73c5851a773 IRCv3: Port to Purple.ConversationMembers
Gary Kramlich <grim@reaperworld.com>
parents: 42883
diff changeset
343 PURPLE_CONTACT_INFO(contact),
d73c5851a773 IRCv3: Port to Purple.ConversationMembers
Gary Kramlich <grim@reaperworld.com>
parents: 42883
diff changeset
344 TRUE, reason);
42780
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
345
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
346 g_clear_pointer(&reason, g_free);
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
347
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
348 return TRUE;
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
349 }
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
350
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
351 gboolean
42925
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
352 purple_ircv3_message_handler_namreply(IbisClient *client,
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
353 G_GNUC_UNUSED const char *command,
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
354 IbisMessage *message, gpointer data)
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
355 {
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
356 PurpleIRCv3Connection *connection = data;
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
357 PurpleConversation *conversation = NULL;
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
358 GStrv params = NULL;
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
359 GStrv nicks = NULL;
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
360 const char *target = NULL;
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
361
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
362 params = ibis_message_get_params(message);
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
363 if(params == NULL) {
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
364 g_warning("namreply received with no parameters");
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
365
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
366 return FALSE;
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
367 }
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
368
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
369 if(g_strv_length(params) != 4) {
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
370 char *body = g_strjoinv(" ", params);
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
371 g_warning("unknown namreply format: '%s'", body);
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
372 g_free(body);
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
373
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
374 return FALSE;
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
375 }
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
376
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
377 /* 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
378 * (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
379 */
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
380
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
381 target = params[2];
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
382 if(!ibis_client_is_channel(client, target)) {
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
383 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
384 target);
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
385
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
386 return FALSE;
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
387 }
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
388
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
389 conversation = purple_ircv3_connection_find_or_create_conversation(connection,
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
390 target);
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
391
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
392 /* 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
393 nicks = g_strsplit(params[3], " ", -1);
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
394 if(nicks != NULL) {
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
395 PurpleAccount *account = NULL;
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
396 PurpleConnection *purple_connection = NULL;
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
397 PurpleContactManager *manager = purple_contact_manager_get_default();
43205
1400ae254c24 IRCv3: use Purple.ConversationMembers.extend when joining channels
Gary Kramlich <grim@reaperworld.com>
parents: 43199
diff changeset
398 PurpleConversationMembers *existing_members = NULL;
1400ae254c24 IRCv3: use Purple.ConversationMembers.extend when joining channels
Gary Kramlich <grim@reaperworld.com>
parents: 43199
diff changeset
399 PurpleConversationMembers *new_members = NULL;
43206
58f66e90f24a IRCv3: Don't add the libpurple user when joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43205
diff changeset
400 const char *active_nick = NULL;
42925
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
401
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
402 purple_connection = PURPLE_CONNECTION(connection);
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
403 account = purple_connection_get_account(purple_connection);
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
404
43205
1400ae254c24 IRCv3: use Purple.ConversationMembers.extend when joining channels
Gary Kramlich <grim@reaperworld.com>
parents: 43199
diff changeset
405 existing_members = purple_conversation_get_members(conversation);
1400ae254c24 IRCv3: use Purple.ConversationMembers.extend when joining channels
Gary Kramlich <grim@reaperworld.com>
parents: 43199
diff changeset
406 new_members = purple_conversation_members_new();
42925
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
407
43206
58f66e90f24a IRCv3: Don't add the libpurple user when joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43205
diff changeset
408 /* We don't want to add ourselves and we're already in the list. */
58f66e90f24a IRCv3: Don't add the libpurple user when joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43205
diff changeset
409 active_nick = ibis_client_get_active_nick(client);
58f66e90f24a IRCv3: Don't add the libpurple user when joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43205
diff changeset
410
42925
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
411 for(guint i = 0; i < g_strv_length(nicks); i++) {
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
412 PurpleContact *contact = NULL;
43102
bdddb2c34d88 IRCv3: Add badges
Gary Kramlich <grim@reaperworld.com>
parents: 43100
diff changeset
413 PurpleConversationMember *member = NULL;
42925
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
414 const char *nick = nicks[i];
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
415 char *stripped = NULL;
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
416
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
417 stripped = ibis_client_strip_source_prefix(client, nick);
43206
58f66e90f24a IRCv3: Don't add the libpurple user when joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43205
diff changeset
418 if(purple_strequal(stripped, active_nick)) {
58f66e90f24a IRCv3: Don't add the libpurple user when joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43205
diff changeset
419 g_free(stripped);
58f66e90f24a IRCv3: Don't add the libpurple user when joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43205
diff changeset
420
58f66e90f24a IRCv3: Don't add the libpurple user when joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43205
diff changeset
421 continue;
58f66e90f24a IRCv3: Don't add the libpurple user when joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43205
diff changeset
422 }
42925
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
423
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
424 contact = purple_contact_manager_find_with_id(manager, account,
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
425 stripped);
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
426 if(!PURPLE_IS_CONTACT(contact)) {
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
427 contact = purple_contact_new(account, stripped);
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
428 purple_contact_info_set_username(PURPLE_CONTACT_INFO(contact),
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
429 stripped);
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
430 purple_contact_manager_add(manager, contact);
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
431 }
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
432
43205
1400ae254c24 IRCv3: use Purple.ConversationMembers.extend when joining channels
Gary Kramlich <grim@reaperworld.com>
parents: 43199
diff changeset
433 member = purple_conversation_members_add_member(new_members,
43102
bdddb2c34d88 IRCv3: Add badges
Gary Kramlich <grim@reaperworld.com>
parents: 43100
diff changeset
434 PURPLE_CONTACT_INFO(contact),
bdddb2c34d88 IRCv3: Add badges
Gary Kramlich <grim@reaperworld.com>
parents: 43100
diff changeset
435 FALSE, NULL);
bdddb2c34d88 IRCv3: Add badges
Gary Kramlich <grim@reaperworld.com>
parents: 43100
diff changeset
436
bdddb2c34d88 IRCv3: Add badges
Gary Kramlich <grim@reaperworld.com>
parents: 43100
diff changeset
437 purple_ircv3_add_badges_to_member(member, client, nick);
bdddb2c34d88 IRCv3: Add badges
Gary Kramlich <grim@reaperworld.com>
parents: 43100
diff changeset
438
42925
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
439 g_free(stripped);
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
440 }
43205
1400ae254c24 IRCv3: use Purple.ConversationMembers.extend when joining channels
Gary Kramlich <grim@reaperworld.com>
parents: 43199
diff changeset
441
1400ae254c24 IRCv3: use Purple.ConversationMembers.extend when joining channels
Gary Kramlich <grim@reaperworld.com>
parents: 43199
diff changeset
442 purple_conversation_members_extend(existing_members, new_members);
42925
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
443 }
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
444
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
445 g_strfreev(nicks);
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
446
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
447 return TRUE;
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
448 }
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
449
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
450 gboolean
42896
5c8f4a455d3c IRCv3: Use Ibis.Client.is_channel instead of our old version
Gary Kramlich <grim@reaperworld.com>
parents: 42893
diff changeset
451 purple_ircv3_message_handler_tagmsg(IbisClient *client,
42883
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
452 G_GNUC_UNUSED const char *command,
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
453 IbisMessage *ibis_message, gpointer data)
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
454 {
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
455 PurpleIRCv3Connection *connection = data;
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
456 PurpleContact *contact = NULL;
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
457 PurpleConversation *conversation = NULL;
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
458 GStrv params = NULL;
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
459 IbisTags *tags = NULL;
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
460 const char *target = NULL;
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
461 const char *value = NULL;
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
462
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
463 params = ibis_message_get_params(ibis_message);
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
464 tags = ibis_message_get_tags(ibis_message);
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
465
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
466 if(params == NULL) {
42920
897667cab3ce Add support for CTCP ACTION
Gary Kramlich <grim@reaperworld.com>
parents: 42896
diff changeset
467 g_warning("tagmsg received with no parameters");
42883
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
468
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
469 return FALSE;
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
470 }
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
471
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
472 if(g_strv_length(params) != 1) {
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
473 char *body = g_strjoinv(" ", params);
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
474 g_warning("unknown tagmsg message format: '%s'", body);
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
475 g_free(body);
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
476
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
477 return FALSE;
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
478 }
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
479
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
480 /* Find or create the contact. */
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
481 contact = purple_ircv3_connection_find_or_create_contact(connection,
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
482 ibis_message);
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
483
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
484 /* Find or create the conversation. */
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
485 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
486 if(!ibis_client_is_channel(client, target)) {
42883
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
487 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
488 }
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
489
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
490 conversation = purple_ircv3_connection_find_or_create_conversation(connection,
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
491 target);
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
492
43025
2d3b2ed42f87 IRCv3: Fix pre-registration PRIVMSG not going to the status window
Gary Kramlich <grim@reaperworld.com>
parents: 43024
diff changeset
493 purple_ircv3_add_contact_to_conversation(contact, conversation, FALSE);
42883
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
494
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
495 /* Handle typing notifications. */
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
496 value = ibis_tags_lookup(tags, IBIS_TAG_TYPING);
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
497 if(!purple_strempty(value)) {
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
498 PurpleConversationMember *member = NULL;
42893
d73c5851a773 IRCv3: Port to Purple.ConversationMembers
Gary Kramlich <grim@reaperworld.com>
parents: 42883
diff changeset
499 PurpleConversationMembers *members = NULL;
42883
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
500 PurpleTypingState state = PURPLE_TYPING_STATE_NONE;
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
501 guint timeout = 1;
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
502
42893
d73c5851a773 IRCv3: Port to Purple.ConversationMembers
Gary Kramlich <grim@reaperworld.com>
parents: 42883
diff changeset
503 members = purple_conversation_get_members(conversation);
d73c5851a773 IRCv3: Port to Purple.ConversationMembers
Gary Kramlich <grim@reaperworld.com>
parents: 42883
diff changeset
504 member = purple_conversation_members_find_member(members,
d73c5851a773 IRCv3: Port to Purple.ConversationMembers
Gary Kramlich <grim@reaperworld.com>
parents: 42883
diff changeset
505 PURPLE_CONTACT_INFO(contact));
42883
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
506
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
507 if(purple_strequal(value, IBIS_TYPING_ACTIVE)) {
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
508 state = PURPLE_TYPING_STATE_TYPING;
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
509 timeout = 6;
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
510 } else if(purple_strequal(value, IBIS_TYPING_PAUSED)) {
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
511 state = PURPLE_TYPING_STATE_PAUSED;
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
512 timeout = 30;
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
513 }
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
514
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
515 purple_conversation_member_set_typing_state(member, state, timeout);
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
516 }
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
517
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
518 return TRUE;
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
519 }
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
520
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
521 gboolean
42896
5c8f4a455d3c IRCv3: Use Ibis.Client.is_channel instead of our old version
Gary Kramlich <grim@reaperworld.com>
parents: 42893
diff changeset
522 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
523 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
524 {
86302ce7e3c1 Add support for handling PRIVMSG and NOTICE messages from the server
Gary Kramlich <grim@reaperworld.com>
parents: 41807
diff changeset
525 PurpleIRCv3Connection *connection = data;
86302ce7e3c1 Add support for handling PRIVMSG and NOTICE messages from the server
Gary Kramlich <grim@reaperworld.com>
parents: 41807
diff changeset
526 PurpleContact *contact = NULL;
86302ce7e3c1 Add support for handling PRIVMSG and NOTICE messages from the server
Gary Kramlich <grim@reaperworld.com>
parents: 41807
diff changeset
527 PurpleConversation *conversation = NULL;
43100
e6df74d36862 Change Purple.Message:author to Purple.ConversationMember
Gary Kramlich <grim@reaperworld.com>
parents: 43098
diff changeset
528 PurpleConversationMember *member = NULL;
41813
86302ce7e3c1 Add support for handling PRIVMSG and NOTICE messages from the server
Gary Kramlich <grim@reaperworld.com>
parents: 41807
diff changeset
529 PurpleMessage *message = NULL;
42056
ced07483f66a IRCv3: Add support for the msgid specification
Gary Kramlich <grim@reaperworld.com>
parents: 42048
diff changeset
530 GDateTime *dt = NULL;
42920
897667cab3ce Add support for CTCP ACTION
Gary Kramlich <grim@reaperworld.com>
parents: 42896
diff changeset
531 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
532 IbisTags *tags = NULL;
42333
a34601ac633c Add PurpleIRCv3Message represent messages rather than multiple variables
Gary Kramlich <grim@reaperworld.com>
parents: 42320
diff changeset
533 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
534 const char *target = NULL;
43025
2d3b2ed42f87 IRCv3: Fix pre-registration PRIVMSG not going to the status window
Gary Kramlich <grim@reaperworld.com>
parents: 43024
diff changeset
535 gboolean announce = TRUE;
41813
86302ce7e3c1 Add support for handling PRIVMSG and NOTICE messages from the server
Gary Kramlich <grim@reaperworld.com>
parents: 41807
diff changeset
536
42769
c488d7af2923 Move the IRCv3 protocol plugin to our new Ibis library
Gary Kramlich <grim@reaperworld.com>
parents: 42652
diff changeset
537 params = ibis_message_get_params(ibis_message);
42920
897667cab3ce Add support for CTCP ACTION
Gary Kramlich <grim@reaperworld.com>
parents: 42896
diff changeset
538 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
539 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
540
42382
343e30628383 IRCv3: Fix an issue scanbuild found
Gary Kramlich <grim@reaperworld.com>
parents: 42378
diff changeset
541 if(params == NULL) {
343e30628383 IRCv3: Fix an issue scanbuild found
Gary Kramlich <grim@reaperworld.com>
parents: 42378
diff changeset
542 g_warning("privmsg received with no parameters");
343e30628383 IRCv3: Fix an issue scanbuild found
Gary Kramlich <grim@reaperworld.com>
parents: 42378
diff changeset
543
343e30628383 IRCv3: Fix an issue scanbuild found
Gary Kramlich <grim@reaperworld.com>
parents: 42378
diff changeset
544 return FALSE;
343e30628383 IRCv3: Fix an issue scanbuild found
Gary Kramlich <grim@reaperworld.com>
parents: 42378
diff changeset
545 }
343e30628383 IRCv3: Fix an issue scanbuild found
Gary Kramlich <grim@reaperworld.com>
parents: 42378
diff changeset
546
343e30628383 IRCv3: Fix an issue scanbuild found
Gary Kramlich <grim@reaperworld.com>
parents: 42378
diff changeset
547 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
548 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
549 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
550 g_free(body);
86302ce7e3c1 Add support for handling PRIVMSG and NOTICE messages from the server
Gary Kramlich <grim@reaperworld.com>
parents: 41807
diff changeset
551
86302ce7e3c1 Add support for handling PRIVMSG and NOTICE messages from the server
Gary Kramlich <grim@reaperworld.com>
parents: 41807
diff changeset
552 return FALSE;
86302ce7e3c1 Add support for handling PRIVMSG and NOTICE messages from the server
Gary Kramlich <grim@reaperworld.com>
parents: 41807
diff changeset
553 }
86302ce7e3c1 Add support for handling PRIVMSG and NOTICE messages from the server
Gary Kramlich <grim@reaperworld.com>
parents: 41807
diff changeset
554
42815
95bb2ae83de7 IRCv3: Use Ibis.Message in PurpleIRCv3.Connection.find_or_create_contact
Gary Kramlich <grim@reaperworld.com>
parents: 42780
diff changeset
555 /* 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
556 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
557 ibis_message);
42345
e01084003f50 IRCv3: Finally fix sending messages between two users
Gary Kramlich <grim@reaperworld.com>
parents: 42333
diff changeset
558
41813
86302ce7e3c1 Add support for handling PRIVMSG and NOTICE messages from the server
Gary Kramlich <grim@reaperworld.com>
parents: 41807
diff changeset
559 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
560 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
561 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
562 }
42815
95bb2ae83de7 IRCv3: Use Ibis.Message in PurpleIRCv3.Connection.find_or_create_contact
Gary Kramlich <grim@reaperworld.com>
parents: 42780
diff changeset
563
43024
8a7be63f83e4 IRCv3: Handle ERROR messages
Gary Kramlich <grim@reaperworld.com>
parents: 43019
diff changeset
564 if(!ibis_client_get_registered(client)) {
42965
37214064f381 IRCv3: While connecting put all PRIVMSG's in the status window
Gary Kramlich <grim@reaperworld.com>
parents: 42937
diff changeset
565 conversation = purple_ircv3_connection_get_status_conversation(connection);
43025
2d3b2ed42f87 IRCv3: Fix pre-registration PRIVMSG not going to the status window
Gary Kramlich <grim@reaperworld.com>
parents: 43024
diff changeset
566 announce = FALSE;
42926
c63faf01193e Display CTCP requests in the status window
Gary Kramlich <grim@reaperworld.com>
parents: 42925
diff changeset
567 }
42513
482ba61e5123 IRCv3: Add an ircv3_connection_find_or_create_contact
Gary Kramlich <grim@reaperworld.com>
parents: 42510
diff changeset
568
42920
897667cab3ce Add support for CTCP ACTION
Gary Kramlich <grim@reaperworld.com>
parents: 42896
diff changeset
569 if(IBIS_IS_CTCP_MESSAGE(ctcp_message)) {
897667cab3ce Add support for CTCP ACTION
Gary Kramlich <grim@reaperworld.com>
parents: 42896
diff changeset
570 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
571 GStrv ctcp_params = NULL;
897667cab3ce Add support for CTCP ACTION
Gary Kramlich <grim@reaperworld.com>
parents: 42896
diff changeset
572 char *ctcp_body = NULL;
897667cab3ce Add support for CTCP ACTION
Gary Kramlich <grim@reaperworld.com>
parents: 42896
diff changeset
573 char *stripped = NULL;
897667cab3ce Add support for CTCP ACTION
Gary Kramlich <grim@reaperworld.com>
parents: 42896
diff changeset
574
43225
f0ffa584435b IRCv3: Fix privmsg going to the status window before registration is complete
Gary Kramlich <grim@reaperworld.com>
parents: 43212
diff changeset
575 if(!PURPLE_IS_CONVERSATION(conversation)) {
f0ffa584435b IRCv3: Fix privmsg going to the status window before registration is complete
Gary Kramlich <grim@reaperworld.com>
parents: 43212
diff changeset
576 conversation = purple_ircv3_connection_find_or_create_conversation(connection,
f0ffa584435b IRCv3: Fix privmsg going to the status window before registration is complete
Gary Kramlich <grim@reaperworld.com>
parents: 43212
diff changeset
577 target);
f0ffa584435b IRCv3: Fix privmsg going to the status window before registration is complete
Gary Kramlich <grim@reaperworld.com>
parents: 43212
diff changeset
578 }
f0ffa584435b IRCv3: Fix privmsg going to the status window before registration is complete
Gary Kramlich <grim@reaperworld.com>
parents: 43212
diff changeset
579
43198
570996d7ad96 Fix CTCP ACTION going to the status window
Gary Kramlich <grim@reaperworld.com>
parents: 43195
diff changeset
580 member = purple_ircv3_add_contact_to_conversation(contact,
570996d7ad96 Fix CTCP ACTION going to the status window
Gary Kramlich <grim@reaperworld.com>
parents: 43195
diff changeset
581 conversation,
570996d7ad96 Fix CTCP ACTION going to the status window
Gary Kramlich <grim@reaperworld.com>
parents: 43195
diff changeset
582 announce);
570996d7ad96 Fix CTCP ACTION going to the status window
Gary Kramlich <grim@reaperworld.com>
parents: 43195
diff changeset
583
42920
897667cab3ce Add support for CTCP ACTION
Gary Kramlich <grim@reaperworld.com>
parents: 42896
diff changeset
584 ctcp_params = ibis_ctcp_message_get_params(ctcp_message);
897667cab3ce Add support for CTCP ACTION
Gary Kramlich <grim@reaperworld.com>
parents: 42896
diff changeset
585 ctcp_body = g_strjoinv(" ", ctcp_params);
897667cab3ce Add support for CTCP ACTION
Gary Kramlich <grim@reaperworld.com>
parents: 42896
diff changeset
586 stripped = ibis_formatting_strip(ctcp_body);
897667cab3ce Add support for CTCP ACTION
Gary Kramlich <grim@reaperworld.com>
parents: 42896
diff changeset
587 g_free(ctcp_body);
897667cab3ce Add support for CTCP ACTION
Gary Kramlich <grim@reaperworld.com>
parents: 42896
diff changeset
588
43100
e6df74d36862 Change Purple.Message:author to Purple.ConversationMember
Gary Kramlich <grim@reaperworld.com>
parents: 43098
diff changeset
589 message = purple_message_new(member, stripped);
42920
897667cab3ce Add support for CTCP ACTION
Gary Kramlich <grim@reaperworld.com>
parents: 42896
diff changeset
590 g_free(stripped);
897667cab3ce Add support for CTCP ACTION
Gary Kramlich <grim@reaperworld.com>
parents: 42896
diff changeset
591
897667cab3ce Add support for CTCP ACTION
Gary Kramlich <grim@reaperworld.com>
parents: 42896
diff changeset
592 purple_message_set_action(message, TRUE);
42926
c63faf01193e Display CTCP requests in the status window
Gary Kramlich <grim@reaperworld.com>
parents: 42925
diff changeset
593 } else {
c63faf01193e Display CTCP requests in the status window
Gary Kramlich <grim@reaperworld.com>
parents: 42925
diff changeset
594 char *body = NULL;
c63faf01193e Display CTCP requests in the status window
Gary Kramlich <grim@reaperworld.com>
parents: 42925
diff changeset
595
43198
570996d7ad96 Fix CTCP ACTION going to the status window
Gary Kramlich <grim@reaperworld.com>
parents: 43195
diff changeset
596 announce = FALSE;
43225
f0ffa584435b IRCv3: Fix privmsg going to the status window before registration is complete
Gary Kramlich <grim@reaperworld.com>
parents: 43212
diff changeset
597
f0ffa584435b IRCv3: Fix privmsg going to the status window before registration is complete
Gary Kramlich <grim@reaperworld.com>
parents: 43212
diff changeset
598 if(!PURPLE_IS_CONVERSATION(conversation)) {
f0ffa584435b IRCv3: Fix privmsg going to the status window before registration is complete
Gary Kramlich <grim@reaperworld.com>
parents: 43212
diff changeset
599 conversation = purple_ircv3_connection_get_status_conversation(connection);
f0ffa584435b IRCv3: Fix privmsg going to the status window before registration is complete
Gary Kramlich <grim@reaperworld.com>
parents: 43212
diff changeset
600 }
43198
570996d7ad96 Fix CTCP ACTION going to the status window
Gary Kramlich <grim@reaperworld.com>
parents: 43195
diff changeset
601 member = purple_ircv3_add_contact_to_conversation(contact,
570996d7ad96 Fix CTCP ACTION going to the status window
Gary Kramlich <grim@reaperworld.com>
parents: 43195
diff changeset
602 conversation,
570996d7ad96 Fix CTCP ACTION going to the status window
Gary Kramlich <grim@reaperworld.com>
parents: 43195
diff changeset
603 announce);
570996d7ad96 Fix CTCP ACTION going to the status window
Gary Kramlich <grim@reaperworld.com>
parents: 43195
diff changeset
604
42926
c63faf01193e Display CTCP requests in the status window
Gary Kramlich <grim@reaperworld.com>
parents: 42925
diff changeset
605 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
606 ibis_ctcp_message_get_command(ctcp_message),
c63faf01193e Display CTCP requests in the status window
Gary Kramlich <grim@reaperworld.com>
parents: 42925
diff changeset
607 params[0],
c63faf01193e Display CTCP requests in the status window
Gary Kramlich <grim@reaperworld.com>
parents: 42925
diff changeset
608 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
609
43100
e6df74d36862 Change Purple.Message:author to Purple.ConversationMember
Gary Kramlich <grim@reaperworld.com>
parents: 43098
diff changeset
610 message = purple_message_new(member, body);
43198
570996d7ad96 Fix CTCP ACTION going to the status window
Gary Kramlich <grim@reaperworld.com>
parents: 43195
diff changeset
611 purple_message_set_event(message, TRUE);
42926
c63faf01193e Display CTCP requests in the status window
Gary Kramlich <grim@reaperworld.com>
parents: 42925
diff changeset
612 g_free(body);
42920
897667cab3ce Add support for CTCP ACTION
Gary Kramlich <grim@reaperworld.com>
parents: 42896
diff changeset
613 }
43198
570996d7ad96 Fix CTCP ACTION going to the status window
Gary Kramlich <grim@reaperworld.com>
parents: 43195
diff changeset
614 } else {
43212
d2f7c939f650 IRCv3: Handle incoming formatting
Gary Kramlich <grim@reaperworld.com>
parents: 43206
diff changeset
615 PangoAttrList *attrs = NULL;
43198
570996d7ad96 Fix CTCP ACTION going to the status window
Gary Kramlich <grim@reaperworld.com>
parents: 43195
diff changeset
616 char *stripped = NULL;
42920
897667cab3ce Add support for CTCP ACTION
Gary Kramlich <grim@reaperworld.com>
parents: 42896
diff changeset
617
43225
f0ffa584435b IRCv3: Fix privmsg going to the status window before registration is complete
Gary Kramlich <grim@reaperworld.com>
parents: 43212
diff changeset
618 /* If we received this message before registration has completed,
f0ffa584435b IRCv3: Fix privmsg going to the status window before registration is complete
Gary Kramlich <grim@reaperworld.com>
parents: 43212
diff changeset
619 * conversation will be set to the status conversation.
f0ffa584435b IRCv3: Fix privmsg going to the status window before registration is complete
Gary Kramlich <grim@reaperworld.com>
parents: 43212
diff changeset
620 */
f0ffa584435b IRCv3: Fix privmsg going to the status window before registration is complete
Gary Kramlich <grim@reaperworld.com>
parents: 43212
diff changeset
621 if(!PURPLE_IS_CONVERSATION(conversation)) {
f0ffa584435b IRCv3: Fix privmsg going to the status window before registration is complete
Gary Kramlich <grim@reaperworld.com>
parents: 43212
diff changeset
622 conversation = purple_ircv3_connection_find_or_create_conversation(connection,
f0ffa584435b IRCv3: Fix privmsg going to the status window before registration is complete
Gary Kramlich <grim@reaperworld.com>
parents: 43212
diff changeset
623 target);
f0ffa584435b IRCv3: Fix privmsg going to the status window before registration is complete
Gary Kramlich <grim@reaperworld.com>
parents: 43212
diff changeset
624 }
f0ffa584435b IRCv3: Fix privmsg going to the status window before registration is complete
Gary Kramlich <grim@reaperworld.com>
parents: 43212
diff changeset
625
43198
570996d7ad96 Fix CTCP ACTION going to the status window
Gary Kramlich <grim@reaperworld.com>
parents: 43195
diff changeset
626 member = purple_ircv3_add_contact_to_conversation(contact,
570996d7ad96 Fix CTCP ACTION going to the status window
Gary Kramlich <grim@reaperworld.com>
parents: 43195
diff changeset
627 conversation,
570996d7ad96 Fix CTCP ACTION going to the status window
Gary Kramlich <grim@reaperworld.com>
parents: 43195
diff changeset
628 announce);
42920
897667cab3ce Add support for CTCP ACTION
Gary Kramlich <grim@reaperworld.com>
parents: 42896
diff changeset
629
43212
d2f7c939f650 IRCv3: Handle incoming formatting
Gary Kramlich <grim@reaperworld.com>
parents: 43206
diff changeset
630 stripped = ibis_formatting_parse(params[1], &attrs);
43100
e6df74d36862 Change Purple.Message:author to Purple.ConversationMember
Gary Kramlich <grim@reaperworld.com>
parents: 43098
diff changeset
631 message = purple_message_new(member, stripped);
43212
d2f7c939f650 IRCv3: Handle incoming formatting
Gary Kramlich <grim@reaperworld.com>
parents: 43206
diff changeset
632 purple_message_set_attributes(message, attrs);
42920
897667cab3ce Add support for CTCP ACTION
Gary Kramlich <grim@reaperworld.com>
parents: 42896
diff changeset
633 g_clear_pointer(&stripped, g_free);
43212
d2f7c939f650 IRCv3: Handle incoming formatting
Gary Kramlich <grim@reaperworld.com>
parents: 43206
diff changeset
634 g_clear_pointer(&attrs, pango_attr_list_unref);
42920
897667cab3ce Add support for CTCP ACTION
Gary Kramlich <grim@reaperworld.com>
parents: 42896
diff changeset
635 }
897667cab3ce Add support for CTCP ACTION
Gary Kramlich <grim@reaperworld.com>
parents: 42896
diff changeset
636
42769
c488d7af2923 Move the IRCv3 protocol plugin to our new Ibis library
Gary Kramlich <grim@reaperworld.com>
parents: 42652
diff changeset
637 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
638 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
639 }
86302ce7e3c1 Add support for handling PRIVMSG and NOTICE messages from the server
Gary Kramlich <grim@reaperworld.com>
parents: 41807
diff changeset
640
42775
98b71fc8a330 Only check tags if we have a tags object
Gary Kramlich <grim@reaperworld.com>
parents: 42769
diff changeset
641 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
642 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
643
42775
98b71fc8a330 Only check tags if we have a tags object
Gary Kramlich <grim@reaperworld.com>
parents: 42769
diff changeset
644 /* 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
645 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
646 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
647 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
648 }
42294
462317d1382d IRCv3: add support for the server-time capability
Gary Kramlich <grim@reaperworld.com>
parents: 42275
diff changeset
649
42775
98b71fc8a330 Only check tags if we have a tags object
Gary Kramlich <grim@reaperworld.com>
parents: 42769
diff changeset
650 /* 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
651 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
652 if(!purple_strempty(raw_tag)) {
98b71fc8a330 Only check tags if we have a tags object
Gary Kramlich <grim@reaperworld.com>
parents: 42769
diff changeset
653 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
654
42775
98b71fc8a330 Only check tags if we have a tags object
Gary Kramlich <grim@reaperworld.com>
parents: 42769
diff changeset
655 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
656 g_time_zone_unref(tz);
42294
462317d1382d IRCv3: add support for the server-time capability
Gary Kramlich <grim@reaperworld.com>
parents: 42275
diff changeset
657
42815
95bb2ae83de7 IRCv3: Use Ibis.Message in PurpleIRCv3.Connection.find_or_create_contact
Gary Kramlich <grim@reaperworld.com>
parents: 42780
diff changeset
658 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
659 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
660 }
42294
462317d1382d IRCv3: add support for the server-time capability
Gary Kramlich <grim@reaperworld.com>
parents: 42275
diff changeset
661 }
462317d1382d IRCv3: add support for the server-time capability
Gary Kramlich <grim@reaperworld.com>
parents: 42275
diff changeset
662
462317d1382d IRCv3: add support for the server-time capability
Gary Kramlich <grim@reaperworld.com>
parents: 42275
diff changeset
663 /* 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
664 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
665 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
666 }
42056
ced07483f66a IRCv3: Add support for the msgid specification
Gary Kramlich <grim@reaperworld.com>
parents: 42048
diff changeset
667
42769
c488d7af2923 Move the IRCv3 protocol plugin to our new Ibis library
Gary Kramlich <grim@reaperworld.com>
parents: 42652
diff changeset
668 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
669
41813
86302ce7e3c1 Add support for handling PRIVMSG and NOTICE messages from the server
Gary Kramlich <grim@reaperworld.com>
parents: 41807
diff changeset
670 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
671
42937
34ac8ac8c7b6 Implement CTCP VERSION response
Gary Kramlich <grim@reaperworld.com>
parents: 42926
diff changeset
672 /* 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
673 * to attempt to handle it.
34ac8ac8c7b6 Implement CTCP VERSION response
Gary Kramlich <grim@reaperworld.com>
parents: 42926
diff changeset
674 */
34ac8ac8c7b6 Implement CTCP VERSION response
Gary Kramlich <grim@reaperworld.com>
parents: 42926
diff changeset
675 if(IBIS_IS_CTCP_MESSAGE(ctcp_message) &&
34ac8ac8c7b6 Implement CTCP VERSION response
Gary Kramlich <grim@reaperworld.com>
parents: 42926
diff changeset
676 purple_strequal(command, IBIS_MSG_PRIVMSG))
34ac8ac8c7b6 Implement CTCP VERSION response
Gary Kramlich <grim@reaperworld.com>
parents: 42926
diff changeset
677 {
34ac8ac8c7b6 Implement CTCP VERSION response
Gary Kramlich <grim@reaperworld.com>
parents: 42926
diff changeset
678 purple_ircv3_ctcp_handler(connection, client, ibis_message);
34ac8ac8c7b6 Implement CTCP VERSION response
Gary Kramlich <grim@reaperworld.com>
parents: 42926
diff changeset
679 }
34ac8ac8c7b6 Implement CTCP VERSION response
Gary Kramlich <grim@reaperworld.com>
parents: 42926
diff changeset
680
41813
86302ce7e3c1 Add support for handling PRIVMSG and NOTICE messages from the server
Gary Kramlich <grim@reaperworld.com>
parents: 41807
diff changeset
681 return TRUE;
86302ce7e3c1 Add support for handling PRIVMSG and NOTICE messages from the server
Gary Kramlich <grim@reaperworld.com>
parents: 41807
diff changeset
682 }
42503
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
683
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
684 gboolean
42769
c488d7af2923 Move the IRCv3 protocol plugin to our new Ibis library
Gary Kramlich <grim@reaperworld.com>
parents: 42652
diff changeset
685 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
686 const char *command, IbisMessage *message,
42503
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
687 gpointer data)
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
688 {
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
689 PurpleIRCv3Connection *connection = data;
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
690 PurpleConversation *conversation = NULL;
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
691 GStrv params = NULL;
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
692 const char *channel = NULL;
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
693 const char *topic = NULL;
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
694 guint n_params = 0;
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
695
42769
c488d7af2923 Move the IRCv3 protocol plugin to our new Ibis library
Gary Kramlich <grim@reaperworld.com>
parents: 42652
diff changeset
696 params = ibis_message_get_params(message);
42503
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
697 n_params = g_strv_length(params);
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
698
42769
c488d7af2923 Move the IRCv3 protocol plugin to our new Ibis library
Gary Kramlich <grim@reaperworld.com>
parents: 42652
diff changeset
699 if(purple_strequal(command, IBIS_MSG_TOPIC)) {
42503
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
700 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
701 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
702 n_params);
42503
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
703
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
704 return FALSE;
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
705 }
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
706
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
707 channel = params[0];
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
708 topic = params[1];
42769
c488d7af2923 Move the IRCv3 protocol plugin to our new Ibis library
Gary Kramlich <grim@reaperworld.com>
parents: 42652
diff changeset
709 } 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
710 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
711 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
712 n_params);
42503
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
713
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
714 return FALSE;
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
715 }
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
716
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
717 channel = params[1];
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
718 topic = "";
42769
c488d7af2923 Move the IRCv3 protocol plugin to our new Ibis library
Gary Kramlich <grim@reaperworld.com>
parents: 42652
diff changeset
719 } 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
720 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
721 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
722 n_params);
42503
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
723
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
724 return FALSE;
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
725 }
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
726
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
727 channel = params[1];
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
728 topic = params[2];
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
729 } else {
42769
c488d7af2923 Move the IRCv3 protocol plugin to our new Ibis library
Gary Kramlich <grim@reaperworld.com>
parents: 42652
diff changeset
730 g_message("unexpected command %s", command);
42503
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
731
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
732 return FALSE;
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
733 }
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
734
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
735 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
736 channel);
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
737 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
738 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
739
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
740 return FALSE;
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
741 }
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
742
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
743 purple_conversation_set_topic(conversation, topic);
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
744
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
745 return TRUE;
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
746 }
43007
e61836350fce IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents: 42982
diff changeset
747
e61836350fce IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents: 42982
diff changeset
748 gboolean
e61836350fce IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents: 42982
diff changeset
749 purple_ircv3_message_handler_quit(G_GNUC_UNUSED IbisClient *client,
e61836350fce IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents: 42982
diff changeset
750 G_GNUC_UNUSED const char *command,
e61836350fce IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents: 42982
diff changeset
751 IbisMessage *ibis_message,
e61836350fce IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents: 42982
diff changeset
752 gpointer data)
e61836350fce IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents: 42982
diff changeset
753 {
e61836350fce IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents: 42982
diff changeset
754 PurpleIRCv3Connection *connection = data;
e61836350fce IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents: 42982
diff changeset
755 PurpleContact *contact = NULL;
e61836350fce IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents: 42982
diff changeset
756 PurpleContactInfo *info = NULL;
e61836350fce IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents: 42982
diff changeset
757 PurpleConversationManager *manager = NULL;
43226
300f85971e83 IRCv3: Set the presence to offline when we receive a quit message
Gary Kramlich <grim@reaperworld.com>
parents: 43225
diff changeset
758 PurplePresence *presence = NULL;
43007
e61836350fce IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents: 42982
diff changeset
759 GList *conversations = NULL;
e61836350fce IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents: 42982
diff changeset
760 GStrv params = NULL;
e61836350fce IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents: 42982
diff changeset
761 guint n_params = 0;
e61836350fce IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents: 42982
diff changeset
762 char *message = NULL;
43226
300f85971e83 IRCv3: Set the presence to offline when we receive a quit message
Gary Kramlich <grim@reaperworld.com>
parents: 43225
diff changeset
763 char *reason = NULL;
43007
e61836350fce IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents: 42982
diff changeset
764
e61836350fce IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents: 42982
diff changeset
765 params = ibis_message_get_params(ibis_message);
e61836350fce IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents: 42982
diff changeset
766 n_params = g_strv_length(params);
e61836350fce IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents: 42982
diff changeset
767
e61836350fce IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents: 42982
diff changeset
768 contact = purple_ircv3_connection_find_or_create_contact(connection,
e61836350fce IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents: 42982
diff changeset
769 ibis_message);
e61836350fce IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents: 42982
diff changeset
770 info = PURPLE_CONTACT_INFO(contact);
e61836350fce IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents: 42982
diff changeset
771
e61836350fce IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents: 42982
diff changeset
772 if(n_params > 0) {
e61836350fce IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents: 42982
diff changeset
773 reason = g_strjoinv(" ", params);
e61836350fce IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents: 42982
diff changeset
774 message = g_strdup_printf("%s has quit (%s)",
e61836350fce IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents: 42982
diff changeset
775 purple_contact_info_get_sid(info),
e61836350fce IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents: 42982
diff changeset
776 reason);
e61836350fce IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents: 42982
diff changeset
777 } else {
e61836350fce IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents: 42982
diff changeset
778 message = g_strdup_printf("%s has quit",
e61836350fce IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents: 42982
diff changeset
779 purple_contact_info_get_sid(info));
e61836350fce IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents: 42982
diff changeset
780 }
e61836350fce IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents: 42982
diff changeset
781
43226
300f85971e83 IRCv3: Set the presence to offline when we receive a quit message
Gary Kramlich <grim@reaperworld.com>
parents: 43225
diff changeset
782 /* Update the presence to offline and if they provided a quit message, set
300f85971e83 IRCv3: Set the presence to offline when we receive a quit message
Gary Kramlich <grim@reaperworld.com>
parents: 43225
diff changeset
783 * it as the presence message.
300f85971e83 IRCv3: Set the presence to offline when we receive a quit message
Gary Kramlich <grim@reaperworld.com>
parents: 43225
diff changeset
784 */
300f85971e83 IRCv3: Set the presence to offline when we receive a quit message
Gary Kramlich <grim@reaperworld.com>
parents: 43225
diff changeset
785 presence = purple_contact_info_get_presence(PURPLE_CONTACT_INFO(contact));
300f85971e83 IRCv3: Set the presence to offline when we receive a quit message
Gary Kramlich <grim@reaperworld.com>
parents: 43225
diff changeset
786 purple_presence_set_message(presence, reason);
300f85971e83 IRCv3: Set the presence to offline when we receive a quit message
Gary Kramlich <grim@reaperworld.com>
parents: 43225
diff changeset
787 purple_presence_set_primitive(presence, PURPLE_PRESENCE_PRIMITIVE_OFFLINE);
300f85971e83 IRCv3: Set the presence to offline when we receive a quit message
Gary Kramlich <grim@reaperworld.com>
parents: 43225
diff changeset
788
43007
e61836350fce IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents: 42982
diff changeset
789 manager = purple_conversation_manager_get_default();
e61836350fce IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents: 42982
diff changeset
790 conversations = purple_conversation_manager_get_all(manager);
e61836350fce IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents: 42982
diff changeset
791 while(conversations != NULL) {
e61836350fce IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents: 42982
diff changeset
792 PurpleConversation *conversation = conversations->data;
e61836350fce IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents: 42982
diff changeset
793 PurpleConversationMembers *members = NULL;
e61836350fce IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents: 42982
diff changeset
794
e61836350fce IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents: 42982
diff changeset
795 members = purple_conversation_get_members(conversation);
e61836350fce IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents: 42982
diff changeset
796 purple_conversation_members_remove_member(members, info, TRUE,
e61836350fce IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents: 42982
diff changeset
797 message);
e61836350fce IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents: 42982
diff changeset
798
e61836350fce IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents: 42982
diff changeset
799 conversations = g_list_delete_link(conversations, conversations);
e61836350fce IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents: 42982
diff changeset
800 }
e61836350fce IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents: 42982
diff changeset
801
43226
300f85971e83 IRCv3: Set the presence to offline when we receive a quit message
Gary Kramlich <grim@reaperworld.com>
parents: 43225
diff changeset
802 g_clear_pointer(&message, g_free);
300f85971e83 IRCv3: Set the presence to offline when we receive a quit message
Gary Kramlich <grim@reaperworld.com>
parents: 43225
diff changeset
803 g_clear_pointer(&reason, g_free);
43007
e61836350fce IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents: 42982
diff changeset
804
e61836350fce IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents: 42982
diff changeset
805 return TRUE;
e61836350fce IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents: 42982
diff changeset
806 }
43015
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
807
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
808 gboolean
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
809 purple_ircv3_message_handler_nick(G_GNUC_UNUSED IbisClient *client,
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
810 G_GNUC_UNUSED const char *command,
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
811 IbisMessage *ibis_message,
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
812 gpointer data)
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
813 {
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
814 PurpleIRCv3Connection *connection = data;
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
815 PurpleContact *contact = NULL;
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
816 PurpleContactInfo *info = NULL;
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
817 IbisTags *tags = NULL;
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
818 GStrv params = NULL;
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
819 guint n_params = 0;
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
820 char *new_source = NULL;
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
821 char *user = NULL;
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
822 char *host = NULL;
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
823 const char *source = NULL;
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
824 const char *nick = NULL;
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
825
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
826 params = ibis_message_get_params(ibis_message);
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
827 n_params = g_strv_length(params);
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
828
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
829 if(n_params != 1) {
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
830 g_message("received NICK with %d params, expected 1", n_params);
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
831 return FALSE;
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
832 }
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
833
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
834 nick = params[0];
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
835 source = ibis_message_get_source(ibis_message);
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
836 ibis_source_parse(source, NULL, &user, &host);
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
837 new_source = ibis_source_serialize(nick, user, host);
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
838 g_clear_pointer(&user, g_free);
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
839 g_clear_pointer(&host, g_free);
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
840
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
841 contact = purple_ircv3_connection_find_or_create_contact(connection,
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
842 ibis_message);
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
843 info = PURPLE_CONTACT_INFO(contact);
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
844
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
845 /* If the account tag doesn't exist, we need to update the id property of
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
846 * the contact.
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
847 */
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
848 tags = ibis_message_get_tags(ibis_message);
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
849 if(!ibis_tags_exists(tags, IBIS_TAG_ACCOUNT)) {
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
850 purple_contact_info_set_id(info, nick);
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
851 }
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
852
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
853 purple_contact_info_set_display_name(info, nick);
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
854 purple_contact_info_set_sid(info, new_source);
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
855 g_clear_pointer(&new_source, g_free);
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
856
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
857 return TRUE;
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
858 }
43024
8a7be63f83e4 IRCv3: Handle ERROR messages
Gary Kramlich <grim@reaperworld.com>
parents: 43019
diff changeset
859
8a7be63f83e4 IRCv3: Handle ERROR messages
Gary Kramlich <grim@reaperworld.com>
parents: 43019
diff changeset
860 gboolean
8a7be63f83e4 IRCv3: Handle ERROR messages
Gary Kramlich <grim@reaperworld.com>
parents: 43019
diff changeset
861 purple_ircv3_message_handler_error(IbisClient *client,
8a7be63f83e4 IRCv3: Handle ERROR messages
Gary Kramlich <grim@reaperworld.com>
parents: 43019
diff changeset
862 G_GNUC_UNUSED const char *command,
8a7be63f83e4 IRCv3: Handle ERROR messages
Gary Kramlich <grim@reaperworld.com>
parents: 43019
diff changeset
863 IbisMessage *ibis_message,
8a7be63f83e4 IRCv3: Handle ERROR messages
Gary Kramlich <grim@reaperworld.com>
parents: 43019
diff changeset
864 gpointer data)
8a7be63f83e4 IRCv3: Handle ERROR messages
Gary Kramlich <grim@reaperworld.com>
parents: 43019
diff changeset
865 {
43069
cc8ba79c350e IRCv3: Display the contents of ERROR messages in the status window
Gary Kramlich <grim@reaperworld.com>
parents: 43067
diff changeset
866 PurpleIRCv3Connection *v3_connection = data;
43024
8a7be63f83e4 IRCv3: Handle ERROR messages
Gary Kramlich <grim@reaperworld.com>
parents: 43019
diff changeset
867 GError *error = NULL;
8a7be63f83e4 IRCv3: Handle ERROR messages
Gary Kramlich <grim@reaperworld.com>
parents: 43019
diff changeset
868 GStrv params = NULL;
8a7be63f83e4 IRCv3: Handle ERROR messages
Gary Kramlich <grim@reaperworld.com>
parents: 43019
diff changeset
869 guint n_params = 0;
8a7be63f83e4 IRCv3: Handle ERROR messages
Gary Kramlich <grim@reaperworld.com>
parents: 43019
diff changeset
870 char *reason = NULL;
8a7be63f83e4 IRCv3: Handle ERROR messages
Gary Kramlich <grim@reaperworld.com>
parents: 43019
diff changeset
871
8a7be63f83e4 IRCv3: Handle ERROR messages
Gary Kramlich <grim@reaperworld.com>
parents: 43019
diff changeset
872 params = ibis_message_get_params(ibis_message);
8a7be63f83e4 IRCv3: Handle ERROR messages
Gary Kramlich <grim@reaperworld.com>
parents: 43019
diff changeset
873 n_params = g_strv_length(params);
8a7be63f83e4 IRCv3: Handle ERROR messages
Gary Kramlich <grim@reaperworld.com>
parents: 43019
diff changeset
874
8a7be63f83e4 IRCv3: Handle ERROR messages
Gary Kramlich <grim@reaperworld.com>
parents: 43019
diff changeset
875 if(n_params > 0) {
8a7be63f83e4 IRCv3: Handle ERROR messages
Gary Kramlich <grim@reaperworld.com>
parents: 43019
diff changeset
876 reason = g_strjoinv(" ", params);
8a7be63f83e4 IRCv3: Handle ERROR messages
Gary Kramlich <grim@reaperworld.com>
parents: 43019
diff changeset
877 } else {
8a7be63f83e4 IRCv3: Handle ERROR messages
Gary Kramlich <grim@reaperworld.com>
parents: 43019
diff changeset
878 reason = g_strdup(_("unknown error"));
8a7be63f83e4 IRCv3: Handle ERROR messages
Gary Kramlich <grim@reaperworld.com>
parents: 43019
diff changeset
879 }
8a7be63f83e4 IRCv3: Handle ERROR messages
Gary Kramlich <grim@reaperworld.com>
parents: 43019
diff changeset
880
43069
cc8ba79c350e IRCv3: Display the contents of ERROR messages in the status window
Gary Kramlich <grim@reaperworld.com>
parents: 43067
diff changeset
881 purple_ircv3_connection_write_status_message(v3_connection, ibis_message,
43195
10a8a087d356 IRCv3: mark ping and pong messages as events
Gary Kramlich <grim@reaperworld.com>
parents: 43184
diff changeset
882 TRUE, FALSE);
43069
cc8ba79c350e IRCv3: Display the contents of ERROR messages in the status window
Gary Kramlich <grim@reaperworld.com>
parents: 43067
diff changeset
883
43024
8a7be63f83e4 IRCv3: Handle ERROR messages
Gary Kramlich <grim@reaperworld.com>
parents: 43019
diff changeset
884 error = g_error_new_literal(PURPLE_IRCV3_DOMAIN, 0, reason);
8a7be63f83e4 IRCv3: Handle ERROR messages
Gary Kramlich <grim@reaperworld.com>
parents: 43019
diff changeset
885 g_clear_pointer(&reason, g_free);
8a7be63f83e4 IRCv3: Handle ERROR messages
Gary Kramlich <grim@reaperworld.com>
parents: 43019
diff changeset
886
43165
201c799d4e6f ircv3: Remove redundant account disconnection
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents: 43149
diff changeset
887 ibis_client_stop(client, error);
43024
8a7be63f83e4 IRCv3: Handle ERROR messages
Gary Kramlich <grim@reaperworld.com>
parents: 43019
diff changeset
888
8a7be63f83e4 IRCv3: Handle ERROR messages
Gary Kramlich <grim@reaperworld.com>
parents: 43019
diff changeset
889 return TRUE;
8a7be63f83e4 IRCv3: Handle ERROR messages
Gary Kramlich <grim@reaperworld.com>
parents: 43019
diff changeset
890 }
43028
dda093fe275e IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents: 43025
diff changeset
891
dda093fe275e IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents: 43025
diff changeset
892 gboolean
dda093fe275e IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents: 43025
diff changeset
893 purple_ircv3_message_handler_wallops(G_GNUC_UNUSED IbisClient *client,
dda093fe275e IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents: 43025
diff changeset
894 G_GNUC_UNUSED const char *command,
dda093fe275e IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents: 43025
diff changeset
895 IbisMessage *ibis_message,
dda093fe275e IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents: 43025
diff changeset
896 gpointer data)
dda093fe275e IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents: 43025
diff changeset
897 {
dda093fe275e IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents: 43025
diff changeset
898 PurpleIRCv3Connection *v3_connection = data;
dda093fe275e IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents: 43025
diff changeset
899 PurpleAccount *account = NULL;
dda093fe275e IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents: 43025
diff changeset
900 PurpleConnection *connection = data;
dda093fe275e IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents: 43025
diff changeset
901 PurpleContact *contact = NULL;
dda093fe275e IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents: 43025
diff changeset
902 PurpleContactInfo *info = NULL;
dda093fe275e IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents: 43025
diff changeset
903 PurpleNotification *notification = NULL;
dda093fe275e IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents: 43025
diff changeset
904 PurpleNotificationManager *manager = NULL;
dda093fe275e IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents: 43025
diff changeset
905 GStrv params = NULL;
dda093fe275e IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents: 43025
diff changeset
906 char *wallops_title = NULL;
dda093fe275e IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents: 43025
diff changeset
907 guint n_params = 0;
dda093fe275e IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents: 43025
diff changeset
908
dda093fe275e IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents: 43025
diff changeset
909 params = ibis_message_get_params(ibis_message);
dda093fe275e IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents: 43025
diff changeset
910 n_params = g_strv_length(params);
dda093fe275e IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents: 43025
diff changeset
911
dda093fe275e IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents: 43025
diff changeset
912 if(n_params != 1) {
dda093fe275e IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents: 43025
diff changeset
913 g_message("received WALLOPS with %u params, expected 1", n_params);
dda093fe275e IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents: 43025
diff changeset
914 return FALSE;
dda093fe275e IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents: 43025
diff changeset
915 }
dda093fe275e IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents: 43025
diff changeset
916
dda093fe275e IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents: 43025
diff changeset
917 contact = purple_ircv3_connection_find_or_create_contact(v3_connection,
dda093fe275e IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents: 43025
diff changeset
918 ibis_message);
dda093fe275e IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents: 43025
diff changeset
919 info = PURPLE_CONTACT_INFO(contact);
dda093fe275e IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents: 43025
diff changeset
920
dda093fe275e IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents: 43025
diff changeset
921 wallops_title = g_strdup_printf(_("WALLOPS from %s"),
dda093fe275e IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents: 43025
diff changeset
922 purple_contact_info_get_name_for_display(info));
dda093fe275e IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents: 43025
diff changeset
923 notification = purple_notification_new(NULL, wallops_title);
dda093fe275e IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents: 43025
diff changeset
924 g_free(wallops_title);
dda093fe275e IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents: 43025
diff changeset
925
dda093fe275e IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents: 43025
diff changeset
926 account = purple_connection_get_account(connection);
dda093fe275e IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents: 43025
diff changeset
927 purple_notification_set_account(notification, account);
dda093fe275e IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents: 43025
diff changeset
928 purple_notification_set_subtitle(notification, params[0]);
dda093fe275e IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents: 43025
diff changeset
929 purple_notification_set_icon_name(notification, PURPLE_IRCV3_ICON_NAME);
dda093fe275e IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents: 43025
diff changeset
930
dda093fe275e IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents: 43025
diff changeset
931 manager = purple_notification_manager_get_default();
dda093fe275e IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents: 43025
diff changeset
932 purple_notification_manager_add(manager, notification);
dda093fe275e IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents: 43025
diff changeset
933 g_clear_object(&notification);
dda093fe275e IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents: 43025
diff changeset
934
dda093fe275e IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents: 43025
diff changeset
935 return TRUE;
dda093fe275e IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents: 43025
diff changeset
936 }
43067
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
937
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
938 gboolean
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
939 purple_ircv3_message_handler_kick(G_GNUC_UNUSED IbisClient *client,
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
940 G_GNUC_UNUSED const char *command,
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
941 IbisMessage *ibis_message,
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
942 gpointer data)
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
943 {
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
944 PurpleIRCv3Connection *v3_connection = data;
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
945 PurpleAccount *account = NULL;
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
946 PurpleContact *kicker = NULL;
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
947 PurpleContact *kickee = NULL;
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
948 PurpleContactInfo *me = NULL;
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
949 PurpleConversation *conversation = NULL;
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
950 GStrv params = NULL;
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
951 char *reason = NULL;
43098
13b0954a268b IRCv3: Fix kick detection and handle online conversation states
Gary Kramlich <grim@reaperworld.com>
parents: 43069
diff changeset
952 const char *kickee_id = NULL;
13b0954a268b IRCv3: Fix kick detection and handle online conversation states
Gary Kramlich <grim@reaperworld.com>
parents: 43069
diff changeset
953 const char *me_id = NULL;
43067
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
954 guint n_params = 0;
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
955
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
956 params = ibis_message_get_params(ibis_message);
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
957 n_params = g_strv_length(params);
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
958
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
959 if(n_params < 2) {
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
960 g_message("received KICK with %u params, need at least 2", n_params);
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
961 return FALSE;
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
962 }
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
963
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
964 account = purple_connection_get_account(PURPLE_CONNECTION(v3_connection));
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
965 me = purple_account_get_contact_info(account);
43098
13b0954a268b IRCv3: Fix kick detection and handle online conversation states
Gary Kramlich <grim@reaperworld.com>
parents: 43069
diff changeset
966 me_id = purple_contact_info_get_id(me);
43067
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
967
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
968 kicker = purple_ircv3_connection_find_or_create_contact(v3_connection,
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
969 ibis_message);
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
970
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
971 conversation = purple_ircv3_connection_find_or_create_conversation(v3_connection,
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
972 params[0]);
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
973
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
974 kickee = purple_ircv3_connection_find_or_create_contact_from_nick(v3_connection,
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
975 params[1]);
43098
13b0954a268b IRCv3: Fix kick detection and handle online conversation states
Gary Kramlich <grim@reaperworld.com>
parents: 43069
diff changeset
976 kickee_id = purple_contact_info_get_id(PURPLE_CONTACT_INFO(kickee));
43067
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
977
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
978 if(n_params > 2) {
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
979 reason = g_strjoinv(" ", params + 2);
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
980 } else {
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
981 reason = g_strdup(_("no reason"));
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
982 }
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
983
43098
13b0954a268b IRCv3: Fix kick detection and handle online conversation states
Gary Kramlich <grim@reaperworld.com>
parents: 43069
diff changeset
984 if(purple_strequal(kickee_id, me_id)) {
43067
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
985 GError *error = NULL;
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
986
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
987 error = g_error_new(PURPLE_IRCV3_DOMAIN, 0,
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
988 _("You were kicked from %s by %s: %s"),
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
989 params[0],
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
990 purple_contact_info_get_name_for_display(PURPLE_CONTACT_INFO(kicker)),
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
991 reason);
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
992 purple_conversation_set_error(conversation, error);
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
993 g_clear_error(&error);
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
994
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
995 purple_conversation_set_online(conversation, FALSE);
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
996 } else {
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
997 PurpleConversationMembers *members = NULL;
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
998 char *contents = NULL;
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
999
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
1000 contents = g_strdup_printf(_("%s kicked %s from %s: %s"),
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
1001 purple_contact_info_get_name_for_display(PURPLE_CONTACT_INFO(kicker)),
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
1002 purple_contact_info_get_name_for_display(PURPLE_CONTACT_INFO(kickee)),
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
1003 params[0],
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
1004 reason);
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
1005
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
1006 members = purple_conversation_get_members(conversation);
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
1007 purple_conversation_members_remove_member(members,
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
1008 PURPLE_CONTACT_INFO(kickee),
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
1009 TRUE,
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
1010 contents);
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
1011 g_free(contents);
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
1012 }
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
1013
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
1014 g_free(reason);
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
1015
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
1016 return TRUE;
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
1017 }
43199
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1018
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1019 gboolean
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1020 purple_ircv3_message_handler_mode(IbisClient *client,
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1021 G_GNUC_UNUSED const char *command,
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1022 IbisMessage *ibis_message,
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1023 gpointer data)
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1024 {
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1025 PurpleIRCv3Connection *v3_connection = data;
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1026 PurpleContact *contact = NULL;
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1027 PurpleConversation *conversation = NULL;
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1028 PurpleConversationMember *author = NULL;
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1029 PurpleMessage *message = NULL;
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1030 IbisModeChange *mode_changes = NULL;
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1031 GError *error = NULL;
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1032 GStrv params = NULL;
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1033 char *contents = NULL;
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1034 char *parts = NULL;
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1035 guint n_params = 0;
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1036 guint n_mode_changes = 0;
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1037 const char *target = NULL;
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1038
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1039 params = ibis_message_get_params(ibis_message);
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1040 n_params = g_strv_length(params);
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1041
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1042 if(n_params < 2) {
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1043 g_message("received MODE with %u params, need at least 2", n_params);
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1044 return FALSE;
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1045 }
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1046
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1047 target = params[0];
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1048 if(!ibis_client_is_channel(client, target)) {
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1049 return FALSE;
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1050 }
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1051
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1052 conversation = purple_ircv3_connection_find_or_create_conversation(v3_connection,
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1053 target);
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1054
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1055 contact = purple_ircv3_connection_find_or_create_contact(v3_connection,
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1056 ibis_message);
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1057 author = purple_conversation_find_or_add_member(conversation,
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1058 PURPLE_CONTACT_INFO(contact),
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1059 FALSE, NULL);
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1060
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1061 mode_changes = ibis_client_parse_mode_string(client, params[1], params + 2,
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1062 &n_mode_changes, &error);
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1063 if(error != NULL) {
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1064 g_warning("failed to parse mode string: %s", error->message);
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1065
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1066 g_clear_error(&error);
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1067
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1068 return FALSE;
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1069 }
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1070
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1071 for(guint i = 0; i < n_mode_changes; i++) {
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1072 PurpleContact *subject = NULL;
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1073 PurpleConversationMember *member = NULL;
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1074 IbisModeChange change = mode_changes[i];
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1075 char prefix = '\0';
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1076
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1077 prefix = ibis_client_get_prefix_for_mode(client, change.mode);
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1078 if(prefix == '\0') {
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1079 continue;
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1080 }
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1081
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1082 subject = purple_ircv3_connection_find_or_create_contact_from_nick(v3_connection,
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1083 change.parameter);
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1084 member = purple_conversation_find_or_add_member(conversation,
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1085 PURPLE_CONTACT_INFO(subject),
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1086 FALSE, NULL);
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1087
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1088 if(change.add) {
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1089 purple_ircv3_add_badge_to_member(member, client, prefix);
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1090 } else {
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1091 purple_ircv3_remove_badge_from_member(member, client, prefix);
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1092 }
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1093 }
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1094
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1095 parts = g_strjoinv(" ", params + 1);
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1096 contents = g_strdup_printf(_("mode %s"), parts);
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1097 g_free(parts);
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1098
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1099 message = g_object_new(
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1100 PURPLE_TYPE_MESSAGE,
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1101 "author", author,
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1102 "contents", contents,
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1103 "event", TRUE,
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1104 NULL);
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1105 g_free(contents);
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1106
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1107 purple_conversation_write_message(conversation, message);
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1108 g_clear_object(&message);
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1109
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1110 return TRUE;
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1111 }
43236
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1112
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1113 gboolean
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1114 purple_ircv3_message_handler_whoreply(IbisClient *client,
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1115 G_GNUC_UNUSED const char *command,
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1116 IbisMessage *ibis_message,
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1117 gpointer data)
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1118 {
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1119 PurpleIRCv3Connection *v3_connection = data;
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1120 PurpleContact *contact = NULL;
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1121 PurplePresence *presence = NULL;
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1122 GStrv params = NULL;
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1123 char *sid = NULL;
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1124 guint n_params = 0;
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1125 const char *flags = NULL;
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1126
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1127 params = ibis_message_get_params(ibis_message);
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1128 n_params = g_strv_length(params);
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1129
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1130 /* A standard RPL_WHOREPLY has 7 parameters:
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1131 *
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1132 * <client> <channel> <username> <host> <server> <nick> <flags> :<hopcount> <realname>
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1133 *
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1134 * We ignore hopcount and realname for now as we don't have a good use case
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1135 * to use it.
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1136 */
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1137 if(n_params < 7) {
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1138 g_message("received RPL_WHOREPLY with %u params, need at least 7",
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1139 n_params);
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1140 return FALSE;
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1141 }
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1142
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1143 /* Find the contact and update everything for it. */
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1144 contact = purple_ircv3_connection_find_or_create_contact_from_nick(v3_connection,
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1145 params[5]);
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1146
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1147 sid = g_strdup_printf("%s!%s@%s", params[5], params[2], params[3]);
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1148 purple_contact_info_set_sid(PURPLE_CONTACT_INFO(contact), sid);
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1149
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1150 /* Process the flags starting with presence. */
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1151 flags = params[6];
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1152
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1153 presence = purple_contact_info_get_presence(PURPLE_CONTACT_INFO(contact));
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1154 if(flags[0] == 'G') {
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1155 purple_presence_set_primitive(presence,
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1156 PURPLE_PRESENCE_PRIMITIVE_AWAY);
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1157 } else {
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1158 purple_presence_set_primitive(presence,
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1159 PURPLE_PRESENCE_PRIMITIVE_AVAILABLE);
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1160 }
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1161
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1162 /* Increment flags to the next value. */
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1163 flags += 1;
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1164
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1165 /* Check if a server admin. */
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1166 if(flags[0] == '*') {
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1167 /* We'll need to create badge for this at some point */
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1168
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1169 flags += 1;
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1170 }
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1171
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1172 /* If we got a channel update the member's prefix (badges). */
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1173 if(!purple_strequal(params[1], "*")) {
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1174 PurpleConversation *conversation = NULL;
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1175 PurpleConversationMember *member = NULL;
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1176
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1177 conversation = purple_ircv3_connection_find_or_create_conversation(v3_connection,
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1178 params[1]);
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1179
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1180 member = purple_conversation_find_or_add_member(conversation,
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1181 PURPLE_CONTACT_INFO(contact),
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1182 FALSE, NULL);
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1183
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1184 /* Now run through the remaining flags looking for channel member
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1185 * prefixes and adding badges for the ones we find.
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1186 */
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1187 for(guint i = 0; flags[i] != '\0'; i++) {
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1188 /* We abuse the fact that if a badge can't be found it is ignored
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1189 * to avoid having to check the prefix before adding the badge.
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1190 */
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1191 purple_ircv3_add_badge_to_member(member, client, flags[i]);
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1192 }
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1193 }
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1194
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1195 return TRUE;
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1196 }

mercurial