+ 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)) {