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

* Port [3951] to 1.2.16 from trunk
* Make setting -|+(userbans/userexempts/userinvites) actually make the bot respond
* Make bot recheck bans/exempts/invites on -take
* Make bot do a lot less irrelevant stuff when set +take and getting opped in a channel
* Dont check bans/exempts/invites on channels where bot is alone



svn: 3952

Bryan Drewery 17 лет назад
Родитель
Сommit
5d1ebae6cb
4 измененных файлов с 78 добавлено и 56 удалено
  1. 1 0
      src/chan.h
  2. 0 2
      src/mod/channels.mod/channels.c
  3. 16 8
      src/mod/channels.mod/tclchan.c
  4. 61 46
      src/mod/irc.mod/chan.c

+ 1 - 0
src/chan.h

@@ -249,6 +249,7 @@ struct chanset_t {
 #define CHAN_AUTOOP         BIT25
 #define CHAN_JOINING        BIT26	/* attempting to join, dont flood with JOIN #chan */
 #define CHAN_MEANKICKS      BIT27	/* use mean/offensive kicks/bans */
+#define CHAN_HAVEBANS       BIT28	/* have been opped and received the ban list */
 
 #define CHAN_ASKED_EXEMPTS  BIT0
 #define CHAN_ASKED_INVITES  BIT1

+ 0 - 2
src/mod/channels.mod/channels.c

@@ -144,8 +144,6 @@ static void got_cset(char *botnick, char *code, char *par)
   while (chan) {
     chname = chan->dname;
     do_chanset(NULL, chan, par, DO_LOCAL);
-    if (!conf.bot->hub && chan->status & CHAN_BITCH)
-      recheck_channel(chan, 0);
     if (!all)
       chan = NULL;
     else

+ 16 - 8
src/mod/channels.mod/tclchan.c

@@ -308,6 +308,7 @@ int channel_modify(char *result, struct chanset_t *chan, int items, char **item,
 {
   bool error = 0;
   int old_status = chan->status,
+      old_ircnet_status = chan->ircnet_status,
       old_mode_mns_prot = chan->mode_mns_prot,
       old_mode_pls_prot = chan->mode_pls_prot;
   char s[121] = "", result_extra[RESULT_LEN / 2] = "";
@@ -783,14 +784,19 @@ int channel_modify(char *result, struct chanset_t *chan, int items, char **item,
         chan->status |= CHAN_JOINING;
       }
     }
-    if ((old_status ^ chan->status) & (CHAN_ENFORCEBANS | CHAN_BITCH | CHAN_BOTBITCH | CHAN_CLOSED | CHAN_PRIVATE)) {
-      recheck_channel(chan, 1);
-    /* if we -take, recheck the chan for modes and shit */
-    /* also -[bot]bitch/-private might allow for auto-opping users */
-    } else if ((chan->status ^ old_status) & (CHAN_TAKE | CHAN_BITCH | CHAN_BOTBITCH | CHAN_PRIVATE)) {
-      recheck_channel(chan, 1);
-    } else if (old_mode_pls_prot != chan->mode_pls_prot || old_mode_mns_prot != chan->mode_mns_prot) {
-      recheck_channel_modes(chan);
+    if (me_op(chan)) {
+      if ((old_status ^ chan->status) & (CHAN_ENFORCEBANS|CHAN_NOUSERBANS|CHAN_DYNAMICBANS) || (old_ircnet_status ^ chan->ircnet_status) & (CHAN_NOUSEREXEMPTS|CHAN_NOUSERINVITES|CHAN_DYNAMICEXEMPTS|CHAN_DYNAMICINVITES)) {
+        recheck_channel(chan, 1);
+      /* if we -take, recheck the chan for modes and shit */
+      /* also -[bot]bitch/-private might allow for auto-opping users */
+      } else if ((chan->status ^ old_status) & (CHAN_BITCH | CHAN_BOTBITCH | CHAN_PRIVATE | CHAN_CLOSED)) {
+        recheck_channel(chan, 0);
+      } else if ((old_status & CHAN_TAKE) && !(chan->status & CHAN_TAKE)) {
+        //Set -take, fetch bans/exempts/invites
+        recheck_channel(chan, 2);
+      } else if (old_mode_pls_prot != chan->mode_pls_prot || old_mode_mns_prot != chan->mode_mns_prot) {
+        recheck_channel_modes(chan);
+      }
     }
   }
   if (result && result[0] && result_extra[0])
@@ -868,6 +874,8 @@ void clear_channel(struct chanset_t *chan, bool reset)
   clear_masklist(chan->channel.invite);
   chan->channel.invite = NULL;
 
+  chan->status &= ~CHAN_HAVEBANS;
+
   if (reset)
     init_channel(chan, 1);
 }

+ 61 - 46
src/mod/irc.mod/chan.c

@@ -1277,7 +1277,7 @@ void recheck_channel(struct chanset_t *chan, int dobans)
 
   ++stacking;
 
-  putlog(LOG_DEBUG, "*", "recheck_channel %s", chan->dname);
+  putlog(LOG_DEBUG, "*", "recheck_channel(%s, %d)", chan->dname, dobans);
 
   for (m = chan->channel.member; m && m->nick[0]; m = m->next) {
     bool hasop = chan_hasop(m);
@@ -1308,26 +1308,28 @@ void recheck_channel(struct chanset_t *chan, int dobans)
   }
 
   /* this can all die, we want to enforce +bitch/+take first :) */
+  if (!channel_take(chan)) {
 
-  /* This is a bad hack for +e/+I */
-  if (dobans == 2 && !channel_take(chan)) {
-    if (!(chan->status & CHAN_ASKEDBANS)) {
-      chan->status |= CHAN_ASKEDBANS;
-      dprintf(DP_MODE, "MODE %s +b\n", chan->name);
-    }
-    if (do_eI) {
-      chan->channel.last_eI = now;
-      if (!(chan->ircnet_status & CHAN_ASKED_EXEMPTS) && use_exempts == 1) {
-        chan->ircnet_status |= CHAN_ASKED_EXEMPTS;
-        dprintf(DP_MODE, "MODE %s +e\n", chan->name);
+    /* This is a bad hack for +e/+I */
+    if (dobans == 2 && chan->channel.members > 1) {
+      if (!(chan->status & (CHAN_ASKEDBANS|CHAN_HAVEBANS))) {
+        chan->status |= CHAN_ASKEDBANS;
+        dprintf(DP_MODE, "MODE %s +b\n", chan->name);
       }
-      if (!(chan->ircnet_status & CHAN_ASKED_INVITES) && use_invites == 1) {
-        chan->ircnet_status |= CHAN_ASKED_INVITES;
-        dprintf(DP_MODE, "MODE %s +I\n", chan->name);
+      if (do_eI) {
+        chan->channel.last_eI = now;
+        if (!(chan->ircnet_status & CHAN_ASKED_EXEMPTS) && use_exempts == 1) {
+          chan->ircnet_status |= CHAN_ASKED_EXEMPTS;
+          dprintf(DP_MODE, "MODE %s +e\n", chan->name);
+        }
+        if (!(chan->ircnet_status & CHAN_ASKED_INVITES) && use_invites == 1) {
+          chan->ircnet_status |= CHAN_ASKED_INVITES;
+          dprintf(DP_MODE, "MODE %s +I\n", chan->name);
+        }
       }
     }
-  }
 
+  //Check +d/+O/+k
   for (m = chan->channel.member; m && m->nick[0]; m = m->next) { 
     simple_snprintf(s, sizeof(s), "%s!%s", m->nick, m->userhost);
 
@@ -1338,37 +1340,43 @@ void recheck_channel(struct chanset_t *chan, int dobans)
              simple_snprintf(s, sizeof(s), "%s!%s", m->nick, m->userip);
              m->user = get_user_by_host(s);
            }
-    }
-    get_user_flagrec(m->user, &fr, chan->dname, chan);
-    if (glob_bot(fr) && chan_hasop(m) && !match_my_nick(m->nick))
-      stop_reset = 1;
-    check_this_member(chan, m->nick, &fr);
-  }
-
-  if (dobans) {
-    if (channel_nouserbans(chan) && !stop_reset)
-      resetbans(chan);
-    else
-      recheck_bans(chan);
-    if (use_invites && !(chan->ircnet_status & CHAN_ASKED_INVITES)) {
-      if (channel_nouserinvites(chan) && !stop_reset)
-	resetinvites(chan);
-      else
-	recheck_invites(chan);
-    }
-    if (use_exempts && !(chan->ircnet_status & CHAN_ASKED_EXEMPTS)) {
-      if (channel_nouserexempts(chan) && !stop_reset)
-	resetexempts(chan);
+      }
+      get_user_flagrec(m->user, &fr, chan->dname, chan);
+      //Already a bot opped, dont bother resetting masks
+      if (glob_bot(fr) && chan_hasop(m) && !match_my_nick(m->nick))
+        stop_reset = 1;
+      check_this_member(chan, m->nick, &fr);
+    }
+
+    //Only reset masks if the bot has already received the ban list before (meaning it has already been opped once)
+    //Ie, don't set bans without knowing what they are! (asked for above on first op)
+    if (dobans && (chan->status & CHAN_HAVEBANS)) {
+      if (channel_nouserbans(chan) && !stop_reset)
+        resetbans(chan);
       else
-	recheck_exempts(chan);
-    } else {
-      if (channel_enforcebans(chan)) 
-        enforce_bans(chan);
+        recheck_bans(chan);
+      if (use_invites && !(chan->ircnet_status & CHAN_ASKED_INVITES)) {
+        if (channel_nouserinvites(chan) && !stop_reset)
+          resetinvites(chan);
+        else
+          recheck_invites(chan);
+      }
+      if (use_exempts && !(chan->ircnet_status & CHAN_ASKED_EXEMPTS)) {
+        if (channel_nouserexempts(chan) && !stop_reset)
+          resetexempts(chan);
+        else
+          recheck_exempts(chan);
+      } else {
+        if (channel_enforcebans(chan)) 
+          enforce_bans(chan);
+      }
+      // Flush out mask changes
+      flush_mode(chan, QUICK); 
+
+      if ((chan->status & CHAN_ASKEDMODES) && !channel_inactive(chan)) 
+        dprintf(DP_MODE, "MODE %s\n", chan->name);
+      recheck_channel_modes(chan);
     }
-    flush_mode(chan, QUICK); 
-    if ((chan->status & CHAN_ASKEDMODES) && !channel_inactive(chan)) 
-      dprintf(DP_MODE, "MODE %s\n", chan->name);
-    recheck_channel_modes(chan);
   }
   --stacking;
 }
@@ -1940,8 +1948,15 @@ static int got368(char *from, char *msg)
   newsplit(&msg);
   chname = newsplit(&msg);
   chan = findchan(chname);
-  if (chan)
+  if (chan) {
     chan->status &= ~CHAN_ASKEDBANS;
+    chan->status |= CHAN_HAVEBANS;
+
+    if (channel_nouserbans(chan))
+      resetbans(chan);
+    else
+      recheck_bans(chan);
+  }
   /* If i sent a mode -b on myself (deban) in got367, either
    * resetbans() or recheck_bans() will flush that.
    */