# HG changeset patch # User Mikael Berthe # Date 1163451498 -3600 # Node ID 579299b1c9b29c7e9ec028527231f0f5299d72cf # Parent 99c5278bf6b8346fc0354032012fbd29deba5a74 Add /request last diff -r 99c5278bf6b8 -r 579299b1c9b2 mcabber/src/commands.c --- a/mcabber/src/commands.c Sun Nov 12 22:25:14 2006 +0100 +++ b/mcabber/src/commands.c Mon Nov 13 21:58:18 2006 +0100 @@ -212,6 +212,7 @@ compl_add_category_word(COMPL_AUTH, "request_unsubscribe"); // Request (query) category + compl_add_category_word(COMPL_REQUEST, "last"); compl_add_category_word(COMPL_REQUEST, "time"); compl_add_category_word(COMPL_REQUEST, "vcard"); compl_add_category_word(COMPL_REQUEST, "version"); @@ -2248,6 +2249,8 @@ numtype = iqreq_version; else if (!strcasecmp(type, "time")) numtype = iqreq_time; + else if (!strcasecmp(type, "last")) + numtype = iqreq_last; else if (!strcasecmp(type, "vcard")) numtype = iqreq_vcard; else if (!strcasecmp(type, "show_list")) { @@ -2260,7 +2263,7 @@ if (!type || !numtype) { scr_LogPrint(LPRINT_NORMAL, - "Please specify a query type (version, time)."); + "Please specify a query type (version, time...)."); free_arg_lst(paramlst); return; } @@ -2293,6 +2296,7 @@ switch (numtype) { case iqreq_version: case iqreq_time: + case iqreq_last: case iqreq_vcard: jb_request(jid, numtype); break; diff -r 99c5278bf6b8 -r 579299b1c9b2 mcabber/src/jab_iq.c --- a/mcabber/src/jab_iq.c Sun Nov 12 22:25:14 2006 +0100 +++ b/mcabber/src/jab_iq.c Mon Nov 13 21:58:18 2006 +0100 @@ -369,6 +369,79 @@ jab_send(jc, iqn->xmldata); } +static void iqscallback_last(eviqs *iqp, xmlnode xml_result, guint iqcontext) +{ + xmlnode ansqry; + char *p; + char *bjid; + char *buf; + + // Leave now if we cannot process xml_result + if (!xml_result || iqcontext) return; + + ansqry = xmlnode_get_tag(xml_result, "query"); + if (!ansqry) { + scr_LogPrint(LPRINT_LOGNORM, "Invalid IQ:last result!"); + return; + } + // Display IQ result sender... + p = xmlnode_get_attrib(xml_result, "from"); + if (!p) { + scr_LogPrint(LPRINT_LOGNORM, "Invalid IQ:last result (no sender name)."); + return; + } + bjid = p; + + buf = g_strdup_printf("Received IQ:last result from <%s>", bjid); + scr_LogPrint(LPRINT_LOGNORM, "%s", buf); + + // bjid should now really be the "bare JID", let's strip the resource + p = strchr(bjid, JID_RESOURCE_SEPARATOR); + if (p) *p = '\0'; + + scr_WriteIncomingMessage(bjid, buf, 0, HBB_PREFIX_INFO); + g_free(buf); + + // Get result data... + p = xmlnode_get_attrib(ansqry, "seconds"); + if (p) { + long int s; + GString *sbuf; + sbuf = g_string_new("Idle time: "); + s = atol(p); + // Days + if (s > 86400L) { + g_string_append_printf(sbuf, "%ldd ", s/86400L); + s %= 86400L; + } + // hh:mm:ss + g_string_append_printf(sbuf, "%02ld:", s/3600L); + s %= 3600L; + g_string_append_printf(sbuf, "%02ld:%02ld", s/60L, s%60L); + scr_WriteIncomingMessage(bjid, sbuf->str, 0, HBB_PREFIX_NONE); + g_string_free(sbuf, TRUE); + } else { + scr_WriteIncomingMessage(bjid, "No idle time reported.", + 0, HBB_PREFIX_NONE); + } + p = xmlnode_get_data(ansqry); + if (p) { + buf = g_strdup_printf("Status message: %s", p); + scr_WriteIncomingMessage(bjid, buf, 0, HBB_PREFIX_INFO); + g_free(buf); + } +} + +void request_last(const char *fulljid) +{ + eviqs *iqn; + + iqn = iqs_new(JPACKET__GET, NS_LAST, "last", IQS_DEFAULT_TIMEOUT); + xmlnode_put_attrib(iqn->xmldata, "to", fulljid); + iqn->callback = &iqscallback_last; + jab_send(jc, iqn->xmldata); +} + static void display_vcard_item(const char *bjid, const char *label, enum vcard_attr vcard_attrib, const char *text) { diff -r 99c5278bf6b8 -r 579299b1c9b2 mcabber/src/jab_priv.h --- a/mcabber/src/jab_priv.h Sun Nov 12 22:25:14 2006 +0100 +++ b/mcabber/src/jab_priv.h Mon Nov 13 21:58:18 2006 +0100 @@ -44,6 +44,7 @@ void iqscallback_auth(eviqs *iqp, xmlnode xml_result); void request_version(const char *fulljid); void request_time(const char *fulljid); +void request_last(const char *fulljid); void request_vcard(const char *barejid); void send_storage_bookmarks(void); diff -r 99c5278bf6b8 -r 579299b1c9b2 mcabber/src/jabglue.c --- a/mcabber/src/jabglue.c Sun Nov 12 22:25:14 2006 +0100 +++ b/mcabber/src/jabglue.c Mon Nov 13 21:58:18 2006 +0100 @@ -943,6 +943,9 @@ } else if (reqtype == iqreq_time) { request_fn = &request_time; strreqtype = "time"; + } else if (reqtype == iqreq_last) { + request_fn = &request_last; + strreqtype = "last"; } else if (reqtype == iqreq_vcard) { // Special case } else diff -r 99c5278bf6b8 -r 579299b1c9b2 mcabber/src/jabglue.h --- a/mcabber/src/jabglue.h Sun Nov 12 22:25:14 2006 +0100 +++ b/mcabber/src/jabglue.h Mon Nov 13 21:58:18 2006 +0100 @@ -31,6 +31,7 @@ iqreq_none, iqreq_version, iqreq_time, + iqreq_last, iqreq_vcard };