annotate mcabber/src/xmpp_muc.c @ 1598:a087125d8fc8

Replace libjabber with loudmouth
author franky
date Sun, 11 Oct 2009 15:38:32 +0200
parents mcabber/src/jabglue.c@1802b926e3fa
children dcd5d4c75199
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
1 /* See xmpp.c file for copyright and license details. */
29
86837ff0554c [/trunk] Changeset 45 by mikael
mikael
parents:
diff changeset
2
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
3 static void decline_invitation(event_muc_invitation *invitation, char *reason)
29
86837ff0554c [/trunk] Changeset 45 by mikael
mikael
parents:
diff changeset
4 {
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
5 // cut and paste from xmpp_room_invite
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
6 LmMessage *m;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
7 LmMessageNode *x, *y;
1014
99c5278bf6b8 Keep the status and status messages when we're disconnected
Mikael Berthe <mikael@lilotux.net>
parents: 1013
diff changeset
8
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
9 if (!invitation) return;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
10 if (!invitation->to || !invitation->from) return;
1426
a64778f5f26b Implement FIFO named command pipe
Mikael Berthe <mikael@lilotux.net>
parents: 1419
diff changeset
11
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
12 m = lm_message_new(invitation->to, LM_MESSAGE_TYPE_MESSAGE);
939
12fa2ae6445d Get rid of "busy-waiting" (Christof Meerwald)
Mikael Berthe <mikael@lilotux.net>
parents: 924
diff changeset
13
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
14 x = lm_message_node_add_child(m->node, "x", NULL);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
15 lm_message_node_set_attribute(x, "xmlns",
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
16 "http://jabber.org/protocol/muc#user");
444
5927c3bfba13 Add /status_to command
Mikael Berthe <mikael@lilotux.net>
parents: 441
diff changeset
17
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
18 y = lm_message_node_add_child(x, "decline", NULL);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
19 lm_message_node_set_attribute(y, "to", invitation->from);
29
86837ff0554c [/trunk] Changeset 45 by mikael
mikael
parents:
diff changeset
20
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
21 if (reason)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
22 lm_message_node_add_child(y, "reason", reason);
164
faf534be8ff0 [/trunk] Changeset 176 by mikael
mikael
parents: 159
diff changeset
23
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
24 lm_connection_send(lconnection, m, NULL);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
25 lm_message_unref(m);
988
6e2bfd1ffded Add ids to message stanzas if needed
Mikael Berthe <mikael@lilotux.net>
parents: 987
diff changeset
26 }
6e2bfd1ffded Add ids to message stanzas if needed
Mikael Berthe <mikael@lilotux.net>
parents: 987
diff changeset
27
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
28 static int evscallback_invitation(eviqs *evp, guint evcontext)
35
a8ceaa3005fd [/trunk] Changeset 51 by mikael
mikael
parents: 33
diff changeset
29 {
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
30 event_muc_invitation *invitation = evp->data;
986
ed697234bd39 Chat states receival (Alexis Hildebrandt)
Mikael Berthe <mikael@lilotux.net>
parents: 977
diff changeset
31
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
32 // Sanity check
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
33 if (!invitation) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
34 // Shouldn't happen.
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
35 scr_LogPrint(LPRINT_LOGNORM, "Error in evs callback.");
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
36 return 0;
990
35e7913affb7 Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents: 989
diff changeset
37 }
989
859ab76e5093 Send JEP-22 delivered messages
Mikael Berthe <mikael@lilotux.net>
parents: 988
diff changeset
38
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
39 if (evcontext == EVS_CONTEXT_TIMEOUT) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
40 scr_LogPrint(LPRINT_LOGNORM, "Event %s timed out, cancelled.", evp->id);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
41 goto evscallback_invitation_free;
990
35e7913affb7 Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents: 989
diff changeset
42 }
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
43 if (evcontext == EVS_CONTEXT_CANCEL) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
44 scr_LogPrint(LPRINT_LOGNORM, "Event %s cancelled.", evp->id);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
45 goto evscallback_invitation_free;
990
35e7913affb7 Send events/chatstates notifications (JEP-22/JEP-85)
Mikael Berthe <mikael@lilotux.net>
parents: 989
diff changeset
46 }
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
47 if (!(evcontext & EVS_CONTEXT_USER))
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
48 goto evscallback_invitation_free;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
49 // Ok, let's work now.
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
50 // evcontext: 0, 1 == reject, accept
999
9687ecc59303 Redo chat states detection if we receive a message error packet from a contact
Mikael Berthe <mikael@lilotux.net>
parents: 998
diff changeset
51
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
52 if (evcontext & ~EVS_CONTEXT_USER) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
53 char *nickname = default_muc_nickname(invitation->to);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
54 xmpp_room_join(invitation->to, nickname, invitation->passwd);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
55 g_free(nickname);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
56 } else {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
57 scr_LogPrint(LPRINT_LOGNORM, "Invitation to %s refused.", invitation->to);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
58 decline_invitation(invitation, NULL);
124
6d2122c003c4 [/trunk] Changeset 137 by mikael
mikael
parents: 120
diff changeset
59 }
6d2122c003c4 [/trunk] Changeset 137 by mikael
mikael
parents: 120
diff changeset
60
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
61 evscallback_invitation_free:
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
62 g_free(invitation->to);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
63 g_free(invitation->from);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
64 g_free(invitation->passwd);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
65 g_free(invitation->reason);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
66 g_free(invitation);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
67 evp->data = NULL;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
68 return 0;
691
3c0a0a993de8 Implement IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents: 686
diff changeset
69 }
3c0a0a993de8 Implement IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents: 686
diff changeset
70
447
03bb57383cea Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents: 444
diff changeset
71 // Join a MUC room
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
72 void xmpp_room_join(const char *room, const char *nickname, const char *passwd)
447
03bb57383cea Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents: 444
diff changeset
73 {
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
74 LmMessage *x;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
75 LmMessageNode *y;
643
dd73c3dad815 Fix double UTF-8 encoding when joining a room
Mikael Berthe <mikael@lilotux.net>
parents: 642
diff changeset
76 gchar *roomid;
644
68fb0c1dfb15 MUC: better nickname check when entering a room
Mikael Berthe <mikael@lilotux.net>
parents: 643
diff changeset
77 GSList *room_elt;
447
03bb57383cea Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents: 444
diff changeset
78
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
79 if (!lm_connection_is_authenticated(lconnection) || !room) return;
472
75442262c082 Disable some commands when not connected
Mikael Berthe <mikael@lilotux.net>
parents: 470
diff changeset
80 if (!nickname) return;
447
03bb57383cea Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents: 444
diff changeset
81
643
dd73c3dad815 Fix double UTF-8 encoding when joining a room
Mikael Berthe <mikael@lilotux.net>
parents: 642
diff changeset
82 roomid = g_strdup_printf("%s/%s", room, nickname);
469
a926523d2392 Use UTF8 to handle resources and room nicknames
Mikael Berthe <mikael@lilotux.net>
parents: 468
diff changeset
83 if (check_jid_syntax(roomid)) {
a926523d2392 Use UTF8 to handle resources and room nicknames
Mikael Berthe <mikael@lilotux.net>
parents: 468
diff changeset
84 scr_LogPrint(LPRINT_NORMAL, "<%s/%s> is not a valid Jabber room", room,
a926523d2392 Use UTF8 to handle resources and room nicknames
Mikael Berthe <mikael@lilotux.net>
parents: 468
diff changeset
85 nickname);
a926523d2392 Use UTF8 to handle resources and room nicknames
Mikael Berthe <mikael@lilotux.net>
parents: 468
diff changeset
86 g_free(roomid);
a926523d2392 Use UTF8 to handle resources and room nicknames
Mikael Berthe <mikael@lilotux.net>
parents: 468
diff changeset
87 return;
a926523d2392 Use UTF8 to handle resources and room nicknames
Mikael Berthe <mikael@lilotux.net>
parents: 468
diff changeset
88 }
a926523d2392 Use UTF8 to handle resources and room nicknames
Mikael Berthe <mikael@lilotux.net>
parents: 468
diff changeset
89
644
68fb0c1dfb15 MUC: better nickname check when entering a room
Mikael Berthe <mikael@lilotux.net>
parents: 643
diff changeset
90 room_elt = roster_find(room, jidsearch, ROSTER_TYPE_USER|ROSTER_TYPE_ROOM);
68fb0c1dfb15 MUC: better nickname check when entering a room
Mikael Berthe <mikael@lilotux.net>
parents: 643
diff changeset
91 // Add room if it doesn't already exist
649
3ad6675caaf1 MUC: fix join bug when the conference is in the roster
Mikael Berthe <mikael@lilotux.net>
parents: 645
diff changeset
92 if (!room_elt) {
1355
9716cf8a0726 Add on_server flag
Mikael Berthe <mikael@lilotux.net>
parents: 1354
diff changeset
93 room_elt = roster_add_user(room, NULL, NULL, ROSTER_TYPE_ROOM,
9716cf8a0726 Add on_server flag
Mikael Berthe <mikael@lilotux.net>
parents: 1354
diff changeset
94 sub_none, -1);
649
3ad6675caaf1 MUC: fix join bug when the conference is in the roster
Mikael Berthe <mikael@lilotux.net>
parents: 645
diff changeset
95 } else {
3ad6675caaf1 MUC: fix join bug when the conference is in the roster
Mikael Berthe <mikael@lilotux.net>
parents: 645
diff changeset
96 // Make sure this is a room (it can be a conversion user->room)
3ad6675caaf1 MUC: fix join bug when the conference is in the roster
Mikael Berthe <mikael@lilotux.net>
parents: 645
diff changeset
97 buddy_settype(room_elt->data, ROSTER_TYPE_ROOM);
3ad6675caaf1 MUC: fix join bug when the conference is in the roster
Mikael Berthe <mikael@lilotux.net>
parents: 645
diff changeset
98 }
644
68fb0c1dfb15 MUC: better nickname check when entering a room
Mikael Berthe <mikael@lilotux.net>
parents: 643
diff changeset
99 // If insideroom is TRUE, this is a nickname change and we don't care here
68fb0c1dfb15 MUC: better nickname check when entering a room
Mikael Berthe <mikael@lilotux.net>
parents: 643
diff changeset
100 if (!buddy_getinsideroom(room_elt->data)) {
68fb0c1dfb15 MUC: better nickname check when entering a room
Mikael Berthe <mikael@lilotux.net>
parents: 643
diff changeset
101 // We're trying to enter a room
68fb0c1dfb15 MUC: better nickname check when entering a room
Mikael Berthe <mikael@lilotux.net>
parents: 643
diff changeset
102 buddy_setnickname(room_elt->data, nickname);
68fb0c1dfb15 MUC: better nickname check when entering a room
Mikael Berthe <mikael@lilotux.net>
parents: 643
diff changeset
103 }
68fb0c1dfb15 MUC: better nickname check when entering a room
Mikael Berthe <mikael@lilotux.net>
parents: 643
diff changeset
104
469
a926523d2392 Use UTF8 to handle resources and room nicknames
Mikael Berthe <mikael@lilotux.net>
parents: 468
diff changeset
105 // Send the XML request
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
106 x = lm_message_new(roomid, LM_MESSAGE_TYPE_PRESENCE);
447
03bb57383cea Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents: 444
diff changeset
107
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
108 x = lm_message_new_presence(mystatus, roomid, mystatusmsg);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
109 y = lm_message_node_add_child(x->node, "x", NULL);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
110 lm_message_node_set_attribute(y, "xmlns", "http://jabber.org/protocol/muc");
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
111 if (passwd)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
112 lm_message_node_add_child(y, "password", passwd);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
113
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
114 lm_connection_send(lconnection, x, NULL);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
115 lm_message_unref(x);
469
a926523d2392 Use UTF8 to handle resources and room nicknames
Mikael Berthe <mikael@lilotux.net>
parents: 468
diff changeset
116 g_free(roomid);
447
03bb57383cea Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents: 444
diff changeset
117 }
03bb57383cea Initial Multi-User Chat support
Mikael Berthe <mikael@lilotux.net>
parents: 444
diff changeset
118
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
119 // Invite a user to a MUC room
449
e08b0c2d0e54 Add "/room unlock"
Mikael Berthe <mikael@lilotux.net>
parents: 447
diff changeset
120 // room syntax: "room@server"
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
121 // reason can be null.
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
122 void xmpp_room_invite(const char *room, const char *fjid, const char *reason)
449
e08b0c2d0e54 Add "/room unlock"
Mikael Berthe <mikael@lilotux.net>
parents: 447
diff changeset
123 {
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
124 LmMessage *msg;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
125 LmMessageNode *x, *y;
449
e08b0c2d0e54 Add "/room unlock"
Mikael Berthe <mikael@lilotux.net>
parents: 447
diff changeset
126
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
127 if (!lm_connection_is_authenticated(lconnection) || !room || !fjid) return;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
128
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
129 msg = lm_message_new(room, LM_MESSAGE_TYPE_MESSAGE);
449
e08b0c2d0e54 Add "/room unlock"
Mikael Berthe <mikael@lilotux.net>
parents: 447
diff changeset
130
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
131 x = lm_message_node_add_child(msg->node, "x", NULL);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
132 lm_message_node_set_attribute(x, "xmlns",
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
133 "http://jabber.org/protocol/muc#user");
449
e08b0c2d0e54 Add "/room unlock"
Mikael Berthe <mikael@lilotux.net>
parents: 447
diff changeset
134
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
135 y = lm_message_node_add_child(x, "invite", NULL);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
136 lm_message_node_set_attribute(y, "to", fjid);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
137
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
138 if (reason)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
139 lm_message_node_add_child(y, "reason", reason);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
140
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
141 lm_connection_send(lconnection, msg, NULL);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
142 lm_message_unref(msg);
449
e08b0c2d0e54 Add "/room unlock"
Mikael Berthe <mikael@lilotux.net>
parents: 447
diff changeset
143 }
e08b0c2d0e54 Add "/room unlock"
Mikael Berthe <mikael@lilotux.net>
parents: 447
diff changeset
144
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
145 int xmpp_room_setattrib(const char *roomid, const char *fjid,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
146 const char *nick, struct role_affil ra,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
147 const char *reason)
599
fb67bf62f4eb Add "/room destroy"
Mikael Berthe <mikael@lilotux.net>
parents: 598
diff changeset
148 {
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
149 LmMessage *iq;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
150 LmMessageNode *query, *x;
599
fb67bf62f4eb Add "/room destroy"
Mikael Berthe <mikael@lilotux.net>
parents: 598
diff changeset
151
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
152 if (!lm_connection_is_authenticated(lconnection) || !roomid) return 1;
1058
c0d44a9a99bc Code cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 1055
diff changeset
153 if (!fjid && !nick) return 1;
568
eb1df2371581 Add "/room kick"
Mikael Berthe <mikael@lilotux.net>
parents: 562
diff changeset
154
eb1df2371581 Add "/room kick"
Mikael Berthe <mikael@lilotux.net>
parents: 562
diff changeset
155 if (check_jid_syntax((char*)roomid)) {
eb1df2371581 Add "/room kick"
Mikael Berthe <mikael@lilotux.net>
parents: 562
diff changeset
156 scr_LogPrint(LPRINT_NORMAL, "<%s> is not a valid Jabber id", roomid);
eb1df2371581 Add "/room kick"
Mikael Berthe <mikael@lilotux.net>
parents: 562
diff changeset
157 return 1;
eb1df2371581 Add "/room kick"
Mikael Berthe <mikael@lilotux.net>
parents: 562
diff changeset
158 }
1058
c0d44a9a99bc Code cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 1055
diff changeset
159 if (fjid && check_jid_syntax((char*)fjid)) {
c0d44a9a99bc Code cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 1055
diff changeset
160 scr_LogPrint(LPRINT_NORMAL, "<%s> is not a valid Jabber id", fjid);
568
eb1df2371581 Add "/room kick"
Mikael Berthe <mikael@lilotux.net>
parents: 562
diff changeset
161 return 1;
eb1df2371581 Add "/room kick"
Mikael Berthe <mikael@lilotux.net>
parents: 562
diff changeset
162 }
eb1df2371581 Add "/room kick"
Mikael Berthe <mikael@lilotux.net>
parents: 562
diff changeset
163
1058
c0d44a9a99bc Code cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 1055
diff changeset
164 if (ra.type == type_affil && ra.val.affil == affil_outcast && !fjid)
572
afc2bd38b15c Implement affiliations handling, add "/room whois"
Mikael Berthe <mikael@lilotux.net>
parents: 569
diff changeset
165 return 1; // Shouldn't happen (jid mandatory when banning)
568
eb1df2371581 Add "/room kick"
Mikael Berthe <mikael@lilotux.net>
parents: 562
diff changeset
166
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
167 iq = lm_message_new_with_sub_type(roomid, LM_MESSAGE_TYPE_IQ,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
168 LM_MESSAGE_SUB_TYPE_SET);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
169 query = lm_message_node_add_child(iq->node, "query", NULL);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
170 lm_message_node_set_attribute(query, "xmlns",
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
171 "http://jabber.org/protocol/muc#admin");
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
172 x = lm_message_node_add_child(query, "item", NULL);
568
eb1df2371581 Add "/room kick"
Mikael Berthe <mikael@lilotux.net>
parents: 562
diff changeset
173
1058
c0d44a9a99bc Code cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 1055
diff changeset
174 if (fjid) {
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
175 lm_message_node_set_attribute(x, "jid", fjid);
772
464be13343a9 Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents: 756
diff changeset
176 } else { // nickname
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
177 lm_message_node_set_attribute(x, "nick", nick);
568
eb1df2371581 Add "/room kick"
Mikael Berthe <mikael@lilotux.net>
parents: 562
diff changeset
178 }
584
414fbf558f1e jb_room_setattrib()
Mikael Berthe <mikael@lilotux.net>
parents: 583
diff changeset
179
414fbf558f1e jb_room_setattrib()
Mikael Berthe <mikael@lilotux.net>
parents: 583
diff changeset
180 if (ra.type == type_affil)
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
181 lm_message_node_set_attribute(x, "affiliation", straffil[ra.val.affil]);
584
414fbf558f1e jb_room_setattrib()
Mikael Berthe <mikael@lilotux.net>
parents: 583
diff changeset
182 else if (ra.type == type_role)
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
183 lm_message_node_set_attribute(x, "role", strrole[ra.val.role]);
568
eb1df2371581 Add "/room kick"
Mikael Berthe <mikael@lilotux.net>
parents: 562
diff changeset
184
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
185 if (reason)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
186 lm_message_node_add_child(x, "reason", reason);
568
eb1df2371581 Add "/room kick"
Mikael Berthe <mikael@lilotux.net>
parents: 562
diff changeset
187
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
188 lm_connection_send(lconnection, iq, NULL);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
189 lm_message_unref(iq);
568
eb1df2371581 Add "/room kick"
Mikael Berthe <mikael@lilotux.net>
parents: 562
diff changeset
190
eb1df2371581 Add "/room kick"
Mikael Berthe <mikael@lilotux.net>
parents: 562
diff changeset
191 return 0;
eb1df2371581 Add "/room kick"
Mikael Berthe <mikael@lilotux.net>
parents: 562
diff changeset
192 }
486
2a6a8ebb813b Add "/room invite"
Mikael Berthe <mikael@lilotux.net>
parents: 478
diff changeset
193
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
194 // Unlock a MUC room
486
2a6a8ebb813b Add "/room invite"
Mikael Berthe <mikael@lilotux.net>
parents: 478
diff changeset
195 // room syntax: "room@server"
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
196 void xmpp_room_unlock(const char *room)
486
2a6a8ebb813b Add "/room invite"
Mikael Berthe <mikael@lilotux.net>
parents: 478
diff changeset
197 {
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
198 LmMessageNode *y, *z;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
199 LmMessage *iq;
1363
32077249de77 Warn if a MUC room without bookmark is renamed
Mikael Berthe <mikael@lilotux.net>
parents: 1355
diff changeset
200
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
201 if (!lm_connection_is_authenticated(lconnection) || !room) return;
1363
32077249de77 Warn if a MUC room without bookmark is renamed
Mikael Berthe <mikael@lilotux.net>
parents: 1355
diff changeset
202
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
203 iq = lm_message_new_with_sub_type(room, LM_MESSAGE_TYPE_IQ,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
204 LM_MESSAGE_SUB_TYPE_SET);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
205 lm_message_node_set_attribute(iq->node, "xmlns",
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
206 "http://jabber.org/protocol/muc#owner");
1395
d431cd75eb53 Use bookmarked nickname when manually joining a room
Mikael Berthe <mikael@lilotux.net>
parents: 1385
diff changeset
207
d431cd75eb53 Use bookmarked nickname when manually joining a room
Mikael Berthe <mikael@lilotux.net>
parents: 1385
diff changeset
208
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
209 y = lm_message_node_add_child(iq->node, "query", NULL);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
210 z = lm_message_node_add_child(y, "x", NULL);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
211 lm_message_node_set_attribute(z, "xmlns", "jabber:x:data");
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
212 lm_message_node_set_attribute(z, "type", "submit");
1022
4c8d7b558e83 Annotations listing (/roster note in the status buffer)
Mikael Berthe <mikael@lilotux.net>
parents: 1019
diff changeset
213
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
214 lm_connection_send(lconnection, iq, NULL);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
215 lm_message_unref(iq);
1016
4d3c48844746 Add /roster note
Mikael Berthe <mikael@lilotux.net>
parents: 1015
diff changeset
216 }
4d3c48844746 Add /roster note
Mikael Berthe <mikael@lilotux.net>
parents: 1015
diff changeset
217
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
218 // Destroy a MUC room
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
219 // room syntax: "room@server"
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
220 void xmpp_room_destroy(const char *room, const char *venue, const char *reason)
1104
382972712208 Allow short key format in check_signature()
Mikael Berthe <mikael@lilotux.net>
parents: 1099
diff changeset
221 {
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
222 LmMessage *iq;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
223 LmMessageNode *query, *x;
1043
ebbde723614b Store contacts PGP keys
Mikael Berthe <mikael@lilotux.net>
parents: 1042
diff changeset
224
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
225 if (!lm_connection_is_authenticated(lconnection) || !room) return;
1484
7b36b91a4388 New UI message flag (O) when OTR is used
Mikael Berthe <mikael@lilotux.net>
parents: 1476
diff changeset
226
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
227 iq = lm_message_new_with_sub_type(room, LM_MESSAGE_TYPE_IQ,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
228 LM_MESSAGE_SUB_TYPE_SET);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
229 query = lm_message_node_add_child(iq->node, "query", NULL);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
230 lm_message_node_set_attribute(query, "xmlns",
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
231 "http://jabber.org/protocol/muc#owner");
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
232 x = lm_message_node_add_child(query, "destroy", NULL);
426
2706ef3e25a7 Better handling of server error codes/messages
Mikael Berthe <mikael@lilotux.net>
parents: 421
diff changeset
233
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
234 if (venue && *venue)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
235 lm_message_node_set_attribute(x, "jid", venue);
31
0f0fbd0c4a7f [/trunk] Changeset 47 by mikael
mikael
parents: 29
diff changeset
236
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
237 if (reason)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
238 lm_message_node_add_child(x, "reason", reason);
35
a8ceaa3005fd [/trunk] Changeset 51 by mikael
mikael
parents: 33
diff changeset
239
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
240 lm_connection_send(lconnection, iq, NULL);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
241 lm_message_unref(iq);
625
028c01940490 Show presence timestamps in "/info" and "/room whois"
Mikael Berthe <mikael@lilotux.net>
parents: 624
diff changeset
242 }
028c01940490 Show presence timestamps in "/info" and "/room whois"
Mikael Berthe <mikael@lilotux.net>
parents: 624
diff changeset
243
1384
f762805b3f42 Split function handle_presence_muc()
Mikael Berthe <mikael@lilotux.net>
parents: 1383
diff changeset
244 // muc_get_item_info(...)
f762805b3f42 Split function handle_presence_muc()
Mikael Berthe <mikael@lilotux.net>
parents: 1383
diff changeset
245 // Get room member's information from xmlndata.
f762805b3f42 Split function handle_presence_muc()
Mikael Berthe <mikael@lilotux.net>
parents: 1383
diff changeset
246 // The variables must be initialized before calling this function,
f762805b3f42 Split function handle_presence_muc()
Mikael Berthe <mikael@lilotux.net>
parents: 1383
diff changeset
247 // because they are not touched if the relevant information is missing.
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
248 static void muc_get_item_info(const char *from, LmMessageNode *xmldata,
1384
f762805b3f42 Split function handle_presence_muc()
Mikael Berthe <mikael@lilotux.net>
parents: 1383
diff changeset
249 enum imrole *mbrole, enum imaffiliation *mbaffil,
f762805b3f42 Split function handle_presence_muc()
Mikael Berthe <mikael@lilotux.net>
parents: 1383
diff changeset
250 const char **mbjid, const char **mbnick,
f762805b3f42 Split function handle_presence_muc()
Mikael Berthe <mikael@lilotux.net>
parents: 1383
diff changeset
251 const char **actorjid, const char **reason)
f762805b3f42 Split function handle_presence_muc()
Mikael Berthe <mikael@lilotux.net>
parents: 1383
diff changeset
252 {
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
253 LmMessageNode *y, *z;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
254 const char *p;
1384
f762805b3f42 Split function handle_presence_muc()
Mikael Berthe <mikael@lilotux.net>
parents: 1383
diff changeset
255
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
256 y = lm_message_node_find_child(xmldata, "item");
1384
f762805b3f42 Split function handle_presence_muc()
Mikael Berthe <mikael@lilotux.net>
parents: 1383
diff changeset
257 if (!y)
f762805b3f42 Split function handle_presence_muc()
Mikael Berthe <mikael@lilotux.net>
parents: 1383
diff changeset
258 return;
f762805b3f42 Split function handle_presence_muc()
Mikael Berthe <mikael@lilotux.net>
parents: 1383
diff changeset
259
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
260 p = lm_message_node_get_attribute(y, "affiliation");
1384
f762805b3f42 Split function handle_presence_muc()
Mikael Berthe <mikael@lilotux.net>
parents: 1383
diff changeset
261 if (p) {
f762805b3f42 Split function handle_presence_muc()
Mikael Berthe <mikael@lilotux.net>
parents: 1383
diff changeset
262 if (!strcmp(p, "owner")) *mbaffil = affil_owner;
f762805b3f42 Split function handle_presence_muc()
Mikael Berthe <mikael@lilotux.net>
parents: 1383
diff changeset
263 else if (!strcmp(p, "admin")) *mbaffil = affil_admin;
f762805b3f42 Split function handle_presence_muc()
Mikael Berthe <mikael@lilotux.net>
parents: 1383
diff changeset
264 else if (!strcmp(p, "member")) *mbaffil = affil_member;
f762805b3f42 Split function handle_presence_muc()
Mikael Berthe <mikael@lilotux.net>
parents: 1383
diff changeset
265 else if (!strcmp(p, "outcast")) *mbaffil = affil_outcast;
f762805b3f42 Split function handle_presence_muc()
Mikael Berthe <mikael@lilotux.net>
parents: 1383
diff changeset
266 else if (!strcmp(p, "none")) *mbaffil = affil_none;
f762805b3f42 Split function handle_presence_muc()
Mikael Berthe <mikael@lilotux.net>
parents: 1383
diff changeset
267 else scr_LogPrint(LPRINT_LOGNORM, "<%s>: Unknown affiliation \"%s\"",
f762805b3f42 Split function handle_presence_muc()
Mikael Berthe <mikael@lilotux.net>
parents: 1383
diff changeset
268 from, p);
f762805b3f42 Split function handle_presence_muc()
Mikael Berthe <mikael@lilotux.net>
parents: 1383
diff changeset
269 }
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
270 p = lm_message_node_get_attribute(y, "role");
1384
f762805b3f42 Split function handle_presence_muc()
Mikael Berthe <mikael@lilotux.net>
parents: 1383
diff changeset
271 if (p) {
f762805b3f42 Split function handle_presence_muc()
Mikael Berthe <mikael@lilotux.net>
parents: 1383
diff changeset
272 if (!strcmp(p, "moderator")) *mbrole = role_moderator;
f762805b3f42 Split function handle_presence_muc()
Mikael Berthe <mikael@lilotux.net>
parents: 1383
diff changeset
273 else if (!strcmp(p, "participant")) *mbrole = role_participant;
f762805b3f42 Split function handle_presence_muc()
Mikael Berthe <mikael@lilotux.net>
parents: 1383
diff changeset
274 else if (!strcmp(p, "visitor")) *mbrole = role_visitor;
f762805b3f42 Split function handle_presence_muc()
Mikael Berthe <mikael@lilotux.net>
parents: 1383
diff changeset
275 else if (!strcmp(p, "none")) *mbrole = role_none;
f762805b3f42 Split function handle_presence_muc()
Mikael Berthe <mikael@lilotux.net>
parents: 1383
diff changeset
276 else scr_LogPrint(LPRINT_LOGNORM, "<%s>: Unknown role \"%s\"",
f762805b3f42 Split function handle_presence_muc()
Mikael Berthe <mikael@lilotux.net>
parents: 1383
diff changeset
277 from, p);
f762805b3f42 Split function handle_presence_muc()
Mikael Berthe <mikael@lilotux.net>
parents: 1383
diff changeset
278 }
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
279 *mbjid = lm_message_node_get_attribute(y, "jid");
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
280 *mbnick = lm_message_node_get_attribute(y, "nick");
1384
f762805b3f42 Split function handle_presence_muc()
Mikael Berthe <mikael@lilotux.net>
parents: 1383
diff changeset
281 // For kick/ban, there can be actor and reason tags
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
282 *reason = lm_message_node_get_child_value(y, "reason");
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
283 z = lm_message_node_find_child(y, "actor");
1384
f762805b3f42 Split function handle_presence_muc()
Mikael Berthe <mikael@lilotux.net>
parents: 1383
diff changeset
284 if (z)
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
285 *actorjid = lm_message_node_get_attribute(z, "jid");
1384
f762805b3f42 Split function handle_presence_muc()
Mikael Berthe <mikael@lilotux.net>
parents: 1383
diff changeset
286 }
f762805b3f42 Split function handle_presence_muc()
Mikael Berthe <mikael@lilotux.net>
parents: 1383
diff changeset
287
f762805b3f42 Split function handle_presence_muc()
Mikael Berthe <mikael@lilotux.net>
parents: 1383
diff changeset
288 // muc_handle_join(...)
f762805b3f42 Split function handle_presence_muc()
Mikael Berthe <mikael@lilotux.net>
parents: 1383
diff changeset
289 // Handle a join event in a MUC room.
f762805b3f42 Split function handle_presence_muc()
Mikael Berthe <mikael@lilotux.net>
parents: 1383
diff changeset
290 // This function will return the new_member value TRUE if somebody else joins
f762805b3f42 Split function handle_presence_muc()
Mikael Berthe <mikael@lilotux.net>
parents: 1383
diff changeset
291 // the room (and FALSE if _we_ are joining the room).
f762805b3f42 Split function handle_presence_muc()
Mikael Berthe <mikael@lilotux.net>
parents: 1383
diff changeset
292 static bool muc_handle_join(const GSList *room_elt, const char *rname,
f762805b3f42 Split function handle_presence_muc()
Mikael Berthe <mikael@lilotux.net>
parents: 1383
diff changeset
293 const char *roomjid, const char *ournick,
f762805b3f42 Split function handle_presence_muc()
Mikael Berthe <mikael@lilotux.net>
parents: 1383
diff changeset
294 enum room_printstatus printstatus,
f762805b3f42 Split function handle_presence_muc()
Mikael Berthe <mikael@lilotux.net>
parents: 1383
diff changeset
295 time_t usttime, int log_muc_conf)
f762805b3f42 Split function handle_presence_muc()
Mikael Berthe <mikael@lilotux.net>
parents: 1383
diff changeset
296 {
f762805b3f42 Split function handle_presence_muc()
Mikael Berthe <mikael@lilotux.net>
parents: 1383
diff changeset
297 bool new_member = FALSE; // True if somebody else joins the room (not us)
f762805b3f42 Split function handle_presence_muc()
Mikael Berthe <mikael@lilotux.net>
parents: 1383
diff changeset
298 gchar *mbuf;
f762805b3f42 Split function handle_presence_muc()
Mikael Berthe <mikael@lilotux.net>
parents: 1383
diff changeset
299
f762805b3f42 Split function handle_presence_muc()
Mikael Berthe <mikael@lilotux.net>
parents: 1383
diff changeset
300 if (!buddy_getinsideroom(room_elt->data)) {
f762805b3f42 Split function handle_presence_muc()
Mikael Berthe <mikael@lilotux.net>
parents: 1383
diff changeset
301 // We weren't inside the room yet. Now we are.
f762805b3f42 Split function handle_presence_muc()
Mikael Berthe <mikael@lilotux.net>
parents: 1383
diff changeset
302 // However, this could be a presence packet from another room member
f762805b3f42 Split function handle_presence_muc()
Mikael Berthe <mikael@lilotux.net>
parents: 1383
diff changeset
303
f762805b3f42 Split function handle_presence_muc()
Mikael Berthe <mikael@lilotux.net>
parents: 1383
diff changeset
304 buddy_setinsideroom(room_elt->data, TRUE);
f762805b3f42 Split function handle_presence_muc()
Mikael Berthe <mikael@lilotux.net>
parents: 1383
diff changeset
305 // Set the message flag unless we're already in the room buffer window
f762805b3f42 Split function handle_presence_muc()
Mikael Berthe <mikael@lilotux.net>
parents: 1383
diff changeset
306 scr_setmsgflag_if_needed(roomjid, FALSE);
f762805b3f42 Split function handle_presence_muc()
Mikael Berthe <mikael@lilotux.net>
parents: 1383
diff changeset
307 // Add a message to the tracelog file
f762805b3f42 Split function handle_presence_muc()
Mikael Berthe <mikael@lilotux.net>
parents: 1383
diff changeset
308 mbuf = g_strdup_printf("You have joined %s as \"%s\"", roomjid, ournick);
f762805b3f42 Split function handle_presence_muc()
Mikael Berthe <mikael@lilotux.net>
parents: 1383
diff changeset
309 scr_LogPrint(LPRINT_LOGNORM, "%s", mbuf);
f762805b3f42 Split function handle_presence_muc()
Mikael Berthe <mikael@lilotux.net>
parents: 1383
diff changeset
310 g_free(mbuf);
f762805b3f42 Split function handle_presence_muc()
Mikael Berthe <mikael@lilotux.net>
parents: 1383
diff changeset
311 mbuf = g_strdup_printf("You have joined as \"%s\"", ournick);
f762805b3f42 Split function handle_presence_muc()
Mikael Berthe <mikael@lilotux.net>
parents: 1383
diff changeset
312
f762805b3f42 Split function handle_presence_muc()
Mikael Berthe <mikael@lilotux.net>
parents: 1383
diff changeset
313 // The 1st presence message could be for another room member
f762805b3f42 Split function handle_presence_muc()
Mikael Berthe <mikael@lilotux.net>
parents: 1383
diff changeset
314 if (strcmp(ournick, rname)) {
f762805b3f42 Split function handle_presence_muc()
Mikael Berthe <mikael@lilotux.net>
parents: 1383
diff changeset
315 // Display current mbuf and create a new message for the member
f762805b3f42 Split function handle_presence_muc()
Mikael Berthe <mikael@lilotux.net>
parents: 1383
diff changeset
316 // Note: the usttime timestamp is related to the other member,
f762805b3f42 Split function handle_presence_muc()
Mikael Berthe <mikael@lilotux.net>
parents: 1383
diff changeset
317 // so we use 0 here.
f762805b3f42 Split function handle_presence_muc()
Mikael Berthe <mikael@lilotux.net>
parents: 1383
diff changeset
318 scr_WriteIncomingMessage(roomjid, mbuf, 0,
f762805b3f42 Split function handle_presence_muc()
Mikael Berthe <mikael@lilotux.net>
parents: 1383
diff changeset
319 HBB_PREFIX_INFO|HBB_PREFIX_NOFLAG, 0);
f762805b3f42 Split function handle_presence_muc()
Mikael Berthe <mikael@lilotux.net>
parents: 1383
diff changeset
320 if (log_muc_conf)
f762805b3f42 Split function handle_presence_muc()
Mikael Berthe <mikael@lilotux.net>
parents: 1383
diff changeset
321 hlog_write_message(roomjid, 0, -1, mbuf);
f762805b3f42 Split function handle_presence_muc()
Mikael Berthe <mikael@lilotux.net>
parents: 1383
diff changeset
322 g_free(mbuf);
f762805b3f42 Split function handle_presence_muc()
Mikael Berthe <mikael@lilotux.net>
parents: 1383
diff changeset
323 if (printstatus != status_none)
f762805b3f42 Split function handle_presence_muc()
Mikael Berthe <mikael@lilotux.net>
parents: 1383
diff changeset
324 mbuf = g_strdup_printf("%s has joined", rname);
f762805b3f42 Split function handle_presence_muc()
Mikael Berthe <mikael@lilotux.net>
parents: 1383
diff changeset
325 else
f762805b3f42 Split function handle_presence_muc()
Mikael Berthe <mikael@lilotux.net>
parents: 1383
diff changeset
326 mbuf = NULL;
f762805b3f42 Split function handle_presence_muc()
Mikael Berthe <mikael@lilotux.net>
parents: 1383
diff changeset
327 new_member = TRUE;
f762805b3f42 Split function handle_presence_muc()
Mikael Berthe <mikael@lilotux.net>
parents: 1383
diff changeset
328 }
f762805b3f42 Split function handle_presence_muc()
Mikael Berthe <mikael@lilotux.net>
parents: 1383
diff changeset
329 } else {
f762805b3f42 Split function handle_presence_muc()
Mikael Berthe <mikael@lilotux.net>
parents: 1383
diff changeset
330 mbuf = NULL;
f762805b3f42 Split function handle_presence_muc()
Mikael Berthe <mikael@lilotux.net>
parents: 1383
diff changeset
331 if (strcmp(ournick, rname)) {
f762805b3f42 Split function handle_presence_muc()
Mikael Berthe <mikael@lilotux.net>
parents: 1383
diff changeset
332 if (printstatus != status_none)
f762805b3f42 Split function handle_presence_muc()
Mikael Berthe <mikael@lilotux.net>
parents: 1383
diff changeset
333 mbuf = g_strdup_printf("%s has joined", rname);
f762805b3f42 Split function handle_presence_muc()
Mikael Berthe <mikael@lilotux.net>
parents: 1383
diff changeset
334 new_member = TRUE;
f762805b3f42 Split function handle_presence_muc()
Mikael Berthe <mikael@lilotux.net>
parents: 1383
diff changeset
335 }
f762805b3f42 Split function handle_presence_muc()
Mikael Berthe <mikael@lilotux.net>
parents: 1383
diff changeset
336 }
f762805b3f42 Split function handle_presence_muc()
Mikael Berthe <mikael@lilotux.net>
parents: 1383
diff changeset
337
f762805b3f42 Split function handle_presence_muc()
Mikael Berthe <mikael@lilotux.net>
parents: 1383
diff changeset
338 if (mbuf) {
f762805b3f42 Split function handle_presence_muc()
Mikael Berthe <mikael@lilotux.net>
parents: 1383
diff changeset
339 guint msgflags = HBB_PREFIX_INFO;
f762805b3f42 Split function handle_presence_muc()
Mikael Berthe <mikael@lilotux.net>
parents: 1383
diff changeset
340 if (!settings_opt_get_int("muc_flag_joins"))
f762805b3f42 Split function handle_presence_muc()
Mikael Berthe <mikael@lilotux.net>
parents: 1383
diff changeset
341 msgflags |= HBB_PREFIX_NOFLAG;
f762805b3f42 Split function handle_presence_muc()
Mikael Berthe <mikael@lilotux.net>
parents: 1383
diff changeset
342 scr_WriteIncomingMessage(roomjid, mbuf, usttime, msgflags, 0);
f762805b3f42 Split function handle_presence_muc()
Mikael Berthe <mikael@lilotux.net>
parents: 1383
diff changeset
343 if (log_muc_conf)
f762805b3f42 Split function handle_presence_muc()
Mikael Berthe <mikael@lilotux.net>
parents: 1383
diff changeset
344 hlog_write_message(roomjid, 0, -1, mbuf);
f762805b3f42 Split function handle_presence_muc()
Mikael Berthe <mikael@lilotux.net>
parents: 1383
diff changeset
345 g_free(mbuf);
f762805b3f42 Split function handle_presence_muc()
Mikael Berthe <mikael@lilotux.net>
parents: 1383
diff changeset
346 }
f762805b3f42 Split function handle_presence_muc()
Mikael Berthe <mikael@lilotux.net>
parents: 1383
diff changeset
347
f762805b3f42 Split function handle_presence_muc()
Mikael Berthe <mikael@lilotux.net>
parents: 1383
diff changeset
348 return new_member;
f762805b3f42 Split function handle_presence_muc()
Mikael Berthe <mikael@lilotux.net>
parents: 1383
diff changeset
349 }
f762805b3f42 Split function handle_presence_muc()
Mikael Berthe <mikael@lilotux.net>
parents: 1383
diff changeset
350
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
351 static void handle_muc_presence(const char *from, LmMessageNode *xmldata,
581
ad07c868ff43 Tell the user when he or she has been kicked/banned
Mikael Berthe <mikael@lilotux.net>
parents: 580
diff changeset
352 const char *roomjid, const char *rname,
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
353 enum imstatus ust, const char *ustmsg,
625
028c01940490 Show presence timestamps in "/info" and "/room whois"
Mikael Berthe <mikael@lilotux.net>
parents: 624
diff changeset
354 time_t usttime, char bpprio)
579
0c67755e0fa7 Introduce a handle_presence_muc() function
Mikael Berthe <mikael@lilotux.net>
parents: 578
diff changeset
355 {
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
356 LmMessageNode *y;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
357 const char *p;
864
a7b3409df6bc MUC: Work around user server restart
Mikael Berthe <mikael@lilotux.net>
parents: 862
diff changeset
358 char *mbuf;
a7b3409df6bc MUC: Work around user server restart
Mikael Berthe <mikael@lilotux.net>
parents: 862
diff changeset
359 const char *ournick;
579
0c67755e0fa7 Introduce a handle_presence_muc() function
Mikael Berthe <mikael@lilotux.net>
parents: 578
diff changeset
360 enum imrole mbrole = role_none;
0c67755e0fa7 Introduce a handle_presence_muc() function
Mikael Berthe <mikael@lilotux.net>
parents: 578
diff changeset
361 enum imaffiliation mbaffil = affil_none;
1377
cd9182f0b5c7 Add /room setopt {print_status,auto_whois}
Mikael Berthe <mikael@lilotux.net>
parents: 1365
diff changeset
362 enum room_printstatus printstatus;
cd9182f0b5c7 Add /room setopt {print_status,auto_whois}
Mikael Berthe <mikael@lilotux.net>
parents: 1365
diff changeset
363 enum room_autowhois autowhois;
581
ad07c868ff43 Tell the user when he or she has been kicked/banned
Mikael Berthe <mikael@lilotux.net>
parents: 580
diff changeset
364 const char *mbjid = NULL, *mbnick = NULL;
ad07c868ff43 Tell the user when he or she has been kicked/banned
Mikael Berthe <mikael@lilotux.net>
parents: 580
diff changeset
365 const char *actorjid = NULL, *reason = NULL;
837
7c74eef1d0e0 New option "muc_auto_whois"
Mikael Berthe <mikael@lilotux.net>
parents: 834
diff changeset
366 bool new_member = FALSE; // True if somebody else joins the room (not us)
1377
cd9182f0b5c7 Add /room setopt {print_status,auto_whois}
Mikael Berthe <mikael@lilotux.net>
parents: 1365
diff changeset
367 guint statuscode = 0;
cd9182f0b5c7 Add /room setopt {print_status,auto_whois}
Mikael Berthe <mikael@lilotux.net>
parents: 1365
diff changeset
368 guint nickchange = 0;
579
0c67755e0fa7 Introduce a handle_presence_muc() function
Mikael Berthe <mikael@lilotux.net>
parents: 578
diff changeset
369 GSList *room_elt;
581
ad07c868ff43 Tell the user when he or she has been kicked/banned
Mikael Berthe <mikael@lilotux.net>
parents: 580
diff changeset
370 int log_muc_conf;
1013
f1a9ca2348e5 Set the msg_flag when we leave a MUC room
Mikael Berthe <mikael@lilotux.net>
parents: 1010
diff changeset
371 guint msgflags;
579
0c67755e0fa7 Introduce a handle_presence_muc() function
Mikael Berthe <mikael@lilotux.net>
parents: 578
diff changeset
372
581
ad07c868ff43 Tell the user when he or she has been kicked/banned
Mikael Berthe <mikael@lilotux.net>
parents: 580
diff changeset
373 log_muc_conf = settings_opt_get_int("log_muc_conf");
ad07c868ff43 Tell the user when he or she has been kicked/banned
Mikael Berthe <mikael@lilotux.net>
parents: 580
diff changeset
374
ad07c868ff43 Tell the user when he or she has been kicked/banned
Mikael Berthe <mikael@lilotux.net>
parents: 580
diff changeset
375 room_elt = roster_find(roomjid, jidsearch, 0);
579
0c67755e0fa7 Introduce a handle_presence_muc() function
Mikael Berthe <mikael@lilotux.net>
parents: 578
diff changeset
376 if (!room_elt) {
864
a7b3409df6bc MUC: Work around user server restart
Mikael Berthe <mikael@lilotux.net>
parents: 862
diff changeset
377 // Add room if it doesn't already exist
a7b3409df6bc MUC: Work around user server restart
Mikael Berthe <mikael@lilotux.net>
parents: 862
diff changeset
378 // It shouldn't happen, there is probably something wrong (server or
a7b3409df6bc MUC: Work around user server restart
Mikael Berthe <mikael@lilotux.net>
parents: 862
diff changeset
379 // network issue?)
1355
9716cf8a0726 Add on_server flag
Mikael Berthe <mikael@lilotux.net>
parents: 1354
diff changeset
380 room_elt = roster_add_user(roomjid, NULL, NULL, ROSTER_TYPE_ROOM,
9716cf8a0726 Add on_server flag
Mikael Berthe <mikael@lilotux.net>
parents: 1354
diff changeset
381 sub_none, -1);
864
a7b3409df6bc MUC: Work around user server restart
Mikael Berthe <mikael@lilotux.net>
parents: 862
diff changeset
382 scr_LogPrint(LPRINT_LOGNORM, "Strange MUC presence message");
579
0c67755e0fa7 Introduce a handle_presence_muc() function
Mikael Berthe <mikael@lilotux.net>
parents: 578
diff changeset
383 } else {
0c67755e0fa7 Introduce a handle_presence_muc() function
Mikael Berthe <mikael@lilotux.net>
parents: 578
diff changeset
384 // Make sure this is a room (it can be a conversion user->room)
0c67755e0fa7 Introduce a handle_presence_muc() function
Mikael Berthe <mikael@lilotux.net>
parents: 578
diff changeset
385 buddy_settype(room_elt->data, ROSTER_TYPE_ROOM);
0c67755e0fa7 Introduce a handle_presence_muc() function
Mikael Berthe <mikael@lilotux.net>
parents: 578
diff changeset
386 }
0c67755e0fa7 Introduce a handle_presence_muc() function
Mikael Berthe <mikael@lilotux.net>
parents: 578
diff changeset
387
0c67755e0fa7 Introduce a handle_presence_muc() function
Mikael Berthe <mikael@lilotux.net>
parents: 578
diff changeset
388 // Get room member's information
1384
f762805b3f42 Split function handle_presence_muc()
Mikael Berthe <mikael@lilotux.net>
parents: 1383
diff changeset
389 muc_get_item_info(from, xmldata, &mbrole, &mbaffil, &mbjid, &mbnick,
f762805b3f42 Split function handle_presence_muc()
Mikael Berthe <mikael@lilotux.net>
parents: 1383
diff changeset
390 &actorjid, &reason);
579
0c67755e0fa7 Introduce a handle_presence_muc() function
Mikael Berthe <mikael@lilotux.net>
parents: 578
diff changeset
391
864
a7b3409df6bc MUC: Work around user server restart
Mikael Berthe <mikael@lilotux.net>
parents: 862
diff changeset
392 // Get our room nickname
a7b3409df6bc MUC: Work around user server restart
Mikael Berthe <mikael@lilotux.net>
parents: 862
diff changeset
393 ournick = buddy_getnickname(room_elt->data);
a7b3409df6bc MUC: Work around user server restart
Mikael Berthe <mikael@lilotux.net>
parents: 862
diff changeset
394
a7b3409df6bc MUC: Work around user server restart
Mikael Berthe <mikael@lilotux.net>
parents: 862
diff changeset
395 if (!ournick) {
a7b3409df6bc MUC: Work around user server restart
Mikael Berthe <mikael@lilotux.net>
parents: 862
diff changeset
396 // It shouldn't happen, probably a server issue
a7b3409df6bc MUC: Work around user server restart
Mikael Berthe <mikael@lilotux.net>
parents: 862
diff changeset
397 mbuf = g_strdup_printf("Unexpected groupchat packet!");
a7b3409df6bc MUC: Work around user server restart
Mikael Berthe <mikael@lilotux.net>
parents: 862
diff changeset
398
a7b3409df6bc MUC: Work around user server restart
Mikael Berthe <mikael@lilotux.net>
parents: 862
diff changeset
399 scr_LogPrint(LPRINT_LOGNORM, "%s", mbuf);
1290
e42f48103609 Drawing the MUC nicks by a different color
Michal 'vorner' Vaner <vorner@ucw.cz>
parents: 1282
diff changeset
400 scr_WriteIncomingMessage(roomjid, mbuf, 0, HBB_PREFIX_INFO, 0);
864
a7b3409df6bc MUC: Work around user server restart
Mikael Berthe <mikael@lilotux.net>
parents: 862
diff changeset
401 g_free(mbuf);
a7b3409df6bc MUC: Work around user server restart
Mikael Berthe <mikael@lilotux.net>
parents: 862
diff changeset
402 // Send back an unavailable packet
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
403 xmpp_setstatus(offline, roomjid, "", TRUE);
864
a7b3409df6bc MUC: Work around user server restart
Mikael Berthe <mikael@lilotux.net>
parents: 862
diff changeset
404 scr_DrawRoster();
a7b3409df6bc MUC: Work around user server restart
Mikael Berthe <mikael@lilotux.net>
parents: 862
diff changeset
405 return;
a7b3409df6bc MUC: Work around user server restart
Mikael Berthe <mikael@lilotux.net>
parents: 862
diff changeset
406 }
a7b3409df6bc MUC: Work around user server restart
Mikael Berthe <mikael@lilotux.net>
parents: 862
diff changeset
407
581
ad07c868ff43 Tell the user when he or she has been kicked/banned
Mikael Berthe <mikael@lilotux.net>
parents: 580
diff changeset
408 // Get the status code
ad07c868ff43 Tell the user when he or she has been kicked/banned
Mikael Berthe <mikael@lilotux.net>
parents: 580
diff changeset
409 // 201: a room has been created
ad07c868ff43 Tell the user when he or she has been kicked/banned
Mikael Berthe <mikael@lilotux.net>
parents: 580
diff changeset
410 // 301: the user has been banned from the room
ad07c868ff43 Tell the user when he or she has been kicked/banned
Mikael Berthe <mikael@lilotux.net>
parents: 580
diff changeset
411 // 303: new room nickname
ad07c868ff43 Tell the user when he or she has been kicked/banned
Mikael Berthe <mikael@lilotux.net>
parents: 580
diff changeset
412 // 307: the user has been kicked from the room
ad07c868ff43 Tell the user when he or she has been kicked/banned
Mikael Berthe <mikael@lilotux.net>
parents: 580
diff changeset
413 // 321,322,332: the user has been removed from the room
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
414 y = lm_message_node_find_child(xmldata, "status");
579
0c67755e0fa7 Introduce a handle_presence_muc() function
Mikael Berthe <mikael@lilotux.net>
parents: 578
diff changeset
415 if (y) {
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
416 p = lm_message_node_get_attribute(y, "code");
581
ad07c868ff43 Tell the user when he or she has been kicked/banned
Mikael Berthe <mikael@lilotux.net>
parents: 580
diff changeset
417 if (p)
ad07c868ff43 Tell the user when he or she has been kicked/banned
Mikael Berthe <mikael@lilotux.net>
parents: 580
diff changeset
418 statuscode = atoi(p);
ad07c868ff43 Tell the user when he or she has been kicked/banned
Mikael Berthe <mikael@lilotux.net>
parents: 580
diff changeset
419 }
ad07c868ff43 Tell the user when he or she has been kicked/banned
Mikael Berthe <mikael@lilotux.net>
parents: 580
diff changeset
420
1377
cd9182f0b5c7 Add /room setopt {print_status,auto_whois}
Mikael Berthe <mikael@lilotux.net>
parents: 1365
diff changeset
421 // Get the room's "print_status" settings
cd9182f0b5c7 Add /room setopt {print_status,auto_whois}
Mikael Berthe <mikael@lilotux.net>
parents: 1365
diff changeset
422 printstatus = buddy_getprintstatus(room_elt->data);
cd9182f0b5c7 Add /room setopt {print_status,auto_whois}
Mikael Berthe <mikael@lilotux.net>
parents: 1365
diff changeset
423 if (printstatus == status_default) {
cd9182f0b5c7 Add /room setopt {print_status,auto_whois}
Mikael Berthe <mikael@lilotux.net>
parents: 1365
diff changeset
424 printstatus = (guint) settings_opt_get_int("muc_print_status");
cd9182f0b5c7 Add /room setopt {print_status,auto_whois}
Mikael Berthe <mikael@lilotux.net>
parents: 1365
diff changeset
425 if (printstatus > 3)
cd9182f0b5c7 Add /room setopt {print_status,auto_whois}
Mikael Berthe <mikael@lilotux.net>
parents: 1365
diff changeset
426 printstatus = status_default;
cd9182f0b5c7 Add /room setopt {print_status,auto_whois}
Mikael Berthe <mikael@lilotux.net>
parents: 1365
diff changeset
427 }
cd9182f0b5c7 Add /room setopt {print_status,auto_whois}
Mikael Berthe <mikael@lilotux.net>
parents: 1365
diff changeset
428
1396
8f9928839a36 Automatically unlock new rooms (suggested by Michael Weiser)
Mikael Berthe <mikael@lilotux.net>
parents: 1395
diff changeset
429 // A new room has been created; accept MUC default config
8f9928839a36 Automatically unlock new rooms (suggested by Michael Weiser)
Mikael Berthe <mikael@lilotux.net>
parents: 1395
diff changeset
430 if (statuscode == 201)
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
431 xmpp_room_unlock(roomjid);
1396
8f9928839a36 Automatically unlock new rooms (suggested by Michael Weiser)
Mikael Berthe <mikael@lilotux.net>
parents: 1395
diff changeset
432
581
ad07c868ff43 Tell the user when he or she has been kicked/banned
Mikael Berthe <mikael@lilotux.net>
parents: 580
diff changeset
433 // Check for nickname change
ad07c868ff43 Tell the user when he or she has been kicked/banned
Mikael Berthe <mikael@lilotux.net>
parents: 580
diff changeset
434 if (statuscode == 303 && mbnick) {
772
464be13343a9 Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents: 756
diff changeset
435 mbuf = g_strdup_printf("%s is now known as %s", rname, mbnick);
632
cfab93886a88 MUC: use timestamp when available
Mikael Berthe <mikael@lilotux.net>
parents: 628
diff changeset
436 scr_WriteIncomingMessage(roomjid, mbuf, usttime,
1290
e42f48103609 Drawing the MUC nicks by a different color
Michal 'vorner' Vaner <vorner@ucw.cz>
parents: 1282
diff changeset
437 HBB_PREFIX_INFO|HBB_PREFIX_NOFLAG, 0);
1166
c4da23bf8958 Add option 'muc_flag_joins'
Mikael Berthe <mikael@lilotux.net>
parents: 1164
diff changeset
438 if (log_muc_conf)
1342
06441b6cc23a History logfile: Use a special code (MI) for local MUC info messages
Mikael Berthe <mikael@lilotux.net>
parents: 1333
diff changeset
439 hlog_write_message(roomjid, 0, -1, mbuf);
581
ad07c868ff43 Tell the user when he or she has been kicked/banned
Mikael Berthe <mikael@lilotux.net>
parents: 580
diff changeset
440 g_free(mbuf);
772
464be13343a9 Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents: 756
diff changeset
441 buddy_resource_setname(room_elt->data, rname, mbnick);
464be13343a9 Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents: 756
diff changeset
442 // Maybe it's _our_ nickname...
864
a7b3409df6bc MUC: Work around user server restart
Mikael Berthe <mikael@lilotux.net>
parents: 862
diff changeset
443 if (ournick && !strcmp(rname, ournick))
772
464be13343a9 Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents: 756
diff changeset
444 buddy_setnickname(room_elt->data, mbnick);
1377
cd9182f0b5c7 Add /room setopt {print_status,auto_whois}
Mikael Berthe <mikael@lilotux.net>
parents: 1365
diff changeset
445 nickchange = TRUE;
579
0c67755e0fa7 Introduce a handle_presence_muc() function
Mikael Berthe <mikael@lilotux.net>
parents: 578
diff changeset
446 }
0c67755e0fa7 Introduce a handle_presence_muc() function
Mikael Berthe <mikael@lilotux.net>
parents: 578
diff changeset
447
0c67755e0fa7 Introduce a handle_presence_muc() function
Mikael Berthe <mikael@lilotux.net>
parents: 578
diff changeset
448 // Check for departure/arrival
1161
45d3b9dda43d Fix a MUC problem with some servers
Mikael Berthe <mikael@lilotux.net>
parents: 1132
diff changeset
449 if (!mbnick && ust == offline) {
1384
f762805b3f42 Split function handle_presence_muc()
Mikael Berthe <mikael@lilotux.net>
parents: 1383
diff changeset
450 // Somebody is leaving
586
d8f64e74206c Missing initialization
Mikael Berthe <mikael@lilotux.net>
parents: 584
diff changeset
451 enum { leave=0, kick, ban } how = leave;
583
32ae027a3238 MUC: clean up departure message code
Mikael Berthe <mikael@lilotux.net>
parents: 581
diff changeset
452 bool we_left = FALSE;
32ae027a3238 MUC: clean up departure message code
Mikael Berthe <mikael@lilotux.net>
parents: 581
diff changeset
453
32ae027a3238 MUC: clean up departure message code
Mikael Berthe <mikael@lilotux.net>
parents: 581
diff changeset
454 if (statuscode == 307)
32ae027a3238 MUC: clean up departure message code
Mikael Berthe <mikael@lilotux.net>
parents: 581
diff changeset
455 how = kick;
32ae027a3238 MUC: clean up departure message code
Mikael Berthe <mikael@lilotux.net>
parents: 581
diff changeset
456 else if (statuscode == 301)
32ae027a3238 MUC: clean up departure message code
Mikael Berthe <mikael@lilotux.net>
parents: 581
diff changeset
457 how = ban;
579
0c67755e0fa7 Introduce a handle_presence_muc() function
Mikael Berthe <mikael@lilotux.net>
parents: 578
diff changeset
458
0c67755e0fa7 Introduce a handle_presence_muc() function
Mikael Berthe <mikael@lilotux.net>
parents: 578
diff changeset
459 // If this is a leave, check if it is ourself
864
a7b3409df6bc MUC: Work around user server restart
Mikael Berthe <mikael@lilotux.net>
parents: 862
diff changeset
460 if (ournick && !strcmp(rname, ournick)) {
583
32ae027a3238 MUC: clean up departure message code
Mikael Berthe <mikael@lilotux.net>
parents: 581
diff changeset
461 we_left = TRUE; // _We_ have left! (kicked, banned, etc.)
644
68fb0c1dfb15 MUC: better nickname check when entering a room
Mikael Berthe <mikael@lilotux.net>
parents: 643
diff changeset
462 buddy_setinsideroom(room_elt->data, FALSE);
579
0c67755e0fa7 Introduce a handle_presence_muc() function
Mikael Berthe <mikael@lilotux.net>
parents: 578
diff changeset
463 buddy_setnickname(room_elt->data, NULL);
0c67755e0fa7 Introduce a handle_presence_muc() function
Mikael Berthe <mikael@lilotux.net>
parents: 578
diff changeset
464 buddy_del_all_resources(room_elt->data);
600
483a87c99990 Free room personal data when receiving the unavailable stanza, not before
Mikael Berthe <mikael@lilotux.net>
parents: 599
diff changeset
465 buddy_settopic(room_elt->data, NULL);
721
9cf31c9b1dc4 Use room topic as a description in the chat status line
Mikael Berthe <mikael@lilotux.net>
parents: 713
diff changeset
466 scr_UpdateChatStatus(FALSE);
583
32ae027a3238 MUC: clean up departure message code
Mikael Berthe <mikael@lilotux.net>
parents: 581
diff changeset
467 update_roster = TRUE;
32ae027a3238 MUC: clean up departure message code
Mikael Berthe <mikael@lilotux.net>
parents: 581
diff changeset
468 }
581
ad07c868ff43 Tell the user when he or she has been kicked/banned
Mikael Berthe <mikael@lilotux.net>
parents: 580
diff changeset
469
583
32ae027a3238 MUC: clean up departure message code
Mikael Berthe <mikael@lilotux.net>
parents: 581
diff changeset
470 // The message depends on _who_ left, and _how_
32ae027a3238 MUC: clean up departure message code
Mikael Berthe <mikael@lilotux.net>
parents: 581
diff changeset
471 if (how) {
32ae027a3238 MUC: clean up departure message code
Mikael Berthe <mikael@lilotux.net>
parents: 581
diff changeset
472 gchar *mbuf_end;
32ae027a3238 MUC: clean up departure message code
Mikael Berthe <mikael@lilotux.net>
parents: 581
diff changeset
473 // Forced leave
32ae027a3238 MUC: clean up departure message code
Mikael Berthe <mikael@lilotux.net>
parents: 581
diff changeset
474 if (actorjid) {
32ae027a3238 MUC: clean up departure message code
Mikael Berthe <mikael@lilotux.net>
parents: 581
diff changeset
475 mbuf_end = g_strdup_printf("%s from %s by <%s>.\nReason: %s",
32ae027a3238 MUC: clean up departure message code
Mikael Berthe <mikael@lilotux.net>
parents: 581
diff changeset
476 (how == ban ? "banned" : "kicked"),
772
464be13343a9 Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents: 756
diff changeset
477 roomjid, actorjid, reason);
583
32ae027a3238 MUC: clean up departure message code
Mikael Berthe <mikael@lilotux.net>
parents: 581
diff changeset
478 } else {
32ae027a3238 MUC: clean up departure message code
Mikael Berthe <mikael@lilotux.net>
parents: 581
diff changeset
479 mbuf_end = g_strdup_printf("%s from %s.",
32ae027a3238 MUC: clean up departure message code
Mikael Berthe <mikael@lilotux.net>
parents: 581
diff changeset
480 (how == ban ? "banned" : "kicked"),
32ae027a3238 MUC: clean up departure message code
Mikael Berthe <mikael@lilotux.net>
parents: 581
diff changeset
481 roomjid);
32ae027a3238 MUC: clean up departure message code
Mikael Berthe <mikael@lilotux.net>
parents: 581
diff changeset
482 }
32ae027a3238 MUC: clean up departure message code
Mikael Berthe <mikael@lilotux.net>
parents: 581
diff changeset
483 if (we_left)
32ae027a3238 MUC: clean up departure message code
Mikael Berthe <mikael@lilotux.net>
parents: 581
diff changeset
484 mbuf = g_strdup_printf("You have been %s", mbuf_end);
32ae027a3238 MUC: clean up departure message code
Mikael Berthe <mikael@lilotux.net>
parents: 581
diff changeset
485 else
32ae027a3238 MUC: clean up departure message code
Mikael Berthe <mikael@lilotux.net>
parents: 581
diff changeset
486 mbuf = g_strdup_printf("%s has been %s", rname, mbuf_end);
32ae027a3238 MUC: clean up departure message code
Mikael Berthe <mikael@lilotux.net>
parents: 581
diff changeset
487
32ae027a3238 MUC: clean up departure message code
Mikael Berthe <mikael@lilotux.net>
parents: 581
diff changeset
488 g_free(mbuf_end);
32ae027a3238 MUC: clean up departure message code
Mikael Berthe <mikael@lilotux.net>
parents: 581
diff changeset
489 } else {
32ae027a3238 MUC: clean up departure message code
Mikael Berthe <mikael@lilotux.net>
parents: 581
diff changeset
490 // Natural leave
32ae027a3238 MUC: clean up departure message code
Mikael Berthe <mikael@lilotux.net>
parents: 581
diff changeset
491 if (we_left) {
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
492 LmMessageNode *destroynode = lm_message_node_find_child(xmldata,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
493 "destroy");
616
a61a257ec38b MUC: display reason, if any, when a room has been destroyed
Mikael Berthe <mikael@lilotux.net>
parents: 612
diff changeset
494 if (destroynode) {
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
495 if ((reason = lm_message_node_get_child_value(destroynode,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
496 "reason"))) {
616
a61a257ec38b MUC: display reason, if any, when a room has been destroyed
Mikael Berthe <mikael@lilotux.net>
parents: 612
diff changeset
497 mbuf = g_strdup_printf("You have left %s, "
a61a257ec38b MUC: display reason, if any, when a room has been destroyed
Mikael Berthe <mikael@lilotux.net>
parents: 612
diff changeset
498 "the room has been destroyed: %s",
772
464be13343a9 Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents: 756
diff changeset
499 roomjid, reason);
616
a61a257ec38b MUC: display reason, if any, when a room has been destroyed
Mikael Berthe <mikael@lilotux.net>
parents: 612
diff changeset
500 } else {
a61a257ec38b MUC: display reason, if any, when a room has been destroyed
Mikael Berthe <mikael@lilotux.net>
parents: 612
diff changeset
501 mbuf = g_strdup_printf("You have left %s, "
a61a257ec38b MUC: display reason, if any, when a room has been destroyed
Mikael Berthe <mikael@lilotux.net>
parents: 612
diff changeset
502 "the room has been destroyed", roomjid);
a61a257ec38b MUC: display reason, if any, when a room has been destroyed
Mikael Berthe <mikael@lilotux.net>
parents: 612
diff changeset
503 }
a61a257ec38b MUC: display reason, if any, when a room has been destroyed
Mikael Berthe <mikael@lilotux.net>
parents: 612
diff changeset
504 } else {
599
fb67bf62f4eb Add "/room destroy"
Mikael Berthe <mikael@lilotux.net>
parents: 598
diff changeset
505 mbuf = g_strdup_printf("You have left %s", roomjid);
616
a61a257ec38b MUC: display reason, if any, when a room has been destroyed
Mikael Berthe <mikael@lilotux.net>
parents: 612
diff changeset
506 }
583
32ae027a3238 MUC: clean up departure message code
Mikael Berthe <mikael@lilotux.net>
parents: 581
diff changeset
507 } else {
845
51829325fe21 MUC: Fix a strange bug when a user isn't in a room anymore (network issue)
Mikael Berthe <mikael@lilotux.net>
parents: 842
diff changeset
508 if (ust != offline) {
51829325fe21 MUC: Fix a strange bug when a user isn't in a room anymore (network issue)
Mikael Berthe <mikael@lilotux.net>
parents: 842
diff changeset
509 // This can happen when a network failure occurs,
51829325fe21 MUC: Fix a strange bug when a user isn't in a room anymore (network issue)
Mikael Berthe <mikael@lilotux.net>
parents: 842
diff changeset
510 // this isn't an official leave but the user isn't there anymore.
51829325fe21 MUC: Fix a strange bug when a user isn't in a room anymore (network issue)
Mikael Berthe <mikael@lilotux.net>
parents: 842
diff changeset
511 mbuf = g_strdup_printf("%s has disappeared!", rname);
51829325fe21 MUC: Fix a strange bug when a user isn't in a room anymore (network issue)
Mikael Berthe <mikael@lilotux.net>
parents: 842
diff changeset
512 ust = offline;
51829325fe21 MUC: Fix a strange bug when a user isn't in a room anymore (network issue)
Mikael Berthe <mikael@lilotux.net>
parents: 842
diff changeset
513 } else {
51829325fe21 MUC: Fix a strange bug when a user isn't in a room anymore (network issue)
Mikael Berthe <mikael@lilotux.net>
parents: 842
diff changeset
514 if (ustmsg)
51829325fe21 MUC: Fix a strange bug when a user isn't in a room anymore (network issue)
Mikael Berthe <mikael@lilotux.net>
parents: 842
diff changeset
515 mbuf = g_strdup_printf("%s has left: %s", rname, ustmsg);
51829325fe21 MUC: Fix a strange bug when a user isn't in a room anymore (network issue)
Mikael Berthe <mikael@lilotux.net>
parents: 842
diff changeset
516 else
51829325fe21 MUC: Fix a strange bug when a user isn't in a room anymore (network issue)
Mikael Berthe <mikael@lilotux.net>
parents: 842
diff changeset
517 mbuf = g_strdup_printf("%s has left", rname);
51829325fe21 MUC: Fix a strange bug when a user isn't in a room anymore (network issue)
Mikael Berthe <mikael@lilotux.net>
parents: 842
diff changeset
518 }
581
ad07c868ff43 Tell the user when he or she has been kicked/banned
Mikael Berthe <mikael@lilotux.net>
parents: 580
diff changeset
519 }
583
32ae027a3238 MUC: clean up departure message code
Mikael Berthe <mikael@lilotux.net>
parents: 581
diff changeset
520 }
32ae027a3238 MUC: clean up departure message code
Mikael Berthe <mikael@lilotux.net>
parents: 581
diff changeset
521
1377
cd9182f0b5c7 Add /room setopt {print_status,auto_whois}
Mikael Berthe <mikael@lilotux.net>
parents: 1365
diff changeset
522 // Display the mbuf message if we're concerned
cd9182f0b5c7 Add /room setopt {print_status,auto_whois}
Mikael Berthe <mikael@lilotux.net>
parents: 1365
diff changeset
523 // or if the print_status isn't set to none.
cd9182f0b5c7 Add /room setopt {print_status,auto_whois}
Mikael Berthe <mikael@lilotux.net>
parents: 1365
diff changeset
524 if (we_left || printstatus != status_none) {
cd9182f0b5c7 Add /room setopt {print_status,auto_whois}
Mikael Berthe <mikael@lilotux.net>
parents: 1365
diff changeset
525 msgflags = HBB_PREFIX_INFO;
cd9182f0b5c7 Add /room setopt {print_status,auto_whois}
Mikael Berthe <mikael@lilotux.net>
parents: 1365
diff changeset
526 if (!we_left && settings_opt_get_int("muc_flag_joins") != 2)
cd9182f0b5c7 Add /room setopt {print_status,auto_whois}
Mikael Berthe <mikael@lilotux.net>
parents: 1365
diff changeset
527 msgflags |= HBB_PREFIX_NOFLAG;
cd9182f0b5c7 Add /room setopt {print_status,auto_whois}
Mikael Berthe <mikael@lilotux.net>
parents: 1365
diff changeset
528 scr_WriteIncomingMessage(roomjid, mbuf, usttime, msgflags, 0);
cd9182f0b5c7 Add /room setopt {print_status,auto_whois}
Mikael Berthe <mikael@lilotux.net>
parents: 1365
diff changeset
529 }
583
32ae027a3238 MUC: clean up departure message code
Mikael Berthe <mikael@lilotux.net>
parents: 581
diff changeset
530
1166
c4da23bf8958 Add option 'muc_flag_joins'
Mikael Berthe <mikael@lilotux.net>
parents: 1164
diff changeset
531 if (log_muc_conf)
1342
06441b6cc23a History logfile: Use a special code (MI) for local MUC info messages
Mikael Berthe <mikael@lilotux.net>
parents: 1333
diff changeset
532 hlog_write_message(roomjid, 0, -1, mbuf);
583
32ae027a3238 MUC: clean up departure message code
Mikael Berthe <mikael@lilotux.net>
parents: 581
diff changeset
533
32ae027a3238 MUC: clean up departure message code
Mikael Berthe <mikael@lilotux.net>
parents: 581
diff changeset
534 if (we_left) {
581
ad07c868ff43 Tell the user when he or she has been kicked/banned
Mikael Berthe <mikael@lilotux.net>
parents: 580
diff changeset
535 scr_LogPrint(LPRINT_LOGNORM, "%s", mbuf);
ad07c868ff43 Tell the user when he or she has been kicked/banned
Mikael Berthe <mikael@lilotux.net>
parents: 580
diff changeset
536 g_free(mbuf);
579
0c67755e0fa7 Introduce a handle_presence_muc() function
Mikael Berthe <mikael@lilotux.net>
parents: 578
diff changeset
537 return;
0c67755e0fa7 Introduce a handle_presence_muc() function
Mikael Berthe <mikael@lilotux.net>
parents: 578
diff changeset
538 }
0c67755e0fa7 Introduce a handle_presence_muc() function
Mikael Berthe <mikael@lilotux.net>
parents: 578
diff changeset
539 g_free(mbuf);
0c67755e0fa7 Introduce a handle_presence_muc() function
Mikael Berthe <mikael@lilotux.net>
parents: 578
diff changeset
540 } else if (buddy_getstatus(room_elt->data, rname) == offline &&
0c67755e0fa7 Introduce a handle_presence_muc() function
Mikael Berthe <mikael@lilotux.net>
parents: 578
diff changeset
541 ust != offline) {
1384
f762805b3f42 Split function handle_presence_muc()
Mikael Berthe <mikael@lilotux.net>
parents: 1383
diff changeset
542 // Somebody is joining
f762805b3f42 Split function handle_presence_muc()
Mikael Berthe <mikael@lilotux.net>
parents: 1383
diff changeset
543 new_member = muc_handle_join(room_elt, rname, roomjid, ournick,
f762805b3f42 Split function handle_presence_muc()
Mikael Berthe <mikael@lilotux.net>
parents: 1383
diff changeset
544 printstatus, usttime, log_muc_conf);
1377
cd9182f0b5c7 Add /room setopt {print_status,auto_whois}
Mikael Berthe <mikael@lilotux.net>
parents: 1365
diff changeset
545 } else {
cd9182f0b5c7 Add /room setopt {print_status,auto_whois}
Mikael Berthe <mikael@lilotux.net>
parents: 1365
diff changeset
546 // This is a simple member status change
cd9182f0b5c7 Add /room setopt {print_status,auto_whois}
Mikael Berthe <mikael@lilotux.net>
parents: 1365
diff changeset
547
cd9182f0b5c7 Add /room setopt {print_status,auto_whois}
Mikael Berthe <mikael@lilotux.net>
parents: 1365
diff changeset
548 if (printstatus == status_all && !nickchange) {
cd9182f0b5c7 Add /room setopt {print_status,auto_whois}
Mikael Berthe <mikael@lilotux.net>
parents: 1365
diff changeset
549 mbuf = g_strdup_printf("Member status has changed: %s [%c] %s", rname,
cd9182f0b5c7 Add /room setopt {print_status,auto_whois}
Mikael Berthe <mikael@lilotux.net>
parents: 1365
diff changeset
550 imstatus2char[ust], ((ustmsg) ? ustmsg : ""));
1380
605f9e1f9f76 Add missing PREFIX_NOFLAG flag...
Mikael Berthe <mikael@lilotux.net>
parents: 1379
diff changeset
551 scr_WriteIncomingMessage(roomjid, mbuf, usttime,
605f9e1f9f76 Add missing PREFIX_NOFLAG flag...
Mikael Berthe <mikael@lilotux.net>
parents: 1379
diff changeset
552 HBB_PREFIX_INFO|HBB_PREFIX_NOFLAG, 0);
1377
cd9182f0b5c7 Add /room setopt {print_status,auto_whois}
Mikael Berthe <mikael@lilotux.net>
parents: 1365
diff changeset
553 g_free(mbuf);
cd9182f0b5c7 Add /room setopt {print_status,auto_whois}
Mikael Berthe <mikael@lilotux.net>
parents: 1365
diff changeset
554 }
579
0c67755e0fa7 Introduce a handle_presence_muc() function
Mikael Berthe <mikael@lilotux.net>
parents: 578
diff changeset
555 }
0c67755e0fa7 Introduce a handle_presence_muc() function
Mikael Berthe <mikael@lilotux.net>
parents: 578
diff changeset
556
1377
cd9182f0b5c7 Add /room setopt {print_status,auto_whois}
Mikael Berthe <mikael@lilotux.net>
parents: 1365
diff changeset
557 // Sanity check, shouldn't happen...
cd9182f0b5c7 Add /room setopt {print_status,auto_whois}
Mikael Berthe <mikael@lilotux.net>
parents: 1365
diff changeset
558 if (!rname)
cd9182f0b5c7 Add /room setopt {print_status,auto_whois}
Mikael Berthe <mikael@lilotux.net>
parents: 1365
diff changeset
559 return;
cd9182f0b5c7 Add /room setopt {print_status,auto_whois}
Mikael Berthe <mikael@lilotux.net>
parents: 1365
diff changeset
560
579
0c67755e0fa7 Introduce a handle_presence_muc() function
Mikael Berthe <mikael@lilotux.net>
parents: 578
diff changeset
561 // Update room member status
1377
cd9182f0b5c7 Add /room setopt {print_status,auto_whois}
Mikael Berthe <mikael@lilotux.net>
parents: 1365
diff changeset
562 roster_setstatus(roomjid, rname, bpprio, ust, ustmsg, usttime,
cd9182f0b5c7 Add /room setopt {print_status,auto_whois}
Mikael Berthe <mikael@lilotux.net>
parents: 1365
diff changeset
563 mbrole, mbaffil, mbjid);
cd9182f0b5c7 Add /room setopt {print_status,auto_whois}
Mikael Berthe <mikael@lilotux.net>
parents: 1365
diff changeset
564
cd9182f0b5c7 Add /room setopt {print_status,auto_whois}
Mikael Berthe <mikael@lilotux.net>
parents: 1365
diff changeset
565 autowhois = buddy_getautowhois(room_elt->data);
cd9182f0b5c7 Add /room setopt {print_status,auto_whois}
Mikael Berthe <mikael@lilotux.net>
parents: 1365
diff changeset
566 if (autowhois == autowhois_default)
cd9182f0b5c7 Add /room setopt {print_status,auto_whois}
Mikael Berthe <mikael@lilotux.net>
parents: 1365
diff changeset
567 autowhois = (settings_opt_get_int("muc_auto_whois") ?
cd9182f0b5c7 Add /room setopt {print_status,auto_whois}
Mikael Berthe <mikael@lilotux.net>
parents: 1365
diff changeset
568 autowhois_on : autowhois_off);
cd9182f0b5c7 Add /room setopt {print_status,auto_whois}
Mikael Berthe <mikael@lilotux.net>
parents: 1365
diff changeset
569
cd9182f0b5c7 Add /room setopt {print_status,auto_whois}
Mikael Berthe <mikael@lilotux.net>
parents: 1365
diff changeset
570 if (new_member && autowhois == autowhois_on) {
cd9182f0b5c7 Add /room setopt {print_status,auto_whois}
Mikael Berthe <mikael@lilotux.net>
parents: 1365
diff changeset
571 // FIXME: This will fail for some UTF-8 nicknames.
cd9182f0b5c7 Add /room setopt {print_status,auto_whois}
Mikael Berthe <mikael@lilotux.net>
parents: 1365
diff changeset
572 gchar *joiner_nick = from_utf8(rname);
1415
317f8d181626 Rename command public functions
Mikael Berthe <mikael@lilotux.net>
parents: 1414
diff changeset
573 cmd_room_whois(room_elt->data, joiner_nick, FALSE);
1377
cd9182f0b5c7 Add /room setopt {print_status,auto_whois}
Mikael Berthe <mikael@lilotux.net>
parents: 1365
diff changeset
574 g_free(joiner_nick);
cd9182f0b5c7 Add /room setopt {print_status,auto_whois}
Mikael Berthe <mikael@lilotux.net>
parents: 1365
diff changeset
575 }
579
0c67755e0fa7 Introduce a handle_presence_muc() function
Mikael Berthe <mikael@lilotux.net>
parents: 578
diff changeset
576
0c67755e0fa7 Introduce a handle_presence_muc() function
Mikael Berthe <mikael@lilotux.net>
parents: 578
diff changeset
577 scr_DrawRoster();
0c67755e0fa7 Introduce a handle_presence_muc() function
Mikael Berthe <mikael@lilotux.net>
parents: 578
diff changeset
578 }
0c67755e0fa7 Introduce a handle_presence_muc() function
Mikael Berthe <mikael@lilotux.net>
parents: 578
diff changeset
579
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
580 static void roompresence(gpointer room, void *presencedata)
547
1df26ff0ed8c Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents: 539
diff changeset
581 {
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
582 const char *bjid;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
583 const char *nickname;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
584 char *to;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
585 struct T_presence *pres = presencedata;
644
68fb0c1dfb15 MUC: better nickname check when entering a room
Mikael Berthe <mikael@lilotux.net>
parents: 643
diff changeset
586
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
587 if (!buddy_getinsideroom(room))
547
1df26ff0ed8c Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents: 539
diff changeset
588 return;
1df26ff0ed8c Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents: 539
diff changeset
589
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
590 bjid = buddy_getjid(room);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
591 if (!bjid) return;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
592 nickname = buddy_getnickname(room);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
593 if (!nickname) return;
625
028c01940490 Show presence timestamps in "/info" and "/room whois"
Mikael Berthe <mikael@lilotux.net>
parents: 624
diff changeset
594
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
595 to = g_strdup_printf("%s/%s", bjid, nickname);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
596 xmpp_setstatus(pres->st, to, pres->msg, TRUE);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
597 g_free(to);
547
1df26ff0ed8c Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents: 539
diff changeset
598 }
1df26ff0ed8c Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents: 539
diff changeset
599
1330
7ba1b6d7ddcd Fix a bug when receiving an invitation
Mikael Berthe <mikael@lilotux.net>
parents: 1311
diff changeset
600 // got_invite(from, to, reason, passwd)
7ba1b6d7ddcd Fix a bug when receiving an invitation
Mikael Berthe <mikael@lilotux.net>
parents: 1311
diff changeset
601 // This function should be called when receiving an invitation from user
7ba1b6d7ddcd Fix a bug when receiving an invitation
Mikael Berthe <mikael@lilotux.net>
parents: 1311
diff changeset
602 // "from", to enter the room "to". Optional reason and room password can
7ba1b6d7ddcd Fix a bug when receiving an invitation
Mikael Berthe <mikael@lilotux.net>
parents: 1311
diff changeset
603 // be provided.
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
604 static void got_invite(const char* from, const char *to, const char* reason,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
605 const char* passwd)
1128
ac9c89f6cb51 Support for invitations to muc rooms
misc@mandriva.org
parents: 1104
diff changeset
606 {
ac9c89f6cb51 Support for invitations to muc rooms
misc@mandriva.org
parents: 1104
diff changeset
607 eviqs *evn;
ac9c89f6cb51 Support for invitations to muc rooms
misc@mandriva.org
parents: 1104
diff changeset
608 event_muc_invitation *invitation;
ac9c89f6cb51 Support for invitations to muc rooms
misc@mandriva.org
parents: 1104
diff changeset
609 GString *sbuf;
1236
f7b35b1c343d Fix a roster bug when receiving a MUC invitation
Mikael Berthe <mikael@lilotux.net>
parents: 1215
diff changeset
610 char *barejid;
1237
dcb99f0b5aaa Small MUC invitation improvement
Mikael Berthe <mikael@lilotux.net>
parents: 1236
diff changeset
611 GSList *room_elt;
1128
ac9c89f6cb51 Support for invitations to muc rooms
misc@mandriva.org
parents: 1104
diff changeset
612
ac9c89f6cb51 Support for invitations to muc rooms
misc@mandriva.org
parents: 1104
diff changeset
613 sbuf = g_string_new("");
ac9c89f6cb51 Support for invitations to muc rooms
misc@mandriva.org
parents: 1104
diff changeset
614 if (reason) {
ac9c89f6cb51 Support for invitations to muc rooms
misc@mandriva.org
parents: 1104
diff changeset
615 g_string_printf(sbuf,
ac9c89f6cb51 Support for invitations to muc rooms
misc@mandriva.org
parents: 1104
diff changeset
616 "Received an invitation to <%s>, from <%s>, reason: %s",
ac9c89f6cb51 Support for invitations to muc rooms
misc@mandriva.org
parents: 1104
diff changeset
617 to, from, reason);
ac9c89f6cb51 Support for invitations to muc rooms
misc@mandriva.org
parents: 1104
diff changeset
618 } else {
ac9c89f6cb51 Support for invitations to muc rooms
misc@mandriva.org
parents: 1104
diff changeset
619 g_string_printf(sbuf, "Received an invitation to <%s>, from <%s>",
ac9c89f6cb51 Support for invitations to muc rooms
misc@mandriva.org
parents: 1104
diff changeset
620 to, from);
ac9c89f6cb51 Support for invitations to muc rooms
misc@mandriva.org
parents: 1104
diff changeset
621 }
1236
f7b35b1c343d Fix a roster bug when receiving a MUC invitation
Mikael Berthe <mikael@lilotux.net>
parents: 1215
diff changeset
622
f7b35b1c343d Fix a roster bug when receiving a MUC invitation
Mikael Berthe <mikael@lilotux.net>
parents: 1215
diff changeset
623 barejid = jidtodisp(from);
1290
e42f48103609 Drawing the MUC nicks by a different color
Michal 'vorner' Vaner <vorner@ucw.cz>
parents: 1282
diff changeset
624 scr_WriteIncomingMessage(barejid, sbuf->str, 0, HBB_PREFIX_INFO, 0);
1128
ac9c89f6cb51 Support for invitations to muc rooms
misc@mandriva.org
parents: 1104
diff changeset
625 scr_LogPrint(LPRINT_LOGNORM, "%s", sbuf->str);
ac9c89f6cb51 Support for invitations to muc rooms
misc@mandriva.org
parents: 1104
diff changeset
626
ac9c89f6cb51 Support for invitations to muc rooms
misc@mandriva.org
parents: 1104
diff changeset
627 evn = evs_new(EVS_TYPE_INVITATION, EVS_MAX_TIMEOUT);
ac9c89f6cb51 Support for invitations to muc rooms
misc@mandriva.org
parents: 1104
diff changeset
628 if (evn) {
ac9c89f6cb51 Support for invitations to muc rooms
misc@mandriva.org
parents: 1104
diff changeset
629 evn->callback = &evscallback_invitation;
ac9c89f6cb51 Support for invitations to muc rooms
misc@mandriva.org
parents: 1104
diff changeset
630 invitation = g_new(event_muc_invitation, 1);
ac9c89f6cb51 Support for invitations to muc rooms
misc@mandriva.org
parents: 1104
diff changeset
631 invitation->to = g_strdup(to);
ac9c89f6cb51 Support for invitations to muc rooms
misc@mandriva.org
parents: 1104
diff changeset
632 invitation->from = g_strdup(from);
ac9c89f6cb51 Support for invitations to muc rooms
misc@mandriva.org
parents: 1104
diff changeset
633 invitation->passwd = g_strdup(passwd);
ac9c89f6cb51 Support for invitations to muc rooms
misc@mandriva.org
parents: 1104
diff changeset
634 invitation->reason = g_strdup(reason);
ac9c89f6cb51 Support for invitations to muc rooms
misc@mandriva.org
parents: 1104
diff changeset
635 evn->data = invitation;
ac9c89f6cb51 Support for invitations to muc rooms
misc@mandriva.org
parents: 1104
diff changeset
636 evn->desc = g_strdup_printf("<%s> invites you to %s ", from, to);
ac9c89f6cb51 Support for invitations to muc rooms
misc@mandriva.org
parents: 1104
diff changeset
637 g_string_printf(sbuf, "Please use /event %s accept|reject", evn->id);
ac9c89f6cb51 Support for invitations to muc rooms
misc@mandriva.org
parents: 1104
diff changeset
638 } else {
ac9c89f6cb51 Support for invitations to muc rooms
misc@mandriva.org
parents: 1104
diff changeset
639 g_string_printf(sbuf, "Unable to create a new event!");
ac9c89f6cb51 Support for invitations to muc rooms
misc@mandriva.org
parents: 1104
diff changeset
640 }
1290
e42f48103609 Drawing the MUC nicks by a different color
Michal 'vorner' Vaner <vorner@ucw.cz>
parents: 1282
diff changeset
641 scr_WriteIncomingMessage(barejid, sbuf->str, 0, HBB_PREFIX_INFO, 0);
1128
ac9c89f6cb51 Support for invitations to muc rooms
misc@mandriva.org
parents: 1104
diff changeset
642 scr_LogPrint(LPRINT_LOGNORM, "%s", sbuf->str);
ac9c89f6cb51 Support for invitations to muc rooms
misc@mandriva.org
parents: 1104
diff changeset
643 g_string_free(sbuf, TRUE);
1330
7ba1b6d7ddcd Fix a bug when receiving an invitation
Mikael Berthe <mikael@lilotux.net>
parents: 1311
diff changeset
644 g_free(barejid);
7ba1b6d7ddcd Fix a bug when receiving an invitation
Mikael Berthe <mikael@lilotux.net>
parents: 1311
diff changeset
645
7ba1b6d7ddcd Fix a bug when receiving an invitation
Mikael Berthe <mikael@lilotux.net>
parents: 1311
diff changeset
646 // Make sure the MUC room barejid is a room in the roster
7ba1b6d7ddcd Fix a bug when receiving an invitation
Mikael Berthe <mikael@lilotux.net>
parents: 1311
diff changeset
647 barejid = jidtodisp(to);
1237
dcb99f0b5aaa Small MUC invitation improvement
Mikael Berthe <mikael@lilotux.net>
parents: 1236
diff changeset
648 room_elt = roster_find(barejid, jidsearch, 0);
dcb99f0b5aaa Small MUC invitation improvement
Mikael Berthe <mikael@lilotux.net>
parents: 1236
diff changeset
649 if (room_elt)
dcb99f0b5aaa Small MUC invitation improvement
Mikael Berthe <mikael@lilotux.net>
parents: 1236
diff changeset
650 buddy_settype(room_elt->data, ROSTER_TYPE_ROOM);
dcb99f0b5aaa Small MUC invitation improvement
Mikael Berthe <mikael@lilotux.net>
parents: 1236
diff changeset
651
1236
f7b35b1c343d Fix a roster bug when receiving a MUC invitation
Mikael Berthe <mikael@lilotux.net>
parents: 1215
diff changeset
652 g_free(barejid);
1128
ac9c89f6cb51 Support for invitations to muc rooms
misc@mandriva.org
parents: 1104
diff changeset
653 }
ac9c89f6cb51 Support for invitations to muc rooms
misc@mandriva.org
parents: 1104
diff changeset
654
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
655
1128
ac9c89f6cb51 Support for invitations to muc rooms
misc@mandriva.org
parents: 1104
diff changeset
656 // Specific MUC message handling (for example invitation processing)
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
657 static void got_muc_message(const char *from, LmMessageNode *x)
1128
ac9c89f6cb51 Support for invitations to muc rooms
misc@mandriva.org
parents: 1104
diff changeset
658 {
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
659 LmMessageNode *invite = lm_message_node_get_child(x, "invite");
1128
ac9c89f6cb51 Support for invitations to muc rooms
misc@mandriva.org
parents: 1104
diff changeset
660 if (invite)
ac9c89f6cb51 Support for invitations to muc rooms
misc@mandriva.org
parents: 1104
diff changeset
661 {
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
662 const char *invite_from;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
663 const char *reason = NULL;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
664 const char *password = NULL;
1128
ac9c89f6cb51 Support for invitations to muc rooms
misc@mandriva.org
parents: 1104
diff changeset
665
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
666 invite_from = lm_message_node_get_attribute(invite, "from");
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
667 reason = lm_message_node_get_child_value(invite, "reason");
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1592
diff changeset
668 password = lm_message_node_get_child_value(invite, "password");
1128
ac9c89f6cb51 Support for invitations to muc rooms
misc@mandriva.org
parents: 1104
diff changeset
669 if (invite_from)
ac9c89f6cb51 Support for invitations to muc rooms
misc@mandriva.org
parents: 1104
diff changeset
670 got_invite(invite_from, from, reason, password);
ac9c89f6cb51 Support for invitations to muc rooms
misc@mandriva.org
parents: 1104
diff changeset
671 }
ac9c89f6cb51 Support for invitations to muc rooms
misc@mandriva.org
parents: 1104
diff changeset
672 // TODO
ac9c89f6cb51 Support for invitations to muc rooms
misc@mandriva.org
parents: 1104
diff changeset
673 // handle status code = 100 ( not anonymous )
ac9c89f6cb51 Support for invitations to muc rooms
misc@mandriva.org
parents: 1104
diff changeset
674 // handle status code = 170 ( changement de config )
ac9c89f6cb51 Support for invitations to muc rooms
misc@mandriva.org
parents: 1104
diff changeset
675 // 10.2.1 Notification of Configuration Changes
ac9c89f6cb51 Support for invitations to muc rooms
misc@mandriva.org
parents: 1104
diff changeset
676 // declined invitation
ac9c89f6cb51 Support for invitations to muc rooms
misc@mandriva.org
parents: 1104
diff changeset
677 }
ac9c89f6cb51 Support for invitations to muc rooms
misc@mandriva.org
parents: 1104
diff changeset
678