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