Relocate app data and package build output

Adds a new `AppPaths` helper and moves runtime/user-generated files (`init.config`, `custom_set.txt`, cache, WebView2 data) into `%LocalAppData%\Lithium` with readable fallback to portable files. WebView2 initialization now sets a loader DLL path, uses an explicit user data folder, and surfaces runtime-missing errors.

The build/publish pipeline is updated to emit a clean `Build\` layout with dependencies under `lib\`, remove duplicate root DLL/docs, and align probing/runtime settings for net48 x64 output. Supporting updates include ignore rules for build/runtime artifacts, refreshed agent build/release docs, and endpoint URL/domain updates.
This commit is contained in:
TJhost
2026-09-13 19:33:09 -04:00
parent 5f993f98b8
commit 19556f2d26
9 changed files with 172 additions and 53 deletions
+14
View File
@@ -17,6 +17,9 @@
mono_crash.* mono_crash.*
# Build results # Build results
[Bb]in/
[Oo]bj/
[Bb]uild/
[Dd]ebug/ [Dd]ebug/
[Dd]ebugPublic/ [Dd]ebugPublic/
[Rr]elease/ [Rr]elease/
@@ -228,6 +231,17 @@ _pkginfo.txt
# but keep track of directories ending in .cache # but keep track of directories ending in .cache
!?*.[Cc]ache/ !?*.[Cc]ache/
# Runtime-generated application data
*.exe.WebView2/
# Local release archives
*.7z
*.zip
# Local Claude Code and VS Code settings
.claude/
.vscode/
# Others # Others
ClientBin/ ClientBin/
~$* ~$*
+20 -8
View File
@@ -3,15 +3,24 @@
## Prerequisites ## Prerequisites
- Git remote: `https://git.scpsmp.site/JJ/Lithium.git` - Git remote: `https://git.scpsmp.site/JJ/Lithium.git`
- Auth: OAuth token stored in Windows Credential Manager (via git) - Auth: OAuth token stored in Windows Credential Manager (via git)
- MSBuild: `& "C:\Program Files\Microsoft Visual Studio\18\Community\MSBuild\Current\Bin\MSBuild.exe"` - Visual Studio 2022 or newer with the .NET desktop development workload
- NuGet package restore enabled
- .NET Framework 4.8 Developer Pack for building
- Microsoft Edge WebView2 Runtime for the Website tab at runtime
## Build ## Build
```powershell ```powershell
# Kill running process first # Kill running process first
Stop-Process -Name "Lithium" -ErrorAction SilentlyContinue Stop-Process -Name "Lithium" -ErrorAction SilentlyContinue
# Compile Release build # Locate MSBuild, restore packages, and compile the Release build
& "C:\Program Files\Microsoft Visual Studio\2022\Community\Msbuild\Current\Bin\MSBuild.exe" /t:rebuild /p:Configuration=Release /p:Platform="x64" $msbuild = & "${env:ProgramFiles(x86)}\Microsoft Visual Studio\Installer\vswhere.exe" -latest -requires Microsoft.Component.MSBuild -find MSBuild\**\Bin\MSBuild.exe | Select-Object -First 1
& $msbuild Lithium.sln /t:Restore,Rebuild /p:Configuration=Release /p:Platform="x64"
# Create the clean file-deployment layout under Build\.
& $msbuild Lithium\Lithium.csproj /t:Publish /p:Configuration=Release /p:Platform="x64"
# Keep Lithium.exe, Lithium.exe.config, and the complete lib directory together.
``` ```
## Stage & Commit ## Stage & Commit
@@ -44,9 +53,12 @@ git push origin $version
$cred = "protocol=https`nhost=git.scpsmp.site`n`n" | git credential fill $cred = "protocol=https`nhost=git.scpsmp.site`n`n" | git credential fill
$token = ($cred -split "`n" | Where-Object { $_ -like "password=*" }) -replace "password=","" $token = ($cred -split "`n" | Where-Object { $_ -like "password=*" }) -replace "password=",""
# 7z build output (x64/Release) # Archive the published x64 Release output; run from anywhere inside the repository
$archivePath = "D:\Lithium\Lithium-$version.7z" $repoRoot = (git rev-parse --show-toplevel).Trim()
& "C:\Program Files\7-Zip\7z.exe" a -mx=9 "$archivePath" "D:\Lithium\Lithium\bin\x64\Release\*" $archivePath = Join-Path $repoRoot "Lithium-$version.7z"
$releaseOutput = Join-Path $repoRoot "Build\*"
$sevenZip = (Get-Command 7z.exe -ErrorAction Stop).Source
& $sevenZip a -mx=9 "$archivePath" "$releaseOutput"
# Create release via Gitea API # Create release via Gitea API
$body = @" $body = @"
@@ -63,7 +75,7 @@ curl.exe -s -X POST "https://git.scpsmp.site/api/v1/repos/JJ/Lithium/releases/$r
## Post-Release Cleanup ## Post-Release Cleanup
```powershell ```powershell
# Delete the local archive after successful upload # Delete the local archive after successful upload
Remove-Item -LiteralPath "D:\Lithium\Lithium-$version.7z" -Force Remove-Item -LiteralPath "$archivePath" -Force
Remove-Item -LiteralPath "$env:TEMP\release.json" -Force Remove-Item -LiteralPath "$env:TEMP\release.json" -Force
``` ```
@@ -72,4 +84,4 @@ Remove-Item -LiteralPath "$env:TEMP\release.json" -Force
- Tag naming scheme: `0.01`, `0.02`, `0.03`, etc. (not `v1.0.0`) - Tag naming scheme: `0.01`, `0.02`, `0.03`, etc. (not `v1.0.0`)
- Release naming scheme: `0.XX @ Lithium` - Release naming scheme: `0.XX @ Lithium`
- Use PATCH to edit existing release tag via API if you mess up the tag name - Use PATCH to edit existing release tag via API if you mess up the tag name
- 7-Zip located at `C:\Program Files\NVIDIA Corporation\NVIDIA app\7z.exe` (or `C:\Program Files\7-Zip\7z.exe` if installed separately) - Add `7z.exe` to `PATH` before running the release archive command
+5 -2
View File
@@ -1,8 +1,11 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<configuration> <configuration>
<startup useLegacyV2RuntimeActivationPolicy="true">
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.8" />
</startup>
<runtime> <runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<probing privatePath="lib;dependencies;bin" /> <probing privatePath="lib" />
</assemblyBinding> </assemblyBinding>
</runtime> </runtime>
</configuration> </configuration>
-1
View File
@@ -7,7 +7,6 @@
<package id="System.Memory" version="4.6.3" targetFramework="net48" /> <package id="System.Memory" version="4.6.3" targetFramework="net48" />
<package id="System.Numerics.Vectors" version="4.6.1" targetFramework="net48" /> <package id="System.Numerics.Vectors" version="4.6.1" targetFramework="net48" />
<package id="System.Runtime.CompilerServices.Unsafe" version="6.1.2" targetFramework="net48" /> <package id="System.Runtime.CompilerServices.Unsafe" version="6.1.2" targetFramework="net48" />
<package id="System.Speech" version="10.0.0" targetFramework="net48" />
<package id="System.Text.Encodings.Web" version="10.0.0" targetFramework="net48" /> <package id="System.Text.Encodings.Web" version="10.0.0" targetFramework="net48" />
<package id="System.Text.Json" version="10.0.0" targetFramework="net48" /> <package id="System.Text.Json" version="10.0.0" targetFramework="net48" />
<package id="System.Threading.Tasks.Extensions" version="4.6.3" targetFramework="net48" /> <package id="System.Threading.Tasks.Extensions" version="4.6.3" targetFramework="net48" />
+55
View File
@@ -0,0 +1,55 @@
using System;
using System.IO;
using System.Runtime.InteropServices;
namespace Lua
{
internal static class AppPaths
{
private const string ApplicationDirectoryName = "Lithium";
public static string ExecutableDirectory => AppDomain.CurrentDomain.BaseDirectory;
public static string UserDataDirectory => Path.Combine(
Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData),
ApplicationDirectoryName);
public static string WebViewUserDataDirectory => Path.Combine(UserDataDirectory, "WebView2");
public static string WebViewLoaderDirectory => Path.Combine(
ExecutableDirectory,
"lib",
"runtimes",
GetRuntimeIdentifier(),
"native");
private static string GetRuntimeIdentifier()
{
switch (RuntimeInformation.ProcessArchitecture)
{
case Architecture.X64:
return "win-x64";
case Architecture.Arm64:
return "win-arm64";
default:
return "win-x86";
}
}
public static string GetUserFilePath(string fileName)
{
Directory.CreateDirectory(UserDataDirectory);
return Path.Combine(UserDataDirectory, fileName);
}
public static string GetReadableFilePath(string fileName)
{
string userPath = Path.Combine(UserDataDirectory, fileName);
if (File.Exists(userPath))
return userPath;
string portablePath = Path.Combine(ExecutableDirectory, fileName);
return File.Exists(portablePath) ? portablePath : null;
}
}
}
+3 -2
View File
@@ -72,9 +72,10 @@ namespace Lua
SetConsoleColor(); SetConsoleColor();
// AA0019 // AA0019
if (!File.Exists("init.config")) return; string configPath = AppPaths.GetReadableFilePath("init.config");
if (configPath == null) return;
var lines = Helper.ReadLinesSafe("init.config"); var lines = Helper.ReadLinesSafe(configPath);
// AA0020 // AA0020
foreach (var raw in lines) foreach (var raw in lines)
+30 -17
View File
@@ -16,7 +16,7 @@
<Deterministic>true</Deterministic> <Deterministic>true</Deterministic>
<NuGetPackageImportStamp> <NuGetPackageImportStamp>
</NuGetPackageImportStamp> </NuGetPackageImportStamp>
<PublishUrl>publish\</PublishUrl> <PublishUrl>..\Build\</PublishUrl>
<Install>true</Install> <Install>true</Install>
<InstallFrom>Disk</InstallFrom> <InstallFrom>Disk</InstallFrom>
<UpdateEnabled>false</UpdateEnabled> <UpdateEnabled>false</UpdateEnabled>
@@ -62,7 +62,7 @@
<PlatformTarget>x64</PlatformTarget> <PlatformTarget>x64</PlatformTarget>
<LangVersion>7.3</LangVersion> <LangVersion>7.3</LangVersion>
<ErrorReport>prompt</ErrorReport> <ErrorReport>prompt</ErrorReport>
<Prefer32Bit>true</Prefer32Bit> <Prefer32Bit>false</Prefer32Bit>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'"> <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
<OutputPath>bin\x64\Release\</OutputPath> <OutputPath>bin\x64\Release\</OutputPath>
@@ -72,7 +72,7 @@
<PlatformTarget>x64</PlatformTarget> <PlatformTarget>x64</PlatformTarget>
<LangVersion>7.3</LangVersion> <LangVersion>7.3</LangVersion>
<ErrorReport>prompt</ErrorReport> <ErrorReport>prompt</ErrorReport>
<Prefer32Bit>true</Prefer32Bit> <Prefer32Bit>false</Prefer32Bit>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<Reference Include="Microsoft.Bcl.AsyncInterfaces, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL"> <Reference Include="Microsoft.Bcl.AsyncInterfaces, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
@@ -96,7 +96,6 @@
<Reference Include="System.IO, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL"> <Reference Include="System.IO, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.IO.4.3.0\lib\net462\System.IO.dll</HintPath> <HintPath>..\packages\System.IO.4.3.0\lib\net462\System.IO.dll</HintPath>
<Private>True</Private> <Private>True</Private>
<Private>True</Private>
</Reference> </Reference>
<Reference Include="System.IO.Pipelines, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL"> <Reference Include="System.IO.Pipelines, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\System.IO.Pipelines.10.0.0\lib\net462\System.IO.Pipelines.dll</HintPath> <HintPath>..\packages\System.IO.Pipelines.10.0.0\lib\net462\System.IO.Pipelines.dll</HintPath>
@@ -107,7 +106,6 @@
<Reference Include="System.Net.Http, Version=4.1.1.3, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL"> <Reference Include="System.Net.Http, Version=4.1.1.3, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Net.Http.4.3.4\lib\net46\System.Net.Http.dll</HintPath> <HintPath>..\packages\System.Net.Http.4.3.4\lib\net46\System.Net.Http.dll</HintPath>
<Private>True</Private> <Private>True</Private>
<Private>True</Private>
</Reference> </Reference>
<Reference Include="System.Numerics" /> <Reference Include="System.Numerics" />
<Reference Include="System.Numerics.Vectors, Version=4.1.6.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL"> <Reference Include="System.Numerics.Vectors, Version=4.1.6.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
@@ -116,7 +114,6 @@
<Reference Include="System.Runtime, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL"> <Reference Include="System.Runtime, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Runtime.4.3.0\lib\net462\System.Runtime.dll</HintPath> <HintPath>..\packages\System.Runtime.4.3.0\lib\net462\System.Runtime.dll</HintPath>
<Private>True</Private> <Private>True</Private>
<Private>True</Private>
</Reference> </Reference>
<Reference Include="System.Runtime.CompilerServices.Unsafe, Version=6.0.3.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL"> <Reference Include="System.Runtime.CompilerServices.Unsafe, Version=6.0.3.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Runtime.CompilerServices.Unsafe.6.1.2\lib\net462\System.Runtime.CompilerServices.Unsafe.dll</HintPath> <HintPath>..\packages\System.Runtime.CompilerServices.Unsafe.6.1.2\lib\net462\System.Runtime.CompilerServices.Unsafe.dll</HintPath>
@@ -124,22 +121,18 @@
<Reference Include="System.Security.Cryptography.Algorithms, Version=4.2.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL"> <Reference Include="System.Security.Cryptography.Algorithms, Version=4.2.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Security.Cryptography.Algorithms.4.3.0\lib\net463\System.Security.Cryptography.Algorithms.dll</HintPath> <HintPath>..\packages\System.Security.Cryptography.Algorithms.4.3.0\lib\net463\System.Security.Cryptography.Algorithms.dll</HintPath>
<Private>True</Private> <Private>True</Private>
<Private>True</Private>
</Reference> </Reference>
<Reference Include="System.Security.Cryptography.Encoding, Version=4.0.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL"> <Reference Include="System.Security.Cryptography.Encoding, Version=4.0.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Security.Cryptography.Encoding.4.3.0\lib\net46\System.Security.Cryptography.Encoding.dll</HintPath> <HintPath>..\packages\System.Security.Cryptography.Encoding.4.3.0\lib\net46\System.Security.Cryptography.Encoding.dll</HintPath>
<Private>True</Private> <Private>True</Private>
<Private>True</Private>
</Reference> </Reference>
<Reference Include="System.Security.Cryptography.Primitives, Version=4.0.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL"> <Reference Include="System.Security.Cryptography.Primitives, Version=4.0.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Security.Cryptography.Primitives.4.3.0\lib\net46\System.Security.Cryptography.Primitives.dll</HintPath> <HintPath>..\packages\System.Security.Cryptography.Primitives.4.3.0\lib\net46\System.Security.Cryptography.Primitives.dll</HintPath>
<Private>True</Private> <Private>True</Private>
<Private>True</Private>
</Reference> </Reference>
<Reference Include="System.Security.Cryptography.X509Certificates, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL"> <Reference Include="System.Security.Cryptography.X509Certificates, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Security.Cryptography.X509Certificates.4.3.0\lib\net461\System.Security.Cryptography.X509Certificates.dll</HintPath> <HintPath>..\packages\System.Security.Cryptography.X509Certificates.4.3.0\lib\net461\System.Security.Cryptography.X509Certificates.dll</HintPath>
<Private>True</Private> <Private>True</Private>
<Private>True</Private>
</Reference> </Reference>
<Reference Include="System.Speech" /> <Reference Include="System.Speech" />
<Reference Include="System.Text.Encodings.Web, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL"> <Reference Include="System.Text.Encodings.Web, Version=10.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
@@ -168,6 +161,7 @@
<Generator>MSBuild:Compile</Generator> <Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType> <SubType>Designer</SubType>
</ApplicationDefinition> </ApplicationDefinition>
<Compile Include="AppPaths.cs" />
<Compile Include="HotkeyHandler.cs" /> <Compile Include="HotkeyHandler.cs" />
<Compile Include="RecoilEngine.cs" /> <Compile Include="RecoilEngine.cs" />
<Compile Include="Utils.cs" /> <Compile Include="Utils.cs" />
@@ -238,16 +232,35 @@
<Error Condition="!Exists('..\packages\System.ValueTuple.4.6.1\build\net471\System.ValueTuple.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\System.ValueTuple.4.6.1\build\net471\System.ValueTuple.targets'))" /> <Error Condition="!Exists('..\packages\System.ValueTuple.4.6.1\build\net471\System.ValueTuple.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\System.ValueTuple.4.6.1\build\net471\System.ValueTuple.targets'))" />
</Target> </Target>
<Import Project="..\packages\System.ValueTuple.4.6.1\build\net471\System.ValueTuple.targets" Condition="Exists('..\packages\System.ValueTuple.4.6.1\build\net471\System.ValueTuple.targets')" /> <Import Project="..\packages\System.ValueTuple.4.6.1\build\net471\System.ValueTuple.targets" Condition="Exists('..\packages\System.ValueTuple.4.6.1\build\net471\System.ValueTuple.targets')" />
<ItemGroup>
<!-- Include all referenced DLLs -->
<ReferenceCopyLocalPaths Include="@(ReferencePath)" />
</ItemGroup>
<ItemGroup> <ItemGroup>
<Resource Include="A1\a23ae8c4c6863364165637fb70679eb3.ico" /> <Resource Include="A1\a23ae8c4c6863364165637fb70679eb3.ico" />
</ItemGroup> </ItemGroup>
<Target Name="CopyDllsToLib" AfterTargets="Build"> <Target Name="ClearGeneratedLib" BeforeTargets="CopyFilesToOutputDirectory">
<MakeDir Directories="$(OutputPath)lib" /> <RemoveDir Directories="$(TargetDir)lib" Condition="Exists('$(TargetDir)lib')" />
<Copy SourceFiles="@(ReferenceCopyLocalPaths)" DestinationFolder="$(OutputPath)lib" SkipUnchangedFiles="true" /> </Target>
<Target Name="OrganizeBuildOutput" AfterTargets="CopyFilesToOutputDirectory">
<ItemGroup>
<ManagedDependencies Include="@(ReferenceCopyLocalPaths)" Condition="'%(Extension)' == '.dll'" />
<DependencyDocumentation Include="@(ReferenceCopyLocalPaths)" Condition="'%(Extension)' == '.xml'" />
<WebViewNativeFiles Include="$(TargetDir)runtimes\**\*" />
</ItemGroup>
<MakeDir Directories="$(TargetDir)lib" />
<Copy SourceFiles="@(ManagedDependencies)" DestinationFolder="$(TargetDir)lib" SkipUnchangedFiles="true" />
<Copy SourceFiles="@(WebViewNativeFiles)" DestinationFiles="@(WebViewNativeFiles->'$(TargetDir)lib\runtimes\%(RecursiveDir)%(Filename)%(Extension)')" SkipUnchangedFiles="true" Condition="'@(WebViewNativeFiles)' != ''" />
<Delete Files="@(ManagedDependencies->'$(TargetDir)%(Filename)%(Extension)');@(DependencyDocumentation->'$(TargetDir)%(Filename)%(Extension)')" />
<Delete Files="$(TargetDir)$(TargetName).pdb" Condition="'$(Configuration)' == 'Release' and Exists('$(TargetDir)$(TargetName).pdb')" />
<RemoveDir Directories="$(TargetDir)runtimes" Condition="Exists('$(TargetDir)runtimes')" />
</Target>
<Target Name="OrganizePublishOutput" AfterTargets="PublishOnly">
<ItemGroup>
<PublishRootFiles Include="$(TargetPath)" />
<PublishRootFiles Include="$(TargetPath).config" Condition="Exists('$(TargetPath).config')" />
<PublishLibFiles Include="$(TargetDir)lib\**\*" />
</ItemGroup>
<RemoveDir Directories="$(PublishUrl)" Condition="Exists('$(PublishUrl)')" />
<MakeDir Directories="$(PublishUrl)lib" />
<Copy SourceFiles="@(PublishRootFiles)" DestinationFolder="$(PublishUrl)" SkipUnchangedFiles="true" />
<Copy SourceFiles="@(PublishLibFiles)" DestinationFiles="@(PublishLibFiles->'$(PublishUrl)lib\%(RecursiveDir)%(Filename)%(Extension)')" SkipUnchangedFiles="true" />
</Target> </Target>
<PropertyGroup> <PropertyGroup>
<PreBuildEvent> <PreBuildEvent>
+32 -8
View File
@@ -6,6 +6,7 @@ using System.Net.Http;
using System.Text; using System.Text;
using System.Text.Json; using System.Text.Json;
using System.Threading; using System.Threading;
using Microsoft.Web.WebView2.Core;
using System.Windows; using System.Windows;
using System.Windows.Controls; using System.Windows.Controls;
using System.Windows.Input; using System.Windows.Input;
@@ -43,9 +44,7 @@ namespace Lithium
); );
// AA0116 // AA0116
Browser.Source = !string.IsNullOrEmpty(OperatorSets.ConfigExportUrl) InitializeBrowser();
? new Uri(OperatorSets.ConfigExportUrl)
: new Uri("https://jj.giggity.gay/exindex.html");
// AA0117 // AA0117
LoadSettingsToUI(); LoadSettingsToUI();
@@ -77,6 +76,31 @@ namespace Lithium
} }
} }
private async void InitializeBrowser()
{
try
{
CoreWebView2Environment.SetLoaderDllFolderPath(AppPaths.WebViewLoaderDirectory);
Directory.CreateDirectory(AppPaths.WebViewUserDataDirectory);
var environment = await CoreWebView2Environment.CreateAsync(
userDataFolder: AppPaths.WebViewUserDataDirectory);
await Browser.EnsureCoreWebView2Async(environment);
Browser.Source = !string.IsNullOrEmpty(OperatorSets.ConfigExportUrl)
? new Uri(OperatorSets.ConfigExportUrl)
: new Uri("https://jj.scpsmp.site/exindex.html");
}
catch (WebView2RuntimeNotFoundException)
{
AppendConsole("WebView2 Runtime is not installed. The Website tab is unavailable.");
}
catch (Exception ex)
{
AppendConsole($"Website initialization failed: {ex.Message}");
}
}
// AA0118 // AA0118
private Thread StartThread(ThreadStart action) private Thread StartThread(ThreadStart action)
{ {
@@ -184,7 +208,7 @@ namespace Lithium
return; return;
} }
string configPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "init.config"); string configPath = AppPaths.GetUserFilePath("init.config");
File.WriteAllText(configPath, configContent); File.WriteAllText(configPath, configContent);
// AA0129 // AA0129
@@ -516,7 +540,7 @@ namespace Lithium
string json = JsonSerializer.Serialize(payload); string json = JsonSerializer.Serialize(payload);
var response = await client.PostAsync( var response = await client.PostAsync(
"https://jj.giggity.gay/api/global/add", "https://jj.scpsmp.site/api/global/add",
new StringContent(json, Encoding.UTF8, "application/json") new StringContent(json, Encoding.UTF8, "application/json")
); );
@@ -541,7 +565,7 @@ namespace Lithium
{ {
try try
{ {
string customSetPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "custom_set.txt"); string customSetPath = AppPaths.GetUserFilePath("custom_set.txt");
File.WriteAllText( File.WriteAllText(
customSetPath, customSetPath,
$"{OperatorNameTextBox.Text}|{RecoilXTextBox.Text}|{RecoilYTextBox.Text}|{(AttackerRadioButton.IsChecked == true ? "attacker" : "defender")}" $"{OperatorNameTextBox.Text}|{RecoilXTextBox.Text}|{RecoilYTextBox.Text}|{(AttackerRadioButton.IsChecked == true ? "attacker" : "defender")}"
@@ -568,9 +592,9 @@ namespace Lithium
{ {
try try
{ {
string customSetPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "custom_set.txt"); string customSetPath = AppPaths.GetReadableFilePath("custom_set.txt");
if (!File.Exists(customSetPath)) if (customSetPath == null)
{ {
UpdateCustomSetConsole("No saved set found"); UpdateCustomSetConsole("No saved set found");
return; return;
+7 -9
View File
@@ -41,14 +41,9 @@ namespace Lua
Timeout = System.TimeSpan.FromSeconds(10) Timeout = System.TimeSpan.FromSeconds(10)
}; };
private static string CacheDirectory => private static string CacheDirectory => AppPaths.UserDataDirectory;
System.IO.Path.Combine(
Environment.GetFolderPath(Environment.SpecialFolder.UserProfile),
"coax"
);
private static string CacheFile => private static string CacheFile => System.IO.Path.Combine(CacheDirectory, "config_cache.txt");
System.IO.Path.Combine(CacheDirectory, "config_cache.txt");
// AA0059 // AA0059
@@ -118,7 +113,7 @@ namespace Lua
var allLines = new List<string>(); var allLines = new List<string>();
bool loadedOnline = false; bool loadedOnline = false;
// Ensure coax folder exists (with proper error handling) // Ensure the per-user cache folder exists (with proper error handling)
try try
{ {
if (!System.IO.Directory.Exists(CacheDirectory)) if (!System.IO.Directory.Exists(CacheDirectory))
@@ -184,7 +179,10 @@ namespace Lua
} }
// Also load config.txt (local overrides) // Also load config.txt (local overrides)
var local = Helper.ReadLinesSafe("config.txt"); string localConfigPath = AppPaths.GetReadableFilePath("config.txt");
var local = localConfigPath == null
? Array.Empty<string>()
: Helper.ReadLinesSafe(localConfigPath);
if (local.Length > 0) if (local.Length > 0)
allLines.AddRange(local); allLines.AddRange(local);