+ if (discrim->modes) {
+ unsigned int ii, matches = 0;
+ unsigned int negate = 0;
+ for (ii = 0; ii < strlen(discrim->modes); ii++) {
+ switch(discrim->modes[ii]) {
+ case '+':
+ negate = 0;
+ matches++;
+ break;
+ case '-':
+ negate = 1;
+ matches++;
+ break;
+ case 'O':
+ if((IsOper(user) != 0) != negate) matches++;
+ break;
+ case 'o':
+ if((IsOper(user) != 0) != negate) matches++;
+ break;
+ case 'i':
+ if((IsInvisible(user) != 0) != negate) matches++;
+ break;
+ case 'w':
+ if((IsWallOp(user) != 0) != negate) matches++;
+ break;
+ case 'd':
+ if((IsDeaf(user) != 0) != negate) matches++;
+ break;
+ case 'k':
+ if((IsService(user) != 0) != negate) matches++;
+ break;
+ case 'g':
+ if((IsGlobal(user) != 0) != negate) matches++;
+ break;
+ case 'h':
+ if((IsSetHost(user) != 0) != negate) matches++;
+ break;
+ case 'B':
+ if((IsBotM(user) != 0) != negate) matches++;
+ break;
+ case 'p':
+ case 'n':
+ if((IsHideChans(user) != 0) != negate) matches++;
+ break;
+ case 'I':
+ if((IsHideIdle(user) != 0) != negate) matches++;
+ break;
+ case 'X':
+ if((IsXtraOp(user) != 0) != negate) matches++;
+ break;
+ case 'x':
+ if((IsHiddenHost(user) != 0) != negate) matches++;
+ break;
+ case 'a':
+ if((IsAdmin(user) != 0) != negate) matches++;
+ break;
+ case 'z':
+ if((IsSSL(user) != 0) != negate) matches++;
+ break;
+ case 'D':
+ if((IsPrivDeaf(user) != 0) != negate) matches++;
+ break;
+ case 'R':
+ if((IsAccountOnly(user) != 0) != negate) matches++;
+ break;
+ case 'W':
+ if((IsWhoisNotice(user) != 0) != negate) matches++;
+ break;
+ case 'H':
+ if((IsHideOper(user) != 0) != negate) matches++;
+ break;
+ case 'L':
+ if((IsHideOper(user) != 0) != negate) matches++;
+ break;
+ case 'q':
+ if((IsCommonChansOnly(user) != 0) != negate) matches++;
+ break;
+ }
+ }
+ if (matches != strlen(discrim->modes)) return 0;
+ }
+
+ level = user->handle_info ? user->handle_info->opserv_level : 0;
+ if ((level < discrim->min_level)
+ || (level > discrim->max_level)) {