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

* Optimized WHO parsing more to alieviate some cpu usage in large chans
* Fixed a bug which caused a leaf to not request ops in a channel after adding it's new host to the userfile.


svn: 1986

Bryan Drewery 21 лет назад
Родитель
Сommit
c8511123ee
4 измененных файлов с 49 добавлено и 29 удалено
  1. 2 0
      doc/UPDATES
  2. 45 28
      src/mod/irc.mod/chan.c
  3. 1 1
      src/mod/irc.mod/irc.c
  4. 1 0
      src/mod/server.mod/server.c

+ 2 - 0
doc/UPDATES

@@ -64,6 +64,8 @@ Lines prefixxed with '-' were disabled before release and are not finishsed, or
 * Fixed a file descriptor leak in the 'last' checking.
 * Fixed a file descriptor leak in the 'last' checking.
 * Fixed bot's being tagged with op/login stats. (#22)
 * Fixed bot's being tagged with op/login stats. (#22)
 * cmd_cycle now will only cycle the net if done on the hub. Doing it on a leaf cycles only that one bot.
 * cmd_cycle now will only cycle the net if done on the hub. Doing it on a leaf cycles only that one bot.
+* Optimized WHO parsing more to alieviate some cpu usage in large chans
+* Fixed a bug which caused a leaf to not request ops in a channel after adding it's new host to the userfile.
 
 
 1.2.2
 1.2.2
 * Don't sanity check flags for users on DCC CHAT if they are on the bot via .botcmd.
 * Don't sanity check flags for users on DCC CHAT if they are on the bot via .botcmd.

+ 45 - 28
src/mod/irc.mod/chan.c

@@ -19,13 +19,25 @@ static char   last_invchan[300] = "";
  */
  */
 #define CHANNEL_ID_LEN 5
 #define CHANNEL_ID_LEN 5
 
 
+static void print_memberlist(memberlist *toprint)
+{
+  memberlist *m = NULL;
+
+  for (m = toprint; m && m->nick[0]; m = m->next) {
+    sdprintf("%s!%s user: %s tried: %d hops: %d", m->nick, m->userhost, m->user ? m->user->handle : "", m->tried_getuser, m->hops);
+  }
+}
+
 /* Returns a pointer to a new channel member structure.
 /* Returns a pointer to a new channel member structure.
  */
  */
-static memberlist *newmember(struct chanset_t *chan, char * nick)
+static memberlist *newmember(struct chanset_t *chan, char *nick)
 {
 {
-  memberlist *x = x = chan->channel.member, *lx = NULL, *n = (memberlist *) my_calloc(1, sizeof(memberlist));
+  memberlist *x = chan->channel.member, 
+             *lx = NULL, 
+             *n = (memberlist *) my_calloc(1, sizeof(memberlist));
 
 
-  while (x && x->nick[0] && (rfc_casecmp(x->nick, nick)<0)) {
+  /* This sorts the list */
+  while (x && x->nick[0] && (rfc_casecmp(x->nick, nick) < 0)) {
     lx = x;
     lx = x;
     x = x->next;
     x = x->next;
   }
   }
@@ -38,11 +50,12 @@ static memberlist *newmember(struct chanset_t *chan, char * nick)
   n->hops = -1;
   n->hops = -1;
   if (!lx) {
   if (!lx) {
     n->next = chan->channel.member;
     n->next = chan->channel.member;
-    chan->channel.member=n;
+    chan->channel.member = n;
   } else {
   } else {
     n->next = lx->next;
     n->next = lx->next;
     lx->next = n;
     lx->next = n;
   }
   }
+
   chan->channel.members++;
   chan->channel.members++;
   return n;
   return n;
 }
 }
@@ -1171,8 +1184,9 @@ void recheck_channel(struct chanset_t *chan, int dobans)
 
 
   if (stacking)
   if (stacking)
     return;			/* wewps */
     return;			/* wewps */
+
   if (!userlist || loading)                /* Bot doesnt know anybody */
   if (!userlist || loading)                /* Bot doesnt know anybody */
-    return;                     /* ... it's better not to deop everybody */
+    return;        		           /* ... it's better not to deop everybody */
 
 
   memberlist *m = NULL;
   memberlist *m = NULL;
   char s[UHOSTLEN] = "";
   char s[UHOSTLEN] = "";
@@ -1229,16 +1243,16 @@ void recheck_channel(struct chanset_t *chan, int dobans)
   }
   }
 
 
   for (m = chan->channel.member; m && m->nick[0]; m = m->next) { 
   for (m = chan->channel.member; m && m->nick[0]; m = m->next) { 
-    sprintf(s, "%s!%s", m->nick, m->userhost);
+    simple_sprintf(s, "%s!%s", m->nick, m->userhost);
 
 
     if (!m->user && !m->tried_getuser) {
     if (!m->user && !m->tried_getuser) {
            m->tried_getuser = 1;
            m->tried_getuser = 1;
            m->user = get_user_by_host(s);
            m->user = get_user_by_host(s);
     }
     }
     get_user_flagrec(m->user, &fr, chan->dname);
     get_user_flagrec(m->user, &fr, chan->dname);
-      if (glob_bot(fr) && chan_hasop(m) && !match_my_nick(m->nick))
-	stop_reset = 1;
-      check_this_member(chan, m->nick, &fr);
+    if (glob_bot(fr) && chan_hasop(m) && !match_my_nick(m->nick))
+      stop_reset = 1;
+    check_this_member(chan, m->nick, &fr);
   }
   }
 
 
   if (dobans) {
   if (dobans) {
@@ -1543,15 +1557,18 @@ static int got352or4(struct chanset_t *chan, char *user, char *host, char *nick,
   struct flag_record fr = { FR_GLOBAL | FR_CHAN, 0, 0, 0 };
   struct flag_record fr = { FR_GLOBAL | FR_CHAN, 0, 0, 0 };
   char userhost[UHOSTLEN] = "";
   char userhost[UHOSTLEN] = "";
   memberlist *m = ismember(chan, nick);	/* in my channel list copy? */
   memberlist *m = ismember(chan, nick);	/* in my channel list copy? */
-  bool waschanop;
+  bool waschanop = 0, me = 0;
 //  struct chanset_t *ch = NULL;
 //  struct chanset_t *ch = NULL;
 //  memberlist *ml = NULL;
 //  memberlist *ml = NULL;
 
 
+  me = match_my_nick(nick);
+
   if (!m) {			/* Nope, so update */
   if (!m) {			/* Nope, so update */
     m = newmember(chan, nick);	/* Get a new channel entry */
     m = newmember(chan, nick);	/* Get a new channel entry */
     m->joined = m->split = m->delay = 0L;	/* Don't know when he joined */
     m->joined = m->split = m->delay = 0L;	/* Don't know when he joined */
     m->flags = 0;		/* No flags for now */
     m->flags = 0;		/* No flags for now */
     m->last = now;		/* Last time I saw him */
     m->last = now;		/* Last time I saw him */
+    m->user = NULL;
   }
   }
   if (!m->nick[0])
   if (!m->nick[0])
     strcpy(m->nick, nick);	/* Store the nick in list */
     strcpy(m->nick, nick);	/* Store the nick in list */
@@ -1576,14 +1593,7 @@ static int got352or4(struct chanset_t *chan, char *user, char *host, char *nick,
   if (!m->userhost[0])
   if (!m->userhost[0])
     simple_sprintf(m->userhost, "%s@%s", user, host);
     simple_sprintf(m->userhost, "%s@%s", user, host);
   simple_sprintf(userhost, "%s!%s", nick, m->userhost);
   simple_sprintf(userhost, "%s!%s", nick, m->userhost);
-  /* Combine n!u@h */
-//  m->user = NULL;		/* No handle match (yet) */
-  if (!m->user)
-    m->tried_getuser = 0;
-  if (match_my_nick(nick)) {	/* Is it me? */
-    strcpy(botuserhost, m->userhost);	/* Yes, save my own userhost */
-    m->joined = now;		/* set this to keep the whining masses happy */
-  }
+
   waschanop = me_op(chan);      /* Am I opped here? */
   waschanop = me_op(chan);      /* Am I opped here? */
   if (strchr(flags, '@') != NULL)	/* Flags say he's opped? */
   if (strchr(flags, '@') != NULL)	/* Flags say he's opped? */
     m->flags |= (CHANOP | WASOP);	/* Yes, so flag in my table */
     m->flags |= (CHANOP | WASOP);	/* Yes, so flag in my table */
@@ -1600,20 +1610,26 @@ static int got352or4(struct chanset_t *chan, char *user, char *host, char *nick,
   if (!(m->flags & (CHANVOICE | CHANOP)))
   if (!(m->flags & (CHANVOICE | CHANOP)))
     m->flags |= STOPWHO;
     m->flags |= STOPWHO;
 
 
-  if (!waschanop && me_op(chan) && match_my_nick(nick))
-    recheck_channel(chan, 1);
-  if (!me_op(chan) && match_my_nick(nick) && any_ops(chan))
-    chan->channel.do_opreq = 1;
+  if (me) {			/* Is it me? */
+//    strcpy(botuserhost, m->userhost);		/* Yes, save my own userhost */
+    m->joined = now;				/* set this to keep the whining masses happy */
 
 
-  if (!m->user)
+    if (!waschanop && me_op(chan))
+      recheck_channel(chan, 1);
+    if (!me_op(chan) && any_ops(chan))
+      chan->channel.do_opreq = 1;
+  }
+
+  if (!m->user && !m->tried_getuser) {
     m->user = get_user_by_host(userhost);
     m->user = get_user_by_host(userhost);
-  m->tried_getuser = 1;
+    m->tried_getuser = 1;
+  }
   get_user_flagrec(m->user, &fr, chan->dname);
   get_user_flagrec(m->user, &fr, chan->dname);
   
   
   if (me_op(chan)) {
   if (me_op(chan)) {
     /* are they a chanop, and me too */
     /* are they a chanop, and me too */
         /* are they a channel or global de-op */
         /* are they a channel or global de-op */
-    if (chan_hasop(m) && chk_deop(fr, chan) && !match_my_nick(nick)) 
+    if (chan_hasop(m) && chk_deop(fr, chan) && !me)
         /* && target_priority(chan, m, 1) */
         /* && target_priority(chan, m, 1) */
       add_mode(chan, '-', 'o', nick);
       add_mode(chan, '-', 'o', nick);
 
 
@@ -1622,7 +1638,7 @@ static int got352or4(struct chanset_t *chan, char *user, char *host, char *nick,
         /* and user matches a ban */
         /* and user matches a ban */
         (u_match_mask(global_bans, userhost) || u_match_mask(chan->bans, userhost)) &&
         (u_match_mask(global_bans, userhost) || u_match_mask(chan->bans, userhost)) &&
         /* and it's not me, and i'm an op */
         /* and it's not me, and i'm an op */
-        !match_my_nick(nick)) {
+        !me) {
       /*  && target_priority(chan, m, 0) */
       /*  && target_priority(chan, m, 0) */
       dprintf(DP_SERVER, "KICK %s %s :%s%s\n", chan->name, nick, bankickprefix, response(RES_BANNED));
       dprintf(DP_SERVER, "KICK %s %s :%s%s\n", chan->name, nick, bankickprefix, response(RES_BANNED));
       m->flags |= SENTKICK;
       m->flags |= SENTKICK;
@@ -1631,7 +1647,7 @@ static int got352or4(struct chanset_t *chan, char *user, char *host, char *nick,
     else if ((chan_kick(fr) || glob_kick(fr)) &&
     else if ((chan_kick(fr) || glob_kick(fr)) &&
            /* and it's not me :) who'd set me +k anyway, a sicko? */
            /* and it's not me :) who'd set me +k anyway, a sicko? */
            /* and if im an op */
            /* and if im an op */
-           !match_my_nick(nick)) {
+           !me) {
            /* && target_priority(chan, m, 0) */
            /* && target_priority(chan, m, 0) */
       /* cya later! */
       /* cya later! */
       quickban(chan, userhost);
       quickban(chan, userhost);
@@ -1708,6 +1724,7 @@ static int got315(char *from, char *msg)
   /* May have left the channel before the who info came in */
   /* May have left the channel before the who info came in */
   if (!chan || !channel_pending(chan))
   if (!chan || !channel_pending(chan))
     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_JOINING);
   chan->status &= ~(CHAN_PEND | CHAN_JOINING);
@@ -1725,7 +1742,7 @@ static int got315(char *from, char *msg)
       recheck_channel(chan, 1);
       recheck_channel(chan, 1);
     else if (chan->channel.members == 1)
     else if (chan->channel.members == 1)
       chan->status |= CHAN_STOP_CYCLE;
       chan->status |= CHAN_STOP_CYCLE;
-    else 
+    else
       request_op(chan);
       request_op(chan);
   }
   }
   /* do not check for i-lines here. */
   /* do not check for i-lines here. */

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

@@ -649,7 +649,7 @@ request_op(struct chanset_t *chan)
       ml->tried_getuser = 1;
       ml->tried_getuser = 1;
     }
     }
     if ((i < MAX_BOTS) && ml->user && ml->user->bot && 
     if ((i < MAX_BOTS) && ml->user && ml->user->bot && 
-        (nextbot(ml->user->handle) >= 0) && chan_hasop(ml) && !chan_issplit(ml)) {
+        findbot(ml->user->handle) && chan_hasop(ml) && !chan_issplit(ml)) {
 
 
       get_user_flagrec(ml->user, &fr, NULL);
       get_user_flagrec(ml->user, &fr, NULL);
       if (chk_op(fr, chan))
       if (chk_op(fr, chan))

+ 1 - 0
src/mod/server.mod/server.c

@@ -10,6 +10,7 @@
 #include "src/botmsg.h"
 #include "src/botmsg.h"
 #include "src/rfc1459.h"
 #include "src/rfc1459.h"
 #include "src/settings.h"
 #include "src/settings.h"
+#include "src/match.h"
 #include "src/tclhash.h"
 #include "src/tclhash.h"
 #include "src/users.h"
 #include "src/users.h"
 #include "src/userrec.h"
 #include "src/userrec.h"