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

* Port [3339] to 1.2.14
* Make +nomassjoin not unset +m or +i if they were already set.



svn: 3340

Bryan Drewery 19 лет назад
Родитель
Сommit
090b258d3b
3 измененных файлов с 40 добавлено и 13 удалено
  1. 1 1
      src/chan.h
  2. 3 0
      src/mod/channels.mod/tclchan.c
  3. 36 12
      src/mod/irc.mod/chan.c

+ 1 - 1
src/chan.h

@@ -94,6 +94,7 @@ struct chan_t {
   time_t no_op;
   time_t drone_jointime;
   int fighting;
+  int drone_set_mode;
   int drone_joins;
 #ifdef G_BACKUP
   int backup_time;              /* If non-0, set +backup when now>backup_time */
@@ -101,7 +102,6 @@ struct chan_t {
   int maxmembers;
   int members;
   int do_opreq;
-  bool set_im;
   char *topic;
   char *key;
   unsigned short int mode;

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

@@ -880,6 +880,9 @@ int channel_add(char *result, char *newname, char *options)
     chan->channel.jointime = 0;
     chan->channel.parttime = 0;
     chan->channel.fighting = 0;
+    chan->channel.drone_set_mode = 0;
+    chan->channel.drone_jointime = 0;
+    chan->channel.drone_joins = 0;
 
     /* We _only_ put the dname (display name) in here so as not to confuse
      * any code later on. chan->name gets updated with the channel name as

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

@@ -2294,8 +2294,16 @@ 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;
+  if (chan->channel.drone_set_mode) {
+    char buf[3] = "", *p = buf;
+    if (chan->channel.drone_set_mode & CHANINV)
+      *p++ = 'i';
+    if (chan->channel.drone_set_mode & CHANMODER)
+      *p++ = 'm';
+    buf[2] = '\0';
+    dprintf(DP_MODE, "MODE %s :-%s\n", chan->name[0] ? chan->name : chan->dname, buf);
+  }
+  chan->channel.drone_set_mode = 0;
 }
 
 
@@ -2435,18 +2443,34 @@ static int gotjoin(char *from, char *chname)
            ++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
+           if (!chan->channel.drone_set_mode && 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);
+             chan->channel.drone_set_mode = 0;
+
+             char buf[3] = "", *p = buf;
+
+             if (!(chan->channel.mode & CHANINV)) {
+               chan->channel.drone_set_mode |= CHANINV;
+               *p++ = 'i';
+             }
+             if (!(chan->channel.mode & CHANMODER)) {
+               chan->channel.drone_set_mode |= CHANMODER;
+               *p++ = 'm';
+             }
+             buf[2] = '\0';
+
+             if (chan->channel.drone_set_mode && buf[0]) {
+               chan->channel.drone_joins = 0;
+               chan->channel.drone_jointime = 0;
+              
+               dprintf(DP_DUMP, "MODE %s :+%s\n", chan->name[0] ? chan->name : chan->dname, buf);
+               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);
+             }
            }
          }