changeset 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
files mcabber/src/jabglue.c mcabber/src/roster.c mcabber/src/roster.h
diffstat 3 files changed, 63 insertions(+), 4 deletions(-) [+]
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...
--- a/mcabber/src/roster.c	Tue Nov 22 23:36:12 2005 +0100
+++ b/mcabber/src/roster.c	Thu Nov 24 00:03:37 2005 +0100
@@ -774,7 +774,7 @@
 {
   roster *roster_usr = rosterdata;
 
-  if (!roster_usr->type & ROSTER_TYPE_ROOM) return;
+  if (!(roster_usr->type & ROSTER_TYPE_ROOM)) return;
 
   if (roster_usr->nickname) {
     g_free((gchar*)roster_usr->nickname);
@@ -964,6 +964,33 @@
   }
 }
 
+//  foreach_buddy(roster_type, pfunction, param)
+// Call pfunction(buddy, param) for each buddy from the roster with
+// type matching roster_type.
+void foreach_buddy(guint roster_type,
+                   void (*pfunc)(gpointer rosterdata, void *param),
+                   void *param)
+{
+  GSList *sl_roster_elt = groups;
+  roster *roster_elt;
+  GSList *sl_roster_usrelt;
+  roster *roster_usrelt;
+
+  while (sl_roster_elt) {       // group list loop
+    roster_elt = (roster*) sl_roster_elt->data;
+    sl_roster_usrelt = roster_elt->list;
+    while (sl_roster_usrelt) {  // user list loop
+      roster_usrelt = (roster*) sl_roster_usrelt->data;
+
+      if (roster_usrelt->type & roster_type)
+        pfunc(roster_usrelt, param);
+
+      sl_roster_usrelt = g_slist_next(sl_roster_usrelt);
+    }
+    sl_roster_elt = g_slist_next(sl_roster_elt);
+  }
+}
+
 //  compl_list(type)
 // Returns a list of jid's or groups.  (For commands completion)
 // type: ROSTER_TYPE_USER (jid's) or ROSTER_TYPE_GROUP (group names)
@@ -1011,4 +1038,3 @@
 
   return unread_list->data;
 }
-
--- a/mcabber/src/roster.h	Tue Nov 22 23:36:12 2005 +0100
+++ b/mcabber/src/roster.h	Thu Nov 24 00:03:37 2005 +0100
@@ -88,6 +88,9 @@
 guint   buddy_getflags(gpointer rosterdata);
 GList  *buddy_search_jid(char *jid);
 GList  *buddy_search(char *string);
+void    foreach_buddy(guint roster_type,
+                      void (*pfunc)(gpointer rosterdata, void *param),
+                      void *param);
 gpointer unread_msg(gpointer rosterdata);
 
 GSList *compl_list(guint type);