about summary refs log tree commit diff stats
path: root/src/xmpp/presence.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/xmpp/presence.c')
-rw-r--r--src/xmpp/presence.c39
1 files changed, 37 insertions, 2 deletions
diff --git a/src/xmpp/presence.c b/src/xmpp/presence.c
index be2d4a01..adc6fc06 100644
--- a/src/xmpp/presence.c
+++ b/src/xmpp/presence.c
@@ -704,7 +704,30 @@ _muc_user_handler(xmpp_conn_t * const conn, xmpp_stanza_t * const stanza,
             if (new_nick != NULL) {
                 muc_nick_change_start(from_room, new_nick);
             } else {
-                handle_leave_room(from_room);
+                GSList *status_codes = stanza_get_status_codes_by_ns(stanza, STANZA_NS_MUC_USER);
+
+                // room destroyed
+                if (stanza_room_destroyed(stanza)) {
+                    char *new_jid = stanza_get_muc_destroy_alternative_room(stanza);
+                    char *password = stanza_get_muc_destroy_alternative_password(stanza);
+                    char *reason = stanza_get_muc_destroy_reason(stanza);
+                    handle_room_destroyed(from_room, new_jid, password, reason);
+                    free(password);
+                    free(reason);
+
+                // kicked from room
+                } else if (g_slist_find_custom(status_codes, "307", (GCompareFunc)g_strcmp0) != NULL) {
+                    char *actor = stanza_get_kick_actor(stanza);
+                    char *reason = stanza_get_kick_reason(stanza);
+                    handle_room_kicked(from_room, actor, reason);
+                    free(reason);
+
+                // normal exit
+                } else {
+                    handle_leave_room(from_room);
+                }
+
+                g_slist_free(status_codes);
             }
 
         // self online
@@ -756,7 +779,19 @@ _muc_user_handler(xmpp_conn_t * const conn, xmpp_stanza_t * const stanza,
                     free(new_nick);
                 }
             } else {
-                handle_room_member_offline(from_room, from_nick, "offline", status_str);
+                GSList *status_codes = stanza_get_status_codes_by_ns(stanza, STANZA_NS_MUC_USER);
+
+                // kicked from room
+                if (g_slist_find_custom(status_codes, "307", (GCompareFunc)g_strcmp0) != NULL) {
+                    char *actor = stanza_get_kick_actor(stanza);
+                    char *reason = stanza_get_kick_reason(stanza);
+                    handle_room_occupent_kicked(from_room, from_nick, actor, reason);
+                    free(reason);
+
+                // normal exit
+                } else {
+                    handle_room_member_offline(from_room, from_nick, "offline", status_str);
+                }
             }
         } else {
             // send disco info for capabilities, if not cached