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.