about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--src/plugins/c_plugins.c45
-rw-r--r--src/plugins/c_plugins.h5
-rw-r--r--src/plugins/plugins.c54
-rw-r--r--src/plugins/plugins.h10
-rw-r--r--src/plugins/python_plugins.c87
-rw-r--r--src/plugins/python_plugins.h3
-rw-r--r--src/xmpp/bookmark.c18
-rw-r--r--src/xmpp/iq.c314
-rw-r--r--src/xmpp/message.c32
-rw-r--r--src/xmpp/presence.c35
-rw-r--r--src/xmpp/roster.c20
11 files changed, 490 insertions, 133 deletions
diff --git a/src/plugins/c_plugins.c b/src/plugins/c_plugins.c
index 167c6c01..b9452206 100644
--- a/src/plugins/c_plugins.c
+++ b/src/plugins/c_plugins.c
@@ -98,8 +98,11 @@ c_plugin_create(const char * const filename)
     plugin->pre_priv_message_send = c_pre_priv_message_send_hook;
     plugin->post_priv_message_send = c_post_priv_message_send_hook;
     plugin->on_message_stanza_send = c_on_message_stanza_send_hook;
+    plugin->on_message_stanza_receive = c_on_message_stanza_receive_hook;
     plugin->on_presence_stanza_send = c_on_presence_stanza_send_hook;
+    plugin->on_presence_stanza_receive = c_on_presence_stanza_receive_hook;
     plugin->on_iq_stanza_send = c_on_iq_stanza_send_hook;
+    plugin->on_iq_stanza_receive = c_on_iq_stanza_receive_hook;
 
     g_string_free(path, TRUE);
     g_free(module_name);
@@ -364,6 +367,20 @@ c_on_message_stanza_send_hook(ProfPlugin *plugin, const char * const text)
     return func (text);
 }
 
+gboolean
+c_on_message_stanza_receive_hook(ProfPlugin *plugin, const char *const text)
+{
+    void * f = NULL;
+    int (*func)(const char * const __text);
+    assert (plugin && plugin->module);
+
+    if (NULL == (f = dlsym (plugin->module, "prof_on_message_stanza_receive")))
+        return TRUE;
+
+    func = (int (*)(const char * const)) f;
+    return func (text);
+}
+
 char *
 c_on_presence_stanza_send_hook(ProfPlugin *plugin, const char * const text)
 {
@@ -378,6 +395,20 @@ c_on_presence_stanza_send_hook(ProfPlugin *plugin, const char * const text)
     return func (text);
 }
 
+gboolean
+c_on_presence_stanza_receive_hook(ProfPlugin *plugin, const char *const text)
+{
+    void * f = NULL;
+    int (*func)(const char * const __text);
+    assert (plugin && plugin->module);
+
+    if (NULL == (f = dlsym (plugin->module, "prof_on_presence_stanza_receive")))
+        return TRUE;
+
+    func = (int (*)(const char * const)) f;
+    return func (text);
+}
+
 char *
 c_on_iq_stanza_send_hook(ProfPlugin *plugin, const char * const text)
 {
@@ -392,6 +423,20 @@ c_on_iq_stanza_send_hook(ProfPlugin *plugin, const char * const text)
     return func (text);
 }
 
+gboolean
+c_on_iq_stanza_receive_hook(ProfPlugin *plugin, const char *const text)
+{
+    void * f = NULL;
+    int (*func)(const char * const __text);
+    assert (plugin && plugin->module);
+
+    if (NULL == (f = dlsym (plugin->module, "prof_on_iq_stanza_receive")))
+        return TRUE;
+
+    func = (int (*)(const char * const)) f;
+    return func (text);
+}
+
 void
 c_plugin_destroy(ProfPlugin *plugin)
 {
diff --git a/src/plugins/c_plugins.h b/src/plugins/c_plugins.h
index 4ddbee89..86faef61 100644
--- a/src/plugins/c_plugins.h
+++ b/src/plugins/c_plugins.h
@@ -65,7 +65,12 @@ char* c_pre_priv_message_send_hook(ProfPlugin *plugin, const char * const room,
 void  c_post_priv_message_send_hook(ProfPlugin *plugin, const char * const room, const char * const nick, const char * const message);
 
 char* c_on_message_stanza_send_hook(ProfPlugin *plugin, const char *const text);
+gboolean c_on_message_stanza_receive_hook(ProfPlugin *plugin, const char *const text);
+
 char* c_on_presence_stanza_send_hook(ProfPlugin *plugin, const char *const text);
+gboolean c_on_presence_stanza_receive_hook(ProfPlugin *plugin, const char *const text);
+
 char* c_on_iq_stanza_send_hook(ProfPlugin *plugin, const char *const text);
+gboolean c_on_iq_stanza_receive_hook(ProfPlugin *plugin, const char *const text);
 
 #endif
diff --git a/src/plugins/plugins.c b/src/plugins/plugins.c
index 9ec3f5c7..eaee2b05 100644
--- a/src/plugins/plugins.c
+++ b/src/plugins/plugins.c
@@ -430,6 +430,24 @@ plugins_on_message_stanza_send(const char *const text)
     return curr_stanza;
 }
 
+gboolean
+plugins_on_message_stanza_receive(const char *const text)
+{
+    gboolean cont = TRUE;
+
+    GSList *curr = plugins;
+    while (curr) {
+        ProfPlugin *plugin = curr->data;
+        gboolean res = plugin->on_message_stanza_receive(plugin, text);
+        if (res == FALSE) {
+            cont = FALSE;
+        }
+        curr = g_slist_next(curr);
+    }
+
+    return cont;
+}
+
 char*
 plugins_on_presence_stanza_send(const char *const text)
 {
@@ -451,6 +469,24 @@ plugins_on_presence_stanza_send(const char *const text)
     return curr_stanza;
 }
 
+gboolean
+plugins_on_presence_stanza_receive(const char *const text)
+{
+    gboolean cont = TRUE;
+
+    GSList *curr = plugins;
+    while (curr) {
+        ProfPlugin *plugin = curr->data;
+        gboolean res = plugin->on_presence_stanza_receive(plugin, text);
+        if (res == FALSE) {
+            cont = FALSE;
+        }
+        curr = g_slist_next(curr);
+    }
+
+    return cont;
+}
+
 char*
 plugins_on_iq_stanza_send(const char *const text)
 {
@@ -472,6 +508,24 @@ plugins_on_iq_stanza_send(const char *const text)
     return curr_stanza;
 }
 
+gboolean
+plugins_on_iq_stanza_receive(const char *const text)
+{
+    gboolean cont = TRUE;
+
+    GSList *curr = plugins;
+    while (curr) {
+        ProfPlugin *plugin = curr->data;
+        gboolean res = plugin->on_iq_stanza_receive(plugin, text);
+        if (res == FALSE) {
+            cont = FALSE;
+        }
+        curr = g_slist_next(curr);
+    }
+
+    return cont;
+}
+
 void
 plugins_shutdown(void)
 {
diff --git a/src/plugins/plugins.h b/src/plugins/plugins.h
index 0e5fa823..4ff3fdc8 100644
--- a/src/plugins/plugins.h
+++ b/src/plugins/plugins.h
@@ -71,8 +71,13 @@ typedef struct prof_plugin_t {
     void  (*post_priv_message_send)(struct prof_plugin_t* plugin, const char * const room, const char * const nick, const char * const message);
 
     char* (*on_message_stanza_send)(struct prof_plugin_t* plugin, const char *const text);
+    gboolean (*on_message_stanza_receive)(struct prof_plugin_t* plugin, const char *const text);
+
     char* (*on_presence_stanza_send)(struct prof_plugin_t* plugin, const char *const text);
+    gboolean (*on_presence_stanza_receive)(struct prof_plugin_t* plugin, const char *const text);
+
     char* (*on_iq_stanza_send)(struct prof_plugin_t* plugin, const char *const text);
+    gboolean (*on_iq_stanza_receive)(struct prof_plugin_t* plugin, const char *const text);
 } ProfPlugin;
 
 void plugins_init(void);
@@ -106,8 +111,13 @@ void  plugins_post_priv_message_send(const char * const jid, const char * const
 void plugins_win_process_line(char *win, const char * const line);
 
 char* plugins_on_message_stanza_send(const char *const text);
+gboolean plugins_on_message_stanza_receive(const char *const text);
+
 char* plugins_on_presence_stanza_send(const char *const text);
+gboolean plugins_on_presence_stanza_receive(const char *const text);
+
 char* plugins_on_iq_stanza_send(const char *const text);
+gboolean plugins_on_iq_stanza_receive(const char *const text);
 
 gboolean plugins_run_command(const char * const cmd);
 void plugins_run_timed(void);
diff --git a/src/plugins/python_plugins.c b/src/plugins/python_plugins.c
index 0aef2e8f..5ae03879 100644
--- a/src/plugins/python_plugins.c
+++ b/src/plugins/python_plugins.c
@@ -116,8 +116,11 @@ python_plugin_create(const char * const filename)
         plugin->pre_priv_message_send = python_pre_priv_message_send_hook;
         plugin->post_priv_message_send = python_post_priv_message_send_hook;
         plugin->on_message_stanza_send = python_on_message_stanza_send_hook;
+        plugin->on_message_stanza_receive = python_on_message_stanza_receive_hook;
         plugin->on_presence_stanza_send = python_on_presence_stanza_send_hook;
+        plugin->on_presence_stanza_receive = python_on_presence_stanza_receive_hook;
         plugin->on_iq_stanza_send = python_on_iq_stanza_send_hook;
+        plugin->on_iq_stanza_receive = python_on_iq_stanza_receive_hook;
         g_free(module_name);
 
         allow_python_threads();
@@ -607,6 +610,34 @@ python_on_message_stanza_send_hook(ProfPlugin *plugin, const char *const text)
     return NULL;
 }
 
+gboolean
+python_on_message_stanza_receive_hook(ProfPlugin *plugin, const char *const text)
+{
+    disable_python_threads();
+    PyObject *p_args = Py_BuildValue("(s)", text);
+    PyObject *p_function;
+
+    PyObject *p_module = plugin->module;
+    if (PyObject_HasAttrString(p_module, "prof_on_message_stanza_receive")) {
+        p_function = PyObject_GetAttrString(p_module, "prof_on_message_stanza_receive");
+        python_check_error();
+        if (p_function && PyCallable_Check(p_function)) {
+            PyObject *result = PyObject_CallObject(p_function, p_args);
+            python_check_error();
+            Py_XDECREF(p_function);
+            if (PyBool_Check(result)) {
+                allow_python_threads();
+                return TRUE;
+            } else {
+                allow_python_threads();
+                return FALSE;
+            }
+        }
+    }
+
+    return TRUE;
+}
+
 char*
 python_on_presence_stanza_send_hook(ProfPlugin *plugin, const char *const text)
 {
@@ -643,6 +674,34 @@ python_on_presence_stanza_send_hook(ProfPlugin *plugin, const char *const text)
     return NULL;
 }
 
+gboolean
+python_on_presence_stanza_receive_hook(ProfPlugin *plugin, const char *const text)
+{
+    disable_python_threads();
+    PyObject *p_args = Py_BuildValue("(s)", text);
+    PyObject *p_function;
+
+    PyObject *p_module = plugin->module;
+    if (PyObject_HasAttrString(p_module, "prof_on_presence_stanza_receive")) {
+        p_function = PyObject_GetAttrString(p_module, "prof_on_presence_stanza_receive");
+        python_check_error();
+        if (p_function && PyCallable_Check(p_function)) {
+            PyObject *result = PyObject_CallObject(p_function, p_args);
+            python_check_error();
+            Py_XDECREF(p_function);
+            if (PyBool_Check(result)) {
+                allow_python_threads();
+                return TRUE;
+            } else {
+                allow_python_threads();
+                return FALSE;
+            }
+        }
+    }
+
+    return TRUE;
+}
+
 char*
 python_on_iq_stanza_send_hook(ProfPlugin *plugin, const char *const text)
 {
@@ -679,6 +738,34 @@ python_on_iq_stanza_send_hook(ProfPlugin *plugin, const char *const text)
     return NULL;
 }
 
+gboolean
+python_on_iq_stanza_receive_hook(ProfPlugin *plugin, const char *const text)
+{
+    disable_python_threads();
+    PyObject *p_args = Py_BuildValue("(s)", text);
+    PyObject *p_function;
+
+    PyObject *p_module = plugin->module;
+    if (PyObject_HasAttrString(p_module, "prof_on_iq_stanza_receive")) {
+        p_function = PyObject_GetAttrString(p_module, "prof_on_iq_stanza_receive");
+        python_check_error();
+        if (p_function && PyCallable_Check(p_function)) {
+            PyObject *result = PyObject_CallObject(p_function, p_args);
+            python_check_error();
+            Py_XDECREF(p_function);
+            if (PyBool_Check(result)) {
+                allow_python_threads();
+                return TRUE;
+            } else {
+                allow_python_threads();
+                return FALSE;
+            }
+        }
+    }
+
+    return TRUE;
+}
+
 void
 python_check_error(void)
 {
diff --git a/src/plugins/python_plugins.h b/src/plugins/python_plugins.h
index 68c611b1..137bd407 100644
--- a/src/plugins/python_plugins.h
+++ b/src/plugins/python_plugins.h
@@ -65,7 +65,10 @@ char* python_pre_priv_message_send_hook(ProfPlugin *plugin, const char * const r
 void  python_post_priv_message_send_hook(ProfPlugin *plugin, const char * const room, const char * const nick, const char * const message);
 
 char* python_on_message_stanza_send_hook(ProfPlugin *plugin, const char *const text);
+gboolean python_on_message_stanza_receive_hook(ProfPlugin *plugin, const char *const text);
 char* python_on_presence_stanza_send_hook(ProfPlugin *plugin, const char *const text);
+gboolean python_on_presence_stanza_receive_hook(ProfPlugin *plugin, const char *const text);
 char* python_on_iq_stanza_send_hook(ProfPlugin *plugin, const char *const text);
+gboolean python_on_iq_stanza_receive_hook(ProfPlugin *plugin, const char *const text);
 
 #endif
diff --git a/src/xmpp/bookmark.c b/src/xmpp/bookmark.c
index ff627b51..97eb1b07 100644
--- a/src/xmpp/bookmark.c
+++ b/src/xmpp/bookmark.c
@@ -63,10 +63,12 @@
 static Autocomplete bookmark_ac;
 static GList *bookmark_list;
 
-static int _bookmark_handle_result(xmpp_conn_t *const conn,
-    xmpp_stanza_t *const stanza, void *const userdata);
-static int _bookmark_handle_delete(xmpp_conn_t *const conn,
-    void *const userdata);
+// id handlers
+static int _bookmark_result_id_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, void *const userdata);
+
+// scheduled
+static int _bookmark_handle_delete(xmpp_conn_t *const conn, void *const userdata);
+
 static void _bookmark_item_destroy(gpointer item);
 static int _match_bookmark_by_jid(gconstpointer a, gconstpointer b);
 static void _send_bookmarks(void);
@@ -91,7 +93,7 @@ bookmark_request(void)
     }
 
     xmpp_timed_handler_add(conn, _bookmark_handle_delete, BOOKMARK_TIMEOUT, id);
-    xmpp_id_handler_add(conn, _bookmark_handle_result, id, id);
+    xmpp_id_handler_add(conn, _bookmark_result_id_handler, id, id);
 
     iq = stanza_create_bookmarks_storage_request(ctx);
     xmpp_stanza_set_id(iq, id);
@@ -245,9 +247,11 @@ bookmark_autocomplete_reset(void)
 }
 
 static int
-_bookmark_handle_result(xmpp_conn_t *const conn,
+_bookmark_result_id_handler(xmpp_conn_t *const conn,
     xmpp_stanza_t *const stanza, void *const userdata)
 {
+    log_debug("iq stanza bookmark result id handler fired");
+
     xmpp_ctx_t *ctx = connection_get_ctx();
     char *id = (char *)userdata;
     xmpp_stanza_t *ptr;
@@ -372,7 +376,7 @@ _bookmark_handle_delete(xmpp_conn_t *const conn,
 
     log_debug("Timeout for handler with id=%s", id);
 
-    xmpp_id_handler_delete(conn, _bookmark_handle_result, id);
+    xmpp_id_handler_delete(conn, _bookmark_result_id_handler, id);
     g_free(id);
 
     return 0;
diff --git a/src/xmpp/iq.c b/src/xmpp/iq.c
index 27508bf3..b671ee07 100644
--- a/src/xmpp/iq.c
+++ b/src/xmpp/iq.c
@@ -72,34 +72,42 @@ typedef struct p_room_info_data_t {
     gboolean display;
 } ProfRoomInfoData;
 
+// regular handlers
+static int _iq_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, void *const userdata);
 static int _error_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, void *const userdata);
-static int _ping_get_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, void *const userdata);
-static int _version_get_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, void *const userdata);
-static int _version_result_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, void *const userdata);
 static int _disco_info_get_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, void *const userdata);
-static int _disco_info_response_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, void *const userdata);
-static int _last_activity_get_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, void *const userdata);
-static int _last_activity_response_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, void *const userdata);
-static int _room_info_response_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, void *const userdata);
-static int _disco_items_result_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, void *const userdata);
 static int _disco_items_get_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, void *const userdata);
-static int _destroy_room_result_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, void *const userdata);
-static int _room_config_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, void *const userdata);
-static int _room_config_submit_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, void *const userdata);
-static int _room_affiliation_list_result_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, void *const userdata);
-static int _room_affiliation_set_result_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, void *const userdata);
-static int _room_role_set_result_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, void *const userdata);
-static int _room_role_list_result_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, void *const userdata);
-static int _room_kick_result_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, void *const userdata);
-static int _enable_carbons_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, void *const userdata);
-static int _disable_carbons_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, void *const userdata);
-static int _manual_pong_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, void *const userdata);
-static int _autoping_timed_handler(xmpp_conn_t *const conn, void *const userdata);
-static int _caps_response_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, void *const userdata);
-static int _caps_response_handler_for_jid(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, void *const userdata);
-static int _caps_response_handler_legacy(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, void *const userdata);
+static int _disco_items_result_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, void *const userdata);
+static int _last_activity_get_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, void *const userdata);
+static int _version_get_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, void *const userdata);
+static int _ping_get_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, void *const userdata);
+
+// id handlers
+static int _version_result_id_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, void *const userdata);
+static int _disco_info_response_id_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, void *const userdata);
+static int _last_activity_response_id_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, void *const userdata);
+static int _room_info_response_id_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, void *const userdata);
+static int _destroy_room_result_id_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, void *const userdata);
+static int _room_config_id_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, void *const userdata);
+static int _room_config_submit_id_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, void *const userdata);
+static int _room_affiliation_list_result_id_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, void *const userdata);
+static int _room_affiliation_set_result_id_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, void *const userdata);
+static int _room_role_set_result_id_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, void *const userdata);
+static int _room_role_list_result_id_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, void *const userdata);
+static int _room_kick_result_id_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, void *const userdata);
+static int _enable_carbons_id_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, void *const userdata);
+static int _disable_carbons_id_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, void *const userdata);
+static int _manual_pong_id_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, void *const userdata);
+static int _caps_response_id_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, void *const userdata);
+static int _caps_response_for_jid_id_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, void *const userdata);
+static int _caps_response_legacy_id_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, void *const userdata);
+static int _auto_pong_id_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, void *const userdata);
+
+// scheduled
+static int _autoping_timed_send(xmpp_conn_t *const conn, void *const userdata);
 
 static void _send_iq_stanza(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza);
+static gboolean _receive_iq_stanza(xmpp_stanza_t *const stanza);
 
 static gboolean autoping_wait = FALSE;
 static GTimer *autoping_time = NULL;
@@ -110,22 +118,18 @@ iq_add_handlers(void)
     xmpp_conn_t * const conn = connection_get_conn();
     xmpp_ctx_t * const ctx = connection_get_ctx();
 
+    HANDLE(NULL,                    NULL,               _iq_handler);
     HANDLE(NULL,                    STANZA_TYPE_ERROR,  _error_handler);
-
     HANDLE(XMPP_NS_DISCO_INFO,      STANZA_TYPE_GET,    _disco_info_get_handler);
-
     HANDLE(XMPP_NS_DISCO_ITEMS,     STANZA_TYPE_GET,    _disco_items_get_handler);
     HANDLE(XMPP_NS_DISCO_ITEMS,     STANZA_TYPE_RESULT, _disco_items_result_handler);
-
     HANDLE(STANZA_NS_LASTACTIVITY,  STANZA_TYPE_GET,    _last_activity_get_handler);
-
     HANDLE(STANZA_NS_VERSION,       STANZA_TYPE_GET,    _version_get_handler);
-
     HANDLE(STANZA_NS_PING,          STANZA_TYPE_GET,    _ping_get_handler);
 
     if (prefs_get_autoping() != 0) {
         int millis = prefs_get_autoping() * 1000;
-        xmpp_timed_handler_add(conn, _autoping_timed_handler, millis, ctx);
+        xmpp_timed_handler_add(conn, _autoping_timed_send, millis, ctx);
     }
 }
 
@@ -165,7 +169,7 @@ iq_set_autoping(const int seconds)
     }
 
     xmpp_conn_t * const conn = connection_get_conn();
-    xmpp_timed_handler_delete(conn, _autoping_timed_handler);
+    xmpp_timed_handler_delete(conn, _autoping_timed_send);
 
     if (seconds == 0) {
         return;
@@ -173,7 +177,7 @@ iq_set_autoping(const int seconds)
 
     int millis = seconds * 1000;
     xmpp_ctx_t * const ctx = connection_get_ctx();
-    xmpp_timed_handler_add(conn, _autoping_timed_handler, millis, ctx);
+    xmpp_timed_handler_add(conn, _autoping_timed_send, millis, ctx);
 }
 
 void
@@ -194,7 +198,7 @@ iq_enable_carbons(void)
     xmpp_stanza_t *iq = stanza_enable_carbons(ctx);
     char *id = xmpp_stanza_get_id(iq);
 
-    xmpp_id_handler_add(conn, _enable_carbons_handler, id, NULL);
+    xmpp_id_handler_add(conn, _enable_carbons_id_handler, id, NULL);
 
     _send_iq_stanza(conn, iq);
     xmpp_stanza_release(iq);
@@ -208,7 +212,7 @@ iq_disable_carbons(void)
     xmpp_stanza_t *iq = stanza_disable_carbons(ctx);
     char *id = xmpp_stanza_get_id(iq);
 
-    xmpp_id_handler_add(conn, _disable_carbons_handler, id, NULL);
+    xmpp_id_handler_add(conn, _disable_carbons_id_handler, id, NULL);
 
     _send_iq_stanza(conn, iq);
     xmpp_stanza_release(iq);
@@ -222,7 +226,7 @@ iq_disco_info_request(gchar *jid)
     char *id = create_unique_id("disco_info");
     xmpp_stanza_t *iq = stanza_create_disco_info_iq(ctx, id, jid, NULL);
 
-    xmpp_id_handler_add(conn, _disco_info_response_handler, id, NULL);
+    xmpp_id_handler_add(conn, _disco_info_response_id_handler, id, NULL);
 
     free(id);
 
@@ -238,7 +242,7 @@ iq_last_activity_request(gchar *jid)
     char *id = create_unique_id("lastactivity");
     xmpp_stanza_t *iq = stanza_create_last_activity_iq(ctx, id, jid);
 
-    xmpp_id_handler_add(conn, _last_activity_response_handler, id, NULL);
+    xmpp_id_handler_add(conn, _last_activity_response_id_handler, id, NULL);
 
     free(id);
 
@@ -258,7 +262,7 @@ iq_room_info_request(const char *const room, gboolean display_result)
     cb_data->room = strdup(room);
     cb_data->display = display_result;
 
-    xmpp_id_handler_add(conn, _room_info_response_handler, id, cb_data);
+    xmpp_id_handler_add(conn, _room_info_response_id_handler, id, cb_data);
 
     free(id);
 
@@ -289,7 +293,7 @@ iq_send_caps_request_for_jid(const char *const to, const char *const id,
     xmpp_stanza_t *iq = stanza_create_disco_info_iq(ctx, id, to, node_str->str);
     g_string_free(node_str, TRUE);
 
-    xmpp_id_handler_add(conn, _caps_response_handler_for_jid, id, strdup(to));
+    xmpp_id_handler_add(conn, _caps_response_for_jid_id_handler, id, strdup(to));
 
     _send_iq_stanza(conn, iq);
     xmpp_stanza_release(iq);
@@ -316,7 +320,7 @@ iq_send_caps_request(const char *const to, const char *const id,
     xmpp_stanza_t *iq = stanza_create_disco_info_iq(ctx, id, to, node_str->str);
     g_string_free(node_str, TRUE);
 
-    xmpp_id_handler_add(conn, _caps_response_handler, id, NULL);
+    xmpp_id_handler_add(conn, _caps_response_id_handler, id, NULL);
 
     _send_iq_stanza(conn, iq);
     xmpp_stanza_release(iq);
@@ -342,7 +346,7 @@ iq_send_caps_request_legacy(const char *const to, const char *const id,
     g_string_printf(node_str, "%s#%s", node, ver);
     xmpp_stanza_t *iq = stanza_create_disco_info_iq(ctx, id, to, node_str->str);
 
-    xmpp_id_handler_add(conn, _caps_response_handler_legacy, id, node_str->str);
+    xmpp_id_handler_add(conn, _caps_response_legacy_id_handler, id, node_str->str);
     g_string_free(node_str, FALSE);
 
     _send_iq_stanza(conn, iq);
@@ -367,7 +371,7 @@ iq_send_software_version(const char *const fulljid)
     xmpp_stanza_t *iq = stanza_create_software_version_iq(ctx, fulljid);
 
     char *id = xmpp_stanza_get_id(iq);
-    xmpp_id_handler_add(conn, _version_result_handler, id, strdup(fulljid));
+    xmpp_id_handler_add(conn, _version_result_id_handler, id, strdup(fulljid));
 
     _send_iq_stanza(conn, iq);
     xmpp_stanza_release(iq);
@@ -391,7 +395,7 @@ iq_destroy_room(const char *const room_jid)
     xmpp_stanza_t *iq = stanza_create_instant_room_destroy_iq(ctx, room_jid);
 
     char *id = xmpp_stanza_get_id(iq);
-    xmpp_id_handler_add(conn, _destroy_room_result_handler, id, NULL);
+    xmpp_id_handler_add(conn, _destroy_room_result_id_handler, id, NULL);
 
     _send_iq_stanza(conn, iq);
     xmpp_stanza_release(iq);
@@ -405,7 +409,7 @@ iq_request_room_config_form(const char *const room_jid)
     xmpp_stanza_t *iq = stanza_create_room_config_request_iq(ctx, room_jid);
 
     char *id = xmpp_stanza_get_id(iq);
-    xmpp_id_handler_add(conn, _room_config_handler, id, NULL);
+    xmpp_id_handler_add(conn, _room_config_id_handler, id, NULL);
 
     _send_iq_stanza(conn, iq);
     xmpp_stanza_release(iq);
@@ -419,7 +423,7 @@ iq_submit_room_config(const char *const room, DataForm *form)
     xmpp_stanza_t *iq = stanza_create_room_config_submit_iq(ctx, room, form);
 
     char *id = xmpp_stanza_get_id(iq);
-    xmpp_id_handler_add(conn, _room_config_submit_handler, id, NULL);
+    xmpp_id_handler_add(conn, _room_config_submit_id_handler, id, NULL);
 
     _send_iq_stanza(conn, iq);
     xmpp_stanza_release(iq);
@@ -443,7 +447,7 @@ iq_room_affiliation_list(const char *const room, char *affiliation)
     xmpp_stanza_t *iq = stanza_create_room_affiliation_list_iq(ctx, room, affiliation);
 
     char *id = xmpp_stanza_get_id(iq);
-    xmpp_id_handler_add(conn, _room_affiliation_list_result_handler, id, strdup(affiliation));
+    xmpp_id_handler_add(conn, _room_affiliation_list_result_id_handler, id, strdup(affiliation));
 
     _send_iq_stanza(conn, iq);
     xmpp_stanza_release(iq);
@@ -457,7 +461,7 @@ iq_room_kick_occupant(const char *const room, const char *const nick, const char
     xmpp_stanza_t *iq = stanza_create_room_kick_iq(ctx, room, nick, reason);
 
     char *id = xmpp_stanza_get_id(iq);
-    xmpp_id_handler_add(conn, _room_kick_result_handler, id, strdup(nick));
+    xmpp_id_handler_add(conn, _room_kick_result_id_handler, id, strdup(nick));
 
     _send_iq_stanza(conn, iq);
     xmpp_stanza_release(iq);
@@ -482,7 +486,7 @@ iq_room_affiliation_set(const char *const room, const char *const jid, char *aff
     affiliation_set->item = strdup(jid);
     affiliation_set->privilege = strdup(affiliation);
 
-    xmpp_id_handler_add(conn, _room_affiliation_set_result_handler, id, affiliation_set);
+    xmpp_id_handler_add(conn, _room_affiliation_set_result_id_handler, id, affiliation_set);
 
     _send_iq_stanza(conn, iq);
     xmpp_stanza_release(iq);
@@ -502,7 +506,7 @@ iq_room_role_set(const char *const room, const char *const nick, char *role,
     role_set->item = strdup(nick);
     role_set->privilege = strdup(role);
 
-    xmpp_id_handler_add(conn, _room_role_set_result_handler, id, role_set);
+    xmpp_id_handler_add(conn, _room_role_set_result_id_handler, id, role_set);
 
     _send_iq_stanza(conn, iq);
     xmpp_stanza_release(iq);
@@ -516,7 +520,7 @@ iq_room_role_list(const char *const room, char *role)
     xmpp_stanza_t *iq = stanza_create_room_role_list_iq(ctx, room, role);
 
     char *id = xmpp_stanza_get_id(iq);
-    xmpp_id_handler_add(conn, _room_role_list_result_handler, id, strdup(role));
+    xmpp_id_handler_add(conn, _room_role_list_result_id_handler, id, strdup(role));
 
     _send_iq_stanza(conn, iq);
     xmpp_stanza_release(iq);
@@ -531,16 +535,31 @@ iq_send_ping(const char *const target)
     char *id = xmpp_stanza_get_id(iq);
 
     GDateTime *now = g_date_time_new_now_local();
-    xmpp_id_handler_add(conn, _manual_pong_handler, id, now);
+    xmpp_id_handler_add(conn, _manual_pong_id_handler, id, now);
 
     _send_iq_stanza(conn, iq);
     xmpp_stanza_release(iq);
 }
 
 static int
+_iq_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, void *const userdata)
+{
+    log_debug("iq stanza handler fired");
+
+    gboolean cont = _receive_iq_stanza(stanza);
+    if (!cont) {
+        return 1;
+    }
+
+    return 1;
+}
+
+static int
 _error_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza,
     void *const userdata)
 {
+    log_debug("iq stanza error handler fired");
+
     const char *id = xmpp_stanza_get_attribute(stanza, STANZA_ATTR_ID);
     char *error_msg = stanza_get_error_message(stanza);
 
@@ -558,58 +577,11 @@ _error_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza,
 }
 
 static int
-_auto_pong_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, void *const userdata)
-{
-    autoping_wait = FALSE;
-    if (autoping_time) {
-        g_timer_destroy(autoping_time);
-        autoping_time = NULL;
-    }
-
-    char *id = xmpp_stanza_get_id(stanza);
-    if (id == NULL) {
-        log_debug("Autoping: Pong handler fired.");
-        return 0;
-    }
-
-    log_debug("Autoping: Pong handler fired: %s.", id);
-
-    char *type = xmpp_stanza_get_type(stanza);
-    if (type == NULL) {
-        return 0;
-    }
-    if (g_strcmp0(type, STANZA_TYPE_ERROR) != 0) {
-        return 0;
-    }
-
-    // show warning if error
-    char *error_msg = stanza_get_error_message(stanza);
-    log_warning("Server ping (id=%s) responded with error: %s", id, error_msg);
-    free(error_msg);
-
-    // turn off autoping if error type is 'cancel'
-    xmpp_stanza_t *error = xmpp_stanza_get_child_by_name(stanza, STANZA_NAME_ERROR);
-    if (error == NULL) {
-        return 0;
-    }
-    char *errtype = xmpp_stanza_get_type(error);
-    if (errtype == NULL) {
-        return 0;
-    }
-    if (g_strcmp0(errtype, "cancel") == 0) {
-        log_warning("Server ping (id=%s) error type 'cancel', disabling autoping.", id);
-        prefs_set_autoping(0);
-        cons_show_error("Server ping not supported, autoping disabled.");
-        xmpp_timed_handler_delete(conn, _autoping_timed_handler);
-    }
-
-    return 0;
-}
-
-static int
-_caps_response_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza,
+_caps_response_id_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza,
     void *const userdata)
 {
+    log_debug("iq stanza caps response id handler fired");
+
     const char *id = xmpp_stanza_get_attribute(stanza, STANZA_ATTR_ID);
     xmpp_stanza_t *query = xmpp_stanza_get_child_by_name(stanza, STANZA_NAME_QUERY);
 
@@ -681,9 +653,11 @@ _caps_response_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza,
 }
 
 static int
-_caps_response_handler_for_jid(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza,
+_caps_response_for_jid_id_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza,
     void *const userdata)
 {
+    log_debug("iq stanza caps response for jid id handler fired");
+
     char *jid = (char *)userdata;
     const char *id = xmpp_stanza_get_attribute(stanza, STANZA_ATTR_ID);
     xmpp_stanza_t *query = xmpp_stanza_get_child_by_name(stanza, STANZA_NAME_QUERY);
@@ -740,9 +714,11 @@ _caps_response_handler_for_jid(xmpp_conn_t *const conn, xmpp_stanza_t *const sta
 }
 
 static int
-_caps_response_handler_legacy(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza,
+_caps_response_legacy_id_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza,
     void *const userdata)
 {
+    log_debug("iq stanza caps response legacy id handler fired");
+
     const char *id = xmpp_stanza_get_attribute(stanza, STANZA_ATTR_ID);
     xmpp_stanza_t *query = xmpp_stanza_get_child_by_name(stanza, STANZA_NAME_QUERY);
     char *expected_node = (char *)userdata;
@@ -813,8 +789,10 @@ _caps_response_handler_legacy(xmpp_conn_t *const conn, xmpp_stanza_t *const stan
 }
 
 static int
-_enable_carbons_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, void *const userdata)
+_enable_carbons_id_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, void *const userdata)
 {
+    log_debug("iq stanza enable carbons id handler fired");
+
     char *type = xmpp_stanza_get_type(stanza);
     if (g_strcmp0(type, "error") == 0) {
         char *error_message = stanza_get_error_message(stanza);
@@ -829,8 +807,10 @@ _enable_carbons_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, vo
 }
 
 static int
-_disable_carbons_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, void *const userdata)
+_disable_carbons_id_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, void *const userdata)
 {
+    log_debug("iq stanza disable carbons id handler fired");
+
     char *type = xmpp_stanza_get_type(stanza);
     if (g_strcmp0(type, "error") == 0) {
         char *error_message = stanza_get_error_message(stanza);
@@ -845,9 +825,11 @@ _disable_carbons_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, v
 }
 
 static int
-_manual_pong_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza,
+_manual_pong_id_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza,
     void *const userdata)
 {
+    log_debug("iq stanza manual pong id handler fired");
+
     char *from = xmpp_stanza_get_attribute(stanza, STANZA_ATTR_FROM);
     char *type = xmpp_stanza_get_type(stanza);
     GDateTime *sent = (GDateTime *)userdata;
@@ -884,7 +866,7 @@ _manual_pong_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza,
 }
 
 static int
-_autoping_timed_handler(xmpp_conn_t *const conn, void *const userdata)
+_autoping_timed_send(xmpp_conn_t *const conn, void *const userdata)
 {
     if (jabber_get_connection_status() != JABBER_CONNECTED) {
         return 1;
@@ -901,7 +883,7 @@ _autoping_timed_handler(xmpp_conn_t *const conn, void *const userdata)
     log_debug("Autoping: Sending ping request: %s", id);
 
     // add pong handler
-    xmpp_id_handler_add(conn, _auto_pong_handler, id, ctx);
+    xmpp_id_handler_add(conn, _auto_pong_id_handler, id, ctx);
 
     _send_iq_stanza(conn, iq);
     xmpp_stanza_release(iq);
@@ -915,9 +897,62 @@ _autoping_timed_handler(xmpp_conn_t *const conn, void *const userdata)
 }
 
 static int
-_version_result_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza,
+_auto_pong_id_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, void *const userdata)
+{
+    log_debug("iq stanza auto pong id handler fired");
+
+    autoping_wait = FALSE;
+    if (autoping_time) {
+        g_timer_destroy(autoping_time);
+        autoping_time = NULL;
+    }
+
+    char *id = xmpp_stanza_get_id(stanza);
+    if (id == NULL) {
+        log_debug("Autoping: Pong handler fired.");
+        return 0;
+    }
+
+    log_debug("Autoping: Pong handler fired: %s.", id);
+
+    char *type = xmpp_stanza_get_type(stanza);
+    if (type == NULL) {
+        return 0;
+    }
+    if (g_strcmp0(type, STANZA_TYPE_ERROR) != 0) {
+        return 0;
+    }
+
+    // show warning if error
+    char *error_msg = stanza_get_error_message(stanza);
+    log_warning("Server ping (id=%s) responded with error: %s", id, error_msg);
+    free(error_msg);
+
+    // turn off autoping if error type is 'cancel'
+    xmpp_stanza_t *error = xmpp_stanza_get_child_by_name(stanza, STANZA_NAME_ERROR);
+    if (error == NULL) {
+        return 0;
+    }
+    char *errtype = xmpp_stanza_get_type(error);
+    if (errtype == NULL) {
+        return 0;
+    }
+    if (g_strcmp0(errtype, "cancel") == 0) {
+        log_warning("Server ping (id=%s) error type 'cancel', disabling autoping.", id);
+        prefs_set_autoping(0);
+        cons_show_error("Server ping not supported, autoping disabled.");
+        xmpp_timed_handler_delete(conn, _autoping_timed_send);
+    }
+
+    return 0;
+}
+
+static int
+_version_result_id_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza,
     void *const userdata)
 {
+    log_debug("iq stanza version result id handler fired");
+
     char *id = xmpp_stanza_get_id(stanza);
 
     if (id) {
@@ -1017,6 +1052,8 @@ static int
 _ping_get_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza,
     void *const userdata)
 {
+    log_debug("iq stanza ping get handler fired");
+
     xmpp_ctx_t *ctx = (xmpp_ctx_t *)userdata;
     const char *id = xmpp_stanza_get_attribute(stanza, STANZA_ATTR_ID);
     const char *to = xmpp_stanza_get_attribute(stanza, STANZA_ATTR_TO);
@@ -1052,6 +1089,8 @@ static int
 _version_get_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza,
     void *const userdata)
 {
+    log_debug("iq stanza version get handler fired");
+
     xmpp_ctx_t *ctx = (xmpp_ctx_t *)userdata;
     const char *id = xmpp_stanza_get_attribute(stanza, STANZA_ATTR_ID);
     const char *from = xmpp_stanza_get_attribute(stanza, STANZA_ATTR_FROM);
@@ -1120,6 +1159,8 @@ static int
 _disco_items_get_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza,
     void *const userdata)
 {
+    log_debug("iq stanza disco items get handler fired");
+
     xmpp_ctx_t *ctx = (xmpp_ctx_t *)userdata;
     const char *id = xmpp_stanza_get_attribute(stanza, STANZA_ATTR_ID);
     const char *from = xmpp_stanza_get_attribute(stanza, STANZA_ATTR_FROM);
@@ -1152,6 +1193,8 @@ static int
 _last_activity_get_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza,
     void *const userdata)
 {
+    log_debug("iq stanza last activity get handler fired");
+
     xmpp_ctx_t *ctx = connection_get_ctx();
     const char *from = xmpp_stanza_get_attribute(stanza, STANZA_ATTR_FROM);
 
@@ -1214,6 +1257,8 @@ static int
 _disco_info_get_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza,
     void *const userdata)
 {
+    log_debug("iq stanza disco info get handler fired");
+
     xmpp_ctx_t *ctx = (xmpp_ctx_t *)userdata;
     const char *from = xmpp_stanza_get_attribute(stanza, STANZA_ATTR_FROM);
 
@@ -1249,9 +1294,11 @@ _disco_info_get_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza,
 }
 
 static int
-_destroy_room_result_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza,
+_destroy_room_result_id_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza,
     void *const userdata)
 {
+    log_debug("iq stanza destroy room result id handler fired");
+
     const char *id = xmpp_stanza_get_attribute(stanza, STANZA_ATTR_ID);
 
     if (id) {
@@ -1271,9 +1318,11 @@ _destroy_room_result_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanz
 }
 
 static int
-_room_config_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza,
+_room_config_id_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza,
     void *const userdata)
 {
+    log_debug("iq stanza room config id handler fired");
+
     const char *id = xmpp_stanza_get_attribute(stanza, STANZA_ATTR_ID);
     const char *type = xmpp_stanza_get_type(stanza);
     const char *from = xmpp_stanza_get_attribute(stanza, STANZA_ATTR_FROM);
@@ -1327,9 +1376,11 @@ _room_config_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza,
 }
 
 static int
-_room_affiliation_set_result_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza,
+_room_affiliation_set_result_id_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza,
     void *const userdata)
 {
+    log_debug("iq stanza room affiliation set result id handler fired");
+
     const char *id = xmpp_stanza_get_attribute(stanza, STANZA_ATTR_ID);
     const char *type = xmpp_stanza_get_type(stanza);
     const char *from = xmpp_stanza_get_attribute(stanza, STANZA_ATTR_FROM);
@@ -1360,9 +1411,11 @@ _room_affiliation_set_result_handler(xmpp_conn_t *const conn, xmpp_stanza_t *con
 }
 
 static int
-_room_role_set_result_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza,
+_room_role_set_result_id_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza,
     void *const userdata)
 {
+    log_debug("iq stanza room role set result id handler fired");
+
     const char *id = xmpp_stanza_get_attribute(stanza, STANZA_ATTR_ID);
     const char *type = xmpp_stanza_get_type(stanza);
     const char *from = xmpp_stanza_get_attribute(stanza, STANZA_ATTR_FROM);
@@ -1393,8 +1446,10 @@ _room_role_set_result_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stan
 }
 
 static int
-_room_affiliation_list_result_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, void *const userdata)
+_room_affiliation_list_result_id_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, void *const userdata)
 {
+    log_debug("iq stanza room affiliation list result id handler fired");
+
     const char *id = xmpp_stanza_get_attribute(stanza, STANZA_ATTR_ID);
     const char *type = xmpp_stanza_get_type(stanza);
     const char *from = xmpp_stanza_get_attribute(stanza, STANZA_ATTR_FROM);
@@ -1447,8 +1502,10 @@ _room_affiliation_list_result_handler(xmpp_conn_t *const conn, xmpp_stanza_t *co
 }
 
 static int
-_room_role_list_result_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, void *const userdata)
+_room_role_list_result_id_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, void *const userdata)
 {
+    log_debug("iq stanza room role list result id handler fired");
+
     const char *id = xmpp_stanza_get_attribute(stanza, STANZA_ATTR_ID);
     const char *type = xmpp_stanza_get_type(stanza);
     const char *from = xmpp_stanza_get_attribute(stanza, STANZA_ATTR_FROM);
@@ -1500,9 +1557,11 @@ _room_role_list_result_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const sta
 }
 
 static int
-_room_config_submit_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza,
+_room_config_submit_id_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza,
     void *const userdata)
 {
+    log_debug("iq stanza room config submit id handler fired");
+
     const char *id = xmpp_stanza_get_attribute(stanza, STANZA_ATTR_ID);
     const char *type = xmpp_stanza_get_type(stanza);
     const char *from = xmpp_stanza_get_attribute(stanza, STANZA_ATTR_FROM);
@@ -1527,8 +1586,10 @@ _room_config_submit_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza
 }
 
 static int
-_room_kick_result_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, void *const userdata)
+_room_kick_result_id_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, void *const userdata)
 {
+    log_debug("iq stanza room kick result id handler fired");
+
     const char *id = xmpp_stanza_get_attribute(stanza, STANZA_ATTR_ID);
     const char *type = xmpp_stanza_get_type(stanza);
     const char *from = xmpp_stanza_get_attribute(stanza, STANZA_ATTR_FROM);
@@ -1575,9 +1636,11 @@ _item_destroy(DiscoItem *item)
 }
 
 static int
-_room_info_response_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza,
+_room_info_response_id_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza,
     void *const userdata)
 {
+    log_debug("iq stanza room info response id handler fired");
+
     const char *type = xmpp_stanza_get_type(stanza);
     ProfRoomInfoData *cb_data = (ProfRoomInfoData *)userdata;
     log_info("Received diso#info response for room: %s", cb_data->room);
@@ -1656,9 +1719,11 @@ _room_info_response_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza
 }
 
 static int
-_last_activity_response_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza,
+_last_activity_response_id_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza,
     void *const userdata)
 {
+    log_debug("iq stanza last activity response id handler fired");
+
     const char *from = xmpp_stanza_get_attribute(stanza, STANZA_ATTR_FROM);
     if (!from) {
         cons_show_error("Invalid last activity response received.");
@@ -1711,9 +1776,11 @@ _last_activity_response_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const st
 }
 
 static int
-_disco_info_response_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza,
+_disco_info_response_id_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza,
     void *const userdata)
 {
+    log_debug("iq stanza disco info response id handler fired");
+
     const char *from = xmpp_stanza_get_attribute(stanza, STANZA_ATTR_FROM);
     const char *type = xmpp_stanza_get_type(stanza);
 
@@ -1792,6 +1859,7 @@ static int
 _disco_items_result_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza,
     void *const userdata)
 {
+    log_debug("iq stanza disco items result handler fired");
 
     log_debug("Received diso#items response");
     const char *id = xmpp_stanza_get_attribute(stanza, STANZA_ATTR_ID);
@@ -1851,3 +1919,13 @@ _send_iq_stanza(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza)
         xmpp_send_raw_string(conn, "%s", text);
     }
 }
+
+static gboolean
+_receive_iq_stanza(xmpp_stanza_t *const stanza)
+{
+    char *text;
+    size_t text_size;
+    xmpp_stanza_to_text(stanza, &text, &text_size);
+
+    return plugins_on_iq_stanza_receive(text);
+}
diff --git a/src/xmpp/message.c b/src/xmpp/message.c
index e40f8ff1..b212dbf5 100644
--- a/src/xmpp/message.c
+++ b/src/xmpp/message.c
@@ -62,6 +62,7 @@
 
 #define HANDLE(ns, type, func) xmpp_handler_add(conn, func, ns, STANZA_NAME_MESSAGE, type, ctx)
 
+// regular handlers
 static int _groupchat_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, void *const userdata);
 static int _chat_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, void *const userdata);
 static int _muc_user_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, void *const userdata);
@@ -69,7 +70,9 @@ static int _conference_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const sta
 static int _captcha_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, void *const userdata);
 static int _message_error_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, void *const userdata);
 static int _receipt_received_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, void *const userdata);
+
 static void _send_message_stanza(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza);
+static gboolean _receive_message_stanza(xmpp_stanza_t *const stanza);
 
 void
 message_add_handlers(void)
@@ -340,6 +343,8 @@ message_send_gone(const char *const jid)
 static int
 _message_error_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, void *const userdata)
 {
+    log_debug("Message stanza error handler fired");
+
     char *id = xmpp_stanza_get_id(stanza);
     char *jid = xmpp_stanza_get_attribute(stanza, STANZA_ATTR_FROM);
     xmpp_stanza_t *error_stanza = xmpp_stanza_get_child_by_name(stanza, STANZA_NAME_ERROR);
@@ -390,6 +395,8 @@ _message_error_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, voi
 static int
 _muc_user_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, void *const userdata)
 {
+    log_debug("Message stanza muc user handler fired");
+
     xmpp_ctx_t *ctx = connection_get_ctx();
     xmpp_stanza_t *xns_muc_user = xmpp_stanza_get_child_by_ns(stanza, STANZA_NS_MUC_USER);
     char *room = xmpp_stanza_get_attribute(stanza, STANZA_ATTR_FROM);
@@ -444,6 +451,8 @@ _muc_user_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, void *co
 static int
 _conference_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, void *const userdata)
 {
+    log_debug("Message stanza conference handler fired");
+
     xmpp_stanza_t *xns_conference = xmpp_stanza_get_child_by_ns(stanza, STANZA_NS_CONFERENCE);
 
     char *from = xmpp_stanza_get_attribute(stanza, STANZA_ATTR_FROM);
@@ -476,6 +485,8 @@ _conference_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, void *
 static int
 _captcha_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, void *const userdata)
 {
+    log_debug("Message stanza captcha handler fired");
+
     xmpp_ctx_t *ctx = connection_get_ctx();
     char *from = xmpp_stanza_get_attribute(stanza, STANZA_ATTR_FROM);
 
@@ -504,6 +515,8 @@ _captcha_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, void *con
 static int
 _groupchat_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, void *const userdata)
 {
+    log_debug("Message stanza groupchat handler fired");
+
     xmpp_ctx_t *ctx = connection_get_ctx();
     char *message = NULL;
     char *room_jid = xmpp_stanza_get_attribute(stanza, STANZA_ATTR_FROM);
@@ -610,6 +623,8 @@ _message_send_receipt(const char *const fulljid, const char *const message_id)
 static int
 _receipt_received_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, void *const userdata)
 {
+    log_debug("Message stanza receipt received handler fired");
+
     xmpp_stanza_t *receipt = xmpp_stanza_get_child_by_ns(stanza, STANZA_NS_RECEIPTS);
     char *name = xmpp_stanza_get_name(receipt);
     if (g_strcmp0(name, "received") != 0) {
@@ -749,6 +764,13 @@ _handle_carbons(xmpp_stanza_t *const stanza)
 static int
 _chat_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, void *const userdata)
 {
+    log_debug("Message stanza chat handler fired");
+
+    gboolean cont = _receive_message_stanza(stanza);
+    if (!cont) {
+        return 1;
+    }
+
     // ignore if type not chat or absent
     char *type = xmpp_stanza_get_type(stanza);
     if (!(g_strcmp0(type, "chat") == 0 || type == NULL)) {
@@ -847,3 +869,13 @@ _send_message_stanza(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza)
         xmpp_send_raw_string(conn, "%s", text);
     }
 }
+
+static gboolean
+_receive_message_stanza(xmpp_stanza_t *const stanza)
+{
+    char *text;
+    size_t text_size;
+    xmpp_stanza_to_text(stanza, &text, &text_size);
+
+    return plugins_on_message_stanza_receive(text);
+}
diff --git a/src/xmpp/presence.c b/src/xmpp/presence.c
index af0b4fde..ce163ae1 100644
--- a/src/xmpp/presence.c
+++ b/src/xmpp/presence.c
@@ -65,6 +65,7 @@ static Autocomplete sub_requests_ac;
 
 #define HANDLE(ns, type, func) xmpp_handler_add(conn, func, ns, STANZA_NAME_PRESENCE, type, ctx)
 
+// regular handlers
 static int _unavailable_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, void *const userdata);
 static int _subscribe_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, void *const userdata);
 static int _subscribed_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, void *const userdata);
@@ -78,6 +79,7 @@ static void _send_room_presence(xmpp_conn_t *conn, xmpp_stanza_t *presence);
 
 static void _send_presence_stanza(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza);
 static void _send_iq_stanza(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza);
+static gboolean _receive_presence_stanza(xmpp_stanza_t *const stanza);
 
 void
 presence_sub_requests_init(void)
@@ -364,6 +366,8 @@ static int
 _presence_error_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza,
     void *const userdata)
 {
+    log_debug("Presence stanza error handler fired");
+
     char *id = xmpp_stanza_get_id(stanza);
     char *from = xmpp_stanza_get_attribute(stanza, STANZA_ATTR_FROM);
     xmpp_stanza_t *error_stanza = xmpp_stanza_get_child_by_name(stanza, STANZA_NAME_ERROR);
@@ -438,6 +442,8 @@ static int
 _unsubscribed_handler(xmpp_conn_t *const conn,
     xmpp_stanza_t *const stanza, void *const userdata)
 {
+    log_debug("Presence stanza unsubscribed handler fired");
+
     char *from = xmpp_stanza_get_attribute(stanza, STANZA_ATTR_FROM);
     Jid *from_jid = jid_create(from);
     log_debug("Unsubscribed presence handler fired for %s", from);
@@ -454,6 +460,8 @@ static int
 _subscribed_handler(xmpp_conn_t *const conn,
     xmpp_stanza_t *const stanza, void *const userdata)
 {
+    log_debug("Presence stanza subscribed handler fired");
+
     char *from = xmpp_stanza_get_attribute(stanza, STANZA_ATTR_FROM);
     Jid *from_jid = jid_create(from);
     log_debug("Subscribed presence handler fired for %s", from);
@@ -470,6 +478,8 @@ static int
 _subscribe_handler(xmpp_conn_t *const conn,
     xmpp_stanza_t *const stanza, void *const userdata)
 {
+    log_debug("Presence stanza subscribe handler fired");
+
     char *from = xmpp_stanza_get_attribute(stanza, STANZA_ATTR_FROM);
     log_debug("Subscribe presence handler fired for %s", from);
 
@@ -490,6 +500,8 @@ static int
 _unavailable_handler(xmpp_conn_t *const conn,
     xmpp_stanza_t *const stanza, void *const userdata)
 {
+    log_debug("Presence stanza unavailale handler fired");
+
     inp_nonblocking(TRUE);
 
     const char *jid = xmpp_conn_get_jid(conn);
@@ -564,9 +576,15 @@ _handle_caps(char *jid, XMPPCaps *caps)
 }
 
 static int
-_available_handler(xmpp_conn_t *const conn,
-    xmpp_stanza_t *const stanza, void *const userdata)
+_available_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, void *const userdata)
 {
+    log_debug("Presence stanza available handler fired");
+
+    gboolean cont = _receive_presence_stanza(stanza);
+    if (!cont) {
+        return 1;
+    }
+
     inp_nonblocking(TRUE);
 
     // handler still fires if error
@@ -666,6 +684,8 @@ _send_caps_request(char *node, char *caps_key, char *id, char *from)
 static int
 _muc_user_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, void *const userdata)
 {
+    log_debug("Presence stanza muc user handler fired");
+
     inp_nonblocking(TRUE);
 
     char *type = xmpp_stanza_get_attribute(stanza, STANZA_ATTR_TYPE);
@@ -845,3 +865,14 @@ _send_iq_stanza(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza)
         xmpp_send_raw_string(conn, "%s", text);
     }
 }
+
+static gboolean
+_receive_presence_stanza(xmpp_stanza_t *const stanza)
+{
+    char *text;
+    size_t text_size;
+    xmpp_stanza_to_text(stanza, &text, &text_size);
+
+    return plugins_on_presence_stanza_receive(text);
+}
+
diff --git a/src/xmpp/roster.c b/src/xmpp/roster.c
index fb4e5815..d1371e5e 100644
--- a/src/xmpp/roster.c
+++ b/src/xmpp/roster.c
@@ -75,8 +75,8 @@ static int _roster_set_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const sta
 static int _roster_result_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, void *const userdata);
 
 // id handlers
-static int _group_add_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, void *const userdata);
-static int _group_remove_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, void *const userdata);
+static int _group_add_id_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, void *const userdata);
+static int _group_remove_id_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, void *const userdata);
 
 static void _send_iq_stanza(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza);
 
@@ -160,7 +160,7 @@ roster_send_add_to_group(const char *const group, PContact contact)
 
     xmpp_conn_t * const conn = connection_get_conn();
     xmpp_ctx_t * const ctx = connection_get_ctx();
-    xmpp_id_handler_add(conn, _group_add_handler, unique_id, data);
+    xmpp_id_handler_add(conn, _group_add_id_handler, unique_id, data);
     xmpp_stanza_t *iq = stanza_create_roster_set(ctx, unique_id, p_contact_barejid(contact),
         p_contact_name(contact), new_groups);
     _send_iq_stanza(conn, iq);
@@ -169,9 +169,11 @@ roster_send_add_to_group(const char *const group, PContact contact)
 }
 
 static int
-_group_add_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza,
+_group_add_id_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza,
     void *const userdata)
 {
+    log_debug("iq stanza group add id handler fired");
+
     if (userdata) {
         GroupData *data = userdata;
         ui_group_added(data->name, data->group);
@@ -207,7 +209,7 @@ roster_send_remove_from_group(const char *const group, PContact contact)
         data->name = strdup(p_contact_barejid(contact));
     }
 
-    xmpp_id_handler_add(conn, _group_remove_handler, unique_id, data);
+    xmpp_id_handler_add(conn, _group_remove_id_handler, unique_id, data);
     xmpp_stanza_t *iq = stanza_create_roster_set(ctx, unique_id, p_contact_barejid(contact),
         p_contact_name(contact), new_groups);
     _send_iq_stanza(conn, iq);
@@ -216,9 +218,11 @@ roster_send_remove_from_group(const char *const group, PContact contact)
 }
 
 static int
-_group_remove_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza,
+_group_remove_id_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza,
     void *const userdata)
 {
+    log_debug("iq stanza group remove id handler fired");
+
     if (userdata) {
         GroupData *data = userdata;
         ui_group_removed(data->name, data->group);
@@ -233,6 +237,8 @@ static int
 _roster_set_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza,
     void *const userdata)
 {
+    log_debug("iq stanza roster set handler fired");
+
     xmpp_stanza_t *query =
         xmpp_stanza_get_child_by_name(stanza, STANZA_NAME_QUERY);
     xmpp_stanza_t *item =
@@ -302,6 +308,8 @@ _roster_set_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza,
 static int
 _roster_result_handler(xmpp_conn_t *const conn, xmpp_stanza_t *const stanza, void *const userdata)
 {
+    log_debug("iq stanza roster result handler fired");
+
     const char *id = xmpp_stanza_get_attribute(stanza, STANZA_ATTR_ID);
 
     if (g_strcmp0(id, "roster") != 0) {