summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/common/inbound.c40
1 files changed, 26 insertions, 14 deletions
diff --git a/src/common/inbound.c b/src/common/inbound.c
index ee57854f..2f33199a 100644
--- a/src/common/inbound.c
+++ b/src/common/inbound.c
@@ -1073,6 +1073,7 @@ check_autojoin_channels (server *serv)
 	session *sess;
 	GSList *list = sess_list;
 	GSList *sess_channels = NULL;			/* joined channels that are not in the favorites list */
+	favchannel *fav;
 
 	/* shouldn't really happen, the io tag is destroyed in server.c */
 	if (!is_server (serv))
@@ -1080,17 +1081,7 @@ check_autojoin_channels (server *serv)
 		return;
 	}
 
-	/* autojoin to favorite channels */
-	if (serv->favlist)
-	{
-		serv->p_join_list (serv, serv->favlist);
-		i++;
-
-		/* FIXME this is not going to work and is not needed either. server_free() does the job already. */
-		/* g_slist_free_full (serv->favlist, (GDestroyNotify) servlist_favchan_free); */
-	}
-
-	/* upon a reconnect, also autojoin to channels not in the favorites but joined during the session */
+	/* If there's a session (i.e. this is a reconnect), autojoin to everything that was open previously. */
 	while (list)
 	{
 		sess = list->data;
@@ -1102,11 +1093,20 @@ check_autojoin_channels (server *serv)
 				strcpy (sess->waitchannel, sess->willjoinchannel);
 				sess->willjoinchannel[0] = 0;
 
-				if (!servlist_favchan_find (serv->network, sess->waitchannel, NULL))		/* don't reconnect if it's already in the favlist */
+				fav = servlist_favchan_find (serv->network, sess->waitchannel, NULL);	/* Is this channel in our favorites? */
+
+				/* session->channelkey is initially unset for channels joined from the favorites. You have to fill them up manually from favorites settings. */
+				if (fav)
 				{
-					sess_channels = servlist_favchan_listadd (sess_channels, sess->waitchannel, sess->channelkey);
-					i++;
+					/* session->channelkey is set if there was a key change during the session. In that case, use the session key, not the one from favorites. */
+					if (fav->key && !strlen (sess->channelkey))
+					{
+						safe_strcpy (sess->channelkey, fav->key, sizeof (sess->channelkey));
+					}
 				}
+
+				sess_channels = servlist_favchan_listadd (sess_channels, sess->waitchannel, sess->channelkey);
+				i++;
 			}
 		}
 
@@ -1118,6 +1118,18 @@ check_autojoin_channels (server *serv)
 		serv->p_join_list (serv, sess_channels);
 		g_slist_free_full (sess_channels, (GDestroyNotify) servlist_favchan_free);
 	}
+	else
+	{
+		/* If there's no session, just autojoin to favorites. */
+		if (serv->favlist)
+		{
+			serv->p_join_list (serv, serv->favlist);
+			i++;
+
+			/* FIXME this is not going to work and is not needed either. server_free() does the job already. */
+			/* g_slist_free_full (serv->favlist, (GDestroyNotify) servlist_favchan_free); */
+		}
+	}
 
 	serv->joindelay_tag = 0;
 	fe_server_event (serv, FE_SE_LOGGEDIN, i);