void updateFreeNodeChecker_NewFreeNodeFound(object sender, EventArgs e) { int count = 0; if (!String.IsNullOrEmpty(updateFreeNodeChecker.FreeNodeResult)) { List <string> urls = new List <string>(); //MessageBox.Show(updateFreeNodeChecker.FreeNodeResult); updateFreeNodeChecker.FreeNodeResult = updateFreeNodeChecker.FreeNodeResult.TrimEnd('\r', '\n', ' '); Configuration config = controller.GetCurrentConfiguration(); Server selected_server = null; if (config.index >= 0 && config.index < config.configs.Count) { selected_server = config.configs[config.index]; } try { updateFreeNodeChecker.FreeNodeResult = Util.Base64.DecodeBase64(updateFreeNodeChecker.FreeNodeResult); } catch { updateFreeNodeChecker.FreeNodeResult = ""; } int max_node_num = 0; //MessageBox.Show(updateFreeNodeChecker.FreeNodeResult); Match match_maxnum = Regex.Match(updateFreeNodeChecker.FreeNodeResult, "^MAX=([0-9]+)"); if (match_maxnum.Success) { try { max_node_num = Convert.ToInt32(match_maxnum.Groups[1].Value, 10); } catch { } } Utils.URL_Split(updateFreeNodeChecker.FreeNodeResult, ref urls); for (int i = urls.Count - 1; i >= 0; --i) { if (!urls[i].StartsWith("ssr")) { urls.RemoveAt(i); } } if (urls.Count > 0) { bool keep_selected_server = false; // set 'false' if import all nodes if (max_node_num <= 0 || max_node_num >= urls.Count) { urls.Reverse(); } else { Random r = new Random(); Util.Utils.Shuffle(urls, r); urls.RemoveRange(max_node_num, urls.Count - max_node_num); if (!config.isDefaultConfig()) { keep_selected_server = true; } } string lastGroup = null; string curGroup = null; foreach (string url in urls) { try // try get group name { Server server = new Server(url, null); if (!String.IsNullOrEmpty(server.group)) { curGroup = server.group; break; } } catch { } } string subscribeURL = updateSubscribeManager.URL; if (String.IsNullOrEmpty(curGroup)) { curGroup = subscribeURL; } for (int i = 0; i < config.serverSubscribes.Count; ++i) { if (subscribeURL == config.serverSubscribes[i].URL) { lastGroup = config.serverSubscribes[i].Group; config.serverSubscribes[i].Group = curGroup; break; } } if (lastGroup == null) { lastGroup = curGroup; } if (keep_selected_server && selected_server.group == curGroup) { bool match = false; for (int i = 0; i < urls.Count; ++i) { try { Server server = new Server(urls[i], null); if (selected_server.isMatchServer(server)) { match = true; break; } } catch { } } if (!match) { urls.RemoveAt(0); urls.Add(selected_server.GetSSRLinkForServer()); } } // import all, find difference { Dictionary <string, Server> old_servers = new Dictionary <string, Server>(); if (!String.IsNullOrEmpty(lastGroup)) { for (int i = config.configs.Count - 1; i >= 0; --i) { if (lastGroup == config.configs[i].group) { old_servers[config.configs[i].id] = config.configs[i]; } } } foreach (string url in urls) { try { Server server = new Server(url, curGroup); bool match = false; foreach (KeyValuePair <string, Server> pair in old_servers) { if (server.isMatchServer(pair.Value)) { match = true; old_servers.Remove(pair.Key); pair.Value.CopyServerInfo(server); ++count; break; } } if (!match) { config.configs.Add(server); ++count; } } catch { } } foreach (KeyValuePair <string, Server> pair in old_servers) { for (int i = config.configs.Count - 1; i >= 0; --i) { if (config.configs[i].id == pair.Key) { config.configs.RemoveAt(i); break; } } } controller.SaveServersConfig(config); } config = controller.GetCurrentConfiguration(); if (selected_server != null) { bool match = false; for (int i = config.configs.Count - 1; i >= 0; --i) { if (config.configs[i].id == selected_server.id) { config.index = i; match = true; break; } else if (config.configs[i].group == selected_server.group) { if (config.configs[i].isMatchServer(selected_server)) { config.index = i; match = true; break; } } } if (!match) { config.index = config.configs.Count - 1; } } else { config.index = config.configs.Count - 1; } controller.SaveServersConfig(config); } } if (count > 0) { ShowBalloonTip(I18N.GetString("Success"), I18N.GetString("Update subscribe SSR node success"), ToolTipIcon.Info, 10000); } else { ShowBalloonTip(I18N.GetString("Error"), I18N.GetString("Update subscribe SSR node failure"), ToolTipIcon.Info, 10000); } if (updateSubscribeManager.Next()) { } }