comparison mcabber/src/jabglue.c @ 532:2ac8d8e49e81

Send status changes to chatrooms
author Mikael Berthe <mikael@lilotux.net>
date Thu, 24 Nov 2005 00:03:37 +0100
parents aee9a279a0f3
children c478e8f7f074
comparison
equal deleted inserted replaced
531:aee9a279a0f3 532:2ac8d8e49e81
55 STATE_GETAUTH, 55 STATE_GETAUTH,
56 STATE_SENDAUTH, 56 STATE_SENDAUTH,
57 STATE_LOGGED 57 STATE_LOGGED
58 } jstate; 58 } jstate;
59 59
60 struct T_presence {
61 enum imstatus st;
62 const char *msg;
63 };
64
60 65
61 void statehandler(jconn, int); 66 void statehandler(jconn, int);
62 void packethandler(jconn, jpacket); 67 void packethandler(jconn, jpacket);
63 68
64 static void logger(jconn j, int io, const char *buf) 69 static void logger(jconn j, int io, const char *buf)
261 inline const char *jb_getstatusmsg() 266 inline const char *jb_getstatusmsg()
262 { 267 {
263 return mystatusmsg; 268 return mystatusmsg;
264 } 269 }
265 270
271 static void roompresence(gpointer room, void *presencedata)
272 {
273 const char *jid;
274 const char *nickname;
275 char *to;
276 struct T_presence *pres = presencedata;
277
278 if (!buddy_getresources(room)) // FIXME: that's a memory leak
279 return;
280
281 jid = buddy_getjid(room);
282 if (!jid) return;
283 nickname = buddy_getnickname(room);
284 if (!nickname) return;
285
286 to = g_strdup_printf("%s/%s", jid, nickname);
287 jb_setstatus(pres->st, to, pres->msg);
288 g_free(to);
289 }
290
266 void jb_setstatus(enum imstatus st, const char *recipient, const char *msg) 291 void jb_setstatus(enum imstatus st, const char *recipient, const char *msg)
267 { 292 {
268 xmlnode x; 293 xmlnode x;
269 gchar *utf8_msg; 294 gchar *utf8_msg;
270 unsigned int prio; 295 unsigned int prio;
296 struct T_presence room_presence;
271 297
272 if (!online) return; 298 if (!online) return;
273 299
274 x = jutil_presnew(JPACKET__UNKNOWN, 0, 0); 300 x = jutil_presnew(JPACKET__UNKNOWN, 0, 0);
275 301
345 xmlnode_free(x); 371 xmlnode_free(x);
346 372
347 // If we didn't change our _global_ status, we are done 373 // If we didn't change our _global_ status, we are done
348 if (recipient) return; 374 if (recipient) return;
349 375
350 // Buddy per buddy invisibility handling 376 // Send presence to chatrooms
351 //sendvisibility(); 377 if (st != invisible) {
378 room_presence.st = st;
379 room_presence.msg = msg;
380 foreach_buddy(ROSTER_TYPE_ROOM, &roompresence, &room_presence);
381 }
352 382
353 // We'll need to update the roster if we switch to/from offline because 383 // We'll need to update the roster if we switch to/from offline because
354 // we don't know the presences of buddies when offline... 384 // we don't know the presences of buddies when offline...
355 if (mystatus == offline || st == offline) 385 if (mystatus == offline || st == offline)
356 update_roster = TRUE; 386 update_roster = TRUE;