diff options
Diffstat (limited to 'set.c')
| -rw-r--r-- | set.c | 171 | 
1 files changed, 157 insertions, 14 deletions
| @@ -224,24 +224,167 @@ char *set_eval_to_char( set_t *set, char *value )  	return s;  } -char *set_eval_ops( set_t *set, char *value ) +char* set_eval_op_root( set_t *set, char* value )  {  	irc_t *irc = set->data; +	char* ret = set_eval_bool(set, value); +	int b = bool2int(ret); + +	irc_write( irc, ":%s!%s@%s MODE %s %s %s", irc->mynick, irc->mynick, irc->myhost, +                                               irc->channel, b?"+o":"-o", irc->mynick); + +	return ret; +} + +char* set_eval_op_user( set_t *set, char* value ) +{ +	irc_t *irc = set->data; +	char* ret = set_eval_bool(set, value); +	int b = bool2int(ret); + +	irc_write( irc, ":%s!%s@%s MODE %s %s %s", irc->mynick, irc->mynick, irc->myhost, +                                               irc->channel, b?"+o":"-o", irc->nick); + +	return ret; +} + +/* generalized version of set_eval_op/voice_buddies */ +char *set_eval_mode_buddies( set_t *set, char *value, char modeflag ) +{ +	irc_t *irc = set->data; +	char op[64], deop[64]; +	int nop=0, ndeop=0; +	user_t *u; +	int mode; -	if( g_strcasecmp( value, "user" ) == 0 ) -		irc_write( irc, ":%s!%s@%s MODE %s %s %s %s", irc->mynick, irc->mynick, irc->myhost, -		                                              irc->channel, "+o-o", irc->nick, irc->mynick ); -	else if( g_strcasecmp( value, "root" ) == 0 ) -		irc_write( irc, ":%s!%s@%s MODE %s %s %s %s", irc->mynick, irc->mynick, irc->myhost, -		                                              irc->channel, "-o+o", irc->nick, irc->mynick ); -	else if( g_strcasecmp( value, "both" ) == 0 ) -		irc_write( irc, ":%s!%s@%s MODE %s %s %s %s", irc->mynick, irc->mynick, irc->myhost, -		                                              irc->channel, "+oo", irc->nick, irc->mynick ); -	else if( g_strcasecmp( value, "none" ) == 0 ) -		irc_write( irc, ":%s!%s@%s MODE %s %s %s %s", irc->mynick, irc->mynick, irc->myhost, -		                                              irc->channel, "-oo", irc->nick, irc->mynick ); +	if(!strcmp(value, "false")) +		mode=0; +	else if(!strcmp(value, "encrypted")) +		mode=1; +	else if(!strcmp(value, "trusted")) +		mode=2; +	else if(!strcmp(value, "notaway")) +		mode=3;  	else  		return SET_INVALID; -	 + +	/* sorry for calling them op/deop - too lazy for search+replace :P */ +	op[0]='\0'; +	deop[0]='\0'; +	for(u=irc->users; u; u=u->next) { +		/* we're only concerned with online buddies */ +		if(!u->ic || !u->online) +			continue; + +		/* just in case... */ +		if(strlen(u->nick) >= 64) +			continue; +		 +		/* dump out ops/deops when the corresponding name list fills up */ +		if(strlen(op)+strlen(u->nick)+2 > 64) { +			char *flags = g_strnfill(nop, modeflag); +			irc_write( irc, ":%s!%s@%s MODE %s +%s%s", irc->mynick, irc->mynick, irc->myhost, +		                                               irc->channel, flags, op ); +		    op[0]='\0'; +            nop=0; +		    g_free(flags); +		} +		if(strlen(deop)+strlen(u->nick)+2 > 64) { +			char *flags = g_strnfill(ndeop, modeflag); +			irc_write( irc, ":%s!%s@%s MODE %s -%s%s", irc->mynick, irc->mynick, irc->myhost, +		                                               irc->channel, flags, deop ); +		    deop[0]='\0'; +            ndeop=0; +		    g_free(flags); +		} +		 +		switch(mode) { +		/* "false" */ +		case 0: +			g_strlcat(deop, " ", 64); +			g_strlcat(deop, u->nick, 64); +			ndeop++; +			break; +		/* "encrypted" */ +		case 1: +			if(u->encrypted) { +				g_strlcat(op, " ", 64); +				g_strlcat(op, u->nick, 64); +				nop++; +			} else { +				g_strlcat(deop, " ", 64); +				g_strlcat(deop, u->nick, 64); +				ndeop++; +			} +			break; +		/* "trusted" */ +		case 2: +			if(u->encrypted > 1) { +				g_strlcat(op, " ", 64); +				g_strlcat(op, u->nick, 64); +				nop++; +			} else { +				g_strlcat(deop, " ", 64); +				g_strlcat(deop, u->nick, 64); +				ndeop++; +			} +			break; +		/* "notaway" */ +		case 3: +			if(u->away) { +				g_strlcat(deop, " ", 64); +				g_strlcat(deop, u->nick, 64); +				ndeop++; +			} else { +				g_strlcat(op, " ", 64); +				g_strlcat(op, u->nick, 64); +				nop++; +			} +		} +	} +	/* dump anything left in op/deop lists */ +	if(*op) { +		char *flags = g_strnfill(nop, modeflag); +		irc_write( irc, ":%s!%s@%s MODE %s +%s%s", irc->mynick, irc->mynick, irc->myhost, +		                                               irc->channel, flags, op ); +		g_free(flags); +	} +	if(*deop) { +		char *flags = g_strnfill(ndeop, modeflag); +		irc_write( irc, ":%s!%s@%s MODE %s -%s%s", irc->mynick, irc->mynick, irc->myhost, +                                                   irc->channel, flags, deop ); +        g_free(flags); +    } +  	return value;  } + +char *set_eval_op_buddies( set_t *set, char *value ) +{ +	return set_eval_mode_buddies(set, value, 'o'); +} + +char *set_eval_halfop_buddies( set_t *set, char *value ) +{ +	return set_eval_mode_buddies(set, value, 'h'); +} + +char *set_eval_voice_buddies( set_t *set, char *value ) +{ +	return set_eval_mode_buddies(set, value, 'v'); +} + +/* possible values: never, opportunistic, manual, always */ +char *set_eval_otr_policy( set_t *set, char *value ) +{ +	if ( !strcmp(value, "never") ) +		return value; +	if ( !strcmp(value, "opportunistic") ) +		return value; +	if ( !strcmp(value, "manual") ) +		return value; +	if ( !strcmp(value, "always") ) +		return value; +	return NULL; +} + | 
