# HG changeset patch # User Mikael Berthe # Date 1146913144 -7200 # Node ID 915a7f17474ad32044d3a03bd5572ecd5c84a9fc # Parent f74c5c6d2c24be44493703d18b09bd9780391cd7 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. diff -r f74c5c6d2c24 -r 915a7f17474a mcabber/src/commands.c --- 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; diff -r f74c5c6d2c24 -r 915a7f17474a mcabber/src/roster.c --- 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) diff -r f74c5c6d2c24 -r 915a7f17474a mcabber/src/screen.c --- 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)); }