|
|
@@ -2289,6 +2289,16 @@ static int got332(char *from, char *msg)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+static time_t flood_im_time = 120;
|
|
|
+rate_t flood_massjoin = { 6, 1 };
|
|
|
+
|
|
|
+void unset_im(struct chanset_t *chan)
|
|
|
+{
|
|
|
+ dprintf(DP_MODE, "MODE %s :-im\n", chan->name[0] ? chan->name : chan->dname);
|
|
|
+ chan->channel.set_im = 0;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
/* Got a join
|
|
|
*/
|
|
|
static int gotjoin(char *from, char *chname)
|
|
|
@@ -2417,6 +2427,29 @@ static int gotjoin(char *from, char *chname)
|
|
|
m->flags |= STOPWHO;
|
|
|
irc_log(chan, "%s returned from netsplit", m->nick);
|
|
|
} else {
|
|
|
+ if (channel_nomassjoin(chan) && me_op(chan)) {
|
|
|
+ if (chan->channel.drone_jointime < now - flood_massjoin.time) { //expired, reset counter
|
|
|
+ chan->channel.drone_joins = 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ ++chan->channel.drone_joins;
|
|
|
+ chan->channel.drone_jointime = now;
|
|
|
+
|
|
|
+ if (!chan->channel.set_im && chan->channel.drone_joins >= flood_massjoin.count) { //flood from dronenet, let's attempt to set +im
|
|
|
+ egg_timeval_t howlong;
|
|
|
+
|
|
|
+ chan->channel.set_im = 1;
|
|
|
+ chan->channel.drone_joins = 0;
|
|
|
+ chan->channel.drone_jointime = 0;
|
|
|
+ dprintf(DP_DUMP, "MODE %s :+im\n", chan->name);
|
|
|
+ howlong.sec = flood_im_time;
|
|
|
+ howlong.usec = 0;
|
|
|
+ timer_create_complex(&howlong, "Unset umode +im", (Function) unset_im, (void *) chan, 0);
|
|
|
+
|
|
|
+ putlog(LOG_MISC, "*", "Drone flood detected in %s! Setting +im for %li seconds.", chan->dname, flood_im_time);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
if (m)
|
|
|
killmember(chan, nick);
|
|
|
m = newmember(chan, nick);
|