Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • set.c

    rf3579fd r823de9d  
    225225}
    226226
    227 char *set_eval_ops( set_t *set, char *value )
     227char* set_eval_op_root( set_t *set, char* value )
    228228{
    229229        irc_t *irc = set->data;
    230        
    231         if( g_strcasecmp( value, "user" ) == 0 )
    232                 irc_write( irc, ":%s!%s@%s MODE %s %s %s %s", irc->mynick, irc->mynick, irc->myhost,
    233                                                               irc->channel, "+o-o", irc->nick, irc->mynick );
    234         else if( g_strcasecmp( value, "root" ) == 0 )
    235                 irc_write( irc, ":%s!%s@%s MODE %s %s %s %s", irc->mynick, irc->mynick, irc->myhost,
    236                                                               irc->channel, "-o+o", irc->nick, irc->mynick );
    237         else if( g_strcasecmp( value, "both" ) == 0 )
    238                 irc_write( irc, ":%s!%s@%s MODE %s %s %s %s", irc->mynick, irc->mynick, irc->myhost,
    239                                                               irc->channel, "+oo", irc->nick, irc->mynick );
    240         else if( g_strcasecmp( value, "none" ) == 0 )
    241                 irc_write( irc, ":%s!%s@%s MODE %s %s %s %s", irc->mynick, irc->mynick, irc->myhost,
    242                                                               irc->channel, "-oo", irc->nick, irc->mynick );
     230        char* ret = set_eval_bool(set, value);
     231        int b = bool2int(ret);
     232
     233        irc_write( irc, ":%s!%s@%s MODE %s %s %s", irc->mynick, irc->mynick, irc->myhost,
     234                                               irc->channel, b?"+o":"-o", irc->mynick);
     235
     236        return ret;
     237}
     238
     239char* set_eval_op_user( set_t *set, char* value )
     240{
     241        irc_t *irc = set->data;
     242        char* ret = set_eval_bool(set, value);
     243        int b = bool2int(ret);
     244
     245        irc_write( irc, ":%s!%s@%s MODE %s %s %s", irc->mynick, irc->mynick, irc->myhost,
     246                                               irc->channel, b?"+o":"-o", irc->nick);
     247
     248        return ret;
     249}
     250
     251/* generalized version of set_eval_op/voice_buddies */
     252char *set_eval_mode_buddies( set_t *set, char *value, char modeflag )
     253{
     254        irc_t *irc = set->data;
     255        char op[64], deop[64];
     256        int nop=0, ndeop=0;
     257        user_t *u;
     258        int mode;
     259       
     260        if(!strcmp(value, "false"))
     261                mode=0;
     262        else if(!strcmp(value, "encrypted"))
     263                mode=1;
     264        else if(!strcmp(value, "trusted"))
     265                mode=2;
     266        else if(!strcmp(value, "notaway"))
     267                mode=3;
    243268        else
    244                 return SET_INVALID;
    245        
     269                return NULL;
     270
     271        /* sorry for calling them op/deop - too lazy for search+replace :P */
     272        op[0]='\0';
     273        deop[0]='\0';
     274        for(u=irc->users; u; u=u->next) {
     275                /* we're only concerned with online buddies */
     276                if(!u->ic || !u->online)
     277                        continue;
     278
     279                /* just in case... */
     280                if(strlen(u->nick) >= 64)
     281                        continue;
     282               
     283                /* dump out ops/deops when the corresponding name list fills up */
     284                if(strlen(op)+strlen(u->nick)+2 > 64) {
     285                        char *flags = g_strnfill(nop, modeflag);
     286                        irc_write( irc, ":%s!%s@%s MODE %s +%s%s", irc->mynick, irc->mynick, irc->myhost,
     287                                                               irc->channel, flags, op );
     288                    op[0]='\0';
     289            nop=0;
     290                    g_free(flags);
     291                }
     292                if(strlen(deop)+strlen(u->nick)+2 > 64) {
     293                        char *flags = g_strnfill(ndeop, modeflag);
     294                        irc_write( irc, ":%s!%s@%s MODE %s -%s%s", irc->mynick, irc->mynick, irc->myhost,
     295                                                               irc->channel, flags, deop );
     296                    deop[0]='\0';
     297            ndeop=0;
     298                    g_free(flags);
     299                }
     300               
     301                switch(mode) {
     302                /* "false" */
     303                case 0:
     304                        g_strlcat(deop, " ", 64);
     305                        g_strlcat(deop, u->nick, 64);
     306                        ndeop++;
     307                        break;
     308                /* "encrypted" */
     309                case 1:
     310                        if(u->encrypted) {
     311                                g_strlcat(op, " ", 64);
     312                                g_strlcat(op, u->nick, 64);
     313                                nop++;
     314                        } else {
     315                                g_strlcat(deop, " ", 64);
     316                                g_strlcat(deop, u->nick, 64);
     317                                ndeop++;
     318                        }
     319                        break;
     320                /* "trusted" */
     321                case 2:
     322                        if(u->encrypted > 1) {
     323                                g_strlcat(op, " ", 64);
     324                                g_strlcat(op, u->nick, 64);
     325                                nop++;
     326                        } else {
     327                                g_strlcat(deop, " ", 64);
     328                                g_strlcat(deop, u->nick, 64);
     329                                ndeop++;
     330                        }
     331                        break;
     332                /* "notaway" */
     333                case 3:
     334                        if(u->away) {
     335                                g_strlcat(deop, " ", 64);
     336                                g_strlcat(deop, u->nick, 64);
     337                                ndeop++;
     338                        } else {
     339                                g_strlcat(op, " ", 64);
     340                                g_strlcat(op, u->nick, 64);
     341                                nop++;
     342                        }
     343                }
     344        }
     345        /* dump anything left in op/deop lists */
     346        if(*op) {
     347                char *flags = g_strnfill(nop, modeflag);
     348                irc_write( irc, ":%s!%s@%s MODE %s +%s%s", irc->mynick, irc->mynick, irc->myhost,
     349                                                               irc->channel, flags, op );
     350                g_free(flags);
     351        }
     352        if(*deop) {
     353                char *flags = g_strnfill(ndeop, modeflag);
     354                irc_write( irc, ":%s!%s@%s MODE %s -%s%s", irc->mynick, irc->mynick, irc->myhost,
     355                                                   irc->channel, flags, deop );
     356        g_free(flags);
     357    }
     358
    246359        return value;
    247360}
     361
     362char *set_eval_op_buddies( set_t *set, char *value )
     363{
     364        return set_eval_mode_buddies(set, value, 'o');
     365}
     366
     367char *set_eval_halfop_buddies( set_t *set, char *value )
     368{
     369        return set_eval_mode_buddies(set, value, 'h');
     370}
     371
     372char *set_eval_voice_buddies( set_t *set, char *value )
     373{
     374        return set_eval_mode_buddies(set, value, 'v');
     375}
     376
     377/* possible values: never, opportunistic, manual, always */
     378char *set_eval_otr_policy( set_t *set, char *value )
     379{
     380        if ( !strcmp(value, "never") )
     381                return value;
     382        if ( !strcmp(value, "opportunistic") )
     383                return value;
     384        if ( !strcmp(value, "manual") )
     385                return value;
     386        if ( !strcmp(value, "always") )
     387                return value;
     388        return NULL;
     389}
     390
Note: See TracChangeset for help on using the changeset viewer.