ソースを参照

Merge branch 'change-server-keeps-old' into next

* change-server-keeps-old:
  * Update server list after .set as well, but don't autojump
  * Updates to which server name is displayed, and tracking properly for auto-jumping
  * Fix server jumping when it doesn't match dns (irc.sucks.net vs irc.servercentral.net)
Bryan Drewery 16 年 前
コミット
927bda498d
6 ファイル変更24 行追加11 行削除
  1. 16 6
      src/chanprog.c
  2. 1 1
      src/chanprog.h
  3. 4 1
      src/misc.c
  4. 1 1
      src/mod/server.mod/server.c
  5. 1 1
      src/mod/server.mod/server.h
  6. 1 1
      src/set.c

+ 16 - 6
src/chanprog.c

@@ -980,27 +980,37 @@ void notice(const char* target, const char* msg, int idx) {
 }
 
 
-void check_removed_server() {
+void check_removed_server(bool jump_no_match) {
   if (server_online) {
     bool found_server = 0;
 
     for (struct server_list *n = serverlist; n; n = n->next) {
+      // Check if server list contains a match to the 'real server name' we're connected to
+      // ie, irc.sucks.net -> irc.servercentral.net (expected (dcc) -> real (cursrvname))
       if (((n->port && n->port == curservport) || (!n->port && default_port == curservport)) &&
           !strcmp(n->name, cursrvname)) {
         found_server = 1;
         break;
+        // Check if server list contains a match to the 'expected server name' we're connected to
+        // ie, irc.sucks.net -> irc.servercentral.net (expected (dcc) -> real (cursrvname))
+      } else if (servidx != -1 && ((n->port && n->port == dcc[servidx].port) || (!n->port && default_port == dcc[servidx].port)) &&
+          !strcmp(n->name, dcc[servidx].host)) {
+        found_server = 2;
+        break;
       }
     }
 
     if (!found_server) {
-      // Current server not found in new list, jump!
-      putlog(LOG_SERV, "*", "Server removed from list, jumping!");
-      nuke_server("server removed");
-      cycle_time = 0;
+      if (jump_no_match) {
+        // Current server not found in new list, jump!
+        putlog(LOG_SERV, "*", "Server removed from list, jumping!");
+        nuke_server("server removed");
+        cycle_time = 0;
+      }
     } else {
       // Update current server in list.
       curserv = -1;
-      next_server(&curserv, cursrvname, &curservport, NULL);
+      next_server(&curserv, found_server == 1 ? cursrvname : dcc[servidx].host, &curservport, NULL);
     }
   }
 }

+ 1 - 1
src/chanprog.h

@@ -34,7 +34,7 @@ void load_internal_users();
 void setup_HQ(int);
 void privmsg(const char* target, const char* msg, int idx);
 void notice(const char* target, const char* msg, int idx);
-void check_removed_server();
+void check_removed_server(bool = 1);
 
 extern struct chanset_t		*chanset, *chanset_default;
 extern char			admin[], origbotnick[HANDLEN + 1], origbotname[NICKLEN], jupenick[NICKLEN], botname[NICKLEN], *def_chanset;

+ 4 - 1
src/misc.c

@@ -652,6 +652,8 @@ readsocks(const char *fname)
       online_since = strtol(str.c_str(), NULL, 10);
     else if (type == STR("+server_online"))
       server_online = strtol(str.c_str(), NULL, 10);
+    else if (type == STR("+cursrvname"))
+      strlcpy(cursrvname, str.c_str(), sizeof(cursrvname));
     else if (type == STR("+server_floodless"))
       floodless = 1;
     else if (type == STR("+in_deaf"))
@@ -726,7 +728,7 @@ readsocks(const char *fname)
       keepnick = 0; /* Wait to change nicks until relinking, fixes nick/jupenick switching issues during restart */
       reset_flood();
       if (!server_online) server_online = now;
-      rehash_server(dcc[servidx].host, nick);
+      rehash_server(cursrvname[0] ? cursrvname : dcc[servidx].host, nick);
       if (cached_005)
         replay_cache(servidx, NULL);
       else
@@ -800,6 +802,7 @@ restart(int idx)
     if (my_cookie_counter)
       stream << buf.printf(STR("+my_cookie_counter %lu\n"), my_cookie_counter);
     stream << buf.printf(STR("+server_online %li\n"), server_online);
+    stream << buf.printf(STR("+cursrvname %s\n"), cursrvname);
   }
   stream << buf.printf(STR("+online_since %li\n"), online_since);
   if (floodless)

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

@@ -1123,7 +1123,7 @@ void server_report(int idx, int details)
     }
   }
   if ((trying_server || server_online) && (servidx != (-1))) {
-    dprintf(idx, "    Server %s:%d %s\n", dcc[servidx].host, dcc[servidx].port,
+    dprintf(idx, "    Server %s:%d %s\n", cursrvname, dcc[servidx].port,
 	    trying_server ? "(trying)" : s);
   } else
     dprintf(idx, "    No server currently.\n");

+ 1 - 1
src/mod/server.mod/server.h

@@ -53,7 +53,7 @@ extern unsigned int     rolls;
 extern port_t		default_port, newserverport, curservport;
 extern time_t		server_online, tried_jupenick, tried_nick, release_time, connect_bursting;
 extern interval_t	cycle_time;
-extern char		cursrvname[], botrealname[121], botuserhost[], ctcp_reply[1024],
+extern char		cursrvname[120], botrealname[121], botuserhost[], ctcp_reply[1024],
 			newserver[], newserverpass[], curnetwork[], botuserip[], altnick_char, deaf_char, callerid_char;
 extern struct server_list *serverlist;
 extern struct dcc_table SERVER_SOCKET;

+ 1 - 1
src/set.c

@@ -391,7 +391,7 @@ sdprintf("var (mem): %s -> %s", var->name, datain ? datain : "(NULL)");
     if (data)
       add_server(data);
 
-    curserv = 999; /* Will get updated after userfile is loaded */
+    check_removed_server(0);
   }
 
   if (datap)