Jelajahi Sumber

* Use nicks_available() where appropriate. (Fixes jupenick not being grabbed on QUIT)

Bryan Drewery 16 tahun lalu
induk
melakukan
bcc6d515cc
3 mengubah file dengan 29 tambahan dan 33 penghapusan
  1. 2 6
      src/mod/irc.mod/chan.c
  2. 3 2
      src/mod/server.mod/server.h
  3. 24 25
      src/mod/server.mod/servmsg.c

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

@@ -3079,12 +3079,8 @@ static int gotquit(char *from, char *msg)
   }
   /* Our nick quit? if so, grab it.
    */
-  if (keepnick && !match_my_nick(nick)) {
-    if (!rfc_casecmp(nick, origbotname)) {
-      putlog(LOG_MISC, "*", "Switching back to nick %s", origbotname);
-      dprintf(DP_SERVER, "NICK %s\n", origbotname);
-    }
-  }
+  if (keepnick && !match_my_nick(nick))
+    nicks_available(nick);
 #ifdef CACHE
   /* see if they were in our cache at all */
   cache_t *cache = cache_find(nick);

+ 3 - 2
src/mod/server.mod/server.h

@@ -44,8 +44,6 @@ enum {
 	NETT_HYBRID_EFNET	= 4	/* new +e/+I Efnet hybrid.	  */
 };
 
-#endif		/* _EGG_MOD_SERVER_SERVER_H */
-
 extern bind_table_t	*BT_ctcp, *BT_ctcr, *BT_msgc;
 extern size_t		nick_len;
 extern bool		trigger_on_ignore, floodless, tried_jupenick, keepnick;
@@ -61,6 +59,7 @@ extern struct dcc_table SERVER_SOCKET;
 extern rate_t		flood_msg, flood_ctcp, flood_g;
 
 int check_bind_ctcpr(char *, char *, struct userrec *, char *, char *, char *, bind_table_t *);
+void nicks_available(char* buf, char delim = 0, bool buf_contains_available = 1);
 
 #define check_bind_ctcp(a, b, c, d, e, f) check_bind_ctcpr(a, b, c, d, e, f, BT_ctcp)
 #define check_bind_ctcr(a, b, c, d, e, f) check_bind_ctcpr(a, b, c, d, e, f, BT_ctcr)
@@ -80,3 +79,5 @@ void join_chans();
 void check_hostmask();
 void next_server(int *, char *, port_t *, char *);
 void server_send_ison();
+
+#endif		/* _EGG_MOD_SERVER_SERVER_H */

+ 24 - 25
src/mod/server.mod/servmsg.c

@@ -822,27 +822,27 @@ static int gotpong(char *from, char *msg)
   return 0;
 }
 
-static int nick_which(const char* nick, bool& ison_orig, bool& ison_jupe) {
+static int nick_which(const char* nick, bool& is_jupe, bool& is_orig) {
   if (jupenick[0] && !rfc_casecmp(nick, jupenick)) {
-    ison_jupe = 1;
+    is_jupe = 1;
     // If some stupid reason they have the same jupenick/nick, make sure to mark it as on
     if (!rfc_casecmp(nick, origbotname))
-      ison_orig = 1;
+      is_orig = 1;
     return 1;
   } else if (!rfc_casecmp(nick, origbotname)) {
-    ison_orig = 1;
+    is_orig = 1;
   }
   return 0;
 }
 
-static void nick_available(bool ison_orig, bool ison_jupe) {
-  if (jupenick[0] && !ison_jupe && rfc_casecmp(botname, jupenick)) {
+static void nick_available(bool is_jupe, bool is_orig) {
+  if (jupenick[0] && is_jupe && rfc_casecmp(botname, jupenick) && !match_my_nick((jupenick))) {
     if (!jnick_juped)
       putlog(LOG_MISC, "*", "Switching back to jupenick '%s'", jupenick);
     tried_jupenick = 1;
     dprintf(DP_SERVER, "NICK %s\n", jupenick);
     // Don't switch to the nick if already on jupenick
-  } else if (!ison_orig && rfc_casecmp(botname, origbotname) && (!jupenick[0] || !match_my_nick(jupenick))) {
+  } else if (is_orig && rfc_casecmp(botname, origbotname) && !match_my_nick(origbotname) && (!jupenick[0] || !match_my_nick(jupenick))) {
     if (!nick_juped)
       putlog(LOG_MISC, "*", "Switching back to nick '%s'", origbotname);
     altnick_char = rolls = 0;
@@ -850,22 +850,27 @@ static void nick_available(bool ison_orig, bool ison_jupe) {
   }
 }
 
-static void nicks_available(char* buf, char delim, bool buf_is_ison) {
-  if (!buf[0]) return;
-  bool ison_jupe = 0, ison_orig = 0;
+void nicks_available(char* buf, char delim, bool buf_contains_available) {
+  if (!buf[0] || !keepnick) return;
+  bool is_jupe = 0, is_orig = 0;
 
   char *nick = NULL;
-  while ((nick = newsplit(&buf, delim))[0]) {
-    if (nick_which(nick, ison_orig, ison_jupe))
-      break;
+  if (delim) {
+    while ((nick = newsplit(&buf, delim))[0]) {
+      if (nick_which(nick, is_jupe, is_orig))
+        break;
+    }
+  } else {
+    nick = buf;
+    nick_which(nick, is_jupe, is_orig);
   }
 
-  if (buf_is_ison == 0) {
-    ison_jupe = !ison_jupe;
-    ison_orig = !ison_orig;
+  if (buf_contains_available == 0) {
+    is_jupe = !is_jupe;
+    is_orig = !is_orig;
   }
 
-  nick_available(ison_orig, ison_jupe);
+  nick_available(is_jupe, is_orig);
 }
 
 /* This is a reply to MONITOR: Offline
@@ -874,30 +879,24 @@ static void nicks_available(char* buf, char delim, bool buf_is_ison) {
  */
 static void got731(char* from, char* msg)
 {
-  if (!keepnick)
-    return;
-
   char *tmp = newsplit(&msg);
   fixcolon(msg);
 
   //msg now contains the nick(s) available
   if (tmp[0] && (!strcmp(tmp, "*") || match_my_nick(tmp)))
-    nicks_available(msg, ',', 0);
+    nicks_available(msg, ',');
 }
 
 /* This is a reply on ISON :<orig> [<jupenick>]
 */
 static void got303(char *from, char *msg)
 {
-  if (!keepnick)
-    return;
-
   char *tmp = NULL;
 
   tmp = newsplit(&msg);
   fixcolon(msg);
   if (tmp[0] && match_my_nick(tmp))
-    nicks_available(tmp, ' ', 1);
+    nicks_available(tmp, ' ', 0);
 }
 
 /* 432 : Bad nickname (RESV)