Преглед на файлове

* Support RPL_MONOFFLINE (MONITOR response that nick is available)

Bryan Drewery преди 16 години
родител
ревизия
38dadd2a1b
променени са 1 файла, в които са добавени 71 реда и са изтрити 34 реда
  1. 71 34
      src/mod/server.mod/servmsg.c

+ 71 - 34
src/mod/server.mod/servmsg.c

@@ -822,8 +822,71 @@ static int gotpong(char *from, char *msg)
   return 0;
 }
 
-/* This is a reply on ISON :<orig> [<jupenick>]
+static int nick_which(const char* nick, bool& ison_orig, bool& ison_jupe) {
+  if (jupenick[0] && !rfc_casecmp(nick, jupenick)) {
+    ison_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;
+    return 1;
+  } else if (!rfc_casecmp(nick, origbotname)) {
+    ison_orig = 1;
+  }
+  return 0;
+}
+
+static void nick_available(bool ison_orig, bool ison_jupe) {
+  if (jupenick[0] && !ison_jupe && rfc_casecmp(botname, 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))) {
+    if (!nick_juped)
+      putlog(LOG_MISC, "*", "Switching back to nick '%s'", origbotname);
+    altnick_char = rolls = 0;
+    dprintf(DP_SERVER, "NICK %s\n", origbotname);
+  }
+}
+
+static void nicks_available(char* buf, char delim, bool buf_is_ison) {
+  if (!buf[0]) return;
+  bool ison_jupe = 0, ison_orig = 0;
+
+  char *nick = NULL;
+  while ((nick = newsplit(&buf, delim))[0]) {
+    if (nick_which(nick, ison_orig, ison_jupe))
+      break;
+  }
+
+  if (buf_is_ison == 0) {
+    ison_jupe = !ison_jupe;
+    ison_orig = !ison_orig;
+  }
+
+  nick_available(ison_orig, ison_jupe);
+}
+
+/* This is a reply to MONITOR: Offline
+ * RPL_MONOFFLINE
+ * :<server> 731 <nick> :nick[,nick1]*
  */
+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);
+}
+
+/* This is a reply on ISON :<orig> [<jupenick>]
+*/
 static void got303(char *from, char *msg)
 {
   if (!keepnick)
@@ -833,35 +896,8 @@ static void got303(char *from, char *msg)
 
   tmp = newsplit(&msg);
   fixcolon(msg);
-  if (tmp[0] && match_my_nick(tmp)) {
-    bool ison_jupe = 0, ison_orig = 0;
-
-    while ((tmp = newsplit(&msg))[0]) {
-      if (jupenick[0] && !rfc_casecmp(tmp, jupenick)) {
-        ison_jupe = 1;
-        // If some stupid reason they have the same jupenick/nick, make sure to mark it as on
-        if (!rfc_casecmp(tmp, origbotname)) {
-          ison_orig = 1;
-          break;
-        }
-      } else if (!rfc_casecmp(tmp, origbotname)) {
-        ison_orig = 1;
-      }
-    }
-
-    if (jupenick[0] && !ison_jupe && rfc_casecmp(botname, 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))) {
-      if (!nick_juped)
-        putlog(LOG_MISC, "*", "Switching back to nick %s", origbotname);
-      altnick_char = rolls = 0;
-      dprintf(DP_SERVER, "NICK %s\n", origbotname);
-    }
-  }
+  if (tmp[0] && match_my_nick(tmp))
+    nicks_available(tmp, ' ', 1);
 }
 
 /* 432 : Bad nickname (RESV)
@@ -1066,11 +1102,11 @@ static int gotnick(char *from, char *msg)
         putlog(LOG_SERV | LOG_MISC, "*", "Nickname changed to '%s'???", msg);
     
         if (jupenick[0] && !rfc_casecmp(nick, jupenick)) {
-          putlog(LOG_MISC, "*", "Switching back to jupenick %s", jupenick);
+          putlog(LOG_MISC, "*", "Switching back to jupenick '%s'", jupenick);
           tried_jupenick = 1;
           dprintf(DP_SERVER, "NICK %s\n", jupenick);
         } else if (!rfc_casecmp(nick, origbotname)) {
-          putlog(LOG_MISC, "*", "Switching back to nick %s", origbotname);
+          putlog(LOG_MISC, "*", "Switching back to nick '%s'", origbotname);
           dprintf(DP_SERVER, "NICK %s\n", origbotname);
           altnick_char = rolls = 0;
         }
@@ -1080,11 +1116,11 @@ static int gotnick(char *from, char *msg)
   } else if ((keepnick) && (rfc_casecmp(nick, msg))) { //Ignore case changes
     //Another client changed nick
     if (jupenick[0] && !rfc_casecmp(nick, jupenick)) {
-      putlog(LOG_MISC, "*", "Switching back to jupenick %s", jupenick);
+      putlog(LOG_MISC, "*", "Switching back to jupenick '%s'", jupenick);
       tried_jupenick = 1;
       dprintf(DP_SERVER, "NICK %s\n", jupenick);
     } else if (!rfc_casecmp(nick, origbotname)) {
-      putlog(LOG_MISC, "*", "Switching back to nick %s", origbotname);
+      putlog(LOG_MISC, "*", "Switching back to nick '%s'", origbotname);
       dprintf(DP_SERVER, "NICK %s\n", origbotname);
       altnick_char = rolls = 0;
     }
@@ -1622,6 +1658,7 @@ static cmd_t my_raw_binds[] =
   {"318",	"",	(Function) whoispenalty,	NULL, LEAF},	/* :End of /WHOIS */
   {"369",	"",	(Function) got369,		NULL, LEAF},	/* :End of /WHOWAS */
   {"718",	"",	(Function) got718,		NULL, LEAF},
+  {"731",	"",	(Function) got731,		NULL, LEAF},	/* RPL_MONOFFLINE */
   {NULL,	NULL,	NULL,				NULL, 0}
 };