]> jfr.im git - irc/evilnet/x3.git/blobdiff - src/opserv.c
Improve the hidden/undocumented 'modes' trace criteria, and document it'
[irc/evilnet/x3.git] / src / opserv.c
index 7a675b4de97794e0a03c4b64fd7fdc475bb9b9de..170877cf7a9be92dda7c54326b351e906160a970 100644 (file)
@@ -189,6 +189,7 @@ static const struct message_entry msgtab[] = {
     { "OSMSG_HOP_DONE", "Halfopped the requested lusers." },
     { "OSMSG_HOPALL_DONE", "Halfopped everyone on $b%s$b." },
     { "OMSG_BAD_SVSNICK", "$b%s$b is an invalid nickname." },
+    { "OSMSG_BAD_SVSCMDTARGET", "$b%s$b is an invalid target for %s." },
 
     { "OSMSG_WHOIS_IDENT",      "%s (%s@%s) from %d.%d.%d.%d" },
     { "OSMSG_WHOIS_NICK",       "Nick         : %s" },
@@ -1725,6 +1726,11 @@ static MODCMD_FUNC(cmd_svsjoin)
        return 0;
     }
 
+    if (IsLocal(target)) {
+       reply("OSMSG_BAD_SVSCMDTARGET", argv[1], "SVSJOIN");
+       return 0;
+    }
+
     if (!(channel = GetChannel(argv[2]))) {
        channel = AddChannel(argv[2], now, NULL, NULL, NULL);
     }
@@ -1746,6 +1752,12 @@ static MODCMD_FUNC(cmd_svsnick)
        reply("MSG_NICK_UNKNOWN", argv[1]);
        return 0;
     }
+
+    if (IsLocal(target)) {
+       reply("OSMSG_BAD_SVSCMDTARGET", argv[1], "SVSNICK");
+       return 0;
+    }
+
     if(!is_valid_nick(argv[2])) {
        reply("OMSG_BAD_SVSNICK", argv[2]);
        return 0;
@@ -1971,6 +1983,11 @@ static MODCMD_FUNC(cmd_svspart)
        return 0;
     }
 
+    if (IsLocal(target)) {
+       reply("OSMSG_BAD_SVSCMDTARGET", argv[1], "SVSPART");
+       return 0;
+    }
+
     if (!GetUserMode(target_channel, target)) {
         reply("OSMSG_NOT_ON_CHANNEL", cmd->parent->bot->nick, target_channel->name);
         return 0;
@@ -5785,70 +5802,79 @@ discrim_match(discrim_t discrim, struct userNode *user)
 
     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)) matches++;
+                    if(IsOper(user) != 0 != negate) matches++;
                     break;
                 case 'o':
-                    if(IsOper(user)) matches++;
+                    if(IsOper(user) != 0 != negate) matches++;
                     break;
                 case 'i':
-                    if(IsInvisible(user)) matches++;
+                    if(IsInvisible(user) != 0 != negate) matches++;
                     break;
                 case 'w':
-                    if(IsWallOp(user)) matches++;
+                    if(IsWallOp(user) != 0 != negate) matches++;
                     break;
                 case 'd':
-                    if(IsDeaf(user)) matches++;
+                    if(IsDeaf(user) != 0 != negate) matches++;
                     break;
                 case 'k':
-                    if(IsService(user)) matches++;
+                    if(IsService(user) != 0 != negate) matches++;
                     break;
                 case 'g':
-                    if(IsGlobal(user)) matches++;
+                    if(IsGlobal(user) != 0 != negate) matches++;
                     break;
                 case 'h':
-                    if(IsSetHost(user)) matches++;
+                    if(IsSetHost(user) != 0 != negate) matches++;
                     break;
                 case 'B':
-                    if(IsBotM(user)) matches++;
+                    if(IsBotM(user) != 0 != negate) matches++;
                     break;
                 case 'n':
-                    if(IsHideChans(user)) matches++;
+                    if(IsHideChans(user) != 0 != negate) matches++;
                     break;
                 case 'I':
-                    if(IsHideIdle(user)) matches++;
+                    if(IsHideIdle(user) != 0 != negate) matches++;
                     break;
                 case 'X':
-                    if(IsXtraOp(user)) matches++;
+                    if(IsXtraOp(user) != 0 != negate) matches++;
                     break;
                 case 'x':
-                    if(IsHiddenHost(user)) matches++;
+                    if(IsHiddenHost(user) != 0 != negate) matches++;
                     break;
                 case 'a':
-                    if(IsAdmin(user)) matches++;
+                    if(IsAdmin(user) != 0 != negate) matches++;
                     break;
                 case 'z':
-                    if(IsSSL(user)) matches++;
+                    if(IsSSL(user) != 0 != negate) matches++;
                     break;
                 case 'D':
-                    if(IsPrivDeaf(user)) matches++;
+                    if(IsPrivDeaf(user) != 0 != negate) matches++;
                     break;
                 case 'R':
-                    if(IsAccountOnly(user)) matches++;
+                    if(IsAccountOnly(user) != 0 != negate) matches++;
                     break;
                 case 'W':
-                    if(IsWhoisNotice(user)) matches++;
+                    if(IsWhoisNotice(user) != 0 != negate) matches++;
                     break;
                 case 'H':
-                    if(IsHideOper(user)) matches++;
+                    if(IsHideOper(user) != 0 != negate) matches++;
                     break;
                 case 'L':
-                    if(IsHideOper(user)) matches++;
+                    if(IsHideOper(user) != 0 != negate) matches++;
                     break;
                 case 'q':
-                    if(IsCommonChansOnly(user)) matches++;
+                    if(IsCommonChansOnly(user) != 0 != negate) matches++;
                     break;
             }
         }