diff 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
line wrap: on
line diff
--- a/mcabber/src/jabglue.c	Tue Nov 22 23:36:12 2005 +0100
+++ b/mcabber/src/jabglue.c	Thu Nov 24 00:03:37 2005 +0100
@@ -57,6 +57,11 @@
   STATE_LOGGED
 } jstate;
 
+struct T_presence {
+  enum imstatus st;
+  const char *msg;
+};
+
 
 void statehandler(jconn, int);
 void packethandler(jconn, jpacket);
@@ -263,11 +268,32 @@
   return mystatusmsg;
 }
 
+static void roompresence(gpointer room, void *presencedata)
+{
+  const char *jid;
+  const char *nickname;
+  char *to;
+  struct T_presence *pres = presencedata;
+
+  if (!buddy_getresources(room)) // FIXME: that's a memory leak
+    return;
+
+  jid = buddy_getjid(room);
+  if (!jid) return;
+  nickname = buddy_getnickname(room);
+  if (!nickname) return;
+
+  to = g_strdup_printf("%s/%s", jid, nickname);
+  jb_setstatus(pres->st, to, pres->msg);
+  g_free(to);
+}
+
 void jb_setstatus(enum imstatus st, const char *recipient, const char *msg)
 {
   xmlnode x;
   gchar *utf8_msg;
   unsigned int prio;
+  struct T_presence room_presence;
 
   if (!online) return;
 
@@ -347,8 +373,12 @@
   // If we didn't change our _global_ status, we are done
   if (recipient) return;
 
-  // Buddy per buddy invisibility handling
-  //sendvisibility();
+  // Send presence to chatrooms
+  if (st != invisible) {
+    room_presence.st = st;
+    room_presence.msg = msg;
+    foreach_buddy(ROSTER_TYPE_ROOM, &roompresence, &room_presence);
+  }
 
   // We'll need to update the roster if we switch to/from offline because
   // we don't know the presences of buddies when offline...