Thu, 24 Apr 2025 22:19:39 -0500
IRCv3: check if a member is in a conversation before adding them
Awhile ago we update the NAMREPLY handler to build a separate
Purple.ConversationMembers and then splice that onto the existing one to help
with sorting and other performance issues. However, we didn't check if the
users already existed in the existing list, so we would get duplicates. This
address that.
Also fixed a reference leak.
Testing Done:
Joined a channel and sent `/quote names #channel` multiple times and verified that the member list did not grow to include a bunch of duplicates.
Reviewed at https://reviews.imfreedom.org/r/3987/
|
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 | 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 | 134 | { |
|
43199
99b283ab8116
IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents:
43198
diff
changeset
|
135 | PurpleBadge *badge = NULL; |
| 43102 | 136 | |
| 137 | g_return_if_fail(PURPLE_IS_CONVERSATION_MEMBER(member)); | |
| 138 | g_return_if_fail(IBIS_IS_CLIENT(client)); | |
| 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 | 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 | 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 | 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 | 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 | 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 | 186 | } |
| 187 | ||
| 188 | g_free(prefixes); | |
| 189 | } | |
| 190 | ||
|
42780
c1af98cbd43a
IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents:
42775
diff
changeset
|
191 | /****************************************************************************** |
|
41821
ec766a6f010a
Properly namespace the message handlers and reorganize them
Gary Kramlich <grim@reaperworld.com>
parents:
41815
diff
changeset
|
192 | * General Commands |
|
ec766a6f010a
Properly namespace the message handlers and reorganize them
Gary Kramlich <grim@reaperworld.com>
parents:
41815
diff
changeset
|
193 | *****************************************************************************/ |
|
ec766a6f010a
Properly namespace the message handlers and reorganize them
Gary Kramlich <grim@reaperworld.com>
parents:
41815
diff
changeset
|
194 | gboolean |
|
43228
6f895d255386
IRCv3: add support for away-notify
Gary Kramlich <grim@reaperworld.com>
parents:
43226
diff
changeset
|
195 | purple_ircv3_message_handler_away(G_GNUC_UNUSED IbisClient *client, |
|
6f895d255386
IRCv3: add support for away-notify
Gary Kramlich <grim@reaperworld.com>
parents:
43226
diff
changeset
|
196 | G_GNUC_UNUSED const char *command, |
|
6f895d255386
IRCv3: add support for away-notify
Gary Kramlich <grim@reaperworld.com>
parents:
43226
diff
changeset
|
197 | IbisMessage *message, |
|
6f895d255386
IRCv3: add support for away-notify
Gary Kramlich <grim@reaperworld.com>
parents:
43226
diff
changeset
|
198 | gpointer data) |
|
6f895d255386
IRCv3: add support for away-notify
Gary Kramlich <grim@reaperworld.com>
parents:
43226
diff
changeset
|
199 | { |
|
6f895d255386
IRCv3: add support for away-notify
Gary Kramlich <grim@reaperworld.com>
parents:
43226
diff
changeset
|
200 | PurpleIRCv3Connection *connection = data; |
|
6f895d255386
IRCv3: add support for away-notify
Gary Kramlich <grim@reaperworld.com>
parents:
43226
diff
changeset
|
201 | PurpleContact *contact = NULL; |
|
6f895d255386
IRCv3: add support for away-notify
Gary Kramlich <grim@reaperworld.com>
parents:
43226
diff
changeset
|
202 | PurplePresence *presence = NULL; |
|
6f895d255386
IRCv3: add support for away-notify
Gary Kramlich <grim@reaperworld.com>
parents:
43226
diff
changeset
|
203 | GStrv params = NULL; |
|
6f895d255386
IRCv3: add support for away-notify
Gary Kramlich <grim@reaperworld.com>
parents:
43226
diff
changeset
|
204 | char *away_message = NULL; |
|
6f895d255386
IRCv3: add support for away-notify
Gary Kramlich <grim@reaperworld.com>
parents:
43226
diff
changeset
|
205 | |
|
6f895d255386
IRCv3: add support for away-notify
Gary Kramlich <grim@reaperworld.com>
parents:
43226
diff
changeset
|
206 | contact = purple_ircv3_connection_find_or_create_contact(connection, |
|
6f895d255386
IRCv3: add support for away-notify
Gary Kramlich <grim@reaperworld.com>
parents:
43226
diff
changeset
|
207 | message); |
|
6f895d255386
IRCv3: add support for away-notify
Gary Kramlich <grim@reaperworld.com>
parents:
43226
diff
changeset
|
208 | |
|
6f895d255386
IRCv3: add support for away-notify
Gary Kramlich <grim@reaperworld.com>
parents:
43226
diff
changeset
|
209 | presence = purple_contact_info_get_presence(PURPLE_CONTACT_INFO(contact)); |
|
6f895d255386
IRCv3: add support for away-notify
Gary Kramlich <grim@reaperworld.com>
parents:
43226
diff
changeset
|
210 | |
|
6f895d255386
IRCv3: add support for away-notify
Gary Kramlich <grim@reaperworld.com>
parents:
43226
diff
changeset
|
211 | /* Figure out if we have a message. */ |
|
6f895d255386
IRCv3: add support for away-notify
Gary Kramlich <grim@reaperworld.com>
parents:
43226
diff
changeset
|
212 | params = ibis_message_get_params(message); |
|
6f895d255386
IRCv3: add support for away-notify
Gary Kramlich <grim@reaperworld.com>
parents:
43226
diff
changeset
|
213 | if(params != NULL) { |
|
6f895d255386
IRCv3: add support for away-notify
Gary Kramlich <grim@reaperworld.com>
parents:
43226
diff
changeset
|
214 | away_message = g_strjoinv(" ", params); |
|
6f895d255386
IRCv3: add support for away-notify
Gary Kramlich <grim@reaperworld.com>
parents:
43226
diff
changeset
|
215 | } |
|
6f895d255386
IRCv3: add support for away-notify
Gary Kramlich <grim@reaperworld.com>
parents:
43226
diff
changeset
|
216 | |
|
6f895d255386
IRCv3: add support for away-notify
Gary Kramlich <grim@reaperworld.com>
parents:
43226
diff
changeset
|
217 | /* We have a message so we need to set it and possibly set the presence to |
|
6f895d255386
IRCv3: add support for away-notify
Gary Kramlich <grim@reaperworld.com>
parents:
43226
diff
changeset
|
218 | * away. |
|
6f895d255386
IRCv3: add support for away-notify
Gary Kramlich <grim@reaperworld.com>
parents:
43226
diff
changeset
|
219 | */ |
|
6f895d255386
IRCv3: add support for away-notify
Gary Kramlich <grim@reaperworld.com>
parents:
43226
diff
changeset
|
220 | if(!purple_strempty(away_message)) { |
|
6f895d255386
IRCv3: add support for away-notify
Gary Kramlich <grim@reaperworld.com>
parents:
43226
diff
changeset
|
221 | purple_presence_set_message(presence, away_message); |
|
6f895d255386
IRCv3: add support for away-notify
Gary Kramlich <grim@reaperworld.com>
parents:
43226
diff
changeset
|
222 | |
|
6f895d255386
IRCv3: add support for away-notify
Gary Kramlich <grim@reaperworld.com>
parents:
43226
diff
changeset
|
223 | purple_presence_set_primitive(presence, |
|
6f895d255386
IRCv3: add support for away-notify
Gary Kramlich <grim@reaperworld.com>
parents:
43226
diff
changeset
|
224 | PURPLE_PRESENCE_PRIMITIVE_AWAY); |
|
6f895d255386
IRCv3: add support for away-notify
Gary Kramlich <grim@reaperworld.com>
parents:
43226
diff
changeset
|
225 | } else { |
|
6f895d255386
IRCv3: add support for away-notify
Gary Kramlich <grim@reaperworld.com>
parents:
43226
diff
changeset
|
226 | purple_presence_set_message(presence, NULL); |
|
6f895d255386
IRCv3: add support for away-notify
Gary Kramlich <grim@reaperworld.com>
parents:
43226
diff
changeset
|
227 | |
|
6f895d255386
IRCv3: add support for away-notify
Gary Kramlich <grim@reaperworld.com>
parents:
43226
diff
changeset
|
228 | purple_presence_set_primitive(presence, |
|
6f895d255386
IRCv3: add support for away-notify
Gary Kramlich <grim@reaperworld.com>
parents:
43226
diff
changeset
|
229 | PURPLE_PRESENCE_PRIMITIVE_AVAILABLE); |
|
6f895d255386
IRCv3: add support for away-notify
Gary Kramlich <grim@reaperworld.com>
parents:
43226
diff
changeset
|
230 | } |
|
6f895d255386
IRCv3: add support for away-notify
Gary Kramlich <grim@reaperworld.com>
parents:
43226
diff
changeset
|
231 | |
|
6f895d255386
IRCv3: add support for away-notify
Gary Kramlich <grim@reaperworld.com>
parents:
43226
diff
changeset
|
232 | g_clear_pointer(&away_message, g_free); |
|
6f895d255386
IRCv3: add support for away-notify
Gary Kramlich <grim@reaperworld.com>
parents:
43226
diff
changeset
|
233 | |
|
6f895d255386
IRCv3: add support for away-notify
Gary Kramlich <grim@reaperworld.com>
parents:
43226
diff
changeset
|
234 | return TRUE; |
|
6f895d255386
IRCv3: add support for away-notify
Gary Kramlich <grim@reaperworld.com>
parents:
43226
diff
changeset
|
235 | } |
|
6f895d255386
IRCv3: add support for away-notify
Gary Kramlich <grim@reaperworld.com>
parents:
43226
diff
changeset
|
236 | |
|
6f895d255386
IRCv3: add support for away-notify
Gary Kramlich <grim@reaperworld.com>
parents:
43226
diff
changeset
|
237 | gboolean |
|
43236
ce4987105a4e
IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents:
43228
diff
changeset
|
238 | purple_ircv3_message_handler_join(IbisClient *client, |
|
42780
c1af98cbd43a
IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents:
42775
diff
changeset
|
239 | G_GNUC_UNUSED const char *command, |
|
c1af98cbd43a
IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents:
42775
diff
changeset
|
240 | IbisMessage *message, |
|
c1af98cbd43a
IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents:
42775
diff
changeset
|
241 | gpointer data) |
|
c1af98cbd43a
IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents:
42775
diff
changeset
|
242 | { |
|
c1af98cbd43a
IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents:
42775
diff
changeset
|
243 | PurpleIRCv3Connection *connection = data; |
|
c1af98cbd43a
IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents:
42775
diff
changeset
|
244 | PurpleContact *contact = NULL; |
|
c1af98cbd43a
IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents:
42775
diff
changeset
|
245 | PurpleConversation *conversation = NULL; |
|
43236
ce4987105a4e
IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents:
43228
diff
changeset
|
246 | IbisMessage *who_message = NULL; |
|
42780
c1af98cbd43a
IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents:
42775
diff
changeset
|
247 | GStrv params = NULL; |
|
c1af98cbd43a
IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents:
42775
diff
changeset
|
248 | const char *conversation_name = NULL; |
|
c1af98cbd43a
IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents:
42775
diff
changeset
|
249 | |
|
42815
95bb2ae83de7
IRCv3: Use Ibis.Message in PurpleIRCv3.Connection.find_or_create_contact
Gary Kramlich <grim@reaperworld.com>
parents:
42780
diff
changeset
|
250 | contact = purple_ircv3_connection_find_or_create_contact(connection, |
|
95bb2ae83de7
IRCv3: Use Ibis.Message in PurpleIRCv3.Connection.find_or_create_contact
Gary Kramlich <grim@reaperworld.com>
parents:
42780
diff
changeset
|
251 | message); |
|
42780
c1af98cbd43a
IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents:
42775
diff
changeset
|
252 | |
|
c1af98cbd43a
IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents:
42775
diff
changeset
|
253 | params = ibis_message_get_params(message); |
|
c1af98cbd43a
IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents:
42775
diff
changeset
|
254 | |
|
c1af98cbd43a
IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents:
42775
diff
changeset
|
255 | /* A normal join command has the channel as the only parameter. */ |
|
42982
310d3d474f8c
IRCv3: Fix a bug where part messages were not being parsed correctly
Gary Kramlich <grim@reaperworld.com>
parents:
42965
diff
changeset
|
256 | if(g_strv_length(params) == 1) { |
|
42780
c1af98cbd43a
IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents:
42775
diff
changeset
|
257 | conversation_name = params[0]; |
|
c1af98cbd43a
IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents:
42775
diff
changeset
|
258 | } else { |
|
c1af98cbd43a
IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents:
42775
diff
changeset
|
259 | /* TODO: write this to join to the status window saying we didn't know |
|
c1af98cbd43a
IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents:
42775
diff
changeset
|
260 | * how to parse it. |
|
c1af98cbd43a
IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents:
42775
diff
changeset
|
261 | */ |
|
c1af98cbd43a
IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents:
42775
diff
changeset
|
262 | |
|
c1af98cbd43a
IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents:
42775
diff
changeset
|
263 | return TRUE; |
|
c1af98cbd43a
IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents:
42775
diff
changeset
|
264 | } |
|
c1af98cbd43a
IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents:
42775
diff
changeset
|
265 | |
|
c1af98cbd43a
IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents:
42775
diff
changeset
|
266 | conversation = purple_ircv3_connection_find_or_create_conversation(connection, |
|
c1af98cbd43a
IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents:
42775
diff
changeset
|
267 | conversation_name); |
|
43025
2d3b2ed42f87
IRCv3: Fix pre-registration PRIVMSG not going to the status window
Gary Kramlich <grim@reaperworld.com>
parents:
43024
diff
changeset
|
268 | purple_ircv3_add_contact_to_conversation(contact, conversation, TRUE); |
|
42780
c1af98cbd43a
IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents:
42775
diff
changeset
|
269 | |
|
43236
ce4987105a4e
IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents:
43228
diff
changeset
|
270 | /* Now fire off a who message to sync the conversation. */ |
|
ce4987105a4e
IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents:
43228
diff
changeset
|
271 | who_message = ibis_message_new(IBIS_MSG_WHO); |
|
ce4987105a4e
IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents:
43228
diff
changeset
|
272 | ibis_message_set_params(who_message, conversation_name, NULL); |
|
ce4987105a4e
IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents:
43228
diff
changeset
|
273 | ibis_client_write(client, who_message); |
|
ce4987105a4e
IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents:
43228
diff
changeset
|
274 | |
|
42780
c1af98cbd43a
IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents:
42775
diff
changeset
|
275 | return TRUE; |
|
c1af98cbd43a
IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents:
42775
diff
changeset
|
276 | } |
|
c1af98cbd43a
IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents:
42775
diff
changeset
|
277 | |
|
c1af98cbd43a
IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents:
42775
diff
changeset
|
278 | gboolean |
|
c1af98cbd43a
IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents:
42775
diff
changeset
|
279 | purple_ircv3_message_handler_part(G_GNUC_UNUSED IbisClient *client, |
|
c1af98cbd43a
IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents:
42775
diff
changeset
|
280 | G_GNUC_UNUSED const char *command, |
|
c1af98cbd43a
IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents:
42775
diff
changeset
|
281 | IbisMessage *message, |
|
c1af98cbd43a
IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents:
42775
diff
changeset
|
282 | gpointer data) |
|
c1af98cbd43a
IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents:
42775
diff
changeset
|
283 | { |
|
c1af98cbd43a
IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents:
42775
diff
changeset
|
284 | PurpleIRCv3Connection *connection = data; |
|
c1af98cbd43a
IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents:
42775
diff
changeset
|
285 | PurpleAccount *account = NULL; |
|
c1af98cbd43a
IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents:
42775
diff
changeset
|
286 | PurpleContact *contact = NULL; |
|
c1af98cbd43a
IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents:
42775
diff
changeset
|
287 | PurpleConversation *conversation = NULL; |
|
c1af98cbd43a
IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents:
42775
diff
changeset
|
288 | PurpleConversationManager *manager = NULL; |
|
42893
d73c5851a773
IRCv3: Port to Purple.ConversationMembers
Gary Kramlich <grim@reaperworld.com>
parents:
42883
diff
changeset
|
289 | PurpleConversationMembers *members = NULL; |
|
42780
c1af98cbd43a
IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents:
42775
diff
changeset
|
290 | GStrv params = NULL; |
|
c1af98cbd43a
IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents:
42775
diff
changeset
|
291 | guint n_params = 0; |
|
c1af98cbd43a
IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents:
42775
diff
changeset
|
292 | char *reason = NULL; |
|
c1af98cbd43a
IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents:
42775
diff
changeset
|
293 | const char *conversation_name = NULL; |
|
c1af98cbd43a
IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents:
42775
diff
changeset
|
294 | |
|
c1af98cbd43a
IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents:
42775
diff
changeset
|
295 | params = ibis_message_get_params(message); |
|
42982
310d3d474f8c
IRCv3: Fix a bug where part messages were not being parsed correctly
Gary Kramlich <grim@reaperworld.com>
parents:
42965
diff
changeset
|
296 | n_params = g_strv_length(params); |
|
310d3d474f8c
IRCv3: Fix a bug where part messages were not being parsed correctly
Gary Kramlich <grim@reaperworld.com>
parents:
42965
diff
changeset
|
297 | if(n_params == 0) { |
|
42780
c1af98cbd43a
IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents:
42775
diff
changeset
|
298 | /* TODO: mention unparsable message in the status window. */ |
|
c1af98cbd43a
IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents:
42775
diff
changeset
|
299 | return TRUE; |
|
c1af98cbd43a
IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents:
42775
diff
changeset
|
300 | } |
|
c1af98cbd43a
IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents:
42775
diff
changeset
|
301 | |
|
c1af98cbd43a
IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents:
42775
diff
changeset
|
302 | /* TODO: The spec says servers _SHOULD NOT_ send a comma separated list of |
|
c1af98cbd43a
IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents:
42775
diff
changeset
|
303 | * channels, but we should support that at some point just in case. |
|
c1af98cbd43a
IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents:
42775
diff
changeset
|
304 | */ |
|
c1af98cbd43a
IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents:
42775
diff
changeset
|
305 | conversation_name = params[0]; |
|
c1af98cbd43a
IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents:
42775
diff
changeset
|
306 | |
|
c1af98cbd43a
IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents:
42775
diff
changeset
|
307 | account = purple_connection_get_account(PURPLE_CONNECTION(connection)); |
|
c1af98cbd43a
IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents:
42775
diff
changeset
|
308 | manager = purple_conversation_manager_get_default(); |
|
c1af98cbd43a
IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents:
42775
diff
changeset
|
309 | conversation = purple_conversation_manager_find_with_id(manager, account, |
|
c1af98cbd43a
IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents:
42775
diff
changeset
|
310 | conversation_name); |
|
c1af98cbd43a
IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents:
42775
diff
changeset
|
311 | |
|
c1af98cbd43a
IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents:
42775
diff
changeset
|
312 | if(!PURPLE_IS_CONVERSATION(conversation)) { |
|
c1af98cbd43a
IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents:
42775
diff
changeset
|
313 | /* TODO: write status message unknown channel. */ |
|
c1af98cbd43a
IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents:
42775
diff
changeset
|
314 | |
|
c1af98cbd43a
IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents:
42775
diff
changeset
|
315 | return TRUE; |
|
c1af98cbd43a
IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents:
42775
diff
changeset
|
316 | } |
|
c1af98cbd43a
IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents:
42775
diff
changeset
|
317 | |
|
42893
d73c5851a773
IRCv3: Port to Purple.ConversationMembers
Gary Kramlich <grim@reaperworld.com>
parents:
42883
diff
changeset
|
318 | members = purple_conversation_get_members(conversation); |
|
d73c5851a773
IRCv3: Port to Purple.ConversationMembers
Gary Kramlich <grim@reaperworld.com>
parents:
42883
diff
changeset
|
319 | |
|
42780
c1af98cbd43a
IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents:
42775
diff
changeset
|
320 | /* We do want to find or create the contact, even on a part, because we |
|
c1af98cbd43a
IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents:
42775
diff
changeset
|
321 | * could have connected to a BNC and we weren't told about the contact yet. |
|
c1af98cbd43a
IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents:
42775
diff
changeset
|
322 | */ |
|
42815
95bb2ae83de7
IRCv3: Use Ibis.Message in PurpleIRCv3.Connection.find_or_create_contact
Gary Kramlich <grim@reaperworld.com>
parents:
42780
diff
changeset
|
323 | contact = purple_ircv3_connection_find_or_create_contact(connection, |
|
95bb2ae83de7
IRCv3: Use Ibis.Message in PurpleIRCv3.Connection.find_or_create_contact
Gary Kramlich <grim@reaperworld.com>
parents:
42780
diff
changeset
|
324 | message); |
|
42780
c1af98cbd43a
IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents:
42775
diff
changeset
|
325 | |
|
c1af98cbd43a
IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents:
42775
diff
changeset
|
326 | /* If a part message was given, join the remaining parameters with a space. |
|
c1af98cbd43a
IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents:
42775
diff
changeset
|
327 | */ |
|
c1af98cbd43a
IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents:
42775
diff
changeset
|
328 | if(n_params > 1) { |
|
43019
7621ef6ea06a
IRCv3: Update the join/part reasons to match the quit format
Gary Kramlich <grim@reaperworld.com>
parents:
43015
diff
changeset
|
329 | char *part_message = NULL; |
|
7621ef6ea06a
IRCv3: Update the join/part reasons to match the quit format
Gary Kramlich <grim@reaperworld.com>
parents:
43015
diff
changeset
|
330 | |
|
7621ef6ea06a
IRCv3: Update the join/part reasons to match the quit format
Gary Kramlich <grim@reaperworld.com>
parents:
43015
diff
changeset
|
331 | part_message = g_strjoinv(" ", params + 1); |
|
7621ef6ea06a
IRCv3: Update the join/part reasons to match the quit format
Gary Kramlich <grim@reaperworld.com>
parents:
43015
diff
changeset
|
332 | reason = g_strdup_printf(_("%s has left %s (%s)"), |
|
7621ef6ea06a
IRCv3: Update the join/part reasons to match the quit format
Gary Kramlich <grim@reaperworld.com>
parents:
43015
diff
changeset
|
333 | purple_contact_info_get_sid(PURPLE_CONTACT_INFO(contact)), |
|
7621ef6ea06a
IRCv3: Update the join/part reasons to match the quit format
Gary Kramlich <grim@reaperworld.com>
parents:
43015
diff
changeset
|
334 | purple_conversation_get_title_for_display(conversation), |
|
7621ef6ea06a
IRCv3: Update the join/part reasons to match the quit format
Gary Kramlich <grim@reaperworld.com>
parents:
43015
diff
changeset
|
335 | part_message); |
|
7621ef6ea06a
IRCv3: Update the join/part reasons to match the quit format
Gary Kramlich <grim@reaperworld.com>
parents:
43015
diff
changeset
|
336 | } else { |
|
7621ef6ea06a
IRCv3: Update the join/part reasons to match the quit format
Gary Kramlich <grim@reaperworld.com>
parents:
43015
diff
changeset
|
337 | reason = g_strdup_printf(_("%s has left %s"), |
|
7621ef6ea06a
IRCv3: Update the join/part reasons to match the quit format
Gary Kramlich <grim@reaperworld.com>
parents:
43015
diff
changeset
|
338 | purple_contact_info_get_sid(PURPLE_CONTACT_INFO(contact)), |
|
7621ef6ea06a
IRCv3: Update the join/part reasons to match the quit format
Gary Kramlich <grim@reaperworld.com>
parents:
43015
diff
changeset
|
339 | purple_conversation_get_title_for_display(conversation)); |
|
42780
c1af98cbd43a
IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents:
42775
diff
changeset
|
340 | } |
|
c1af98cbd43a
IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents:
42775
diff
changeset
|
341 | |
|
42893
d73c5851a773
IRCv3: Port to Purple.ConversationMembers
Gary Kramlich <grim@reaperworld.com>
parents:
42883
diff
changeset
|
342 | purple_conversation_members_remove_member(members, |
|
d73c5851a773
IRCv3: Port to Purple.ConversationMembers
Gary Kramlich <grim@reaperworld.com>
parents:
42883
diff
changeset
|
343 | PURPLE_CONTACT_INFO(contact), |
|
d73c5851a773
IRCv3: Port to Purple.ConversationMembers
Gary Kramlich <grim@reaperworld.com>
parents:
42883
diff
changeset
|
344 | TRUE, reason); |
|
42780
c1af98cbd43a
IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents:
42775
diff
changeset
|
345 | |
|
c1af98cbd43a
IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents:
42775
diff
changeset
|
346 | g_clear_pointer(&reason, g_free); |
|
c1af98cbd43a
IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents:
42775
diff
changeset
|
347 | |
|
c1af98cbd43a
IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents:
42775
diff
changeset
|
348 | return TRUE; |
|
c1af98cbd43a
IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents:
42775
diff
changeset
|
349 | } |
|
c1af98cbd43a
IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents:
42775
diff
changeset
|
350 | |
|
c1af98cbd43a
IRCv3: Implement join and part message handlers
Gary Kramlich <grim@reaperworld.com>
parents:
42775
diff
changeset
|
351 | gboolean |
|
42925
3c9b77d62b0d
IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents:
42920
diff
changeset
|
352 | purple_ircv3_message_handler_namreply(IbisClient *client, |
|
3c9b77d62b0d
IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents:
42920
diff
changeset
|
353 | G_GNUC_UNUSED const char *command, |
|
3c9b77d62b0d
IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents:
42920
diff
changeset
|
354 | IbisMessage *message, gpointer data) |
|
3c9b77d62b0d
IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents:
42920
diff
changeset
|
355 | { |
|
3c9b77d62b0d
IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents:
42920
diff
changeset
|
356 | PurpleIRCv3Connection *connection = data; |
|
3c9b77d62b0d
IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents:
42920
diff
changeset
|
357 | PurpleConversation *conversation = NULL; |
|
3c9b77d62b0d
IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents:
42920
diff
changeset
|
358 | GStrv params = NULL; |
|
3c9b77d62b0d
IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents:
42920
diff
changeset
|
359 | GStrv nicks = NULL; |
|
3c9b77d62b0d
IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents:
42920
diff
changeset
|
360 | const char *target = NULL; |
|
3c9b77d62b0d
IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents:
42920
diff
changeset
|
361 | |
|
3c9b77d62b0d
IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents:
42920
diff
changeset
|
362 | params = ibis_message_get_params(message); |
|
3c9b77d62b0d
IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents:
42920
diff
changeset
|
363 | if(params == NULL) { |
|
3c9b77d62b0d
IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents:
42920
diff
changeset
|
364 | g_warning("namreply received with no parameters"); |
|
3c9b77d62b0d
IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents:
42920
diff
changeset
|
365 | |
|
3c9b77d62b0d
IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents:
42920
diff
changeset
|
366 | return FALSE; |
|
3c9b77d62b0d
IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents:
42920
diff
changeset
|
367 | } |
|
3c9b77d62b0d
IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents:
42920
diff
changeset
|
368 | |
|
3c9b77d62b0d
IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents:
42920
diff
changeset
|
369 | if(g_strv_length(params) != 4) { |
|
3c9b77d62b0d
IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents:
42920
diff
changeset
|
370 | char *body = g_strjoinv(" ", params); |
|
3c9b77d62b0d
IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents:
42920
diff
changeset
|
371 | g_warning("unknown namreply format: '%s'", body); |
|
3c9b77d62b0d
IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents:
42920
diff
changeset
|
372 | g_free(body); |
|
3c9b77d62b0d
IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents:
42920
diff
changeset
|
373 | |
|
3c9b77d62b0d
IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents:
42920
diff
changeset
|
374 | return FALSE; |
|
3c9b77d62b0d
IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents:
42920
diff
changeset
|
375 | } |
|
3c9b77d62b0d
IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents:
42920
diff
changeset
|
376 | |
|
3c9b77d62b0d
IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents:
42920
diff
changeset
|
377 | /* params[0] holds nick of the user and params[1] holds the channel type |
|
3c9b77d62b0d
IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents:
42920
diff
changeset
|
378 | * (public/private) but we don't care about either of these. |
|
3c9b77d62b0d
IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents:
42920
diff
changeset
|
379 | */ |
|
3c9b77d62b0d
IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents:
42920
diff
changeset
|
380 | |
|
3c9b77d62b0d
IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents:
42920
diff
changeset
|
381 | target = params[2]; |
|
3c9b77d62b0d
IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents:
42920
diff
changeset
|
382 | if(!ibis_client_is_channel(client, target)) { |
|
3c9b77d62b0d
IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents:
42920
diff
changeset
|
383 | g_warning("received namreply for '%s' which is not a channel.", |
|
3c9b77d62b0d
IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents:
42920
diff
changeset
|
384 | target); |
|
3c9b77d62b0d
IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents:
42920
diff
changeset
|
385 | |
|
3c9b77d62b0d
IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents:
42920
diff
changeset
|
386 | return FALSE; |
|
3c9b77d62b0d
IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents:
42920
diff
changeset
|
387 | } |
|
3c9b77d62b0d
IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents:
42920
diff
changeset
|
388 | |
|
3c9b77d62b0d
IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents:
42920
diff
changeset
|
389 | conversation = purple_ircv3_connection_find_or_create_conversation(connection, |
|
3c9b77d62b0d
IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents:
42920
diff
changeset
|
390 | target); |
|
3c9b77d62b0d
IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents:
42920
diff
changeset
|
391 | |
|
3c9b77d62b0d
IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents:
42920
diff
changeset
|
392 | /* Split the last parameter on space to get a list of all the nicks. */ |
|
3c9b77d62b0d
IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents:
42920
diff
changeset
|
393 | nicks = g_strsplit(params[3], " ", -1); |
|
3c9b77d62b0d
IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents:
42920
diff
changeset
|
394 | if(nicks != NULL) { |
|
3c9b77d62b0d
IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents:
42920
diff
changeset
|
395 | PurpleAccount *account = NULL; |
|
3c9b77d62b0d
IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents:
42920
diff
changeset
|
396 | PurpleConnection *purple_connection = NULL; |
|
3c9b77d62b0d
IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents:
42920
diff
changeset
|
397 | PurpleContactManager *manager = purple_contact_manager_get_default(); |
|
43205
1400ae254c24
IRCv3: use Purple.ConversationMembers.extend when joining channels
Gary Kramlich <grim@reaperworld.com>
parents:
43199
diff
changeset
|
398 | PurpleConversationMembers *existing_members = NULL; |
|
1400ae254c24
IRCv3: use Purple.ConversationMembers.extend when joining channels
Gary Kramlich <grim@reaperworld.com>
parents:
43199
diff
changeset
|
399 | PurpleConversationMembers *new_members = NULL; |
|
43206
58f66e90f24a
IRCv3: Don't add the libpurple user when joining a channel
Gary Kramlich <grim@reaperworld.com>
parents:
43205
diff
changeset
|
400 | const char *active_nick = NULL; |
|
42925
3c9b77d62b0d
IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents:
42920
diff
changeset
|
401 | |
|
3c9b77d62b0d
IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents:
42920
diff
changeset
|
402 | purple_connection = PURPLE_CONNECTION(connection); |
|
3c9b77d62b0d
IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents:
42920
diff
changeset
|
403 | account = purple_connection_get_account(purple_connection); |
|
3c9b77d62b0d
IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents:
42920
diff
changeset
|
404 | |
|
43205
1400ae254c24
IRCv3: use Purple.ConversationMembers.extend when joining channels
Gary Kramlich <grim@reaperworld.com>
parents:
43199
diff
changeset
|
405 | existing_members = purple_conversation_get_members(conversation); |
|
1400ae254c24
IRCv3: use Purple.ConversationMembers.extend when joining channels
Gary Kramlich <grim@reaperworld.com>
parents:
43199
diff
changeset
|
406 | new_members = purple_conversation_members_new(); |
|
42925
3c9b77d62b0d
IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents:
42920
diff
changeset
|
407 | |
|
43206
58f66e90f24a
IRCv3: Don't add the libpurple user when joining a channel
Gary Kramlich <grim@reaperworld.com>
parents:
43205
diff
changeset
|
408 | /* We don't want to add ourselves and we're already in the list. */ |
|
58f66e90f24a
IRCv3: Don't add the libpurple user when joining a channel
Gary Kramlich <grim@reaperworld.com>
parents:
43205
diff
changeset
|
409 | active_nick = ibis_client_get_active_nick(client); |
|
58f66e90f24a
IRCv3: Don't add the libpurple user when joining a channel
Gary Kramlich <grim@reaperworld.com>
parents:
43205
diff
changeset
|
410 | |
|
42925
3c9b77d62b0d
IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents:
42920
diff
changeset
|
411 | for(guint i = 0; i < g_strv_length(nicks); i++) { |
|
3c9b77d62b0d
IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents:
42920
diff
changeset
|
412 | PurpleContact *contact = NULL; |
| 43102 | 413 | PurpleConversationMember *member = NULL; |
|
42925
3c9b77d62b0d
IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents:
42920
diff
changeset
|
414 | const char *nick = nicks[i]; |
|
3c9b77d62b0d
IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents:
42920
diff
changeset
|
415 | char *stripped = NULL; |
|
3c9b77d62b0d
IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents:
42920
diff
changeset
|
416 | |
|
3c9b77d62b0d
IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents:
42920
diff
changeset
|
417 | stripped = ibis_client_strip_source_prefix(client, nick); |
|
43206
58f66e90f24a
IRCv3: Don't add the libpurple user when joining a channel
Gary Kramlich <grim@reaperworld.com>
parents:
43205
diff
changeset
|
418 | if(purple_strequal(stripped, active_nick)) { |
|
58f66e90f24a
IRCv3: Don't add the libpurple user when joining a channel
Gary Kramlich <grim@reaperworld.com>
parents:
43205
diff
changeset
|
419 | g_free(stripped); |
|
58f66e90f24a
IRCv3: Don't add the libpurple user when joining a channel
Gary Kramlich <grim@reaperworld.com>
parents:
43205
diff
changeset
|
420 | |
|
58f66e90f24a
IRCv3: Don't add the libpurple user when joining a channel
Gary Kramlich <grim@reaperworld.com>
parents:
43205
diff
changeset
|
421 | continue; |
|
58f66e90f24a
IRCv3: Don't add the libpurple user when joining a channel
Gary Kramlich <grim@reaperworld.com>
parents:
43205
diff
changeset
|
422 | } |
|
42925
3c9b77d62b0d
IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents:
42920
diff
changeset
|
423 | |
|
3c9b77d62b0d
IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents:
42920
diff
changeset
|
424 | contact = purple_contact_manager_find_with_id(manager, account, |
|
3c9b77d62b0d
IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents:
42920
diff
changeset
|
425 | stripped); |
|
3c9b77d62b0d
IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents:
42920
diff
changeset
|
426 | if(!PURPLE_IS_CONTACT(contact)) { |
|
3c9b77d62b0d
IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents:
42920
diff
changeset
|
427 | contact = purple_contact_new(account, stripped); |
|
3c9b77d62b0d
IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents:
42920
diff
changeset
|
428 | purple_contact_info_set_username(PURPLE_CONTACT_INFO(contact), |
|
3c9b77d62b0d
IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents:
42920
diff
changeset
|
429 | stripped); |
|
3c9b77d62b0d
IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents:
42920
diff
changeset
|
430 | purple_contact_manager_add(manager, contact); |
|
3c9b77d62b0d
IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents:
42920
diff
changeset
|
431 | } |
|
3c9b77d62b0d
IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents:
42920
diff
changeset
|
432 | |
|
43242
a9bc19e23c36
IRCv3: check if a member is in a conversation before adding them
Gary Kramlich <grim@reaperworld.com>
parents:
43238
diff
changeset
|
433 | /* Check if the member is already in the existing members list. |
|
a9bc19e23c36
IRCv3: check if a member is in a conversation before adding them
Gary Kramlich <grim@reaperworld.com>
parents:
43238
diff
changeset
|
434 | * This can happen if the user sends a NAMES command and surely |
|
a9bc19e23c36
IRCv3: check if a member is in a conversation before adding them
Gary Kramlich <grim@reaperworld.com>
parents:
43238
diff
changeset
|
435 | * other ways are possible. */ |
|
a9bc19e23c36
IRCv3: check if a member is in a conversation before adding them
Gary Kramlich <grim@reaperworld.com>
parents:
43238
diff
changeset
|
436 | member = purple_conversation_members_find_member(existing_members, |
|
a9bc19e23c36
IRCv3: check if a member is in a conversation before adding them
Gary Kramlich <grim@reaperworld.com>
parents:
43238
diff
changeset
|
437 | PURPLE_CONTACT_INFO(contact)); |
|
a9bc19e23c36
IRCv3: check if a member is in a conversation before adding them
Gary Kramlich <grim@reaperworld.com>
parents:
43238
diff
changeset
|
438 | |
|
a9bc19e23c36
IRCv3: check if a member is in a conversation before adding them
Gary Kramlich <grim@reaperworld.com>
parents:
43238
diff
changeset
|
439 | /* If the member doesn't exist, add them. */ |
|
a9bc19e23c36
IRCv3: check if a member is in a conversation before adding them
Gary Kramlich <grim@reaperworld.com>
parents:
43238
diff
changeset
|
440 | if(!PURPLE_IS_CONVERSATION_MEMBER(member)) { |
|
a9bc19e23c36
IRCv3: check if a member is in a conversation before adding them
Gary Kramlich <grim@reaperworld.com>
parents:
43238
diff
changeset
|
441 | member = purple_conversation_members_add_member(new_members, |
|
a9bc19e23c36
IRCv3: check if a member is in a conversation before adding them
Gary Kramlich <grim@reaperworld.com>
parents:
43238
diff
changeset
|
442 | PURPLE_CONTACT_INFO(contact), |
|
a9bc19e23c36
IRCv3: check if a member is in a conversation before adding them
Gary Kramlich <grim@reaperworld.com>
parents:
43238
diff
changeset
|
443 | FALSE, NULL); |
|
a9bc19e23c36
IRCv3: check if a member is in a conversation before adding them
Gary Kramlich <grim@reaperworld.com>
parents:
43238
diff
changeset
|
444 | } |
| 43102 | 445 | |
| 446 | purple_ircv3_add_badges_to_member(member, client, nick); | |
| 447 | ||
|
42925
3c9b77d62b0d
IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents:
42920
diff
changeset
|
448 | g_free(stripped); |
|
43242
a9bc19e23c36
IRCv3: check if a member is in a conversation before adding them
Gary Kramlich <grim@reaperworld.com>
parents:
43238
diff
changeset
|
449 | g_clear_object(&contact); |
|
42925
3c9b77d62b0d
IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents:
42920
diff
changeset
|
450 | } |
|
43205
1400ae254c24
IRCv3: use Purple.ConversationMembers.extend when joining channels
Gary Kramlich <grim@reaperworld.com>
parents:
43199
diff
changeset
|
451 | |
|
1400ae254c24
IRCv3: use Purple.ConversationMembers.extend when joining channels
Gary Kramlich <grim@reaperworld.com>
parents:
43199
diff
changeset
|
452 | purple_conversation_members_extend(existing_members, new_members); |
|
42925
3c9b77d62b0d
IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents:
42920
diff
changeset
|
453 | } |
|
3c9b77d62b0d
IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents:
42920
diff
changeset
|
454 | |
|
3c9b77d62b0d
IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents:
42920
diff
changeset
|
455 | g_strfreev(nicks); |
|
3c9b77d62b0d
IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents:
42920
diff
changeset
|
456 | |
|
3c9b77d62b0d
IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents:
42920
diff
changeset
|
457 | return TRUE; |
|
3c9b77d62b0d
IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents:
42920
diff
changeset
|
458 | } |
|
3c9b77d62b0d
IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents:
42920
diff
changeset
|
459 | |
|
3c9b77d62b0d
IRCv3: Handle RPL_NAMREPLY
Gary Kramlich <grim@reaperworld.com>
parents:
42920
diff
changeset
|
460 | gboolean |
|
42896
5c8f4a455d3c
IRCv3: Use Ibis.Client.is_channel instead of our old version
Gary Kramlich <grim@reaperworld.com>
parents:
42893
diff
changeset
|
461 | purple_ircv3_message_handler_tagmsg(IbisClient *client, |
|
42883
51a0fe1e2500
IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents:
42815
diff
changeset
|
462 | G_GNUC_UNUSED const char *command, |
|
51a0fe1e2500
IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents:
42815
diff
changeset
|
463 | IbisMessage *ibis_message, gpointer data) |
|
51a0fe1e2500
IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents:
42815
diff
changeset
|
464 | { |
|
51a0fe1e2500
IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents:
42815
diff
changeset
|
465 | PurpleIRCv3Connection *connection = data; |
|
51a0fe1e2500
IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents:
42815
diff
changeset
|
466 | PurpleContact *contact = NULL; |
|
51a0fe1e2500
IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents:
42815
diff
changeset
|
467 | PurpleConversation *conversation = NULL; |
|
51a0fe1e2500
IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents:
42815
diff
changeset
|
468 | GStrv params = NULL; |
|
51a0fe1e2500
IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents:
42815
diff
changeset
|
469 | IbisTags *tags = NULL; |
|
51a0fe1e2500
IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents:
42815
diff
changeset
|
470 | const char *target = NULL; |
|
51a0fe1e2500
IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents:
42815
diff
changeset
|
471 | const char *value = NULL; |
|
51a0fe1e2500
IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents:
42815
diff
changeset
|
472 | |
|
51a0fe1e2500
IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents:
42815
diff
changeset
|
473 | params = ibis_message_get_params(ibis_message); |
|
51a0fe1e2500
IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents:
42815
diff
changeset
|
474 | tags = ibis_message_get_tags(ibis_message); |
|
51a0fe1e2500
IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents:
42815
diff
changeset
|
475 | |
|
51a0fe1e2500
IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents:
42815
diff
changeset
|
476 | if(params == NULL) { |
|
42920
897667cab3ce
Add support for CTCP ACTION
Gary Kramlich <grim@reaperworld.com>
parents:
42896
diff
changeset
|
477 | g_warning("tagmsg received with no parameters"); |
|
42883
51a0fe1e2500
IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents:
42815
diff
changeset
|
478 | |
|
51a0fe1e2500
IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents:
42815
diff
changeset
|
479 | return FALSE; |
|
51a0fe1e2500
IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents:
42815
diff
changeset
|
480 | } |
|
51a0fe1e2500
IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents:
42815
diff
changeset
|
481 | |
|
51a0fe1e2500
IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents:
42815
diff
changeset
|
482 | if(g_strv_length(params) != 1) { |
|
51a0fe1e2500
IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents:
42815
diff
changeset
|
483 | char *body = g_strjoinv(" ", params); |
|
51a0fe1e2500
IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents:
42815
diff
changeset
|
484 | g_warning("unknown tagmsg message format: '%s'", body); |
|
51a0fe1e2500
IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents:
42815
diff
changeset
|
485 | g_free(body); |
|
51a0fe1e2500
IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents:
42815
diff
changeset
|
486 | |
|
51a0fe1e2500
IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents:
42815
diff
changeset
|
487 | return FALSE; |
|
51a0fe1e2500
IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents:
42815
diff
changeset
|
488 | } |
|
51a0fe1e2500
IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents:
42815
diff
changeset
|
489 | |
|
51a0fe1e2500
IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents:
42815
diff
changeset
|
490 | /* Find or create the contact. */ |
|
51a0fe1e2500
IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents:
42815
diff
changeset
|
491 | contact = purple_ircv3_connection_find_or_create_contact(connection, |
|
51a0fe1e2500
IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents:
42815
diff
changeset
|
492 | ibis_message); |
|
51a0fe1e2500
IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents:
42815
diff
changeset
|
493 | |
|
51a0fe1e2500
IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents:
42815
diff
changeset
|
494 | /* Find or create the conversation. */ |
|
51a0fe1e2500
IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents:
42815
diff
changeset
|
495 | target = params[0]; |
|
42896
5c8f4a455d3c
IRCv3: Use Ibis.Client.is_channel instead of our old version
Gary Kramlich <grim@reaperworld.com>
parents:
42893
diff
changeset
|
496 | if(!ibis_client_is_channel(client, target)) { |
|
42883
51a0fe1e2500
IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents:
42815
diff
changeset
|
497 | target = purple_contact_info_get_id(PURPLE_CONTACT_INFO(contact)); |
|
51a0fe1e2500
IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents:
42815
diff
changeset
|
498 | } |
|
51a0fe1e2500
IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents:
42815
diff
changeset
|
499 | |
|
51a0fe1e2500
IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents:
42815
diff
changeset
|
500 | conversation = purple_ircv3_connection_find_or_create_conversation(connection, |
|
51a0fe1e2500
IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents:
42815
diff
changeset
|
501 | target); |
|
51a0fe1e2500
IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents:
42815
diff
changeset
|
502 | |
|
43025
2d3b2ed42f87
IRCv3: Fix pre-registration PRIVMSG not going to the status window
Gary Kramlich <grim@reaperworld.com>
parents:
43024
diff
changeset
|
503 | purple_ircv3_add_contact_to_conversation(contact, conversation, FALSE); |
|
42883
51a0fe1e2500
IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents:
42815
diff
changeset
|
504 | |
|
51a0fe1e2500
IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents:
42815
diff
changeset
|
505 | /* Handle typing notifications. */ |
|
51a0fe1e2500
IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents:
42815
diff
changeset
|
506 | value = ibis_tags_lookup(tags, IBIS_TAG_TYPING); |
|
51a0fe1e2500
IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents:
42815
diff
changeset
|
507 | if(!purple_strempty(value)) { |
|
51a0fe1e2500
IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents:
42815
diff
changeset
|
508 | PurpleConversationMember *member = NULL; |
|
42893
d73c5851a773
IRCv3: Port to Purple.ConversationMembers
Gary Kramlich <grim@reaperworld.com>
parents:
42883
diff
changeset
|
509 | PurpleConversationMembers *members = NULL; |
|
42883
51a0fe1e2500
IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents:
42815
diff
changeset
|
510 | PurpleTypingState state = PURPLE_TYPING_STATE_NONE; |
|
51a0fe1e2500
IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents:
42815
diff
changeset
|
511 | guint timeout = 1; |
|
51a0fe1e2500
IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents:
42815
diff
changeset
|
512 | |
|
42893
d73c5851a773
IRCv3: Port to Purple.ConversationMembers
Gary Kramlich <grim@reaperworld.com>
parents:
42883
diff
changeset
|
513 | members = purple_conversation_get_members(conversation); |
|
d73c5851a773
IRCv3: Port to Purple.ConversationMembers
Gary Kramlich <grim@reaperworld.com>
parents:
42883
diff
changeset
|
514 | member = purple_conversation_members_find_member(members, |
|
d73c5851a773
IRCv3: Port to Purple.ConversationMembers
Gary Kramlich <grim@reaperworld.com>
parents:
42883
diff
changeset
|
515 | PURPLE_CONTACT_INFO(contact)); |
|
42883
51a0fe1e2500
IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents:
42815
diff
changeset
|
516 | |
|
51a0fe1e2500
IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents:
42815
diff
changeset
|
517 | if(purple_strequal(value, IBIS_TYPING_ACTIVE)) { |
|
51a0fe1e2500
IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents:
42815
diff
changeset
|
518 | state = PURPLE_TYPING_STATE_TYPING; |
|
51a0fe1e2500
IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents:
42815
diff
changeset
|
519 | timeout = 6; |
|
51a0fe1e2500
IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents:
42815
diff
changeset
|
520 | } else if(purple_strequal(value, IBIS_TYPING_PAUSED)) { |
|
51a0fe1e2500
IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents:
42815
diff
changeset
|
521 | state = PURPLE_TYPING_STATE_PAUSED; |
|
51a0fe1e2500
IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents:
42815
diff
changeset
|
522 | timeout = 30; |
|
51a0fe1e2500
IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents:
42815
diff
changeset
|
523 | } |
|
51a0fe1e2500
IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents:
42815
diff
changeset
|
524 | |
|
51a0fe1e2500
IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents:
42815
diff
changeset
|
525 | purple_conversation_member_set_typing_state(member, state, timeout); |
|
51a0fe1e2500
IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents:
42815
diff
changeset
|
526 | } |
|
51a0fe1e2500
IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents:
42815
diff
changeset
|
527 | |
|
51a0fe1e2500
IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents:
42815
diff
changeset
|
528 | return TRUE; |
|
51a0fe1e2500
IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents:
42815
diff
changeset
|
529 | } |
|
51a0fe1e2500
IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents:
42815
diff
changeset
|
530 | |
|
51a0fe1e2500
IRCv3: Handle incoming typing notifications
Gary Kramlich <grim@reaperworld.com>
parents:
42815
diff
changeset
|
531 | gboolean |
|
42896
5c8f4a455d3c
IRCv3: Use Ibis.Client.is_channel instead of our old version
Gary Kramlich <grim@reaperworld.com>
parents:
42893
diff
changeset
|
532 | purple_ircv3_message_handler_privmsg(IbisClient *client, const char *command, |
|
42769
c488d7af2923
Move the IRCv3 protocol plugin to our new Ibis library
Gary Kramlich <grim@reaperworld.com>
parents:
42652
diff
changeset
|
533 | IbisMessage *ibis_message, gpointer data) |
|
41813
86302ce7e3c1
Add support for handling PRIVMSG and NOTICE messages from the server
Gary Kramlich <grim@reaperworld.com>
parents:
41807
diff
changeset
|
534 | { |
|
86302ce7e3c1
Add support for handling PRIVMSG and NOTICE messages from the server
Gary Kramlich <grim@reaperworld.com>
parents:
41807
diff
changeset
|
535 | PurpleIRCv3Connection *connection = data; |
|
86302ce7e3c1
Add support for handling PRIVMSG and NOTICE messages from the server
Gary Kramlich <grim@reaperworld.com>
parents:
41807
diff
changeset
|
536 | PurpleContact *contact = NULL; |
|
86302ce7e3c1
Add support for handling PRIVMSG and NOTICE messages from the server
Gary Kramlich <grim@reaperworld.com>
parents:
41807
diff
changeset
|
537 | PurpleConversation *conversation = NULL; |
|
43100
e6df74d36862
Change Purple.Message:author to Purple.ConversationMember
Gary Kramlich <grim@reaperworld.com>
parents:
43098
diff
changeset
|
538 | PurpleConversationMember *member = NULL; |
|
41813
86302ce7e3c1
Add support for handling PRIVMSG and NOTICE messages from the server
Gary Kramlich <grim@reaperworld.com>
parents:
41807
diff
changeset
|
539 | PurpleMessage *message = NULL; |
|
42056
ced07483f66a
IRCv3: Add support for the msgid specification
Gary Kramlich <grim@reaperworld.com>
parents:
42048
diff
changeset
|
540 | GDateTime *dt = NULL; |
|
42920
897667cab3ce
Add support for CTCP ACTION
Gary Kramlich <grim@reaperworld.com>
parents:
42896
diff
changeset
|
541 | IbisCTCPMessage *ctcp_message = NULL; |
|
42769
c488d7af2923
Move the IRCv3 protocol plugin to our new Ibis library
Gary Kramlich <grim@reaperworld.com>
parents:
42652
diff
changeset
|
542 | IbisTags *tags = NULL; |
|
42333
a34601ac633c
Add PurpleIRCv3Message represent messages rather than multiple variables
Gary Kramlich <grim@reaperworld.com>
parents:
42320
diff
changeset
|
543 | GStrv params = NULL; |
|
41813
86302ce7e3c1
Add support for handling PRIVMSG and NOTICE messages from the server
Gary Kramlich <grim@reaperworld.com>
parents:
41807
diff
changeset
|
544 | const char *target = NULL; |
|
43025
2d3b2ed42f87
IRCv3: Fix pre-registration PRIVMSG not going to the status window
Gary Kramlich <grim@reaperworld.com>
parents:
43024
diff
changeset
|
545 | gboolean announce = TRUE; |
|
41813
86302ce7e3c1
Add support for handling PRIVMSG and NOTICE messages from the server
Gary Kramlich <grim@reaperworld.com>
parents:
41807
diff
changeset
|
546 | |
|
42769
c488d7af2923
Move the IRCv3 protocol plugin to our new Ibis library
Gary Kramlich <grim@reaperworld.com>
parents:
42652
diff
changeset
|
547 | params = ibis_message_get_params(ibis_message); |
|
42920
897667cab3ce
Add support for CTCP ACTION
Gary Kramlich <grim@reaperworld.com>
parents:
42896
diff
changeset
|
548 | ctcp_message = ibis_message_get_ctcp_message(ibis_message); |
|
42769
c488d7af2923
Move the IRCv3 protocol plugin to our new Ibis library
Gary Kramlich <grim@reaperworld.com>
parents:
42652
diff
changeset
|
549 | tags = ibis_message_get_tags(ibis_message); |
|
42333
a34601ac633c
Add PurpleIRCv3Message represent messages rather than multiple variables
Gary Kramlich <grim@reaperworld.com>
parents:
42320
diff
changeset
|
550 | |
|
42382
343e30628383
IRCv3: Fix an issue scanbuild found
Gary Kramlich <grim@reaperworld.com>
parents:
42378
diff
changeset
|
551 | if(params == NULL) { |
|
343e30628383
IRCv3: Fix an issue scanbuild found
Gary Kramlich <grim@reaperworld.com>
parents:
42378
diff
changeset
|
552 | g_warning("privmsg received with no parameters"); |
|
343e30628383
IRCv3: Fix an issue scanbuild found
Gary Kramlich <grim@reaperworld.com>
parents:
42378
diff
changeset
|
553 | |
|
343e30628383
IRCv3: Fix an issue scanbuild found
Gary Kramlich <grim@reaperworld.com>
parents:
42378
diff
changeset
|
554 | return FALSE; |
|
343e30628383
IRCv3: Fix an issue scanbuild found
Gary Kramlich <grim@reaperworld.com>
parents:
42378
diff
changeset
|
555 | } |
|
343e30628383
IRCv3: Fix an issue scanbuild found
Gary Kramlich <grim@reaperworld.com>
parents:
42378
diff
changeset
|
556 | |
|
343e30628383
IRCv3: Fix an issue scanbuild found
Gary Kramlich <grim@reaperworld.com>
parents:
42378
diff
changeset
|
557 | if(g_strv_length(params) != 2) { |
|
41813
86302ce7e3c1
Add support for handling PRIVMSG and NOTICE messages from the server
Gary Kramlich <grim@reaperworld.com>
parents:
41807
diff
changeset
|
558 | char *body = g_strjoinv(" ", params); |
|
86302ce7e3c1
Add support for handling PRIVMSG and NOTICE messages from the server
Gary Kramlich <grim@reaperworld.com>
parents:
41807
diff
changeset
|
559 | g_warning("unknown privmsg message format: '%s'", body); |
|
86302ce7e3c1
Add support for handling PRIVMSG and NOTICE messages from the server
Gary Kramlich <grim@reaperworld.com>
parents:
41807
diff
changeset
|
560 | g_free(body); |
|
86302ce7e3c1
Add support for handling PRIVMSG and NOTICE messages from the server
Gary Kramlich <grim@reaperworld.com>
parents:
41807
diff
changeset
|
561 | |
|
86302ce7e3c1
Add support for handling PRIVMSG and NOTICE messages from the server
Gary Kramlich <grim@reaperworld.com>
parents:
41807
diff
changeset
|
562 | return FALSE; |
|
86302ce7e3c1
Add support for handling PRIVMSG and NOTICE messages from the server
Gary Kramlich <grim@reaperworld.com>
parents:
41807
diff
changeset
|
563 | } |
|
86302ce7e3c1
Add support for handling PRIVMSG and NOTICE messages from the server
Gary Kramlich <grim@reaperworld.com>
parents:
41807
diff
changeset
|
564 | |
|
42815
95bb2ae83de7
IRCv3: Use Ibis.Message in PurpleIRCv3.Connection.find_or_create_contact
Gary Kramlich <grim@reaperworld.com>
parents:
42780
diff
changeset
|
565 | /* Find or create the contact. */ |
|
95bb2ae83de7
IRCv3: Use Ibis.Message in PurpleIRCv3.Connection.find_or_create_contact
Gary Kramlich <grim@reaperworld.com>
parents:
42780
diff
changeset
|
566 | contact = purple_ircv3_connection_find_or_create_contact(connection, |
|
95bb2ae83de7
IRCv3: Use Ibis.Message in PurpleIRCv3.Connection.find_or_create_contact
Gary Kramlich <grim@reaperworld.com>
parents:
42780
diff
changeset
|
567 | ibis_message); |
|
42345
e01084003f50
IRCv3: Finally fix sending messages between two users
Gary Kramlich <grim@reaperworld.com>
parents:
42333
diff
changeset
|
568 | |
|
41813
86302ce7e3c1
Add support for handling PRIVMSG and NOTICE messages from the server
Gary Kramlich <grim@reaperworld.com>
parents:
41807
diff
changeset
|
569 | target = params[0]; |
|
42896
5c8f4a455d3c
IRCv3: Use Ibis.Client.is_channel instead of our old version
Gary Kramlich <grim@reaperworld.com>
parents:
42893
diff
changeset
|
570 | if(!ibis_client_is_channel(client, target)) { |
|
42815
95bb2ae83de7
IRCv3: Use Ibis.Message in PurpleIRCv3.Connection.find_or_create_contact
Gary Kramlich <grim@reaperworld.com>
parents:
42780
diff
changeset
|
571 | target = purple_contact_info_get_id(PURPLE_CONTACT_INFO(contact)); |
|
42345
e01084003f50
IRCv3: Finally fix sending messages between two users
Gary Kramlich <grim@reaperworld.com>
parents:
42333
diff
changeset
|
572 | } |
|
42815
95bb2ae83de7
IRCv3: Use Ibis.Message in PurpleIRCv3.Connection.find_or_create_contact
Gary Kramlich <grim@reaperworld.com>
parents:
42780
diff
changeset
|
573 | |
|
43024
8a7be63f83e4
IRCv3: Handle ERROR messages
Gary Kramlich <grim@reaperworld.com>
parents:
43019
diff
changeset
|
574 | if(!ibis_client_get_registered(client)) { |
|
42965
37214064f381
IRCv3: While connecting put all PRIVMSG's in the status window
Gary Kramlich <grim@reaperworld.com>
parents:
42937
diff
changeset
|
575 | conversation = purple_ircv3_connection_get_status_conversation(connection); |
|
43025
2d3b2ed42f87
IRCv3: Fix pre-registration PRIVMSG not going to the status window
Gary Kramlich <grim@reaperworld.com>
parents:
43024
diff
changeset
|
576 | announce = FALSE; |
|
42926
c63faf01193e
Display CTCP requests in the status window
Gary Kramlich <grim@reaperworld.com>
parents:
42925
diff
changeset
|
577 | } |
|
42513
482ba61e5123
IRCv3: Add an ircv3_connection_find_or_create_contact
Gary Kramlich <grim@reaperworld.com>
parents:
42510
diff
changeset
|
578 | |
|
42920
897667cab3ce
Add support for CTCP ACTION
Gary Kramlich <grim@reaperworld.com>
parents:
42896
diff
changeset
|
579 | if(IBIS_IS_CTCP_MESSAGE(ctcp_message)) { |
|
897667cab3ce
Add support for CTCP ACTION
Gary Kramlich <grim@reaperworld.com>
parents:
42896
diff
changeset
|
580 | if(ibis_ctcp_message_is_command(ctcp_message, IBIS_CTCP_ACTION)) { |
|
897667cab3ce
Add support for CTCP ACTION
Gary Kramlich <grim@reaperworld.com>
parents:
42896
diff
changeset
|
581 | GStrv ctcp_params = NULL; |
|
897667cab3ce
Add support for CTCP ACTION
Gary Kramlich <grim@reaperworld.com>
parents:
42896
diff
changeset
|
582 | char *ctcp_body = NULL; |
|
897667cab3ce
Add support for CTCP ACTION
Gary Kramlich <grim@reaperworld.com>
parents:
42896
diff
changeset
|
583 | char *stripped = NULL; |
|
897667cab3ce
Add support for CTCP ACTION
Gary Kramlich <grim@reaperworld.com>
parents:
42896
diff
changeset
|
584 | |
|
43225
f0ffa584435b
IRCv3: Fix privmsg going to the status window before registration is complete
Gary Kramlich <grim@reaperworld.com>
parents:
43212
diff
changeset
|
585 | if(!PURPLE_IS_CONVERSATION(conversation)) { |
|
f0ffa584435b
IRCv3: Fix privmsg going to the status window before registration is complete
Gary Kramlich <grim@reaperworld.com>
parents:
43212
diff
changeset
|
586 | conversation = purple_ircv3_connection_find_or_create_conversation(connection, |
|
f0ffa584435b
IRCv3: Fix privmsg going to the status window before registration is complete
Gary Kramlich <grim@reaperworld.com>
parents:
43212
diff
changeset
|
587 | target); |
|
f0ffa584435b
IRCv3: Fix privmsg going to the status window before registration is complete
Gary Kramlich <grim@reaperworld.com>
parents:
43212
diff
changeset
|
588 | } |
|
f0ffa584435b
IRCv3: Fix privmsg going to the status window before registration is complete
Gary Kramlich <grim@reaperworld.com>
parents:
43212
diff
changeset
|
589 | |
|
43198
570996d7ad96
Fix CTCP ACTION going to the status window
Gary Kramlich <grim@reaperworld.com>
parents:
43195
diff
changeset
|
590 | member = purple_ircv3_add_contact_to_conversation(contact, |
|
570996d7ad96
Fix CTCP ACTION going to the status window
Gary Kramlich <grim@reaperworld.com>
parents:
43195
diff
changeset
|
591 | conversation, |
|
570996d7ad96
Fix CTCP ACTION going to the status window
Gary Kramlich <grim@reaperworld.com>
parents:
43195
diff
changeset
|
592 | announce); |
|
570996d7ad96
Fix CTCP ACTION going to the status window
Gary Kramlich <grim@reaperworld.com>
parents:
43195
diff
changeset
|
593 | |
|
42920
897667cab3ce
Add support for CTCP ACTION
Gary Kramlich <grim@reaperworld.com>
parents:
42896
diff
changeset
|
594 | ctcp_params = ibis_ctcp_message_get_params(ctcp_message); |
|
897667cab3ce
Add support for CTCP ACTION
Gary Kramlich <grim@reaperworld.com>
parents:
42896
diff
changeset
|
595 | ctcp_body = g_strjoinv(" ", ctcp_params); |
|
897667cab3ce
Add support for CTCP ACTION
Gary Kramlich <grim@reaperworld.com>
parents:
42896
diff
changeset
|
596 | stripped = ibis_formatting_strip(ctcp_body); |
|
897667cab3ce
Add support for CTCP ACTION
Gary Kramlich <grim@reaperworld.com>
parents:
42896
diff
changeset
|
597 | g_free(ctcp_body); |
|
897667cab3ce
Add support for CTCP ACTION
Gary Kramlich <grim@reaperworld.com>
parents:
42896
diff
changeset
|
598 | |
|
43100
e6df74d36862
Change Purple.Message:author to Purple.ConversationMember
Gary Kramlich <grim@reaperworld.com>
parents:
43098
diff
changeset
|
599 | message = purple_message_new(member, stripped); |
|
42920
897667cab3ce
Add support for CTCP ACTION
Gary Kramlich <grim@reaperworld.com>
parents:
42896
diff
changeset
|
600 | g_free(stripped); |
|
897667cab3ce
Add support for CTCP ACTION
Gary Kramlich <grim@reaperworld.com>
parents:
42896
diff
changeset
|
601 | |
|
897667cab3ce
Add support for CTCP ACTION
Gary Kramlich <grim@reaperworld.com>
parents:
42896
diff
changeset
|
602 | purple_message_set_action(message, TRUE); |
|
42926
c63faf01193e
Display CTCP requests in the status window
Gary Kramlich <grim@reaperworld.com>
parents:
42925
diff
changeset
|
603 | } else { |
|
c63faf01193e
Display CTCP requests in the status window
Gary Kramlich <grim@reaperworld.com>
parents:
42925
diff
changeset
|
604 | char *body = NULL; |
|
c63faf01193e
Display CTCP requests in the status window
Gary Kramlich <grim@reaperworld.com>
parents:
42925
diff
changeset
|
605 | |
|
43198
570996d7ad96
Fix CTCP ACTION going to the status window
Gary Kramlich <grim@reaperworld.com>
parents:
43195
diff
changeset
|
606 | announce = FALSE; |
|
43225
f0ffa584435b
IRCv3: Fix privmsg going to the status window before registration is complete
Gary Kramlich <grim@reaperworld.com>
parents:
43212
diff
changeset
|
607 | |
|
f0ffa584435b
IRCv3: Fix privmsg going to the status window before registration is complete
Gary Kramlich <grim@reaperworld.com>
parents:
43212
diff
changeset
|
608 | if(!PURPLE_IS_CONVERSATION(conversation)) { |
|
f0ffa584435b
IRCv3: Fix privmsg going to the status window before registration is complete
Gary Kramlich <grim@reaperworld.com>
parents:
43212
diff
changeset
|
609 | conversation = purple_ircv3_connection_get_status_conversation(connection); |
|
f0ffa584435b
IRCv3: Fix privmsg going to the status window before registration is complete
Gary Kramlich <grim@reaperworld.com>
parents:
43212
diff
changeset
|
610 | } |
|
43198
570996d7ad96
Fix CTCP ACTION going to the status window
Gary Kramlich <grim@reaperworld.com>
parents:
43195
diff
changeset
|
611 | member = purple_ircv3_add_contact_to_conversation(contact, |
|
570996d7ad96
Fix CTCP ACTION going to the status window
Gary Kramlich <grim@reaperworld.com>
parents:
43195
diff
changeset
|
612 | conversation, |
|
570996d7ad96
Fix CTCP ACTION going to the status window
Gary Kramlich <grim@reaperworld.com>
parents:
43195
diff
changeset
|
613 | announce); |
|
570996d7ad96
Fix CTCP ACTION going to the status window
Gary Kramlich <grim@reaperworld.com>
parents:
43195
diff
changeset
|
614 | |
|
42926
c63faf01193e
Display CTCP requests in the status window
Gary Kramlich <grim@reaperworld.com>
parents:
42925
diff
changeset
|
615 | body = g_strdup_printf(_("requested CTCP '%s' (to %s) from %s"), |
|
c63faf01193e
Display CTCP requests in the status window
Gary Kramlich <grim@reaperworld.com>
parents:
42925
diff
changeset
|
616 | ibis_ctcp_message_get_command(ctcp_message), |
|
c63faf01193e
Display CTCP requests in the status window
Gary Kramlich <grim@reaperworld.com>
parents:
42925
diff
changeset
|
617 | params[0], |
|
c63faf01193e
Display CTCP requests in the status window
Gary Kramlich <grim@reaperworld.com>
parents:
42925
diff
changeset
|
618 | purple_contact_info_get_id(PURPLE_CONTACT_INFO(contact))); |
|
c63faf01193e
Display CTCP requests in the status window
Gary Kramlich <grim@reaperworld.com>
parents:
42925
diff
changeset
|
619 | |
|
43100
e6df74d36862
Change Purple.Message:author to Purple.ConversationMember
Gary Kramlich <grim@reaperworld.com>
parents:
43098
diff
changeset
|
620 | message = purple_message_new(member, body); |
|
43198
570996d7ad96
Fix CTCP ACTION going to the status window
Gary Kramlich <grim@reaperworld.com>
parents:
43195
diff
changeset
|
621 | purple_message_set_event(message, TRUE); |
|
42926
c63faf01193e
Display CTCP requests in the status window
Gary Kramlich <grim@reaperworld.com>
parents:
42925
diff
changeset
|
622 | g_free(body); |
|
42920
897667cab3ce
Add support for CTCP ACTION
Gary Kramlich <grim@reaperworld.com>
parents:
42896
diff
changeset
|
623 | } |
|
43198
570996d7ad96
Fix CTCP ACTION going to the status window
Gary Kramlich <grim@reaperworld.com>
parents:
43195
diff
changeset
|
624 | } else { |
|
43212
d2f7c939f650
IRCv3: Handle incoming formatting
Gary Kramlich <grim@reaperworld.com>
parents:
43206
diff
changeset
|
625 | PangoAttrList *attrs = NULL; |
|
43198
570996d7ad96
Fix CTCP ACTION going to the status window
Gary Kramlich <grim@reaperworld.com>
parents:
43195
diff
changeset
|
626 | char *stripped = NULL; |
|
42920
897667cab3ce
Add support for CTCP ACTION
Gary Kramlich <grim@reaperworld.com>
parents:
42896
diff
changeset
|
627 | |
|
43225
f0ffa584435b
IRCv3: Fix privmsg going to the status window before registration is complete
Gary Kramlich <grim@reaperworld.com>
parents:
43212
diff
changeset
|
628 | /* If we received this message before registration has completed, |
|
f0ffa584435b
IRCv3: Fix privmsg going to the status window before registration is complete
Gary Kramlich <grim@reaperworld.com>
parents:
43212
diff
changeset
|
629 | * conversation will be set to the status conversation. |
|
f0ffa584435b
IRCv3: Fix privmsg going to the status window before registration is complete
Gary Kramlich <grim@reaperworld.com>
parents:
43212
diff
changeset
|
630 | */ |
|
f0ffa584435b
IRCv3: Fix privmsg going to the status window before registration is complete
Gary Kramlich <grim@reaperworld.com>
parents:
43212
diff
changeset
|
631 | if(!PURPLE_IS_CONVERSATION(conversation)) { |
|
f0ffa584435b
IRCv3: Fix privmsg going to the status window before registration is complete
Gary Kramlich <grim@reaperworld.com>
parents:
43212
diff
changeset
|
632 | conversation = purple_ircv3_connection_find_or_create_conversation(connection, |
|
f0ffa584435b
IRCv3: Fix privmsg going to the status window before registration is complete
Gary Kramlich <grim@reaperworld.com>
parents:
43212
diff
changeset
|
633 | target); |
|
f0ffa584435b
IRCv3: Fix privmsg going to the status window before registration is complete
Gary Kramlich <grim@reaperworld.com>
parents:
43212
diff
changeset
|
634 | } |
|
f0ffa584435b
IRCv3: Fix privmsg going to the status window before registration is complete
Gary Kramlich <grim@reaperworld.com>
parents:
43212
diff
changeset
|
635 | |
|
43198
570996d7ad96
Fix CTCP ACTION going to the status window
Gary Kramlich <grim@reaperworld.com>
parents:
43195
diff
changeset
|
636 | member = purple_ircv3_add_contact_to_conversation(contact, |
|
570996d7ad96
Fix CTCP ACTION going to the status window
Gary Kramlich <grim@reaperworld.com>
parents:
43195
diff
changeset
|
637 | conversation, |
|
570996d7ad96
Fix CTCP ACTION going to the status window
Gary Kramlich <grim@reaperworld.com>
parents:
43195
diff
changeset
|
638 | announce); |
|
42920
897667cab3ce
Add support for CTCP ACTION
Gary Kramlich <grim@reaperworld.com>
parents:
42896
diff
changeset
|
639 | |
|
43212
d2f7c939f650
IRCv3: Handle incoming formatting
Gary Kramlich <grim@reaperworld.com>
parents:
43206
diff
changeset
|
640 | stripped = ibis_formatting_parse(params[1], &attrs); |
|
43100
e6df74d36862
Change Purple.Message:author to Purple.ConversationMember
Gary Kramlich <grim@reaperworld.com>
parents:
43098
diff
changeset
|
641 | message = purple_message_new(member, stripped); |
|
43212
d2f7c939f650
IRCv3: Handle incoming formatting
Gary Kramlich <grim@reaperworld.com>
parents:
43206
diff
changeset
|
642 | purple_message_set_attributes(message, attrs); |
|
42920
897667cab3ce
Add support for CTCP ACTION
Gary Kramlich <grim@reaperworld.com>
parents:
42896
diff
changeset
|
643 | g_clear_pointer(&stripped, g_free); |
|
43212
d2f7c939f650
IRCv3: Handle incoming formatting
Gary Kramlich <grim@reaperworld.com>
parents:
43206
diff
changeset
|
644 | g_clear_pointer(&attrs, pango_attr_list_unref); |
|
42920
897667cab3ce
Add support for CTCP ACTION
Gary Kramlich <grim@reaperworld.com>
parents:
42896
diff
changeset
|
645 | } |
|
897667cab3ce
Add support for CTCP ACTION
Gary Kramlich <grim@reaperworld.com>
parents:
42896
diff
changeset
|
646 | |
|
42769
c488d7af2923
Move the IRCv3 protocol plugin to our new Ibis library
Gary Kramlich <grim@reaperworld.com>
parents:
42652
diff
changeset
|
647 | if(purple_strequal(command, IBIS_MSG_NOTICE)) { |
|
42815
95bb2ae83de7
IRCv3: Use Ibis.Message in PurpleIRCv3.Connection.find_or_create_contact
Gary Kramlich <grim@reaperworld.com>
parents:
42780
diff
changeset
|
648 | purple_message_set_notice(message, TRUE); |
|
41813
86302ce7e3c1
Add support for handling PRIVMSG and NOTICE messages from the server
Gary Kramlich <grim@reaperworld.com>
parents:
41807
diff
changeset
|
649 | } |
|
86302ce7e3c1
Add support for handling PRIVMSG and NOTICE messages from the server
Gary Kramlich <grim@reaperworld.com>
parents:
41807
diff
changeset
|
650 | |
|
42775
98b71fc8a330
Only check tags if we have a tags object
Gary Kramlich <grim@reaperworld.com>
parents:
42769
diff
changeset
|
651 | if(IBIS_IS_TAGS(tags)) { |
|
42815
95bb2ae83de7
IRCv3: Use Ibis.Message in PurpleIRCv3.Connection.find_or_create_contact
Gary Kramlich <grim@reaperworld.com>
parents:
42780
diff
changeset
|
652 | const char *raw_tag = NULL; |
|
95bb2ae83de7
IRCv3: Use Ibis.Message in PurpleIRCv3.Connection.find_or_create_contact
Gary Kramlich <grim@reaperworld.com>
parents:
42780
diff
changeset
|
653 | |
|
42775
98b71fc8a330
Only check tags if we have a tags object
Gary Kramlich <grim@reaperworld.com>
parents:
42769
diff
changeset
|
654 | /* Grab the msgid if one was provided. */ |
|
98b71fc8a330
Only check tags if we have a tags object
Gary Kramlich <grim@reaperworld.com>
parents:
42769
diff
changeset
|
655 | raw_tag = ibis_tags_lookup(tags, "msgid"); |
|
98b71fc8a330
Only check tags if we have a tags object
Gary Kramlich <grim@reaperworld.com>
parents:
42769
diff
changeset
|
656 | if(!purple_strempty(raw_tag)) { |
|
42815
95bb2ae83de7
IRCv3: Use Ibis.Message in PurpleIRCv3.Connection.find_or_create_contact
Gary Kramlich <grim@reaperworld.com>
parents:
42780
diff
changeset
|
657 | purple_message_set_id(message, raw_tag); |
|
42775
98b71fc8a330
Only check tags if we have a tags object
Gary Kramlich <grim@reaperworld.com>
parents:
42769
diff
changeset
|
658 | } |
|
42294
462317d1382d
IRCv3: add support for the server-time capability
Gary Kramlich <grim@reaperworld.com>
parents:
42275
diff
changeset
|
659 | |
|
42775
98b71fc8a330
Only check tags if we have a tags object
Gary Kramlich <grim@reaperworld.com>
parents:
42769
diff
changeset
|
660 | /* Determine the timestamp of the message. */ |
|
98b71fc8a330
Only check tags if we have a tags object
Gary Kramlich <grim@reaperworld.com>
parents:
42769
diff
changeset
|
661 | raw_tag = ibis_tags_lookup(tags, "time"); |
|
98b71fc8a330
Only check tags if we have a tags object
Gary Kramlich <grim@reaperworld.com>
parents:
42769
diff
changeset
|
662 | if(!purple_strempty(raw_tag)) { |
|
98b71fc8a330
Only check tags if we have a tags object
Gary Kramlich <grim@reaperworld.com>
parents:
42769
diff
changeset
|
663 | GTimeZone *tz = g_time_zone_new_utc(); |
|
42294
462317d1382d
IRCv3: add support for the server-time capability
Gary Kramlich <grim@reaperworld.com>
parents:
42275
diff
changeset
|
664 | |
|
42775
98b71fc8a330
Only check tags if we have a tags object
Gary Kramlich <grim@reaperworld.com>
parents:
42769
diff
changeset
|
665 | dt = g_date_time_new_from_iso8601(raw_tag, tz); |
|
42815
95bb2ae83de7
IRCv3: Use Ibis.Message in PurpleIRCv3.Connection.find_or_create_contact
Gary Kramlich <grim@reaperworld.com>
parents:
42780
diff
changeset
|
666 | g_time_zone_unref(tz); |
|
42294
462317d1382d
IRCv3: add support for the server-time capability
Gary Kramlich <grim@reaperworld.com>
parents:
42275
diff
changeset
|
667 | |
|
42815
95bb2ae83de7
IRCv3: Use Ibis.Message in PurpleIRCv3.Connection.find_or_create_contact
Gary Kramlich <grim@reaperworld.com>
parents:
42780
diff
changeset
|
668 | purple_message_set_timestamp(message, dt); |
|
95bb2ae83de7
IRCv3: Use Ibis.Message in PurpleIRCv3.Connection.find_or_create_contact
Gary Kramlich <grim@reaperworld.com>
parents:
42780
diff
changeset
|
669 | g_date_time_unref(dt); |
|
42775
98b71fc8a330
Only check tags if we have a tags object
Gary Kramlich <grim@reaperworld.com>
parents:
42769
diff
changeset
|
670 | } |
|
42294
462317d1382d
IRCv3: add support for the server-time capability
Gary Kramlich <grim@reaperworld.com>
parents:
42275
diff
changeset
|
671 | } |
|
462317d1382d
IRCv3: add support for the server-time capability
Gary Kramlich <grim@reaperworld.com>
parents:
42275
diff
changeset
|
672 | |
|
462317d1382d
IRCv3: add support for the server-time capability
Gary Kramlich <grim@reaperworld.com>
parents:
42275
diff
changeset
|
673 | /* If the server didn't provide a time, use the current local time. */ |
|
462317d1382d
IRCv3: add support for the server-time capability
Gary Kramlich <grim@reaperworld.com>
parents:
42275
diff
changeset
|
674 | if(dt == NULL) { |
|
42815
95bb2ae83de7
IRCv3: Use Ibis.Message in PurpleIRCv3.Connection.find_or_create_contact
Gary Kramlich <grim@reaperworld.com>
parents:
42780
diff
changeset
|
675 | purple_message_set_timestamp_now(message); |
|
42294
462317d1382d
IRCv3: add support for the server-time capability
Gary Kramlich <grim@reaperworld.com>
parents:
42275
diff
changeset
|
676 | } |
|
42056
ced07483f66a
IRCv3: Add support for the msgid specification
Gary Kramlich <grim@reaperworld.com>
parents:
42048
diff
changeset
|
677 | |
|
42769
c488d7af2923
Move the IRCv3 protocol plugin to our new Ibis library
Gary Kramlich <grim@reaperworld.com>
parents:
42652
diff
changeset
|
678 | purple_conversation_write_message(conversation, message); |
|
c488d7af2923
Move the IRCv3 protocol plugin to our new Ibis library
Gary Kramlich <grim@reaperworld.com>
parents:
42652
diff
changeset
|
679 | |
|
41813
86302ce7e3c1
Add support for handling PRIVMSG and NOTICE messages from the server
Gary Kramlich <grim@reaperworld.com>
parents:
41807
diff
changeset
|
680 | g_clear_object(&message); |
|
86302ce7e3c1
Add support for handling PRIVMSG and NOTICE messages from the server
Gary Kramlich <grim@reaperworld.com>
parents:
41807
diff
changeset
|
681 | |
|
42937
34ac8ac8c7b6
Implement CTCP VERSION response
Gary Kramlich <grim@reaperworld.com>
parents:
42926
diff
changeset
|
682 | /* If the message contained a CTCP message and was a PRIVMSG, we then need |
|
34ac8ac8c7b6
Implement CTCP VERSION response
Gary Kramlich <grim@reaperworld.com>
parents:
42926
diff
changeset
|
683 | * to attempt to handle it. |
|
34ac8ac8c7b6
Implement CTCP VERSION response
Gary Kramlich <grim@reaperworld.com>
parents:
42926
diff
changeset
|
684 | */ |
|
34ac8ac8c7b6
Implement CTCP VERSION response
Gary Kramlich <grim@reaperworld.com>
parents:
42926
diff
changeset
|
685 | if(IBIS_IS_CTCP_MESSAGE(ctcp_message) && |
|
34ac8ac8c7b6
Implement CTCP VERSION response
Gary Kramlich <grim@reaperworld.com>
parents:
42926
diff
changeset
|
686 | purple_strequal(command, IBIS_MSG_PRIVMSG)) |
|
34ac8ac8c7b6
Implement CTCP VERSION response
Gary Kramlich <grim@reaperworld.com>
parents:
42926
diff
changeset
|
687 | { |
|
34ac8ac8c7b6
Implement CTCP VERSION response
Gary Kramlich <grim@reaperworld.com>
parents:
42926
diff
changeset
|
688 | purple_ircv3_ctcp_handler(connection, client, ibis_message); |
|
34ac8ac8c7b6
Implement CTCP VERSION response
Gary Kramlich <grim@reaperworld.com>
parents:
42926
diff
changeset
|
689 | } |
|
34ac8ac8c7b6
Implement CTCP VERSION response
Gary Kramlich <grim@reaperworld.com>
parents:
42926
diff
changeset
|
690 | |
|
41813
86302ce7e3c1
Add support for handling PRIVMSG and NOTICE messages from the server
Gary Kramlich <grim@reaperworld.com>
parents:
41807
diff
changeset
|
691 | return TRUE; |
|
86302ce7e3c1
Add support for handling PRIVMSG and NOTICE messages from the server
Gary Kramlich <grim@reaperworld.com>
parents:
41807
diff
changeset
|
692 | } |
|
42503
55eff782a478
IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents:
42494
diff
changeset
|
693 | |
|
55eff782a478
IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents:
42494
diff
changeset
|
694 | gboolean |
|
42769
c488d7af2923
Move the IRCv3 protocol plugin to our new Ibis library
Gary Kramlich <grim@reaperworld.com>
parents:
42652
diff
changeset
|
695 | purple_ircv3_message_handler_topic(G_GNUC_UNUSED IbisClient *client, |
|
c488d7af2923
Move the IRCv3 protocol plugin to our new Ibis library
Gary Kramlich <grim@reaperworld.com>
parents:
42652
diff
changeset
|
696 | const char *command, IbisMessage *message, |
|
42503
55eff782a478
IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents:
42494
diff
changeset
|
697 | gpointer data) |
|
55eff782a478
IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents:
42494
diff
changeset
|
698 | { |
|
55eff782a478
IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents:
42494
diff
changeset
|
699 | PurpleIRCv3Connection *connection = data; |
|
55eff782a478
IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents:
42494
diff
changeset
|
700 | PurpleConversation *conversation = NULL; |
|
55eff782a478
IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents:
42494
diff
changeset
|
701 | GStrv params = NULL; |
|
55eff782a478
IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents:
42494
diff
changeset
|
702 | const char *channel = NULL; |
|
55eff782a478
IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents:
42494
diff
changeset
|
703 | const char *topic = NULL; |
|
55eff782a478
IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents:
42494
diff
changeset
|
704 | guint n_params = 0; |
|
55eff782a478
IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents:
42494
diff
changeset
|
705 | |
|
42769
c488d7af2923
Move the IRCv3 protocol plugin to our new Ibis library
Gary Kramlich <grim@reaperworld.com>
parents:
42652
diff
changeset
|
706 | params = ibis_message_get_params(message); |
|
42503
55eff782a478
IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents:
42494
diff
changeset
|
707 | n_params = g_strv_length(params); |
|
55eff782a478
IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents:
42494
diff
changeset
|
708 | |
|
42769
c488d7af2923
Move the IRCv3 protocol plugin to our new Ibis library
Gary Kramlich <grim@reaperworld.com>
parents:
42652
diff
changeset
|
709 | if(purple_strequal(command, IBIS_MSG_TOPIC)) { |
|
42503
55eff782a478
IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents:
42494
diff
changeset
|
710 | if(n_params != 2) { |
|
42769
c488d7af2923
Move the IRCv3 protocol plugin to our new Ibis library
Gary Kramlich <grim@reaperworld.com>
parents:
42652
diff
changeset
|
711 | g_message("received TOPIC with %u parameters, expected 2", |
|
c488d7af2923
Move the IRCv3 protocol plugin to our new Ibis library
Gary Kramlich <grim@reaperworld.com>
parents:
42652
diff
changeset
|
712 | n_params); |
|
42503
55eff782a478
IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents:
42494
diff
changeset
|
713 | |
|
55eff782a478
IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents:
42494
diff
changeset
|
714 | return FALSE; |
|
55eff782a478
IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents:
42494
diff
changeset
|
715 | } |
|
55eff782a478
IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents:
42494
diff
changeset
|
716 | |
|
55eff782a478
IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents:
42494
diff
changeset
|
717 | channel = params[0]; |
|
55eff782a478
IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents:
42494
diff
changeset
|
718 | topic = params[1]; |
|
42769
c488d7af2923
Move the IRCv3 protocol plugin to our new Ibis library
Gary Kramlich <grim@reaperworld.com>
parents:
42652
diff
changeset
|
719 | } else if(purple_strequal(command, IBIS_RPL_NOTOPIC)) { |
|
42503
55eff782a478
IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents:
42494
diff
changeset
|
720 | if(n_params != 3) { |
|
42769
c488d7af2923
Move the IRCv3 protocol plugin to our new Ibis library
Gary Kramlich <grim@reaperworld.com>
parents:
42652
diff
changeset
|
721 | g_message("received RPL_NOTOPIC with %u parameters, expected 3", |
|
c488d7af2923
Move the IRCv3 protocol plugin to our new Ibis library
Gary Kramlich <grim@reaperworld.com>
parents:
42652
diff
changeset
|
722 | n_params); |
|
42503
55eff782a478
IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents:
42494
diff
changeset
|
723 | |
|
55eff782a478
IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents:
42494
diff
changeset
|
724 | return FALSE; |
|
55eff782a478
IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents:
42494
diff
changeset
|
725 | } |
|
55eff782a478
IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents:
42494
diff
changeset
|
726 | |
|
55eff782a478
IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents:
42494
diff
changeset
|
727 | channel = params[1]; |
|
55eff782a478
IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents:
42494
diff
changeset
|
728 | topic = ""; |
|
42769
c488d7af2923
Move the IRCv3 protocol plugin to our new Ibis library
Gary Kramlich <grim@reaperworld.com>
parents:
42652
diff
changeset
|
729 | } else if(purple_strequal(command, IBIS_RPL_TOPIC)) { |
|
42503
55eff782a478
IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents:
42494
diff
changeset
|
730 | if(n_params != 3) { |
|
42769
c488d7af2923
Move the IRCv3 protocol plugin to our new Ibis library
Gary Kramlich <grim@reaperworld.com>
parents:
42652
diff
changeset
|
731 | g_message("received RPL_TOPIC with %u parameters, expected 3", |
|
c488d7af2923
Move the IRCv3 protocol plugin to our new Ibis library
Gary Kramlich <grim@reaperworld.com>
parents:
42652
diff
changeset
|
732 | n_params); |
|
42503
55eff782a478
IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents:
42494
diff
changeset
|
733 | |
|
55eff782a478
IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents:
42494
diff
changeset
|
734 | return FALSE; |
|
55eff782a478
IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents:
42494
diff
changeset
|
735 | } |
|
55eff782a478
IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents:
42494
diff
changeset
|
736 | |
|
55eff782a478
IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents:
42494
diff
changeset
|
737 | channel = params[1]; |
|
55eff782a478
IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents:
42494
diff
changeset
|
738 | topic = params[2]; |
|
55eff782a478
IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents:
42494
diff
changeset
|
739 | } else { |
|
42769
c488d7af2923
Move the IRCv3 protocol plugin to our new Ibis library
Gary Kramlich <grim@reaperworld.com>
parents:
42652
diff
changeset
|
740 | g_message("unexpected command %s", command); |
|
42503
55eff782a478
IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents:
42494
diff
changeset
|
741 | |
|
55eff782a478
IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents:
42494
diff
changeset
|
742 | return FALSE; |
|
55eff782a478
IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents:
42494
diff
changeset
|
743 | } |
|
55eff782a478
IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents:
42494
diff
changeset
|
744 | |
|
55eff782a478
IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents:
42494
diff
changeset
|
745 | conversation = purple_ircv3_connection_find_or_create_conversation(connection, |
|
55eff782a478
IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents:
42494
diff
changeset
|
746 | channel); |
|
55eff782a478
IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents:
42494
diff
changeset
|
747 | if(!PURPLE_IS_CONVERSATION(conversation)) { |
|
42769
c488d7af2923
Move the IRCv3 protocol plugin to our new Ibis library
Gary Kramlich <grim@reaperworld.com>
parents:
42652
diff
changeset
|
748 | g_message("failed to find or create channel '%s'", channel); |
|
42503
55eff782a478
IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents:
42494
diff
changeset
|
749 | |
|
55eff782a478
IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents:
42494
diff
changeset
|
750 | return FALSE; |
|
55eff782a478
IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents:
42494
diff
changeset
|
751 | } |
|
55eff782a478
IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents:
42494
diff
changeset
|
752 | |
|
55eff782a478
IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents:
42494
diff
changeset
|
753 | purple_conversation_set_topic(conversation, topic); |
|
55eff782a478
IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents:
42494
diff
changeset
|
754 | |
|
55eff782a478
IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents:
42494
diff
changeset
|
755 | return TRUE; |
|
55eff782a478
IRCv3: Add support for updating topics
Gary Kramlich <grim@reaperworld.com>
parents:
42494
diff
changeset
|
756 | } |
|
43007
e61836350fce
IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents:
42982
diff
changeset
|
757 | |
|
e61836350fce
IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents:
42982
diff
changeset
|
758 | gboolean |
|
43238
58bca4467196
IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents:
43236
diff
changeset
|
759 | purple_ircv3_message_handler_whotopic(G_GNUC_UNUSED IbisClient *client, |
|
58bca4467196
IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents:
43236
diff
changeset
|
760 | G_GNUC_UNUSED const char *command, |
|
58bca4467196
IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents:
43236
diff
changeset
|
761 | IbisMessage *message, |
|
58bca4467196
IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents:
43236
diff
changeset
|
762 | gpointer data) |
|
58bca4467196
IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents:
43236
diff
changeset
|
763 | { |
|
58bca4467196
IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents:
43236
diff
changeset
|
764 | PurpleIRCv3Connection *connection = data; |
|
58bca4467196
IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents:
43236
diff
changeset
|
765 | PurpleConversation *conversation = NULL; |
|
58bca4467196
IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents:
43236
diff
changeset
|
766 | PurpleContact *contact = NULL; |
|
58bca4467196
IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents:
43236
diff
changeset
|
767 | GDateTime *timestamp = NULL; |
|
58bca4467196
IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents:
43236
diff
changeset
|
768 | GObject *obj = NULL; |
|
58bca4467196
IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents:
43236
diff
changeset
|
769 | GStrv params = NULL; |
|
58bca4467196
IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents:
43236
diff
changeset
|
770 | char *nick = NULL; |
|
58bca4467196
IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents:
43236
diff
changeset
|
771 | guint n_params = 0; |
|
58bca4467196
IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents:
43236
diff
changeset
|
772 | |
|
58bca4467196
IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents:
43236
diff
changeset
|
773 | params = ibis_message_get_params(message); |
|
58bca4467196
IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents:
43236
diff
changeset
|
774 | n_params = g_strv_length(params); |
|
58bca4467196
IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents:
43236
diff
changeset
|
775 | |
|
58bca4467196
IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents:
43236
diff
changeset
|
776 | /* The 333 whotopic message has parameters of `client channel source |
|
58bca4467196
IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents:
43236
diff
changeset
|
777 | * timestamp`. |
|
58bca4467196
IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents:
43236
diff
changeset
|
778 | */ |
|
58bca4467196
IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents:
43236
diff
changeset
|
779 | if(n_params != 4) { |
|
58bca4467196
IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents:
43236
diff
changeset
|
780 | g_message("received 333 with %u parameters, expected 4", n_params); |
|
58bca4467196
IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents:
43236
diff
changeset
|
781 | |
|
58bca4467196
IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents:
43236
diff
changeset
|
782 | return FALSE; |
|
58bca4467196
IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents:
43236
diff
changeset
|
783 | } |
|
58bca4467196
IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents:
43236
diff
changeset
|
784 | |
|
58bca4467196
IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents:
43236
diff
changeset
|
785 | conversation = purple_ircv3_connection_find_or_create_conversation(connection, |
|
58bca4467196
IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents:
43236
diff
changeset
|
786 | params[1]); |
|
58bca4467196
IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents:
43236
diff
changeset
|
787 | if(!PURPLE_IS_CONVERSATION(conversation)) { |
|
58bca4467196
IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents:
43236
diff
changeset
|
788 | g_message("failed to find or create channel '%s'", params[1]); |
|
58bca4467196
IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents:
43236
diff
changeset
|
789 | |
|
58bca4467196
IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents:
43236
diff
changeset
|
790 | return FALSE; |
|
58bca4467196
IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents:
43236
diff
changeset
|
791 | } |
|
58bca4467196
IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents:
43236
diff
changeset
|
792 | |
|
58bca4467196
IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents:
43236
diff
changeset
|
793 | ibis_source_parse(params[2], &nick, NULL, NULL); |
|
58bca4467196
IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents:
43236
diff
changeset
|
794 | contact = purple_ircv3_connection_find_or_create_contact_from_nick(connection, |
|
58bca4467196
IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents:
43236
diff
changeset
|
795 | nick); |
|
58bca4467196
IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents:
43236
diff
changeset
|
796 | g_free(nick); |
|
58bca4467196
IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents:
43236
diff
changeset
|
797 | timestamp = g_date_time_new_from_unix_utc(atoi(params[3])); |
|
58bca4467196
IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents:
43236
diff
changeset
|
798 | |
|
58bca4467196
IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents:
43236
diff
changeset
|
799 | obj = G_OBJECT(conversation); |
|
58bca4467196
IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents:
43236
diff
changeset
|
800 | g_object_freeze_notify(obj); |
|
58bca4467196
IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents:
43236
diff
changeset
|
801 | purple_conversation_set_topic_author(conversation, |
|
58bca4467196
IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents:
43236
diff
changeset
|
802 | PURPLE_CONTACT_INFO(contact)); |
|
58bca4467196
IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents:
43236
diff
changeset
|
803 | purple_conversation_set_topic_updated(conversation, timestamp); |
|
58bca4467196
IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents:
43236
diff
changeset
|
804 | g_object_thaw_notify(obj); |
|
58bca4467196
IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents:
43236
diff
changeset
|
805 | |
|
58bca4467196
IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents:
43236
diff
changeset
|
806 | g_date_time_unref(timestamp); |
|
58bca4467196
IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents:
43236
diff
changeset
|
807 | |
|
58bca4467196
IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents:
43236
diff
changeset
|
808 | return TRUE; |
|
58bca4467196
IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents:
43236
diff
changeset
|
809 | } |
|
58bca4467196
IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents:
43236
diff
changeset
|
810 | |
|
58bca4467196
IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents:
43236
diff
changeset
|
811 | gboolean |
|
58bca4467196
IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents:
43236
diff
changeset
|
812 | purple_ircv3_message_handler_channel_url(G_GNUC_UNUSED IbisClient *client, |
|
58bca4467196
IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents:
43236
diff
changeset
|
813 | G_GNUC_UNUSED const char *command, |
|
58bca4467196
IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents:
43236
diff
changeset
|
814 | IbisMessage *message, |
|
58bca4467196
IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents:
43236
diff
changeset
|
815 | gpointer data) |
|
58bca4467196
IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents:
43236
diff
changeset
|
816 | { |
|
58bca4467196
IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents:
43236
diff
changeset
|
817 | PurpleIRCv3Connection *connection = data; |
|
58bca4467196
IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents:
43236
diff
changeset
|
818 | PurpleConversation *conversation = NULL; |
|
58bca4467196
IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents:
43236
diff
changeset
|
819 | GStrv params = NULL; |
|
58bca4467196
IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents:
43236
diff
changeset
|
820 | guint n_params = 0; |
|
58bca4467196
IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents:
43236
diff
changeset
|
821 | |
|
58bca4467196
IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents:
43236
diff
changeset
|
822 | params = ibis_message_get_params(message); |
|
58bca4467196
IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents:
43236
diff
changeset
|
823 | n_params = g_strv_length(params); |
|
58bca4467196
IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents:
43236
diff
changeset
|
824 | |
|
58bca4467196
IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents:
43236
diff
changeset
|
825 | /* The 328 numeric has parameters of `client channel :url`. */ |
|
58bca4467196
IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents:
43236
diff
changeset
|
826 | if(n_params != 3) { |
|
58bca4467196
IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents:
43236
diff
changeset
|
827 | g_message("received 328 with %u parameters, expected 3", n_params); |
|
58bca4467196
IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents:
43236
diff
changeset
|
828 | |
|
58bca4467196
IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents:
43236
diff
changeset
|
829 | return FALSE; |
|
58bca4467196
IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents:
43236
diff
changeset
|
830 | } |
|
58bca4467196
IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents:
43236
diff
changeset
|
831 | |
|
58bca4467196
IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents:
43236
diff
changeset
|
832 | conversation = purple_ircv3_connection_find_or_create_conversation(connection, |
|
58bca4467196
IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents:
43236
diff
changeset
|
833 | params[1]); |
|
58bca4467196
IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents:
43236
diff
changeset
|
834 | if(!PURPLE_IS_CONVERSATION(conversation)) { |
|
58bca4467196
IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents:
43236
diff
changeset
|
835 | g_message("failed to find or create channel '%s'", params[1]); |
|
58bca4467196
IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents:
43236
diff
changeset
|
836 | |
|
58bca4467196
IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents:
43236
diff
changeset
|
837 | return FALSE; |
|
58bca4467196
IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents:
43236
diff
changeset
|
838 | } |
|
58bca4467196
IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents:
43236
diff
changeset
|
839 | |
|
58bca4467196
IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents:
43236
diff
changeset
|
840 | purple_conversation_set_url(conversation, params[2]); |
|
58bca4467196
IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents:
43236
diff
changeset
|
841 | |
|
58bca4467196
IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents:
43236
diff
changeset
|
842 | return TRUE; |
|
58bca4467196
IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents:
43236
diff
changeset
|
843 | } |
|
58bca4467196
IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents:
43236
diff
changeset
|
844 | |
|
58bca4467196
IRCv3: Handle the WHOTOPIC and CHANNEL_URL messages
Gary Kramlich <grim@reaperworld.com>
parents:
43236
diff
changeset
|
845 | gboolean |
|
43007
e61836350fce
IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents:
42982
diff
changeset
|
846 | purple_ircv3_message_handler_quit(G_GNUC_UNUSED IbisClient *client, |
|
e61836350fce
IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents:
42982
diff
changeset
|
847 | G_GNUC_UNUSED const char *command, |
|
e61836350fce
IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents:
42982
diff
changeset
|
848 | IbisMessage *ibis_message, |
|
e61836350fce
IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents:
42982
diff
changeset
|
849 | gpointer data) |
|
e61836350fce
IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents:
42982
diff
changeset
|
850 | { |
|
e61836350fce
IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents:
42982
diff
changeset
|
851 | PurpleIRCv3Connection *connection = data; |
|
e61836350fce
IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents:
42982
diff
changeset
|
852 | PurpleContact *contact = NULL; |
|
e61836350fce
IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents:
42982
diff
changeset
|
853 | PurpleContactInfo *info = NULL; |
|
e61836350fce
IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents:
42982
diff
changeset
|
854 | PurpleConversationManager *manager = NULL; |
|
43226
300f85971e83
IRCv3: Set the presence to offline when we receive a quit message
Gary Kramlich <grim@reaperworld.com>
parents:
43225
diff
changeset
|
855 | PurplePresence *presence = NULL; |
|
43007
e61836350fce
IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents:
42982
diff
changeset
|
856 | GList *conversations = NULL; |
|
e61836350fce
IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents:
42982
diff
changeset
|
857 | GStrv params = NULL; |
|
e61836350fce
IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents:
42982
diff
changeset
|
858 | guint n_params = 0; |
|
e61836350fce
IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents:
42982
diff
changeset
|
859 | char *message = NULL; |
|
43226
300f85971e83
IRCv3: Set the presence to offline when we receive a quit message
Gary Kramlich <grim@reaperworld.com>
parents:
43225
diff
changeset
|
860 | char *reason = NULL; |
|
43007
e61836350fce
IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents:
42982
diff
changeset
|
861 | |
|
e61836350fce
IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents:
42982
diff
changeset
|
862 | params = ibis_message_get_params(ibis_message); |
|
e61836350fce
IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents:
42982
diff
changeset
|
863 | n_params = g_strv_length(params); |
|
e61836350fce
IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents:
42982
diff
changeset
|
864 | |
|
e61836350fce
IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents:
42982
diff
changeset
|
865 | contact = purple_ircv3_connection_find_or_create_contact(connection, |
|
e61836350fce
IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents:
42982
diff
changeset
|
866 | ibis_message); |
|
e61836350fce
IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents:
42982
diff
changeset
|
867 | info = PURPLE_CONTACT_INFO(contact); |
|
e61836350fce
IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents:
42982
diff
changeset
|
868 | |
|
e61836350fce
IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents:
42982
diff
changeset
|
869 | if(n_params > 0) { |
|
e61836350fce
IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents:
42982
diff
changeset
|
870 | reason = g_strjoinv(" ", params); |
|
e61836350fce
IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents:
42982
diff
changeset
|
871 | message = g_strdup_printf("%s has quit (%s)", |
|
e61836350fce
IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents:
42982
diff
changeset
|
872 | purple_contact_info_get_sid(info), |
|
e61836350fce
IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents:
42982
diff
changeset
|
873 | reason); |
|
e61836350fce
IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents:
42982
diff
changeset
|
874 | } else { |
|
e61836350fce
IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents:
42982
diff
changeset
|
875 | message = g_strdup_printf("%s has quit", |
|
e61836350fce
IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents:
42982
diff
changeset
|
876 | purple_contact_info_get_sid(info)); |
|
e61836350fce
IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents:
42982
diff
changeset
|
877 | } |
|
e61836350fce
IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents:
42982
diff
changeset
|
878 | |
|
43226
300f85971e83
IRCv3: Set the presence to offline when we receive a quit message
Gary Kramlich <grim@reaperworld.com>
parents:
43225
diff
changeset
|
879 | /* Update the presence to offline and if they provided a quit message, set |
|
300f85971e83
IRCv3: Set the presence to offline when we receive a quit message
Gary Kramlich <grim@reaperworld.com>
parents:
43225
diff
changeset
|
880 | * it as the presence message. |
|
300f85971e83
IRCv3: Set the presence to offline when we receive a quit message
Gary Kramlich <grim@reaperworld.com>
parents:
43225
diff
changeset
|
881 | */ |
|
300f85971e83
IRCv3: Set the presence to offline when we receive a quit message
Gary Kramlich <grim@reaperworld.com>
parents:
43225
diff
changeset
|
882 | presence = purple_contact_info_get_presence(PURPLE_CONTACT_INFO(contact)); |
|
300f85971e83
IRCv3: Set the presence to offline when we receive a quit message
Gary Kramlich <grim@reaperworld.com>
parents:
43225
diff
changeset
|
883 | purple_presence_set_message(presence, reason); |
|
300f85971e83
IRCv3: Set the presence to offline when we receive a quit message
Gary Kramlich <grim@reaperworld.com>
parents:
43225
diff
changeset
|
884 | purple_presence_set_primitive(presence, PURPLE_PRESENCE_PRIMITIVE_OFFLINE); |
|
300f85971e83
IRCv3: Set the presence to offline when we receive a quit message
Gary Kramlich <grim@reaperworld.com>
parents:
43225
diff
changeset
|
885 | |
|
43007
e61836350fce
IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents:
42982
diff
changeset
|
886 | manager = purple_conversation_manager_get_default(); |
|
e61836350fce
IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents:
42982
diff
changeset
|
887 | conversations = purple_conversation_manager_get_all(manager); |
|
e61836350fce
IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents:
42982
diff
changeset
|
888 | while(conversations != NULL) { |
|
e61836350fce
IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents:
42982
diff
changeset
|
889 | PurpleConversation *conversation = conversations->data; |
|
e61836350fce
IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents:
42982
diff
changeset
|
890 | PurpleConversationMembers *members = NULL; |
|
e61836350fce
IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents:
42982
diff
changeset
|
891 | |
|
e61836350fce
IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents:
42982
diff
changeset
|
892 | members = purple_conversation_get_members(conversation); |
|
e61836350fce
IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents:
42982
diff
changeset
|
893 | purple_conversation_members_remove_member(members, info, TRUE, |
|
e61836350fce
IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents:
42982
diff
changeset
|
894 | message); |
|
e61836350fce
IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents:
42982
diff
changeset
|
895 | |
|
e61836350fce
IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents:
42982
diff
changeset
|
896 | conversations = g_list_delete_link(conversations, conversations); |
|
e61836350fce
IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents:
42982
diff
changeset
|
897 | } |
|
e61836350fce
IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents:
42982
diff
changeset
|
898 | |
|
43226
300f85971e83
IRCv3: Set the presence to offline when we receive a quit message
Gary Kramlich <grim@reaperworld.com>
parents:
43225
diff
changeset
|
899 | g_clear_pointer(&message, g_free); |
|
300f85971e83
IRCv3: Set the presence to offline when we receive a quit message
Gary Kramlich <grim@reaperworld.com>
parents:
43225
diff
changeset
|
900 | g_clear_pointer(&reason, g_free); |
|
43007
e61836350fce
IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents:
42982
diff
changeset
|
901 | |
|
e61836350fce
IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents:
42982
diff
changeset
|
902 | return TRUE; |
|
e61836350fce
IRCv3: handle the QUIT message
Gary Kramlich <grim@reaperworld.com>
parents:
42982
diff
changeset
|
903 | } |
|
43015
a743311c9c2c
IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents:
43007
diff
changeset
|
904 | |
|
a743311c9c2c
IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents:
43007
diff
changeset
|
905 | gboolean |
|
a743311c9c2c
IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents:
43007
diff
changeset
|
906 | 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
|
907 | G_GNUC_UNUSED const char *command, |
|
a743311c9c2c
IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents:
43007
diff
changeset
|
908 | IbisMessage *ibis_message, |
|
a743311c9c2c
IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents:
43007
diff
changeset
|
909 | gpointer data) |
|
a743311c9c2c
IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents:
43007
diff
changeset
|
910 | { |
|
a743311c9c2c
IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents:
43007
diff
changeset
|
911 | PurpleIRCv3Connection *connection = data; |
|
a743311c9c2c
IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents:
43007
diff
changeset
|
912 | PurpleContact *contact = NULL; |
|
a743311c9c2c
IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents:
43007
diff
changeset
|
913 | PurpleContactInfo *info = NULL; |
|
a743311c9c2c
IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents:
43007
diff
changeset
|
914 | IbisTags *tags = NULL; |
|
a743311c9c2c
IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents:
43007
diff
changeset
|
915 | GStrv params = NULL; |
|
a743311c9c2c
IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents:
43007
diff
changeset
|
916 | guint n_params = 0; |
|
a743311c9c2c
IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents:
43007
diff
changeset
|
917 | char *new_source = NULL; |
|
a743311c9c2c
IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents:
43007
diff
changeset
|
918 | char *user = NULL; |
|
a743311c9c2c
IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents:
43007
diff
changeset
|
919 | char *host = NULL; |
|
a743311c9c2c
IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents:
43007
diff
changeset
|
920 | const char *source = NULL; |
|
a743311c9c2c
IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents:
43007
diff
changeset
|
921 | const char *nick = NULL; |
|
a743311c9c2c
IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents:
43007
diff
changeset
|
922 | |
|
a743311c9c2c
IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents:
43007
diff
changeset
|
923 | params = ibis_message_get_params(ibis_message); |
|
a743311c9c2c
IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents:
43007
diff
changeset
|
924 | n_params = g_strv_length(params); |
|
a743311c9c2c
IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents:
43007
diff
changeset
|
925 | |
|
a743311c9c2c
IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents:
43007
diff
changeset
|
926 | if(n_params != 1) { |
|
a743311c9c2c
IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents:
43007
diff
changeset
|
927 | 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
|
928 | return FALSE; |
|
a743311c9c2c
IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents:
43007
diff
changeset
|
929 | } |
|
a743311c9c2c
IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents:
43007
diff
changeset
|
930 | |
|
a743311c9c2c
IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents:
43007
diff
changeset
|
931 | nick = params[0]; |
|
a743311c9c2c
IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents:
43007
diff
changeset
|
932 | source = ibis_message_get_source(ibis_message); |
|
a743311c9c2c
IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents:
43007
diff
changeset
|
933 | ibis_source_parse(source, NULL, &user, &host); |
|
a743311c9c2c
IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents:
43007
diff
changeset
|
934 | new_source = ibis_source_serialize(nick, user, host); |
|
a743311c9c2c
IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents:
43007
diff
changeset
|
935 | g_clear_pointer(&user, g_free); |
|
a743311c9c2c
IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents:
43007
diff
changeset
|
936 | g_clear_pointer(&host, g_free); |
|
a743311c9c2c
IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents:
43007
diff
changeset
|
937 | |
|
a743311c9c2c
IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents:
43007
diff
changeset
|
938 | contact = purple_ircv3_connection_find_or_create_contact(connection, |
|
a743311c9c2c
IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents:
43007
diff
changeset
|
939 | ibis_message); |
|
a743311c9c2c
IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents:
43007
diff
changeset
|
940 | info = PURPLE_CONTACT_INFO(contact); |
|
a743311c9c2c
IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents:
43007
diff
changeset
|
941 | |
|
a743311c9c2c
IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents:
43007
diff
changeset
|
942 | /* 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
|
943 | * the contact. |
|
a743311c9c2c
IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents:
43007
diff
changeset
|
944 | */ |
|
a743311c9c2c
IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents:
43007
diff
changeset
|
945 | tags = ibis_message_get_tags(ibis_message); |
|
a743311c9c2c
IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents:
43007
diff
changeset
|
946 | if(!ibis_tags_exists(tags, IBIS_TAG_ACCOUNT)) { |
|
a743311c9c2c
IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents:
43007
diff
changeset
|
947 | purple_contact_info_set_id(info, nick); |
|
a743311c9c2c
IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents:
43007
diff
changeset
|
948 | } |
|
a743311c9c2c
IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents:
43007
diff
changeset
|
949 | |
|
a743311c9c2c
IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents:
43007
diff
changeset
|
950 | purple_contact_info_set_display_name(info, nick); |
|
a743311c9c2c
IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents:
43007
diff
changeset
|
951 | purple_contact_info_set_sid(info, new_source); |
|
a743311c9c2c
IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents:
43007
diff
changeset
|
952 | g_clear_pointer(&new_source, g_free); |
|
a743311c9c2c
IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents:
43007
diff
changeset
|
953 | |
|
a743311c9c2c
IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents:
43007
diff
changeset
|
954 | return TRUE; |
|
a743311c9c2c
IRCv3: Finally handle NICK messages
Gary Kramlich <grim@reaperworld.com>
parents:
43007
diff
changeset
|
955 | } |
|
43024
8a7be63f83e4
IRCv3: Handle ERROR messages
Gary Kramlich <grim@reaperworld.com>
parents:
43019
diff
changeset
|
956 | |
|
8a7be63f83e4
IRCv3: Handle ERROR messages
Gary Kramlich <grim@reaperworld.com>
parents:
43019
diff
changeset
|
957 | gboolean |
|
8a7be63f83e4
IRCv3: Handle ERROR messages
Gary Kramlich <grim@reaperworld.com>
parents:
43019
diff
changeset
|
958 | purple_ircv3_message_handler_error(IbisClient *client, |
|
8a7be63f83e4
IRCv3: Handle ERROR messages
Gary Kramlich <grim@reaperworld.com>
parents:
43019
diff
changeset
|
959 | G_GNUC_UNUSED const char *command, |
|
8a7be63f83e4
IRCv3: Handle ERROR messages
Gary Kramlich <grim@reaperworld.com>
parents:
43019
diff
changeset
|
960 | IbisMessage *ibis_message, |
|
8a7be63f83e4
IRCv3: Handle ERROR messages
Gary Kramlich <grim@reaperworld.com>
parents:
43019
diff
changeset
|
961 | gpointer data) |
|
8a7be63f83e4
IRCv3: Handle ERROR messages
Gary Kramlich <grim@reaperworld.com>
parents:
43019
diff
changeset
|
962 | { |
|
43069
cc8ba79c350e
IRCv3: Display the contents of ERROR messages in the status window
Gary Kramlich <grim@reaperworld.com>
parents:
43067
diff
changeset
|
963 | PurpleIRCv3Connection *v3_connection = data; |
|
43024
8a7be63f83e4
IRCv3: Handle ERROR messages
Gary Kramlich <grim@reaperworld.com>
parents:
43019
diff
changeset
|
964 | GError *error = NULL; |
|
8a7be63f83e4
IRCv3: Handle ERROR messages
Gary Kramlich <grim@reaperworld.com>
parents:
43019
diff
changeset
|
965 | GStrv params = NULL; |
|
8a7be63f83e4
IRCv3: Handle ERROR messages
Gary Kramlich <grim@reaperworld.com>
parents:
43019
diff
changeset
|
966 | guint n_params = 0; |
|
8a7be63f83e4
IRCv3: Handle ERROR messages
Gary Kramlich <grim@reaperworld.com>
parents:
43019
diff
changeset
|
967 | char *reason = NULL; |
|
8a7be63f83e4
IRCv3: Handle ERROR messages
Gary Kramlich <grim@reaperworld.com>
parents:
43019
diff
changeset
|
968 | |
|
8a7be63f83e4
IRCv3: Handle ERROR messages
Gary Kramlich <grim@reaperworld.com>
parents:
43019
diff
changeset
|
969 | params = ibis_message_get_params(ibis_message); |
|
8a7be63f83e4
IRCv3: Handle ERROR messages
Gary Kramlich <grim@reaperworld.com>
parents:
43019
diff
changeset
|
970 | n_params = g_strv_length(params); |
|
8a7be63f83e4
IRCv3: Handle ERROR messages
Gary Kramlich <grim@reaperworld.com>
parents:
43019
diff
changeset
|
971 | |
|
8a7be63f83e4
IRCv3: Handle ERROR messages
Gary Kramlich <grim@reaperworld.com>
parents:
43019
diff
changeset
|
972 | if(n_params > 0) { |
|
8a7be63f83e4
IRCv3: Handle ERROR messages
Gary Kramlich <grim@reaperworld.com>
parents:
43019
diff
changeset
|
973 | reason = g_strjoinv(" ", params); |
|
8a7be63f83e4
IRCv3: Handle ERROR messages
Gary Kramlich <grim@reaperworld.com>
parents:
43019
diff
changeset
|
974 | } else { |
|
8a7be63f83e4
IRCv3: Handle ERROR messages
Gary Kramlich <grim@reaperworld.com>
parents:
43019
diff
changeset
|
975 | reason = g_strdup(_("unknown error")); |
|
8a7be63f83e4
IRCv3: Handle ERROR messages
Gary Kramlich <grim@reaperworld.com>
parents:
43019
diff
changeset
|
976 | } |
|
8a7be63f83e4
IRCv3: Handle ERROR messages
Gary Kramlich <grim@reaperworld.com>
parents:
43019
diff
changeset
|
977 | |
|
43069
cc8ba79c350e
IRCv3: Display the contents of ERROR messages in the status window
Gary Kramlich <grim@reaperworld.com>
parents:
43067
diff
changeset
|
978 | 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
|
979 | TRUE, FALSE); |
|
43069
cc8ba79c350e
IRCv3: Display the contents of ERROR messages in the status window
Gary Kramlich <grim@reaperworld.com>
parents:
43067
diff
changeset
|
980 | |
|
43024
8a7be63f83e4
IRCv3: Handle ERROR messages
Gary Kramlich <grim@reaperworld.com>
parents:
43019
diff
changeset
|
981 | error = g_error_new_literal(PURPLE_IRCV3_DOMAIN, 0, reason); |
|
8a7be63f83e4
IRCv3: Handle ERROR messages
Gary Kramlich <grim@reaperworld.com>
parents:
43019
diff
changeset
|
982 | g_clear_pointer(&reason, g_free); |
|
8a7be63f83e4
IRCv3: Handle ERROR messages
Gary Kramlich <grim@reaperworld.com>
parents:
43019
diff
changeset
|
983 | |
|
43165
201c799d4e6f
ircv3: Remove redundant account disconnection
Elliott Sales de Andrade <quantum.analyst@gmail.com>
parents:
43149
diff
changeset
|
984 | ibis_client_stop(client, error); |
|
43024
8a7be63f83e4
IRCv3: Handle ERROR messages
Gary Kramlich <grim@reaperworld.com>
parents:
43019
diff
changeset
|
985 | |
|
8a7be63f83e4
IRCv3: Handle ERROR messages
Gary Kramlich <grim@reaperworld.com>
parents:
43019
diff
changeset
|
986 | return TRUE; |
|
8a7be63f83e4
IRCv3: Handle ERROR messages
Gary Kramlich <grim@reaperworld.com>
parents:
43019
diff
changeset
|
987 | } |
|
43028
dda093fe275e
IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents:
43025
diff
changeset
|
988 | |
|
dda093fe275e
IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents:
43025
diff
changeset
|
989 | gboolean |
|
dda093fe275e
IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents:
43025
diff
changeset
|
990 | 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
|
991 | G_GNUC_UNUSED const char *command, |
|
dda093fe275e
IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents:
43025
diff
changeset
|
992 | IbisMessage *ibis_message, |
|
dda093fe275e
IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents:
43025
diff
changeset
|
993 | gpointer data) |
|
dda093fe275e
IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents:
43025
diff
changeset
|
994 | { |
|
dda093fe275e
IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents:
43025
diff
changeset
|
995 | PurpleIRCv3Connection *v3_connection = data; |
|
dda093fe275e
IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents:
43025
diff
changeset
|
996 | PurpleAccount *account = NULL; |
|
dda093fe275e
IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents:
43025
diff
changeset
|
997 | PurpleConnection *connection = data; |
|
dda093fe275e
IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents:
43025
diff
changeset
|
998 | PurpleContact *contact = NULL; |
|
dda093fe275e
IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents:
43025
diff
changeset
|
999 | PurpleContactInfo *info = NULL; |
|
dda093fe275e
IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents:
43025
diff
changeset
|
1000 | PurpleNotification *notification = NULL; |
|
dda093fe275e
IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents:
43025
diff
changeset
|
1001 | PurpleNotificationManager *manager = NULL; |
|
dda093fe275e
IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents:
43025
diff
changeset
|
1002 | GStrv params = NULL; |
|
dda093fe275e
IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents:
43025
diff
changeset
|
1003 | char *wallops_title = NULL; |
|
dda093fe275e
IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents:
43025
diff
changeset
|
1004 | guint n_params = 0; |
|
dda093fe275e
IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents:
43025
diff
changeset
|
1005 | |
|
dda093fe275e
IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents:
43025
diff
changeset
|
1006 | params = ibis_message_get_params(ibis_message); |
|
dda093fe275e
IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents:
43025
diff
changeset
|
1007 | n_params = g_strv_length(params); |
|
dda093fe275e
IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents:
43025
diff
changeset
|
1008 | |
|
dda093fe275e
IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents:
43025
diff
changeset
|
1009 | if(n_params != 1) { |
|
dda093fe275e
IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents:
43025
diff
changeset
|
1010 | 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
|
1011 | return FALSE; |
|
dda093fe275e
IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents:
43025
diff
changeset
|
1012 | } |
|
dda093fe275e
IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents:
43025
diff
changeset
|
1013 | |
|
dda093fe275e
IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents:
43025
diff
changeset
|
1014 | 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
|
1015 | ibis_message); |
|
dda093fe275e
IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents:
43025
diff
changeset
|
1016 | info = PURPLE_CONTACT_INFO(contact); |
|
dda093fe275e
IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents:
43025
diff
changeset
|
1017 | |
|
dda093fe275e
IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents:
43025
diff
changeset
|
1018 | 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
|
1019 | 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
|
1020 | notification = purple_notification_new(NULL, wallops_title); |
|
dda093fe275e
IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents:
43025
diff
changeset
|
1021 | g_free(wallops_title); |
|
dda093fe275e
IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents:
43025
diff
changeset
|
1022 | |
|
dda093fe275e
IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents:
43025
diff
changeset
|
1023 | account = purple_connection_get_account(connection); |
|
dda093fe275e
IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents:
43025
diff
changeset
|
1024 | purple_notification_set_account(notification, account); |
|
dda093fe275e
IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents:
43025
diff
changeset
|
1025 | purple_notification_set_subtitle(notification, params[0]); |
|
dda093fe275e
IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents:
43025
diff
changeset
|
1026 | 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
|
1027 | |
|
dda093fe275e
IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents:
43025
diff
changeset
|
1028 | manager = purple_notification_manager_get_default(); |
|
dda093fe275e
IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents:
43025
diff
changeset
|
1029 | purple_notification_manager_add(manager, notification); |
|
dda093fe275e
IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents:
43025
diff
changeset
|
1030 | g_clear_object(¬ification); |
|
dda093fe275e
IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents:
43025
diff
changeset
|
1031 | |
|
dda093fe275e
IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents:
43025
diff
changeset
|
1032 | return TRUE; |
|
dda093fe275e
IRCv3: Create notifications for incoming WALLOPS messages
Gary Kramlich <grim@reaperworld.com>
parents:
43025
diff
changeset
|
1033 | } |
|
43067
7e8b86e7dc43
IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents:
43028
diff
changeset
|
1034 | |
|
7e8b86e7dc43
IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents:
43028
diff
changeset
|
1035 | gboolean |
|
7e8b86e7dc43
IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents:
43028
diff
changeset
|
1036 | 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
|
1037 | G_GNUC_UNUSED const char *command, |
|
7e8b86e7dc43
IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents:
43028
diff
changeset
|
1038 | IbisMessage *ibis_message, |
|
7e8b86e7dc43
IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents:
43028
diff
changeset
|
1039 | gpointer data) |
|
7e8b86e7dc43
IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents:
43028
diff
changeset
|
1040 | { |
|
7e8b86e7dc43
IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents:
43028
diff
changeset
|
1041 | PurpleIRCv3Connection *v3_connection = data; |
|
7e8b86e7dc43
IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents:
43028
diff
changeset
|
1042 | PurpleAccount *account = NULL; |
|
7e8b86e7dc43
IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents:
43028
diff
changeset
|
1043 | PurpleContact *kicker = NULL; |
|
7e8b86e7dc43
IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents:
43028
diff
changeset
|
1044 | PurpleContact *kickee = NULL; |
|
7e8b86e7dc43
IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents:
43028
diff
changeset
|
1045 | PurpleContactInfo *me = NULL; |
|
7e8b86e7dc43
IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents:
43028
diff
changeset
|
1046 | PurpleConversation *conversation = NULL; |
|
7e8b86e7dc43
IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents:
43028
diff
changeset
|
1047 | GStrv params = NULL; |
|
7e8b86e7dc43
IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents:
43028
diff
changeset
|
1048 | char *reason = NULL; |
|
43098
13b0954a268b
IRCv3: Fix kick detection and handle online conversation states
Gary Kramlich <grim@reaperworld.com>
parents:
43069
diff
changeset
|
1049 | const char *kickee_id = NULL; |
|
13b0954a268b
IRCv3: Fix kick detection and handle online conversation states
Gary Kramlich <grim@reaperworld.com>
parents:
43069
diff
changeset
|
1050 | const char *me_id = NULL; |
|
43067
7e8b86e7dc43
IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents:
43028
diff
changeset
|
1051 | guint n_params = 0; |
|
7e8b86e7dc43
IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents:
43028
diff
changeset
|
1052 | |
|
7e8b86e7dc43
IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents:
43028
diff
changeset
|
1053 | params = ibis_message_get_params(ibis_message); |
|
7e8b86e7dc43
IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents:
43028
diff
changeset
|
1054 | n_params = g_strv_length(params); |
|
7e8b86e7dc43
IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents:
43028
diff
changeset
|
1055 | |
|
7e8b86e7dc43
IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents:
43028
diff
changeset
|
1056 | if(n_params < 2) { |
|
7e8b86e7dc43
IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents:
43028
diff
changeset
|
1057 | 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
|
1058 | return FALSE; |
|
7e8b86e7dc43
IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents:
43028
diff
changeset
|
1059 | } |
|
7e8b86e7dc43
IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents:
43028
diff
changeset
|
1060 | |
|
7e8b86e7dc43
IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents:
43028
diff
changeset
|
1061 | account = purple_connection_get_account(PURPLE_CONNECTION(v3_connection)); |
|
7e8b86e7dc43
IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents:
43028
diff
changeset
|
1062 | 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
|
1063 | me_id = purple_contact_info_get_id(me); |
|
43067
7e8b86e7dc43
IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents:
43028
diff
changeset
|
1064 | |
|
7e8b86e7dc43
IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents:
43028
diff
changeset
|
1065 | 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
|
1066 | ibis_message); |
|
7e8b86e7dc43
IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents:
43028
diff
changeset
|
1067 | |
|
7e8b86e7dc43
IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents:
43028
diff
changeset
|
1068 | 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
|
1069 | params[0]); |
|
7e8b86e7dc43
IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents:
43028
diff
changeset
|
1070 | |
|
7e8b86e7dc43
IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents:
43028
diff
changeset
|
1071 | 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
|
1072 | params[1]); |
|
43098
13b0954a268b
IRCv3: Fix kick detection and handle online conversation states
Gary Kramlich <grim@reaperworld.com>
parents:
43069
diff
changeset
|
1073 | 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
|
1074 | |
|
7e8b86e7dc43
IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents:
43028
diff
changeset
|
1075 | if(n_params > 2) { |
|
7e8b86e7dc43
IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents:
43028
diff
changeset
|
1076 | reason = g_strjoinv(" ", params + 2); |
|
7e8b86e7dc43
IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents:
43028
diff
changeset
|
1077 | } else { |
|
7e8b86e7dc43
IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents:
43028
diff
changeset
|
1078 | reason = g_strdup(_("no reason")); |
|
7e8b86e7dc43
IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents:
43028
diff
changeset
|
1079 | } |
|
7e8b86e7dc43
IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents:
43028
diff
changeset
|
1080 | |
|
43098
13b0954a268b
IRCv3: Fix kick detection and handle online conversation states
Gary Kramlich <grim@reaperworld.com>
parents:
43069
diff
changeset
|
1081 | if(purple_strequal(kickee_id, me_id)) { |
|
43067
7e8b86e7dc43
IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents:
43028
diff
changeset
|
1082 | GError *error = NULL; |
|
7e8b86e7dc43
IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents:
43028
diff
changeset
|
1083 | |
|
7e8b86e7dc43
IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents:
43028
diff
changeset
|
1084 | error = g_error_new(PURPLE_IRCV3_DOMAIN, 0, |
|
7e8b86e7dc43
IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents:
43028
diff
changeset
|
1085 | _("You were kicked from %s by %s: %s"), |
|
7e8b86e7dc43
IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents:
43028
diff
changeset
|
1086 | params[0], |
|
7e8b86e7dc43
IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents:
43028
diff
changeset
|
1087 | 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
|
1088 | reason); |
|
7e8b86e7dc43
IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents:
43028
diff
changeset
|
1089 | purple_conversation_set_error(conversation, error); |
|
7e8b86e7dc43
IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents:
43028
diff
changeset
|
1090 | g_clear_error(&error); |
|
7e8b86e7dc43
IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents:
43028
diff
changeset
|
1091 | |
|
7e8b86e7dc43
IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents:
43028
diff
changeset
|
1092 | purple_conversation_set_online(conversation, FALSE); |
|
7e8b86e7dc43
IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents:
43028
diff
changeset
|
1093 | } else { |
|
7e8b86e7dc43
IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents:
43028
diff
changeset
|
1094 | PurpleConversationMembers *members = NULL; |
|
7e8b86e7dc43
IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents:
43028
diff
changeset
|
1095 | char *contents = NULL; |
|
7e8b86e7dc43
IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents:
43028
diff
changeset
|
1096 | |
|
7e8b86e7dc43
IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents:
43028
diff
changeset
|
1097 | 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
|
1098 | 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
|
1099 | 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
|
1100 | params[0], |
|
7e8b86e7dc43
IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents:
43028
diff
changeset
|
1101 | reason); |
|
7e8b86e7dc43
IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents:
43028
diff
changeset
|
1102 | |
|
7e8b86e7dc43
IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents:
43028
diff
changeset
|
1103 | members = purple_conversation_get_members(conversation); |
|
7e8b86e7dc43
IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents:
43028
diff
changeset
|
1104 | purple_conversation_members_remove_member(members, |
|
7e8b86e7dc43
IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents:
43028
diff
changeset
|
1105 | PURPLE_CONTACT_INFO(kickee), |
|
7e8b86e7dc43
IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents:
43028
diff
changeset
|
1106 | TRUE, |
|
7e8b86e7dc43
IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents:
43028
diff
changeset
|
1107 | contents); |
|
7e8b86e7dc43
IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents:
43028
diff
changeset
|
1108 | g_free(contents); |
|
7e8b86e7dc43
IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents:
43028
diff
changeset
|
1109 | } |
|
7e8b86e7dc43
IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents:
43028
diff
changeset
|
1110 | |
|
7e8b86e7dc43
IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents:
43028
diff
changeset
|
1111 | g_free(reason); |
|
7e8b86e7dc43
IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents:
43028
diff
changeset
|
1112 | |
|
7e8b86e7dc43
IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents:
43028
diff
changeset
|
1113 | return TRUE; |
|
7e8b86e7dc43
IRCv3: Implement the KICK command
Gary Kramlich <grim@reaperworld.com>
parents:
43028
diff
changeset
|
1114 | } |
|
43199
99b283ab8116
IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents:
43198
diff
changeset
|
1115 | |
|
99b283ab8116
IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents:
43198
diff
changeset
|
1116 | gboolean |
|
99b283ab8116
IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents:
43198
diff
changeset
|
1117 | purple_ircv3_message_handler_mode(IbisClient *client, |
|
99b283ab8116
IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents:
43198
diff
changeset
|
1118 | G_GNUC_UNUSED const char *command, |
|
99b283ab8116
IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents:
43198
diff
changeset
|
1119 | IbisMessage *ibis_message, |
|
99b283ab8116
IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents:
43198
diff
changeset
|
1120 | gpointer data) |
|
99b283ab8116
IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents:
43198
diff
changeset
|
1121 | { |
|
99b283ab8116
IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents:
43198
diff
changeset
|
1122 | PurpleIRCv3Connection *v3_connection = data; |
|
99b283ab8116
IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents:
43198
diff
changeset
|
1123 | PurpleContact *contact = NULL; |
|
99b283ab8116
IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents:
43198
diff
changeset
|
1124 | PurpleConversation *conversation = NULL; |
|
99b283ab8116
IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents:
43198
diff
changeset
|
1125 | PurpleConversationMember *author = NULL; |
|
99b283ab8116
IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents:
43198
diff
changeset
|
1126 | PurpleMessage *message = NULL; |
|
99b283ab8116
IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents:
43198
diff
changeset
|
1127 | IbisModeChange *mode_changes = NULL; |
|
99b283ab8116
IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents:
43198
diff
changeset
|
1128 | GError *error = NULL; |
|
99b283ab8116
IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents:
43198
diff
changeset
|
1129 | GStrv params = NULL; |
|
99b283ab8116
IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents:
43198
diff
changeset
|
1130 | char *contents = NULL; |
|
99b283ab8116
IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents:
43198
diff
changeset
|
1131 | char *parts = NULL; |
|
99b283ab8116
IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents:
43198
diff
changeset
|
1132 | guint n_params = 0; |
|
99b283ab8116
IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents:
43198
diff
changeset
|
1133 | guint n_mode_changes = 0; |
|
99b283ab8116
IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents:
43198
diff
changeset
|
1134 | const char *target = NULL; |
|
99b283ab8116
IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents:
43198
diff
changeset
|
1135 | |
|
99b283ab8116
IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents:
43198
diff
changeset
|
1136 | params = ibis_message_get_params(ibis_message); |
|
99b283ab8116
IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents:
43198
diff
changeset
|
1137 | n_params = g_strv_length(params); |
|
99b283ab8116
IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents:
43198
diff
changeset
|
1138 | |
|
99b283ab8116
IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents:
43198
diff
changeset
|
1139 | if(n_params < 2) { |
|
99b283ab8116
IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents:
43198
diff
changeset
|
1140 | 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
|
1141 | return FALSE; |
|
99b283ab8116
IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents:
43198
diff
changeset
|
1142 | } |
|
99b283ab8116
IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents:
43198
diff
changeset
|
1143 | |
|
99b283ab8116
IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents:
43198
diff
changeset
|
1144 | target = params[0]; |
|
99b283ab8116
IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents:
43198
diff
changeset
|
1145 | if(!ibis_client_is_channel(client, target)) { |
|
99b283ab8116
IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents:
43198
diff
changeset
|
1146 | return FALSE; |
|
99b283ab8116
IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents:
43198
diff
changeset
|
1147 | } |
|
99b283ab8116
IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents:
43198
diff
changeset
|
1148 | |
|
99b283ab8116
IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents:
43198
diff
changeset
|
1149 | 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
|
1150 | target); |
|
99b283ab8116
IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents:
43198
diff
changeset
|
1151 | |
|
99b283ab8116
IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents:
43198
diff
changeset
|
1152 | 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
|
1153 | ibis_message); |
|
99b283ab8116
IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents:
43198
diff
changeset
|
1154 | 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
|
1155 | PURPLE_CONTACT_INFO(contact), |
|
99b283ab8116
IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents:
43198
diff
changeset
|
1156 | FALSE, NULL); |
|
99b283ab8116
IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents:
43198
diff
changeset
|
1157 | |
|
99b283ab8116
IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents:
43198
diff
changeset
|
1158 | 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
|
1159 | &n_mode_changes, &error); |
|
99b283ab8116
IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents:
43198
diff
changeset
|
1160 | if(error != NULL) { |
|
99b283ab8116
IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents:
43198
diff
changeset
|
1161 | 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
|
1162 | |
|
99b283ab8116
IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents:
43198
diff
changeset
|
1163 | g_clear_error(&error); |
|
99b283ab8116
IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents:
43198
diff
changeset
|
1164 | |
|
99b283ab8116
IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents:
43198
diff
changeset
|
1165 | return FALSE; |
|
99b283ab8116
IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents:
43198
diff
changeset
|
1166 | } |
|
99b283ab8116
IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents:
43198
diff
changeset
|
1167 | |
|
99b283ab8116
IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents:
43198
diff
changeset
|
1168 | 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
|
1169 | PurpleContact *subject = NULL; |
|
99b283ab8116
IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents:
43198
diff
changeset
|
1170 | PurpleConversationMember *member = NULL; |
|
99b283ab8116
IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents:
43198
diff
changeset
|
1171 | IbisModeChange change = mode_changes[i]; |
|
99b283ab8116
IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents:
43198
diff
changeset
|
1172 | char prefix = '\0'; |
|
99b283ab8116
IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents:
43198
diff
changeset
|
1173 | |
|
99b283ab8116
IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents:
43198
diff
changeset
|
1174 | 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
|
1175 | if(prefix == '\0') { |
|
99b283ab8116
IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents:
43198
diff
changeset
|
1176 | continue; |
|
99b283ab8116
IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents:
43198
diff
changeset
|
1177 | } |
|
99b283ab8116
IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents:
43198
diff
changeset
|
1178 | |
|
99b283ab8116
IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents:
43198
diff
changeset
|
1179 | 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
|
1180 | change.parameter); |
|
99b283ab8116
IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents:
43198
diff
changeset
|
1181 | 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
|
1182 | PURPLE_CONTACT_INFO(subject), |
|
99b283ab8116
IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents:
43198
diff
changeset
|
1183 | FALSE, NULL); |
|
99b283ab8116
IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents:
43198
diff
changeset
|
1184 | |
|
99b283ab8116
IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents:
43198
diff
changeset
|
1185 | if(change.add) { |
|
99b283ab8116
IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents:
43198
diff
changeset
|
1186 | 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
|
1187 | } else { |
|
99b283ab8116
IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents:
43198
diff
changeset
|
1188 | 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
|
1189 | } |
|
99b283ab8116
IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents:
43198
diff
changeset
|
1190 | } |
|
99b283ab8116
IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents:
43198
diff
changeset
|
1191 | |
|
99b283ab8116
IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents:
43198
diff
changeset
|
1192 | parts = g_strjoinv(" ", params + 1); |
|
99b283ab8116
IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents:
43198
diff
changeset
|
1193 | contents = g_strdup_printf(_("mode %s"), parts); |
|
99b283ab8116
IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents:
43198
diff
changeset
|
1194 | g_free(parts); |
|
99b283ab8116
IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents:
43198
diff
changeset
|
1195 | |
|
99b283ab8116
IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents:
43198
diff
changeset
|
1196 | message = g_object_new( |
|
99b283ab8116
IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents:
43198
diff
changeset
|
1197 | PURPLE_TYPE_MESSAGE, |
|
99b283ab8116
IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents:
43198
diff
changeset
|
1198 | "author", author, |
|
99b283ab8116
IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents:
43198
diff
changeset
|
1199 | "contents", contents, |
|
99b283ab8116
IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents:
43198
diff
changeset
|
1200 | "event", TRUE, |
|
99b283ab8116
IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents:
43198
diff
changeset
|
1201 | NULL); |
|
99b283ab8116
IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents:
43198
diff
changeset
|
1202 | g_free(contents); |
|
99b283ab8116
IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents:
43198
diff
changeset
|
1203 | |
|
99b283ab8116
IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents:
43198
diff
changeset
|
1204 | purple_conversation_write_message(conversation, message); |
|
99b283ab8116
IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents:
43198
diff
changeset
|
1205 | g_clear_object(&message); |
|
99b283ab8116
IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents:
43198
diff
changeset
|
1206 | |
|
99b283ab8116
IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents:
43198
diff
changeset
|
1207 | return TRUE; |
|
99b283ab8116
IRCv3: handle mode messages for channel modes
Gary Kramlich <grim@reaperworld.com>
parents:
43198
diff
changeset
|
1208 | } |
|
43236
ce4987105a4e
IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents:
43228
diff
changeset
|
1209 | |
|
ce4987105a4e
IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents:
43228
diff
changeset
|
1210 | gboolean |
|
ce4987105a4e
IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents:
43228
diff
changeset
|
1211 | purple_ircv3_message_handler_whoreply(IbisClient *client, |
|
ce4987105a4e
IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents:
43228
diff
changeset
|
1212 | G_GNUC_UNUSED const char *command, |
|
ce4987105a4e
IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents:
43228
diff
changeset
|
1213 | IbisMessage *ibis_message, |
|
ce4987105a4e
IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents:
43228
diff
changeset
|
1214 | gpointer data) |
|
ce4987105a4e
IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents:
43228
diff
changeset
|
1215 | { |
|
ce4987105a4e
IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents:
43228
diff
changeset
|
1216 | PurpleIRCv3Connection *v3_connection = data; |
|
ce4987105a4e
IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents:
43228
diff
changeset
|
1217 | PurpleContact *contact = NULL; |
|
ce4987105a4e
IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents:
43228
diff
changeset
|
1218 | PurplePresence *presence = NULL; |
|
ce4987105a4e
IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents:
43228
diff
changeset
|
1219 | GStrv params = NULL; |
|
ce4987105a4e
IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents:
43228
diff
changeset
|
1220 | char *sid = NULL; |
|
ce4987105a4e
IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents:
43228
diff
changeset
|
1221 | guint n_params = 0; |
|
ce4987105a4e
IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents:
43228
diff
changeset
|
1222 | const char *flags = NULL; |
|
ce4987105a4e
IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents:
43228
diff
changeset
|
1223 | |
|
ce4987105a4e
IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents:
43228
diff
changeset
|
1224 | params = ibis_message_get_params(ibis_message); |
|
ce4987105a4e
IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents:
43228
diff
changeset
|
1225 | n_params = g_strv_length(params); |
|
ce4987105a4e
IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents:
43228
diff
changeset
|
1226 | |
|
ce4987105a4e
IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents:
43228
diff
changeset
|
1227 | /* A standard RPL_WHOREPLY has 7 parameters: |
|
ce4987105a4e
IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents:
43228
diff
changeset
|
1228 | * |
|
ce4987105a4e
IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents:
43228
diff
changeset
|
1229 | * <client> <channel> <username> <host> <server> <nick> <flags> :<hopcount> <realname> |
|
ce4987105a4e
IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents:
43228
diff
changeset
|
1230 | * |
|
ce4987105a4e
IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents:
43228
diff
changeset
|
1231 | * We ignore hopcount and realname for now as we don't have a good use case |
|
ce4987105a4e
IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents:
43228
diff
changeset
|
1232 | * to use it. |
|
ce4987105a4e
IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents:
43228
diff
changeset
|
1233 | */ |
|
ce4987105a4e
IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents:
43228
diff
changeset
|
1234 | if(n_params < 7) { |
|
ce4987105a4e
IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents:
43228
diff
changeset
|
1235 | g_message("received RPL_WHOREPLY with %u params, need at least 7", |
|
ce4987105a4e
IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents:
43228
diff
changeset
|
1236 | n_params); |
|
ce4987105a4e
IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents:
43228
diff
changeset
|
1237 | return FALSE; |
|
ce4987105a4e
IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents:
43228
diff
changeset
|
1238 | } |
|
ce4987105a4e
IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents:
43228
diff
changeset
|
1239 | |
|
ce4987105a4e
IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents:
43228
diff
changeset
|
1240 | /* Find the contact and update everything for it. */ |
|
ce4987105a4e
IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents:
43228
diff
changeset
|
1241 | contact = purple_ircv3_connection_find_or_create_contact_from_nick(v3_connection, |
|
ce4987105a4e
IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents:
43228
diff
changeset
|
1242 | params[5]); |
|
ce4987105a4e
IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents:
43228
diff
changeset
|
1243 | |
|
ce4987105a4e
IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents:
43228
diff
changeset
|
1244 | sid = g_strdup_printf("%s!%s@%s", params[5], params[2], params[3]); |
|
ce4987105a4e
IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents:
43228
diff
changeset
|
1245 | purple_contact_info_set_sid(PURPLE_CONTACT_INFO(contact), sid); |
|
ce4987105a4e
IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents:
43228
diff
changeset
|
1246 | |
|
ce4987105a4e
IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents:
43228
diff
changeset
|
1247 | /* Process the flags starting with presence. */ |
|
ce4987105a4e
IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents:
43228
diff
changeset
|
1248 | flags = params[6]; |
|
ce4987105a4e
IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents:
43228
diff
changeset
|
1249 | |
|
ce4987105a4e
IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents:
43228
diff
changeset
|
1250 | presence = purple_contact_info_get_presence(PURPLE_CONTACT_INFO(contact)); |
|
ce4987105a4e
IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents:
43228
diff
changeset
|
1251 | if(flags[0] == 'G') { |
|
ce4987105a4e
IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents:
43228
diff
changeset
|
1252 | purple_presence_set_primitive(presence, |
|
ce4987105a4e
IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents:
43228
diff
changeset
|
1253 | PURPLE_PRESENCE_PRIMITIVE_AWAY); |
|
ce4987105a4e
IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents:
43228
diff
changeset
|
1254 | } else { |
|
ce4987105a4e
IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents:
43228
diff
changeset
|
1255 | purple_presence_set_primitive(presence, |
|
ce4987105a4e
IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents:
43228
diff
changeset
|
1256 | PURPLE_PRESENCE_PRIMITIVE_AVAILABLE); |
|
ce4987105a4e
IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents:
43228
diff
changeset
|
1257 | } |
|
ce4987105a4e
IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents:
43228
diff
changeset
|
1258 | |
|
ce4987105a4e
IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents:
43228
diff
changeset
|
1259 | /* Increment flags to the next value. */ |
|
ce4987105a4e
IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents:
43228
diff
changeset
|
1260 | flags += 1; |
|
ce4987105a4e
IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents:
43228
diff
changeset
|
1261 | |
|
ce4987105a4e
IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents:
43228
diff
changeset
|
1262 | /* Check if a server admin. */ |
|
ce4987105a4e
IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents:
43228
diff
changeset
|
1263 | if(flags[0] == '*') { |
|
ce4987105a4e
IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents:
43228
diff
changeset
|
1264 | /* We'll need to create badge for this at some point */ |
|
ce4987105a4e
IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents:
43228
diff
changeset
|
1265 | |
|
ce4987105a4e
IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents:
43228
diff
changeset
|
1266 | flags += 1; |
|
ce4987105a4e
IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents:
43228
diff
changeset
|
1267 | } |
|
ce4987105a4e
IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents:
43228
diff
changeset
|
1268 | |
|
ce4987105a4e
IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents:
43228
diff
changeset
|
1269 | /* If we got a channel update the member's prefix (badges). */ |
|
ce4987105a4e
IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents:
43228
diff
changeset
|
1270 | if(!purple_strequal(params[1], "*")) { |
|
ce4987105a4e
IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents:
43228
diff
changeset
|
1271 | PurpleConversation *conversation = NULL; |
|
ce4987105a4e
IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents:
43228
diff
changeset
|
1272 | PurpleConversationMember *member = NULL; |
|
ce4987105a4e
IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents:
43228
diff
changeset
|
1273 | |
|
ce4987105a4e
IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents:
43228
diff
changeset
|
1274 | conversation = purple_ircv3_connection_find_or_create_conversation(v3_connection, |
|
ce4987105a4e
IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents:
43228
diff
changeset
|
1275 | params[1]); |
|
ce4987105a4e
IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents:
43228
diff
changeset
|
1276 | |
|
ce4987105a4e
IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents:
43228
diff
changeset
|
1277 | member = purple_conversation_find_or_add_member(conversation, |
|
ce4987105a4e
IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents:
43228
diff
changeset
|
1278 | PURPLE_CONTACT_INFO(contact), |
|
ce4987105a4e
IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents:
43228
diff
changeset
|
1279 | FALSE, NULL); |
|
ce4987105a4e
IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents:
43228
diff
changeset
|
1280 | |
|
ce4987105a4e
IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents:
43228
diff
changeset
|
1281 | /* Now run through the remaining flags looking for channel member |
|
ce4987105a4e
IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents:
43228
diff
changeset
|
1282 | * prefixes and adding badges for the ones we find. |
|
ce4987105a4e
IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents:
43228
diff
changeset
|
1283 | */ |
|
ce4987105a4e
IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents:
43228
diff
changeset
|
1284 | for(guint i = 0; flags[i] != '\0'; i++) { |
|
ce4987105a4e
IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents:
43228
diff
changeset
|
1285 | /* We abuse the fact that if a badge can't be found it is ignored |
|
ce4987105a4e
IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents:
43228
diff
changeset
|
1286 | * to avoid having to check the prefix before adding the badge. |
|
ce4987105a4e
IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents:
43228
diff
changeset
|
1287 | */ |
|
ce4987105a4e
IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents:
43228
diff
changeset
|
1288 | purple_ircv3_add_badge_to_member(member, client, flags[i]); |
|
ce4987105a4e
IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents:
43228
diff
changeset
|
1289 | } |
|
ce4987105a4e
IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents:
43228
diff
changeset
|
1290 | } |
|
ce4987105a4e
IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents:
43228
diff
changeset
|
1291 | |
|
ce4987105a4e
IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents:
43228
diff
changeset
|
1292 | return TRUE; |
|
ce4987105a4e
IRCv3: Do a who after joining a channel
Gary Kramlich <grim@reaperworld.com>
parents:
43228
diff
changeset
|
1293 | } |