Add "unreviewed" flag for channels.
authorMichael Poole <mdpoole@troilus.org>
Wed, 14 Mar 2007 02:57:20 +0000 (22:57 -0400)
committerMichael Poole <mdpoole@troilus.org>
Wed, 14 Mar 2007 02:57:20 +0000 (22:57 -0400)
src/chanserv.c (CHANNEL_DEFAULT_FLAGS): Include "unreviewed" flag.
  (CHANNEL_PRESERVED_FLAGS): New macro for flags not reset by !set defaults
  (msgtab): New entry for "CSMSG_SET_UNREVIEWED".
  (chanserv_search_create): Recognize "unreviewed" flag.
  (chan_opt_unreviewed): New function.
  (chan_opt_defaults): Preserve CHANNEL_PRESERVED_FLAGS.
  (cmd_set): Act like cmd_joiner with respect to updating argv.
  (init_chanserv): Register unreviewed option and its subcommands.

src/chanserv.h (CHANNEL_UNREVIEWED): New flag.

src/chanserv.help: Update documentation for SEARCH and SET.

src/chanserv.c
src/chanserv.h
src/chanserv.help

index 409056ebde232602760b588aad8c8e8dfbe3f374..8bc2a6100de4be82242795aeb47400c3fe1aacf8 100644 (file)
 #define KEY_EXPIRES             "expires"
 #define KEY_TRIGGERED          "triggered"
 
-#define CHANNEL_DEFAULT_FLAGS   (CHANNEL_OFFCHANNEL)
+#define CHANNEL_DEFAULT_FLAGS   (CHANNEL_OFFCHANNEL | CHANNEL_UNREVIEWED)
+#define CHANNEL_PRESERVED_FLAGS (CHANNEL_UNREVIEWED)
 #define CHANNEL_DEFAULT_OPTIONS "lmoooanpcnat"
 
 /* Administrative messages */
@@ -274,6 +275,7 @@ static const struct message_entry msgtab[] = {
     { "CSMSG_SET_TOYS",          "$bToys        $b %d - %s" },
     { "CSMSG_SET_CTCPREACTION",  "$bCTCPReaction$b %d - %s" },
     { "CSMSG_SET_TOPICREFRESH",  "$bTopicRefresh$b %d - %s" },
+    { "CSMSG_SET_UNREVIEWED",    "$bUnreviewed  $b %s" },
     { "CSMSG_USET_NOAUTOOP",     "$bNoAutoOp    $b %s" },
     { "CSMSG_USET_NOAUTOVOICE",  "$bNoAutoVoice $b %s" },
     { "CSMSG_USET_AUTOINVITE",   "$bAutoInvite  $b %s" },
@@ -5008,6 +5010,8 @@ chanserv_search_create(struct userNode *user, unsigned int argc, char *argv[])
                search->flags |= CHANNEL_NODELETE;
            else if(!irccasecmp(argv[i], "suspended"))
                search->flags |= CHANNEL_SUSPENDED;
+            else if(!irccasecmp(argv[i], "unreviewed"))
+                search->flags |= CHANNEL_UNREVIEWED;
            else
            {
                send_message(user, chanserv, "CSMSG_INVALID_CFLAG", argv[i]);
@@ -5407,6 +5411,60 @@ static MODCMD_FUNC(chan_opt_offchannel)
     return 1;
 }
 
+static MODCMD_FUNC(chan_opt_unreviewed)
+{
+    struct chanData *cData = channel->channel_info;
+    int value = (cData->flags & CHANNEL_UNREVIEWED) ? 1 : 0;
+
+    if(argc > 1)
+    {
+        int new_value;
+
+        /* The two directions can have different ACLs. */
+        if(enabled_string(argv[1]))
+            new_value = 1;
+        else if(disabled_string(argv[1]))
+            new_value = 0;
+        else
+       {
+           reply("MSG_INVALID_BINARY", argv[1]);
+           return 0;
+       }
+
+        if (new_value != value)
+        {
+            struct svccmd *subcmd;
+            char subcmd_name[32];
+
+            snprintf(subcmd_name, sizeof(subcmd_name), "%s %s", argv[0], (new_value ? "on" : "off"));
+            subcmd = dict_find(cmd->parent->commands, subcmd_name, NULL);
+            if(!subcmd)
+            {
+                reply("MSG_COMMAND_DISABLED", subcmd_name);
+                return 0;
+            }
+            else if(!svccmd_can_invoke(user, cmd->parent->bot, subcmd, channel, SVCCMD_NOISY))
+                return 0;
+
+            if (new_value)
+                cData->flags |= CHANNEL_UNREVIEWED;
+            else
+            {
+                free(cData->registrar);
+                cData->registrar = strdup(user->handle_info->handle);
+                cData->flags &= ~CHANNEL_UNREVIEWED;
+            }
+            value = new_value;
+        }
+    }
+
+    if(value)
+        reply("CSMSG_SET_UNREVIEWED", user_find_message(user, "MSG_ON"));
+    else
+        reply("CSMSG_SET_UNREVIEWED", user_find_message(user, "MSG_OFF"));
+    return 1;
+}
+
 static MODCMD_FUNC(chan_opt_defaults)
 {
     struct userData *uData;
@@ -5428,7 +5486,8 @@ static MODCMD_FUNC(chan_opt_defaults)
         reply("CSMSG_CONFIRM_DEFAULTS", channel->name, confirm);
         return 0;
     }
-    cData->flags = CHANNEL_DEFAULT_FLAGS;
+    cData->flags = (CHANNEL_DEFAULT_FLAGS & ~CHANNEL_PRESERVED_FLAGS)
+        | (cData->flags & CHANNEL_PRESERVED_FLAGS);
     cData->modes = chanserv_conf.default_modes;
     for(lvlOpt = 0; lvlOpt < NUM_LEVEL_OPTIONS; ++lvlOpt)
         cData->lvlOpts[lvlOpt] = levelOptions[lvlOpt].default_value;
@@ -5677,6 +5736,8 @@ static CHANSERV_FUNC(cmd_set)
         return 0;
     }
 
+    argv[0] = "";
+    argv[1] = buf;
     return subcmd->command->func(user, channel, argc - 1, argv + 1, subcmd);
 }
 
@@ -7723,6 +7784,9 @@ init_chanserv(const char *nick)
     DEFINE_CHANNEL_OPTION(ctcpusers);
     DEFINE_CHANNEL_OPTION(ctcpreaction);
     DEFINE_CHANNEL_OPTION(inviteme);
+    DEFINE_CHANNEL_OPTION(unreviewed);
+    modcmd_register(chanserv_module, "set unreviewed on", NULL, 0, 0, NULL);
+    modcmd_register(chanserv_module, "set unreviewed off", NULL, 0, 0, NULL);
     if(off_channel > 1)
         DEFINE_CHANNEL_OPTION(offchannel);
     modcmd_register(chanserv_module, "set defaults", chan_opt_defaults, 1, 0, "access", "owner", NULL);
index 3f33aae57500e5cbc37056fde5768f42d9860b04..83f310ef47fac57aee8d686cd980ea1a334af7bd 100644 (file)
@@ -65,6 +65,7 @@ enum charOption {
 #define CHANNEL_TOPIC_SNARF    0x00000040 /* (1 << 6) - DEPRECATED */
 #define CHANNEL_PEON_INVITE     0x00000080 /* (1 << 7) - DEPRECATED */
 #define CHANNEL_OFFCHANNEL      0x00000100 /* (1 << 8) */
+#define CHANNEL_UNREVIEWED      0x00000200 /* (1 << 9) */
 /* Flags with values over 0x20000000 or (1 << 29) will not work
  * because chanData.flags is a 30-bit field.
  */
index 9e08fa846c2d9b06a7ed39705a9991b71360bd7e..6d4191f0fa5383688e2ada289c5e4de25b626ea6 100644 (file)
         "  REGISTERED  Channels that have been registered for less than the given duration",
         "  FLAGS       Matches channels with the specified flag set",
         "  LIMIT       Limit the number of channels returned by the search",
-        "Flags that can be matched against are: nodelete and suspended.",
+        "Flags that can be matched against are: nodelete, suspended and unreviewed.",
         "$uSee Also:$u search, search actions");
 "SEARCH ACTIONS" ("$bSEARCH ACTIONS$b",
        "The following are valid $bsearch$b actions:",
         "TOPICREFRESH: Controls if (and how often) $b$C$b will reset the topic.",
         "DYNLIMIT:     Adjusts user limit (+l channel mode) to prevent join floods.",
         "$bIRCOP ONLY$b:",
-        "NODELETE:  Prevents channel deletion.",
+        "NODELETE:     Prevents channel deletion.",
+        "UNREVIEWED:   Indicates channels that have not been manually reviewed.",
         "If you wish to reset your channel to the default settings, you can use the $bSET DEFAULTS$b command.",
         "$uSee Also:$u set pubcmd, set giveops, set enfops, set enfmodes, set enftopic, set protect, set toys, set setters, set topicrefresh, set ctcpusers, set ctcpreaction, set defaults");
 "SET DEFAULTTOPIC" ("/msg $C SET <#channel> DEFAULTTOPIC <New default topic>",