Merge pull request #23 from DubyaDude/master

Move to api/v1 + additional QOL changes
This commit is contained in:
Nikolay Kuznetsov 2022-06-16 20:37:22 +02:00 committed by GitHub
commit f905428238
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
9 changed files with 62 additions and 42 deletions

View file

@ -80,7 +80,7 @@ namespace VRCMelonAssistant
public static async Task InstallMod(Mod mod) public static async Task InstallMod(Mod mod)
{ {
string downloadLink = mod.versions[0].downloadlink; string downloadLink = mod.versions[0].downloadLink;
if (string.IsNullOrEmpty(downloadLink)) if (string.IsNullOrEmpty(downloadLink))
{ {
@ -90,22 +90,28 @@ namespace VRCMelonAssistant
if (mod.installedFilePath != null) if (mod.installedFilePath != null)
File.Delete(mod.installedFilePath); File.Delete(mod.installedFilePath);
var modUri = new Uri(downloadLink); string targetFilePath = "";
var targetFilePath = Path.Combine(App.VRChatInstallDirectory, mod.versions[0].IsPlugin ? "Plugins" : "Mods",
mod.versions[0].IsBroken ? "Broken" : "", modUri.Segments.Last());
Directory.CreateDirectory(Path.GetDirectoryName(targetFilePath)); using (var resp = await Http.HttpClient.GetAsync(downloadLink))
using (Stream stream = await DownloadFileToMemory(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); using var targetFile = File.OpenWrite(targetFilePath);
await stream.CopyToAsync(targetFile); await stream.CopyToAsync(targetFile);
} }
mod.ListItem.IsInstalled = true; mod.ListItem.IsInstalled = true;
mod.installedFilePath = targetFilePath; mod.installedFilePath = targetFilePath;
mod.ListItem.InstalledVersion = mod.versions[0].modversion; mod.ListItem.InstalledVersion = mod.versions[0].modVersion;
mod.ListItem.InstalledModInfo = mod; mod.ListItem.InstalledModInfo = mod;
} }
} }

View file

@ -7,7 +7,7 @@ namespace VRCMelonAssistant
public class Mod public class Mod
{ {
public int _id; public int _id;
public string uploaddate; public string uploadDate;
public string category; public string category;
public string[] aliases; public string[] aliases;
public ModVersion[] versions; public ModVersion[] versions;
@ -15,25 +15,27 @@ namespace VRCMelonAssistant
public string installedFilePath; public string installedFilePath;
public string installedVersion; public string installedVersion;
public bool installedInBrokenDir; public bool installedInBrokenDir;
public bool installedInRetiredDir;
public class ModVersion public class ModVersion
{ {
public int _version; public int _version;
public string name; public string name;
public string modversion; public string modVersion;
public string modtype; public string modType;
public string author; public string author;
public string description; public string description;
public string downloadlink; public string downloadLink;
public string sourcelink; public string sourceLink;
public string hash; public string hash;
public string updatedate; public string updateDate;
public string vrchatversion; public string vrchatVersion;
public string loaderversion; public string loaderVersion;
public int approvalStatus; public int approvalStatus;
public bool IsBroken => approvalStatus == 2; 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);
} }
} }
} }

View file

@ -25,7 +25,7 @@ namespace VRCMelonAssistant
public class Constants public class Constants
{ {
public const string VRChatAppId = "438100"; 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 WeebCDNAPIURL = "https://pat.assistant.moe/api/v1.0/";
public const string MD5Spacer = " "; public const string MD5Spacer = " ";
public static readonly char[] IllegalCharacters = new char[] public static readonly char[] IllegalCharacters = new char[]

View file

@ -103,7 +103,7 @@ namespace VRCMelonAssistant
InstallButton.IsEnabled = false; InstallButton.IsEnabled = false;
} }
private async Task ShowModsPage() public async Task ShowModsPage()
{ {
void OpenModsPage() void OpenModsPage()
{ {

View file

@ -18,9 +18,9 @@ namespace VRCMelonAssistant
ModDescription.Text = mod.versions[0].description ?? (string) FindResource("ModInfoWindow:NoDescription"); ModDescription.Text = mod.versions[0].description ?? (string) FindResource("ModInfoWindow:NoDescription");
ModName.Text = mod.versions[0].name; ModName.Text = mod.versions[0].name;
ModAuthor.Text = string.Format((string) FindResource("ModInfoWindow:Author"), mod.versions[0].author ?? FindResource("ModInfoWindow:NoAuthor")); 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.Text = (string) FindResource("ModInfoWindow:DownloadLink");
DownloadLink.Inlines.Add(new Run(" ")); DownloadLink.Inlines.Add(new Run(" "));
if (dlLink?.StartsWith("http") == true) if (dlLink?.StartsWith("http") == true)
@ -28,7 +28,7 @@ namespace VRCMelonAssistant
else else
DownloadLink.Inlines.Add(new Run(dlLink)); 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.Text = (string) FindResource("ModInfoWindow:SourceCodeLink");
SourceCodeLink.Inlines.Add(new Run(" ")); SourceCodeLink.Inlines.Add(new Run(" "));
if (srcLink?.StartsWith("http") == true) if (srcLink?.StartsWith("http") == true)

View file

@ -37,10 +37,11 @@ namespace VRCMelonAssistant.Pages
MainWindow.Instance.ModsButton.IsEnabled = true; MainWindow.Instance.ModsButton.IsEnabled = true;
string text = (string) FindResource("Intro:ModsTabEnabled"); string text = (string) FindResource("Intro:ModsTabEnabled");
Utils.SendNotify(text);
MainWindow.Instance.MainText = text; MainWindow.Instance.MainText = text;
Properties.Settings.Default.Agreed = true; Properties.Settings.Default.Agreed = true;
Properties.Settings.Default.Save(); Properties.Settings.Default.Save();
MainWindow.Instance.ShowModsPage().NoAwait();
} }
} }
} }

View file

@ -28,7 +28,7 @@
<TextBlock <TextBlock
Name="SearchText" Name="SearchText"
Grid.Row="0" Grid.Row="0"
Height="0" Height="20"
Padding="5,0,0,0" Padding="5,0,0,0"
Panel.ZIndex="1" Panel.ZIndex="1"
Background="{DynamicResource BottomStatusBarBackground}" Background="{DynamicResource BottomStatusBarBackground}"
@ -37,7 +37,7 @@
<TextBox <TextBox
Name="SearchBar" Name="SearchBar"
Grid.Row="0" Grid.Row="0"
Height="0" Height="20"
Margin="0,-1,0,0" Margin="0,-1,0,0"
Padding="3,1,0,0" Padding="3,1,0,0"
Panel.ZIndex="2" Panel.ZIndex="2"

View file

@ -31,6 +31,7 @@ namespace VRCMelonAssistant.Pages
public static Mods Instance = new Mods(); public static Mods Instance = new Mods();
private static readonly ModListItem.CategoryInfo BrokenCategory = new("Broken", "These mods were broken by a game update. They will be temporarily removed and restored once they are updated for the current game version"); private static readonly ModListItem.CategoryInfo BrokenCategory = new("Broken", "These mods were broken by a game update. They will be temporarily removed and restored once they are updated for the current game version");
private static readonly ModListItem.CategoryInfo RetiredCategory = new("Retired", "These mods are either no longer needed due to VRChat updates or are no longer being maintained");
private static readonly ModListItem.CategoryInfo UncategorizedCategory = new("Uncategorized", "Mods without a category assigned"); private static readonly ModListItem.CategoryInfo UncategorizedCategory = new("Uncategorized", "Mods without a category assigned");
private static readonly ModListItem.CategoryInfo UnknownCategory = new("Unknown/Unverified", "Mods not coming from VRCMG. Potentially dangerous."); private static readonly ModListItem.CategoryInfo UnknownCategory = new("Unknown/Unverified", "Mods not coming from VRCMG. Potentially dangerous.");
@ -138,10 +139,12 @@ namespace VRCMelonAssistant.Pages
await Task.Run(() => await Task.Run(() =>
{ {
CheckInstallDir("Plugins", false); CheckInstallDir("Plugins");
CheckInstallDir("Mods", false); CheckInstallDir("Mods");
CheckInstallDir("Plugins/Broken", true); CheckInstallDir("Plugins/Broken", isBrokenDir: true);
CheckInstallDir("Mods/Broken", 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))) if (!Directory.Exists(Path.Combine(App.VRChatInstallDirectory, directory)))
{ {
@ -193,6 +196,7 @@ namespace VRCMelonAssistant.Pages
mod.installedFilePath = file; mod.installedFilePath = file;
mod.installedVersion = modInfo.ModVersion; mod.installedVersion = modInfo.ModVersion;
mod.installedInBrokenDir = isBrokenDir; mod.installedInBrokenDir = isBrokenDir;
mod.installedInRetiredDir = isRetiredDir;
break; break;
} }
@ -203,12 +207,13 @@ namespace VRCMelonAssistant.Pages
installedFilePath = file, installedFilePath = file,
installedVersion = modInfo.ModVersion, installedVersion = modInfo.ModVersion,
installedInBrokenDir = isBrokenDir, installedInBrokenDir = isBrokenDir,
installedInRetiredDir = isRetiredDir,
versions = new [] versions = new []
{ {
new Mod.ModVersion() new Mod.ModVersion()
{ {
name = modInfo.ModName, name = modInfo.ModName,
modversion = modInfo.ModVersion, modVersion = modInfo.ModVersion,
author = modInfo.ModAuthor, author = modInfo.ModAuthor,
description = "" description = ""
} }
@ -255,11 +260,17 @@ namespace VRCMelonAssistant.Pages
public async Task PopulateModsList() 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); AddModToList(mod);
foreach (var mod in UnknownMods) foreach (var mod in UnknownMods)
AddModToList(mod, UnknownCategory); 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) private void AddModToList(Mod mod, ModListItem.CategoryInfo categoryOverride = null)
@ -285,14 +296,14 @@ namespace VRCMelonAssistant.Pages
IsSelected = preSelected, IsSelected = preSelected,
IsEnabled = true, IsEnabled = true,
ModName = latestVersion.name, ModName = latestVersion.name,
ModVersion = latestVersion.modversion, ModVersion = latestVersion.modVersion,
ModAuthor = HardcodedCategories.FixupAuthor(latestVersion.author), ModAuthor = HardcodedCategories.FixupAuthor(latestVersion.author),
ModDescription = latestVersion.description.Replace("\r\n", " ").Replace("\n", " "), ModDescription = latestVersion.description.Replace("\r\n", " ").Replace("\n", " "),
ModInfo = mod, ModInfo = mod,
IsInstalled = mod.installedFilePath != null, IsInstalled = mod.installedFilePath != null,
InstalledVersion = mod.installedVersion, InstalledVersion = mod.installedVersion,
InstalledModInfo = mod, 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) foreach (Promotion promo in Promotions.ActivePromotions)
@ -319,7 +330,7 @@ namespace VRCMelonAssistant.Pages
foreach (Mod mod in AllModsList) foreach (Mod mod in AllModsList)
{ {
// Ignore mods that are newer than installed version or up-to-date // 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) if (mod.ListItem.IsSelected)
{ {
@ -506,14 +517,14 @@ namespace VRCMelonAssistant.Pages
if (SearchBar.Height == 0) if (SearchBar.Height == 0)
{ {
SearchBar.Focus(); SearchBar.Focus();
Animate(SearchBar, 0, 16, new TimeSpan(0, 0, 0, 0, 300)); Animate(SearchBar, 0, 20, new TimeSpan(0, 0, 0, 0, 300));
Animate(SearchText, 0, 16, new TimeSpan(0, 0, 0, 0, 300)); Animate(SearchText, 0, 20, new TimeSpan(0, 0, 0, 0, 300));
ModsListView.Items.Filter = new Predicate<object>(SearchFilter); ModsListView.Items.Filter = new Predicate<object>(SearchFilter);
} }
else else
{ {
Animate(SearchBar, 16, 0, new TimeSpan(0, 0, 0, 0, 300)); Animate(SearchBar, 20, 0, new TimeSpan(0, 0, 0, 0, 300));
Animate(SearchText, 16, 0, new TimeSpan(0, 0, 0, 0, 300)); Animate(SearchText, 20, 0, new TimeSpan(0, 0, 0, 0, 300));
ModsListView.Items.Filter = null; ModsListView.Items.Filter = null;
} }
} }

View file

@ -51,5 +51,5 @@ using System.Windows;
// You can specify all the values or you can default the Build and Revision Numbers // You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below: // by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")] // [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.1.23.1029")] [assembly: AssemblyVersion("1.1.26.1029")]
[assembly: AssemblyFileVersion("1.1.23.1029+vrc")] [assembly: AssemblyFileVersion("1.1.26.1029+vrc")]