diff options
| author | Wilmer van der Gaast <wilmer@gaast.net> | 2010-07-01 00:46:55 +0100 | 
|---|---|---|
| committer | Wilmer van der Gaast <wilmer@gaast.net> | 2010-07-01 00:46:55 +0100 | 
| commit | 52a252173062bbce66040ef2b79c15dc2e2c03e6 (patch) | |
| tree | efce48c61d34dfb9e1ac6e81405dd933a9e14a10 /irc_im.c | |
| parent | 06f9548d5f3b0909c8cdbd092dd3118c661be67b (diff) | |
When receiving a channel name hint, and a channel with that name already
exists, remove it if it's fully unused, instead of failing immediately. 
(Fixes #639.)
Diffstat (limited to 'irc_im.c')
| -rw-r--r-- | irc_im.c | 39 | 
1 files changed, 29 insertions, 10 deletions
| @@ -420,7 +420,7 @@ static gboolean bee_irc_chat_new( bee_t *bee, struct groupchat *c )  	int i;  	/* Try to find a channel that expects to receive a groupchat. -	   This flag is set by groupchat_stub_invite(). */ +	   This flag is set earlier in our current call trace. */  	for( l = irc->channels; l; l = l->next )  	{  		ic = l->data; @@ -529,7 +529,7 @@ static gboolean bee_irc_chat_topic( bee_t *bee, struct groupchat *c, const char  static gboolean bee_irc_chat_name_hint( bee_t *bee, struct groupchat *c, const char *name )  {  	irc_t *irc = bee->ui_data; -	irc_channel_t *ic = c->ui_data; +	irc_channel_t *ic = c->ui_data, *oic;  	char stripped[MAX_NICK_LENGTH+1], *full_name;  	/* Don't rename a channel if the user's in it already. */ @@ -542,18 +542,37 @@ static gboolean bee_irc_chat_name_hint( bee_t *bee, struct groupchat *c, const c  	if( set_getbool( &bee->set, "lcnicks" ) )  		nick_lc( stripped ); -	full_name = g_strdup_printf( "#%s", stripped ); +	if( stripped[0] == '\0' ) +		return FALSE; -	if( stripped[0] && irc_channel_by_name( irc, full_name ) == NULL ) -	{ -		g_free( ic->name ); -		ic->name = full_name; -	} -	else +	full_name = g_strdup_printf( "#%s", stripped ); +	if( ( oic = irc_channel_by_name( irc, full_name ) ) )  	{ -		g_free( full_name ); +		char *type, *chat_type; +		 +		type = set_getstr( &oic->set, "type" ); +		chat_type = set_getstr( &oic->set, "chat_type" ); +		 +		if( type && chat_type && oic->data == FALSE && +		    strcmp( type, "chat" ) == 0 && +		    strcmp( chat_type, "groupchat" ) == 0 ) +		{ +			/* There's a channel with this name already, but it looks +			   like it's not in use yet. Most likely the IRC client +			   rejoined the channel after a reconnect. Remove it so +			   we can reuse its name. */ +			irc_channel_free( oic ); +		} +		else +		{ +			g_free( full_name ); +			return FALSE; +		}  	} +	g_free( ic->name ); +	ic->name = full_name; +	  	return TRUE;  } | 
