# HG changeset patch # User Mikael Berthe # Date 1134841144 -3600 # Node ID 028c01940490d8b92d609b7cfa24773797d30736 # Parent 4e882a19077d647fa418aeecac88d87f6ed3ee50 Show presence timestamps in "/info" and "/room whois" diff -r 4e882a19077d -r 028c01940490 mcabber/src/commands.c --- a/mcabber/src/commands.c Sat Dec 17 13:48:07 2005 +0100 +++ b/mcabber/src/commands.c Sat Dec 17 18:39:04 2005 +0100 @@ -907,10 +907,12 @@ gchar rprio; enum imstatus rstatus; const char *rst_msg; + time_t rst_time; rprio = buddy_getresourceprio(bud, resources->data); rstatus = buddy_getstatus(bud, resources->data); rst_msg = buddy_getstatusmsg(bud, resources->data); + rst_time = buddy_getstatustime(bud, resources->data); snprintf(buffer, 127, "Resource: [%c] (%d) %s", imstatus2char[rstatus], rprio, (char*)resources->data); @@ -919,6 +921,13 @@ snprintf(buffer, 127, "Status message: %s", rst_msg); scr_WriteIncomingMessage(jid, buffer, 0, HBB_PREFIX_INFO); } + if (rst_time) { + char tbuf[256]; + + strftime(tbuf, sizeof(tbuf), "%Y-%m-%d %H:%M:%S", localtime(&rst_time)); + snprintf(buffer, 127, "Status timestamp: %s", tbuf); + scr_WriteIncomingMessage(jid, buffer, 0, HBB_PREFIX_INFO); + } } } else { if (name) scr_LogPrint(LPRINT_NORMAL, "Name: %s", name); @@ -1506,6 +1515,7 @@ enum imstatus rstatus; enum imrole role; enum imaffiliation affil; + time_t rst_time; char *strroles[] = { "none", "moderator", "participant", "visitor" }; char *straffil[] = { "none", "owner", "admin", "member", "outcast" }; @@ -1528,6 +1538,7 @@ return; } + rst_time = buddy_getstatustime(bud, nick); rprio = buddy_getresourceprio(bud, nick); rst_msg = buddy_getstatusmsg(bud, nick); if (!rst_msg) rst_msg = ""; @@ -1544,6 +1555,14 @@ rst_msg); scr_WriteIncomingMessage(jid, buffer, 0, HBB_PREFIX_INFO); + if (rst_time) { + char tbuf[256]; + + strftime(tbuf, sizeof(tbuf), "%Y-%m-%d %H:%M:%S", localtime(&rst_time)); + snprintf(buffer, 127, "Timestamp: %s", tbuf); + scr_WriteIncomingMessage(jid, buffer, 0, HBB_PREFIX_INFO); + } + if (realjid) { snprintf(buffer, 127, "JID : <%s>", realjid); scr_WriteIncomingMessage(jid, buffer, 0, HBB_PREFIX_INFO); @@ -1555,6 +1574,7 @@ scr_WriteIncomingMessage(jid, buffer, 0, HBB_PREFIX_INFO); snprintf(buffer, 127, "Priority : %d", rprio); scr_WriteIncomingMessage(jid, buffer, 0, HBB_PREFIX_INFO); + scr_WriteIncomingMessage(jid, "End of WHOIS", 0, HBB_PREFIX_INFO); g_free(buffer); diff -r 4e882a19077d -r 028c01940490 mcabber/src/hooks.c --- a/mcabber/src/hooks.c Sat Dec 17 13:48:07 2005 +0100 +++ b/mcabber/src/hooks.c Sat Dec 17 18:39:04 2005 +0100 @@ -218,8 +218,8 @@ } } - roster_setstatus(jid, rn, prio, status, status_msg, role_none, affil_none, - NULL); + roster_setstatus(jid, rn, prio, status, status_msg, timestamp, + role_none, affil_none, NULL); buddylist_build(); scr_DrawRoster(); hlog_write_status(jid, 0, status, status_msg); diff -r 4e882a19077d -r 028c01940490 mcabber/src/jabglue.c --- a/mcabber/src/jabglue.c Sat Dec 17 13:48:07 2005 +0100 +++ b/mcabber/src/jabglue.c Sat Dec 17 18:39:04 2005 +0100 @@ -902,9 +902,27 @@ previous_state = state; } +static time_t xml_get_timestamp(xmlnode xmldata) +{ + xmlnode x; + char *p; + + x = xmlnode_get_firstchild(xmldata); + for ( ; x; x = xmlnode_get_nextsibling(x)) { + if ((p = xmlnode_get_name(x)) && !strcmp(p, "x")) + if ((p = xmlnode_get_attrib(x, "xmlns")) && !strcmp(p, NS_DELAY)) { + break; + } + } + if ((p = xmlnode_get_attrib(x, "stamp")) != NULL) + return from_iso8601(p, 1); + return 0; +} + static void handle_presence_muc(const char *from, xmlnode xmldata, const char *roomjid, const char *rname, - enum imstatus ust, char *ustmsg, char bpprio) + enum imstatus ust, char *ustmsg, + time_t usttime, char bpprio) { xmlnode y; char *p; @@ -1102,7 +1120,7 @@ // Update room member status if (rname) { gchar *mbrjid_noutf8 = from_utf8(mbjid); - roster_setstatus(roomjid, rname, bpprio, ust, ustmsg, + roster_setstatus(roomjid, rname, bpprio, ust, ustmsg, usttime, mbrole, mbaffil, mbrjid_noutf8); if (mbrjid_noutf8) g_free(mbrjid_noutf8); @@ -1122,6 +1140,7 @@ const char *rname; enum imstatus ust; char bpprio; + time_t timestamp = 0; r = jidtodisp(from); if (type && !strcmp(type, TMSG_ERROR)) { @@ -1161,18 +1180,21 @@ rname = strchr(from, '/'); if (rname) rname++; + // Timestamp? + timestamp = xml_get_timestamp(xmldata); + // Check for MUC presence packet // There can be multiple tags!! x = xmlnode_get_firstchild(xmldata); for ( ; x; x = xmlnode_get_nextsibling(x)) { if ((p = xmlnode_get_name(x)) && !strcmp(p, "x")) if ((p = xmlnode_get_attrib(x, "xmlns")) && - !strcasecmp(p, "http://jabber.org/protocol/muc#user")) + !strcmp(p, "http://jabber.org/protocol/muc#user")) break; } if (x) { // This is a MUC presence message - handle_presence_muc(from, x, r, rname, ust, ustmsg, bpprio); + handle_presence_muc(from, x, r, rname, ust, ustmsg, timestamp, bpprio); } else { // Not a MUC message, so this is a regular buddy... // Call hk_statuschange() if status has changed or if the @@ -1180,7 +1202,7 @@ const char *m = roster_getstatusmsg(r, rname); if ((ust != roster_getstatus(r, rname)) || (!ustmsg && m && m[0]) || (ustmsg && (!m || strcmp(ustmsg, m)))) - hk_statuschange(r, rname, bpprio, 0, ust, ustmsg); + hk_statuschange(r, rname, bpprio, timestamp, ust, ustmsg); } g_free(r); @@ -1249,8 +1271,7 @@ x = xmlnode_get_firstchild(xmldata); for ( ; x; x = xmlnode_get_nextsibling(x)) { if ((p = xmlnode_get_name(x)) && !strcmp(p, "x")) - if ((p = xmlnode_get_attrib(x, "xmlns")) && - !strcasecmp(p, "jabber:x:encrypted")) + if ((p = xmlnode_get_attrib(x, "xmlns")) && !strcmp(p, NS_ENCRYPTED)) if ((p = xmlnode_get_data(x)) != NULL) { enc = p; break; @@ -1258,10 +1279,7 @@ } // Timestamp? - if ((x = xmlnode_get_tag(xmldata, "x")) != NULL) { - if ((p = xmlnode_get_attrib(x, "stamp")) != NULL) - timestamp = from_iso8601(p, 1); - } + timestamp = xml_get_timestamp(xmldata); if (type && !strcmp(type, TMSG_ERROR)) { if ((x = xmlnode_get_tag(xmldata, TMSG_ERROR)) != NULL) diff -r 4e882a19077d -r 028c01940490 mcabber/src/roster.c --- a/mcabber/src/roster.c Sat Dec 17 13:48:07 2005 +0100 +++ b/mcabber/src/roster.c Sat Dec 17 18:39:04 2005 +0100 @@ -47,6 +47,7 @@ gchar prio; enum imstatus status; gchar *status_msg; + time_t status_timestamp; enum imrole role; enum imaffiliation affil; gchar *realjid; /* for chatrooms, if buddy's real jid is known */ @@ -404,6 +405,7 @@ // Note: resname, role, affil and realjid are for room members only void roster_setstatus(const char *jid, const char *resname, gchar prio, enum imstatus bstat, const char *status_msg, + time_t status_time, enum imrole role, enum imaffiliation affil, const char *realjid) { @@ -438,6 +440,9 @@ } if (status_msg) p_res->status_msg = g_strdup(status_msg); + if (!status_time) + time(&status_time); + p_res->status_timestamp = status_time; p_res->role = role; p_res->affil = affil; @@ -912,6 +917,15 @@ return NULL; } +time_t buddy_getstatustime(gpointer rosterdata, const char *resname) +{ + roster *roster_usr = rosterdata; + res *p_res = get_resource(roster_usr, resname); + if (p_res) + return p_res->status_timestamp; + return 0; +} + gchar buddy_getresourceprio(gpointer rosterdata, const char *resname) { roster *roster_usr = rosterdata; diff -r 4e882a19077d -r 028c01940490 mcabber/src/roster.h --- a/mcabber/src/roster.h Sat Dec 17 13:48:07 2005 +0100 +++ b/mcabber/src/roster.h Sat Dec 17 18:39:04 2005 +0100 @@ -2,6 +2,7 @@ #define __ROSTER_H__ 1 #include +#include enum imstatus { offline, @@ -87,6 +88,7 @@ void roster_free(void); void roster_setstatus(const char *jid, const char *resname, gchar prio, enum imstatus bstat, const char *status_msg, + time_t timestamp, enum imrole role, enum imaffiliation affil, const char *realjid); void roster_setflags(const char *jid, guint flags, guint value); @@ -117,6 +119,7 @@ gpointer buddy_getgroup(gpointer rosterdata); enum imstatus buddy_getstatus(gpointer rosterdata, const char *resname); const char *buddy_getstatusmsg(gpointer rosterdata, const char *resname); +time_t buddy_getstatustime(gpointer rosterdata, const char *resname); gchar buddy_getresourceprio(gpointer rosterdata, const char *resname); int buddy_isresource(gpointer rosterdata); GSList *buddy_getresources(gpointer rosterdata);