ソースを参照

* +eI lists were being checked way too often and at the wrong times; now only checking when NEEDED.

svn: 2108
Bryan Drewery 21 年 前
コミット
3032ac0b2c
3 ファイル変更25 行追加23 行削除
  1. 5 11
      src/mod/irc.mod/chan.c
  2. 19 11
      src/mod/irc.mod/irc.c
  3. 1 1
      src/mod/irc.mod/mode.c

+ 5 - 11
src/mod/irc.mod/chan.c

@@ -1185,10 +1185,6 @@ do_take(struct chanset_t *chan)
   return;
 }
 
-time_t last_eI; /* this will stop +e and +I from being checked over and over if the bot is stuck in a 
-                 * -o+o loop for some reason, hence possibly causing a SENDQ kill 
-                 */
-
 /* Things to do when i just became a chanop:
  */
 void recheck_channel(struct chanset_t *chan, int dobans)
@@ -1241,15 +1237,13 @@ void recheck_channel(struct chanset_t *chan, int dobans)
   /* this can all die, we want to enforce +bitch/+take first :) */
 
   /* This is a bad hack for +e/+I */
-  if (!channel_take(chan) && me_op(chan) && ((now - last_eI) > 30)) {
+  if (dobans == 2 && !channel_take(chan) && me_op(chan) && do_eI) {
     last_eI = now;
-    if (!(chan->ircnet_status & CHAN_ASKED_EXEMPTS) &&
-        use_exempts == 1) {
+    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) {
+    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);
     }
@@ -1628,7 +1622,7 @@ static int got352or4(struct chanset_t *chan, char *user, char *host, char *nick,
     m->joined = now;				/* set this to keep the whining masses happy */
 
     if (!waschanop && me_op(chan))
-      recheck_channel(chan, 1);
+      recheck_channel(chan, 2);
     if (!me_op(chan) && any_ops(chan))
       chan->channel.do_opreq = 1;
   }
@@ -1752,7 +1746,7 @@ static int got315(char *from, char *msg)
 	    chan->channel.key[0] ? chan->channel.key : chan->key_prot);
   } else {
     if (me_op(chan))
-      recheck_channel(chan, 1);
+      recheck_channel(chan, 2);
     else if (chan->channel.members == 1)
       chan->status |= CHAN_STOP_CYCLE;
     else

+ 19 - 11
src/mod/irc.mod/irc.c

@@ -40,6 +40,11 @@
 static cache_t *irccache = NULL;
 #endif /* CACHE */
 
+static time_t last_eI; /* this will stop +e and +I from being checked over and over if the bot is stuck in a
+                        * -o+o loop for some reason, hence possibly causing a SENDQ kill
+                        */
+#define do_eI (((now - last_eI) > 30) ? 1 : 0)
+
 static int net_type = 0;
 static time_t wait_split = 300;    /* Time to wait for user to return from
                                  * net-split. */
@@ -1065,18 +1070,21 @@ reset_chan_info(struct chanset_t *chan)
     chan->status |= CHAN_PEND;
     chan->status &= ~(CHAN_ACTIVE | CHAN_ASKEDMODES | CHAN_JOINING);
     /* don't bother checking bans if it's +take */
-    if (!(chan->status & CHAN_ASKEDBANS) && !channel_take(chan)) {
-      chan->status |= CHAN_ASKEDBANS;
-      dprintf(DP_MODE, "MODE %s +b\n", chan->name);
-    }
-    if (opped && !channel_take(chan)) {
-      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 (!channel_take(chan)) {
+      if (!(chan->status & CHAN_ASKEDBANS)) {
+        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 (opped && do_eI) {
+        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);
+        }
       }
     }
     /* These 2 need to get out asap, so into the mode queue */

+ 1 - 1
src/mod/irc.mod/mode.c

@@ -610,7 +610,7 @@ got_op(struct chanset_t *chan, memberlist *m, memberlist *mv)
     simple_sprintf(buf, "jn %s", chan->dname);
     putallbots(buf);
     free(buf);
-    recheck_channel(chan, 1);
+    recheck_channel(chan, 2);
   }
 }