From 6cd688170fbdb16b44627319b4d3b805f37dcb8b Mon Sep 17 00:00:00 2001 From: Interzoneism <113020222+Interzoneism@users.noreply.github.com> Date: Mon, 15 Dec 2025 23:15:49 +0100 Subject: [PATCH 1/2] Handle Discord link in help dialog and update firebase backup path --- VintageStoryModManager/DevConfig.cs | 29 +++++++++++++-- .../Views/Dialogs/HelpDialogWindow.xaml | 2 +- .../Views/Dialogs/HelpDialogWindow.xaml.cs | 35 +++++++++++++++++++ .../Views/MainWindow.xaml.cs | 2 +- 4 files changed, 64 insertions(+), 4 deletions(-) diff --git a/VintageStoryModManager/DevConfig.cs b/VintageStoryModManager/DevConfig.cs index f146f4a0..295a74c4 100644 --- a/VintageStoryModManager/DevConfig.cs +++ b/VintageStoryModManager/DevConfig.cs @@ -34,6 +34,7 @@ public static class DevConfig public static double DefaultModInfoPanelRightMargin { get; } = 40.0; public static string ManagerModDatabaseUrl { get; } = "https://mods.vintagestory.at/simplevsmanager"; public static string ManagerModDatabaseModId { get; } = "5545"; + public static string DiscordInviteUrl { get; } = "https://discord.gg/Zhm3QnD2s9"; public static string ModDatabaseUnavailableMessage { get; } = "Could not reach the online Mod Database, please check your internet connection"; @@ -60,8 +61,32 @@ public static class DevConfig public static string FirebaseLegacyModlistDbUrl { get; } = "https://simple-vs-manager-default-rtdb.europe-west1.firebasedatabase.app"; - // Cloud/Firebase cache location (Simple VS Manager/Temp Cache/Firebase Cache) - public static string FirebaseBackupDirectory => Path.Combine(GetManagerDirectory(), FirebaseCacheDirectoryName); + // Cloud/Firebase cache backup location (SVSM Backup folder) + public static string FirebaseBackupDirectory + { + get + { + var customFolder = VintageStoryModManager.Services.CustomConfigFolderManager.GetCustomConfigFolder(); + if (!string.IsNullOrWhiteSpace(customFolder)) + { + var parentDirectory = Path.GetDirectoryName(customFolder); + if (!string.IsNullOrWhiteSpace(parentDirectory)) + { + return Path.Combine(parentDirectory, FirebaseAuthBackupDirectoryName); + } + } + + var localAppData = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData); + if (!string.IsNullOrWhiteSpace(localAppData)) + return Path.Combine(localAppData, FirebaseAuthBackupDirectoryName); + + var appData = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData); + if (!string.IsNullOrWhiteSpace(appData)) + return Path.Combine(appData, FirebaseAuthBackupDirectoryName); + + return Path.Combine(AppContext.BaseDirectory, FirebaseAuthBackupDirectoryName); + } + } // Status log display. public static string StatusTimestampFormat { get; } = "yyyy-MM-dd HH:mm:ss.fff"; diff --git a/VintageStoryModManager/Views/Dialogs/HelpDialogWindow.xaml b/VintageStoryModManager/Views/Dialogs/HelpDialogWindow.xaml index 83b4b3f5..cbccd768 100644 --- a/VintageStoryModManager/Views/Dialogs/HelpDialogWindow.xaml +++ b/VintageStoryModManager/Views/Dialogs/HelpDialogWindow.xaml @@ -42,7 +42,7 @@ TextWrapping="Wrap"> + RequestNavigate="OnDiscordLinkRequestNavigate"> diff --git a/VintageStoryModManager/Views/Dialogs/HelpDialogWindow.xaml.cs b/VintageStoryModManager/Views/Dialogs/HelpDialogWindow.xaml.cs index 0ebd2b1f..a43dac65 100644 --- a/VintageStoryModManager/Views/Dialogs/HelpDialogWindow.xaml.cs +++ b/VintageStoryModManager/Views/Dialogs/HelpDialogWindow.xaml.cs @@ -17,6 +17,9 @@ public HelpDialogWindow(string managerDirectory, string? cachedModsDirectory) { InitializeComponent(); + DiscordLink.NavigateUri = TryCreateUri(DevConfig.DiscordInviteUrl); + DiscordLink.ToolTip = DevConfig.DiscordInviteUrl; + ConfigureCachedModsHyperlink(ModDBlink, cachedModsDirectory, true); ConfigureFirebaseHyperlink(FirebaseFileHyperlink, managerDirectory, true); ConfigureHyperlinkCommon(BackupLink, DevConfig.FirebaseBackupDirectory, true); @@ -80,6 +83,38 @@ private void OnCachedModsHyperlinkRequestNavigate(object sender, RequestNavigate HandleHyperlinkNavigation(sender, e); } + private void OnDiscordLinkRequestNavigate(object sender, RequestNavigateEventArgs e) + { + e.Handled = true; + + if (InternetAccessManager.IsInternetAccessDisabled) + { + WpfMessageBox.Show(this, + "Enable Internet Access in the File menu to open Discord.", + "Simple VS Manager", + MessageBoxButton.OK, + MessageBoxImage.Information); + return; + } + + try + { + Process.Start(new ProcessStartInfo + { + FileName = DevConfig.DiscordInviteUrl, + UseShellExecute = true + }); + } + catch (Exception ex) + { + WpfMessageBox.Show(this, + $"Failed to open Discord:\n{ex.Message}", + "Simple VS Manager", + MessageBoxButton.OK, + MessageBoxImage.Error); + } + } + // NEW: Open the manager's Mod DB page exactly like the Help menu item. private void OnModDBlinkNavigate(object sender, RequestNavigateEventArgs e) { diff --git a/VintageStoryModManager/Views/MainWindow.xaml.cs b/VintageStoryModManager/Views/MainWindow.xaml.cs index 884a6621..39bc8a80 100644 --- a/VintageStoryModManager/Views/MainWindow.xaml.cs +++ b/VintageStoryModManager/Views/MainWindow.xaml.cs @@ -89,7 +89,7 @@ public partial class MainWindow : Window #region Static Configuration // URLs - private const string DiscordInviteUrl = "https://discord.gg/Zhm3QnD2s9"; + private static readonly string DiscordInviteUrl = DevConfig.DiscordInviteUrl; private static readonly string ManagerModDatabaseUrl = DevConfig.ManagerModDatabaseUrl; private static readonly string ManagerModDatabaseModId = DevConfig.ManagerModDatabaseModId; private static readonly string ModDatabaseUnavailableMessage = DevConfig.ModDatabaseUnavailableMessage; From 8ada7f71af6efe0e61fc8087677cb262e855fe8f Mon Sep 17 00:00:00 2001 From: Interzoneism <113020222+Interzoneism@users.noreply.github.com> Date: Mon, 15 Dec 2025 23:57:27 +0100 Subject: [PATCH 2/2] Relocate compat votes cache --- VintageStoryModManager/DevConfig.cs | 14 ++++++++++++++ .../Services/ModVersionVoteService.cs | 3 ++- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/VintageStoryModManager/DevConfig.cs b/VintageStoryModManager/DevConfig.cs index 295a74c4..89c9c7ab 100644 --- a/VintageStoryModManager/DevConfig.cs +++ b/VintageStoryModManager/DevConfig.cs @@ -114,6 +114,20 @@ public static string FirebaseBackupDirectory public static string FirebaseCacheDirectoryName { get; } = "Temp Cache/Firebase Cache"; + public static string FirebaseDatabaseCacheDirectoryName { get; } = "Temp Cache/Firebase Database Cache"; + + public static string FirebaseDatabaseCacheDirectory + { + get + { + var managerDirectory = VintageStoryModManager.Services.ModCacheLocator.GetManagerDataDirectory(); + if (!string.IsNullOrWhiteSpace(managerDirectory)) + return Path.Combine(managerDirectory, FirebaseDatabaseCacheDirectoryName); + + return Path.Combine(AppContext.BaseDirectory, FirebaseDatabaseCacheDirectoryName); + } + } + // User configuration defaults. public static string ConfigurationFileName { get; } = "SimpleVSManagerConfiguration.json"; public static string ModConfigPathsFileName { get; } = "SimpleVSManagerModConfigPaths.json"; diff --git a/VintageStoryModManager/Services/ModVersionVoteService.cs b/VintageStoryModManager/Services/ModVersionVoteService.cs index c1337aca..793c3452 100644 --- a/VintageStoryModManager/Services/ModVersionVoteService.cs +++ b/VintageStoryModManager/Services/ModVersionVoteService.cs @@ -21,7 +21,8 @@ public sealed class ModVersionVoteService : IDisposable private static readonly string VotesRootPath = DevConfig.ModVersionVoteRootPath; - private static readonly string VoteCachePath = Path.Combine(DevConfig.FirebaseBackupDirectory, "compat-votes-cache.json"); + private static readonly string VoteCachePath = + Path.Combine(DevConfig.FirebaseDatabaseCacheDirectory, "compat-votes-cache.json"); /// /// Gets the full path to the votes cache file.