protocols/ircv3/purpleircv3messagehandlers.c

Thu, 17 Jul 2025 20:28:54 -0500

author
Gary Kramlich <grim@reaperworld.com>
date
Thu, 17 Jul 2025 20:28:54 -0500
changeset 43290
01edcfbfebaa
parent 43287
1de854696dfc
permissions
-rw-r--r--

IRCv3: Implement the /me command

This was kind of forgotten about, but it's here now.

Testing Done:
Watched a packet dump to verify it was sent correct and asked people in #pidgin on libera if it came through correctly.

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

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
43242
a9bc19e23c36 IRCv3: check if a member is in a conversation before adding them
Gary Kramlich <grim@reaperworld.com>
parents: 43238
diff changeset
433 /* Check if the member is already in the existing members list.
a9bc19e23c36 IRCv3: check if a member is in a conversation before adding them
Gary Kramlich <grim@reaperworld.com>
parents: 43238
diff changeset
434 * This can happen if the user sends a NAMES command and surely
a9bc19e23c36 IRCv3: check if a member is in a conversation before adding them
Gary Kramlich <grim@reaperworld.com>
parents: 43238
diff changeset
435 * other ways are possible. */
a9bc19e23c36 IRCv3: check if a member is in a conversation before adding them
Gary Kramlich <grim@reaperworld.com>
parents: 43238
diff changeset
436 member = purple_conversation_members_find_member(existing_members,
a9bc19e23c36 IRCv3: check if a member is in a conversation before adding them
Gary Kramlich <grim@reaperworld.com>
parents: 43238
diff changeset
437 PURPLE_CONTACT_INFO(contact));
a9bc19e23c36 IRCv3: check if a member is in a conversation before adding them
Gary Kramlich <grim@reaperworld.com>
parents: 43238
diff changeset
438
a9bc19e23c36 IRCv3: check if a member is in a conversation before adding them
Gary Kramlich <grim@reaperworld.com>
parents: 43238
diff changeset
439 /* If the member doesn't exist, add them. */
a9bc19e23c36 IRCv3: check if a member is in a conversation before adding them
Gary Kramlich <grim@reaperworld.com>
parents: 43238
diff changeset
440 if(!PURPLE_IS_CONVERSATION_MEMBER(member)) {
a9bc19e23c36 IRCv3: check if a member is in a conversation before adding them
Gary Kramlich <grim@reaperworld.com>
parents: 43238
diff changeset
441 member = purple_conversation_members_add_member(new_members,
a9bc19e23c36 IRCv3: check if a member is in a conversation before adding them
Gary Kramlich <grim@reaperworld.com>
parents: 43238
diff changeset
442 PURPLE_CONTACT_INFO(contact),
a9bc19e23c36 IRCv3: check if a member is in a conversation before adding them
Gary Kramlich <grim@reaperworld.com>
parents: 43238
diff changeset
443 FALSE, NULL);
a9bc19e23c36 IRCv3: check if a member is in a conversation before adding them
Gary Kramlich <grim@reaperworld.com>
parents: 43238
diff changeset
444 }
43102
bdddb2c34d88 IRCv3: Add badges
Gary Kramlich <grim@reaperworld.com>
parents: 43100
diff changeset
445
bdddb2c34d88 IRCv3: Add badges
Gary Kramlich <grim@reaperworld.com>
parents: 43100
diff changeset
446 purple_ircv3_add_badges_to_member(member, client, nick);
bdddb2c34d88 IRCv3: Add badges
Gary Kramlich <grim@reaperworld.com>
parents: 43100
diff changeset
447
42925
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
448 g_free(stripped);
43242
a9bc19e23c36 IRCv3: check if a member is in a conversation before adding them
Gary Kramlich <grim@reaperworld.com>
parents: 43238
diff changeset
449 g_clear_object(&contact);
42925
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
450 }
43205
1400ae254c24 IRCv3: use Purple.ConversationMembers.extend when joining channels
Gary Kramlich <grim@reaperworld.com>
parents: 43199
diff changeset
451
1400ae254c24 IRCv3: use Purple.ConversationMembers.extend when joining channels
Gary Kramlich <grim@reaperworld.com>
parents: 43199
diff changeset
452 purple_conversation_members_extend(existing_members, new_members);
42925
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
453 }
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
454
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
455 g_strfreev(nicks);
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
456
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
457 return TRUE;
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
458 }
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
459
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
460 gboolean
42896
5c8f4a455d3c IRCv3: Use Ibis.Client.is_channel instead of our old version
Gary Kramlich <grim@reaperworld.com>
parents: 42893
diff changeset
461 purple_ircv3_message_handler_tagmsg(IbisClient *client,
42883
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
462 G_GNUC_UNUSED const char *command,
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
463 IbisMessage *ibis_message, gpointer data)
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
464 {
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
465 PurpleIRCv3Connection *connection = data;
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
466 PurpleContact *contact = NULL;
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
467 PurpleConversation *conversation = NULL;
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
468 GStrv params = NULL;
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
469 IbisTags *tags = NULL;
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
470 const char *target = NULL;
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
471 const char *value = NULL;
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
472
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
473 params = ibis_message_get_params(ibis_message);
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
474 tags = ibis_message_get_tags(ibis_message);
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
475
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
476 if(params == NULL) {
42920
897667cab3ce Add support for CTCP ACTION
Gary Kramlich <grim@reaperworld.com>
parents: 42896
diff changeset
477 g_warning("tagmsg received with no parameters");
42883
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 return FALSE;
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
480 }
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
481
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
482 if(g_strv_length(params) != 1) {
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
483 char *body = g_strjoinv(" ", params);
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
484 g_warning("unknown tagmsg message format: '%s'", body);
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
485 g_free(body);
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
486
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
487 return FALSE;
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 /* Find or create the contact. */
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
491 contact = purple_ircv3_connection_find_or_create_contact(connection,
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
492 ibis_message);
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
493
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
494 /* Find or create the conversation. */
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
495 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
496 if(!ibis_client_is_channel(client, target)) {
42883
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
497 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
498 }
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
499
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
500 conversation = purple_ircv3_connection_find_or_create_conversation(connection,
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
501 target);
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
502
43025
2d3b2ed42f87 IRCv3: Fix pre-registration PRIVMSG not going to the status window
Gary Kramlich <grim@reaperworld.com>
parents: 43024
diff changeset
503 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
504
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
505 /* Handle typing notifications. */
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
506 value = ibis_tags_lookup(tags, IBIS_TAG_TYPING);
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
507 if(!purple_strempty(value)) {
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
508 PurpleConversationMember *member = NULL;
42893
d73c5851a773 IRCv3: Port to Purple.ConversationMembers
Gary Kramlich <grim@reaperworld.com>
parents: 42883
diff changeset
509 PurpleConversationMembers *members = NULL;
42883
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
510 PurpleTypingState state = PURPLE_TYPING_STATE_NONE;
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
511 guint timeout = 1;
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
512
42893
d73c5851a773 IRCv3: Port to Purple.ConversationMembers
Gary Kramlich <grim@reaperworld.com>
parents: 42883
diff changeset
513 members = purple_conversation_get_members(conversation);
d73c5851a773 IRCv3: Port to Purple.ConversationMembers
Gary Kramlich <grim@reaperworld.com>
parents: 42883
diff changeset
514 member = purple_conversation_members_find_member(members,
d73c5851a773 IRCv3: Port to Purple.ConversationMembers
Gary Kramlich <grim@reaperworld.com>
parents: 42883
diff changeset
515 PURPLE_CONTACT_INFO(contact));
42883
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 if(purple_strequal(value, IBIS_TYPING_ACTIVE)) {
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
518 state = PURPLE_TYPING_STATE_TYPING;
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
519 timeout = 6;
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
520 } else if(purple_strequal(value, IBIS_TYPING_PAUSED)) {
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
521 state = PURPLE_TYPING_STATE_PAUSED;
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
522 timeout = 30;
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
523 }
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
524
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
525 purple_conversation_member_set_typing_state(member, state, timeout);
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
526 }
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
527
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
528 return TRUE;
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
529 }
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
530
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
531 gboolean
42896
5c8f4a455d3c IRCv3: Use Ibis.Client.is_channel instead of our old version
Gary Kramlich <grim@reaperworld.com>
parents: 42893
diff changeset
532 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
533 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
534 {
86302ce7e3c1 Add support for handling PRIVMSG and NOTICE messages from the server
Gary Kramlich <grim@reaperworld.com>
parents: 41807
diff changeset
535 PurpleIRCv3Connection *connection = data;
86302ce7e3c1 Add support for handling PRIVMSG and NOTICE messages from the server
Gary Kramlich <grim@reaperworld.com>
parents: 41807
diff changeset
536 PurpleContact *contact = NULL;
86302ce7e3c1 Add support for handling PRIVMSG and NOTICE messages from the server
Gary Kramlich <grim@reaperworld.com>
parents: 41807
diff changeset
537 PurpleConversation *conversation = NULL;
43100
e6df74d36862 Change Purple.Message:author to Purple.ConversationMember
Gary Kramlich <grim@reaperworld.com>
parents: 43098
diff changeset
538 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
539 PurpleMessage *message = NULL;
42056
ced07483f66a IRCv3: Add support for the msgid specification
Gary Kramlich <grim@reaperworld.com>
parents: 42048
diff changeset
540 GDateTime *dt = NULL;
42920
897667cab3ce Add support for CTCP ACTION
Gary Kramlich <grim@reaperworld.com>
parents: 42896
diff changeset
541 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
542 IbisTags *tags = NULL;
42333
a34601ac633c Add PurpleIRCv3Message represent messages rather than multiple variables
Gary Kramlich <grim@reaperworld.com>
parents: 42320
diff changeset
543 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
544 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
545 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
546
42769
c488d7af2923 Move the IRCv3 protocol plugin to our new Ibis library
Gary Kramlich <grim@reaperworld.com>
parents: 42652
diff changeset
547 params = ibis_message_get_params(ibis_message);
42920
897667cab3ce Add support for CTCP ACTION
Gary Kramlich <grim@reaperworld.com>
parents: 42896
diff changeset
548 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
549 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
550
42382
343e30628383 IRCv3: Fix an issue scanbuild found
Gary Kramlich <grim@reaperworld.com>
parents: 42378
diff changeset
551 if(params == NULL) {
343e30628383 IRCv3: Fix an issue scanbuild found
Gary Kramlich <grim@reaperworld.com>
parents: 42378
diff changeset
552 g_warning("privmsg received with no parameters");
343e30628383 IRCv3: Fix an issue scanbuild found
Gary Kramlich <grim@reaperworld.com>
parents: 42378
diff changeset
553
343e30628383 IRCv3: Fix an issue scanbuild found
Gary Kramlich <grim@reaperworld.com>
parents: 42378
diff changeset
554 return FALSE;
343e30628383 IRCv3: Fix an issue scanbuild found
Gary Kramlich <grim@reaperworld.com>
parents: 42378
diff changeset
555 }
343e30628383 IRCv3: Fix an issue scanbuild found
Gary Kramlich <grim@reaperworld.com>
parents: 42378
diff changeset
556
343e30628383 IRCv3: Fix an issue scanbuild found
Gary Kramlich <grim@reaperworld.com>
parents: 42378
diff changeset
557 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
558 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
559 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
560 g_free(body);
86302ce7e3c1 Add support for handling PRIVMSG and NOTICE messages from the server
Gary Kramlich <grim@reaperworld.com>
parents: 41807
diff changeset
561
86302ce7e3c1 Add support for handling PRIVMSG and NOTICE messages from the server
Gary Kramlich <grim@reaperworld.com>
parents: 41807
diff changeset
562 return FALSE;
86302ce7e3c1 Add support for handling PRIVMSG and NOTICE messages from the server
Gary Kramlich <grim@reaperworld.com>
parents: 41807
diff changeset
563 }
86302ce7e3c1 Add support for handling PRIVMSG and NOTICE messages from the server
Gary Kramlich <grim@reaperworld.com>
parents: 41807
diff changeset
564
42815
95bb2ae83de7 IRCv3: Use Ibis.Message in PurpleIRCv3.Connection.find_or_create_contact
Gary Kramlich <grim@reaperworld.com>
parents: 42780
diff changeset
565 /* 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
566 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
567 ibis_message);
42345
e01084003f50 IRCv3: Finally fix sending messages between two users
Gary Kramlich <grim@reaperworld.com>
parents: 42333
diff changeset
568
41813
86302ce7e3c1 Add support for handling PRIVMSG and NOTICE messages from the server
Gary Kramlich <grim@reaperworld.com>
parents: 41807
diff changeset
569 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
570 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
571 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
572 }
42815
95bb2ae83de7 IRCv3: Use Ibis.Message in PurpleIRCv3.Connection.find_or_create_contact
Gary Kramlich <grim@reaperworld.com>
parents: 42780
diff changeset
573
43024
8a7be63f83e4 IRCv3: Handle ERROR messages
Gary Kramlich <grim@reaperworld.com>
parents: 43019
diff changeset
574 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
575 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
576 announce = FALSE;
42926
c63faf01193e Display CTCP requests in the status window
Gary Kramlich <grim@reaperworld.com>
parents: 42925
diff changeset
577 }
42513
482ba61e5123 IRCv3: Add an ircv3_connection_find_or_create_contact
Gary Kramlich <grim@reaperworld.com>
parents: 42510
diff changeset
578
42920
897667cab3ce Add support for CTCP ACTION
Gary Kramlich <grim@reaperworld.com>
parents: 42896
diff changeset
579 if(IBIS_IS_CTCP_MESSAGE(ctcp_message)) {
897667cab3ce Add support for CTCP ACTION
Gary Kramlich <grim@reaperworld.com>
parents: 42896
diff changeset
580 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
581 GStrv ctcp_params = NULL;
897667cab3ce Add support for CTCP ACTION
Gary Kramlich <grim@reaperworld.com>
parents: 42896
diff changeset
582 char *ctcp_body = NULL;
897667cab3ce Add support for CTCP ACTION
Gary Kramlich <grim@reaperworld.com>
parents: 42896
diff changeset
583 char *stripped = NULL;
897667cab3ce Add support for CTCP ACTION
Gary Kramlich <grim@reaperworld.com>
parents: 42896
diff changeset
584
43225
f0ffa584435b IRCv3: Fix privmsg going to the status window before registration is complete
Gary Kramlich <grim@reaperworld.com>
parents: 43212
diff changeset
585 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
586 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
587 target);
f0ffa584435b IRCv3: Fix privmsg going to the status window before registration is complete
Gary Kramlich <grim@reaperworld.com>
parents: 43212
diff changeset
588 }
f0ffa584435b IRCv3: Fix privmsg going to the status window before registration is complete
Gary Kramlich <grim@reaperworld.com>
parents: 43212
diff changeset
589
43198
570996d7ad96 Fix CTCP ACTION going to the status window
Gary Kramlich <grim@reaperworld.com>
parents: 43195
diff changeset
590 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
591 conversation,
570996d7ad96 Fix CTCP ACTION going to the status window
Gary Kramlich <grim@reaperworld.com>
parents: 43195
diff changeset
592 announce);
570996d7ad96 Fix CTCP ACTION going to the status window
Gary Kramlich <grim@reaperworld.com>
parents: 43195
diff changeset
593
42920
897667cab3ce Add support for CTCP ACTION
Gary Kramlich <grim@reaperworld.com>
parents: 42896
diff changeset
594 ctcp_params = ibis_ctcp_message_get_params(ctcp_message);
897667cab3ce Add support for CTCP ACTION
Gary Kramlich <grim@reaperworld.com>
parents: 42896
diff changeset
595 ctcp_body = g_strjoinv(" ", ctcp_params);
897667cab3ce Add support for CTCP ACTION
Gary Kramlich <grim@reaperworld.com>
parents: 42896
diff changeset
596 stripped = ibis_formatting_strip(ctcp_body);
897667cab3ce Add support for CTCP ACTION
Gary Kramlich <grim@reaperworld.com>
parents: 42896
diff changeset
597 g_free(ctcp_body);
897667cab3ce Add support for CTCP ACTION
Gary Kramlich <grim@reaperworld.com>
parents: 42896
diff changeset
598
43100
e6df74d36862 Change Purple.Message:author to Purple.ConversationMember
Gary Kramlich <grim@reaperworld.com>
parents: 43098
diff changeset
599 message = purple_message_new(member, stripped);
42920
897667cab3ce Add support for CTCP ACTION
Gary Kramlich <grim@reaperworld.com>
parents: 42896
diff changeset
600 g_free(stripped);
897667cab3ce Add support for CTCP ACTION
Gary Kramlich <grim@reaperworld.com>
parents: 42896
diff changeset
601
897667cab3ce Add support for CTCP ACTION
Gary Kramlich <grim@reaperworld.com>
parents: 42896
diff changeset
602 purple_message_set_action(message, TRUE);
42926
c63faf01193e Display CTCP requests in the status window
Gary Kramlich <grim@reaperworld.com>
parents: 42925
diff changeset
603 } else {
c63faf01193e Display CTCP requests in the status window
Gary Kramlich <grim@reaperworld.com>
parents: 42925
diff changeset
604 char *body = NULL;
c63faf01193e Display CTCP requests in the status window
Gary Kramlich <grim@reaperworld.com>
parents: 42925
diff changeset
605
43198
570996d7ad96 Fix CTCP ACTION going to the status window
Gary Kramlich <grim@reaperworld.com>
parents: 43195
diff changeset
606 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
607
f0ffa584435b IRCv3: Fix privmsg going to the status window before registration is complete
Gary Kramlich <grim@reaperworld.com>
parents: 43212
diff changeset
608 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
609 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
610 }
43198
570996d7ad96 Fix CTCP ACTION going to the status window
Gary Kramlich <grim@reaperworld.com>
parents: 43195
diff changeset
611 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
612 conversation,
570996d7ad96 Fix CTCP ACTION going to the status window
Gary Kramlich <grim@reaperworld.com>
parents: 43195
diff changeset
613 announce);
570996d7ad96 Fix CTCP ACTION going to the status window
Gary Kramlich <grim@reaperworld.com>
parents: 43195
diff changeset
614
42926
c63faf01193e Display CTCP requests in the status window
Gary Kramlich <grim@reaperworld.com>
parents: 42925
diff changeset
615 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
616 ibis_ctcp_message_get_command(ctcp_message),
c63faf01193e Display CTCP requests in the status window
Gary Kramlich <grim@reaperworld.com>
parents: 42925
diff changeset
617 params[0],
c63faf01193e Display CTCP requests in the status window
Gary Kramlich <grim@reaperworld.com>
parents: 42925
diff changeset
618 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
619
43100
e6df74d36862 Change Purple.Message:author to Purple.ConversationMember
Gary Kramlich <grim@reaperworld.com>
parents: 43098
diff changeset
620 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
621 purple_message_set_event(message, TRUE);
42926
c63faf01193e Display CTCP requests in the status window
Gary Kramlich <grim@reaperworld.com>
parents: 42925
diff changeset
622 g_free(body);
42920
897667cab3ce Add support for CTCP ACTION
Gary Kramlich <grim@reaperworld.com>
parents: 42896
diff changeset
623 }
43198
570996d7ad96 Fix CTCP ACTION going to the status window
Gary Kramlich <grim@reaperworld.com>
parents: 43195
diff changeset
624 } else {
43212
d2f7c939f650 IRCv3: Handle incoming formatting
Gary Kramlich <grim@reaperworld.com>
parents: 43206
diff changeset
625 PangoAttrList *attrs = NULL;
43198
570996d7ad96 Fix CTCP ACTION going to the status window
Gary Kramlich <grim@reaperworld.com>
parents: 43195
diff changeset
626 char *stripped = NULL;
42920
897667cab3ce Add support for CTCP ACTION
Gary Kramlich <grim@reaperworld.com>
parents: 42896
diff changeset
627
43225
f0ffa584435b IRCv3: Fix privmsg going to the status window before registration is complete
Gary Kramlich <grim@reaperworld.com>
parents: 43212
diff changeset
628 /* 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
629 * 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
630 */
f0ffa584435b IRCv3: Fix privmsg going to the status window before registration is complete
Gary Kramlich <grim@reaperworld.com>
parents: 43212
diff changeset
631 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
632 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
633 target);
f0ffa584435b IRCv3: Fix privmsg going to the status window before registration is complete
Gary Kramlich <grim@reaperworld.com>
parents: 43212
diff changeset
634 }
f0ffa584435b IRCv3: Fix privmsg going to the status window before registration is complete
Gary Kramlich <grim@reaperworld.com>
parents: 43212
diff changeset
635
43198
570996d7ad96 Fix CTCP ACTION going to the status window
Gary Kramlich <grim@reaperworld.com>
parents: 43195
diff changeset
636 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
637 conversation,
570996d7ad96 Fix CTCP ACTION going to the status window
Gary Kramlich <grim@reaperworld.com>
parents: 43195
diff changeset
638 announce);
42920
897667cab3ce Add support for CTCP ACTION
Gary Kramlich <grim@reaperworld.com>
parents: 42896
diff changeset
639
43212
d2f7c939f650 IRCv3: Handle incoming formatting
Gary Kramlich <grim@reaperworld.com>
parents: 43206
diff changeset
640 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
641 message = purple_message_new(member, stripped);
43212
d2f7c939f650 IRCv3: Handle incoming formatting
Gary Kramlich <grim@reaperworld.com>
parents: 43206
diff changeset
642 purple_message_set_attributes(message, attrs);
42920
897667cab3ce Add support for CTCP ACTION
Gary Kramlich <grim@reaperworld.com>
parents: 42896
diff changeset
643 g_clear_pointer(&stripped, g_free);
43212
d2f7c939f650 IRCv3: Handle incoming formatting
Gary Kramlich <grim@reaperworld.com>
parents: 43206
diff changeset
644 g_clear_pointer(&attrs, pango_attr_list_unref);
42920
897667cab3ce Add support for CTCP ACTION
Gary Kramlich <grim@reaperworld.com>
parents: 42896
diff changeset
645 }
897667cab3ce Add support for CTCP ACTION
Gary Kramlich <grim@reaperworld.com>
parents: 42896
diff changeset
646
42769
c488d7af2923 Move the IRCv3 protocol plugin to our new Ibis library
Gary Kramlich <grim@reaperworld.com>
parents: 42652
diff changeset
647 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
648 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
649 }
86302ce7e3c1 Add support for handling PRIVMSG and NOTICE messages from the server
Gary Kramlich <grim@reaperworld.com>
parents: 41807
diff changeset
650
42775
98b71fc8a330 Only check tags if we have a tags object
Gary Kramlich <grim@reaperworld.com>
parents: 42769
diff changeset
651 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
652 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
653
42775
98b71fc8a330 Only check tags if we have a tags object
Gary Kramlich <grim@reaperworld.com>
parents: 42769
diff changeset
654 /* 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
655 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
656 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
657 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
658 }
42294
462317d1382d IRCv3: add support for the server-time capability
Gary Kramlich <grim@reaperworld.com>
parents: 42275
diff changeset
659
42775
98b71fc8a330 Only check tags if we have a tags object
Gary Kramlich <grim@reaperworld.com>
parents: 42769
diff changeset
660 /* 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
661 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
662 if(!purple_strempty(raw_tag)) {
98b71fc8a330 Only check tags if we have a tags object
Gary Kramlich <grim@reaperworld.com>
parents: 42769
diff changeset
663 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
664
42775
98b71fc8a330 Only check tags if we have a tags object
Gary Kramlich <grim@reaperworld.com>
parents: 42769
diff changeset
665 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
666 g_time_zone_unref(tz);
42294
462317d1382d IRCv3: add support for the server-time capability
Gary Kramlich <grim@reaperworld.com>
parents: 42275
diff changeset
667
42815
95bb2ae83de7 IRCv3: Use Ibis.Message in PurpleIRCv3.Connection.find_or_create_contact
Gary Kramlich <grim@reaperworld.com>
parents: 42780
diff changeset
668 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
669 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
670 }
42294
462317d1382d IRCv3: add support for the server-time capability
Gary Kramlich <grim@reaperworld.com>
parents: 42275
diff changeset
671 }
462317d1382d IRCv3: add support for the server-time capability
Gary Kramlich <grim@reaperworld.com>
parents: 42275
diff changeset
672
462317d1382d IRCv3: add support for the server-time capability
Gary Kramlich <grim@reaperworld.com>
parents: 42275
diff changeset
673 /* 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
674 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
675 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
676 }
42056
ced07483f66a IRCv3: Add support for the msgid specification
Gary Kramlich <grim@reaperworld.com>
parents: 42048
diff changeset
677
42769
c488d7af2923 Move the IRCv3 protocol plugin to our new Ibis library
Gary Kramlich <grim@reaperworld.com>
parents: 42652
diff changeset
678 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
679
41813
86302ce7e3c1 Add support for handling PRIVMSG and NOTICE messages from the server
Gary Kramlich <grim@reaperworld.com>
parents: 41807
diff changeset
680 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
681
42937
34ac8ac8c7b6 Implement CTCP VERSION response
Gary Kramlich <grim@reaperworld.com>
parents: 42926
diff changeset
682 /* 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
683 * to attempt to handle it.
34ac8ac8c7b6 Implement CTCP VERSION response
Gary Kramlich <grim@reaperworld.com>
parents: 42926
diff changeset
684 */
34ac8ac8c7b6 Implement CTCP VERSION response
Gary Kramlich <grim@reaperworld.com>
parents: 42926
diff changeset
685 if(IBIS_IS_CTCP_MESSAGE(ctcp_message) &&
34ac8ac8c7b6 Implement CTCP VERSION response
Gary Kramlich <grim@reaperworld.com>
parents: 42926
diff changeset
686 purple_strequal(command, IBIS_MSG_PRIVMSG))
34ac8ac8c7b6 Implement CTCP VERSION response
Gary Kramlich <grim@reaperworld.com>
parents: 42926
diff changeset
687 {
34ac8ac8c7b6 Implement CTCP VERSION response
Gary Kramlich <grim@reaperworld.com>
parents: 42926
diff changeset
688 purple_ircv3_ctcp_handler(connection, client, ibis_message);
34ac8ac8c7b6 Implement CTCP VERSION response
Gary Kramlich <grim@reaperworld.com>
parents: 42926
diff changeset
689 }
34ac8ac8c7b6 Implement CTCP VERSION response
Gary Kramlich <grim@reaperworld.com>
parents: 42926
diff changeset
690
41813
86302ce7e3c1 Add support for handling PRIVMSG and NOTICE messages from the server
Gary Kramlich <grim@reaperworld.com>
parents: 41807
diff changeset
691 return TRUE;
86302ce7e3c1 Add support for handling PRIVMSG and NOTICE messages from the server
Gary Kramlich <grim@reaperworld.com>
parents: 41807
diff changeset
692 }
42503
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
693
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
694 gboolean
42769
c488d7af2923 Move the IRCv3 protocol plugin to our new Ibis library
Gary Kramlich <grim@reaperworld.com>
parents: 42652
diff changeset
695 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
696 const char *command, IbisMessage *message,
42503
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
697 gpointer data)
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
698 {
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
699 PurpleIRCv3Connection *connection = data;
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
700 PurpleConversation *conversation = NULL;
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
701 GStrv params = NULL;
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
702 const char *channel = NULL;
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
703 const char *topic = NULL;
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
704 guint n_params = 0;
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
705
42769
c488d7af2923 Move the IRCv3 protocol plugin to our new Ibis library
Gary Kramlich <grim@reaperworld.com>
parents: 42652
diff changeset
706 params = ibis_message_get_params(message);
42503
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
707 n_params = g_strv_length(params);
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
708
42769
c488d7af2923 Move the IRCv3 protocol plugin to our new Ibis library
Gary Kramlich <grim@reaperworld.com>
parents: 42652
diff changeset
709 if(purple_strequal(command, IBIS_MSG_TOPIC)) {
42503
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
710 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
711 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
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[0];
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
718 topic = params[1];
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_NOTOPIC)) {
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_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
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 = "";
42769
c488d7af2923 Move the IRCv3 protocol plugin to our new Ibis library
Gary Kramlich <grim@reaperworld.com>
parents: 42652
diff changeset
729 } 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
730 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
731 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
732 n_params);
42503
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 return FALSE;
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
735 }
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
736
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
737 channel = params[1];
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
738 topic = params[2];
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
739 } else {
42769
c488d7af2923 Move the IRCv3 protocol plugin to our new Ibis library
Gary Kramlich <grim@reaperworld.com>
parents: 42652
diff changeset
740 g_message("unexpected command %s", command);
42503
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 return FALSE;
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
743 }
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 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
746 channel);
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
747 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
748 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
749
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
750 return FALSE;
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
751 }
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
752
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
753 purple_conversation_set_topic(conversation, topic);
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
754
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
755 return TRUE;
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
756 }
43007
e61836350fce IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents: 42982
diff changeset
757
e61836350fce IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents: 42982
diff changeset
758 gboolean
43238
58bca4467196 IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents: 43236
diff changeset
759 purple_ircv3_message_handler_whotopic(G_GNUC_UNUSED IbisClient *client,
58bca4467196 IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents: 43236
diff changeset
760 G_GNUC_UNUSED const char *command,
58bca4467196 IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents: 43236
diff changeset
761 IbisMessage *message,
58bca4467196 IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents: 43236
diff changeset
762 gpointer data)
58bca4467196 IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents: 43236
diff changeset
763 {
58bca4467196 IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents: 43236
diff changeset
764 PurpleIRCv3Connection *connection = data;
58bca4467196 IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents: 43236
diff changeset
765 PurpleConversation *conversation = NULL;
58bca4467196 IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents: 43236
diff changeset
766 PurpleContact *contact = NULL;
58bca4467196 IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents: 43236
diff changeset
767 GDateTime *timestamp = NULL;
58bca4467196 IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents: 43236
diff changeset
768 GObject *obj = NULL;
58bca4467196 IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents: 43236
diff changeset
769 GStrv params = NULL;
58bca4467196 IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents: 43236
diff changeset
770 char *nick = NULL;
58bca4467196 IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents: 43236
diff changeset
771 guint n_params = 0;
58bca4467196 IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents: 43236
diff changeset
772
58bca4467196 IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents: 43236
diff changeset
773 params = ibis_message_get_params(message);
58bca4467196 IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents: 43236
diff changeset
774 n_params = g_strv_length(params);
58bca4467196 IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents: 43236
diff changeset
775
58bca4467196 IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents: 43236
diff changeset
776 /* The 333 whotopic message has parameters of `client channel source
58bca4467196 IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents: 43236
diff changeset
777 * timestamp`.
58bca4467196 IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents: 43236
diff changeset
778 */
58bca4467196 IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents: 43236
diff changeset
779 if(n_params != 4) {
58bca4467196 IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents: 43236
diff changeset
780 g_message("received 333 with %u parameters, expected 4", n_params);
58bca4467196 IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents: 43236
diff changeset
781
58bca4467196 IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents: 43236
diff changeset
782 return FALSE;
58bca4467196 IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents: 43236
diff changeset
783 }
58bca4467196 IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents: 43236
diff changeset
784
58bca4467196 IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents: 43236
diff changeset
785 conversation = purple_ircv3_connection_find_or_create_conversation(connection,
58bca4467196 IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents: 43236
diff changeset
786 params[1]);
58bca4467196 IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents: 43236
diff changeset
787 if(!PURPLE_IS_CONVERSATION(conversation)) {
58bca4467196 IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents: 43236
diff changeset
788 g_message("failed to find or create channel '%s'", params[1]);
58bca4467196 IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents: 43236
diff changeset
789
58bca4467196 IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents: 43236
diff changeset
790 return FALSE;
58bca4467196 IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents: 43236
diff changeset
791 }
58bca4467196 IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents: 43236
diff changeset
792
58bca4467196 IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents: 43236
diff changeset
793 ibis_source_parse(params[2], &nick, NULL, NULL);
58bca4467196 IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents: 43236
diff changeset
794 contact = purple_ircv3_connection_find_or_create_contact_from_nick(connection,
58bca4467196 IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents: 43236
diff changeset
795 nick);
58bca4467196 IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents: 43236
diff changeset
796 g_free(nick);
58bca4467196 IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents: 43236
diff changeset
797 timestamp = g_date_time_new_from_unix_utc(atoi(params[3]));
58bca4467196 IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents: 43236
diff changeset
798
58bca4467196 IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents: 43236
diff changeset
799 obj = G_OBJECT(conversation);
58bca4467196 IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents: 43236
diff changeset
800 g_object_freeze_notify(obj);
58bca4467196 IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents: 43236
diff changeset
801 purple_conversation_set_topic_author(conversation,
58bca4467196 IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents: 43236
diff changeset
802 PURPLE_CONTACT_INFO(contact));
58bca4467196 IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents: 43236
diff changeset
803 purple_conversation_set_topic_updated(conversation, timestamp);
58bca4467196 IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents: 43236
diff changeset
804 g_object_thaw_notify(obj);
58bca4467196 IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents: 43236
diff changeset
805
58bca4467196 IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents: 43236
diff changeset
806 g_date_time_unref(timestamp);
58bca4467196 IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents: 43236
diff changeset
807
58bca4467196 IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents: 43236
diff changeset
808 return TRUE;
58bca4467196 IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents: 43236
diff changeset
809 }
58bca4467196 IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents: 43236
diff changeset
810
58bca4467196 IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents: 43236
diff changeset
811 gboolean
58bca4467196 IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents: 43236
diff changeset
812 purple_ircv3_message_handler_channel_url(G_GNUC_UNUSED IbisClient *client,
58bca4467196 IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents: 43236
diff changeset
813 G_GNUC_UNUSED const char *command,
58bca4467196 IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents: 43236
diff changeset
814 IbisMessage *message,
58bca4467196 IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents: 43236
diff changeset
815 gpointer data)
58bca4467196 IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents: 43236
diff changeset
816 {
58bca4467196 IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents: 43236
diff changeset
817 PurpleIRCv3Connection *connection = data;
58bca4467196 IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents: 43236
diff changeset
818 PurpleConversation *conversation = NULL;
58bca4467196 IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents: 43236
diff changeset
819 GStrv params = NULL;
58bca4467196 IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents: 43236
diff changeset
820 guint n_params = 0;
58bca4467196 IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents: 43236
diff changeset
821
58bca4467196 IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents: 43236
diff changeset
822 params = ibis_message_get_params(message);
58bca4467196 IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents: 43236
diff changeset
823 n_params = g_strv_length(params);
58bca4467196 IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents: 43236
diff changeset
824
58bca4467196 IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents: 43236
diff changeset
825 /* The 328 numeric has parameters of `client channel :url`. */
58bca4467196 IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents: 43236
diff changeset
826 if(n_params != 3) {
58bca4467196 IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents: 43236
diff changeset
827 g_message("received 328 with %u parameters, expected 3", n_params);
58bca4467196 IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents: 43236
diff changeset
828
58bca4467196 IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents: 43236
diff changeset
829 return FALSE;
58bca4467196 IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents: 43236
diff changeset
830 }
58bca4467196 IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents: 43236
diff changeset
831
58bca4467196 IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents: 43236
diff changeset
832 conversation = purple_ircv3_connection_find_or_create_conversation(connection,
58bca4467196 IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents: 43236
diff changeset
833 params[1]);
58bca4467196 IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents: 43236
diff changeset
834 if(!PURPLE_IS_CONVERSATION(conversation)) {
58bca4467196 IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents: 43236
diff changeset
835 g_message("failed to find or create channel '%s'", params[1]);
58bca4467196 IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents: 43236
diff changeset
836
58bca4467196 IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents: 43236
diff changeset
837 return FALSE;
58bca4467196 IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents: 43236
diff changeset
838 }
58bca4467196 IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents: 43236
diff changeset
839
58bca4467196 IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents: 43236
diff changeset
840 purple_conversation_set_url(conversation, params[2]);
58bca4467196 IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents: 43236
diff changeset
841
58bca4467196 IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents: 43236
diff changeset
842 return TRUE;
58bca4467196 IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents: 43236
diff changeset
843 }
58bca4467196 IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents: 43236
diff changeset
844
58bca4467196 IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents: 43236
diff changeset
845 gboolean
43007
e61836350fce IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents: 42982
diff changeset
846 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
847 G_GNUC_UNUSED const char *command,
e61836350fce IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents: 42982
diff changeset
848 IbisMessage *ibis_message,
e61836350fce IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents: 42982
diff changeset
849 gpointer data)
e61836350fce IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents: 42982
diff changeset
850 {
43287
1de854696dfc Add Purple.ConversationManager.get_all_for_account
Gary Kramlich <grim@reaperworld.com>
parents: 43254
diff changeset
851 PurpleIRCv3Connection *v3_connection = data;
1de854696dfc Add Purple.ConversationManager.get_all_for_account
Gary Kramlich <grim@reaperworld.com>
parents: 43254
diff changeset
852 PurpleAccount *account = NULL;
1de854696dfc Add Purple.ConversationManager.get_all_for_account
Gary Kramlich <grim@reaperworld.com>
parents: 43254
diff changeset
853 PurpleConnection *connection = data;
43007
e61836350fce IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents: 42982
diff changeset
854 PurpleContact *contact = NULL;
e61836350fce IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents: 42982
diff changeset
855 PurpleContactInfo *info = NULL;
e61836350fce IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents: 42982
diff changeset
856 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
857 PurplePresence *presence = NULL;
43287
1de854696dfc Add Purple.ConversationManager.get_all_for_account
Gary Kramlich <grim@reaperworld.com>
parents: 43254
diff changeset
858 GListModel *conversations = NULL;
43007
e61836350fce IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents: 42982
diff changeset
859 GStrv params = NULL;
e61836350fce IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents: 42982
diff changeset
860 guint n_params = 0;
e61836350fce IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents: 42982
diff changeset
861 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
862 char *reason = NULL;
43287
1de854696dfc Add Purple.ConversationManager.get_all_for_account
Gary Kramlich <grim@reaperworld.com>
parents: 43254
diff changeset
863 guint n_items = 0;
43007
e61836350fce IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents: 42982
diff changeset
864
e61836350fce IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents: 42982
diff changeset
865 params = ibis_message_get_params(ibis_message);
e61836350fce IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents: 42982
diff changeset
866 n_params = g_strv_length(params);
e61836350fce IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents: 42982
diff changeset
867
43287
1de854696dfc Add Purple.ConversationManager.get_all_for_account
Gary Kramlich <grim@reaperworld.com>
parents: 43254
diff changeset
868 contact = purple_ircv3_connection_find_or_create_contact(v3_connection,
43007
e61836350fce IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents: 42982
diff changeset
869 ibis_message);
e61836350fce IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents: 42982
diff changeset
870 info = PURPLE_CONTACT_INFO(contact);
e61836350fce IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents: 42982
diff changeset
871
e61836350fce IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents: 42982
diff changeset
872 if(n_params > 0) {
e61836350fce IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents: 42982
diff changeset
873 reason = g_strjoinv(" ", params);
e61836350fce IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents: 42982
diff changeset
874 message = g_strdup_printf("%s has quit (%s)",
e61836350fce IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents: 42982
diff changeset
875 purple_contact_info_get_sid(info),
e61836350fce IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents: 42982
diff changeset
876 reason);
e61836350fce IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents: 42982
diff changeset
877 } else {
e61836350fce IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents: 42982
diff changeset
878 message = g_strdup_printf("%s has quit",
e61836350fce IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents: 42982
diff changeset
879 purple_contact_info_get_sid(info));
e61836350fce IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents: 42982
diff changeset
880 }
e61836350fce IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents: 42982
diff changeset
881
43226
300f85971e83 IRCv3: Set the presence to offline when we receive a quit message
Gary Kramlich <grim@reaperworld.com>
parents: 43225
diff changeset
882 /* 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
883 * 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
884 */
300f85971e83 IRCv3: Set the presence to offline when we receive a quit message
Gary Kramlich <grim@reaperworld.com>
parents: 43225
diff changeset
885 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
886 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
887 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
888
43007
e61836350fce IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents: 42982
diff changeset
889 manager = purple_conversation_manager_get_default();
43287
1de854696dfc Add Purple.ConversationManager.get_all_for_account
Gary Kramlich <grim@reaperworld.com>
parents: 43254
diff changeset
890 account = purple_connection_get_account(connection);
1de854696dfc Add Purple.ConversationManager.get_all_for_account
Gary Kramlich <grim@reaperworld.com>
parents: 43254
diff changeset
891 conversations = purple_conversation_manager_get_all_for_account(manager,
1de854696dfc Add Purple.ConversationManager.get_all_for_account
Gary Kramlich <grim@reaperworld.com>
parents: 43254
diff changeset
892 account);
1de854696dfc Add Purple.ConversationManager.get_all_for_account
Gary Kramlich <grim@reaperworld.com>
parents: 43254
diff changeset
893 n_items = g_list_model_get_n_items(G_LIST_MODEL(conversations));
1de854696dfc Add Purple.ConversationManager.get_all_for_account
Gary Kramlich <grim@reaperworld.com>
parents: 43254
diff changeset
894 for(guint i = 0; i < n_items; i++) {
1de854696dfc Add Purple.ConversationManager.get_all_for_account
Gary Kramlich <grim@reaperworld.com>
parents: 43254
diff changeset
895 PurpleConversation *conversation = NULL;
43007
e61836350fce IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents: 42982
diff changeset
896 PurpleConversationMembers *members = NULL;
e61836350fce IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents: 42982
diff changeset
897
43287
1de854696dfc Add Purple.ConversationManager.get_all_for_account
Gary Kramlich <grim@reaperworld.com>
parents: 43254
diff changeset
898 conversation = g_list_model_get_item(G_LIST_MODEL(conversations), i);
1de854696dfc Add Purple.ConversationManager.get_all_for_account
Gary Kramlich <grim@reaperworld.com>
parents: 43254
diff changeset
899
43007
e61836350fce IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents: 42982
diff changeset
900 members = purple_conversation_get_members(conversation);
e61836350fce IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents: 42982
diff changeset
901 purple_conversation_members_remove_member(members, info, TRUE,
e61836350fce IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents: 42982
diff changeset
902 message);
e61836350fce IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents: 42982
diff changeset
903
43287
1de854696dfc Add Purple.ConversationManager.get_all_for_account
Gary Kramlich <grim@reaperworld.com>
parents: 43254
diff changeset
904 g_clear_object(&conversation);
43007
e61836350fce IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents: 42982
diff changeset
905 }
e61836350fce IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents: 42982
diff changeset
906
43287
1de854696dfc Add Purple.ConversationManager.get_all_for_account
Gary Kramlich <grim@reaperworld.com>
parents: 43254
diff changeset
907 g_clear_object(&conversations);
43226
300f85971e83 IRCv3: Set the presence to offline when we receive a quit message
Gary Kramlich <grim@reaperworld.com>
parents: 43225
diff changeset
908 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
909 g_clear_pointer(&reason, g_free);
43007
e61836350fce IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents: 42982
diff changeset
910
e61836350fce IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents: 42982
diff changeset
911 return TRUE;
e61836350fce IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents: 42982
diff changeset
912 }
43015
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
913
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
914 gboolean
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
915 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
916 G_GNUC_UNUSED const char *command,
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
917 IbisMessage *ibis_message,
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
918 gpointer data)
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
919 {
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
920 PurpleIRCv3Connection *connection = data;
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
921 PurpleContact *contact = NULL;
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
922 PurpleContactInfo *info = NULL;
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
923 IbisTags *tags = NULL;
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
924 GStrv params = NULL;
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
925 guint n_params = 0;
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
926 char *new_source = NULL;
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
927 char *user = NULL;
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
928 char *host = NULL;
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
929 const char *source = NULL;
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
930 const char *nick = NULL;
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
931
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
932 params = ibis_message_get_params(ibis_message);
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
933 n_params = g_strv_length(params);
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
934
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
935 if(n_params != 1) {
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
936 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
937 return FALSE;
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
938 }
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
939
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
940 nick = params[0];
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
941 source = ibis_message_get_source(ibis_message);
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
942 ibis_source_parse(source, NULL, &user, &host);
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
943 new_source = ibis_source_serialize(nick, user, host);
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
944 g_clear_pointer(&user, g_free);
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
945 g_clear_pointer(&host, g_free);
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
946
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
947 contact = purple_ircv3_connection_find_or_create_contact(connection,
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
948 ibis_message);
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
949 info = PURPLE_CONTACT_INFO(contact);
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
950
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
951 /* 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
952 * the contact.
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
953 */
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
954 tags = ibis_message_get_tags(ibis_message);
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
955 if(!ibis_tags_exists(tags, IBIS_TAG_ACCOUNT)) {
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
956 purple_contact_info_set_id(info, nick);
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
957 }
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
958
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
959 purple_contact_info_set_display_name(info, nick);
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
960 purple_contact_info_set_sid(info, new_source);
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
961 g_clear_pointer(&new_source, g_free);
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
962
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
963 return TRUE;
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
964 }
43024
8a7be63f83e4 IRCv3: Handle ERROR messages
Gary Kramlich <grim@reaperworld.com>
parents: 43019
diff changeset
965
8a7be63f83e4 IRCv3: Handle ERROR messages
Gary Kramlich <grim@reaperworld.com>
parents: 43019
diff changeset
966 gboolean
8a7be63f83e4 IRCv3: Handle ERROR messages
Gary Kramlich <grim@reaperworld.com>
parents: 43019
diff changeset
967 purple_ircv3_message_handler_error(IbisClient *client,
8a7be63f83e4 IRCv3: Handle ERROR messages
Gary Kramlich <grim@reaperworld.com>
parents: 43019
diff changeset
968 G_GNUC_UNUSED const char *command,
8a7be63f83e4 IRCv3: Handle ERROR messages
Gary Kramlich <grim@reaperworld.com>
parents: 43019
diff changeset
969 IbisMessage *ibis_message,
8a7be63f83e4 IRCv3: Handle ERROR messages
Gary Kramlich <grim@reaperworld.com>
parents: 43019
diff changeset
970 gpointer data)
8a7be63f83e4 IRCv3: Handle ERROR messages
Gary Kramlich <grim@reaperworld.com>
parents: 43019
diff changeset
971 {
43069
cc8ba79c350e IRCv3: Display the contents of ERROR messages in the status window
Gary Kramlich <grim@reaperworld.com>
parents: 43067
diff changeset
972 PurpleIRCv3Connection *v3_connection = data;
43024
8a7be63f83e4 IRCv3: Handle ERROR messages
Gary Kramlich <grim@reaperworld.com>
parents: 43019
diff changeset
973 GError *error = NULL;
8a7be63f83e4 IRCv3: Handle ERROR messages
Gary Kramlich <grim@reaperworld.com>
parents: 43019
diff changeset
974 GStrv params = NULL;
8a7be63f83e4 IRCv3: Handle ERROR messages
Gary Kramlich <grim@reaperworld.com>
parents: 43019
diff changeset
975 guint n_params = 0;
8a7be63f83e4 IRCv3: Handle ERROR messages
Gary Kramlich <grim@reaperworld.com>
parents: 43019
diff changeset
976 char *reason = NULL;
8a7be63f83e4 IRCv3: Handle ERROR messages
Gary Kramlich <grim@reaperworld.com>
parents: 43019
diff changeset
977
8a7be63f83e4 IRCv3: Handle ERROR messages
Gary Kramlich <grim@reaperworld.com>
parents: 43019
diff changeset
978 params = ibis_message_get_params(ibis_message);
8a7be63f83e4 IRCv3: Handle ERROR messages
Gary Kramlich <grim@reaperworld.com>
parents: 43019
diff changeset
979 n_params = g_strv_length(params);
8a7be63f83e4 IRCv3: Handle ERROR messages
Gary Kramlich <grim@reaperworld.com>
parents: 43019
diff changeset
980
8a7be63f83e4 IRCv3: Handle ERROR messages
Gary Kramlich <grim@reaperworld.com>
parents: 43019
diff changeset
981 if(n_params > 0) {
8a7be63f83e4 IRCv3: Handle ERROR messages
Gary Kramlich <grim@reaperworld.com>
parents: 43019
diff changeset
982 reason = g_strjoinv(" ", params);
8a7be63f83e4 IRCv3: Handle ERROR messages
Gary Kramlich <grim@reaperworld.com>
parents: 43019
diff changeset
983 } else {
8a7be63f83e4 IRCv3: Handle ERROR messages
Gary Kramlich <grim@reaperworld.com>
parents: 43019
diff changeset
984 reason = g_strdup(_("unknown error"));
8a7be63f83e4 IRCv3: Handle ERROR messages
Gary Kramlich <grim@reaperworld.com>
parents: 43019
diff changeset
985 }
8a7be63f83e4 IRCv3: Handle ERROR messages
Gary Kramlich <grim@reaperworld.com>
parents: 43019
diff changeset
986
43069
cc8ba79c350e IRCv3: Display the contents of ERROR messages in the status window
Gary Kramlich <grim@reaperworld.com>
parents: 43067
diff changeset
987 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
988 TRUE, FALSE);
43069
cc8ba79c350e IRCv3: Display the contents of ERROR messages in the status window
Gary Kramlich <grim@reaperworld.com>
parents: 43067
diff changeset
989
43024
8a7be63f83e4 IRCv3: Handle ERROR messages
Gary Kramlich <grim@reaperworld.com>
parents: 43019
diff changeset
990 error = g_error_new_literal(PURPLE_IRCV3_DOMAIN, 0, reason);
8a7be63f83e4 IRCv3: Handle ERROR messages
Gary Kramlich <grim@reaperworld.com>
parents: 43019
diff changeset
991 g_clear_pointer(&reason, g_free);
8a7be63f83e4 IRCv3: Handle ERROR messages
Gary Kramlich <grim@reaperworld.com>
parents: 43019
diff changeset
992
43165
201c799d4e6f ircv3: Remove redundant account disconnection
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents: 43149
diff changeset
993 ibis_client_stop(client, error);
43024
8a7be63f83e4 IRCv3: Handle ERROR messages
Gary Kramlich <grim@reaperworld.com>
parents: 43019
diff changeset
994
8a7be63f83e4 IRCv3: Handle ERROR messages
Gary Kramlich <grim@reaperworld.com>
parents: 43019
diff changeset
995 return TRUE;
8a7be63f83e4 IRCv3: Handle ERROR messages
Gary Kramlich <grim@reaperworld.com>
parents: 43019
diff changeset
996 }
43028
dda093fe275e IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents: 43025
diff changeset
997
dda093fe275e IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents: 43025
diff changeset
998 gboolean
dda093fe275e IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents: 43025
diff changeset
999 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
1000 G_GNUC_UNUSED const char *command,
dda093fe275e IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents: 43025
diff changeset
1001 IbisMessage *ibis_message,
dda093fe275e IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents: 43025
diff changeset
1002 gpointer data)
dda093fe275e IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents: 43025
diff changeset
1003 {
dda093fe275e IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents: 43025
diff changeset
1004 PurpleIRCv3Connection *v3_connection = data;
dda093fe275e IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents: 43025
diff changeset
1005 PurpleAccount *account = NULL;
dda093fe275e IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents: 43025
diff changeset
1006 PurpleConnection *connection = data;
dda093fe275e IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents: 43025
diff changeset
1007 PurpleContact *contact = NULL;
dda093fe275e IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents: 43025
diff changeset
1008 PurpleContactInfo *info = NULL;
dda093fe275e IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents: 43025
diff changeset
1009 PurpleNotification *notification = NULL;
dda093fe275e IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents: 43025
diff changeset
1010 PurpleNotificationManager *manager = NULL;
dda093fe275e IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents: 43025
diff changeset
1011 GStrv params = NULL;
dda093fe275e IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents: 43025
diff changeset
1012 char *wallops_title = NULL;
dda093fe275e IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents: 43025
diff changeset
1013 guint n_params = 0;
dda093fe275e IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents: 43025
diff changeset
1014
dda093fe275e IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents: 43025
diff changeset
1015 params = ibis_message_get_params(ibis_message);
dda093fe275e IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents: 43025
diff changeset
1016 n_params = g_strv_length(params);
dda093fe275e IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents: 43025
diff changeset
1017
dda093fe275e IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents: 43025
diff changeset
1018 if(n_params != 1) {
dda093fe275e IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents: 43025
diff changeset
1019 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
1020 return FALSE;
dda093fe275e IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents: 43025
diff changeset
1021 }
dda093fe275e IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents: 43025
diff changeset
1022
dda093fe275e IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents: 43025
diff changeset
1023 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
1024 ibis_message);
dda093fe275e IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents: 43025
diff changeset
1025 info = PURPLE_CONTACT_INFO(contact);
dda093fe275e IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents: 43025
diff changeset
1026
dda093fe275e IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents: 43025
diff changeset
1027 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
1028 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
1029 notification = purple_notification_new(NULL, wallops_title);
dda093fe275e IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents: 43025
diff changeset
1030 g_free(wallops_title);
dda093fe275e IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents: 43025
diff changeset
1031
dda093fe275e IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents: 43025
diff changeset
1032 account = purple_connection_get_account(connection);
dda093fe275e IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents: 43025
diff changeset
1033 purple_notification_set_account(notification, account);
dda093fe275e IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents: 43025
diff changeset
1034 purple_notification_set_subtitle(notification, params[0]);
dda093fe275e IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents: 43025
diff changeset
1035 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
1036
dda093fe275e IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents: 43025
diff changeset
1037 manager = purple_notification_manager_get_default();
dda093fe275e IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents: 43025
diff changeset
1038 purple_notification_manager_add(manager, notification);
dda093fe275e IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents: 43025
diff changeset
1039 g_clear_object(&notification);
dda093fe275e IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents: 43025
diff changeset
1040
dda093fe275e IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents: 43025
diff changeset
1041 return TRUE;
dda093fe275e IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents: 43025
diff changeset
1042 }
43067
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
1043
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
1044 gboolean
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
1045 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
1046 G_GNUC_UNUSED const char *command,
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
1047 IbisMessage *ibis_message,
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
1048 gpointer data)
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
1049 {
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
1050 PurpleIRCv3Connection *v3_connection = data;
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
1051 PurpleAccount *account = NULL;
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
1052 PurpleContact *kicker = NULL;
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
1053 PurpleContact *kickee = NULL;
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
1054 PurpleContactInfo *me = NULL;
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
1055 PurpleConversation *conversation = NULL;
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
1056 GStrv params = NULL;
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
1057 char *reason = NULL;
43098
13b0954a268b IRCv3: Fix kick detection and handle online conversation states
Gary Kramlich <grim@reaperworld.com>
parents: 43069
diff changeset
1058 const char *kickee_id = NULL;
13b0954a268b IRCv3: Fix kick detection and handle online conversation states
Gary Kramlich <grim@reaperworld.com>
parents: 43069
diff changeset
1059 const char *me_id = NULL;
43067
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
1060 guint n_params = 0;
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
1061
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
1062 params = ibis_message_get_params(ibis_message);
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
1063 n_params = g_strv_length(params);
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
1064
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
1065 if(n_params < 2) {
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
1066 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
1067 return FALSE;
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
1068 }
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
1069
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
1070 account = purple_connection_get_account(PURPLE_CONNECTION(v3_connection));
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
1071 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
1072 me_id = purple_contact_info_get_id(me);
43067
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
1073
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
1074 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
1075 ibis_message);
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
1076
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
1077 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
1078 params[0]);
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
1079
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
1080 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
1081 params[1]);
43098
13b0954a268b IRCv3: Fix kick detection and handle online conversation states
Gary Kramlich <grim@reaperworld.com>
parents: 43069
diff changeset
1082 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
1083
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
1084 if(n_params > 2) {
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
1085 reason = g_strjoinv(" ", params + 2);
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
1086 } else {
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
1087 reason = g_strdup(_("no reason"));
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
1088 }
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
1089
43098
13b0954a268b IRCv3: Fix kick detection and handle online conversation states
Gary Kramlich <grim@reaperworld.com>
parents: 43069
diff changeset
1090 if(purple_strequal(kickee_id, me_id)) {
43067
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
1091 GError *error = NULL;
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
1092
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
1093 error = g_error_new(PURPLE_IRCV3_DOMAIN, 0,
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
1094 _("You were kicked from %s by %s: %s"),
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
1095 params[0],
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
1096 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
1097 reason);
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
1098 purple_conversation_set_error(conversation, error);
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
1099 g_clear_error(&error);
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
1100
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
1101 purple_conversation_set_online(conversation, FALSE);
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
1102 } else {
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
1103 PurpleConversationMembers *members = NULL;
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
1104 char *contents = NULL;
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
1105
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
1106 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
1107 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
1108 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
1109 params[0],
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
1110 reason);
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
1111
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
1112 members = purple_conversation_get_members(conversation);
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
1113 purple_conversation_members_remove_member(members,
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
1114 PURPLE_CONTACT_INFO(kickee),
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
1115 TRUE,
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
1116 contents);
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
1117 g_free(contents);
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
1118 }
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
1119
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
1120 g_free(reason);
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
1121
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
1122 return TRUE;
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
1123 }
43199
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1124
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1125 gboolean
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1126 purple_ircv3_message_handler_mode(IbisClient *client,
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1127 G_GNUC_UNUSED const char *command,
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1128 IbisMessage *ibis_message,
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1129 gpointer data)
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1130 {
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1131 PurpleIRCv3Connection *v3_connection = data;
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1132 PurpleContact *contact = NULL;
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1133 PurpleConversation *conversation = NULL;
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1134 PurpleConversationMember *author = NULL;
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1135 PurpleMessage *message = NULL;
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1136 IbisModeChange *mode_changes = NULL;
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1137 GError *error = NULL;
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1138 GStrv params = NULL;
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1139 char *contents = NULL;
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1140 char *parts = NULL;
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1141 guint n_params = 0;
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1142 guint n_mode_changes = 0;
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1143 const char *target = NULL;
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1144
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1145 params = ibis_message_get_params(ibis_message);
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1146 n_params = g_strv_length(params);
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1147
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1148 if(n_params < 2) {
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1149 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
1150 return FALSE;
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1151 }
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1152
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1153 target = params[0];
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1154 if(!ibis_client_is_channel(client, target)) {
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1155 return FALSE;
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1156 }
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1157
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1158 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
1159 target);
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1160
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1161 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
1162 ibis_message);
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1163 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
1164 PURPLE_CONTACT_INFO(contact),
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1165 FALSE, NULL);
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1166
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1167 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
1168 &n_mode_changes, &error);
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1169 if(error != NULL) {
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1170 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
1171
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1172 g_clear_error(&error);
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1173
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1174 return FALSE;
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1175 }
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1176
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1177 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
1178 PurpleContact *subject = NULL;
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1179 PurpleConversationMember *member = NULL;
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1180 IbisModeChange change = mode_changes[i];
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1181 char prefix = '\0';
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1182
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1183 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
1184 if(prefix == '\0') {
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1185 continue;
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1186 }
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1187
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1188 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
1189 change.parameter);
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1190 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
1191 PURPLE_CONTACT_INFO(subject),
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1192 FALSE, NULL);
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1193
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1194 if(change.add) {
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1195 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
1196 } else {
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1197 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
1198 }
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1199 }
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1200
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1201 parts = g_strjoinv(" ", params + 1);
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1202 contents = g_strdup_printf(_("mode %s"), parts);
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1203 g_free(parts);
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1204
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1205 message = g_object_new(
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1206 PURPLE_TYPE_MESSAGE,
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1207 "author", author,
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1208 "contents", contents,
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1209 "event", TRUE,
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1210 NULL);
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1211 g_free(contents);
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1212
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1213 purple_conversation_write_message(conversation, message);
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1214 g_clear_object(&message);
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1215
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1216 return TRUE;
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1217 }
43236
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1218
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1219 gboolean
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1220 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
1221 G_GNUC_UNUSED const char *command,
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1222 IbisMessage *ibis_message,
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1223 gpointer data)
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1224 {
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1225 PurpleIRCv3Connection *v3_connection = data;
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1226 PurpleContact *contact = NULL;
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1227 PurplePresence *presence = NULL;
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1228 GStrv params = NULL;
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1229 char *sid = NULL;
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1230 guint n_params = 0;
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1231 const char *flags = NULL;
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1232
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1233 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
1234 n_params = g_strv_length(params);
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1235
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1236 /* 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
1237 *
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1238 * <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
1239 *
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1240 * 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
1241 * to use it.
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1242 */
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1243 if(n_params < 7) {
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1244 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
1245 n_params);
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1246 return FALSE;
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1247 }
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1248
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1249 /* 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
1250 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
1251 params[5]);
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1252
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1253 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
1254 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
1255
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1256 /* Process the flags starting with presence. */
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1257 flags = params[6];
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1258
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1259 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
1260 if(flags[0] == 'G') {
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1261 purple_presence_set_primitive(presence,
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1262 PURPLE_PRESENCE_PRIMITIVE_AWAY);
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1263 } else {
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1264 purple_presence_set_primitive(presence,
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1265 PURPLE_PRESENCE_PRIMITIVE_AVAILABLE);
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1266 }
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1267
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1268 /* Increment flags to the next value. */
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1269 flags += 1;
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1270
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1271 /* Check if a server admin. */
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1272 if(flags[0] == '*') {
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1273 /* 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
1274
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1275 flags += 1;
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1276 }
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1277
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1278 /* 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
1279 if(!purple_strequal(params[1], "*")) {
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1280 PurpleConversation *conversation = NULL;
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1281 PurpleConversationMember *member = NULL;
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1282
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1283 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
1284 params[1]);
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1285
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1286 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
1287 PURPLE_CONTACT_INFO(contact),
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1288 FALSE, NULL);
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1289
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1290 /* 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
1291 * 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
1292 */
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1293 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
1294 /* 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
1295 * 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
1296 */
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1297 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
1298 }
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1299 }
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1300
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1301 return TRUE;
ce4987105a4e IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43228
diff changeset
1302 }
43254
27610c58b03b IRCv3: handle RPL_NOWAWAY and RPL_UNAWAY messages
Markus Fischer <ivanhoe@fiscari.de>
parents: 43242
diff changeset
1303
27610c58b03b IRCv3: handle RPL_NOWAWAY and RPL_UNAWAY messages
Markus Fischer <ivanhoe@fiscari.de>
parents: 43242
diff changeset
1304 gboolean
27610c58b03b IRCv3: handle RPL_NOWAWAY and RPL_UNAWAY messages
Markus Fischer <ivanhoe@fiscari.de>
parents: 43242
diff changeset
1305 purple_ircv3_message_handler_nowaway(G_GNUC_UNUSED IbisClient *client,
27610c58b03b IRCv3: handle RPL_NOWAWAY and RPL_UNAWAY messages
Markus Fischer <ivanhoe@fiscari.de>
parents: 43242
diff changeset
1306 G_GNUC_UNUSED const char *command,
27610c58b03b IRCv3: handle RPL_NOWAWAY and RPL_UNAWAY messages
Markus Fischer <ivanhoe@fiscari.de>
parents: 43242
diff changeset
1307 IbisMessage *ibis_message,
27610c58b03b IRCv3: handle RPL_NOWAWAY and RPL_UNAWAY messages
Markus Fischer <ivanhoe@fiscari.de>
parents: 43242
diff changeset
1308 gpointer data)
27610c58b03b IRCv3: handle RPL_NOWAWAY and RPL_UNAWAY messages
Markus Fischer <ivanhoe@fiscari.de>
parents: 43242
diff changeset
1309 {
27610c58b03b IRCv3: handle RPL_NOWAWAY and RPL_UNAWAY messages
Markus Fischer <ivanhoe@fiscari.de>
parents: 43242
diff changeset
1310 PurpleIRCv3Connection *connection = data;
27610c58b03b IRCv3: handle RPL_NOWAWAY and RPL_UNAWAY messages
Markus Fischer <ivanhoe@fiscari.de>
parents: 43242
diff changeset
1311 PurpleContact *contact = NULL;
27610c58b03b IRCv3: handle RPL_NOWAWAY and RPL_UNAWAY messages
Markus Fischer <ivanhoe@fiscari.de>
parents: 43242
diff changeset
1312 PurplePresence *presence = NULL;
27610c58b03b IRCv3: handle RPL_NOWAWAY and RPL_UNAWAY messages
Markus Fischer <ivanhoe@fiscari.de>
parents: 43242
diff changeset
1313 GStrv params = NULL;
27610c58b03b IRCv3: handle RPL_NOWAWAY and RPL_UNAWAY messages
Markus Fischer <ivanhoe@fiscari.de>
parents: 43242
diff changeset
1314 guint n_params = 0;
27610c58b03b IRCv3: handle RPL_NOWAWAY and RPL_UNAWAY messages
Markus Fischer <ivanhoe@fiscari.de>
parents: 43242
diff changeset
1315
27610c58b03b IRCv3: handle RPL_NOWAWAY and RPL_UNAWAY messages
Markus Fischer <ivanhoe@fiscari.de>
parents: 43242
diff changeset
1316 params = ibis_message_get_params(ibis_message);
27610c58b03b IRCv3: handle RPL_NOWAWAY and RPL_UNAWAY messages
Markus Fischer <ivanhoe@fiscari.de>
parents: 43242
diff changeset
1317 n_params = g_strv_length(params);
27610c58b03b IRCv3: handle RPL_NOWAWAY and RPL_UNAWAY messages
Markus Fischer <ivanhoe@fiscari.de>
parents: 43242
diff changeset
1318
27610c58b03b IRCv3: handle RPL_NOWAWAY and RPL_UNAWAY messages
Markus Fischer <ivanhoe@fiscari.de>
parents: 43242
diff changeset
1319 if(n_params < 1) {
27610c58b03b IRCv3: handle RPL_NOWAWAY and RPL_UNAWAY messages
Markus Fischer <ivanhoe@fiscari.de>
parents: 43242
diff changeset
1320 g_message("received RPL_NOWAWAY with %u params, need at least 1", n_params);
27610c58b03b IRCv3: handle RPL_NOWAWAY and RPL_UNAWAY messages
Markus Fischer <ivanhoe@fiscari.de>
parents: 43242
diff changeset
1321 return FALSE;
27610c58b03b IRCv3: handle RPL_NOWAWAY and RPL_UNAWAY messages
Markus Fischer <ivanhoe@fiscari.de>
parents: 43242
diff changeset
1322 }
27610c58b03b IRCv3: handle RPL_NOWAWAY and RPL_UNAWAY messages
Markus Fischer <ivanhoe@fiscari.de>
parents: 43242
diff changeset
1323
27610c58b03b IRCv3: handle RPL_NOWAWAY and RPL_UNAWAY messages
Markus Fischer <ivanhoe@fiscari.de>
parents: 43242
diff changeset
1324 contact = purple_ircv3_connection_find_or_create_contact_from_nick(connection,
27610c58b03b IRCv3: handle RPL_NOWAWAY and RPL_UNAWAY messages
Markus Fischer <ivanhoe@fiscari.de>
parents: 43242
diff changeset
1325 params[0]);
27610c58b03b IRCv3: handle RPL_NOWAWAY and RPL_UNAWAY messages
Markus Fischer <ivanhoe@fiscari.de>
parents: 43242
diff changeset
1326 presence = purple_contact_info_get_presence(PURPLE_CONTACT_INFO(contact));
27610c58b03b IRCv3: handle RPL_NOWAWAY and RPL_UNAWAY messages
Markus Fischer <ivanhoe@fiscari.de>
parents: 43242
diff changeset
1327 purple_presence_set_primitive(presence,
27610c58b03b IRCv3: handle RPL_NOWAWAY and RPL_UNAWAY messages
Markus Fischer <ivanhoe@fiscari.de>
parents: 43242
diff changeset
1328 PURPLE_PRESENCE_PRIMITIVE_AWAY);
27610c58b03b IRCv3: handle RPL_NOWAWAY and RPL_UNAWAY messages
Markus Fischer <ivanhoe@fiscari.de>
parents: 43242
diff changeset
1329
27610c58b03b IRCv3: handle RPL_NOWAWAY and RPL_UNAWAY messages
Markus Fischer <ivanhoe@fiscari.de>
parents: 43242
diff changeset
1330 return TRUE;
27610c58b03b IRCv3: handle RPL_NOWAWAY and RPL_UNAWAY messages
Markus Fischer <ivanhoe@fiscari.de>
parents: 43242
diff changeset
1331 }
27610c58b03b IRCv3: handle RPL_NOWAWAY and RPL_UNAWAY messages
Markus Fischer <ivanhoe@fiscari.de>
parents: 43242
diff changeset
1332
27610c58b03b IRCv3: handle RPL_NOWAWAY and RPL_UNAWAY messages
Markus Fischer <ivanhoe@fiscari.de>
parents: 43242
diff changeset
1333 gboolean
27610c58b03b IRCv3: handle RPL_NOWAWAY and RPL_UNAWAY messages
Markus Fischer <ivanhoe@fiscari.de>
parents: 43242
diff changeset
1334 purple_ircv3_message_handler_unaway(G_GNUC_UNUSED IbisClient *client,
27610c58b03b IRCv3: handle RPL_NOWAWAY and RPL_UNAWAY messages
Markus Fischer <ivanhoe@fiscari.de>
parents: 43242
diff changeset
1335 G_GNUC_UNUSED const char *command,
27610c58b03b IRCv3: handle RPL_NOWAWAY and RPL_UNAWAY messages
Markus Fischer <ivanhoe@fiscari.de>
parents: 43242
diff changeset
1336 IbisMessage *ibis_message,
27610c58b03b IRCv3: handle RPL_NOWAWAY and RPL_UNAWAY messages
Markus Fischer <ivanhoe@fiscari.de>
parents: 43242
diff changeset
1337 gpointer data)
27610c58b03b IRCv3: handle RPL_NOWAWAY and RPL_UNAWAY messages
Markus Fischer <ivanhoe@fiscari.de>
parents: 43242
diff changeset
1338 {
27610c58b03b IRCv3: handle RPL_NOWAWAY and RPL_UNAWAY messages
Markus Fischer <ivanhoe@fiscari.de>
parents: 43242
diff changeset
1339 PurpleIRCv3Connection *connection = data;
27610c58b03b IRCv3: handle RPL_NOWAWAY and RPL_UNAWAY messages
Markus Fischer <ivanhoe@fiscari.de>
parents: 43242
diff changeset
1340 PurpleContact *contact = NULL;
27610c58b03b IRCv3: handle RPL_NOWAWAY and RPL_UNAWAY messages
Markus Fischer <ivanhoe@fiscari.de>
parents: 43242
diff changeset
1341 PurplePresence *presence = NULL;
27610c58b03b IRCv3: handle RPL_NOWAWAY and RPL_UNAWAY messages
Markus Fischer <ivanhoe@fiscari.de>
parents: 43242
diff changeset
1342 GStrv params = NULL;
27610c58b03b IRCv3: handle RPL_NOWAWAY and RPL_UNAWAY messages
Markus Fischer <ivanhoe@fiscari.de>
parents: 43242
diff changeset
1343 guint n_params = 0;
27610c58b03b IRCv3: handle RPL_NOWAWAY and RPL_UNAWAY messages
Markus Fischer <ivanhoe@fiscari.de>
parents: 43242
diff changeset
1344
27610c58b03b IRCv3: handle RPL_NOWAWAY and RPL_UNAWAY messages
Markus Fischer <ivanhoe@fiscari.de>
parents: 43242
diff changeset
1345 params = ibis_message_get_params(ibis_message);
27610c58b03b IRCv3: handle RPL_NOWAWAY and RPL_UNAWAY messages
Markus Fischer <ivanhoe@fiscari.de>
parents: 43242
diff changeset
1346 n_params = g_strv_length(params);
27610c58b03b IRCv3: handle RPL_NOWAWAY and RPL_UNAWAY messages
Markus Fischer <ivanhoe@fiscari.de>
parents: 43242
diff changeset
1347
27610c58b03b IRCv3: handle RPL_NOWAWAY and RPL_UNAWAY messages
Markus Fischer <ivanhoe@fiscari.de>
parents: 43242
diff changeset
1348 if(n_params < 1) {
27610c58b03b IRCv3: handle RPL_NOWAWAY and RPL_UNAWAY messages
Markus Fischer <ivanhoe@fiscari.de>
parents: 43242
diff changeset
1349 g_message("received RPL_UNAWAY with %u params, need at least 1", n_params);
27610c58b03b IRCv3: handle RPL_NOWAWAY and RPL_UNAWAY messages
Markus Fischer <ivanhoe@fiscari.de>
parents: 43242
diff changeset
1350 return FALSE;
27610c58b03b IRCv3: handle RPL_NOWAWAY and RPL_UNAWAY messages
Markus Fischer <ivanhoe@fiscari.de>
parents: 43242
diff changeset
1351 }
27610c58b03b IRCv3: handle RPL_NOWAWAY and RPL_UNAWAY messages
Markus Fischer <ivanhoe@fiscari.de>
parents: 43242
diff changeset
1352
27610c58b03b IRCv3: handle RPL_NOWAWAY and RPL_UNAWAY messages
Markus Fischer <ivanhoe@fiscari.de>
parents: 43242
diff changeset
1353 contact = purple_ircv3_connection_find_or_create_contact_from_nick(connection,
27610c58b03b IRCv3: handle RPL_NOWAWAY and RPL_UNAWAY messages
Markus Fischer <ivanhoe@fiscari.de>
parents: 43242
diff changeset
1354 params[0]);
27610c58b03b IRCv3: handle RPL_NOWAWAY and RPL_UNAWAY messages
Markus Fischer <ivanhoe@fiscari.de>
parents: 43242
diff changeset
1355 presence = purple_contact_info_get_presence(PURPLE_CONTACT_INFO(contact));
27610c58b03b IRCv3: handle RPL_NOWAWAY and RPL_UNAWAY messages
Markus Fischer <ivanhoe@fiscari.de>
parents: 43242
diff changeset
1356 purple_presence_set_primitive(presence, PURPLE_PRESENCE_PRIMITIVE_AVAILABLE);
27610c58b03b IRCv3: handle RPL_NOWAWAY and RPL_UNAWAY messages
Markus Fischer <ivanhoe@fiscari.de>
parents: 43242
diff changeset
1357
27610c58b03b IRCv3: handle RPL_NOWAWAY and RPL_UNAWAY messages
Markus Fischer <ivanhoe@fiscari.de>
parents: 43242
diff changeset
1358 return TRUE;
27610c58b03b IRCv3: handle RPL_NOWAWAY and RPL_UNAWAY messages
Markus Fischer <ivanhoe@fiscari.de>
parents: 43242
diff changeset
1359 }

mercurial