diff options
Diffstat (limited to 'set.c')
-rw-r--r-- | set.c | 216 |
1 files changed, 46 insertions, 170 deletions
@@ -28,7 +28,7 @@ /* Used to use NULL for this, but NULL is actually a "valid" value. */ char *SET_INVALID = "nee"; -set_t *set_add( set_t **head, char *key, char *def, set_eval eval, void *data ) +set_t *set_add( set_t **head, const char *key, const char *def, set_eval eval, void *data ) { set_t *s = set_find( head, key ); @@ -62,13 +62,14 @@ set_t *set_add( set_t **head, char *key, char *def, set_eval eval, void *data ) return s; } -set_t *set_find( set_t **head, char *key ) +set_t *set_find( set_t **head, const char *key ) { set_t *s = *head; while( s ) { - if( g_strcasecmp( s->key, key ) == 0 ) + if( g_strcasecmp( s->key, key ) == 0 || + ( s->old_key && g_strcasecmp( s->old_key, key ) == 0 ) ) break; s = s->next; } @@ -76,7 +77,7 @@ set_t *set_find( set_t **head, char *key ) return s; } -char *set_getstr( set_t **head, char *key ) +char *set_getstr( set_t **head, const char *key ) { set_t *s = set_find( head, key ); @@ -86,7 +87,7 @@ char *set_getstr( set_t **head, char *key ) return s->value ? s->value : s->def; } -int set_getint( set_t **head, char *key ) +int set_getint( set_t **head, const char *key ) { char *s = set_getstr( head, key ); int i = 0; @@ -100,7 +101,7 @@ int set_getint( set_t **head, char *key ) return i; } -int set_getbool( set_t **head, char *key ) +int set_getbool( set_t **head, const char *key ) { char *s = set_getstr( head, key ); @@ -110,7 +111,7 @@ int set_getbool( set_t **head, char *key ) return bool2int( s ); } -int set_setstr( set_t **head, char *key, char *value ) +int set_setstr( set_t **head, const char *key, char *value ) { set_t *s = set_find( head, key ); char *nv = value; @@ -149,7 +150,7 @@ int set_setstr( set_t **head, char *key, char *value ) return 1; } -int set_setint( set_t **head, char *key, int value ) +int set_setint( set_t **head, const char *key, int value ) { char s[24]; /* Not quite 128-bit clean eh? ;-) */ @@ -157,7 +158,7 @@ int set_setint( set_t **head, char *key, int value ) return set_setstr( head, key, s ); } -void set_del( set_t **head, char *key ) +void set_del( set_t **head, const char *key ) { set_t *s = *head, *t = NULL; @@ -175,13 +176,14 @@ void set_del( set_t **head, char *key ) *head = s->next; g_free( s->key ); - if( s->value ) g_free( s->value ); - if( s->def ) g_free( s->def ); + g_free( s->old_key ); + g_free( s->value ); + g_free( s->def ); g_free( s ); } } -int set_reset( set_t **head, char *key ) +int set_reset( set_t **head, const char *key ) { set_t *s; @@ -212,6 +214,21 @@ char *set_eval_bool( set_t *set, char *value ) return is_bool( value ) ? value : SET_INVALID; } +char *set_eval_list( set_t *set, char *value ) +{ + GSList *options = set->eval_data, *opt; + + for( opt = options; opt; opt = opt->next ) + if( strcmp( value, opt->data ) == 0 ) + return value; + + /* TODO: It'd be nice to show the user a list of allowed values, + but we don't have enough context here to do that. May + want to fix that. */ + + return NULL; +} + char *set_eval_to_char( set_t *set, char *value ) { char *s = g_new( char, 3 ); @@ -224,167 +241,26 @@ char *set_eval_to_char( set_t *set, char *value ) return s; } -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 ) +/* +char *set_eval_ops( set_t *set, char *value ) { irc_t *irc = set->data; - char op[64], deop[64]; - int nop=0, ndeop=0; - user_t *u; - int mode; - - 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; + + 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 ); 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; -} - +*/ |