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

* Ported [2971] to 1.2.11
* Clean and speedup ban/exempt/invite processing. (addresses #277)


svn: 2972

Bryan Drewery 20 лет назад
Родитель
Сommit
d573c73241
5 измененных файлов с 32 добавлено и 13 удалено
  1. 1 0
      doc/UPDATES
  2. 12 7
      src/mod/irc.mod/chan.c
  3. 3 2
      src/mod/irc.mod/irc.c
  4. 1 1
      src/mod/irc.mod/irc.h
  5. 15 3
      src/mod/irc.mod/mode.c

+ 1 - 0
doc/UPDATES

@@ -16,6 +16,7 @@ Lines prefixed with '-' were disabled before release and are not finished, or ar
 * Fix /MSG invite not showing proper cmd for usage. (Fixes #278)
 * Fix cmdpass processing on ambiguous cmds. (fixes #279)
 * Fix ban/invite/exempt removal flaw. (fixes #280)
+* Clean and speedup ban/exempt/invite processing. (addresses #227)
 
 1.2.10 - http://tracker.shatow.net/milestone/1.2.10
 * Removed old references to '+/-manop' and '+/-nomop' for chaninfo in help file.

+ 12 - 7
src/mod/irc.mod/chan.c

@@ -645,8 +645,10 @@ static void kick_all(struct chanset_t *chan, char *hostmask, const char *comment
 	flush_mode(chan, QUICK);
 	flushed += 1;
       }
-      m->flags |= SENTKICK;	/* Mark as pending kick */
-      dprintf(DP_MODE, "KICK %s %s :%s%s\n", chan->name, m->nick, kickprefix, comment);
+      if (!chan_sentkick(m)) {
+        m->flags |= SENTKICK;	/* Mark as pending kick */
+        dprintf(DP_MODE, "KICK %s %s :%s%s\n", chan->name, m->nick, kickprefix, comment);
+      }
     }
   }
 }
@@ -744,6 +746,9 @@ static void enforce_bans(struct chanset_t *chan)
   if (!me_op(chan))
     return;			/* Can't do it :( */
 
+  if ((chan->ircnet_status & CHAN_ASKED_EXEMPTS))
+    return;
+
   char me[UHOSTLEN] = "", meip[UHOSTLEN] = "";
 
   simple_sprintf(me, "%s!%s", botname, botuserhost);
@@ -751,9 +756,8 @@ static void enforce_bans(struct chanset_t *chan)
 
   /* Go through all bans, kicking the users. */
   for (masklist *b = chan->channel.ban; b && b->mask[0]; b = b->next) {
-    if (!(wild_match(b->mask, me) || match_cidr(b->mask, meip)))
-      if (!isexempted(chan, b->mask) && !(chan->ircnet_status & CHAN_ASKED_EXEMPTS))
-	kick_all(chan, b->mask, "You are banned", 1);
+    if (!(wild_match(b->mask, me) || match_cidr(b->mask, meip)) && !isexempted(chan, b->mask))
+      kick_all(chan, b->mask, "You are banned", 1);
   }
 }
 
@@ -770,8 +774,7 @@ static void recheck_bans(struct chanset_t *chan)
      in second cycle. */
   for (int cycle = 0; cycle < 2; cycle++) {
     for (u = cycle ? chan->bans : global_bans; u; u = u->next)
-      if (!isbanned(chan, u->mask) && (!channel_dynamicbans(chan) ||
-				       (u->flags & MASKREC_STICKY)))
+      if (!isbanned(chan, u->mask) && (!channel_dynamicbans(chan) || (u->flags & MASKREC_STICKY)))
 	add_mode(chan, '+', 'b', u->mask);
   }
 }
@@ -1712,6 +1715,7 @@ static int got352or4(struct chanset_t *chan, char *user, char *host, char *nick,
 
     /* if channel is enforce bans */
     if (channel_enforcebans(chan) &&
+        !chan_sentkick(m) && 
         /* and user matches a ban */
         (u_match_mask(global_bans, userhost) || u_match_mask(chan->bans, userhost)) &&
         /* and it's not me, and i'm an op */
@@ -1722,6 +1726,7 @@ static int got352or4(struct chanset_t *chan, char *user, char *host, char *nick,
     }
     /* if the user is a +k */
     else if ((chan_kick(fr) || glob_kick(fr)) &&
+           !chan_sentkick(m) &&
            /* and it's not me :) who'd set me +k anyway, a sicko? */
            /* and if im an op */
            !me) {

+ 3 - 2
src/mod/irc.mod/irc.c

@@ -985,12 +985,12 @@ my_setkey(struct chanset_t *chan, char *k)
 /* Adds a ban, exempt or invite mask to the list
  * m should be chan->channel.(exempt|invite|ban)
  */
-static void
+static bool
 new_mask(masklist *m, char *s, char *who)
 {
   for (; m && m->mask[0] && rfc_casecmp(m->mask, s); m = m->next) ;
   if (m->mask[0])
-    return;                     /* Already existent mask */
+    return 1;                     /* Already existent mask */
 
   m->next = (masklist *) my_calloc(1, sizeof(masklist));
   m->next->next = NULL;
@@ -999,6 +999,7 @@ new_mask(masklist *m, char *s, char *who)
   m->mask = strdup(s);
   m->who = strdup(who);
   m->timer = now;
+  return 0;
 }
 
 /* Removes a nick from the channel member list (returns 1 if successful)

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

@@ -81,7 +81,7 @@ static void my_setkey(struct chanset_t *, char *);
 //static void maybe_revenge(struct chanset_t *, char *, char *, int);
 static bool detect_chan_flood(char *, char *, char *, struct chanset_t *, int,
 			     char *);
-static void new_mask(masklist *, char *, char *);
+static bool new_mask(masklist *, char *, char *);
 static void doban(struct chanset_t *, memberlist *);
 static char *quickban(struct chanset_t *, char *);
 static bool killmember(struct chanset_t *chan, char *nick);

+ 15 - 3
src/mod/irc.mod/mode.c

@@ -700,7 +700,8 @@ got_ban(struct chanset_t *chan, memberlist *m, char *mask, char *isserver)
   simple_sprintf(me, "%s!%s", botname, botuserhost);
   simple_sprintf(meip, "%s!%s", botname, botuserip);
   simple_snprintf(s, sizeof s, "%s!%s", m ? m->nick : "", m ? m->userhost : isserver);
-  newban(chan, mask, s);
+  if (newban(chan, mask, s))
+    return; /* The ban was already set, don't bother with it */
 
   if (channel_pending(chan) || !me_op(chan))
     return;
@@ -774,6 +775,9 @@ got_unban(struct chanset_t *chan, memberlist *m, char *mask)
     free(b->mask);
     free(b->who);
     free(b);
+  } else {
+    /* The ban was not even set, why continue? */
+    return;
   }
 
   if (channel_pending(chan))
@@ -799,7 +803,8 @@ got_exempt(struct chanset_t *chan, memberlist *m, char *mask, char *isserver)
   char s[UHOSTLEN] = "";
 
   simple_sprintf(s, "%s!%s", m ? m->nick : "", m ? m->userhost : isserver);
-  newexempt(chan, mask, s);
+  if (newexempt(chan, mask, s))
+    return; /* The exempt was already set, don't bother with it */
 
   if (channel_pending(chan))
     return;
@@ -835,6 +840,9 @@ got_unexempt(struct chanset_t *chan, memberlist *m, char *mask)
     free(e->mask);
     free(e->who);
     free(e);
+  } else {
+    /* The exempt was not even set, why continue? */
+    return;
   }
 
   if (channel_pending(chan))
@@ -871,7 +879,8 @@ got_invite(struct chanset_t *chan, memberlist *m, char *mask, char *isserver)
   char s[UHOSTLEN] = "";
 
   simple_sprintf(s, "%s!%s", m ? m->nick : "", m ? m->userhost : isserver);
-  newinvite(chan, mask, s);
+  if (newinvite(chan, mask, s))
+    return; /* The Invite was already set, don't bother with it */
 
   if (channel_pending(chan))
     return;
@@ -906,6 +915,9 @@ got_uninvite(struct chanset_t *chan, memberlist *m, char *mask)
     free(inv->mask);
     free(inv->who);
     free(inv);
+  } else {
+    /* The Invite was not even set, why continue? */
+    return;
   }
 
   if (channel_pending(chan))