Просмотр исходного кода

var_set: Always call var_set_userentry() if there is a target.

This was always done after calling var_set() anyhow, except for in
var_gotshare() and var_parse_my_botset().  We actually want to save the
userentry for other bots' set values anyhow especially for groups.
Bryan Drewery 10 лет назад
Родитель
Сommit
11d1b8576c
3 измененных файлов с 16 добавлено и 17 удалено
  1. 3 0
      doc/UPDATES.md
  2. 10 7
      src/set.cc
  3. 3 10
      src/userent.cc

+ 3 - 0
doc/UPDATES.md

@@ -1,3 +1,6 @@
+* Fix bots not tracking botset for other bots, which may be relevant for
+  them making decisions based on groups.
+
 # maint
   * Update server list, 'set -yes servers -' and 'set -yes servers6 -' to get new list.
   * Fix Linux binary compat on FreeBSD due to lack of ptrace(2).

+ 10 - 7
src/set.cc

@@ -541,8 +541,17 @@ const char *var_get_gdata(const char *name) {
 
 void var_set(variable_t *var, const char *target, const char *datain)
 {
-  /* Don't set locally if the variable doesn't permit it. */
   if (target) {
+    /*
+     * Setting user entry despite possibly not setting memory due to
+     * historically setting this after var_set() without checking
+     * return value.
+     */
+    if (!parsing_botset) {
+      var_set_userentry(target, var->name, datain);
+    }
+
+    /* Don't set locally if the variable doesn't permit it. */
     if (var->flags & VAR_NOLOC)
       return;
 
@@ -839,8 +848,6 @@ static int var_add_list(const char *botnick, variable_t *var, const char *elemen
     data = strdup(element);
 
   var_set(var, botnick, data);
-  if (botnick)
-    var_set_userentry(botnick, var->name, data);
   free(data);
   return 1;
 }
@@ -900,8 +907,6 @@ static char *var_rem_list(const char *botnick, variable_t *var, const char *elem
 
   if (num <= i && ret[0]) {
     var_set(var, botnick, data);
-    if (botnick)
-      var_set_userentry(botnick, var->name, data);
   } else
     ret[0] = 0;
  
@@ -1188,8 +1193,6 @@ int cmd_set_real(const char *botnick, int idx, char *par)
       }
 
       var_set(var, botnick, data);
-      if (botnick)
-        var_set_userentry(botnick, name, data);
 
       display_set_value(idx, var, botnick);
 

+ 3 - 10
src/userent.cc

@@ -341,18 +341,11 @@ static bool set_gotshare(struct userrec *u, struct user_entry *e, char *buf, int
 
   if (!strcasecmp(u->handle, conf.bot->nick)) {
     set_noshare = 1;
+    /* This will also call set_user(). */
     var_set_by_name(conf.bot->nick, name, buf[0] ? buf : NULL);
     set_noshare = 0;
-  /* var_set_by_name() called set_user(), no need to do it again... */
-  } 
-  /* not else if as the hub might have gotten a botset for itself */
-  if (conf.bot->hub || conf.bot->localhub) {
-  /* only hubs need to bother saving this stuff, leaf bots just store it in vars[] */
-    struct xtra_key *xk = (struct xtra_key *) calloc(1, sizeof(struct xtra_key));
-
-    xk->key = strdup(name);
-    xk->data = (buf && buf[0]) ? strdup(buf) : NULL;
-    set_set(u, e, xk);	/* set the USERENTRY */
+  } else if (conf.bot->hub || conf.bot->localhub) {
+    var_set_userentry(u->handle, name, buf);
   }
   return 1;
 }