about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/command/cmd_ac.c34
-rw-r--r--src/event/client_events.c1
-rw-r--r--src/event/server_events.c7
-rw-r--r--src/xmpp/bookmark.c12
-rw-r--r--src/xmpp/muc.c27
-rw-r--r--src/xmpp/muc.h5
6 files changed, 79 insertions, 7 deletions
diff --git a/src/command/cmd_ac.c b/src/command/cmd_ac.c
index a0226d31..bb6e9cd6 100644
--- a/src/command/cmd_ac.c
+++ b/src/command/cmd_ac.c
@@ -940,6 +940,7 @@ cmd_ac_reset(ProfWin *window)
     }
 
     muc_invites_reset_ac();
+    muc_confserver_reset_ac();
     accounts_reset_all_search();
     accounts_reset_enabled_search();
     tlscerts_reset_ac();
@@ -3133,17 +3134,21 @@ _rooms_autocomplete(ProfWin *window, const char *const input, gboolean previous)
                 return found;
             }
         }
-        if ((num_args == 1 && g_strcmp0(args[0], "cache") == 0 && space_at_end) || 
-                (num_args == 2 && g_strcmp0(args[0], "cache") == 0)) {
-            found = autocomplete_param_with_ac(input, "/rooms cache", rooms_cache_ac, TRUE, previous);
+        if ((num_args == 1 && g_strcmp0(args[0], "service") == 0 && space_at_end) ||
+                (num_args == 2 && g_strcmp0(args[0], "service") == 0 && !space_at_end)) {
+            found = autocomplete_param_with_func(input, "/rooms service", muc_confserver_find, previous);
             if (found) {
                 g_strfreev(args);
                 return found;
             }
         }
-        if ((num_args >= 2) && g_strcmp0(args[0], "cache") == 0) {
-            g_strfreev(args);
-            return NULL;
+        if ((num_args == 1 && g_strcmp0(args[0], "cache") == 0 && space_at_end) ||
+                (num_args == 2 && g_strcmp0(args[0], "cache") == 0 && !space_at_end)) {
+            found = autocomplete_param_with_ac(input, "/rooms cache", rooms_cache_ac, TRUE, previous);
+            if (found) {
+                g_strfreev(args);
+                return found;
+            }
         }
         if ((num_args == 2 && space_at_end) || (num_args == 3 && !space_at_end)) {
             GString *beginning = g_string_new("/rooms");
@@ -3155,9 +3160,24 @@ _rooms_autocomplete(ProfWin *window, const char *const input, gboolean previous)
                 return found;
             }
         }
+        if ((num_args == 3 && g_strcmp0(args[2], "service") == 0 && space_at_end) ||
+                (num_args == 4 && g_strcmp0(args[2], "service") == 0 && !space_at_end)) {
+            GString *beginning = g_string_new("/rooms");
+            g_string_append_printf(beginning, " %s %s %s", args[0], args[1], args[2]);
+            found = autocomplete_param_with_func(input, beginning->str, muc_confserver_find, previous);
+            g_string_free(beginning, TRUE);
+            if (found) {
+                g_strfreev(args);
+                return found;
+            }
+        }
+        if ((num_args >= 2) && g_strcmp0(args[0], "cache") == 0) {
+            g_strfreev(args);
+            return NULL;
+        }
     }
 
     g_strfreev(args);
 
     return NULL;
-}
\ No newline at end of file
+}
diff --git a/src/event/client_events.c b/src/event/client_events.c
index db983107..94f75ba5 100644
--- a/src/event/client_events.c
+++ b/src/event/client_events.c
@@ -88,6 +88,7 @@ cl_ev_disconnect(void)
     session_disconnect();
     roster_destroy();
     muc_invites_clear();
+    muc_confserver_clear();
     chat_sessions_clear();
     tlscerts_clear_current();
 #ifdef HAVE_LIBGPGME
diff --git a/src/event/server_events.c b/src/event/server_events.c
index 377a1945..efd8756d 100644
--- a/src/event/server_events.c
+++ b/src/event/server_events.c
@@ -181,6 +181,7 @@ sv_ev_lost_connection(void)
 #endif
 
     muc_invites_clear();
+    muc_confserver_clear();
     chat_sessions_clear();
     ui_disconnected();
     roster_destroy();
@@ -797,6 +798,12 @@ sv_ev_muc_self_online(const char *const room, const char *const nick, gboolean c
             ui_room_join(room, TRUE);
         }
 
+        Jid *jidp = jid_create(room);
+        if (jidp->domainpart) {
+            muc_confserver_add(jidp->domainpart);
+        }
+        jid_destroy(jidp);
+
         iq_room_info_request(room, FALSE);
 
         if (muc_invites_contain(room)) {
diff --git a/src/xmpp/bookmark.c b/src/xmpp/bookmark.c
index accc8a5c..65009224 100644
--- a/src/xmpp/bookmark.c
+++ b/src/xmpp/bookmark.c
@@ -98,6 +98,12 @@ bookmark_add(const char *jid, const char *nick, const char *password, const char
 {
     assert(jid != NULL);
 
+    Jid *jidp = jid_create(jid);
+    if (jidp->domainpart) {
+        muc_confserver_add(jidp->domainpart);
+    }
+    jid_destroy(jidp);
+
     if (g_hash_table_contains(bookmarks, jid)) {
         return FALSE;
     }
@@ -297,6 +303,12 @@ _bookmark_result_id_handler(xmpp_stanza_t *const stanza, void *const userdata)
             sv_ev_bookmark_autojoin(bookmark);
         }
 
+        Jid *jidp = jid_create(barejid);
+        if (jidp->domainpart) {
+            muc_confserver_add(jidp->domainpart);
+        }
+        jid_destroy(jidp);
+
         child = xmpp_stanza_get_next(child);
     }
 
diff --git a/src/xmpp/muc.c b/src/xmpp/muc.c
index 3a6372d7..43e2bdbf 100644
--- a/src/xmpp/muc.c
+++ b/src/xmpp/muc.c
@@ -69,6 +69,7 @@ typedef struct _muc_room_t {
 GHashTable *rooms = NULL;
 GHashTable *invite_passwords = NULL;
 Autocomplete invite_ac;
+Autocomplete confservers_ac;
 
 static void _free_room(ChatRoom *room);
 static gint _compare_occupants(Occupant *a, Occupant *b);
@@ -84,6 +85,7 @@ void
 muc_init(void)
 {
     invite_ac = autocomplete_new();
+    confservers_ac = autocomplete_new();
     rooms = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, (GDestroyNotify)_free_room);
     invite_passwords = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free);
 }
@@ -92,6 +94,7 @@ void
 muc_close(void)
 {
     autocomplete_free(invite_ac);
+    autocomplete_free(confservers_ac);
     g_hash_table_destroy(rooms);
     g_hash_table_destroy(invite_passwords);
     rooms = NULL;
@@ -99,6 +102,12 @@ muc_close(void)
 }
 
 void
+muc_confserver_add(const char *const server)
+{
+    autocomplete_add(confservers_ac, server);
+}
+
+void
 muc_invites_add(const char *const room, const char *const password)
 {
     autocomplete_add(invite_ac, room);
@@ -156,12 +165,24 @@ muc_invites_reset_ac(void)
     autocomplete_reset(invite_ac);
 }
 
+void
+muc_confserver_reset_ac(void)
+{
+    autocomplete_reset(confservers_ac);
+}
+
 char*
 muc_invites_find(const char *const search_str, gboolean previous)
 {
     return autocomplete_complete(invite_ac, search_str, TRUE, previous);
 }
 
+char*
+muc_confserver_find(const char *const search_str, gboolean previous)
+{
+    return autocomplete_complete(confservers_ac, search_str, TRUE, previous);
+}
+
 void
 muc_invites_clear(void)
 {
@@ -172,6 +193,12 @@ muc_invites_clear(void)
 }
 
 void
+muc_confserver_clear(void)
+{
+    autocomplete_clear(confservers_ac);
+}
+
+void
 muc_join(const char *const room, const char *const nick, const char *const password, gboolean autojoin)
 {
     ChatRoom *new_room = malloc(sizeof(ChatRoom));
diff --git a/src/xmpp/muc.h b/src/xmpp/muc.h
index 5303eaa9..e50e2a87 100644
--- a/src/xmpp/muc.h
+++ b/src/xmpp/muc.h
@@ -117,6 +117,11 @@ GSList* muc_occupants_by_affiliation(const char *const room, muc_affiliation_t a
 void muc_occupant_nick_change_start(const char *const room, const char *const new_nick, const char *const old_nick);
 char* muc_roster_nick_change_complete(const char *const room, const char *const nick);
 
+void muc_confserver_add(const char *const server);
+void muc_confserver_reset_ac(void);
+char* muc_confserver_find(const char *const search_str, gboolean previous);
+void muc_confserver_clear(void);
+
 void muc_invites_add(const char *const room, const char *const password);
 void muc_invites_remove(const char *const room);
 gint muc_invites_count(void);