protocols/ircv3/purpleircv3messagehandlers.c

Sun, 30 Mar 2025 22:27:50 -0500

author
Gary Kramlich <grim@reaperworld.com>
date
Sun, 30 Mar 2025 22:27:50 -0500
changeset 43212
d2f7c939f650
parent 43206
58f66e90f24a
child 43225
f0ffa584435b
permissions
-rw-r--r--

IRCv3: Handle incoming formatting

Testing Done:
Sent the example messages from Pidgin 2 and verified they were displayed correctly.

Bugs closed: PIDGIN-18078

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

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
42780
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
195 purple_ircv3_message_handler_join(G_GNUC_UNUSED IbisClient *client,
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
196 G_GNUC_UNUSED const char *command,
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
197 IbisMessage *message,
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
198 gpointer data)
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
199 {
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
200 PurpleIRCv3Connection *connection = data;
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
201 PurpleContact *contact = NULL;
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
202 PurpleConversation *conversation = NULL;
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
203 GStrv params = NULL;
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
204 const char *conversation_name = NULL;
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
205
42815
95bb2ae83de7 IRCv3: Use Ibis.Message in PurpleIRCv3.Connection.find_or_create_contact
Gary Kramlich <grim@reaperworld.com>
parents: 42780
diff changeset
206 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
207 message);
42780
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
208
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
209 params = ibis_message_get_params(message);
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
210
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
211 /* 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
212 if(g_strv_length(params) == 1) {
42780
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
213 conversation_name = params[0];
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
214 } else {
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
215 /* 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
216 * how to parse it.
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
217 */
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
218
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
219 return TRUE;
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
220 }
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
221
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
222 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
223 conversation_name);
43025
2d3b2ed42f87 IRCv3: Fix pre-registration PRIVMSG not going to the status window
Gary Kramlich <grim@reaperworld.com>
parents: 43024
diff changeset
224 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
225
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
226 return TRUE;
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
227 }
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
228
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
229 gboolean
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
230 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
231 G_GNUC_UNUSED const char *command,
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
232 IbisMessage *message,
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
233 gpointer data)
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
234 {
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
235 PurpleIRCv3Connection *connection = data;
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
236 PurpleAccount *account = NULL;
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
237 PurpleContact *contact = NULL;
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
238 PurpleConversation *conversation = NULL;
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
239 PurpleConversationManager *manager = NULL;
42893
d73c5851a773 IRCv3: Port to Purple.ConversationMembers
Gary Kramlich <grim@reaperworld.com>
parents: 42883
diff changeset
240 PurpleConversationMembers *members = NULL;
42780
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
241 GStrv params = NULL;
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
242 guint n_params = 0;
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
243 char *reason = NULL;
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
244 const char *conversation_name = NULL;
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
245
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
246 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
247 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
248 if(n_params == 0) {
42780
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
249 /* 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
250 return TRUE;
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
251 }
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 /* 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
254 * 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
255 */
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
256 conversation_name = params[0];
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
257
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
258 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
259 manager = purple_conversation_manager_get_default();
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
260 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
261 conversation_name);
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 if(!PURPLE_IS_CONVERSATION(conversation)) {
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
264 /* TODO: write status message unknown channel. */
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 return TRUE;
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
267 }
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
268
42893
d73c5851a773 IRCv3: Port to Purple.ConversationMembers
Gary Kramlich <grim@reaperworld.com>
parents: 42883
diff changeset
269 members = purple_conversation_get_members(conversation);
d73c5851a773 IRCv3: Port to Purple.ConversationMembers
Gary Kramlich <grim@reaperworld.com>
parents: 42883
diff changeset
270
42780
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
271 /* 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
272 * 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
273 */
42815
95bb2ae83de7 IRCv3: Use Ibis.Message in PurpleIRCv3.Connection.find_or_create_contact
Gary Kramlich <grim@reaperworld.com>
parents: 42780
diff changeset
274 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
275 message);
42780
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 /* 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
278 */
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
279 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
280 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
281
7621ef6ea06a IRCv3: Update the join/part reasons to match the quit format
Gary Kramlich <grim@reaperworld.com>
parents: 43015
diff changeset
282 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
283 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
284 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
285 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
286 part_message);
7621ef6ea06a IRCv3: Update the join/part reasons to match the quit format
Gary Kramlich <grim@reaperworld.com>
parents: 43015
diff changeset
287 } else {
7621ef6ea06a IRCv3: Update the join/part reasons to match the quit format
Gary Kramlich <grim@reaperworld.com>
parents: 43015
diff changeset
288 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
289 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
290 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
291 }
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
292
42893
d73c5851a773 IRCv3: Port to Purple.ConversationMembers
Gary Kramlich <grim@reaperworld.com>
parents: 42883
diff changeset
293 purple_conversation_members_remove_member(members,
d73c5851a773 IRCv3: Port to Purple.ConversationMembers
Gary Kramlich <grim@reaperworld.com>
parents: 42883
diff changeset
294 PURPLE_CONTACT_INFO(contact),
d73c5851a773 IRCv3: Port to Purple.ConversationMembers
Gary Kramlich <grim@reaperworld.com>
parents: 42883
diff changeset
295 TRUE, reason);
42780
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
296
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
297 g_clear_pointer(&reason, g_free);
c1af98cbd43a IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents: 42775
diff changeset
298
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 gboolean
42925
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
303 purple_ircv3_message_handler_namreply(IbisClient *client,
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
304 G_GNUC_UNUSED const char *command,
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
305 IbisMessage *message, gpointer data)
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
306 {
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
307 PurpleIRCv3Connection *connection = data;
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
308 PurpleConversation *conversation = NULL;
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
309 GStrv params = NULL;
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
310 GStrv nicks = NULL;
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
311 const char *target = NULL;
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
312
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
313 params = ibis_message_get_params(message);
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
314 if(params == NULL) {
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
315 g_warning("namreply received with no parameters");
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
316
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
317 return FALSE;
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
318 }
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
319
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
320 if(g_strv_length(params) != 4) {
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
321 char *body = g_strjoinv(" ", params);
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
322 g_warning("unknown namreply format: '%s'", body);
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
323 g_free(body);
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
324
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
325 return FALSE;
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
326 }
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
327
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
328 /* 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
329 * (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
330 */
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
331
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
332 target = params[2];
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
333 if(!ibis_client_is_channel(client, target)) {
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
334 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
335 target);
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
336
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
337 return FALSE;
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
338 }
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
339
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
340 conversation = purple_ircv3_connection_find_or_create_conversation(connection,
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
341 target);
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
342
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
343 /* 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
344 nicks = g_strsplit(params[3], " ", -1);
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
345 if(nicks != NULL) {
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
346 PurpleAccount *account = NULL;
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
347 PurpleConnection *purple_connection = NULL;
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
348 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
349 PurpleConversationMembers *existing_members = NULL;
1400ae254c24 IRCv3: use Purple.ConversationMembers.extend when joining channels
Gary Kramlich <grim@reaperworld.com>
parents: 43199
diff changeset
350 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
351 const char *active_nick = NULL;
42925
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
352
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
353 purple_connection = PURPLE_CONNECTION(connection);
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
354 account = purple_connection_get_account(purple_connection);
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
355
43205
1400ae254c24 IRCv3: use Purple.ConversationMembers.extend when joining channels
Gary Kramlich <grim@reaperworld.com>
parents: 43199
diff changeset
356 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
357 new_members = purple_conversation_members_new();
42925
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
358
43206
58f66e90f24a IRCv3: Don't add the libpurple user when joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43205
diff changeset
359 /* 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
360 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
361
42925
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
362 for(guint i = 0; i < g_strv_length(nicks); i++) {
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
363 PurpleContact *contact = NULL;
43102
bdddb2c34d88 IRCv3: Add badges
Gary Kramlich <grim@reaperworld.com>
parents: 43100
diff changeset
364 PurpleConversationMember *member = NULL;
42925
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
365 const char *nick = nicks[i];
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
366 char *stripped = NULL;
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 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
369 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
370 g_free(stripped);
58f66e90f24a IRCv3: Don't add the libpurple user when joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43205
diff changeset
371
58f66e90f24a IRCv3: Don't add the libpurple user when joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43205
diff changeset
372 continue;
58f66e90f24a IRCv3: Don't add the libpurple user when joining a channel
Gary Kramlich <grim@reaperworld.com>
parents: 43205
diff changeset
373 }
42925
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
374
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
375 contact = purple_contact_manager_find_with_id(manager, account,
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
376 stripped);
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
377 if(!PURPLE_IS_CONTACT(contact)) {
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
378 contact = purple_contact_new(account, stripped);
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
379 purple_contact_info_set_username(PURPLE_CONTACT_INFO(contact),
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
380 stripped);
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
381 purple_contact_manager_add(manager, contact);
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
382 }
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
383
43205
1400ae254c24 IRCv3: use Purple.ConversationMembers.extend when joining channels
Gary Kramlich <grim@reaperworld.com>
parents: 43199
diff changeset
384 member = purple_conversation_members_add_member(new_members,
43102
bdddb2c34d88 IRCv3: Add badges
Gary Kramlich <grim@reaperworld.com>
parents: 43100
diff changeset
385 PURPLE_CONTACT_INFO(contact),
bdddb2c34d88 IRCv3: Add badges
Gary Kramlich <grim@reaperworld.com>
parents: 43100
diff changeset
386 FALSE, NULL);
bdddb2c34d88 IRCv3: Add badges
Gary Kramlich <grim@reaperworld.com>
parents: 43100
diff changeset
387
bdddb2c34d88 IRCv3: Add badges
Gary Kramlich <grim@reaperworld.com>
parents: 43100
diff changeset
388 purple_ircv3_add_badges_to_member(member, client, nick);
bdddb2c34d88 IRCv3: Add badges
Gary Kramlich <grim@reaperworld.com>
parents: 43100
diff changeset
389
42925
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
390 g_free(stripped);
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
391 }
43205
1400ae254c24 IRCv3: use Purple.ConversationMembers.extend when joining channels
Gary Kramlich <grim@reaperworld.com>
parents: 43199
diff changeset
392
1400ae254c24 IRCv3: use Purple.ConversationMembers.extend when joining channels
Gary Kramlich <grim@reaperworld.com>
parents: 43199
diff changeset
393 purple_conversation_members_extend(existing_members, new_members);
42925
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
394 }
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
395
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
396 g_strfreev(nicks);
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
397
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
398 return TRUE;
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
399 }
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
400
3c9b77d62b0d IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents: 42920
diff changeset
401 gboolean
42896
5c8f4a455d3c IRCv3: Use Ibis.Client.is_channel instead of our old version
Gary Kramlich <grim@reaperworld.com>
parents: 42893
diff changeset
402 purple_ircv3_message_handler_tagmsg(IbisClient *client,
42883
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
403 G_GNUC_UNUSED const char *command,
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
404 IbisMessage *ibis_message, gpointer data)
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
405 {
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
406 PurpleIRCv3Connection *connection = data;
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
407 PurpleContact *contact = NULL;
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
408 PurpleConversation *conversation = NULL;
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
409 GStrv params = NULL;
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
410 IbisTags *tags = NULL;
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
411 const char *target = NULL;
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
412 const char *value = NULL;
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
413
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
414 params = ibis_message_get_params(ibis_message);
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
415 tags = ibis_message_get_tags(ibis_message);
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
416
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
417 if(params == NULL) {
42920
897667cab3ce Add support for CTCP ACTION
Gary Kramlich <grim@reaperworld.com>
parents: 42896
diff changeset
418 g_warning("tagmsg received with no parameters");
42883
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
419
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
420 return FALSE;
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
421 }
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
422
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
423 if(g_strv_length(params) != 1) {
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
424 char *body = g_strjoinv(" ", params);
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
425 g_warning("unknown tagmsg message format: '%s'", body);
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
426 g_free(body);
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
427
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
428 return FALSE;
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
429 }
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
430
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
431 /* Find or create the contact. */
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
432 contact = purple_ircv3_connection_find_or_create_contact(connection,
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
433 ibis_message);
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
434
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
435 /* Find or create the conversation. */
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
436 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
437 if(!ibis_client_is_channel(client, target)) {
42883
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
438 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
439 }
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
440
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
441 conversation = purple_ircv3_connection_find_or_create_conversation(connection,
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
442 target);
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
443
43025
2d3b2ed42f87 IRCv3: Fix pre-registration PRIVMSG not going to the status window
Gary Kramlich <grim@reaperworld.com>
parents: 43024
diff changeset
444 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
445
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
446 /* Handle typing notifications. */
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
447 value = ibis_tags_lookup(tags, IBIS_TAG_TYPING);
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
448 if(!purple_strempty(value)) {
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
449 PurpleConversationMember *member = NULL;
42893
d73c5851a773 IRCv3: Port to Purple.ConversationMembers
Gary Kramlich <grim@reaperworld.com>
parents: 42883
diff changeset
450 PurpleConversationMembers *members = NULL;
42883
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
451 PurpleTypingState state = PURPLE_TYPING_STATE_NONE;
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
452 guint timeout = 1;
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
453
42893
d73c5851a773 IRCv3: Port to Purple.ConversationMembers
Gary Kramlich <grim@reaperworld.com>
parents: 42883
diff changeset
454 members = purple_conversation_get_members(conversation);
d73c5851a773 IRCv3: Port to Purple.ConversationMembers
Gary Kramlich <grim@reaperworld.com>
parents: 42883
diff changeset
455 member = purple_conversation_members_find_member(members,
d73c5851a773 IRCv3: Port to Purple.ConversationMembers
Gary Kramlich <grim@reaperworld.com>
parents: 42883
diff changeset
456 PURPLE_CONTACT_INFO(contact));
42883
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
457
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
458 if(purple_strequal(value, IBIS_TYPING_ACTIVE)) {
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
459 state = PURPLE_TYPING_STATE_TYPING;
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
460 timeout = 6;
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
461 } else if(purple_strequal(value, IBIS_TYPING_PAUSED)) {
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
462 state = PURPLE_TYPING_STATE_PAUSED;
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
463 timeout = 30;
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
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
466 purple_conversation_member_set_typing_state(member, state, timeout);
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
467 }
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
468
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
469 return TRUE;
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
470 }
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
471
51a0fe1e2500 IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents: 42815
diff changeset
472 gboolean
42896
5c8f4a455d3c IRCv3: Use Ibis.Client.is_channel instead of our old version
Gary Kramlich <grim@reaperworld.com>
parents: 42893
diff changeset
473 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
474 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
475 {
86302ce7e3c1 Add support for handling PRIVMSG and NOTICE messages from the server
Gary Kramlich <grim@reaperworld.com>
parents: 41807
diff changeset
476 PurpleIRCv3Connection *connection = data;
86302ce7e3c1 Add support for handling PRIVMSG and NOTICE messages from the server
Gary Kramlich <grim@reaperworld.com>
parents: 41807
diff changeset
477 PurpleContact *contact = NULL;
86302ce7e3c1 Add support for handling PRIVMSG and NOTICE messages from the server
Gary Kramlich <grim@reaperworld.com>
parents: 41807
diff changeset
478 PurpleConversation *conversation = NULL;
43100
e6df74d36862 Change Purple.Message:author to Purple.ConversationMember
Gary Kramlich <grim@reaperworld.com>
parents: 43098
diff changeset
479 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
480 PurpleMessage *message = NULL;
42056
ced07483f66a IRCv3: Add support for the msgid specification
Gary Kramlich <grim@reaperworld.com>
parents: 42048
diff changeset
481 GDateTime *dt = NULL;
42920
897667cab3ce Add support for CTCP ACTION
Gary Kramlich <grim@reaperworld.com>
parents: 42896
diff changeset
482 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
483 IbisTags *tags = NULL;
42333
a34601ac633c Add PurpleIRCv3Message represent messages rather than multiple variables
Gary Kramlich <grim@reaperworld.com>
parents: 42320
diff changeset
484 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
485 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
486 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
487
42769
c488d7af2923 Move the IRCv3 protocol plugin to our new Ibis library
Gary Kramlich <grim@reaperworld.com>
parents: 42652
diff changeset
488 params = ibis_message_get_params(ibis_message);
42920
897667cab3ce Add support for CTCP ACTION
Gary Kramlich <grim@reaperworld.com>
parents: 42896
diff changeset
489 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
490 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
491
42382
343e30628383 IRCv3: Fix an issue scanbuild found
Gary Kramlich <grim@reaperworld.com>
parents: 42378
diff changeset
492 if(params == NULL) {
343e30628383 IRCv3: Fix an issue scanbuild found
Gary Kramlich <grim@reaperworld.com>
parents: 42378
diff changeset
493 g_warning("privmsg received with no parameters");
343e30628383 IRCv3: Fix an issue scanbuild found
Gary Kramlich <grim@reaperworld.com>
parents: 42378
diff changeset
494
343e30628383 IRCv3: Fix an issue scanbuild found
Gary Kramlich <grim@reaperworld.com>
parents: 42378
diff changeset
495 return FALSE;
343e30628383 IRCv3: Fix an issue scanbuild found
Gary Kramlich <grim@reaperworld.com>
parents: 42378
diff changeset
496 }
343e30628383 IRCv3: Fix an issue scanbuild found
Gary Kramlich <grim@reaperworld.com>
parents: 42378
diff changeset
497
343e30628383 IRCv3: Fix an issue scanbuild found
Gary Kramlich <grim@reaperworld.com>
parents: 42378
diff changeset
498 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
499 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
500 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
501 g_free(body);
86302ce7e3c1 Add support for handling PRIVMSG and NOTICE messages from the server
Gary Kramlich <grim@reaperworld.com>
parents: 41807
diff changeset
502
86302ce7e3c1 Add support for handling PRIVMSG and NOTICE messages from the server
Gary Kramlich <grim@reaperworld.com>
parents: 41807
diff changeset
503 return FALSE;
86302ce7e3c1 Add support for handling PRIVMSG and NOTICE messages from the server
Gary Kramlich <grim@reaperworld.com>
parents: 41807
diff changeset
504 }
86302ce7e3c1 Add support for handling PRIVMSG and NOTICE messages from the server
Gary Kramlich <grim@reaperworld.com>
parents: 41807
diff changeset
505
42815
95bb2ae83de7 IRCv3: Use Ibis.Message in PurpleIRCv3.Connection.find_or_create_contact
Gary Kramlich <grim@reaperworld.com>
parents: 42780
diff changeset
506 /* 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
507 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
508 ibis_message);
42345
e01084003f50 IRCv3: Finally fix sending messages between two users
Gary Kramlich <grim@reaperworld.com>
parents: 42333
diff changeset
509
41813
86302ce7e3c1 Add support for handling PRIVMSG and NOTICE messages from the server
Gary Kramlich <grim@reaperworld.com>
parents: 41807
diff changeset
510 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
511 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
512 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
513 }
42815
95bb2ae83de7 IRCv3: Use Ibis.Message in PurpleIRCv3.Connection.find_or_create_contact
Gary Kramlich <grim@reaperworld.com>
parents: 42780
diff changeset
514
43024
8a7be63f83e4 IRCv3: Handle ERROR messages
Gary Kramlich <grim@reaperworld.com>
parents: 43019
diff changeset
515 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
516 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
517 announce = FALSE;
42926
c63faf01193e Display CTCP requests in the status window
Gary Kramlich <grim@reaperworld.com>
parents: 42925
diff changeset
518 }
42513
482ba61e5123 IRCv3: Add an ircv3_connection_find_or_create_contact
Gary Kramlich <grim@reaperworld.com>
parents: 42510
diff changeset
519
42920
897667cab3ce Add support for CTCP ACTION
Gary Kramlich <grim@reaperworld.com>
parents: 42896
diff changeset
520 if(IBIS_IS_CTCP_MESSAGE(ctcp_message)) {
897667cab3ce Add support for CTCP ACTION
Gary Kramlich <grim@reaperworld.com>
parents: 42896
diff changeset
521 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
522 GStrv ctcp_params = NULL;
897667cab3ce Add support for CTCP ACTION
Gary Kramlich <grim@reaperworld.com>
parents: 42896
diff changeset
523 char *ctcp_body = NULL;
897667cab3ce Add support for CTCP ACTION
Gary Kramlich <grim@reaperworld.com>
parents: 42896
diff changeset
524 char *stripped = NULL;
897667cab3ce Add support for CTCP ACTION
Gary Kramlich <grim@reaperworld.com>
parents: 42896
diff changeset
525
43198
570996d7ad96 Fix CTCP ACTION going to the status window
Gary Kramlich <grim@reaperworld.com>
parents: 43195
diff changeset
526 conversation = purple_ircv3_connection_find_or_create_conversation(connection,
570996d7ad96 Fix CTCP ACTION going to the status window
Gary Kramlich <grim@reaperworld.com>
parents: 43195
diff changeset
527 target);
570996d7ad96 Fix CTCP ACTION going to the status window
Gary Kramlich <grim@reaperworld.com>
parents: 43195
diff changeset
528 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
529 conversation,
570996d7ad96 Fix CTCP ACTION going to the status window
Gary Kramlich <grim@reaperworld.com>
parents: 43195
diff changeset
530 announce);
570996d7ad96 Fix CTCP ACTION going to the status window
Gary Kramlich <grim@reaperworld.com>
parents: 43195
diff changeset
531
42920
897667cab3ce Add support for CTCP ACTION
Gary Kramlich <grim@reaperworld.com>
parents: 42896
diff changeset
532 ctcp_params = ibis_ctcp_message_get_params(ctcp_message);
897667cab3ce Add support for CTCP ACTION
Gary Kramlich <grim@reaperworld.com>
parents: 42896
diff changeset
533 ctcp_body = g_strjoinv(" ", ctcp_params);
897667cab3ce Add support for CTCP ACTION
Gary Kramlich <grim@reaperworld.com>
parents: 42896
diff changeset
534 stripped = ibis_formatting_strip(ctcp_body);
897667cab3ce Add support for CTCP ACTION
Gary Kramlich <grim@reaperworld.com>
parents: 42896
diff changeset
535 g_free(ctcp_body);
897667cab3ce Add support for CTCP ACTION
Gary Kramlich <grim@reaperworld.com>
parents: 42896
diff changeset
536
43100
e6df74d36862 Change Purple.Message:author to Purple.ConversationMember
Gary Kramlich <grim@reaperworld.com>
parents: 43098
diff changeset
537 message = purple_message_new(member, stripped);
42920
897667cab3ce Add support for CTCP ACTION
Gary Kramlich <grim@reaperworld.com>
parents: 42896
diff changeset
538 g_free(stripped);
897667cab3ce Add support for CTCP ACTION
Gary Kramlich <grim@reaperworld.com>
parents: 42896
diff changeset
539
897667cab3ce Add support for CTCP ACTION
Gary Kramlich <grim@reaperworld.com>
parents: 42896
diff changeset
540 purple_message_set_action(message, TRUE);
42926
c63faf01193e Display CTCP requests in the status window
Gary Kramlich <grim@reaperworld.com>
parents: 42925
diff changeset
541 } else {
c63faf01193e Display CTCP requests in the status window
Gary Kramlich <grim@reaperworld.com>
parents: 42925
diff changeset
542 char *body = NULL;
c63faf01193e Display CTCP requests in the status window
Gary Kramlich <grim@reaperworld.com>
parents: 42925
diff changeset
543
43198
570996d7ad96 Fix CTCP ACTION going to the status window
Gary Kramlich <grim@reaperworld.com>
parents: 43195
diff changeset
544 announce = FALSE;
570996d7ad96 Fix CTCP ACTION going to the status window
Gary Kramlich <grim@reaperworld.com>
parents: 43195
diff changeset
545 conversation = purple_ircv3_connection_get_status_conversation(connection);
570996d7ad96 Fix CTCP ACTION going to the status window
Gary Kramlich <grim@reaperworld.com>
parents: 43195
diff changeset
546 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
547 conversation,
570996d7ad96 Fix CTCP ACTION going to the status window
Gary Kramlich <grim@reaperworld.com>
parents: 43195
diff changeset
548 announce);
570996d7ad96 Fix CTCP ACTION going to the status window
Gary Kramlich <grim@reaperworld.com>
parents: 43195
diff changeset
549
42926
c63faf01193e Display CTCP requests in the status window
Gary Kramlich <grim@reaperworld.com>
parents: 42925
diff changeset
550 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
551 ibis_ctcp_message_get_command(ctcp_message),
c63faf01193e Display CTCP requests in the status window
Gary Kramlich <grim@reaperworld.com>
parents: 42925
diff changeset
552 params[0],
c63faf01193e Display CTCP requests in the status window
Gary Kramlich <grim@reaperworld.com>
parents: 42925
diff changeset
553 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
554
43100
e6df74d36862 Change Purple.Message:author to Purple.ConversationMember
Gary Kramlich <grim@reaperworld.com>
parents: 43098
diff changeset
555 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
556 purple_message_set_event(message, TRUE);
42926
c63faf01193e Display CTCP requests in the status window
Gary Kramlich <grim@reaperworld.com>
parents: 42925
diff changeset
557 g_free(body);
42920
897667cab3ce Add support for CTCP ACTION
Gary Kramlich <grim@reaperworld.com>
parents: 42896
diff changeset
558 }
43198
570996d7ad96 Fix CTCP ACTION going to the status window
Gary Kramlich <grim@reaperworld.com>
parents: 43195
diff changeset
559 } else {
43212
d2f7c939f650 IRCv3: Handle incoming formatting
Gary Kramlich <grim@reaperworld.com>
parents: 43206
diff changeset
560 PangoAttrList *attrs = NULL;
43198
570996d7ad96 Fix CTCP ACTION going to the status window
Gary Kramlich <grim@reaperworld.com>
parents: 43195
diff changeset
561 char *stripped = NULL;
42920
897667cab3ce Add support for CTCP ACTION
Gary Kramlich <grim@reaperworld.com>
parents: 42896
diff changeset
562
43198
570996d7ad96 Fix CTCP ACTION going to the status window
Gary Kramlich <grim@reaperworld.com>
parents: 43195
diff changeset
563 conversation = purple_ircv3_connection_find_or_create_conversation(connection,
570996d7ad96 Fix CTCP ACTION going to the status window
Gary Kramlich <grim@reaperworld.com>
parents: 43195
diff changeset
564 target);
570996d7ad96 Fix CTCP ACTION going to the status window
Gary Kramlich <grim@reaperworld.com>
parents: 43195
diff changeset
565 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
566 conversation,
570996d7ad96 Fix CTCP ACTION going to the status window
Gary Kramlich <grim@reaperworld.com>
parents: 43195
diff changeset
567 announce);
42920
897667cab3ce Add support for CTCP ACTION
Gary Kramlich <grim@reaperworld.com>
parents: 42896
diff changeset
568
43212
d2f7c939f650 IRCv3: Handle incoming formatting
Gary Kramlich <grim@reaperworld.com>
parents: 43206
diff changeset
569 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
570 message = purple_message_new(member, stripped);
43212
d2f7c939f650 IRCv3: Handle incoming formatting
Gary Kramlich <grim@reaperworld.com>
parents: 43206
diff changeset
571 purple_message_set_attributes(message, attrs);
42920
897667cab3ce Add support for CTCP ACTION
Gary Kramlich <grim@reaperworld.com>
parents: 42896
diff changeset
572 g_clear_pointer(&stripped, g_free);
43212
d2f7c939f650 IRCv3: Handle incoming formatting
Gary Kramlich <grim@reaperworld.com>
parents: 43206
diff changeset
573 g_clear_pointer(&attrs, pango_attr_list_unref);
42920
897667cab3ce Add support for CTCP ACTION
Gary Kramlich <grim@reaperworld.com>
parents: 42896
diff changeset
574 }
897667cab3ce Add support for CTCP ACTION
Gary Kramlich <grim@reaperworld.com>
parents: 42896
diff changeset
575
42769
c488d7af2923 Move the IRCv3 protocol plugin to our new Ibis library
Gary Kramlich <grim@reaperworld.com>
parents: 42652
diff changeset
576 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
577 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
578 }
86302ce7e3c1 Add support for handling PRIVMSG and NOTICE messages from the server
Gary Kramlich <grim@reaperworld.com>
parents: 41807
diff changeset
579
42775
98b71fc8a330 Only check tags if we have a tags object
Gary Kramlich <grim@reaperworld.com>
parents: 42769
diff changeset
580 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
581 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
582
42775
98b71fc8a330 Only check tags if we have a tags object
Gary Kramlich <grim@reaperworld.com>
parents: 42769
diff changeset
583 /* 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
584 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
585 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
586 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
587 }
42294
462317d1382d IRCv3: add support for the server-time capability
Gary Kramlich <grim@reaperworld.com>
parents: 42275
diff changeset
588
42775
98b71fc8a330 Only check tags if we have a tags object
Gary Kramlich <grim@reaperworld.com>
parents: 42769
diff changeset
589 /* 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
590 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
591 if(!purple_strempty(raw_tag)) {
98b71fc8a330 Only check tags if we have a tags object
Gary Kramlich <grim@reaperworld.com>
parents: 42769
diff changeset
592 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
593
42775
98b71fc8a330 Only check tags if we have a tags object
Gary Kramlich <grim@reaperworld.com>
parents: 42769
diff changeset
594 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
595 g_time_zone_unref(tz);
42294
462317d1382d IRCv3: add support for the server-time capability
Gary Kramlich <grim@reaperworld.com>
parents: 42275
diff changeset
596
42815
95bb2ae83de7 IRCv3: Use Ibis.Message in PurpleIRCv3.Connection.find_or_create_contact
Gary Kramlich <grim@reaperworld.com>
parents: 42780
diff changeset
597 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
598 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
599 }
42294
462317d1382d IRCv3: add support for the server-time capability
Gary Kramlich <grim@reaperworld.com>
parents: 42275
diff changeset
600 }
462317d1382d IRCv3: add support for the server-time capability
Gary Kramlich <grim@reaperworld.com>
parents: 42275
diff changeset
601
462317d1382d IRCv3: add support for the server-time capability
Gary Kramlich <grim@reaperworld.com>
parents: 42275
diff changeset
602 /* 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
603 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
604 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
605 }
42056
ced07483f66a IRCv3: Add support for the msgid specification
Gary Kramlich <grim@reaperworld.com>
parents: 42048
diff changeset
606
42769
c488d7af2923 Move the IRCv3 protocol plugin to our new Ibis library
Gary Kramlich <grim@reaperworld.com>
parents: 42652
diff changeset
607 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
608
41813
86302ce7e3c1 Add support for handling PRIVMSG and NOTICE messages from the server
Gary Kramlich <grim@reaperworld.com>
parents: 41807
diff changeset
609 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
610
42937
34ac8ac8c7b6 Implement CTCP VERSION response
Gary Kramlich <grim@reaperworld.com>
parents: 42926
diff changeset
611 /* 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
612 * to attempt to handle it.
34ac8ac8c7b6 Implement CTCP VERSION response
Gary Kramlich <grim@reaperworld.com>
parents: 42926
diff changeset
613 */
34ac8ac8c7b6 Implement CTCP VERSION response
Gary Kramlich <grim@reaperworld.com>
parents: 42926
diff changeset
614 if(IBIS_IS_CTCP_MESSAGE(ctcp_message) &&
34ac8ac8c7b6 Implement CTCP VERSION response
Gary Kramlich <grim@reaperworld.com>
parents: 42926
diff changeset
615 purple_strequal(command, IBIS_MSG_PRIVMSG))
34ac8ac8c7b6 Implement CTCP VERSION response
Gary Kramlich <grim@reaperworld.com>
parents: 42926
diff changeset
616 {
34ac8ac8c7b6 Implement CTCP VERSION response
Gary Kramlich <grim@reaperworld.com>
parents: 42926
diff changeset
617 purple_ircv3_ctcp_handler(connection, client, ibis_message);
34ac8ac8c7b6 Implement CTCP VERSION response
Gary Kramlich <grim@reaperworld.com>
parents: 42926
diff changeset
618 }
34ac8ac8c7b6 Implement CTCP VERSION response
Gary Kramlich <grim@reaperworld.com>
parents: 42926
diff changeset
619
41813
86302ce7e3c1 Add support for handling PRIVMSG and NOTICE messages from the server
Gary Kramlich <grim@reaperworld.com>
parents: 41807
diff changeset
620 return TRUE;
86302ce7e3c1 Add support for handling PRIVMSG and NOTICE messages from the server
Gary Kramlich <grim@reaperworld.com>
parents: 41807
diff changeset
621 }
42503
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
622
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
623 gboolean
42769
c488d7af2923 Move the IRCv3 protocol plugin to our new Ibis library
Gary Kramlich <grim@reaperworld.com>
parents: 42652
diff changeset
624 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
625 const char *command, IbisMessage *message,
42503
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
626 gpointer data)
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
627 {
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
628 PurpleIRCv3Connection *connection = data;
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
629 PurpleConversation *conversation = NULL;
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
630 GStrv params = NULL;
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
631 const char *channel = NULL;
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
632 const char *topic = NULL;
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
633 guint n_params = 0;
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
634
42769
c488d7af2923 Move the IRCv3 protocol plugin to our new Ibis library
Gary Kramlich <grim@reaperworld.com>
parents: 42652
diff changeset
635 params = ibis_message_get_params(message);
42503
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
636 n_params = g_strv_length(params);
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
637
42769
c488d7af2923 Move the IRCv3 protocol plugin to our new Ibis library
Gary Kramlich <grim@reaperworld.com>
parents: 42652
diff changeset
638 if(purple_strequal(command, IBIS_MSG_TOPIC)) {
42503
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
639 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
640 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
641 n_params);
42503
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
642
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
643 return FALSE;
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
644 }
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
645
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
646 channel = params[0];
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
647 topic = params[1];
42769
c488d7af2923 Move the IRCv3 protocol plugin to our new Ibis library
Gary Kramlich <grim@reaperworld.com>
parents: 42652
diff changeset
648 } 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
649 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
650 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
651 n_params);
42503
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
652
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
653 return FALSE;
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
654 }
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
655
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
656 channel = params[1];
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
657 topic = "";
42769
c488d7af2923 Move the IRCv3 protocol plugin to our new Ibis library
Gary Kramlich <grim@reaperworld.com>
parents: 42652
diff changeset
658 } 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
659 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
660 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
661 n_params);
42503
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
662
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
663 return FALSE;
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
664 }
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
665
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
666 channel = params[1];
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
667 topic = params[2];
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
668 } else {
42769
c488d7af2923 Move the IRCv3 protocol plugin to our new Ibis library
Gary Kramlich <grim@reaperworld.com>
parents: 42652
diff changeset
669 g_message("unexpected command %s", command);
42503
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
670
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
671 return FALSE;
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
672 }
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
673
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
674 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
675 channel);
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
676 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
677 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
678
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
679 return FALSE;
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
680 }
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
681
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
682 purple_conversation_set_topic(conversation, topic);
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
683
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
684 return TRUE;
55eff782a478 IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents: 42494
diff changeset
685 }
43007
e61836350fce IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents: 42982
diff changeset
686
e61836350fce IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents: 42982
diff changeset
687 gboolean
e61836350fce IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents: 42982
diff changeset
688 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
689 G_GNUC_UNUSED const char *command,
e61836350fce IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents: 42982
diff changeset
690 IbisMessage *ibis_message,
e61836350fce IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents: 42982
diff changeset
691 gpointer data)
e61836350fce IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents: 42982
diff changeset
692 {
e61836350fce IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents: 42982
diff changeset
693 PurpleIRCv3Connection *connection = data;
e61836350fce IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents: 42982
diff changeset
694 PurpleContact *contact = NULL;
e61836350fce IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents: 42982
diff changeset
695 PurpleContactInfo *info = NULL;
e61836350fce IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents: 42982
diff changeset
696 PurpleConversationManager *manager = NULL;
e61836350fce IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents: 42982
diff changeset
697 GList *conversations = NULL;
e61836350fce IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents: 42982
diff changeset
698 GStrv params = NULL;
e61836350fce IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents: 42982
diff changeset
699 guint n_params = 0;
e61836350fce IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents: 42982
diff changeset
700 char *message = NULL;
e61836350fce IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents: 42982
diff changeset
701
e61836350fce IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents: 42982
diff changeset
702 params = ibis_message_get_params(ibis_message);
e61836350fce IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents: 42982
diff changeset
703 n_params = g_strv_length(params);
e61836350fce IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents: 42982
diff changeset
704
e61836350fce IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents: 42982
diff changeset
705 contact = purple_ircv3_connection_find_or_create_contact(connection,
e61836350fce IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents: 42982
diff changeset
706 ibis_message);
e61836350fce IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents: 42982
diff changeset
707 info = PURPLE_CONTACT_INFO(contact);
e61836350fce IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents: 42982
diff changeset
708
e61836350fce IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents: 42982
diff changeset
709 if(n_params > 0) {
e61836350fce IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents: 42982
diff changeset
710 char *reason = NULL;
e61836350fce IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents: 42982
diff changeset
711
e61836350fce IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents: 42982
diff changeset
712 reason = g_strjoinv(" ", params);
e61836350fce IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents: 42982
diff changeset
713 message = g_strdup_printf("%s has quit (%s)",
e61836350fce IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents: 42982
diff changeset
714 purple_contact_info_get_sid(info),
e61836350fce IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents: 42982
diff changeset
715 reason);
e61836350fce IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents: 42982
diff changeset
716 g_free(reason);
e61836350fce IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents: 42982
diff changeset
717 } else {
e61836350fce IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents: 42982
diff changeset
718 message = g_strdup_printf("%s has quit",
e61836350fce IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents: 42982
diff changeset
719 purple_contact_info_get_sid(info));
e61836350fce IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents: 42982
diff changeset
720 }
e61836350fce IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents: 42982
diff changeset
721
e61836350fce IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents: 42982
diff changeset
722 manager = purple_conversation_manager_get_default();
e61836350fce IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents: 42982
diff changeset
723 conversations = purple_conversation_manager_get_all(manager);
e61836350fce IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents: 42982
diff changeset
724 while(conversations != NULL) {
e61836350fce IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents: 42982
diff changeset
725 PurpleConversation *conversation = conversations->data;
e61836350fce IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents: 42982
diff changeset
726 PurpleConversationMembers *members = NULL;
e61836350fce IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents: 42982
diff changeset
727
e61836350fce IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents: 42982
diff changeset
728 members = purple_conversation_get_members(conversation);
e61836350fce IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents: 42982
diff changeset
729 purple_conversation_members_remove_member(members, info, TRUE,
e61836350fce IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents: 42982
diff changeset
730 message);
e61836350fce IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents: 42982
diff changeset
731
e61836350fce IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents: 42982
diff changeset
732 conversations = g_list_delete_link(conversations, conversations);
e61836350fce IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents: 42982
diff changeset
733 }
e61836350fce IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents: 42982
diff changeset
734
e61836350fce IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents: 42982
diff changeset
735 g_free(message);
e61836350fce IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents: 42982
diff changeset
736
e61836350fce IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents: 42982
diff changeset
737 return TRUE;
e61836350fce IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents: 42982
diff changeset
738 }
43015
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
739
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
740 gboolean
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
741 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
742 G_GNUC_UNUSED const char *command,
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
743 IbisMessage *ibis_message,
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
744 gpointer data)
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
745 {
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
746 PurpleIRCv3Connection *connection = data;
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
747 PurpleContact *contact = NULL;
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
748 PurpleContactInfo *info = NULL;
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
749 IbisTags *tags = NULL;
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
750 GStrv params = NULL;
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
751 guint n_params = 0;
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
752 char *new_source = NULL;
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
753 char *user = NULL;
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
754 char *host = NULL;
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
755 const char *source = NULL;
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
756 const char *nick = NULL;
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
757
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
758 params = ibis_message_get_params(ibis_message);
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
759 n_params = g_strv_length(params);
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
760
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
761 if(n_params != 1) {
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
762 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
763 return FALSE;
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
764 }
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
765
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
766 nick = params[0];
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
767 source = ibis_message_get_source(ibis_message);
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
768 ibis_source_parse(source, NULL, &user, &host);
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
769 new_source = ibis_source_serialize(nick, user, host);
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
770 g_clear_pointer(&user, g_free);
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
771 g_clear_pointer(&host, g_free);
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
772
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
773 contact = purple_ircv3_connection_find_or_create_contact(connection,
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
774 ibis_message);
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
775 info = PURPLE_CONTACT_INFO(contact);
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
776
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
777 /* 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
778 * the contact.
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
779 */
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
780 tags = ibis_message_get_tags(ibis_message);
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
781 if(!ibis_tags_exists(tags, IBIS_TAG_ACCOUNT)) {
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
782 purple_contact_info_set_id(info, nick);
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
783 }
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
784
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
785 purple_contact_info_set_display_name(info, nick);
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
786 purple_contact_info_set_sid(info, new_source);
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
787 g_clear_pointer(&new_source, g_free);
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
788
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
789 return TRUE;
a743311c9c2c IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents: 43007
diff changeset
790 }
43024
8a7be63f83e4 IRCv3: Handle ERROR messages
Gary Kramlich <grim@reaperworld.com>
parents: 43019
diff changeset
791
8a7be63f83e4 IRCv3: Handle ERROR messages
Gary Kramlich <grim@reaperworld.com>
parents: 43019
diff changeset
792 gboolean
8a7be63f83e4 IRCv3: Handle ERROR messages
Gary Kramlich <grim@reaperworld.com>
parents: 43019
diff changeset
793 purple_ircv3_message_handler_error(IbisClient *client,
8a7be63f83e4 IRCv3: Handle ERROR messages
Gary Kramlich <grim@reaperworld.com>
parents: 43019
diff changeset
794 G_GNUC_UNUSED const char *command,
8a7be63f83e4 IRCv3: Handle ERROR messages
Gary Kramlich <grim@reaperworld.com>
parents: 43019
diff changeset
795 IbisMessage *ibis_message,
8a7be63f83e4 IRCv3: Handle ERROR messages
Gary Kramlich <grim@reaperworld.com>
parents: 43019
diff changeset
796 gpointer data)
8a7be63f83e4 IRCv3: Handle ERROR messages
Gary Kramlich <grim@reaperworld.com>
parents: 43019
diff changeset
797 {
43069
cc8ba79c350e IRCv3: Display the contents of ERROR messages in the status window
Gary Kramlich <grim@reaperworld.com>
parents: 43067
diff changeset
798 PurpleIRCv3Connection *v3_connection = data;
43024
8a7be63f83e4 IRCv3: Handle ERROR messages
Gary Kramlich <grim@reaperworld.com>
parents: 43019
diff changeset
799 GError *error = NULL;
8a7be63f83e4 IRCv3: Handle ERROR messages
Gary Kramlich <grim@reaperworld.com>
parents: 43019
diff changeset
800 GStrv params = NULL;
8a7be63f83e4 IRCv3: Handle ERROR messages
Gary Kramlich <grim@reaperworld.com>
parents: 43019
diff changeset
801 guint n_params = 0;
8a7be63f83e4 IRCv3: Handle ERROR messages
Gary Kramlich <grim@reaperworld.com>
parents: 43019
diff changeset
802 char *reason = NULL;
8a7be63f83e4 IRCv3: Handle ERROR messages
Gary Kramlich <grim@reaperworld.com>
parents: 43019
diff changeset
803
8a7be63f83e4 IRCv3: Handle ERROR messages
Gary Kramlich <grim@reaperworld.com>
parents: 43019
diff changeset
804 params = ibis_message_get_params(ibis_message);
8a7be63f83e4 IRCv3: Handle ERROR messages
Gary Kramlich <grim@reaperworld.com>
parents: 43019
diff changeset
805 n_params = g_strv_length(params);
8a7be63f83e4 IRCv3: Handle ERROR messages
Gary Kramlich <grim@reaperworld.com>
parents: 43019
diff changeset
806
8a7be63f83e4 IRCv3: Handle ERROR messages
Gary Kramlich <grim@reaperworld.com>
parents: 43019
diff changeset
807 if(n_params > 0) {
8a7be63f83e4 IRCv3: Handle ERROR messages
Gary Kramlich <grim@reaperworld.com>
parents: 43019
diff changeset
808 reason = g_strjoinv(" ", params);
8a7be63f83e4 IRCv3: Handle ERROR messages
Gary Kramlich <grim@reaperworld.com>
parents: 43019
diff changeset
809 } else {
8a7be63f83e4 IRCv3: Handle ERROR messages
Gary Kramlich <grim@reaperworld.com>
parents: 43019
diff changeset
810 reason = g_strdup(_("unknown error"));
8a7be63f83e4 IRCv3: Handle ERROR messages
Gary Kramlich <grim@reaperworld.com>
parents: 43019
diff changeset
811 }
8a7be63f83e4 IRCv3: Handle ERROR messages
Gary Kramlich <grim@reaperworld.com>
parents: 43019
diff changeset
812
43069
cc8ba79c350e IRCv3: Display the contents of ERROR messages in the status window
Gary Kramlich <grim@reaperworld.com>
parents: 43067
diff changeset
813 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
814 TRUE, FALSE);
43069
cc8ba79c350e IRCv3: Display the contents of ERROR messages in the status window
Gary Kramlich <grim@reaperworld.com>
parents: 43067
diff changeset
815
43024
8a7be63f83e4 IRCv3: Handle ERROR messages
Gary Kramlich <grim@reaperworld.com>
parents: 43019
diff changeset
816 error = g_error_new_literal(PURPLE_IRCV3_DOMAIN, 0, reason);
8a7be63f83e4 IRCv3: Handle ERROR messages
Gary Kramlich <grim@reaperworld.com>
parents: 43019
diff changeset
817 g_clear_pointer(&reason, g_free);
8a7be63f83e4 IRCv3: Handle ERROR messages
Gary Kramlich <grim@reaperworld.com>
parents: 43019
diff changeset
818
43165
201c799d4e6f ircv3: Remove redundant account disconnection
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents: 43149
diff changeset
819 ibis_client_stop(client, error);
43024
8a7be63f83e4 IRCv3: Handle ERROR messages
Gary Kramlich <grim@reaperworld.com>
parents: 43019
diff changeset
820
8a7be63f83e4 IRCv3: Handle ERROR messages
Gary Kramlich <grim@reaperworld.com>
parents: 43019
diff changeset
821 return TRUE;
8a7be63f83e4 IRCv3: Handle ERROR messages
Gary Kramlich <grim@reaperworld.com>
parents: 43019
diff changeset
822 }
43028
dda093fe275e IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents: 43025
diff changeset
823
dda093fe275e IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents: 43025
diff changeset
824 gboolean
dda093fe275e IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents: 43025
diff changeset
825 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
826 G_GNUC_UNUSED const char *command,
dda093fe275e IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents: 43025
diff changeset
827 IbisMessage *ibis_message,
dda093fe275e IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents: 43025
diff changeset
828 gpointer data)
dda093fe275e IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents: 43025
diff changeset
829 {
dda093fe275e IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents: 43025
diff changeset
830 PurpleIRCv3Connection *v3_connection = data;
dda093fe275e IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents: 43025
diff changeset
831 PurpleAccount *account = NULL;
dda093fe275e IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents: 43025
diff changeset
832 PurpleConnection *connection = data;
dda093fe275e IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents: 43025
diff changeset
833 PurpleContact *contact = NULL;
dda093fe275e IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents: 43025
diff changeset
834 PurpleContactInfo *info = NULL;
dda093fe275e IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents: 43025
diff changeset
835 PurpleNotification *notification = NULL;
dda093fe275e IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents: 43025
diff changeset
836 PurpleNotificationManager *manager = NULL;
dda093fe275e IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents: 43025
diff changeset
837 GStrv params = NULL;
dda093fe275e IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents: 43025
diff changeset
838 char *wallops_title = NULL;
dda093fe275e IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents: 43025
diff changeset
839 guint n_params = 0;
dda093fe275e IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents: 43025
diff changeset
840
dda093fe275e IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents: 43025
diff changeset
841 params = ibis_message_get_params(ibis_message);
dda093fe275e IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents: 43025
diff changeset
842 n_params = g_strv_length(params);
dda093fe275e IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents: 43025
diff changeset
843
dda093fe275e IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents: 43025
diff changeset
844 if(n_params != 1) {
dda093fe275e IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents: 43025
diff changeset
845 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
846 return FALSE;
dda093fe275e IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents: 43025
diff changeset
847 }
dda093fe275e IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents: 43025
diff changeset
848
dda093fe275e IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents: 43025
diff changeset
849 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
850 ibis_message);
dda093fe275e IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents: 43025
diff changeset
851 info = PURPLE_CONTACT_INFO(contact);
dda093fe275e IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents: 43025
diff changeset
852
dda093fe275e IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents: 43025
diff changeset
853 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
854 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
855 notification = purple_notification_new(NULL, wallops_title);
dda093fe275e IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents: 43025
diff changeset
856 g_free(wallops_title);
dda093fe275e IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents: 43025
diff changeset
857
dda093fe275e IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents: 43025
diff changeset
858 account = purple_connection_get_account(connection);
dda093fe275e IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents: 43025
diff changeset
859 purple_notification_set_account(notification, account);
dda093fe275e IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents: 43025
diff changeset
860 purple_notification_set_subtitle(notification, params[0]);
dda093fe275e IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents: 43025
diff changeset
861 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
862
dda093fe275e IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents: 43025
diff changeset
863 manager = purple_notification_manager_get_default();
dda093fe275e IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents: 43025
diff changeset
864 purple_notification_manager_add(manager, notification);
dda093fe275e IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents: 43025
diff changeset
865 g_clear_object(&notification);
dda093fe275e IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents: 43025
diff changeset
866
dda093fe275e IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents: 43025
diff changeset
867 return TRUE;
dda093fe275e IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents: 43025
diff changeset
868 }
43067
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
869
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
870 gboolean
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
871 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
872 G_GNUC_UNUSED const char *command,
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
873 IbisMessage *ibis_message,
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
874 gpointer data)
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
875 {
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
876 PurpleIRCv3Connection *v3_connection = data;
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
877 PurpleAccount *account = NULL;
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
878 PurpleContact *kicker = NULL;
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
879 PurpleContact *kickee = NULL;
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
880 PurpleContactInfo *me = NULL;
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
881 PurpleConversation *conversation = NULL;
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
882 GStrv params = NULL;
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
883 char *reason = NULL;
43098
13b0954a268b IRCv3: Fix kick detection and handle online conversation states
Gary Kramlich <grim@reaperworld.com>
parents: 43069
diff changeset
884 const char *kickee_id = NULL;
13b0954a268b IRCv3: Fix kick detection and handle online conversation states
Gary Kramlich <grim@reaperworld.com>
parents: 43069
diff changeset
885 const char *me_id = NULL;
43067
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
886 guint n_params = 0;
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
887
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
888 params = ibis_message_get_params(ibis_message);
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
889 n_params = g_strv_length(params);
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
890
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
891 if(n_params < 2) {
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
892 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
893 return FALSE;
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
894 }
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
895
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
896 account = purple_connection_get_account(PURPLE_CONNECTION(v3_connection));
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
897 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
898 me_id = purple_contact_info_get_id(me);
43067
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
899
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
900 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
901 ibis_message);
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
902
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
903 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
904 params[0]);
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
905
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
906 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
907 params[1]);
43098
13b0954a268b IRCv3: Fix kick detection and handle online conversation states
Gary Kramlich <grim@reaperworld.com>
parents: 43069
diff changeset
908 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
909
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
910 if(n_params > 2) {
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
911 reason = g_strjoinv(" ", params + 2);
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
912 } else {
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
913 reason = g_strdup(_("no reason"));
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
914 }
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
915
43098
13b0954a268b IRCv3: Fix kick detection and handle online conversation states
Gary Kramlich <grim@reaperworld.com>
parents: 43069
diff changeset
916 if(purple_strequal(kickee_id, me_id)) {
43067
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
917 GError *error = NULL;
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
918
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
919 error = g_error_new(PURPLE_IRCV3_DOMAIN, 0,
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
920 _("You were kicked from %s by %s: %s"),
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
921 params[0],
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
922 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
923 reason);
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
924 purple_conversation_set_error(conversation, error);
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
925 g_clear_error(&error);
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
926
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
927 purple_conversation_set_online(conversation, FALSE);
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
928 } else {
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
929 PurpleConversationMembers *members = NULL;
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
930 char *contents = NULL;
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
931
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
932 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
933 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
934 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
935 params[0],
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
936 reason);
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
937
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
938 members = purple_conversation_get_members(conversation);
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
939 purple_conversation_members_remove_member(members,
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
940 PURPLE_CONTACT_INFO(kickee),
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
941 TRUE,
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
942 contents);
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
943 g_free(contents);
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
944 }
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
945
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
946 g_free(reason);
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
947
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
948 return TRUE;
7e8b86e7dc43 IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents: 43028
diff changeset
949 }
43199
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
950
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
951 gboolean
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
952 purple_ircv3_message_handler_mode(IbisClient *client,
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
953 G_GNUC_UNUSED const char *command,
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
954 IbisMessage *ibis_message,
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
955 gpointer data)
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
956 {
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
957 PurpleIRCv3Connection *v3_connection = data;
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
958 PurpleContact *contact = NULL;
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
959 PurpleConversation *conversation = NULL;
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
960 PurpleConversationMember *author = NULL;
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
961 PurpleMessage *message = NULL;
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
962 IbisModeChange *mode_changes = NULL;
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
963 GError *error = NULL;
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
964 GStrv params = NULL;
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
965 char *contents = NULL;
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
966 char *parts = NULL;
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
967 guint n_params = 0;
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
968 guint n_mode_changes = 0;
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
969 const char *target = NULL;
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
970
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
971 params = ibis_message_get_params(ibis_message);
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
972 n_params = g_strv_length(params);
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
973
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
974 if(n_params < 2) {
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
975 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
976 return FALSE;
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
977 }
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
978
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
979 target = params[0];
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
980 if(!ibis_client_is_channel(client, target)) {
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
981 return FALSE;
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
982 }
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
983
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
984 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
985 target);
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
986
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
987 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
988 ibis_message);
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
989 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
990 PURPLE_CONTACT_INFO(contact),
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
991 FALSE, NULL);
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
992
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
993 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
994 &n_mode_changes, &error);
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
995 if(error != NULL) {
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
996 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
997
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
998 g_clear_error(&error);
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
999
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1000 return FALSE;
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1001 }
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1002
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1003 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
1004 PurpleContact *subject = NULL;
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1005 PurpleConversationMember *member = NULL;
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1006 IbisModeChange change = mode_changes[i];
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1007 char prefix = '\0';
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1008
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1009 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
1010 if(prefix == '\0') {
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1011 continue;
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1012 }
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1013
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1014 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
1015 change.parameter);
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1016 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
1017 PURPLE_CONTACT_INFO(subject),
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1018 FALSE, NULL);
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1019
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1020 if(change.add) {
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1021 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
1022 } else {
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1023 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
1024 }
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1025 }
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1026
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1027 parts = g_strjoinv(" ", params + 1);
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1028 contents = g_strdup_printf(_("mode %s"), parts);
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1029 g_free(parts);
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1030
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1031 message = g_object_new(
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1032 PURPLE_TYPE_MESSAGE,
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1033 "author", author,
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1034 "contents", contents,
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1035 "event", TRUE,
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1036 NULL);
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1037 g_free(contents);
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1038
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1039 purple_conversation_write_message(conversation, message);
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1040 g_clear_object(&message);
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1041
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1042 return TRUE;
99b283ab8116 IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents: 43198
diff changeset
1043 }

mercurial