using SimpleJSON; using System; using System.Collections; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Text.RegularExpressions; using System.Threading.Tasks; using UnityEngine; using UnityEngine.Networking; using Logger = IllusionInjector.Logging.Logger; namespace IllusionInjector.Updating.ModsaberML { class Updater : MonoBehaviour { public Updater instance; public void Awake() { instance = this; CheckForUpdates(); } public void CheckForUpdates() { StartCoroutine(CheckForUpdatesCoroutine()); } private Regex commentRegex = new Regex(@"(?: \/\/.+)?$", RegexOptions.Compiled | RegexOptions.Multiline); private Dictionary cachedRequests = new Dictionary(); IEnumerator CheckForUpdatesCoroutine() { Logger.log.Info("Checking for mod updates..."); var toUpdate = new List(); var modList = new List(); using (var request = UnityWebRequest.Get(ApiEndpoint.ApiBase+ApiEndpoint.GetApprovedEndpoint)) { yield return request.SendWebRequest(); if (request.isNetworkError) { Logger.log.Error("Network error while trying to update mods"); Logger.log.Error(request.error); yield break; } if (request.isHttpError) { Logger.log.Error($"Server returned an error code while trying to update mods"); Logger.log.Error(request.error); } var json = request.downloadHandler.text; JSONObject obj = null; try { obj = JSON.Parse(json).AsObject; } catch (InvalidCastException) { Logger.log.Error($"Parse error while trying to update mods"); Logger.log.Error($"Response doesn't seem to be a JSON object"); yield break; } catch (Exception e) { Logger.log.Error($"Parse error while trying to update mods"); Logger.log.Error(e); yield break; } foreach (var modObj in obj["mods"].AsArray.Children) { try { modList.Add(ApiEndpoint.Mod.DecodeJSON(modObj.AsObject)); } catch (Exception e) { Logger.log.Error($"Parse error while trying to update mods"); Logger.log.Error($"Response doesn't seem to be correctly formatted"); Logger.log.Error(e); break; } } } var GameVersion = new Version(Application.version); foreach (var plugin in PluginManager.BSMetas) { var info = plugin.ModsaberInfo; var modRegistry = modList.FirstOrDefault(o => o.Name == info.InternalName); if (modRegistry != null) { // a.k.a we found it Logger.log.Debug($"Found Modsaber.ML registration for {plugin.Plugin.Name} ({info.InternalName})"); Logger.log.Debug($"Installed version: {info.CurrentVersion}; Latest version: {modRegistry.Version}"); if (modRegistry.Version > info.CurrentVersion) { Logger.log.Debug($"{plugin.Plugin.Name} needs an update!"); if (modRegistry.GameVersion == GameVersion) { Logger.log.Debug($"Queueing update..."); toUpdate.Add(plugin); } else { Logger.log.Warn($"Update avaliable for {plugin.Plugin.Name}, but for a different Beat Saber version!"); } } } } Logger.log.Info($"{toUpdate.Count} mods need updating"); if (toUpdate.Count == 0) yield break; string tempDirectory = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName() + Path.GetRandomFileName()); Directory.CreateDirectory(tempDirectory); Logger.log.Debug($"Created temp download dirtectory {tempDirectory}"); foreach (var item in toUpdate) { StartCoroutine(DownloadPluginCoroutine(tempDirectory, item)); } } IEnumerator DownloadPluginCoroutine(string tempdir, PluginManager.BSPluginMeta item) { yield return null; /*var file = Path.Combine(tempdir, item. + ".dll"); using (var req = UnityWebRequest.Get(item.DownloadUri)) { req.downloadHandler = new DownloadHandlerFile(file); yield return req.SendWebRequest(); if (req.isNetworkError) { Logger.log.Error($"Network error while trying to download update for {item.Plugin.Plugin.Name}"); Logger.log.Error(req.error); yield break; } if (req.isHttpError) { Logger.log.Error($"Server returned an error code while trying to download update for {item.Plugin.Plugin.Name}"); Logger.log.Error(req.error); yield break; } } var pluginDir = Path.GetDirectoryName(item.Plugin.Filename); var newFile = Path.Combine(pluginDir, item.Name + ".dll"); File.Delete(item.Plugin.Filename); if (File.Exists(newFile)) File.Delete(newFile); File.Move(file, newFile); Logger.log.Info($"{item.Plugin.Plugin.Name} updated to {item.NewVersion}");*/ } } }