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.
--- 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));
}