Пример #1
0
static gboolean
check_autojoin_channels (server * serv)
{
    char *po;
    session *sess;
    GSList *list = sess_list;
    int i = 0;
    GSList *channels, *keys;

    /* shouldnt really happen, the io tag is destroyed in server.c */
    if (!is_server (serv))
        return FALSE;

    /* send auto join list */
    if (serv->autojoin)
    {
        joinlist_split (serv->autojoin, &channels, &keys);
        serv->p_join_list (serv, channels, keys);
        joinlist_free (channels, keys);

        free (serv->autojoin);
        serv->autojoin = NULL;
    }

    /* this is really only for re-connects when you
     * join channels not in the auto-join list. */
    while (list)
    {
        sess = list->data;
        if (sess->server == serv)
        {
            if (sess->willjoinchannel[0] != 0)
            {
                strcpy (sess->waitchannel, sess->willjoinchannel);
                sess->willjoinchannel[0] = 0;
                serv->p_join (serv, sess->waitchannel,
                              sess->channelkey);
                po = strchr (sess->waitchannel, ',');
                if (po)
                    *po = 0;
                po = strchr (sess->waitchannel, ' ');
                if (po)
                    *po = 0;
                i++;
            }
        }
        list = list->next;
    }
    serv->joindelay_tag = 0;
    fe_server_event (serv, FE_SE_LOGGEDIN, i);
    return FALSE;
}
Пример #2
0
static gboolean
check_autojoin_channels (server *serv)
{
	int i = 0;
	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))
	{
		return FALSE;
	}

	/* If there's a session (i.e. this is a reconnect), autojoin to everything that was open previously. */
	while (list)
	{
		sess = list->data;

		if (sess->server == serv)
		{
			if (sess->willjoinchannel[0] != 0)
			{
				strcpy (sess->waitchannel, sess->willjoinchannel);
				sess->willjoinchannel[0] = 0;

				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)
				{
					/* 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));
					}
				}

				/* for easier checks, ensure that favchannel->key is just NULL when session->channelkey is empty i.e. '' */
				if (strlen (sess->channelkey))
				{
					sess_channels = servlist_favchan_listadd (sess_channels, sess->waitchannel, sess->channelkey);
				}
				else
				{
					sess_channels = servlist_favchan_listadd (sess_channels, sess->waitchannel, NULL);
				}
				i++;
			}
		}

		list = list->next;
	}

	if (sess_channels)
	{
		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);
	return FALSE;
}