diff --git a/src/core/handlers.c b/src/core/handlers.c index 99cc949..5c7d7c6 100644 --- a/src/core/handlers.c +++ b/src/core/handlers.c @@ -145,6 +145,29 @@ return 1; } +/* automatically accept subscription "friend" requests (show online status, avatar...) */ +int subscription_handler(xmpp_conn_t * const conn, xmpp_stanza_t * const stanza, void * const userdata) +{ + const char *from; + xmpp_stanza_t *presence; + xmpp_ctx_t *ctx = (xmpp_ctx_t*)userdata; + + /* whom we received this sub request from */ + from = xmpp_stanza_get_from(stanza); + + /* build the reply */ + presence = xmpp_stanza_new(ctx); + xmpp_stanza_set_name(presence, "presence"); + xmpp_stanza_set_to(presence, from); + xmpp_stanza_set_type(presence, "subscribed"); + + /* send and free */ + xmpp_send(conn, presence); + xmpp_stanza_release(presence); + + return 1; +} + /* define a handler for connection events */ void conn_handler(xmpp_conn_t * const conn, const xmpp_conn_event_t status, const int error, xmpp_stream_error_t * const stream_error, @@ -156,8 +179,10 @@ xmpp_stanza_t *pres; char *avatarID; fprintf(stderr, "DEBUG: connected\n"); + /* match: namespace, stanza name, type */ xmpp_handler_add(conn,version_handler, "jabber:iq:version", "iq", NULL, ctx); xmpp_handler_add(conn,message_handler, NULL, "message", NULL, ctx); + xmpp_handler_add(conn,subscription_handler, NULL, "presence", "subscribe", ctx); /* set avatar data */ avatarID = bot_xmpp_set_avatar_pubsub(bot_get_ctx(), true, NULL); diff --git a/src/core/handlers.h b/src/core/handlers.h index b7977cf..a60807f 100644 --- a/src/core/handlers.h +++ b/src/core/handlers.h @@ -25,6 +25,9 @@ /* react and respond to incoming messages */ int message_handler(xmpp_conn_t * const conn, xmpp_stanza_t * const stanza, void * const userdata); +/* automatically accept subscription "friend" requests (show online status, avatar...) */ +int subscription_handler(xmpp_conn_t * const conn, xmpp_stanza_t * const stanza, void * const userdata); + /* define a handler for connection events */ void conn_handler(xmpp_conn_t * const conn, const xmpp_conn_event_t status, const int error, xmpp_stream_error_t * const stream_error, void * const userdata);