Sfoglia il codice sorgente

* Remove some redundant user lookup code, and act on user lookups more often

Bryan Drewery 16 anni fa
parent
commit
61a7bfdc88
5 ha cambiato i file con 43 aggiunte e 92 eliminazioni
  1. 25 23
      src/mod/irc.mod/chan.c
  2. 11 33
      src/mod/irc.mod/cmdsirc.c
  3. 3 19
      src/mod/irc.mod/irc.c
  4. 1 0
      src/mod/irc.mod/irc.h
  5. 3 17
      src/mod/irc.mod/mode.c

+ 25 - 23
src/mod/irc.mod/chan.c

@@ -249,6 +249,27 @@ static memberlist *newmember(struct chanset_t *chan, char *nick)
   return n;
 }
 
+static bool member_getuser(memberlist* m, bool act_on_lookup) {
+  if (!m) return 0;
+  if (!m->user && !m->tried_getuser) {
+    static char s[UHOSTLEN] = "";
+
+    simple_snprintf(s, sizeof(s), "%s!%s", m->nick, m->userhost);
+    m->user = get_user_by_host(s);
+    if (!m->user && m->userip[0]) {
+      simple_snprintf(s, sizeof(s), "%s!%s", m->nick, m->userip);
+      m->user = get_user_by_host(s);
+    }
+    m->tried_getuser = 1;
+
+    /* Managed to get the user for a previously unknown user. Act on it! */
+    if (act_on_lookup && m->user)
+      check_this_user(m->user->handle, 0, NULL);
+
+  }
+  return !(m->user == NULL);
+}
+
 /* Always pass the channel dname (display name) to this function <cybah>
  */
 static void update_idle(char *chname, char *nick)
@@ -335,17 +356,7 @@ void priority_do(struct chanset_t * chan, bool opsonly, int action)
   int ops = 0, targets = 0, bpos = 0, tpos = 0, ft = 0, ct = 0, actions = 0, sent = 0;
 
   for (m = chan->channel.member; m && m->nick[0]; m = m->next) {
-    if (!m->user && !m->tried_getuser) {
-      char s[256] = "";
-
-      simple_snprintf(s, sizeof(s), "%s!%s", m->nick, m->userhost);
-      m->user = get_user_by_host(s);
-      if (!m->user && m->userip[0]) {
-        simple_snprintf(s, sizeof(s), "%s!%s", m->nick, m->userip);
-        m->user = get_user_by_host(s);
-      }
-      m->tried_getuser = 1;
-    }
+    member_getuser(m);
 
     if (m->user && m->user->bot && (m->user->flags & USER_OP)) {
       ops++;
@@ -1389,7 +1400,6 @@ void recheck_channel(struct chanset_t *chan, int dobans)
     return;        		           /* ... it's better not to deop everybody */
 
   memberlist *m = NULL;
-  char s[UHOSTLEN] = "";
   struct flag_record fr = {FR_GLOBAL | FR_CHAN, 0, 0, 0 };
   int stop_reset = 0, botops = 0, nonbotops = 0, botnonops = 0;
 
@@ -1449,16 +1459,7 @@ void recheck_channel(struct chanset_t *chan, int dobans)
 
   //Check +d/+O/+k
   for (m = chan->channel.member; m && m->nick[0]; m = m->next) { 
-    simple_snprintf(s, sizeof(s), "%s!%s", m->nick, m->userhost);
-
-    if (!m->user && !m->tried_getuser) {
-           m->tried_getuser = 1;
-           m->user = get_user_by_host(s);
-           if (!m->user && m->userip[0]) {
-             simple_snprintf(s, sizeof(s), "%s!%s", m->nick, m->userip);
-             m->user = get_user_by_host(s);
-           }
-      }
+    member_getuser(m);
       get_user_flagrec(m->user, &fr, chan->dname, chan);
       //Already a bot opped, dont bother resetting masks
       if (glob_bot(fr) && chan_hasop(m) && !match_my_nick(m->nick))
@@ -3066,7 +3067,8 @@ static int gotquit(char *from, char *msg)
 
     m = ismember(chan, nick);
     if (m) {
-      u = m->user ? m->user : (m->tried_getuser == 0 ? get_user_by_host(from2) : NULL);
+      member_getuser(m);
+      u = m->user;
       if (u) {
         set_handle_laston(chan->dname, u, now); /* If you remove this, the bot will crash when the user record in question
 						   is removed/modified during the tcl binds below, and the users was on more

+ 11 - 33
src/mod/irc.mod/cmdsirc.c

@@ -1309,22 +1309,10 @@ static void cmd_find(int idx, char *par)
     if (!privchan(user, chan, PRIV_OP)) {
 
       for (m = chan->channel.member; m && m->nick[0]; m = m->next) {
+        member_getuser(m, 1);
         char s[UHOSTLEN] = "";
 
         simple_snprintf(s, sizeof(s), "%s!%s", m->nick, m->userhost);
-        if (!m->user && !m->tried_getuser) {
-          m->user = get_user_by_host(s);
-          if (!m->user && m->userip[0]) {
-            simple_snprintf(s, sizeof(s), "%s!%s", m->nick, m->userip);
-            m->user = get_user_by_host(s);
-          }
-
-          /* Managed to get the user for a previously unknown user. Act on it! */
-          if (m->user)
-            check_this_user(m->user->handle, 0, NULL);
-
-          m->tried_getuser = 1;
-        }
         if ((!lookup_user && wild_match(par, s)) || (lookup_user && m->user == u)) {
           fcount++;
           if (!found) {
@@ -1512,30 +1500,20 @@ static void cmd_channel(int idx, char *par)
 	  strftime(s, 6, "%H:%M", gmtime(&(m->joined)));
       } else
 	strlcpy(s, " --- ", sizeof s);
-      if (m->user == NULL) {
-	simple_snprintf(s1, sizeof s1, "%s!%s", m->nick, m->userhost);
-	m->user = get_user_by_host(s1);
-        if (!m->user && m->userip[0]) {
-          simple_snprintf(s1, sizeof(s1), "%s!%s", m->nick, m->userip);
-          m->user = get_user_by_host(s1);
-        }
 
-        if (!m->userip[0] && doresolv(chan)) {
-          char host[UHOSTLEN] = "", *p = NULL;
-          p = strchr(m->userhost, '@');
-          if (p) {
-            ++p;
-            strlcpy(host, p, strlen(m->userhost) - (p - host));
-            resolve_to_member(chan, m->nick, host);
-          }
+      // Force +r (re)processing
+      if (!m->userip[0] && doresolv(chan)) {
+        char host[UHOSTLEN] = "", *p = NULL;
+        p = strchr(m->userhost, '@');
+        if (p) {
+          ++p;
+          strlcpy(host, p, strlen(m->userhost) - (p - host));
+          resolve_to_member(chan, m->nick, host);
         }
+      }
 
-        /* Managed to get the user for a previously unknown user. Act on it! */
-        if (m->user)
-          check_this_user(m->user->handle, 0, NULL);
+      member_getuser(m, 1);
 
-        m->tried_getuser = 1;
-      }
       if (m->user == NULL)
 	strlcpy(handle, "*", sizeof handle);
        else

+ 3 - 19
src/mod/irc.mod/irc.c

@@ -641,11 +641,7 @@ getin_request(char *botnick, char *code, char *par)
       return;
     }
 
-    if (!mem->user && !mem->tried_getuser) {
-      simple_snprintf(uhost, sizeof(uhost), "%s!%s", nick, mem->userhost);
-      mem->user = get_user_by_host(uhost);
-      mem->tried_getuser = 1;
-    }
+    member_getuser(mem);
 
     if (mem->user != u) {
       putlog(LOG_GETIN, "*", "opreq from %s/%s on %s - user mismatch: (%s)/(%s)", botnick, nick, chan->dname, u ? u->handle : "*",  mem->user ? mem->user->handle : "*");
@@ -858,11 +854,7 @@ request_op(struct chanset_t *chan)
     if (!chan_hasop(ml) || chan_issplit(ml))
       continue;
 
-    if (!ml->user && !ml->tried_getuser) {
-      simple_snprintf(s, sizeof(s), "%s!%s", ml->nick, ml->userhost);
-      ml->user = get_user_by_host(s);
-      ml->tried_getuser = 1;
-    }
+    member_getuser(ml, 1);
 
     if (!ml->user || !ml->user->bot)
       continue;
@@ -1564,15 +1556,7 @@ check_expired_chanstuff(struct chanset_t *chan)
       if (me_op(chan)) {
         if (dovoice(chan) && !loading) {      /* autovoice of +v users if bot is +y */
           if (!chan_hasop(m) && !chan_hasvoice(m)) {
-            if (!m->user && !m->tried_getuser) {
-              simple_snprintf(s, sizeof(s), "%s!%s", m->nick, m->userhost);
-              m->user = get_user_by_host(s);
-              if (!m->user && m->userip[0]) {
-                simple_snprintf(s, sizeof(s), "%s!%s", m->nick, m->userip);
-                m->user = get_user_by_host(s);
-              }
-              m->tried_getuser = 1;
-            }
+            member_getuser(m, 1);
 
             if (m->user) {
               get_user_flagrec(m->user, &fr, chan->dname, chan);

+ 1 - 0
src/mod/irc.mod/irc.h

@@ -70,6 +70,7 @@ static bool me_voice(struct chanset_t *);
 static bool any_ops(struct chanset_t *);
 static char *getchanmode(struct chanset_t *);
 static void flush_mode(struct chanset_t *, int);
+static bool member_getuser(memberlist* m, bool act_on_lookup = 0);
 
 /* reset(bans|exempts|invites) are now just macros that call resetmasks
  * in order to reduce the code duplication. <cybah>

+ 3 - 17
src/mod/irc.mod/mode.c

@@ -151,12 +151,8 @@ flush_cookies(struct chanset_t *chan, int pri)
   if (post[0]) {
     memberlist* me = ismember(chan, botname);
 
-    if (me && !me->user && !me->tried_getuser) {
-      char uhost[UHOSTLEN] = "";
-      simple_snprintf(uhost, sizeof(uhost), "%s!%s", me->nick, me->userhost);
-      me->user = get_user_by_host(uhost);
-      me->tried_getuser = 1;
-    }
+    if (me)
+      member_getuser(me);
 
     /* Am I even on the channel? */
     if (!me || !me->user)
@@ -939,17 +935,7 @@ static memberlist *assert_ismember(struct chanset_t *chan, const char *nick)
   memberlist *m = ismember(chan, nick);
 
   if (m) {
-    if (!m->user) {
-      char s[UHOSTLEN] = "";
-
-      simple_snprintf(s, sizeof(s), "%s!%s", m->nick, m->userhost);
-      m->user = get_user_by_host(s);
-      if (!m->user && m->userip[0]) {
-        simple_snprintf(s, sizeof(s), "%s!%s", m->nick, m->userip);
-        m->user = get_user_by_host(s);
-      }
-      m->tried_getuser = 1;
-    }
+    member_getuser(m);
   } else {
     if (channel_pending(chan))
       return NULL;