From c7b3ff02ff00c8266710a11dc5728f769d643570 Mon Sep 17 00:00:00 2001 From: James Booth Date: Wed, 23 Apr 2014 22:19:14 +0100 Subject: [PATCH] Rejoin private rooms after reconnecting --- src/muc.c | 20 ++++++++++++++++++++ src/muc.h | 3 ++- src/server_events.c | 12 ++++++++++++ 3 files changed, 34 insertions(+), 1 deletion(-) diff --git a/src/muc.c b/src/muc.c index 4ba88191..88b5e2cd 100644 --- a/src/muc.c +++ b/src/muc.c @@ -297,6 +297,26 @@ muc_get_room_nick(const char * const room) } } +/* + * Return password for the specified room + * The password is owned by the chat room and should not be modified or freed + */ +char * +muc_get_room_password(const char * const room) +{ + if (rooms != NULL) { + ChatRoom *chat_room = g_hash_table_lookup(rooms, room); + + if (chat_room != NULL) { + return chat_room->password; + } else { + return NULL; + } + } else { + return NULL; + } +} + /* * Returns TRUE if the specified nick exists in the room's roster */ diff --git a/src/muc.h b/src/muc.h index 34058bfe..2dc4aa85 100644 --- a/src/muc.h +++ b/src/muc.h @@ -37,7 +37,8 @@ void muc_leave_room(const char * const room); gboolean muc_room_is_active(const char * const room); gboolean muc_room_is_autojoin(const char * const room); GList* muc_get_active_room_list(void); -char * muc_get_room_nick(const char * const room); +char* muc_get_room_nick(const char * const room); +char* muc_get_room_password(const char * const room); void muc_set_room_pending_nick_change(const char * const room, const char * const new_nick); gboolean muc_is_room_pending_nick_change(const char * const room); diff --git a/src/server_events.c b/src/server_events.c index faedac83..d18f1beb 100644 --- a/src/server_events.c +++ b/src/server_events.c @@ -94,6 +94,18 @@ handle_login_account_success(char *account_name) ui_handle_login_account_success(account); + // attempt to rejoin rooms with passwords + GList *curr = muc_get_active_room_list(); + while (curr != NULL) { + char *password = muc_get_room_password(curr->data); + if (password != NULL) { + char *nick = muc_get_room_nick(curr->data); + presence_join_room(curr->data, nick, password); + } + curr = g_list_next(curr); + } + g_list_free(curr); + log_info("%s logged in successfully", account->jid); account_free(account); }