Quellcode durchsuchen

* Track how many split members there are

Bryan Drewery vor 16 Jahren
Ursprung
Commit
0d90094b87
4 geänderte Dateien mit 10 neuen und 1 gelöschten Zeilen
  1. 1 0
      src/chan.h
  2. 1 0
      src/mod/channels.mod/tclchan.c
  3. 2 0
      src/mod/irc.mod/chan.c
  4. 6 1
      src/mod/irc.mod/irc.c

+ 1 - 0
src/chan.h

@@ -109,6 +109,7 @@ struct chan_t {
 #endif /* G_BACKUP */
   int maxmembers;
   int members;
+  int splitmembers;
   int do_opreq;
   char *topic;
   char *key;

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

@@ -857,6 +857,7 @@ static void init_channel(struct chanset_t *chan, bool reset)
   chan->channel.maxmembers = 0;
   chan->channel.mode = 0;
   chan->channel.members = 0;
+  chan->channel.splitmembers = 0;
 
   if (!reset)
     chan->channel.key = (char *) my_calloc(1, 1);

+ 2 - 0
src/mod/irc.mod/chan.c

@@ -2612,6 +2612,7 @@ static int gotjoin(char *from, char *chname)
       if (m && m->split && !strcasecmp(m->userhost, uhost)) {
         splitjoin = 1;
 	m->split = 0;
+        --(chan->channel.splitmembers);
 	m->last = now;
 	m->delay = 0L;
 	m->flags = (chan_hasop(m) ? WASOP : 0);
@@ -3074,6 +3075,7 @@ static int gotquit(char *from, char *msg)
       }
       if (split) {
 	m->split = now;
+        ++(chan->channel.splitmembers);
         irc_log(chan, "%s (%s) got netsplit.", nick, from);
       } else {
 	killmember(chan, nick);

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

@@ -1253,8 +1253,12 @@ killmember(struct chanset_t *chan, char *nick)
    */
   if (unlikely(chan->channel.members < 0)) {
     chan->channel.members = 0;
-    for (x = chan->channel.member; x && x->nick[0]; x = x->next)
+    chan->channel.splitmembers = 0;
+    for (x = chan->channel.member; x && x->nick[0]; x = x->next) {
       chan->channel.members++;
+      if (x->split)
+        ++(chan->channel.splitmembers);
+    }
     putlog(LOG_MISC, "*", "(!) actually I know of %d members.", chan->channel.members);
   }
   if (unlikely(!chan->channel.member)) {
@@ -1615,6 +1619,7 @@ check_expired_chanstuff(struct chanset_t *chan)
       if (m->split && now - m->split > wait_split) {
         simple_snprintf(s, sizeof(s), "%s!%s", m->nick, m->userhost);
         putlog(LOG_JOIN, chan->dname, "%s (%s) got lost in the net-split.", m->nick, m->userhost);
+        --(chan->channel.splitmembers);
         killmember(chan, m->nick);
         continue;
       }