changeset 843:915a7f17474a

Remember the status message when a buddy goes offline This is useful when people use a status message when leaving, or with some Jabber transports.
author Mikael Berthe <mikael@lilotux.net>
date Sat, 06 May 2006 12:59:04 +0200
parents f74c5c6d2c24
children 5002948c7360
files mcabber/src/commands.c mcabber/src/roster.c mcabber/src/screen.c
diffstat 3 files changed, 31 insertions(+), 10 deletions(-) [+]
line wrap: on
line diff
--- a/mcabber/src/commands.c	Sat May 06 00:00:46 2006 +0200
+++ b/mcabber/src/commands.c	Sat May 06 12:59:04 2006 +0200
@@ -1084,6 +1084,14 @@
     scr_WriteIncomingMessage(jid, buffer, 0, HBB_PREFIX_INFO);
 
     resources = buddy_getresources(bud);
+    if (!resources && type == ROSTER_TYPE_USER) {
+      // No resource; display last status message, if any.
+      const char *rst_msg = buddy_getstatusmsg(bud, "");
+      if (rst_msg) {
+        snprintf(buffer, 4095, "Last status message: %s", rst_msg);
+        scr_WriteIncomingMessage(jid, buffer, 0, HBB_PREFIX_INFO);
+      }
+    }
     for ( ; resources ; resources = g_slist_next(resources) ) {
       gchar rprio;
       enum imstatus rstatus;
--- a/mcabber/src/roster.c	Sat May 06 00:00:46 2006 +0200
+++ b/mcabber/src/roster.c	Sat May 06 12:59:04 2006 +0200
@@ -68,6 +68,9 @@
   gchar *topic;
   guint8 inside_room;
 
+  /* To keep track of last status message */
+  gchar *offline_status_message;
+
   /* Flag used for the UI */
   guint flags;
 
@@ -184,6 +187,14 @@
   if (!p_res_elt) return;   // Resource not found
 
   p_res = p_res_elt->data;
+
+  // Keep a copy of the status message when a buddy goes offline
+  if (g_slist_length(rost->resource) == 1) {
+    g_free(rost->offline_status_message);
+    rost->offline_status_message = p_res->status_msg;
+    p_res->status_msg = NULL;
+  }
+
   // Free allocations and delete resource node
   g_free(p_res->name);
   g_free(p_res->status_msg);
@@ -364,6 +375,7 @@
   g_free((gchar*)roster_usr->name);
   g_free((gchar*)roster_usr->nickname);
   g_free((gchar*)roster_usr->topic);
+  g_free((gchar*)roster_usr->offline_status_message);
   free_all_resources(&roster_usr->resource);
   g_free(roster_usr);
 
@@ -406,6 +418,7 @@
       g_free((gchar*)roster_usr->name);
       g_free((gchar*)roster_usr->nickname);
       g_free((gchar*)roster_usr->topic);
+      g_free((gchar*)roster_usr->offline_status_message);
       free_all_resources(&roster_usr->resource);
       g_free(roster_usr);
       sl_usr = g_slist_next(sl_usr);
@@ -452,12 +465,6 @@
 
   roster_usr = (roster*)sl_user->data;
 
-  // If bstat is offline, we MUST delete the resource, actually
-  if (bstat == offline) {
-    del_resource(roster_usr, resname);
-    return;
-  }
-
   // New or updated resource
   p_res = get_or_add_resource(roster_usr, resname, prio);
   p_res->prio = prio;
@@ -481,6 +488,12 @@
   }
   if (realjid)
     p_res->realjid = g_strdup(realjid);
+
+  // If bstat is offline, we MUST delete the resource, actually
+  if (bstat == offline) {
+    del_resource(roster_usr, resname);
+    return;
+  }
 }
 
 //  roster_setflags()
@@ -615,7 +628,7 @@
   p_res = get_resource(roster_usr, resname);
   if (p_res)
     return p_res->status_msg;
-  return NULL;
+  return roster_usr->offline_status_message;
 }
 
 guint roster_gettype(const char *jid)
@@ -973,7 +986,7 @@
   res *p_res = get_resource(roster_usr, resname);
   if (p_res)
     return p_res->status_msg;
-  return NULL;
+  return roster_usr->offline_status_message;
 }
 
 time_t buddy_getstatustime(gpointer rosterdata, const char *resname)
--- a/mcabber/src/screen.c	Sat May 06 00:00:46 2006 +0200
+++ b/mcabber/src/screen.c	Sat May 06 12:59:04 2006 +0200
@@ -891,8 +891,8 @@
   // No status message for groups & MUC rooms
   if (!isgrp && !ismuc) {
     GSList *resources = buddy_getresources(BUDDATA(current_buddy));
-    if (resources)
-      msg = buddy_getstatusmsg(BUDDATA(current_buddy), resources->data);
+    msg = buddy_getstatusmsg(BUDDATA(current_buddy),
+                             resources ? resources->data : "");
   } else if (ismuc) {
     msg = buddy_gettopic(BUDDATA(current_buddy));
   }