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

Merge branch '21-botgroups' into next

* 21-botgroups:
  * Join/Part chans when [bot]set groups changes
  * DRY channel joining
  * Check if bot should be in the channel when chanset 'groups' changes
Bryan Drewery 14 лет назад
Родитель
Сommit
52bda60e8a
4 измененных файлов с 29 добавлено и 13 удалено
  1. 5 7
      src/mod/channels.mod/chanmisc.c
  2. 13 6
      src/mod/irc.mod/irc.c
  3. 1 0
      src/mod/irc.mod/irc.h
  4. 10 0
      src/set.c

+ 5 - 7
src/mod/channels.mod/chanmisc.c

@@ -306,7 +306,7 @@ int SplitList(char *resultBuf, const char *list, int *argcPtr, const char ***arg
  */
 int channel_modify(char *result, struct chanset_t *chan, int items, char **item, bool cmd)
 {
-  bool error = 0;
+  bool error = 0, changed_groups = false;
   int old_status = chan->status,
       old_mode_mns_prot = chan->mode_mns_prot,
       old_mode_pls_prot = chan->mode_pls_prot;
@@ -349,6 +349,7 @@ int channel_modify(char *result, struct chanset_t *chan, int items, char **item,
       changroups.sub(",", " ");
       changroups.trim();
       *(chan->groups) = changroups.split(" ");
+      changed_groups = true;
     } else if (!strcmp(item[i], "topic")) {
       char *p = NULL;
 
@@ -827,12 +828,9 @@ int channel_modify(char *result, struct chanset_t *chan, int items, char **item,
     chan->status |= CHAN_BITCH;		// to avoid bots still mass opping from +take from not using cookies
 
   if (!conf.bot->hub && (chan != chanset_default)) {
-    if ((old_status ^ chan->status) & (CHAN_INACTIVE | CHAN_BACKUP)) {
-      if (!shouldjoin(chan) && (chan->ircnet_status & (CHAN_ACTIVE | CHAN_PEND))) {
-        putlog(LOG_DEBUG, "*", "In %s, but I shouldn't be, parting...", chan->dname);
-        dprintf(DP_SERVER, "PART %s\n", chan->name[0] ? chan->name : chan->dname);
-      } else if (shouldjoin(chan))
-        join_chan(chan);
+    // Check if groups changed or +/-backup set
+    if (changed_groups || ((old_status ^ chan->status) & (CHAN_INACTIVE | CHAN_BACKUP))) {
+      check_shouldjoin(chan);
     }
     if (me_op(chan)) {
       if ((old_status ^ chan->status) & (CHAN_ENFORCEBANS|CHAN_NOUSERBANS|CHAN_DYNAMICBANS|CHAN_NOUSEREXEMPTS|CHAN_NOUSERINVITES|CHAN_DYNAMICEXEMPTS|CHAN_DYNAMICINVITES)) {

+ 13 - 6
src/mod/irc.mod/irc.c

@@ -1553,13 +1553,21 @@ raise_limit(struct chanset_t *chan)
 
 }
 
-static void
-check_expired_chanstuff(struct chanset_t *chan)
+void check_shouldjoin(struct chanset_t* chan)
 {
   if ((channel_active(chan) || channel_pending(chan)) && !shouldjoin(chan)) {
     sdprintf("Active/Pending in %s but I shouldn't be there, parting...", chan->dname);
-    dprintf(DP_MODE, "PART %s\n", chan->name[0] ? chan->name : chan->dname);
-  } else if (channel_active(chan)) {
+    dprintf(DP_SERVER, "PART %s\n", chan->name[0] ? chan->name : chan->dname);
+  } else if (shouldjoin(chan)) {
+    join_chan(chan);
+  }
+}
+
+static void
+check_expired_chanstuff(struct chanset_t *chan)
+{
+  check_shouldjoin(chan);
+  if (channel_active(chan) && shouldjoin(chan)) {
     masklist *b = NULL, *e = NULL;
     memberlist *m = NULL, *n = NULL;
     char s[UHOSTLEN] = "";
@@ -1670,8 +1678,7 @@ check_expired_chanstuff(struct chanset_t *chan)
     // Update minutely
     chan->channel.splitmembers = splitmembers;
     check_lonely_channel(chan);
-  } else if (shouldjoin(chan))
-    join_chan(chan);
+  }
 }
 
 void

+ 1 - 0
src/mod/irc.mod/irc.h

@@ -145,6 +145,7 @@ void irc_report(int, int);
 void flush_modes();
 void reset_chan_info(struct chanset_t *);
 char *getnick(const char *, struct chanset_t *);
+void check_shouldjoin(struct chanset_t* chan);
 
 extern int		max_bans, max_exempts, max_invites, max_modes;
 extern bool		use_354, include_lk;

+ 10 - 0
src/set.c

@@ -14,6 +14,7 @@
 #include "misc.h"
 #include "net.h"
 #include "src/mod/server.mod/server.h"
+#include "src/mod/irc.mod/irc.h"
 #include "src/mod/channels.mod/channels.h"
 #include "src/mod/ctcp.mod/ctcp.h"
 #include "users.h"
@@ -409,6 +410,15 @@ sdprintf("var (mem): %s -> %s", var->name, datain ? datain : "(NULL)");
     var_set_mem(servers, servers->ldata ? servers->ldata : servers->gdata ? servers->gdata : NULL);
   }
 
+  // Check if should part/join channels based on groups changing
+  if (!conf.bot->hub && !strcmp(var->name, "groups")) {
+    if (server_online && !restarting && !loading && !reset_chans) {
+      for (struct chanset_t* chan = chanset; chan; chan = chan->next) {
+        check_shouldjoin(chan);
+      }
+    }
+  }
+
   if (datap)
     free(datap);