Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
38 commits
Select commit Hold shift + click to select a range
3a0087f
Update to add better checking and quicker server checks
heisthecat31 Apr 27, 2026
5497c29
Make the updater use HttpClient instead of WebClient
brysonak Apr 27, 2026
b3b2002
Merge pull request #2 from brysonak/main
heisthecat31 Apr 28, 2026
a90966f
Update 3.0.6
heisthecat31 May 17, 2026
8c0b639
3.0.8
heisthecat31 Jun 17, 2026
683c0a1
3.0.9
heisthecat31 Jul 1, 2026
6eec79e
Update 3.1.2
heisthecat31 Jul 21, 2026
5590425
Added SecretKeys.cs org
heisthecat31 Jul 21, 2026
6df8b4b
Add FRIENDS_BOT_URL constant to SecretKeys
heisthecat31 Jul 21, 2026
77be97b
Fix workflow errors
heisthecat31 Jul 21, 2026
8431653
Merge branch 'main' of https://github.com/heisthecat31/Spark
heisthecat31 Jul 21, 2026
8e4e8a4
Update to remove warnings and errors
heisthecat31 Jul 21, 2026
e1590a0
Update SparkMSIX.wapproj
heisthecat31 Jul 21, 2026
cf1b0f4
Don't update if version is already the latest; Add a checkbox to stop…
brysonak Jul 22, 2026
d3b5266
Update 3.1.6
heisthecat31 Aug 28, 2026
0e77273
update 3.1.7
heisthecat31 Aug 28, 2026
c64293c
added pvu blue as a colour theme
positive-vibezz1 Aug 28, 2026
e7f4947
Merge pull request #3 from positive-vibezz1/main
heisthecat31 Aug 30, 2026
43f1103
Don't block a thread pool worker in the fetch loop
brysonak Aug 30, 2026
3da835d
Size velocity windows by measured cadence
brysonak Aug 30, 2026
f4e785a
Stop the quest ping sweep from crashing the process
brysonak Aug 30, 2026
876623a
Add community-wide playtime total
heisthecat31 Sep 3, 2026
9786633
Name the playtime leaderboard by Discord, falling back to EchoVR; 3.1.8
heisthecat31 Sep 3, 2026
7750848
Follow friends into private matches and lobbies; rework spectator
heisthecat31 Sep 5, 2026
a54ea32
Read the lobby id from ovr_Room_UpdateDataStore, not NSLOBBY
heisthecat31 Sep 5, 2026
7a7e4f0
Update EchoLogSessionReader.cs
heisthecat31 Sep 5, 2026
bc6b3ae
Show the lobby's join link, taken from the log
heisthecat31 Sep 5, 2026
1c5c994
Poll the log on a background watcher, not in the getter
heisthecat31 Sep 5, 2026
12df432
Log whether a presence push succeeded, not that it was attempted
heisthecat31 Sep 5, 2026
4aaa8cf
Merge branch 'friends-tab-and-simple-spectate'
heisthecat31 Sep 5, 2026
263817f
v3.2.0
heisthecat31 Sep 7, 2026
bf51e5f
v3.2.1
heisthecat31 Sep 14, 2026
a126ef7
Revise README with new installation link and .NET version
heisthecat31 Sep 20, 2026
ff56501
Add Idle Dash and Combat Dash sections to README
heisthecat31 Sep 20, 2026
890bcd2
Add new image to Combat Dash section
heisthecat31 Sep 20, 2026
61c5981
Merge pull request #4 from brysonak/main
heisthecat31 Sep 20, 2026
6ede734
Update README.md
heisthecat31 Sep 22, 2026
63c5ac3
Add new image for Arena Dash
heisthecat31 Sep 22, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
56 changes: 56 additions & 0 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
name: Build Spark

on:
push:
branches:
- main
- master
- develop
pull_request:
branches:
- main
- master
- develop
workflow_dispatch:

permissions:
contents: read

jobs:
build:
runs-on: windows-latest

steps:
- name: Checkout Code
uses: actions/checkout@v4

- name: Setup .NET
uses: actions/setup-dotnet@v4
with:
dotnet-version: '10.0.x'

- name: Restore Dependencies
run: dotnet restore Spark.sln

- name: Build
run: dotnet build Spark.sln --configuration Release --no-restore

- name: Publish Framework-Dependent
run: dotnet publish Spark.csproj -c Release -p:PublishSingleFile=false --no-build -o ./publish-fd

- name: Publish Self-Contained
run: dotnet publish Spark.csproj -c Release -r win-x64 --self-contained true -p:PublishSingleFile=true -o ./publish-sc

- name: Upload Framework-Dependent Artifact
uses: actions/upload-artifact@v4
with:
name: Spark-Framework-Dependent
path: ./publish-fd/
retention-days: 30

- name: Upload Self-Contained Artifact
uses: actions/upload-artifact@v4
with:
name: Spark-Self-Contained
path: ./publish-sc/
retention-days: 30
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -360,3 +360,5 @@ bfg-1.14.0.jar
.git.bfg-report/
IgniteBotKey.pfx.bak2
SparkMSIX/SparkMSIX_TemporaryKey.pfx.bak
SecretKeys.cs
SecretKeys.cs
3 changes: 3 additions & 0 deletions App.xaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,9 @@ public partial class App : Application
{
protected override void OnStartup(StartupEventArgs e)
{
// Disable hardware acceleration so Oculus Dash and OBS can capture the window correctly
System.Windows.Media.RenderOptions.ProcessRenderMode = System.Windows.Interop.RenderMode.SoftwareOnly;

// load settings file
SparkSettings.Load();

Expand Down
103 changes: 103 additions & 0 deletions AppUpdater.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
using System;
using System.Linq;
using System.Net;
using System.Reflection;
using System.Threading.Tasks;
using Newtonsoft.Json.Linq;

namespace Spark
{
/// <summary>
/// Background-checks GitHub for a newer Spark release and hands back what was found so the
/// caller can decide how to surface it (a popup, a footer badge, etc.) — this class does no UI.
/// </summary>
public static class AppUpdater
{
public class UpdateInfo
{
public string Version;
public string Changelog;
public string DownloadUrl;
public string FileName;
}

/// <summary>The most recently found update, if any — kept so a dismissed prompt can be reopened later.</summary>
public static UpdateInfo PendingUpdate { get; private set; }

/// <summary>Checks the latest GitHub release for this repo. Returns null if up to date, ignored, or the check failed.</summary>
public static async Task<UpdateInfo> CheckForUpdatesAsync()
{
try
{
using (var client = new WebClient())
{
client.Headers.Add("User-Agent", "Spark-Updater");
client.Headers.Add("Accept", "application/vnd.github.v3+json");

string latestReleaseUrl = "https://api.github.com/repos/heisthecat31/Spark/releases/latest";
string json = await client.DownloadStringTaskAsync(latestReleaseUrl);
var release = JObject.Parse(json);

string titleName = release["name"]?.ToString();
if (string.IsNullOrWhiteSpace(titleName))
{
titleName = release["tag_name"]?.ToString();
}

string latestVersionStr = "0.0.0";
var match = System.Text.RegularExpressions.Regex.Match(titleName ?? "", @"\d+\.\d+(\.\d+)?");
if (match.Success)
{
latestVersionStr = match.Value;
}

var currentAssemblyVersion = Assembly.GetExecutingAssembly().GetName().Version;
string currentVersionStr = $"{currentAssemblyVersion.Major}.{currentAssemblyVersion.Minor}.{currentAssemblyVersion.Build}";

if (latestVersionStr.Equals(SparkSettings.instance.ignoredUpdateVersion, StringComparison.OrdinalIgnoreCase))
{
Logger.Error($"[Updater] Skipping update check because version {latestVersionStr} is marked as ignored.");
return null;
}

if (!Version.TryParse(latestVersionStr, out Version latestVersion) ||
!Version.TryParse(currentVersionStr, out Version currentVersion) ||
latestVersion <= currentVersion)
{
return null;
}

var assets = release["assets"] as JArray;
var targetAsset = assets?.FirstOrDefault(asset =>
{
string name = asset["name"]?.ToString();
return name != null && name.EndsWith(".msi", StringComparison.OrdinalIgnoreCase);
});

string downloadUrl = targetAsset?["browser_download_url"]?.ToString();
string installerFileName = targetAsset?["name"]?.ToString();

if (string.IsNullOrEmpty(downloadUrl))
{
Logger.Error("[Updater] Newer release found but it has no .msi asset attached.");
return null;
}

PendingUpdate = new UpdateInfo
{
Version = latestVersionStr,
Changelog = release["body"]?.ToString() ?? "No release notes provided.",
DownloadUrl = downloadUrl,
FileName = installerFileName
};
return PendingUpdate;
}
}
catch (Exception ex)
{
Logger.Error($"[Updater] Background update check failed: {ex.Message}\n{ex.StackTrace}");
return null;
}
}
}
}
Loading
Loading