diff options
Diffstat (limited to 'root_commands.c')
| -rw-r--r-- | root_commands.c | 250 | 
1 files changed, 126 insertions, 124 deletions
| diff --git a/root_commands.c b/root_commands.c index 4f45c6d9..89fc4776 100644 --- a/root_commands.c +++ b/root_commands.c @@ -247,6 +247,116 @@ static void cmd_showset( irc_t *irc, set_t **head, char *key )  		irc_usermsg( irc, "%s is empty", key );  } +typedef set_t** (*cmd_set_findhead)( irc_t*, char* ); + +static int cmd_set_real( irc_t *irc, char **cmd, cmd_set_findhead findhead ) +{ +	char *set_full = NULL, *set_name = NULL, *tmp; +	set_t **head; +	 +	if( cmd[1] && g_strncasecmp( cmd[1], "-del", 4 ) == 0 ) +		set_full = cmd[2]; +	else +		set_full = cmd[1]; +	 +	if( findhead == NULL ) +	{ +		set_name = set_full; +		 +		head = &irc->set; +	} +	else  +	{ +		char *id; +		 +		if( !set_full ) +		{ +			/* FIXME: Broken # */ +			irc_usermsg( irc, "Not enough parameters given (need %d)", 3 ); +			return 0; +		} +	 +		if( ( tmp = strchr( set_full, '/' ) ) ) +		{ +			id = g_strndup( set_full, ( tmp - set_full ) ); +			set_name = tmp + 1; +		} +		else +		{ +			id = g_strdup( set_full ); +		} +		 +		if( ( head = findhead( irc, id ) ) == NULL ) +		{ +			g_free( id ); +			irc_usermsg( irc, "Could not find setting." ); +			return 0; +		} +		g_free( id ); +	} +	 +	if( cmd[1] && cmd[2] && set_name ) +	{ +		set_t *s = set_find( head, set_name ); +		int st; +		 +		/* +		if( a->ic && s && s->flags & ACC_SET_OFFLINE_ONLY ) +		{ +			irc_usermsg( irc, "This setting can only be changed when the account is %s-line", "off" ); +			return 0; +		} +		else if( !a->ic && s && s->flags & ACC_SET_ONLINE_ONLY ) +		{ +			irc_usermsg( irc, "This setting can only be changed when the account is %s-line", "on" ); +			return 0; +		} +		*/ +		 +		if( g_strncasecmp( cmd[1], "-del", 4 ) == 0 ) +			st = set_reset( head, set_name ); +		else +			st = set_setstr( head, set_name, cmd[2] ); +		 +		if( set_getstr( head, set_name ) == NULL ) +		{ +			if( st ) +				irc_usermsg( irc, "Setting changed successfully" ); +			else +				irc_usermsg( irc, "Failed to change setting" ); +		} +		else +		{ +			cmd_showset( irc, head, set_name ); +		} +	} +	else if( set_name ) +	{ +		cmd_showset( irc, head, set_name ); +	} +	else +	{ +		set_t *s = *head; +		while( s ) +		{ +			cmd_showset( irc, &s, s->key ); +			s = s->next; +		} +	} +	 +	return 1; +} + +static set_t **cmd_account_set_findhead( irc_t *irc, char *id ) +{ +	account_t *a; +	 +	if( ( a = account_get( irc, id ) ) ) +		return &a->set; +	else +		return NULL; +} +  static void cmd_account( irc_t *irc, char **cmd )  {  	account_t *a; @@ -419,88 +529,13 @@ static void cmd_account( irc_t *irc, char **cmd )  	}  	else if( g_strcasecmp( cmd[1], "set" ) == 0 )  	{ -		char *acc_handle, *set_name = NULL, *tmp; -		  		if( !cmd[2] )  		{  			irc_usermsg( irc, "Not enough parameters given (need %d)", 2 );  			return;  		} -		if( g_strncasecmp( cmd[2], "-del", 4 ) == 0 ) -			acc_handle = g_strdup( cmd[3] ); -		else -			acc_handle = g_strdup( cmd[2] ); -		 -		if( !acc_handle ) -		{ -			irc_usermsg( irc, "Not enough parameters given (need %d)", 3 ); -			return; -		} -		 -		if( ( tmp = strchr( acc_handle, '/' ) ) ) -		{ -			*tmp = 0; -			set_name = tmp + 1; -		} -		 -		if( ( a = account_get( irc, acc_handle ) ) == NULL ) -		{ -			g_free( acc_handle ); -			irc_usermsg( irc, "Invalid account" ); -			return; -		} -		 -		if( cmd[3] && set_name ) -		{ -			set_t *s = set_find( &a->set, set_name ); -			int st; -			 -			if( a->ic && s && s->flags & ACC_SET_OFFLINE_ONLY ) -			{ -				g_free( acc_handle ); -				irc_usermsg( irc, "This setting can only be changed when the account is %s-line", "off" ); -				return; -			} -			else if( !a->ic && s && s->flags & ACC_SET_ONLINE_ONLY ) -			{ -				g_free( acc_handle ); -				irc_usermsg( irc, "This setting can only be changed when the account is %s-line", "on" ); -				return; -			} -			 -			if( g_strncasecmp( cmd[2], "-del", 4 ) == 0 ) -				st = set_reset( &a->set, set_name ); -			else -				st = set_setstr( &a->set, set_name, cmd[3] ); -			 -			if( set_getstr( &a->set, set_name ) == NULL ) -			{ -				if( st ) -					irc_usermsg( irc, "Setting changed successfully" ); -				else -					irc_usermsg( irc, "Failed to change setting" ); -			} -			else -			{ -				cmd_showset( irc, &a->set, set_name ); -			} -		} -		else if( set_name ) -		{ -			cmd_showset( irc, &a->set, set_name ); -		} -		else -		{ -			set_t *s = a->set; -			while( s ) -			{ -				cmd_showset( irc, &s, s->key ); -				s = s->next; -			} -		} -		 -		g_free( acc_handle ); +		cmd_set_real( irc, cmd + 1, cmd_account_set_findhead );  	}  	else  	{ @@ -834,54 +869,7 @@ static void cmd_yesno( irc_t *irc, char **cmd )  static void cmd_set( irc_t *irc, char **cmd )  { -	char *set_name = cmd[1]; -	 -	if( cmd[1] && cmd[2] ) -	{ -		int st; -		 -		if( g_strncasecmp( cmd[1], "-del", 4 ) == 0 ) -		{ -			st = set_reset( &irc->set, cmd[2] ); -			set_name = cmd[2]; -		} -		else -		{ -			st = set_setstr( &irc->set, cmd[1], cmd[2] ); -		} -		 -		/* Normally we just show the variable's new/unchanged -		   value as feedback to the user, but this has always -		   caused confusion when changing the password. Give -		   other feedback instead: */ -		if( set_getstr( &irc->set, set_name ) == NULL ) -		{ -			if( st ) -				irc_usermsg( irc, "Setting changed successfully" ); -			else -				irc_usermsg( irc, "Failed to change setting" ); -		} -		else -		{ -			cmd_showset( irc, &irc->set, set_name ); -		} -	} -	else if( set_name ) -	{ -		cmd_showset( irc, &irc->set, set_name ); - -		if( strchr( set_name, '/' ) ) -			irc_usermsg( irc, "Warning: / found in setting name, you're probably looking for the `account set' command." ); -	} -	else -	{ -		set_t *s = irc->set; -		while( s ) -		{ -			cmd_showset( irc, &s, s->key ); -			s = s->next; -		} -	} +	cmd_set_real( irc, cmd, NULL );  }  static void cmd_save( irc_t *irc, char **cmd ) @@ -1006,6 +994,16 @@ static void cmd_join_chat( irc_t *irc, char **cmd )  	                  "Please try the `chat' command instead." );  } +static set_t **cmd_chat_set_findhead( irc_t *irc, char *id ) +{ +	struct chat *c; +	 +	if( ( c = chat_get( irc, id ) ) ) +		return &c->set; +	else +		return NULL; +} +  static void cmd_chat( irc_t *irc, char **cmd )  {  	account_t *acc; @@ -1046,6 +1044,10 @@ static void cmd_chat( irc_t *irc, char **cmd )  		}  		irc_usermsg( irc, "End of chatroom list" );  	} +	else if( g_strcasecmp( cmd[1], "set" ) == 0 ) +	{ +		cmd_set_real( irc, cmd + 1, cmd_chat_set_findhead ); +	}  	else  	{  		irc_usermsg( irc, "Unknown command: %s %s. Please use \x02help commands\x02 to get a list of available commands.", "chat", cmd[1] ); | 
