Răsfoiți Sursa

* Port [3106] to 1.2.12
* Make 'set list' check to see if an item exists or not before add/remove. (fixes #307)


svn: 3107

Bryan Drewery 19 ani în urmă
părinte
comite
64bfd03f12
2 a modificat fișierele cu 31 adăugiri și 2 ștergeri
  1. 1 0
      doc/UPDATES
  2. 30 2
      src/set.c

+ 1 - 0
doc/UPDATES

@@ -17,6 +17,7 @@ Lines prefixed with '-' were disabled before release and are not finished, or ar
 * Fix cmds: bot[jump|server|version|msg] not running locally correctly. (fixes #304)
 * Fix cmd_chinfo to use the standard 'whois restrictions' (fixes #303)
 * Fix ',' character being allowed with 'set list' functions. (fixes #308)
+* Make 'set list' check to see if an item exists or not before add/remove. (fixes #307)
 
 1.2.11 - http://wraith.shatow.net/milestone/1.2.11
 * Fixed typo in help for .set/.conf/.channel

+ 30 - 2
src/set.c

@@ -633,6 +633,28 @@ static void var_print_list(int idx, const char *name, const char *datain)
   free(datap);
 }
 
+static bool var_find_list(const char *botnick, variable_t *var, const char *element) {
+  char *olddata = NULL;
+
+  if (botnick) {                          //fetch data from bot's USERENTRY_SET
+    char *botdata = (char *) var_get_bot_data(get_user_by_handle(userlist, (char *) botnick), var->name);
+    olddata = botdata ? botdata : NULL;
+  } else                                  //use global, no bot specified
+    olddata = var->gdata ? var->gdata : NULL;
+
+  char *item = NULL, *data = strdup(olddata), *datap = data;
+  const char *delim = ",";
+  size_t slen = strlen(element);
+
+  while ((item = strsep(&data, delim)))
+    if (!egg_strncasecmp(item, element, slen)) {
+      free(datap);
+      return true;
+    }
+  free(datap);
+  return false;
+}
+
 static int var_add_list(const char *botnick, variable_t *var, const char *element)
 {
   if (!element)
@@ -902,14 +924,20 @@ int cmd_set_real(const char *botnick, int idx, char *par)
         return 0;
       }
       if (list == LIST_ADD) {
-        if (var_add_list(botnick, var, data)) {
+        if (var_find_list(botnick, var, data)) {
+          dprintf(idx, "Item '%s' is already in the %s list.\n", data, var->name);
+          return 0;
+        } else if (var_add_list(botnick, var, data)) {
           dprintf(idx, "Added '%s' to %s list.\n", data, var->name);
           return 1;
         }
       } else if (list == LIST_RM) {
         char *expanded_data = NULL;
 
-        if ((expanded_data = var_rem_list(botnick, var, data)) && expanded_data[0]) {
+        if (!var_find_list(botnick, var, data)) {
+          dprintf(idx, "Item '%s' does not exist in the %s list.\n", data, var->name);
+          return 0;
+        } else if ((expanded_data = var_rem_list(botnick, var, data)) && expanded_data[0]) {
           dprintf(idx, "Removed '%s' from %s list.\n", expanded_data, var->name);
           return 1;
         }