[JDEV] message ack jsm
Tom Waters
tom_waters at mac.com
Wed Jul 10 23:16:56 CDT 2002
with a ton of help from rob, i wrote my first jsm tonight...
i've been wanting to get acks from my messages... ... you get a nak in
the form of a message type='error' when the user you send the message to
doesn't exist, but there's no positive acknowledge, (other than the
absence of an error!).
this jsm works for me...
/*
* Jabber JSM message ack module
*
* Copyright (C) 2002 Tom Waters <tom_waters at mac.com>
* Released under the LGPL v2. See http://www.gnu.org/copyleft/lgpl.html
*/
/* $Id: mod_message_ack.c,v 1.0 2002/07/10 17:20:32 waters Exp $ */
/*
* Installation:
*
* 1. Place mod_message_ack.c in jabber/jsm/modules
* 2. Add "mod_message_ack.o" to jsm_modules_OBJECTS in
jabber/jsm/modules/Makefile
* 3. Add "modules/mod_message_ack.o" to jsm_EXOBJECTS in
jabber/jsm/Makefile
* 5. "make all" in jabber/jsm, or (re)compile entire server
* 6. Add <mod_message_ack>./jsm/jsm.so</mod_message_ack> (or similar)
to the
* <load main="jsm"> section of jabber.xml. I add it just before
<mod_filter>
*/
/*
* Usage:
*
* You send something like this:
*
* <message type='chat' to='bob at jabber.example.com'>
* <body>hello</body>
* <ack xmlns='message:ack' id=42/>
* </message>
*
* Server will respond with something like:
*
* <message type='chat' to='you at jabber.example.com'
from='bob at jabber.example.com'>
* <body>hello</body>
* <ack xmlns='message:ack' id=42/>
* </message>
*
* And bob at jabber.example.com will get this:
*
* <message type='chat' to='bob at jabber.example.com'
from='you at jabber.example.com'>
* <body>hello</body>
* </message>
*
* If the recipient doesn't exist, you will not get an ack, you'll get
an error.
*/
#include <jsm.h>
#define NS_MESSAGE_ACK "message:ack"
mreturn mod_message_ack_handler(mapi m, void *arg) {
xmlnode ack;
jpacket ret;
if(m->packet->type != JPACKET_MESSAGE)
return M_IGNORE;
ack = xmlnode_get_tag(m->packet->x, "ack");
if (ack == NULL || !NSCHECK(ack, NS_MESSAGE_ACK))
return M_PASS;
if (xmlnode_get_attrib(ack, "delivered") != NULL)
return M_PASS;
if (js_user(m->si, m->packet->to, NULL) == NULL) {
log_debug("mod_message_ack","not sending ack because %s doesn't
exist",
jid_full(m->packet->to));
return M_PASS;
}
log_debug("mod_message_ack","sending message ack to %s from %s",
jid_user(m->packet->from), jid_user(m->packet->to));
ret = jpacket_new(xmlnode_dup(m->packet->x));
jutil_tofrom(ret->x);
xmlnode_put_attrib(xmlnode_get_tag(ret->x, "ack"), "delivered", "yes");
jpacket_reset(ret);
js_deliver(m->si, ret);
xmlnode_hide(ack);
return M_PASS;
}
void mod_message_ack(jsmi si) {
js_mapi_register(si, e_SERVER, mod_message_ack_handler, NULL);
js_mapi_register(si, e_DELIVER, mod_message_ack_handler, NULL);
js_mapi_register(si, e_OFFLINE, mod_message_ack_handler, NULL);
}
More information about the JDev
mailing list