void GetServerContent() { try { if (serverContent == null) { WebClient web = new WebClient(); #if DEBUG web.Headers.Add("user-agent", $"MOP/{MOP.ModVersion}_DEBUG {ExceptionManager.GetSystemInfo()}"); #else web.Headers.Add("user-agent", $"MOP/{MOP.ModVersion} {ExceptionManager.GetSystemInfo()}"); #endif string[] serverContentArray = web.DownloadString(new Uri($"{RemoteServer}{ServerContent}")).Split('\n'); serverContent = new List <ServerContentData>(); for (int i = 0; i < serverContentArray.Length; i++) { serverContent.Add(new ServerContentData(serverContentArray[i])); } web.Dispose(); } } catch (Exception ex) { ExceptionManager.New(ex, "SERVER_CONTENT_DOWNLOAD_ERROR"); } }
IEnumerator DownloadAndUpdateRoutine() { string lastModList = File.Exists(lastModListPath) ? File.ReadAllText(lastModListPath) : ""; Mod[] mods = ModLoader.LoadedMods.Where(m => !m.ID.ContainsAny("MSCLoader_", "MOP")).ToArray(); string modListString = ""; ModConsole.Print("[MOP] Checking for new mods..."); bool isUpdateTime = !File.Exists(lastDateFilePath) || IsUpdateTime(); if (isUpdateTime) { ModConsole.Print("[MOP] Looking for updates..."); } foreach (Mod mod in mods) { string modId = mod.ID; modListString += $"{modId}\n"; string ruleUrl = $"{RemoteServer}{modId}.mopconfig"; string filePath = $"{MOP.ModConfigPath}/{modId}.mopconfig"; // Prevent downloading, if file is on the server. if (lastModList.Contains(mod.ID) && !isUpdateTime) { continue; } // Check if rule file for mod is on the server. // If not, continue. if (!IsFileOnServer(modId)) { continue; } // Check if the newer file is available on the server. if (!overrideUpdateCheck) { if (serverContent == null) { GetServerContent(); } DateTime lastLocalFileWrite = GetFileWriteTime(filePath); ServerContentData data = serverContent.First(t => t.ID == modId); DateTime lastRemoteFileWrite = data.UpdateTime; if (lastRemoteFileWrite <= lastLocalFileWrite) { ModConsole.Print($"<color=orange>[MOP] Skipping {modId}, because local file and remote file are the same.</color>"); continue; } } // Check if file actually exists on remote server. if (!RemoteFileExists(ruleUrl)) { ModConsole.Error($"[MOP] Rule file for mod doesn't exist!\nID: {modId}\nURL: {ruleUrl}"); continue; } fileDownloadCompleted = false; using (WebClient web = new WebClient()) { ModConsole.Print($"<color=yellow>[MOP] Downloading new rule file for {mod.Name}...</color>"); NewMessage($"MOP: Downloading new rule file for {mod.Name}..."); #if DEBUG web.Headers.Add("user-agent", $"MOP/{MOP.ModVersion}_DEBUG {ExceptionManager.GetSystemInfo()}"); #else web.Headers.Add("user-agent", $"MOP/{MOP.ModVersion} {ExceptionManager.GetSystemInfo()}"); #endif if (File.Exists(filePath)) { File.Delete(filePath); } web.DownloadFileCompleted += DownloadFileCompleted; web.DownloadFileAsync(new Uri(ruleUrl), filePath); int waitTime = 0; while (!fileDownloadCompleted) { yield return(new WaitForSeconds(.5f)); waitTime++; // If wait time is longer than 30 seconds, abandon downloading. if (waitTime > 60) { ModConsole.Error("[MOP] Downloading failed. Skipping downloading."); NewMessage("MOP: Downloading failed. Skipping downloading."); GetAndReadRules(); yield break; } } web.Dispose(); } ModConsole.Print("<color=green>[MOP] Downloading completed!</color>"); } File.WriteAllText(lastModListPath, modListString); if (isUpdateTime) { File.WriteAllText(lastDateFilePath, DateTime.Now.ToString()); } // File downloading and updating completed! // Start reading those files. GetAndReadRules(); }