+ if (discrim->modes) {
+ unsigned int ii, matches = 0;
+ for (ii = 0; ii < strlen(discrim->modes); ii++) {
+ switch(discrim->modes[ii]) {
+ case 'O':
+ if(IsOper(user)) matches++;
+ break;
+ case 'o':
+ if(IsOper(user)) matches++;
+ break;
+ case 'i':
+ if(IsInvisible(user)) matches++;
+ break;
+ case 'w':
+ if(IsWallOp(user)) matches++;
+ break;
+ case 's':
+ if(IsServNotice(user)) matches++;
+ break;
+ case 'd':
+ if(IsDeaf(user)) matches++;
+ break;
+ case 'k':
+ if(IsService(user)) matches++;
+ break;
+ case 'g':
+ if(IsGlobal(user)) matches++;
+ break;
+ case 'h':
+ if(IsSetHost(user)) matches++;
+ break;
+ case 'B':
+ if(IsBotM(user)) matches++;
+ break;
+ case 'n':
+ if(IsHideChans(user)) matches++;
+ break;
+ case 'I':
+ if(IsHideIdle(user)) matches++;
+ break;
+ case 'X':
+ if(IsXtraOp(user)) matches++;
+ break;
+ case 'x':
+ if(IsHiddenHost(user)) matches++;
+ break;
+ }
+ }
+ if (matches != strlen(discrim->modes)) return 0;
+ }
+