Procházet zdrojové kódy

* Ported [2786] [2787] [2788] [2789] to 1.2.10
* Fixed cmd_set not saving the userfile when needed. (fixes #245)
* Fixed cmd_set list removal bugs. (fixes #246)


svn: 2790

Bryan Drewery před 20 roky
rodič
revize
ec7c7a48fb
5 změnil soubory, kde provedl 40 přidání a 27 odebrání
  1. 2 0
      doc/UPDATES
  2. 1 1
      misc/help.txt
  3. 4 2
      src/cmds.c
  4. 32 23
      src/set.c
  5. 1 1
      src/set.h

+ 2 - 0
doc/UPDATES

@@ -15,6 +15,8 @@ Lines prefixed with '-' were disabled before release and are not finished, or ar
 * Fixed cmd_trace not displaying hops correctly.
 * Expand symbolic links when searching for tempdirs. (fixes #210)
 * Fixed a segfault in cmd_rehash and revised help listing for it. (fixes #242)
+* Fixed cmd_set not saving the userfile when needed. (fixes #245)
+* Fixed cmd_set list removal bugs. (fixes #246)
 
 1.2.9 - http://tracker.shatow.net/milestone/1.2.9
 * Fixed cmd_[un]stick not properly using numbers for channel masks. (#160)

+ 1 - 1
misc/help.txt

@@ -1392,7 +1392,7 @@ See also: color, console, echo, login, strip
 See also: md5, sha1, encrypt, decrypt
 ::rehash
 ###  $brehash$b 
-   Don't use this cmd if you don't know what it does.
+   Don't use this cmd.
 
    Reloads config data from binary. (Probably won't be needed as this is automatically
    updated after editing the binary with -C)

+ 4 - 2
src/cmds.c

@@ -223,7 +223,8 @@ static void cmd_botset(int idx, char *par)
     return;
   }
   
-  cmd_set_real(botnick, idx, par);
+  if (cmd_set_real(botnick, idx, par))
+    write_userfile(idx);
   return;
 }
 
@@ -233,7 +234,8 @@ static void cmd_set(int idx, char *par)
 //    dprintf(idx, "Usage: set [<+/->list] <var> [data]\n");
 //    return;
 //  }
-  cmd_set_real(NULL, idx, par);
+  if (cmd_set_real(NULL, idx, par))
+    write_userfile(idx);
   return;
 }
 

+ 32 - 23
src/set.c

@@ -582,6 +582,8 @@ static char *var_rem_list(const char *botnick, variable_t *var, const char *elem
 {
   static char ret[101] = "";
 
+  ret[0] = 0;
+
   if (!element)
     return ret;
 
@@ -597,29 +599,36 @@ static char *var_rem_list(const char *botnick, variable_t *var, const char *elem
     return 0;
 
   const char *delim = ",";
-  int num = 0, i = 1;
+  int num = 0, i = 0;
 
   if (str_isdigit(element))
     num = atoi(element);
 
   olddata = olddatap = strdup(olddatacp);
-  size_t osiz = strlen(olddata), esiz = strlen(element) + 1, tsiz = osiz - esiz + 1;          // element + ,
+  size_t tsiz = strlen(olddata) + 1;
 
   data = (char *) my_calloc(1, tsiz);
 
   while ((word = strsep(&olddata, delim))) {
+    ++i;
+
     if ((num && num != i) || (!num && egg_strcasecmp(word, element))) {
-      if (data && data[0])
+      /* Reconstruct the left and right part of the list...*/
+      if (data && data[0] && word && word[0])
         simple_snprintf(data, tsiz, "%s,%s", data, word);
       else
         simple_snprintf(data, tsiz, "%s", word);
-    } else
+    } else  /* minus the part we are removing ... */
       simple_snprintf(ret, sizeof(ret), "%s", word);
-    i++;
   }
-  var_set(var, botnick, data);
-  if (botnick)
-    var_set_userentry(botnick, var->name, data);
+
+  if (num <= i && ret[0]) {
+    var_set(var, botnick, data);
+    if (botnick)
+      var_set_userentry(botnick, var->name, data);
+  } else
+    ret[0] = 0;
+ 
   free(data);
   free(olddatap);
   return ret;
@@ -650,7 +659,7 @@ bool write_vars_and_cmdpass(FILE *f, int idx)
 #define LIST_ADD  1
 #define LIST_RM   2
 #define LIST_SHOW 3
-void cmd_set_real(const char *botnick, int idx, char *par)
+int cmd_set_real(const char *botnick, int idx, char *par)
 {
   variable_t *var = NULL;
   char *name = NULL;
@@ -686,7 +695,7 @@ void cmd_set_real(const char *botnick, int idx, char *par)
     else {
       if (!par[0]) {
         dprintf(idx, "A variable must be specified!\n");
-        return;
+        return 0;
       }
       name = newsplit(&par);
     }
@@ -697,7 +706,7 @@ void cmd_set_real(const char *botnick, int idx, char *par)
       data = (const char *) par;
     else if (!par[0] && list) {
       dprintf(idx, "A value must be specified!\n");
-      return;
+      return 0;
     }
   } else if (par[0] && list && list == LIST_SHOW) {
     dprintf(idx, "Data value ignored for listing.\n");
@@ -705,12 +714,12 @@ void cmd_set_real(const char *botnick, int idx, char *par)
 
   if (name && !(var = var_get_var_by_name(name))) {
     dprintf(idx, "No such variable: %s\n", name);
-    return;
+    return 0;
   }
 
   if (list && !(var->flags & VAR_LIST)) {
     dprintf(idx, "That variable is not a list!\n");
-    return;
+    return 0;
   }
   
   struct userrec *botu = NULL;
@@ -764,24 +773,24 @@ void cmd_set_real(const char *botnick, int idx, char *par)
           dprintf(idx, "%sbotset %s -YES %s ...\n", settings.dcc_prefix, botnick, var->name);
         else
           dprintf(idx, "%sset -YES %s ...\n", settings.dcc_prefix, var->name);
-        return;
+        return 0;
       }
     }
     if (botnick) {
       if (var->flags & VAR_NOLOC) {
         dprintf(idx, "Sorry, cannot set '%s' locally.\n", var->name);
-        return;
+        return 0;
       }
 
       if (ishub && (var->flags & VAR_NOLHUB)) {
         dprintf(idx, "Sorry, cannot set '%s' locally for hubs.\n", var->name);
-        return;
+        return 0;
       }
     }
 
     if ((var->flags & VAR_PERM) && !isowner(dcc[idx].nick)) {
       dprintf(idx, "Sorry, only permanent owners may set '%s'.\n", var->name);
-      return;
+      return 0;
     }
 
     if (!strcmp(data, "-"))
@@ -802,18 +811,18 @@ void cmd_set_real(const char *botnick, int idx, char *par)
       if (list == LIST_ADD) {
         if (var_add_list(botnick, var, data)) {
           dprintf(idx, "Added '%s' to %s list.\n", data, var->name);
-          return;
+          return 1;
         }
       } else if (list == LIST_RM) {
         char *expanded_data = NULL;
 
         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;
+          return 1;
         }
       }
-        dprintf(idx, "Failed to modify %s list.\n", var->name);
-
+      dprintf(idx, "Failed to modify %s list.\n", var->name);
+      return 0;
     } else {
       var_set(var, botnick, data);
       if (botnick)
@@ -821,7 +830,7 @@ void cmd_set_real(const char *botnick, int idx, char *par)
 
       dprintf(idx, "%s: %s\n", name, botnick ? (!data || (data[0] == '-') ? "(not set)" : data) : (var->gdata ? var->gdata : "(not set)"));
     }
-    if (conf.bot->hub)
-      write_userfile(idx);
+    return 1;
   }
+  return 0;
 }

+ 1 - 1
src/set.h

@@ -70,6 +70,6 @@ void var_parse_my_botset();
 void init_vars();
 void var_set_by_name(const char *, const char *, const char *);
 void var_set_userentry(const char *, const char *, const char *);
-void cmd_set_real(const char *, int idx, char *);
+int cmd_set_real(const char *, int idx, char *);
 
 #endif /* !_SET_H */