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

* Fixed bot flooding with 'JOIN #chan', when it's already sent it

svn: 1969
Bryan Drewery 21 лет назад
Родитель
Сommit
0224cb1e5d

+ 2 - 0
src/chan.h

@@ -231,6 +231,7 @@ struct chanset_t {
 #define CHAN_JUPED          BIT23	/* Is channel juped                   */
 #define CHAN_JUPED          BIT23	/* Is channel juped                   */
 #define CHAN_STOP_CYCLE     BIT24	/* Some efnetservers have defined NO_CHANOPS_WHEN_SPLIT */
 #define CHAN_STOP_CYCLE     BIT24	/* Some efnetservers have defined NO_CHANOPS_WHEN_SPLIT */
 #define CHAN_AUTOOP         BIT25
 #define CHAN_AUTOOP         BIT25
+#define CHAN_JOINING        BIT26	/* attempting to join, dont flood with JOIN #chan */
 
 
 #define CHAN_ASKED_EXEMPTS  BIT0
 #define CHAN_ASKED_EXEMPTS  BIT0
 #define CHAN_ASKED_INVITES  BIT1
 #define CHAN_ASKED_INVITES  BIT1
@@ -249,6 +250,7 @@ struct chanset_t *findchan_by_dname(const char *name);
 #define channel_optopic(chan) (chan->channel.mode & CHANTOPIC)
 #define channel_optopic(chan) (chan->channel.mode & CHANTOPIC)
 
 
 #define channel_active(chan)  (chan->status & CHAN_ACTIVE)
 #define channel_active(chan)  (chan->status & CHAN_ACTIVE)
+#define channel_joining(chan) (chan->status & CHAN_JOINING)
 #define channel_pending(chan)  (chan->status & CHAN_PEND)
 #define channel_pending(chan)  (chan->status & CHAN_PEND)
 #define channel_bitch(chan) (chan->status & CHAN_BITCH)
 #define channel_bitch(chan) (chan->status & CHAN_BITCH)
 #define chan_bitch(chan) (chan->status & (CHAN_BITCH|CHAN_BOTBITCH))
 #define chan_bitch(chan) (chan->status & (CHAN_BITCH|CHAN_BOTBITCH))

+ 1 - 0
src/lang.h

@@ -80,6 +80,7 @@
 /* was: MISC_CHANNELS - 0x524 */
 /* was: MISC_CHANNELS - 0x524 */
 /* was: MISC_TRYINGMISTAKE - 0x525 */
 /* was: MISC_TRYINGMISTAKE - 0x525 */
 #define MISC_PENDING		"pending"
 #define MISC_PENDING		"pending"
+#define MISC_JOINING            "joining"
 #define MISC_WANTOPS		"want ops!"
 #define MISC_WANTOPS		"want ops!"
 #define MISC_LURKING		"lurking"
 #define MISC_LURKING		"lurking"
 #define MISC_BACKGROUND		"background"
 #define MISC_BACKGROUND		"background"

+ 7 - 3
src/mod/channels.mod/channels.c

@@ -368,8 +368,10 @@ check_slowjoinpart(struct chanset_t *chan)
   } else if ((chan->channel.jointime) && (chan->channel.jointime < now)) {
   } else if ((chan->channel.jointime) && (chan->channel.jointime < now)) {
       chan->status &= ~CHAN_INACTIVE;
       chan->status &= ~CHAN_INACTIVE;
       chan->channel.jointime = 0;
       chan->channel.jointime = 0;
-    if (!conf.bot->hub && shouldjoin(chan) && !channel_active(chan))
+    if (!conf.bot->hub && shouldjoin(chan) && !channel_active(chan) && !channel_joining(chan)) {
       dprintf(DP_MODE, "JOIN %s %s\n", chan->name, chan->key_prot);
       dprintf(DP_MODE, "JOIN %s %s\n", chan->name, chan->key_prot);
+      chan->status |= CHAN_JOINING;
+    }
   } else if (channel_closed(chan)) {
   } else if (channel_closed(chan)) {
     enforce_closed(chan);
     enforce_closed(chan);
   }
   }
@@ -449,8 +451,10 @@ static void got_jn(int idx, char *code, char *par)
   if (chan->channel.jointime && channel_inactive(chan)) {
   if (chan->channel.jointime && channel_inactive(chan)) {
     chan->status &= ~CHAN_INACTIVE;
     chan->status &= ~CHAN_INACTIVE;
     chan->channel.jointime = 0;
     chan->channel.jointime = 0;
-    if (!conf.bot->hub && shouldjoin(chan) && !channel_active(chan))
-     dprintf(DP_MODE, "JOIN %s %s\n", chan->name, chan->key_prot);
+    if (!conf.bot->hub && shouldjoin(chan) && !channel_active(chan) && !channel_joining(chan)) {
+      dprintf(DP_MODE, "JOIN %s %s\n", chan->name, chan->key_prot);
+      chan->status |= CHAN_JOINING;
+    }
   }
   }
 }
 }
 
 

+ 3 - 1
src/mod/channels.mod/cmdschan.c

@@ -546,8 +546,10 @@ static void cmd_slowjoin(int idx, char *par)
   }
   }
   dprintf(idx, "%i bots joining %s during the next %i seconds\n", count, chan->dname, delay);
   dprintf(idx, "%i bots joining %s during the next %i seconds\n", count, chan->dname, delay);
   chan->status &= ~CHAN_INACTIVE;
   chan->status &= ~CHAN_INACTIVE;
-  if (!conf.bot->hub && shouldjoin(chan)) 
+  if (!conf.bot->hub && shouldjoin(chan) && !channel_joining(chan)) {
     dprintf(DP_MODE, "JOIN %s %s\n", chan->name, chan->key_prot);
     dprintf(DP_MODE, "JOIN %s %s\n", chan->name, chan->key_prot);
+    chan->status |= CHAN_JOINING;
+  }
 }
 }
 
 
 static void cmd_slowpart(int idx, char *par)
 static void cmd_slowpart(int idx, char *par)

+ 3 - 1
src/mod/channels.mod/tclchan.c

@@ -637,11 +637,13 @@ int channel_modify(char *result, struct chanset_t *chan, int items, char **item)
     if ((old_status ^ chan->status) & CHAN_INACTIVE) {
     if ((old_status ^ chan->status) & CHAN_INACTIVE) {
       if (!shouldjoin(chan) && (chan->status & (CHAN_ACTIVE | CHAN_PEND)))
       if (!shouldjoin(chan) && (chan->status & (CHAN_ACTIVE | CHAN_PEND)))
         dprintf(DP_SERVER, "PART %s\n", chan->name);
         dprintf(DP_SERVER, "PART %s\n", chan->name);
-      if (shouldjoin(chan) && !(chan->status & (CHAN_ACTIVE | CHAN_PEND)))
+      if (shouldjoin(chan) && !(chan->status & (CHAN_ACTIVE | CHAN_PEND | CHAN_JOINING))) {
         dprintf(DP_SERVER, "JOIN %s %s\n", (chan->name[0]) ?
         dprintf(DP_SERVER, "JOIN %s %s\n", (chan->name[0]) ?
   			   chan->name : chan->dname,
   			   chan->name : chan->dname,
   			   chan->channel.key[0] ?
   			   chan->channel.key[0] ?
     			   chan->channel.key : chan->key_prot);
     			   chan->channel.key : chan->key_prot);
+        chan->status |= CHAN_JOINING;
+      }
     }
     }
     if ((old_status ^ chan->status) & (CHAN_ENFORCEBANS | CHAN_BITCH | CHAN_BOTBITCH | CHAN_CLOSED | CHAN_PRIVATE)) {
     if ((old_status ^ chan->status) & (CHAN_ENFORCEBANS | CHAN_BITCH | CHAN_BOTBITCH | CHAN_CLOSED | CHAN_PRIVATE)) {
       recheck_channel(chan, 1);
       recheck_channel(chan, 1);

+ 15 - 10
src/mod/irc.mod/chan.c

@@ -1699,13 +1699,13 @@ static int got315(char *from, char *msg)
     return 0;
     return 0;
   /* Finished getting who list, can now be considered officially ON CHANNEL */
   /* Finished getting who list, can now be considered officially ON CHANNEL */
   chan->status |= CHAN_ACTIVE;
   chan->status |= CHAN_ACTIVE;
-  chan->status &= ~CHAN_PEND;
+  chan->status &= ~(CHAN_PEND | CHAN_JOINING);
   /* Am *I* on the channel now? if not, well d0h. */
   /* Am *I* on the channel now? if not, well d0h. */
   if (!ismember(chan, botname)) {
   if (!ismember(chan, botname)) {
-    putlog(LOG_MISC | LOG_JOIN, chan->dname, "Oops, I'm not really on %s.",
-	   chan->dname);
+    putlog(LOG_MISC | LOG_JOIN, chan->dname, "Oops, I'm not really on %s.", chan->dname);
     clear_channel(chan, 1);
     clear_channel(chan, 1);
     chan->status &= ~CHAN_ACTIVE;
     chan->status &= ~CHAN_ACTIVE;
+    chan->status |= CHAN_JOINING;
     dprintf(DP_MODE, "JOIN %s %s\n",
     dprintf(DP_MODE, "JOIN %s %s\n",
 	    (chan->name[0]) ? chan->name : chan->dname,
 	    (chan->name[0]) ? chan->name : chan->dname,
 	    chan->channel.key[0] ? chan->channel.key : chan->key_prot);
 	    chan->channel.key[0] ? chan->channel.key : chan->key_prot);
@@ -1929,6 +1929,7 @@ static int got403(char *from, char *msg)
              "Unique channel %s does not exist... Attempting to join with "
              "Unique channel %s does not exist... Attempting to join with "
              "short name.", chname);
              "short name.", chname);
       dprintf(DP_SERVER, "JOIN %s\n", chan->dname);
       dprintf(DP_SERVER, "JOIN %s\n", chan->dname);
+      chan->status |= CHAN_JOINING;
     } else {
     } else {
       /* We have found the channel, so the server has given us the short
       /* We have found the channel, so the server has given us the short
        * name. Prefix another '!' to it, and attempt the join again...
        * name. Prefix another '!' to it, and attempt the join again...
@@ -2261,7 +2262,7 @@ static int gotjoin(char *from, char *chname)
       /* uh, what?!  i'm on the channel?! */
       /* uh, what?!  i'm on the channel?! */
       putlog(LOG_ERROR, "*", "confused bot: guess I'm on %s and didn't realize it", chan->dname);
       putlog(LOG_ERROR, "*", "confused bot: guess I'm on %s and didn't realize it", chan->dname);
       chan->status |= CHAN_ACTIVE;
       chan->status |= CHAN_ACTIVE;
-      chan->status &= ~CHAN_PEND;
+      chan->status &= ~(CHAN_PEND | CHAN_JOINING);
       reset_chan_info(chan);
       reset_chan_info(chan);
     } else {
     } else {
       int splitjoin = 0;
       int splitjoin = 0;
@@ -2438,7 +2439,7 @@ static int gotpart(char *from, char *msg)
     if (match_my_nick(nick)) 
     if (match_my_nick(nick)) 
       irc_log(chan, "Parting");    
       irc_log(chan, "Parting");    
     clear_channel(chan, 1);
     clear_channel(chan, 1);
-    chan->status &= ~(CHAN_ACTIVE | CHAN_PEND);
+    chan->status &= ~(CHAN_ACTIVE | CHAN_PEND | CHAN_JOINING);
     return 0;
     return 0;
   }
   }
   if (chan && !channel_pending(chan)) {
   if (chan && !channel_pending(chan)) {
@@ -2446,7 +2447,7 @@ static int gotpart(char *from, char *msg)
       /* whoa! */
       /* whoa! */
       putlog(LOG_ERRORS, "*", "confused bot: guess I'm on %s and didn't realize it", chan->dname);
       putlog(LOG_ERRORS, "*", "confused bot: guess I'm on %s and didn't realize it", chan->dname);
       chan->status |= CHAN_ACTIVE;
       chan->status |= CHAN_ACTIVE;
-      chan->status &= ~CHAN_PEND;
+      chan->status &= ~(CHAN_PEND | CHAN_JOINING);
       reset_chan_info(chan);
       reset_chan_info(chan);
     }
     }
     set_handle_laston(chan->dname, u, now);
     set_handle_laston(chan->dname, u, now);
@@ -2462,11 +2463,13 @@ static int gotpart(char *from, char *msg)
     /* If it was me, all hell breaks loose... */
     /* If it was me, all hell breaks loose... */
     if (match_my_nick(nick)) {
     if (match_my_nick(nick)) {
       clear_channel(chan, 1);
       clear_channel(chan, 1);
-      chan->status &= ~(CHAN_ACTIVE | CHAN_PEND);
-      if (shouldjoin(chan))
+      chan->status &= ~(CHAN_ACTIVE | CHAN_PEND | CHAN_JOINING);
+      if (shouldjoin(chan)) {
 	dprintf(DP_MODE, "JOIN %s %s\n",
 	dprintf(DP_MODE, "JOIN %s %s\n",
 	        (chan->name[0]) ? chan->name : chan->dname,
 	        (chan->name[0]) ? chan->name : chan->dname,
 	        chan->channel.key[0] ? chan->channel.key : chan->key_prot);
 	        chan->channel.key[0] ? chan->channel.key : chan->key_prot);
+        chan->status |= CHAN_JOINING;
+      }
     } else
     } else
       check_lonely_channel(chan);
       check_lonely_channel(chan);
   }
   }
@@ -2489,8 +2492,9 @@ static int gotkick(char *from, char *origmsg)
 
 
   char *nick = newsplit(&msg);
   char *nick = newsplit(&msg);
 
 
-  if (match_my_nick(nick) && channel_pending(chan) && shouldjoin(chan)) {
+  if (match_my_nick(nick) && channel_pending(chan) && shouldjoin(chan) && !channel_joining(chan)) {
     chan->status &= ~(CHAN_ACTIVE | CHAN_PEND);
     chan->status &= ~(CHAN_ACTIVE | CHAN_PEND);
+    chan->status |= CHAN_JOINING;
     dprintf(DP_MODE, "JOIN %s %s\n",
     dprintf(DP_MODE, "JOIN %s %s\n",
             (chan->name[0]) ? chan->name : chan->dname,
             (chan->name[0]) ? chan->name : chan->dname,
             chan->channel.key[0] ? chan->channel.key : chan->key_prot);
             chan->channel.key[0] ? chan->channel.key : chan->key_prot);
@@ -2537,11 +2541,12 @@ static int gotkick(char *from, char *origmsg)
     }
     }
     irc_log(chan, "%s was kicked by %s (%s)", s1, from, msg);
     irc_log(chan, "%s was kicked by %s (%s)", s1, from, msg);
     /* Kicked ME?!? the sods! */
     /* Kicked ME?!? the sods! */
-    if (match_my_nick(nick) && shouldjoin(chan)) {
+    if (match_my_nick(nick) && shouldjoin(chan) && !channel_joining(chan)) {
       chan->status &= ~(CHAN_ACTIVE | CHAN_PEND);
       chan->status &= ~(CHAN_ACTIVE | CHAN_PEND);
       dprintf(DP_MODE, "JOIN %s %s\n",
       dprintf(DP_MODE, "JOIN %s %s\n",
               (chan->name[0]) ? chan->name : chan->dname,
               (chan->name[0]) ? chan->name : chan->dname,
               chan->channel.key[0] ? chan->channel.key : chan->key_prot);
               chan->channel.key[0] ? chan->channel.key : chan->key_prot);
+      chan->status |= CHAN_JOINING;
       clear_channel(chan, 1);
       clear_channel(chan, 1);
     } else {
     } else {
       killmember(chan, nick);
       killmember(chan, nick);

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

@@ -596,6 +596,7 @@ getin_request(char *botnick, char *code, char *par)
       if (!(channel_pending(chan) || channel_active(chan))) {
       if (!(channel_pending(chan) || channel_active(chan))) {
         putlog(LOG_GETIN, "*", "Got key for %s from %s (%s) - Joining", chan->dname, botnick, nick);
         putlog(LOG_GETIN, "*", "Got key for %s from %s (%s) - Joining", chan->dname, botnick, nick);
         dprintf(DP_MODE, "JOIN %s %s\n", chan->dname, nick);
         dprintf(DP_MODE, "JOIN %s %s\n", chan->dname, nick);
+        chan->status |= CHAN_JOINING;
       } else {
       } else {
         putlog(LOG_GETIN, "*", "Got key for %s from %s - I'm already in the channel", chan->dname, botnick);
         putlog(LOG_GETIN, "*", "Got key for %s from %s - I'm already in the channel", chan->dname, botnick);
       }
       }
@@ -1118,7 +1119,7 @@ reset_chan_info(struct chanset_t *chan)
     chan->channel.key = (char *) my_calloc(1, 1);
     chan->channel.key = (char *) my_calloc(1, 1);
     clear_channel(chan, 1);
     clear_channel(chan, 1);
     chan->status |= CHAN_PEND;
     chan->status |= CHAN_PEND;
-    chan->status &= ~(CHAN_ACTIVE | CHAN_ASKEDMODES);
+    chan->status &= ~(CHAN_ACTIVE | CHAN_ASKEDMODES | CHAN_JOINING);
     if (!(chan->status & CHAN_ASKEDBANS)) {
     if (!(chan->status & CHAN_ASKEDBANS)) {
       chan->status |= CHAN_ASKEDBANS;
       chan->status |= CHAN_ASKEDBANS;
       dprintf(DP_MODE, "MODE %s +b\n", chan->name);
       dprintf(DP_MODE, "MODE %s +b\n", chan->name);
@@ -1169,6 +1170,7 @@ check_lonely_channel(struct chanset_t *chan)
       dprintf(DP_MODE, "PART %s\n", chan->name);
       dprintf(DP_MODE, "PART %s\n", chan->name);
       /* If it's a !chan, we need to recreate the channel with !!chan <cybah> */
       /* If it's a !chan, we need to recreate the channel with !!chan <cybah> */
       dprintf(DP_MODE, "JOIN %s%s %s\n", (chan->dname[0] == '!') ? "!" : "", chan->dname, chan->key_prot);
       dprintf(DP_MODE, "JOIN %s%s %s\n", (chan->dname[0] == '!') ? "!" : "", chan->dname, chan->key_prot);
+      chan->status |= CHAN_JOINING;
       whined = 0;
       whined = 0;
     }
     }
   } else if (any_ops(chan)) {
   } else if (any_ops(chan)) {
@@ -1381,10 +1383,11 @@ check_expired_chanstuff(struct chanset_t *chan)
       m = n;
       m = n;
     }
     }
     check_lonely_channel(chan);
     check_lonely_channel(chan);
-  } else if (shouldjoin(chan) && !channel_pending(chan)) {
+  } else if (shouldjoin(chan) && !channel_pending(chan) && !channel_joining(chan)) {
     dprintf(DP_MODE, "JOIN %s %s\n",
     dprintf(DP_MODE, "JOIN %s %s\n",
             (chan->name[0]) ? chan->name : chan->dname,
             (chan->name[0]) ? chan->name : chan->dname,
             chan->channel.key[0] ? chan->channel.key : chan->key_prot);
             chan->channel.key[0] ? chan->channel.key : chan->key_prot);
+    chan->status |= CHAN_JOINING;
   }
   }
 }
 }
 
 
@@ -1471,6 +1474,8 @@ irc_report(int idx, int details)
       if (shouldjoin(chan)) {
       if (shouldjoin(chan)) {
         if (chan->status & CHAN_JUPED)
         if (chan->status & CHAN_JUPED)
           p = MISC_JUPED;
           p = MISC_JUPED;
+        else if (channel_joining(chan))
+          p = MISC_JOINING;
         else if (!(chan->status & CHAN_ACTIVE))
         else if (!(chan->status & CHAN_ACTIVE))
           p = MISC_TRYING;
           p = MISC_TRYING;
         else if (chan->status & CHAN_PEND)
         else if (chan->status & CHAN_PEND)

+ 7 - 4
src/mod/server.mod/servmsg.c

@@ -164,10 +164,12 @@ static int got001(char *from, char *msg)
     return 0;			/* Uh, no server list */
     return 0;			/* Uh, no server list */
 
 
   for (register struct chanset_t *chan = chanset; chan; chan = chan->next) {
   for (register struct chanset_t *chan = chanset; chan; chan = chan->next) {
-    chan->status &= ~(CHAN_ACTIVE | CHAN_PEND);
-    if (shouldjoin(chan))
+    chan->status &= ~(CHAN_ACTIVE | CHAN_PEND | CHAN_JOINING);
+    if (shouldjoin(chan)) {
       dprintf(DP_SERVER, "JOIN %s %s\n", (chan->name[0]) ? chan->name : chan->dname,
       dprintf(DP_SERVER, "JOIN %s %s\n", (chan->name[0]) ? chan->name : chan->dname,
                                          chan->channel.key[0] ? chan->channel.key : chan->key_prot);
                                          chan->channel.key[0] ? chan->channel.key : chan->key_prot);
+      chan->status |= CHAN_JOINING;
+    }
   }
   }
   if (egg_strcasecmp(from, dcc[servidx].host)) {
   if (egg_strcasecmp(from, dcc[servidx].host)) {
     putlog(LOG_MISC, "*", "(%s claims to be %s; updating server list)", dcc[servidx].host, from);
     putlog(LOG_MISC, "*", "(%s claims to be %s; updating server list)", dcc[servidx].host, from);
@@ -267,10 +269,11 @@ static int got442(char *from, char *msg)
   chname = newsplit(&msg);
   chname = newsplit(&msg);
   chan = findchan(chname);
   chan = findchan(chname);
   if (chan)
   if (chan)
-    if (shouldjoin(chan)) {
+    if (shouldjoin(chan) && !channel_joining(chan)) {
       putlog(LOG_MISC, chname, IRC_SERVNOTONCHAN, chname);
       putlog(LOG_MISC, chname, IRC_SERVNOTONCHAN, chname);
       clear_channel(chan, 1);
       clear_channel(chan, 1);
       chan->status &= ~CHAN_ACTIVE;
       chan->status &= ~CHAN_ACTIVE;
+      chan->status |= CHAN_JOINING;
       dprintf(DP_MODE, "JOIN %s %s\n", chan->name,
       dprintf(DP_MODE, "JOIN %s %s\n", chan->name,
 	      chan->channel.key[0] ? chan->channel.key : chan->key_prot);
 	      chan->channel.key[0] ? chan->channel.key : chan->key_prot);
     }
     }
@@ -774,7 +777,7 @@ static int got433(char *from, char *msg)
   return 0;
   return 0;
 }
 }
 
 
-/* 437 : Nickname juped (IRCnet)
+/* 437 : Channel/Nickname juped (IRCnet)
  */
  */
 static int got437(char *from, char *msg)
 static int got437(char *from, char *msg)
 {
 {