changeset 625:028c01940490

Show presence timestamps in "/info" and "/room whois"
author Mikael Berthe <mikael@lilotux.net>
date Sat, 17 Dec 2005 18:39:04 +0100
parents 4e882a19077d
children b75f4105ce32
files mcabber/src/commands.c mcabber/src/hooks.c mcabber/src/jabglue.c mcabber/src/roster.c mcabber/src/roster.h
diffstat 5 files changed, 68 insertions(+), 13 deletions(-) [+]
line wrap: on
line diff
--- 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);
--- 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);
--- 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 <x> 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)
--- 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;
--- 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 <glib.h>
+#include <time.h>
 
 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);