about summary refs log tree commit diff stats
path: root/src/xmpp/stanza.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/xmpp/stanza.c')
-rw-r--r--src/xmpp/stanza.c150
1 files changed, 150 insertions, 0 deletions
diff --git a/src/xmpp/stanza.c b/src/xmpp/stanza.c
index eb5f857c..07e96659 100644
--- a/src/xmpp/stanza.c
+++ b/src/xmpp/stanza.c
@@ -1010,6 +1010,156 @@ stanza_is_muc_self_presence(xmpp_stanza_t * const stanza,
     return FALSE;
 }
 
+GSList *
+stanza_get_status_codes_by_ns(xmpp_stanza_t * const stanza, char *ns)
+{
+    GSList *codes = NULL;
+    xmpp_stanza_t *ns_child = xmpp_stanza_get_child_by_ns(stanza, ns);
+    if (ns_child) {
+        xmpp_stanza_t *child = xmpp_stanza_get_children(ns_child);
+        while (child) {
+            char *name = xmpp_stanza_get_name(child);
+            if (g_strcmp0(name, STANZA_NAME_STATUS) == 0) {
+                char *code = xmpp_stanza_get_attribute(child, STANZA_ATTR_CODE);
+                if (code) {
+                    codes = g_slist_append(codes, code);
+                }
+            }
+            child = xmpp_stanza_get_next(child);
+        }
+    }
+    return codes;
+}
+
+gboolean
+stanza_room_destroyed(xmpp_stanza_t *stanza)
+{
+    char *stanza_name = xmpp_stanza_get_name(stanza);
+    if (g_strcmp0(stanza_name, STANZA_NAME_PRESENCE) == 0) {
+        xmpp_stanza_t *x = xmpp_stanza_get_child_by_ns(stanza, STANZA_NS_MUC_USER);
+        if (x) {
+            xmpp_stanza_t *destroy = xmpp_stanza_get_child_by_name(x, STANZA_NAME_DESTROY);
+            if (destroy) {
+                return TRUE;
+            }
+        }
+    }
+
+    return FALSE;
+}
+
+char *
+stanza_get_muc_destroy_alternative_room(xmpp_stanza_t *stanza)
+{
+    char *stanza_name = xmpp_stanza_get_name(stanza);
+    if (g_strcmp0(stanza_name, STANZA_NAME_PRESENCE) == 0) {
+        xmpp_stanza_t *x = xmpp_stanza_get_child_by_ns(stanza, STANZA_NS_MUC_USER);
+        if (x) {
+            xmpp_stanza_t *destroy = xmpp_stanza_get_child_by_name(x, STANZA_NAME_DESTROY);
+            if (destroy) {
+                char *jid = xmpp_stanza_get_attribute(destroy, STANZA_ATTR_JID);
+                if (jid) {
+                    return jid;
+                }
+            }
+        }
+    }
+
+    return NULL;
+}
+
+char *
+stanza_get_muc_destroy_alternative_password(xmpp_stanza_t *stanza)
+{
+    char *stanza_name = xmpp_stanza_get_name(stanza);
+    if (g_strcmp0(stanza_name, STANZA_NAME_PRESENCE) == 0) {
+        xmpp_stanza_t *x = xmpp_stanza_get_child_by_ns(stanza, STANZA_NS_MUC_USER);
+        if (x) {
+            xmpp_stanza_t *destroy = xmpp_stanza_get_child_by_name(x, STANZA_NAME_DESTROY);
+            if (destroy) {
+                xmpp_stanza_t *password_st = xmpp_stanza_get_child_by_name(destroy, STANZA_NAME_PASSWORD);
+                if (password_st) {
+                    char *password = xmpp_stanza_get_text(password_st);
+                    if (password) {
+                        return password;
+                    }
+                }
+            }
+        }
+    }
+    return NULL;
+}
+
+char *
+stanza_get_muc_destroy_reason(xmpp_stanza_t *stanza)
+{
+    char *stanza_name = xmpp_stanza_get_name(stanza);
+    if (g_strcmp0(stanza_name, STANZA_NAME_PRESENCE) == 0) {
+        xmpp_stanza_t *x = xmpp_stanza_get_child_by_ns(stanza, STANZA_NS_MUC_USER);
+        if (x) {
+            xmpp_stanza_t *destroy = xmpp_stanza_get_child_by_name(x, STANZA_NAME_DESTROY);
+            if (destroy) {
+                xmpp_stanza_t *reason_st = xmpp_stanza_get_child_by_name(destroy, STANZA_NAME_REASON);
+                if (reason_st) {
+                    char *reason = xmpp_stanza_get_text(reason_st);
+                    if (reason) {
+                        return reason;
+                    }
+                }
+            }
+        }
+    }
+    return NULL;
+}
+
+char *
+stanza_get_kick_actor(xmpp_stanza_t *stanza)
+{
+    char *stanza_name = xmpp_stanza_get_name(stanza);
+    if (g_strcmp0(stanza_name, STANZA_NAME_PRESENCE) == 0) {
+        xmpp_stanza_t *x = xmpp_stanza_get_child_by_ns(stanza, STANZA_NS_MUC_USER);
+        if (x) {
+            xmpp_stanza_t *item = xmpp_stanza_get_child_by_name(x, STANZA_NAME_ITEM);
+            if (item) {
+                xmpp_stanza_t *actor = xmpp_stanza_get_child_by_name(item, STANZA_NAME_ACTOR);
+                if (actor) {
+                    char *nick = xmpp_stanza_get_attribute(actor, STANZA_ATTR_NICK);
+                    if (nick) {
+                        return nick;
+                    }
+                    char *jid = xmpp_stanza_get_attribute(actor, STANZA_ATTR_JID);
+                    if (jid) {
+                        return jid;
+                    }
+                }
+            }
+        }
+    }
+    return NULL;
+}
+
+char *
+stanza_get_kick_reason(xmpp_stanza_t *stanza)
+{
+    char *stanza_name = xmpp_stanza_get_name(stanza);
+    if (g_strcmp0(stanza_name, STANZA_NAME_PRESENCE) == 0) {
+        xmpp_stanza_t *x = xmpp_stanza_get_child_by_ns(stanza, STANZA_NS_MUC_USER);
+        if (x) {
+            xmpp_stanza_t *item = xmpp_stanza_get_child_by_name(x, STANZA_NAME_ITEM);
+            if (item) {
+                xmpp_stanza_t *reason_st = xmpp_stanza_get_child_by_name(item, STANZA_NAME_REASON);
+                if (reason_st) {
+                    char *reason = xmpp_stanza_get_text(reason_st);
+                    if (reason) {
+                        return reason;
+                    }
+                }
+            }
+        }
+    }
+    return NULL;
+}
+
 gboolean
 stanza_is_room_nick_change(xmpp_stanza_t * const stanza)
 {