diff --git a/VRCMelonAssistant/Classes/InstallHandlers.cs b/VRCMelonAssistant/Classes/InstallHandlers.cs index 6d781d3..d731ee8 100644 --- a/VRCMelonAssistant/Classes/InstallHandlers.cs +++ b/VRCMelonAssistant/Classes/InstallHandlers.cs @@ -80,7 +80,7 @@ namespace VRCMelonAssistant public static async Task InstallMod(Mod mod) { - string downloadLink = mod.versions[0].downloadlink; + string downloadLink = mod.versions[0].downloadLink; if (string.IsNullOrEmpty(downloadLink)) { @@ -90,22 +90,28 @@ namespace VRCMelonAssistant if (mod.installedFilePath != null) File.Delete(mod.installedFilePath); + - var modUri = new Uri(downloadLink); - var targetFilePath = Path.Combine(App.VRChatInstallDirectory, mod.versions[0].IsPlugin ? "Plugins" : "Mods", - mod.versions[0].IsBroken ? "Broken" : "", modUri.Segments.Last()); + string targetFilePath = ""; - Directory.CreateDirectory(Path.GetDirectoryName(targetFilePath)); - - using (Stream stream = await DownloadFileToMemory(downloadLink)) + using (var resp = await Http.HttpClient.GetAsync(downloadLink)) { + var stream = new MemoryStream(); + await resp.Content.CopyToAsync(stream); + stream.Position = 0; + + targetFilePath = Path.Combine(App.VRChatInstallDirectory, mod.versions[0].IsPlugin ? "Plugins" : "Mods", + mod.versions[0].IsBroken ? "Broken" : (mod.versions[0].IsRetired ? "Retired" : ""), resp.RequestMessage.RequestUri.Segments.Last()); + + Directory.CreateDirectory(Path.GetDirectoryName(targetFilePath)); + using var targetFile = File.OpenWrite(targetFilePath); await stream.CopyToAsync(targetFile); } - + mod.ListItem.IsInstalled = true; mod.installedFilePath = targetFilePath; - mod.ListItem.InstalledVersion = mod.versions[0].modversion; + mod.ListItem.InstalledVersion = mod.versions[0].modVersion; mod.ListItem.InstalledModInfo = mod; } } diff --git a/VRCMelonAssistant/Classes/Mod.cs b/VRCMelonAssistant/Classes/Mod.cs index 81698f5..45e077e 100644 --- a/VRCMelonAssistant/Classes/Mod.cs +++ b/VRCMelonAssistant/Classes/Mod.cs @@ -7,7 +7,7 @@ namespace VRCMelonAssistant public class Mod { public int _id; - public string uploaddate; + public string uploadDate; public string category; public string[] aliases; public ModVersion[] versions; @@ -15,25 +15,27 @@ namespace VRCMelonAssistant public string installedFilePath; public string installedVersion; public bool installedInBrokenDir; + public bool installedInRetiredDir; public class ModVersion { public int _version; public string name; - public string modversion; - public string modtype; + public string modVersion; + public string modType; public string author; public string description; - public string downloadlink; - public string sourcelink; + public string downloadLink; + public string sourceLink; public string hash; - public string updatedate; - public string vrchatversion; - public string loaderversion; + public string updateDate; + public string vrchatVersion; + public string loaderVersion; public int approvalStatus; public bool IsBroken => approvalStatus == 2; - public bool IsPlugin => modtype.Equals("plugin", StringComparison.InvariantCultureIgnoreCase); + public bool IsRetired => approvalStatus == 3; + public bool IsPlugin => modType.Equals("plugin", StringComparison.InvariantCultureIgnoreCase); } } } diff --git a/VRCMelonAssistant/Classes/Utils.cs b/VRCMelonAssistant/Classes/Utils.cs index 2838d68..d3cdcf6 100644 --- a/VRCMelonAssistant/Classes/Utils.cs +++ b/VRCMelonAssistant/Classes/Utils.cs @@ -25,7 +25,7 @@ namespace VRCMelonAssistant public class Constants { public const string VRChatAppId = "438100"; - public const string VRCMGModsJson = "https://api.vrcmg.com/v0/mods.json"; + public const string VRCMGModsJson = "https://api.vrcmg.com/v1/mods"; public const string WeebCDNAPIURL = "https://pat.assistant.moe/api/v1.0/"; public const string MD5Spacer = " "; public static readonly char[] IllegalCharacters = new char[] diff --git a/VRCMelonAssistant/MainWindow.xaml.cs b/VRCMelonAssistant/MainWindow.xaml.cs index 0c6ac69..5d1dcef 100644 --- a/VRCMelonAssistant/MainWindow.xaml.cs +++ b/VRCMelonAssistant/MainWindow.xaml.cs @@ -103,7 +103,7 @@ namespace VRCMelonAssistant InstallButton.IsEnabled = false; } - private async Task ShowModsPage() + public async Task ShowModsPage() { void OpenModsPage() { diff --git a/VRCMelonAssistant/ModInfoWindow.xaml.cs b/VRCMelonAssistant/ModInfoWindow.xaml.cs index a25f71a..a76a37e 100644 --- a/VRCMelonAssistant/ModInfoWindow.xaml.cs +++ b/VRCMelonAssistant/ModInfoWindow.xaml.cs @@ -18,9 +18,9 @@ namespace VRCMelonAssistant ModDescription.Text = mod.versions[0].description ?? (string) FindResource("ModInfoWindow:NoDescription"); ModName.Text = mod.versions[0].name; ModAuthor.Text = string.Format((string) FindResource("ModInfoWindow:Author"), mod.versions[0].author ?? FindResource("ModInfoWindow:NoAuthor")); - ModVersion.Text = mod.versions[0].modversion; + ModVersion.Text = mod.versions[0].modVersion; - var dlLink = mod.versions[0].downloadlink; + var dlLink = mod.versions[0].downloadLink; DownloadLink.Text = (string) FindResource("ModInfoWindow:DownloadLink"); DownloadLink.Inlines.Add(new Run(" ")); if (dlLink?.StartsWith("http") == true) @@ -28,7 +28,7 @@ namespace VRCMelonAssistant else DownloadLink.Inlines.Add(new Run(dlLink)); - var srcLink = mod.versions[0].sourcelink; + var srcLink = mod.versions[0].sourceLink; SourceCodeLink.Text = (string) FindResource("ModInfoWindow:SourceCodeLink"); SourceCodeLink.Inlines.Add(new Run(" ")); if (srcLink?.StartsWith("http") == true) diff --git a/VRCMelonAssistant/Pages/Intro.xaml.cs b/VRCMelonAssistant/Pages/Intro.xaml.cs index 335f43c..ccec46c 100644 --- a/VRCMelonAssistant/Pages/Intro.xaml.cs +++ b/VRCMelonAssistant/Pages/Intro.xaml.cs @@ -37,10 +37,11 @@ namespace VRCMelonAssistant.Pages MainWindow.Instance.ModsButton.IsEnabled = true; string text = (string) FindResource("Intro:ModsTabEnabled"); - Utils.SendNotify(text); MainWindow.Instance.MainText = text; Properties.Settings.Default.Agreed = true; Properties.Settings.Default.Save(); + + MainWindow.Instance.ShowModsPage().NoAwait(); } } } diff --git a/VRCMelonAssistant/Pages/Mods.xaml b/VRCMelonAssistant/Pages/Mods.xaml index e87e618..ddee88e 100644 --- a/VRCMelonAssistant/Pages/Mods.xaml +++ b/VRCMelonAssistant/Pages/Mods.xaml @@ -28,7 +28,7 @@ { - CheckInstallDir("Plugins", false); - CheckInstallDir("Mods", false); - CheckInstallDir("Plugins/Broken", true); - CheckInstallDir("Mods/Broken", true); + CheckInstallDir("Plugins"); + CheckInstallDir("Mods"); + CheckInstallDir("Plugins/Broken", isBrokenDir: true); + CheckInstallDir("Mods/Broken", isBrokenDir: true); + CheckInstallDir("Plugins/Retired", isRetiredDir: true); + CheckInstallDir("Mods/Retired", isRetiredDir: true); }); } @@ -168,7 +171,7 @@ namespace VRCMelonAssistant.Pages } } - private void CheckInstallDir(string directory, bool isBrokenDir) + private void CheckInstallDir(string directory, bool isBrokenDir = false, bool isRetiredDir = false) { if (!Directory.Exists(Path.Combine(App.VRChatInstallDirectory, directory))) { @@ -193,6 +196,7 @@ namespace VRCMelonAssistant.Pages mod.installedFilePath = file; mod.installedVersion = modInfo.ModVersion; mod.installedInBrokenDir = isBrokenDir; + mod.installedInRetiredDir = isRetiredDir; break; } @@ -203,12 +207,13 @@ namespace VRCMelonAssistant.Pages installedFilePath = file, installedVersion = modInfo.ModVersion, installedInBrokenDir = isBrokenDir, + installedInRetiredDir = isRetiredDir, versions = new [] { new Mod.ModVersion() { name = modInfo.ModName, - modversion = modInfo.ModVersion, + modVersion = modInfo.ModVersion, author = modInfo.ModAuthor, description = "" } @@ -255,11 +260,17 @@ namespace VRCMelonAssistant.Pages public async Task PopulateModsList() { - foreach (Mod mod in AllModsList) + foreach (Mod mod in AllModsList.Where(x => !x.versions[0].IsBroken && !x.versions[0].IsRetired)) AddModToList(mod); foreach (var mod in UnknownMods) AddModToList(mod, UnknownCategory); + + foreach (Mod mod in AllModsList.Where(x => x.versions[0].IsBroken)) + AddModToList(mod); + + foreach (Mod mod in AllModsList.Where(x => x.versions[0].IsRetired)) + AddModToList(mod); } private void AddModToList(Mod mod, ModListItem.CategoryInfo categoryOverride = null) @@ -285,14 +296,14 @@ namespace VRCMelonAssistant.Pages IsSelected = preSelected, IsEnabled = true, ModName = latestVersion.name, - ModVersion = latestVersion.modversion, + ModVersion = latestVersion.modVersion, ModAuthor = HardcodedCategories.FixupAuthor(latestVersion.author), ModDescription = latestVersion.description.Replace("\r\n", " ").Replace("\n", " "), ModInfo = mod, IsInstalled = mod.installedFilePath != null, InstalledVersion = mod.installedVersion, InstalledModInfo = mod, - Category = categoryOverride ?? (latestVersion.IsBroken ? BrokenCategory : GetCategory(mod)) + Category = categoryOverride ?? (latestVersion.IsBroken ? BrokenCategory : (latestVersion.IsRetired ? RetiredCategory : GetCategory(mod))) }; foreach (Promotion promo in Promotions.ActivePromotions) @@ -319,7 +330,7 @@ namespace VRCMelonAssistant.Pages foreach (Mod mod in AllModsList) { // Ignore mods that are newer than installed version or up-to-date - if (mod.ListItem.GetVersionComparison >= 0 && mod.installedInBrokenDir == mod.versions[0].IsBroken) continue; + if (mod.ListItem.GetVersionComparison >= 0 && mod.installedInBrokenDir == mod.versions[0].IsBroken && mod.installedInRetiredDir == mod.versions[0].IsRetired) continue; if (mod.ListItem.IsSelected) { @@ -506,14 +517,14 @@ namespace VRCMelonAssistant.Pages if (SearchBar.Height == 0) { SearchBar.Focus(); - Animate(SearchBar, 0, 16, new TimeSpan(0, 0, 0, 0, 300)); - Animate(SearchText, 0, 16, new TimeSpan(0, 0, 0, 0, 300)); + Animate(SearchBar, 0, 20, new TimeSpan(0, 0, 0, 0, 300)); + Animate(SearchText, 0, 20, new TimeSpan(0, 0, 0, 0, 300)); ModsListView.Items.Filter = new Predicate(SearchFilter); } else { - Animate(SearchBar, 16, 0, new TimeSpan(0, 0, 0, 0, 300)); - Animate(SearchText, 16, 0, new TimeSpan(0, 0, 0, 0, 300)); + Animate(SearchBar, 20, 0, new TimeSpan(0, 0, 0, 0, 300)); + Animate(SearchText, 20, 0, new TimeSpan(0, 0, 0, 0, 300)); ModsListView.Items.Filter = null; } } diff --git a/VRCMelonAssistant/Properties/AssemblyInfo.cs b/VRCMelonAssistant/Properties/AssemblyInfo.cs index d39e11d..30451c4 100644 --- a/VRCMelonAssistant/Properties/AssemblyInfo.cs +++ b/VRCMelonAssistant/Properties/AssemblyInfo.cs @@ -51,5 +51,5 @@ using System.Windows; // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.1.23.1029")] -[assembly: AssemblyFileVersion("1.1.23.1029+vrc")] +[assembly: AssemblyVersion("1.1.26.1029")] +[assembly: AssemblyFileVersion("1.1.26.1029+vrc")]